@stellar-expert/ui-framework 1.15.3 → 1.15.5
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/basic-styles/base.scss +50 -50
- package/claimable-balance/claimable-balance-claimants.js +18 -11
- package/claimable-balance/claimable-balance-id.js +13 -0
- package/contract/sc-val.js +107 -107
- package/controls/button-group.scss +46 -46
- package/controls/button.scss +173 -173
- package/controls/code-block.scss +71 -71
- package/controls/dropdown.scss +159 -159
- package/controls/tabs.scss +70 -70
- package/controls/tooltip.scss +116 -116
- package/controls/update-highlighter.scss +7 -7
- package/dex/price-dynamic.scss +33 -33
- package/effect/effect-description.js +344 -351
- package/interaction/block-select.scss +21 -21
- package/interaction/spoiler.scss +6 -6
- package/ledger/ledger-entry-href-formatter.js +26 -26
- package/package.json +40 -40
- package/tx/op-description-view.js +941 -942
package/basic-styles/base.scss
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
*,
|
|
2
|
-
*:after,
|
|
3
|
-
*:before {
|
|
4
|
-
box-sizing: border-box;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
* {
|
|
8
|
-
@include scrollbars(6px, var(--color-dimmed), var(--color-contrast-border));
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
html {
|
|
12
|
-
font-size: 62.5%;
|
|
13
|
-
height: 100%;
|
|
14
|
-
-ms-text-size-adjust: 100%;
|
|
15
|
-
-webkit-text-size-adjust: 100%;
|
|
16
|
-
scroll-behavior: smooth;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
body {
|
|
20
|
-
color: var(--color-text);
|
|
21
|
-
background: var(--color-bg);
|
|
22
|
-
font-family: $font-face-primary;
|
|
23
|
-
font-size: $font-size-base;
|
|
24
|
-
font-weight: $font-weight-base;
|
|
25
|
-
letter-spacing: 0.01em;
|
|
26
|
-
line-height: $font-line-height-base;
|
|
27
|
-
height: 100%;
|
|
28
|
-
overflow-x: hidden;
|
|
29
|
-
min-width: 320px;
|
|
30
|
-
margin: 0;
|
|
31
|
-
font-smoothing: antialiased;
|
|
32
|
-
-webkit-font-smoothing: antialiased;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
::selection {
|
|
36
|
-
background-color: transparentize($color-primary, 0.8) !important;
|
|
37
|
-
color: var(--color-text);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.page-container {
|
|
41
|
-
min-height: calc(100vh - 8rem);
|
|
42
|
-
display: flex;
|
|
43
|
-
flex-direction: column;
|
|
44
|
-
/*@media (min-width: $responsive-mobile-browser-width) {
|
|
45
|
-
justify-content: center;
|
|
46
|
-
}*/
|
|
47
|
-
|
|
48
|
-
> .no-center {
|
|
49
|
-
margin-bottom: auto;
|
|
50
|
-
}
|
|
1
|
+
*,
|
|
2
|
+
*:after,
|
|
3
|
+
*:before {
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
* {
|
|
8
|
+
@include scrollbars(6px, var(--color-dimmed), var(--color-contrast-border));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
html {
|
|
12
|
+
font-size: 62.5%;
|
|
13
|
+
height: 100%;
|
|
14
|
+
-ms-text-size-adjust: 100%;
|
|
15
|
+
-webkit-text-size-adjust: 100%;
|
|
16
|
+
scroll-behavior: smooth;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
body {
|
|
20
|
+
color: var(--color-text);
|
|
21
|
+
background: var(--color-bg);
|
|
22
|
+
font-family: $font-face-primary;
|
|
23
|
+
font-size: $font-size-base;
|
|
24
|
+
font-weight: $font-weight-base;
|
|
25
|
+
letter-spacing: 0.01em;
|
|
26
|
+
line-height: $font-line-height-base;
|
|
27
|
+
height: 100%;
|
|
28
|
+
overflow-x: hidden;
|
|
29
|
+
min-width: 320px;
|
|
30
|
+
margin: 0;
|
|
31
|
+
font-smoothing: antialiased;
|
|
32
|
+
-webkit-font-smoothing: antialiased;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
::selection {
|
|
36
|
+
background-color: transparentize($color-primary, 0.8) !important;
|
|
37
|
+
color: var(--color-text);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.page-container {
|
|
41
|
+
min-height: calc(100vh - 8rem);
|
|
42
|
+
display: flex;
|
|
43
|
+
flex-direction: column;
|
|
44
|
+
/*@media (min-width: $responsive-mobile-browser-width) {
|
|
45
|
+
justify-content: center;
|
|
46
|
+
}*/
|
|
47
|
+
|
|
48
|
+
> .no-center {
|
|
49
|
+
margin-bottom: auto;
|
|
50
|
+
}
|
|
51
51
|
}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import {xdrParseClaimant} from '@stellar-expert/claimable-balance-utils'
|
|
3
|
-
import {AccountAddress} from '../account/account-address'
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import {xdrParseClaimant} from '@stellar-expert/claimable-balance-utils'
|
|
3
|
+
import {AccountAddress} from '../account/account-address'
|
|
4
|
+
import {CodeBlock} from '../controls/code-block'
|
|
5
|
+
|
|
6
|
+
export const ClaimableBalanceClaimants = React.memo(function ClaimableBalanceClaimants({claimants}) {
|
|
7
|
+
const parsed = claimants.map(c => {
|
|
8
|
+
if (c.destination && c.predicate && !c._predicate)
|
|
9
|
+
return c
|
|
10
|
+
return xdrParseClaimant(c)
|
|
11
|
+
})
|
|
12
|
+
return <>
|
|
13
|
+
{parsed.map((c, i) => <span key={i + c.destination}>{i > 0 && ', '}
|
|
14
|
+
<AccountAddress account={c.destination}/> {typeof c.predicate === 'string' ?
|
|
15
|
+
c.predicate :
|
|
16
|
+
<div className="block-indent"><CodeBlock>{JSON.stringify(c.predicate, null, 2)}</CodeBlock></div>}
|
|
17
|
+
</span>)}
|
|
18
|
+
</>
|
|
12
19
|
})
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import {shortenString} from '@stellar-expert/formatter'
|
|
3
|
+
import {formatExplorerLink} from '../ledger/ledger-entry-href-formatter'
|
|
4
|
+
|
|
5
|
+
export function ClaimableBalanceId({balance}) {
|
|
6
|
+
if (!balance)
|
|
7
|
+
return null
|
|
8
|
+
return <>{' '}
|
|
9
|
+
<a href={formatExplorerLink('claimable-balance', balance)} target="_blank">
|
|
10
|
+
{shortenString(balance)}
|
|
11
|
+
</a>
|
|
12
|
+
</>
|
|
13
|
+
}
|
package/contract/sc-val.js
CHANGED
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import cn from 'classnames'
|
|
3
|
-
import {xdr, scValToBigInt} from '@stellar/stellar-base'
|
|
4
|
-
import {xdrParserUtils} from '@stellar-expert/tx-meta-effects-parser'
|
|
5
|
-
import {shortenString} from '@stellar-expert/formatter'
|
|
6
|
-
import {AccountAddress} from '../account/account-address'
|
|
7
|
-
import './sc-val.scss'
|
|
8
|
-
|
|
9
|
-
export const ScVal = React.memo(function ScVal({value, nested = false, indent = false, wrapObjects = true}) {
|
|
10
|
-
if (!nested)
|
|
11
|
-
return <code className={cn('sc-val', {block: indent})}><ScVal value={value} indent={indent} nested/></code>
|
|
12
|
-
if (!value)
|
|
13
|
-
return 'void'
|
|
14
|
-
if (typeof value === 'string') {
|
|
15
|
-
value = xdr.ScVal.fromXDR(value, 'base64')
|
|
16
|
-
}
|
|
17
|
-
if (value instanceof Array) {
|
|
18
|
-
const values = value.map((v, i) => <ScValStruct key={i} indent={indent} separate={value.length - i}>
|
|
19
|
-
<ScVal value={v} indent={indent} nested/>
|
|
20
|
-
</ScValStruct>)
|
|
21
|
-
return wrapObjects ? <>[{values}]</> : <>{values}</>
|
|
22
|
-
}
|
|
23
|
-
const val = value._value
|
|
24
|
-
switch (value._arm) {
|
|
25
|
-
case 'vec':
|
|
26
|
-
return <>[{val.map((v, i) => <ScValStruct key={i} indent={indent} separate={val.length - i}>
|
|
27
|
-
<ScVal value={v} indent={indent} nested/>
|
|
28
|
-
</ScValStruct>)}]</>
|
|
29
|
-
case 'map':
|
|
30
|
-
const values = val.map((kv, i) =>
|
|
31
|
-
<ScValStruct key={i} indent={indent} separate={val.length - i}>
|
|
32
|
-
<ScVal value={kv.key()} indent={indent} nested/>: <ScVal value={kv.val()} indent={indent} nested/>
|
|
33
|
-
</ScValStruct>)
|
|
34
|
-
return wrapObjects ? <>{{values}}</> : <>{values}</>
|
|
35
|
-
case 'b':
|
|
36
|
-
return <>{val.toString()}<ScValType type="bool"/></>
|
|
37
|
-
case 'i32':
|
|
38
|
-
case 'u32':
|
|
39
|
-
return <>{val}<ScValType type={value._arm}/></>
|
|
40
|
-
case 'i256':
|
|
41
|
-
case 'u256':
|
|
42
|
-
case 'i128':
|
|
43
|
-
case 'u128':
|
|
44
|
-
case 'i64':
|
|
45
|
-
case 'u64':
|
|
46
|
-
case 'timepoint':
|
|
47
|
-
case 'duration':
|
|
48
|
-
return <>{scValToBigInt(value).toString()}<ScValType type={value._arm}/></>
|
|
49
|
-
case 'address':
|
|
50
|
-
switch (val._arm) {
|
|
51
|
-
case 'accountId':
|
|
52
|
-
return <AccountAddress account={xdrParserUtils.xdrParseAccountAddress(val.value())}/>
|
|
53
|
-
case 'contractId':
|
|
54
|
-
return <AccountAddress account={xdrParserUtils.xdrParseContractAddress(val.value())}/>
|
|
55
|
-
case 'muxedAccount':
|
|
56
|
-
return <AccountAddress account={xdrParserUtils.xdrParseMuxedScAddress(val.value())}/>
|
|
57
|
-
}
|
|
58
|
-
return <span className="dimmed">(unsupported address)</span>
|
|
59
|
-
case 'bytes':
|
|
60
|
-
const asBytes = val.toString('base64')
|
|
61
|
-
return <><span className="condensed">{shortenString(asBytes, 86)}</span><ScValType type="bytes"/></>
|
|
62
|
-
case 'str':
|
|
63
|
-
case 'sym':
|
|
64
|
-
return <span className="word-break">"{val.toString()}"<ScValType type={value._arm}/></span>
|
|
65
|
-
case 'nonceKey':
|
|
66
|
-
return <>{val.nonce()._value.toString()}<ScValType type="nonce"/></>
|
|
67
|
-
case 'instance':
|
|
68
|
-
if (val._attributes.executable._switch.name==="contractExecutableStellarAsset")
|
|
69
|
-
return <span>StellarAsset<ScValType type="instance"/></span>
|
|
70
|
-
return <span className="word-break">{val._attributes.executable.wasmHash().toString('hex')}<ScValType type="wasm"/></span>
|
|
71
|
-
case 'error':
|
|
72
|
-
const errMessage = value.toXDR('base64')
|
|
73
|
-
return <><span className="condensed" title={errMessage}>{shortenString(errMessage, 50)}</span><ScValType type="error"/></>
|
|
74
|
-
case 'contractId':
|
|
75
|
-
return <AccountAddress account={xdrParserUtils.xdrParseContractAddress(value._value)}/>
|
|
76
|
-
default:
|
|
77
|
-
switch (value._switch.name) {
|
|
78
|
-
case 'scvVoid':
|
|
79
|
-
return '()'
|
|
80
|
-
case 'scvContractInstance':
|
|
81
|
-
return '<ContractInstance>'
|
|
82
|
-
case 'scvLedgerKeyContractInstance':
|
|
83
|
-
return '<LedgerKeyContractInstance>'
|
|
84
|
-
case 'scvLedgerKeyNonce':
|
|
85
|
-
return '<LedgerKeyNonce>'
|
|
86
|
-
}
|
|
87
|
-
return <span className="dimmed">(unknown)</span>
|
|
88
|
-
}
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
export function parseScValValue(value) {
|
|
92
|
-
return xdr.ScVal.fromXDR(value, 'base64')
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const ScValType = React.memo(function ScValType({type}) {
|
|
96
|
-
return <sub className="dimmed text-tiny" style={{padding: '0 0.2em'}}>{type}</sub>
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
export const ScValStruct = React.memo(function ScValStruct({indent, children, separate}) {
|
|
100
|
-
const separator = separate > 1 ? <>, </> : null
|
|
101
|
-
if (!indent)
|
|
102
|
-
return <>{children}{separator}</>
|
|
103
|
-
return <div className="block-indent">
|
|
104
|
-
{children}{separator}
|
|
105
|
-
</div>
|
|
106
|
-
})
|
|
107
|
-
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import cn from 'classnames'
|
|
3
|
+
import {xdr, scValToBigInt} from '@stellar/stellar-base'
|
|
4
|
+
import {xdrParserUtils} from '@stellar-expert/tx-meta-effects-parser'
|
|
5
|
+
import {shortenString} from '@stellar-expert/formatter'
|
|
6
|
+
import {AccountAddress} from '../account/account-address'
|
|
7
|
+
import './sc-val.scss'
|
|
8
|
+
|
|
9
|
+
export const ScVal = React.memo(function ScVal({value, nested = false, indent = false, wrapObjects = true}) {
|
|
10
|
+
if (!nested)
|
|
11
|
+
return <code className={cn('sc-val', {block: indent})}><ScVal value={value} indent={indent} nested/></code>
|
|
12
|
+
if (!value)
|
|
13
|
+
return 'void'
|
|
14
|
+
if (typeof value === 'string') {
|
|
15
|
+
value = xdr.ScVal.fromXDR(value, 'base64')
|
|
16
|
+
}
|
|
17
|
+
if (value instanceof Array) {
|
|
18
|
+
const values = value.map((v, i) => <ScValStruct key={i} indent={indent} separate={value.length - i}>
|
|
19
|
+
<ScVal value={v} indent={indent} nested/>
|
|
20
|
+
</ScValStruct>)
|
|
21
|
+
return wrapObjects ? <>[{values}]</> : <>{values}</>
|
|
22
|
+
}
|
|
23
|
+
const val = value._value
|
|
24
|
+
switch (value._arm) {
|
|
25
|
+
case 'vec':
|
|
26
|
+
return <>[{val.map((v, i) => <ScValStruct key={i} indent={indent} separate={val.length - i}>
|
|
27
|
+
<ScVal value={v} indent={indent} nested/>
|
|
28
|
+
</ScValStruct>)}]</>
|
|
29
|
+
case 'map':
|
|
30
|
+
const values = val.map((kv, i) =>
|
|
31
|
+
<ScValStruct key={i} indent={indent} separate={val.length - i}>
|
|
32
|
+
<ScVal value={kv.key()} indent={indent} nested/>: <ScVal value={kv.val()} indent={indent} nested/>
|
|
33
|
+
</ScValStruct>)
|
|
34
|
+
return wrapObjects ? <>{{values}}</> : <>{values}</>
|
|
35
|
+
case 'b':
|
|
36
|
+
return <>{val.toString()}<ScValType type="bool"/></>
|
|
37
|
+
case 'i32':
|
|
38
|
+
case 'u32':
|
|
39
|
+
return <>{val}<ScValType type={value._arm}/></>
|
|
40
|
+
case 'i256':
|
|
41
|
+
case 'u256':
|
|
42
|
+
case 'i128':
|
|
43
|
+
case 'u128':
|
|
44
|
+
case 'i64':
|
|
45
|
+
case 'u64':
|
|
46
|
+
case 'timepoint':
|
|
47
|
+
case 'duration':
|
|
48
|
+
return <>{scValToBigInt(value).toString()}<ScValType type={value._arm}/></>
|
|
49
|
+
case 'address':
|
|
50
|
+
switch (val._arm) {
|
|
51
|
+
case 'accountId':
|
|
52
|
+
return <AccountAddress account={xdrParserUtils.xdrParseAccountAddress(val.value())}/>
|
|
53
|
+
case 'contractId':
|
|
54
|
+
return <AccountAddress account={xdrParserUtils.xdrParseContractAddress(val.value())}/>
|
|
55
|
+
case 'muxedAccount':
|
|
56
|
+
return <AccountAddress account={xdrParserUtils.xdrParseMuxedScAddress(val.value())}/>
|
|
57
|
+
}
|
|
58
|
+
return <span className="dimmed">(unsupported address)</span>
|
|
59
|
+
case 'bytes':
|
|
60
|
+
const asBytes = val.toString('base64')
|
|
61
|
+
return <><span className="condensed">{shortenString(asBytes, 86)}</span><ScValType type="bytes"/></>
|
|
62
|
+
case 'str':
|
|
63
|
+
case 'sym':
|
|
64
|
+
return <span className="word-break">"{val.toString()}"<ScValType type={value._arm}/></span>
|
|
65
|
+
case 'nonceKey':
|
|
66
|
+
return <>{val.nonce()._value.toString()}<ScValType type="nonce"/></>
|
|
67
|
+
case 'instance':
|
|
68
|
+
if (val._attributes.executable._switch.name==="contractExecutableStellarAsset")
|
|
69
|
+
return <span>StellarAsset<ScValType type="instance"/></span>
|
|
70
|
+
return <span className="word-break">{val._attributes.executable.wasmHash().toString('hex')}<ScValType type="wasm"/></span>
|
|
71
|
+
case 'error':
|
|
72
|
+
const errMessage = value.toXDR('base64')
|
|
73
|
+
return <><span className="condensed" title={errMessage}>{shortenString(errMessage, 50)}</span><ScValType type="error"/></>
|
|
74
|
+
case 'contractId':
|
|
75
|
+
return <AccountAddress account={xdrParserUtils.xdrParseContractAddress(value._value)}/>
|
|
76
|
+
default:
|
|
77
|
+
switch (value._switch.name) {
|
|
78
|
+
case 'scvVoid':
|
|
79
|
+
return '()'
|
|
80
|
+
case 'scvContractInstance':
|
|
81
|
+
return '<ContractInstance>'
|
|
82
|
+
case 'scvLedgerKeyContractInstance':
|
|
83
|
+
return '<LedgerKeyContractInstance>'
|
|
84
|
+
case 'scvLedgerKeyNonce':
|
|
85
|
+
return '<LedgerKeyNonce>'
|
|
86
|
+
}
|
|
87
|
+
return <span className="dimmed">(unknown)</span>
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
export function parseScValValue(value) {
|
|
92
|
+
return xdr.ScVal.fromXDR(value, 'base64')
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const ScValType = React.memo(function ScValType({type}) {
|
|
96
|
+
return <sub className="dimmed text-tiny" style={{padding: '0 0.2em'}}>{type}</sub>
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
export const ScValStruct = React.memo(function ScValStruct({indent, children, separate}) {
|
|
100
|
+
const separator = separate > 1 ? <>, </> : null
|
|
101
|
+
if (!indent)
|
|
102
|
+
return <>{children}{separator}</>
|
|
103
|
+
return <div className="block-indent">
|
|
104
|
+
{children}{separator}
|
|
105
|
+
</div>
|
|
106
|
+
})
|
|
107
|
+
|
|
108
108
|
export const primitiveTypes = new Set(['b', 'i32', 'u32', 'i256', 'u256', 'i128', 'u128', 'i64', 'u64', 'timepoint', 'duration', 'address', 'bytes', 'str', 'sym', 'nonceKey', 'contractId', 'instance'])
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
@import "./button";
|
|
2
|
-
|
|
3
|
-
.button-group {
|
|
4
|
-
> * {
|
|
5
|
-
vertical-align: top;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
&:not(:last-child) {
|
|
9
|
-
margin-right: $button-spacing;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
& > button,
|
|
13
|
-
& > .button {
|
|
14
|
-
+ .button {
|
|
15
|
-
margin-left: -0.76em;
|
|
16
|
-
|
|
17
|
-
&.small {
|
|
18
|
-
margin-left: -0.96em;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
&:before {
|
|
22
|
-
border-left: 2px solid var(--color-primary);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
&.selected {
|
|
27
|
-
&.disabled,
|
|
28
|
-
&[disabled] {
|
|
29
|
-
cursor: pointer;
|
|
30
|
-
color: var(--color-text);
|
|
31
|
-
opacity: 1;
|
|
32
|
-
|
|
33
|
-
&:before {
|
|
34
|
-
background: var(--color-primary);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
&:not(:last-child) {;
|
|
40
|
-
margin-right: 0;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
& > :not(:last-child) > .button {
|
|
45
|
-
margin-right: 0;
|
|
46
|
-
}
|
|
1
|
+
@import "./button";
|
|
2
|
+
|
|
3
|
+
.button-group {
|
|
4
|
+
> * {
|
|
5
|
+
vertical-align: top;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
&:not(:last-child) {
|
|
9
|
+
margin-right: $button-spacing;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
& > button,
|
|
13
|
+
& > .button {
|
|
14
|
+
+ .button {
|
|
15
|
+
margin-left: -0.76em;
|
|
16
|
+
|
|
17
|
+
&.small {
|
|
18
|
+
margin-left: -0.96em;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
&:before {
|
|
22
|
+
border-left: 2px solid var(--color-primary);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&.selected {
|
|
27
|
+
&.disabled,
|
|
28
|
+
&[disabled] {
|
|
29
|
+
cursor: pointer;
|
|
30
|
+
color: var(--color-text);
|
|
31
|
+
opacity: 1;
|
|
32
|
+
|
|
33
|
+
&:before {
|
|
34
|
+
background: var(--color-primary);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
&:not(:last-child) {;
|
|
40
|
+
margin-right: 0;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
& > :not(:last-child) > .button {
|
|
45
|
+
margin-right: 0;
|
|
46
|
+
}
|
|
47
47
|
}
|