@cdc/core 4.22.10 → 4.22.11

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 (73) hide show
  1. package/README.md +1 -1
  2. package/components/AdvancedEditor.js +52 -67
  3. package/components/ErrorBoundary.jsx +10 -11
  4. package/components/GlobalContext.jsx +2 -6
  5. package/components/LegendCircle.jsx +3 -4
  6. package/components/Loading.jsx +14 -12
  7. package/components/Waiting.jsx +14 -5
  8. package/components/elements/Button.jsx +34 -45
  9. package/components/elements/Card.jsx +1 -1
  10. package/components/inputs/InputCheckbox.jsx +32 -35
  11. package/components/inputs/InputGroup.jsx +38 -17
  12. package/components/inputs/InputSelect.jsx +27 -23
  13. package/components/inputs/InputText.jsx +9 -25
  14. package/components/inputs/InputToggle.jsx +29 -33
  15. package/components/managers/DataDesigner.jsx +87 -64
  16. package/components/ui/Accordion.jsx +18 -30
  17. package/components/ui/Icon.jsx +34 -35
  18. package/components/ui/LoadSpin.jsx +6 -11
  19. package/components/ui/Modal.jsx +40 -44
  20. package/components/ui/Overlay.jsx +12 -23
  21. package/components/ui/OverlayFrame.jsx +1 -5
  22. package/components/ui/Tooltip.jsx +8 -28
  23. package/data/colorPalettes.js +29 -266
  24. package/data/dataDesignerTables.js +107 -107
  25. package/data/themes.js +13 -13
  26. package/helpers/DataTransform.js +92 -92
  27. package/helpers/cacheBustingString.js +3 -3
  28. package/helpers/events.js +5 -6
  29. package/helpers/fetchRemoteData.js +31 -33
  30. package/helpers/getViewport.js +15 -15
  31. package/helpers/numberFromString.js +7 -7
  32. package/helpers/updatePaletteNames.js +15 -17
  33. package/helpers/useDataVizClasses.js +38 -35
  34. package/helpers/validateFipsCodeLength.js +41 -56
  35. package/package.json +2 -2
  36. package/styles/_data-table.scss +32 -27
  37. package/styles/_global.scss +29 -24
  38. package/styles/_mixins.scss +12 -12
  39. package/styles/_reset.scss +85 -16
  40. package/styles/_variables.scss +5 -5
  41. package/styles/base.scss +99 -48
  42. package/styles/heading-colors.scss +6 -2
  43. package/styles/loading.scss +62 -60
  44. package/styles/v2/base/_file-selector.scss +2 -2
  45. package/styles/v2/base/_general.scss +1 -1
  46. package/styles/v2/base/_reset.scss +2 -2
  47. package/styles/v2/base/index.scss +4 -4
  48. package/styles/v2/components/accordion.scss +13 -13
  49. package/styles/v2/components/button.scss +3 -3
  50. package/styles/v2/components/card.scss +1 -1
  51. package/styles/v2/components/data-designer.scss +7 -6
  52. package/styles/v2/components/editor.scss +52 -51
  53. package/styles/v2/components/guidance-block.scss +6 -6
  54. package/styles/v2/components/input/_input-check-radio.scss +7 -7
  55. package/styles/v2/components/input/_input-group.scss +2 -2
  56. package/styles/v2/components/input/_input-slider.scss +2 -3
  57. package/styles/v2/components/input/index.scss +6 -6
  58. package/styles/v2/components/loadspin.scss +1 -1
  59. package/styles/v2/components/modal.scss +2 -2
  60. package/styles/v2/components/overlay.scss +4 -4
  61. package/styles/v2/layout/_alert.scss +8 -8
  62. package/styles/v2/layout/_component.scss +1 -1
  63. package/styles/v2/layout/_data-table.scss +12 -11
  64. package/styles/v2/layout/_progression.scss +8 -6
  65. package/styles/v2/layout/index.scss +5 -5
  66. package/styles/v2/main.scss +7 -7
  67. package/styles/v2/themes/_color-definitions.scss +77 -24
  68. package/styles/v2/themes/index.scss +1 -1
  69. package/styles/v2/utils/_animations.scss +2 -2
  70. package/styles/v2/utils/_breakpoints.scss +53 -12
  71. package/styles/v2/utils/_variables.scss +5 -5
  72. package/styles/v2/utils/index.scss +8 -8
  73. package/styles/waiting.scss +22 -23
@@ -1,43 +1,41 @@
1
- import Papa from 'papaparse';
1
+ import Papa from 'papaparse'
2
2
 
3
3
  export default async function (url) {
4
- try {
5
-
6
- // Using URL Object to get pathname without URL paramaters on regex.
7
- url = new URL(url)
4
+ try {
5
+ // Using URL Object to get pathname without URL paramaters on regex.
6
+ url = new URL(url)
8
7
 
9
- const path = url.pathname
10
- const regex = /(?:\.([^.]+))?$/
11
- const ext = (regex.exec(path)[1])
8
+ const path = url.pathname
9
+ const regex = /(?:\.([^.]+))?$/
10
+ const ext = regex.exec(path)[1]
12
11
 
13
- let data = []
12
+ let data = []
14
13
 
15
- if ('csv' === ext) {
16
- data = await fetch(url.href)
17
- .then(response => response.text())
18
- .then(responseText => {
19
- const parsedCsv = Papa.parse(responseText, {
20
- header: true,
21
- dynamicTyping: true,
22
- skipEmptyLines: true
23
- })
24
- return parsedCsv.data
25
- })
26
- }
14
+ if ('csv' === ext) {
15
+ data = await fetch(url.href)
16
+ .then(response => response.text())
17
+ .then(responseText => {
18
+ const parsedCsv = Papa.parse(responseText, {
19
+ header: true,
20
+ dynamicTyping: true,
21
+ skipEmptyLines: true
22
+ })
23
+ return parsedCsv.data
24
+ })
25
+ }
27
26
 
28
- if ('json' === ext) {
29
- data = await fetch(url.href)
30
- .then(response => response.json())
31
- }
27
+ if ('json' === ext) {
28
+ data = await fetch(url.href).then(response => response.json())
29
+ }
32
30
 
33
- return data;
31
+ return data
32
+ } catch {
33
+ // If we can't parse it, still attempt to fetch it
34
+ try {
35
+ let response = await (await fetch(url)).json()
36
+ return response
34
37
  } catch {
35
- // If we can't parse it, still attempt to fetch it
36
- try {
37
- let response = await (await fetch(url)).json()
38
- return response
39
- } catch {
40
- console.error(`Cannot parse URL: ${url}`);
41
- }
38
+ console.error(`Cannot parse URL: ${url}`)
42
39
  }
40
+ }
43
41
  }
@@ -1,21 +1,21 @@
1
1
  export default function getViewport(size) {
2
- let result = 'lg'
2
+ let result = 'lg'
3
3
 
4
- const viewports = {
5
- "lg": 1200,
6
- "md": 992,
7
- "sm": 768,
8
- "xs": 576,
9
- "xxs": 350
10
- }
4
+ const viewports = {
5
+ lg: 1200,
6
+ md: 992,
7
+ sm: 768,
8
+ xs: 576,
9
+ xxs: 350
10
+ }
11
11
 
12
- if(size > 1200) return result
12
+ if (size > 1200) return result
13
13
 
14
- for(let viewport in viewports) {
15
- if(size <= viewports[viewport]) {
16
- result = viewport
17
- }
14
+ for (let viewport in viewports) {
15
+ if (size <= viewports[viewport]) {
16
+ result = viewport
18
17
  }
18
+ }
19
19
 
20
- return result
21
- }
20
+ return result
21
+ }
@@ -1,11 +1,11 @@
1
1
  export default function numberFromString(value = '', state = null) {
2
- // Only do this to values that are ONLY numbers - without this parseFloat strips all the other text
3
- if (typeof value === 'string' && state?.legend?.type === 'category') return value;
2
+ // Only do this to values that are ONLY numbers - without this parseFloat strips all the other text
3
+ if (typeof value === 'string' && state?.legend?.type === 'category') return value
4
4
 
5
- let nonNumeric = /[^\d.-]/g
6
- if( false === Number.isNaN( parseFloat(value) ) && null === String(value).match(nonNumeric) ) {
7
- return parseFloat(value)
8
- }
5
+ let nonNumeric = /[^\d.-]/g
6
+ if (false === Number.isNaN(parseFloat(value)) && null === String(value).match(nonNumeric)) {
7
+ return parseFloat(value)
8
+ }
9
9
 
10
- return value
10
+ return value
11
11
  }
@@ -1,18 +1,16 @@
1
+ export function updatePaletteNames(colorPalettes) {
2
+ // this function adds REVERSE keyword to each palette
3
+ delete colorPalettes.qualitative9 // delete palette before reversing
4
+ let palettereversed = {}
5
+ for (const [paletteName, hexCodeArr] of Object.entries(colorPalettes)) {
6
+ const paletteStr = String(paletteName)
1
7
 
2
-
3
- export function updatePaletteNames (colorPalettes){
4
- // this function adds REVERSE keyword to each palette
5
- delete colorPalettes.qualitative9 // delete palette before reversing
6
- let palettereversed={}
7
- for (const [paletteName, hexCodeArr] of Object.entries(colorPalettes)) {
8
- const paletteStr = String(paletteName);
9
-
10
- if (!paletteStr.endsWith('reverse') ){
11
- let palette = paletteStr.concat('reverse'); // add to the end of the string "reverse"
12
- palettereversed[palette] = [...hexCodeArr].reverse(); // reverses arrays elements and create new keys on object
13
- }else{
14
- palettereversed = {...colorPalettes}
15
- }
16
- }
17
- return {...palettereversed,...colorPalettes}
18
- }
8
+ if (!paletteStr.endsWith('reverse')) {
9
+ let palette = paletteStr.concat('reverse') // add to the end of the string "reverse"
10
+ palettereversed[palette] = [...hexCodeArr].reverse() // reverses arrays elements and create new keys on object
11
+ } else {
12
+ palettereversed = { ...colorPalettes }
13
+ }
14
+ }
15
+ return { ...palettereversed, ...colorPalettes }
16
+ }
@@ -1,37 +1,40 @@
1
1
  export default function useDataVizClasses(config) {
2
-
3
- let lineDatapointClass = ''
4
- let barBorderClass = ''
5
-
6
- if (config.lineDatapointStyle === "hover") { lineDatapointClass = ' chart-line--hover' }
7
- if (config.lineDatapointStyle === "always show") { lineDatapointClass = ' chart-line--always' }
8
- if (config.barHasBorder === "false") { barBorderClass = ' chart-bar--no-border' }
9
-
10
-
11
- let innerContainerClasses = ['cove-component__inner']
12
- let contentClasses = ['cove-component__content'];
13
-
14
- config.title && innerContainerClasses.push('component--has-title')
15
- config.subtext && innerContainerClasses.push('component--has-subtext')
16
- config.biteStyle && innerContainerClasses.push(`bite__style--${config.biteStyle}`)
17
- config.general?.isCompactStyle && innerContainerClasses.push(`component--isCompactStyle`)
18
-
19
- !config.visual?.border && contentClasses.push('no-borders');
20
- config.visualizationType === 'Spark Line' && contentClasses.push('sparkline')
21
- config.visual?.borderColorTheme && contentClasses.push('component--has-borderColorTheme');
22
- config.visual?.accent && contentClasses.push('component--has-accent');
23
- config.visual?.background && contentClasses.push('component--has-background');
24
- config.visual?.hideBackgroundColor && contentClasses.push('component--hideBackgroundColor');
25
-
26
- // ! these two will be retired.
27
- config.shadow && innerContainerClasses.push('shadow')
28
- config?.visual?.roundedBorders && innerContainerClasses.push('bite--has-rounded-borders')
29
-
30
- let sparkLineStyles = {
31
- width: '100%',
32
- height: '100px',
33
- }
34
-
35
-
36
- return { innerContainerClasses, contentClasses, barBorderClass, lineDatapointClass, sparkLineStyles};
2
+ let lineDatapointClass = ''
3
+ let barBorderClass = ''
4
+
5
+ if (config.lineDatapointStyle === 'hover') {
6
+ lineDatapointClass = ' chart-line--hover'
7
+ }
8
+ if (config.lineDatapointStyle === 'always show') {
9
+ lineDatapointClass = ' chart-line--always'
10
+ }
11
+ if (config.barHasBorder === 'false') {
12
+ barBorderClass = ' chart-bar--no-border'
13
+ }
14
+
15
+ let innerContainerClasses = ['cove-component__inner']
16
+ let contentClasses = ['cove-component__content']
17
+
18
+ config.title && innerContainerClasses.push('component--has-title')
19
+ config.subtext && innerContainerClasses.push('component--has-subtext')
20
+ config.biteStyle && innerContainerClasses.push(`bite__style--${config.biteStyle}`)
21
+ config.general?.isCompactStyle && innerContainerClasses.push(`component--isCompactStyle`)
22
+
23
+ !config.visual?.border && contentClasses.push('no-borders')
24
+ config.visualizationType === 'Spark Line' && contentClasses.push('sparkline')
25
+ config.visual?.borderColorTheme && contentClasses.push('component--has-borderColorTheme')
26
+ config.visual?.accent && contentClasses.push('component--has-accent')
27
+ config.visual?.background && contentClasses.push('component--has-background')
28
+ config.visual?.hideBackgroundColor && contentClasses.push('component--hideBackgroundColor')
29
+
30
+ // ! these two will be retired.
31
+ config.shadow && innerContainerClasses.push('shadow')
32
+ config?.visual?.roundedBorders && innerContainerClasses.push('bite--has-rounded-borders')
33
+
34
+ let sparkLineStyles = {
35
+ width: '100%',
36
+ height: '100px'
37
+ }
38
+
39
+ return { innerContainerClasses, contentClasses, barBorderClass, lineDatapointClass, sparkLineStyles }
37
40
  }
@@ -1,67 +1,52 @@
1
1
  /**
2
2
  * validateFipsCodeLength
3
- *
3
+ *
4
4
  * When stateOrData is an object...
5
- * This is used for validating maps fips codes during runtime where we
5
+ * This is used for validating maps fips codes during runtime where we
6
6
  * In this scenario a user is able to choose the column their Fips Codes are in.
7
- *
7
+ *
8
8
  * When stateOrData is an array...
9
9
  * The user hasn't chose which column has their FIPS codes in it. We still
10
10
  * want to present the FIPS Codes in a friendly format so we attempt to add leading zeros.
11
- *
12
- * @param {object|array} stateOrData
11
+ *
12
+ * @param {object|array} stateOrData
13
13
  * @returns {object|array} stateOrData
14
14
  */
15
15
  export default function validateFipsCodeLength(stateOrData) {
16
-
17
- // FIPS are within obj.
18
- if (!Array.isArray(stateOrData)) {
19
- if (stateOrData.general.geoType === 'us-county' || stateOrData.general.geoType === 'single-state' || stateOrData.general.geoType === 'us' && stateOrData?.data) {
20
-
21
- stateOrData?.data.forEach(dataPiece => {
22
- if (dataPiece[stateOrData.columns.geo.name]) {
23
-
24
- if (!isNaN(parseInt(dataPiece[stateOrData.columns.geo.name])) && dataPiece[stateOrData.columns.geo.name].length === 4) {
25
- dataPiece[stateOrData.columns.geo.name] = 0 + dataPiece[stateOrData.columns.geo.name]
26
- }
27
- dataPiece[stateOrData.columns.geo.name] = dataPiece[stateOrData.columns.geo.name].toString()
28
- }
29
- })
30
- }
31
- }
32
-
33
- // Only includes data - get column name from somewhere else
34
- if (Array.isArray(stateOrData)) {
35
-
36
- let columns = Object.keys(stateOrData[0])
37
-
38
- let potentialColumnNames = [
39
- 'fips',
40
- 'FIPS',
41
- 'fips codes',
42
- 'FIPS CODES',
43
- 'Fips Codes',
44
- 'fips Codes',
45
- 'Fips codes',
46
- 'FIPS Codes'
47
- ]
48
-
49
- const fipsCol = columns.filter(columnName => potentialColumnNames.includes(columnName));
50
-
51
- if (!fipsCol.length) return; // no column name to reference, leave the fips alone.
52
-
53
- stateOrData?.forEach(dataPiece => {
54
-
55
- if (dataPiece[fipsCol]) {
56
-
57
- // specific to county fips codes.
58
- if (!isNaN(parseInt(dataPiece[fipsCol])) && dataPiece[fipsCol].length === 4) {
59
- dataPiece[fipsCol] = 0 + dataPiece[fipsCol]
60
- }
61
- dataPiece[fipsCol] = dataPiece[fipsCol].toString()
62
- }
63
- })
64
- }
65
-
66
- return stateOrData;
16
+ // FIPS are within obj.
17
+ if (!Array.isArray(stateOrData)) {
18
+ if (stateOrData.general.geoType === 'us-county' || stateOrData.general.geoType === 'single-state' || (stateOrData.general.geoType === 'us' && stateOrData?.data)) {
19
+ stateOrData?.data.forEach(dataPiece => {
20
+ if (dataPiece[stateOrData.columns.geo.name]) {
21
+ if (!isNaN(parseInt(dataPiece[stateOrData.columns.geo.name])) && dataPiece[stateOrData.columns.geo.name].length === 4) {
22
+ dataPiece[stateOrData.columns.geo.name] = 0 + dataPiece[stateOrData.columns.geo.name]
23
+ }
24
+ dataPiece[stateOrData.columns.geo.name] = dataPiece[stateOrData.columns.geo.name].toString()
25
+ }
26
+ })
27
+ }
28
+ }
29
+
30
+ // Only includes data - get column name from somewhere else
31
+ if (Array.isArray(stateOrData)) {
32
+ let columns = Object.keys(stateOrData[0])
33
+
34
+ let potentialColumnNames = ['fips', 'FIPS', 'fips codes', 'FIPS CODES', 'Fips Codes', 'fips Codes', 'Fips codes', 'FIPS Codes']
35
+
36
+ const fipsCol = columns.filter(columnName => potentialColumnNames.includes(columnName))
37
+
38
+ if (!fipsCol.length) return // no column name to reference, leave the fips alone.
39
+
40
+ stateOrData?.forEach(dataPiece => {
41
+ if (dataPiece[fipsCol]) {
42
+ // specific to county fips codes.
43
+ if (!isNaN(parseInt(dataPiece[fipsCol])) && dataPiece[fipsCol].length === 4) {
44
+ dataPiece[fipsCol] = 0 + dataPiece[fipsCol]
45
+ }
46
+ dataPiece[fipsCol] = dataPiece[fipsCol].toString()
47
+ }
48
+ })
49
+ }
50
+
51
+ return stateOrData
67
52
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cdc/core",
3
- "version": "4.22.10",
3
+ "version": "4.22.11",
4
4
  "description": "Core elements of the CDC Open Visualization project",
5
5
  "author": "Daniel Immke <npm@daniel.do>",
6
6
  "homepage": "https://github.com/CDCgov/cdc-open-viz#readme",
@@ -30,5 +30,5 @@
30
30
  "resolutions": {
31
31
  "@types/react": "17.x"
32
32
  },
33
- "gitHead": "a7eb551a98c7363d3be58cb81dfc8bbc00522804"
33
+ "gitHead": "9768d1ea0e2383044977d988e33531bcdfe33ea6"
34
34
  }
@@ -1,4 +1,6 @@
1
- .collapsed + .table-container { border-bottom: none; }
1
+ .collapsed + .table-container {
2
+ border-bottom: none;
3
+ }
2
4
  .table-container {
3
5
  overflow-x: auto;
4
6
  border-right: 1px solid $lightGray;
@@ -8,13 +10,13 @@
8
10
 
9
11
  div.data-table-heading {
10
12
  background: rgba(0, 0, 0, 0.05);
11
- padding: .5em .7em;
13
+ padding: 0.5em 0.7em;
12
14
  border: $lightGray 1px solid;
13
15
  border-bottom: 0;
14
16
  cursor: pointer;
15
17
  background-image: url(~@cdc/core/assets/icon-minus.svg);
16
18
  background-size: 15px 15px; // Need to define both for IE11
17
- background-position: right .7em center;
19
+ background-position: right 0.7em center;
18
20
  background-repeat: no-repeat;
19
21
  &:focus {
20
22
  z-index: 2;
@@ -23,7 +25,7 @@ div.data-table-heading {
23
25
  &.collapsed {
24
26
  background-image: url(~@cdc/core/assets/icon-plus.svg);
25
27
  background-size: 15px 15px; // Need to define both for IE11
26
- background-position: right .7em center;
28
+ background-position: right 0.7em center;
27
29
  background-repeat: no-repeat;
28
30
  border-bottom: $lightGray 1px solid;
29
31
  }
@@ -39,7 +41,7 @@ table.data-table {
39
41
  overflow: auto;
40
42
  appearance: none;
41
43
  * {
42
- box-sizing: border-box
44
+ box-sizing: border-box;
43
45
  }
44
46
 
45
47
  thead {
@@ -67,14 +69,14 @@ table.data-table {
67
69
  top: 0;
68
70
  bottom: 0;
69
71
  right: 0;
70
- touch-action:none;
72
+ touch-action: none;
71
73
  }
72
74
  tr {
73
75
  text-align: left;
74
76
  }
75
77
  th,
76
78
  td {
77
- padding: .5em 1.3em .5em .7em;
79
+ padding: 0.5em 1.3em 0.5em 0.7em;
78
80
  line-height: normal;
79
81
  position: relative;
80
82
  text-align: left;
@@ -88,7 +90,7 @@ table.data-table {
88
90
  th.sort {
89
91
  background-color: darken($mediumGray, 10%);
90
92
  background-repeat: no-repeat;
91
- background-position: right .5em center;
93
+ background-position: right 0.5em center;
92
94
  background-size: 10px 5px;
93
95
  }
94
96
 
@@ -104,7 +106,7 @@ table.data-table {
104
106
 
105
107
  th:last-child,
106
108
  td:last-child {
107
- border-right: 0
109
+ border-right: 0;
108
110
  }
109
111
  }
110
112
 
@@ -112,21 +114,21 @@ table.data-table {
112
114
  tr {
113
115
  width: 100%;
114
116
  &:hover {
115
- background: rgba(0, 0, 0, 0.05)
117
+ background: rgba(0, 0, 0, 0.05);
116
118
  }
117
119
  }
118
120
  }
119
121
 
120
122
  tr {
121
- border-bottom: solid 1px #E5E5E5;
123
+ border-bottom: solid 1px #e5e5e5;
122
124
  min-width: 100%; // Needed to fill content up
123
125
  &:last-child {
124
- border-bottom: 0
126
+ border-bottom: 0;
125
127
  }
126
128
  }
127
129
 
128
130
  td {
129
- padding: .3em .7em;
131
+ padding: 0.3em 0.7em;
130
132
  border-right: 1px solid rgba(0, 0, 0, 0.1);
131
133
  }
132
134
 
@@ -138,17 +140,19 @@ table.data-table {
138
140
  &:last-child {
139
141
  border-right: 0 !important;
140
142
  }
141
- &:first-child {
142
- flex-grow: 1;
143
- }
143
+ }
144
+
145
+ th {
146
+ flex-grow: 1;
144
147
  }
145
148
 
146
149
  td {
147
150
  position: relative;
151
+ flex-grow: 1;
148
152
  }
149
153
 
150
154
  td a {
151
- padding: .3em .7em;
155
+ padding: 0.3em 0.7em;
152
156
  position: absolute;
153
157
  top: 0;
154
158
  bottom: 0;
@@ -178,16 +182,17 @@ table.data-table {
178
182
  h3 {
179
183
  font-size: 1.3rem;
180
184
  font-weight: 600;
181
- margin-bottom: .3rem;
185
+ margin-bottom: 0.3rem;
182
186
  }
183
187
  }
184
188
  tr:hover {
185
189
  background: #fff;
186
190
  }
187
- th, td {
191
+ th,
192
+ td {
188
193
  width: 50%;
189
194
  &::before {
190
- content: "\00a0";
195
+ content: '\00a0';
191
196
  }
192
197
  }
193
198
  }
@@ -201,18 +206,18 @@ table.data-table {
201
206
  margin: 0 1rem 0 0;
202
207
  display: flex;
203
208
  li + li {
204
- margin-left: .3rem;
209
+ margin-left: 0.3rem;
205
210
  }
206
211
  button {
207
212
  background: $mediumGray;
208
- padding: .6rem .8rem;
213
+ padding: 0.6rem 0.8rem;
209
214
  &:hover {
210
215
  background: lighten($mediumGray, 5%);
211
216
  }
212
217
  }
213
218
  button.btn-next {
214
219
  &::before {
215
- content: " ";
220
+ content: ' ';
216
221
  background-image: url(~@cdc/core/assets/icon-caret-filled-up.svg);
217
222
  background-size: 10px 5px;
218
223
  width: 10px;
@@ -223,7 +228,7 @@ table.data-table {
223
228
  }
224
229
  button.btn-prev {
225
230
  &::before {
226
- content: " ";
231
+ content: ' ';
227
232
  background-image: url(~@cdc/core/assets/icon-caret-filled-up.svg);
228
233
  background-size: 10px 5px;
229
234
  width: 10px;
@@ -234,7 +239,7 @@ table.data-table {
234
239
  }
235
240
  button[disabled] {
236
241
  background: $mediumGray;
237
- opacity: .3;
242
+ opacity: 0.3;
238
243
  cursor: default;
239
244
  &:hover {
240
245
  background: $mediumGray;
@@ -247,9 +252,9 @@ table.data-table {
247
252
  color: #fff;
248
253
  float: right;
249
254
  text-decoration: none;
250
- transition: .3s all;
255
+ transition: 0.3s all;
251
256
  margin: 1em 0;
252
257
  &:hover {
253
- transition: .3s all;
258
+ transition: 0.3s all;
254
259
  }
255
260
  }