@cdc/core 4.25.10 → 4.25.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/_stories/StoryRenderingTests.stories.tsx +164 -0
  2. package/components/AdvancedEditor/AdvancedEditor.tsx +3 -1
  3. package/components/CustomColorsEditor/CustomColorsEditor.css +299 -0
  4. package/components/CustomColorsEditor/CustomColorsEditor.tsx +209 -0
  5. package/components/CustomColorsEditor/index.ts +1 -0
  6. package/components/DataTable/DataTableStandAlone.tsx +8 -3
  7. package/components/DataTable/components/DataTableEditorPanel.tsx +12 -2
  8. package/components/DataTable/data-table.css +6 -0
  9. package/components/DataTable/helpers/mapCellMatrix.tsx +14 -3
  10. package/components/DataTable/helpers/standardizeState.js +2 -2
  11. package/components/DataTable/helpers/tests/standardizeState.test.js +54 -0
  12. package/components/EditorPanel/DataTableEditor.tsx +3 -3
  13. package/components/EditorPanel/EditorPanel.styles.css +423 -0
  14. package/components/EditorPanel/FootnotesEditor.tsx +44 -37
  15. package/components/EditorPanel/Inputs.tsx +12 -2
  16. package/components/EditorPanel/VizFilterEditor/NestedDropdownEditor.tsx +35 -62
  17. package/components/EditorPanel/VizFilterEditor/VizFilterEditor.tsx +12 -2
  18. package/components/EditorPanel/components/MarkupVariablesEditor.tsx +61 -22
  19. package/components/Filters/Filters.tsx +26 -5
  20. package/components/Filters/components/Dropdown.tsx +6 -1
  21. package/components/Footnotes/Footnotes.tsx +35 -25
  22. package/components/Footnotes/FootnotesStandAlone.tsx +42 -6
  23. package/components/HeaderThemeSelector/HeaderThemeSelector.css +43 -0
  24. package/components/HeaderThemeSelector/HeaderThemeSelector.stories.tsx +74 -0
  25. package/components/HeaderThemeSelector/HeaderThemeSelector.tsx +61 -0
  26. package/components/HeaderThemeSelector/index.ts +2 -0
  27. package/components/Layout/styles/editor.scss +2 -1
  28. package/components/Loader/Loader.tsx +1 -1
  29. package/components/MediaControls.tsx +21 -18
  30. package/components/PaletteConversionModal.tsx +7 -4
  31. package/components/PaletteSelector/PaletteSelector.css +49 -6
  32. package/components/Table/components/Cell.tsx +23 -2
  33. package/components/Table/components/Row.tsx +5 -3
  34. package/components/_stories/Filters.stories.tsx +20 -1
  35. package/components/_stories/Footnotes.CSV.stories.tsx +247 -0
  36. package/components/_stories/Footnotes.stories.tsx +768 -3
  37. package/components/_stories/Inputs.stories.tsx +2 -2
  38. package/components/_stories/styles.scss +0 -1
  39. package/components/ui/Accordion.jsx +1 -1
  40. package/components/ui/accordion.styles.css +57 -0
  41. package/data/chartColorPalettes.ts +1 -1
  42. package/dist/cove-main.css +49 -3
  43. package/dist/cove-main.css.map +1 -1
  44. package/helpers/addValuesToFilters.ts +5 -0
  45. package/helpers/constants.ts +37 -0
  46. package/helpers/cove/number.ts +33 -12
  47. package/helpers/coveUpdateWorker.ts +3 -1
  48. package/helpers/fetchRemoteData.ts +3 -15
  49. package/helpers/markupProcessor.ts +27 -12
  50. package/helpers/mergeCustomOrderValues.ts +37 -0
  51. package/helpers/parseCsvWithQuotes.ts +65 -0
  52. package/helpers/testing.ts +17 -4
  53. package/helpers/ver/4.25.11.ts +13 -0
  54. package/helpers/viewports.ts +2 -0
  55. package/package.json +4 -3
  56. package/styles/_common-components.css +73 -0
  57. package/styles/_global.scss +25 -5
  58. package/styles/base.scss +0 -50
  59. package/styles/cove-main.scss +3 -1
  60. package/styles/filters.scss +10 -3
  61. package/styles/v2/base/index.scss +0 -1
  62. package/styles/v2/components/editor.scss +14 -6
  63. package/styles/v2/utils/_breakpoints.scss +1 -1
  64. package/styles/v2/utils/index.scss +0 -1
  65. package/styles/waiting.scss +1 -1
  66. package/types/MarkupInclude.ts +4 -3
  67. package/types/MarkupVariable.ts +1 -1
  68. package/types/VizFilter.ts +1 -0
  69. package/styles/_mixins.scss +0 -13
  70. package/styles/_typography.scss +0 -0
  71. package/styles/v2/base/_typography.scss +0 -0
  72. package/styles/v2/components/guidance-block.scss +0 -74
  73. package/styles/v2/utils/_functions.scss +0 -0
@@ -34,7 +34,17 @@ const DataTableEditorPanel: React.FC<DataTableEditorProps> = ({ config, updateCo
34
34
  })
35
35
  }
36
36
 
37
- const columns = Object.keys(config.originalFormattedData?.[0] || {})
37
+ const columns = Object.keys(
38
+ config.originalFormattedData?.[0] || config.formattedData?.[0] || config.data?.[0] || {}
39
+ )
40
+ // If no data is available, fallback to column names from config.columns
41
+ const columnsFromConfig = config.columns
42
+ ? Object.values(config.columns)
43
+ .map(col => col.name)
44
+ .filter(Boolean)
45
+ : []
46
+ const finalColumns = columns.length > 0 ? columns : columnsFromConfig
47
+
38
48
  return (
39
49
  <Accordion allowZeroExpanded={true}>
40
50
  <AccordionItem>
@@ -63,7 +73,7 @@ const DataTableEditorPanel: React.FC<DataTableEditorProps> = ({ config, updateCo
63
73
  <AccordionItemButton>Data Table</AccordionItemButton>
64
74
  </AccordionItemHeading>
65
75
  <AccordionItemPanel>
66
- <DataTableEditor config={config} columns={columns} updateField={updateField} isDashboard={true} />
76
+ <DataTableEditor config={config} columns={finalColumns} updateField={updateField} isDashboard={true} />
67
77
  </AccordionItemPanel>
68
78
  </AccordionItem>
69
79
  <AccordionItem>
@@ -166,6 +166,12 @@ table.data-table {
166
166
  text-decoration: none;
167
167
  }
168
168
 
169
+ td div a {
170
+ position: relative;
171
+ padding: 0;
172
+ display: inline;
173
+ }
174
+
169
175
  td span.table-link {
170
176
  text-decoration: underline;
171
177
  cursor: pointer;
@@ -12,11 +12,22 @@ type MapRowsProps = DataTableProps & {
12
12
  rows: string[]
13
13
  }
14
14
 
15
- const getGeoLabel = (config, row, formatLegendLocation, displayGeoName) => {
15
+ const getGeoLabel = (config, row, formatLegendLocation, displayGeoName, runtimeData = null) => {
16
16
  const { geoType, type } = config.general
17
+
17
18
  let labelValue
18
19
  if (!['single-state', 'us-county'].includes(geoType) || type === 'us-geocode') {
20
+ // Use the row (UID) for lookup - this allows "US-AL" to become "Alabama"
19
21
  labelValue = displayGeoName(row)
22
+
23
+ // If displayGeoName returned the same value (not found in lookups), use the raw imported data
24
+ if (labelValue === row && runtimeData && config.columns?.geo?.name) {
25
+ const rawGeoValue = runtimeData[row]?.[config.columns.geo.name]
26
+ if (rawGeoValue && rawGeoValue !== row) {
27
+ labelValue = rawGeoValue
28
+ }
29
+ }
30
+
20
31
  labelValue = String(labelValue).startsWith('region') ? _.capitalize(labelValue) : labelValue
21
32
  } else {
22
33
  labelValue = formatLegendLocation(row)
@@ -58,7 +69,7 @@ export const getMapRowData = (
58
69
  ].map(column => {
59
70
  const label = columns[column]?.label || columns[column]?.name || column
60
71
  if (column === 'geo') {
61
- dataRow[label] = getGeoLabel(config, row, formatLegendLocation, displayGeoName)
72
+ dataRow[label] = getGeoLabel(config, row, formatLegendLocation, displayGeoName, runtimeData)
62
73
  } else if (filterColumns.includes(column)) {
63
74
  dataRow[label] = runtimeData[row][column]
64
75
  } else {
@@ -100,7 +111,7 @@ const mapCellArray = ({
100
111
  if (!legendColor) {
101
112
  console.error('No legend color found') // eslint-disable-line no-console
102
113
  }
103
- const labelValue = getGeoLabel(config, row, formatLegendLocation, displayGeoName)
114
+ const labelValue = getGeoLabel(config, row, formatLegendLocation, displayGeoName, runtimeData)
104
115
  const mapZoomHandler =
105
116
  type === 'bubble' && allowMapZoom && geoType === 'world' ? () => setFilteredCountryCode(row) : undefined
106
117
 
@@ -8,8 +8,8 @@ const states = {
8
8
  CO: 'Colorado',
9
9
  CT: 'Connecticut',
10
10
  DE: 'Delaware',
11
- DC: 'District Of Columbia',
12
- FM: 'Federated States Of Micronesia',
11
+ DC: 'District of Columbia',
12
+ FM: 'Federated States of Micronesia',
13
13
  FL: 'Florida',
14
14
  GA: 'Georgia',
15
15
  GU: 'Guam',
@@ -0,0 +1,54 @@
1
+ import { standardizeStateName } from '../standardizeState'
2
+
3
+ describe('standardizeStateName', () => {
4
+ it('should return non-string values unchanged', () => {
5
+ expect(standardizeStateName(123)).toBe(123)
6
+ expect(standardizeStateName(null)).toBe(null)
7
+ expect(standardizeStateName(undefined)).toBe(undefined)
8
+ expect(standardizeStateName(true)).toBe(true)
9
+ })
10
+
11
+ it('should return numeric strings unchanged', () => {
12
+ expect(standardizeStateName('123')).toBe('123')
13
+ expect(standardizeStateName('456.78')).toBe('456.78')
14
+ })
15
+
16
+ it('should convert state abbreviations to full names', () => {
17
+ expect(standardizeStateName('DC')).toBe('District of Columbia')
18
+ expect(standardizeStateName('dc')).toBe('District of Columbia')
19
+ expect(standardizeStateName('CA')).toBe('California')
20
+ expect(standardizeStateName('ca')).toBe('California')
21
+ expect(standardizeStateName('FM')).toBe('Federated States of Micronesia')
22
+ expect(standardizeStateName('fm')).toBe('Federated States of Micronesia')
23
+ })
24
+
25
+ it('should handle Virgin Islands variations', () => {
26
+ expect(standardizeStateName('VI')).toBe('U.S. VIRGIN ISLANDS')
27
+ expect(standardizeStateName('vi')).toBe('U.S. VIRGIN ISLANDS')
28
+ expect(standardizeStateName('Virgin Islands')).toBe('U.S. VIRGIN ISLANDS')
29
+ expect(standardizeStateName('VIRGIN ISLANDS')).toBe('U.S. VIRGIN ISLANDS')
30
+ expect(standardizeStateName('U.S. Virgin Islands')).toBe('U.S. VIRGIN ISLANDS')
31
+ expect(standardizeStateName('US VIRGIN ISLANDS')).toBe('U.S. VIRGIN ISLANDS')
32
+ })
33
+
34
+ it('should verify "of" is lowercase in state names', () => {
35
+ const dcName = standardizeStateName('DC')
36
+ expect(dcName).toContain('of')
37
+ expect(dcName).not.toContain('Of')
38
+
39
+ const fmName = standardizeStateName('FM')
40
+ expect(fmName).toContain('of')
41
+ expect(fmName).not.toContain('Of')
42
+ })
43
+
44
+ it('should return original value for unknown state codes', () => {
45
+ expect(standardizeStateName('ZZ')).toBe('ZZ')
46
+ expect(standardizeStateName('Unknown State')).toBe('Unknown State')
47
+ })
48
+
49
+ it('should handle mixed case state names', () => {
50
+ expect(standardizeStateName('California')).toBe('California')
51
+ expect(standardizeStateName('CALIFORNIA')).toBe('CALIFORNIA')
52
+ expect(standardizeStateName('cAlIfOrNiA')).toBe('cAlIfOrNiA')
53
+ })
54
+ })
@@ -21,9 +21,9 @@ const DataTableEditor: React.FC<DataTableProps> = ({ config, updateField, isDash
21
21
  const isLoadedFromUrl = config.dataKey?.includes('http://') || config?.dataKey?.includes('https://')
22
22
  const excludedColumns = useMemo(() => {
23
23
  return Object.keys(config.columns)
24
- .map<[string, boolean]>(key => [key, config.columns[key].dataTable])
25
- .filter(([key, dataTable]) => !dataTable)
26
- .map(([key]) => key)
24
+ .map<[string, boolean]>(key => [config.columns[key].name, config.columns[key].dataTable])
25
+ .filter(([columnName, dataTable]) => !dataTable && columnName) // also filter out undefined names
26
+ .map(([columnName]) => columnName)
27
27
  }, [config.columns])
28
28
 
29
29
  const groupPivotColumns = useMemo(() => {
@@ -0,0 +1,423 @@
1
+ /* EditorPanel component styles */
2
+ /* Shared editor panel component styles used across all visualization packages */
3
+
4
+ /* Color palette in editor panel context */
5
+ .editor-panel .header .color-palette li {
6
+ width: 1.5em;
7
+ height: 1.5em;
8
+ display: inline-block;
9
+ }
10
+
11
+ .editor-panel .color-palette {
12
+ display: flex;
13
+ }
14
+
15
+ .editor-panel .color-palette li {
16
+ width: 1.5em;
17
+ height: 1.5em;
18
+ display: inline-block;
19
+ margin-right: 0.5em;
20
+ cursor: pointer;
21
+ border: rgba(0, 0, 0, 0.3) 3px solid;
22
+ }
23
+
24
+ .editor-panel .color-palette li.active {
25
+ border: rgba(0, 0, 0, 0.8) 3px solid;
26
+ }
27
+
28
+ .editor-panel .color-palette a {
29
+ display: inline-block;
30
+ border-bottom: 1px solid rgba(0, 0, 0, 0.8);
31
+ }
32
+
33
+ .editor-panel .color-palette.series-list {
34
+ flex-direction: column;
35
+ padding: 0;
36
+ border: none;
37
+ }
38
+
39
+ .editor-panel .color-palette.series-list li {
40
+ padding: 0.3em 0.5em;
41
+ display: flex;
42
+ align-items: center;
43
+ justify-content: space-between;
44
+ width: auto;
45
+ height: auto;
46
+ border: 0;
47
+ }
48
+
49
+ .editor-panel .color-palette.series-list li:not(:last-child) {
50
+ border-bottom: rgba(0, 0, 0, 0.2) 1px solid;
51
+ }
52
+
53
+ .editor-panel .form-container {
54
+ border-right: var(--lightGray) 1px solid;
55
+ flex-grow: 1;
56
+ }
57
+
58
+ .editor-panel .guidance-link {
59
+ margin: 2em 1em 0;
60
+ padding: 0.75em 1em;
61
+ }
62
+
63
+ .editor-panel .guidance-link svg {
64
+ width: 60px;
65
+ color: var(--blue);
66
+ margin-right: 1rem;
67
+ height: 60px;
68
+ }
69
+
70
+ .editor-panel .guidance-link svg path {
71
+ fill: currentColor;
72
+ }
73
+
74
+ .editor-panel .warning {
75
+ color: #d8000c;
76
+ background-color: #ffd2d2;
77
+ padding: 0.75em 1em;
78
+ margin: 1em 0;
79
+ font-size: 0.8em;
80
+ border: #d8000c 1px solid;
81
+ border-radius: 0.4em;
82
+ }
83
+
84
+ .editor-panel .warning strong {
85
+ font-weight: 600;
86
+ display: block;
87
+ }
88
+
89
+ .editor-panel .advanced {
90
+ padding: 0 1em 1em;
91
+ text-align: left;
92
+ }
93
+
94
+ .editor-panel .advanced p {
95
+ font-size: 0.8rem;
96
+ }
97
+
98
+ .editor-panel .advanced .advanced-toggle-link {
99
+ padding-top: 1em;
100
+ display: block;
101
+ text-align: left;
102
+ cursor: pointer;
103
+ text-decoration: underline;
104
+ }
105
+
106
+ .editor-panel .advanced .advanced-toggle-link span {
107
+ text-decoration: none;
108
+ display: inline-block;
109
+ font-family: monospace;
110
+ padding-right: 5px;
111
+ }
112
+
113
+ .editor-panel .advanced .advanced-toggle-link:hover {
114
+ color: rgba(0, 0, 0, 0.7);
115
+ }
116
+
117
+ .editor-panel .advanced textarea {
118
+ height: 400px;
119
+ width: 100%;
120
+ font-size: 0.9em;
121
+ padding: 0.5em;
122
+ font-family: monospace;
123
+ box-sizing: border-box;
124
+ }
125
+
126
+ .editor-panel .heading-2 {
127
+ background: #565656;
128
+ color: #fff;
129
+ font-size: 1.1em;
130
+ padding: 0.6em 1em;
131
+ position: relative;
132
+ border-bottom: #565656 3px solid;
133
+ z-index: 3;
134
+ }
135
+
136
+ .editor-panel label {
137
+ text-transform: uppercase;
138
+ display: block;
139
+ font-size: 0.8em;
140
+ font-weight: 600;
141
+ }
142
+
143
+ .editor-panel label:not(:first-child) {
144
+ margin-top: 1em;
145
+ }
146
+
147
+ .editor-panel label span.edit-label {
148
+ margin-bottom: 0.3em;
149
+ display: block;
150
+ }
151
+
152
+ .editor-panel label span.column-heading {
153
+ font-size: 1em;
154
+ }
155
+
156
+ .editor-panel label.checkbox {
157
+ display: flex;
158
+ }
159
+
160
+ .editor-panel label.checkbox span {
161
+ text-transform: none;
162
+ font-size: 1em;
163
+ font-weight: 400;
164
+ }
165
+
166
+ .editor-panel label.checkbox input {
167
+ margin-top: 0;
168
+ margin-right: 0.5em;
169
+ }
170
+
171
+ .editor-panel input[type='checkbox'],
172
+ .editor-panel input[type='radio'] {
173
+ display: inline-block;
174
+ width: auto !important;
175
+ height: auto !important;
176
+ padding: 0;
177
+ margin-right: 0.5em;
178
+ cursor: pointer;
179
+ user-select: none;
180
+ }
181
+
182
+ .editor-panel input[type='text'],
183
+ .editor-panel input[role='combobox'],
184
+ .editor-panel input[type='number'],
185
+ .editor-panel textarea {
186
+ padding: 0.5em;
187
+ width: 100%;
188
+ }
189
+
190
+ .editor-panel fieldset {
191
+ padding-left: 0;
192
+ }
193
+
194
+ .editor-panel .primary-fieldset {
195
+ border-top: rgba(0, 0, 0, 0.3) 2px solid;
196
+ padding-top: 2em;
197
+ margin-top: 2em;
198
+ }
199
+
200
+ .editor-panel ul.column-edit {
201
+ list-style: none;
202
+ }
203
+
204
+ .editor-panel ul.column-edit li {
205
+ display: flex;
206
+ flex-wrap: wrap;
207
+ justify-content: space-between;
208
+ padding: 0.3em 0;
209
+ }
210
+
211
+ .editor-panel ul.column-edit li label {
212
+ display: inline-block;
213
+ width: 48%;
214
+ }
215
+
216
+ .editor-panel ul.column-edit li label:nth-child(odd) {
217
+ margin-top: 1em;
218
+ }
219
+
220
+ .editor-panel ul.column-edit.three-col li label {
221
+ width: 31%;
222
+ }
223
+
224
+ .editor-panel .edit-block {
225
+ border: 1px solid rgba(0, 0, 0, 0.3);
226
+ padding: 1em;
227
+ margin-top: 1em;
228
+ position: relative;
229
+ }
230
+
231
+ .editor-panel .edit-block .remove-column {
232
+ position: absolute;
233
+ top: 0;
234
+ right: 0;
235
+ border: 0;
236
+ background: rgba(0, 0, 0, 0.1);
237
+ color: #000;
238
+ font-size: 0.8em;
239
+ padding: 0.3em;
240
+ cursor: pointer;
241
+ }
242
+
243
+ .editor-panel span.subtext {
244
+ text-transform: none;
245
+ display: block;
246
+ font-size: 0.8em;
247
+ font-weight: 400;
248
+ }
249
+
250
+ .editor-panel .sort-list {
251
+ list-style: none;
252
+ }
253
+
254
+ .editor-panel .sort-list li {
255
+ border: 1px solid rgba(0, 0, 0, 0.2);
256
+ padding: 0.3em;
257
+ display: flex;
258
+ align-items: center;
259
+ cursor: move;
260
+ margin-bottom: 0.3em;
261
+ }
262
+
263
+ .editor-panel .sort-list li svg {
264
+ margin-right: 0.5em;
265
+ }
266
+
267
+ .editor-panel .info {
268
+ margin-top: 1em;
269
+ font-size: 0.9em;
270
+ }
271
+
272
+ /* React Tags Component styles (third-party library) */
273
+ .editor-panel .react-tags__search {
274
+ width: 100%;
275
+ }
276
+
277
+ .editor-panel .react-tags {
278
+ position: relative;
279
+ cursor: text;
280
+ }
281
+
282
+ .editor-panel .react-tags input.react-tags__search-input {
283
+ font-size: 0.8rem;
284
+ }
285
+
286
+ .editor-panel .react-tags span {
287
+ display: inline;
288
+ }
289
+
290
+ .editor-panel .react-tags.is-focused {
291
+ border-color: rgba(0, 0, 0, 0.7);
292
+ }
293
+
294
+ .editor-panel .react-tags__selected {
295
+ display: inline;
296
+ }
297
+
298
+ .editor-panel .react-tags__selected-tag {
299
+ display: inline-block;
300
+ box-sizing: border-box;
301
+ border: 1px solid #d1d1d1;
302
+ border-radius: 2px;
303
+ background: #f1f1f1;
304
+ padding: 0.4em 0.6em;
305
+ font-size: 0.8em;
306
+ margin-right: 0.3em;
307
+ margin-bottom: 0.3em;
308
+ }
309
+
310
+ .editor-panel .react-tags__selected-tag:after {
311
+ content: '\2715';
312
+ color: #aaa;
313
+ margin-left: 8px;
314
+ }
315
+
316
+ .editor-panel .react-tags__selected-tag:hover,
317
+ .editor-panel .react-tags__selected-tag:focus {
318
+ border-color: #b1b1b1;
319
+ }
320
+
321
+ .editor-panel .react-tags__search {
322
+ display: inline-block;
323
+ max-width: 100%;
324
+ }
325
+
326
+ @media screen and (min-width: 30em) {
327
+ .editor-panel .react-tags__search {
328
+ position: relative;
329
+ }
330
+ }
331
+
332
+ .editor-panel .react-tags__search input {
333
+ max-width: 100%;
334
+ margin: 0;
335
+ outline: none;
336
+ padding: 0.5em 0.3em;
337
+ font-size: inherit;
338
+ line-height: inherit;
339
+ }
340
+
341
+ .editor-panel .react-tags__search input::-ms-clear {
342
+ display: none;
343
+ }
344
+
345
+ .editor-panel .react-tags__suggestions {
346
+ position: absolute;
347
+ top: 100%;
348
+ left: 0;
349
+ width: 100%;
350
+ }
351
+
352
+ @media screen and (min-width: 30em) {
353
+ .editor-panel .react-tags__suggestions {
354
+ width: 240px;
355
+ }
356
+ }
357
+
358
+ .editor-panel .react-tags__suggestions ul {
359
+ margin: 4px -1px;
360
+ padding: 0;
361
+ list-style: none;
362
+ background: white;
363
+ border: 1px solid #d1d1d1;
364
+ border-radius: 2px;
365
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
366
+ }
367
+
368
+ .editor-panel .react-tags__suggestions li {
369
+ border-bottom: 1px solid #ddd;
370
+ padding: 6px 8px;
371
+ }
372
+
373
+ .editor-panel .react-tags__suggestions li mark {
374
+ text-decoration: underline;
375
+ background: none;
376
+ font-weight: 600;
377
+ }
378
+
379
+ .editor-panel .react-tags__suggestions li:hover {
380
+ cursor: pointer;
381
+ background: #eee;
382
+ }
383
+
384
+ .editor-panel .react-tags__suggestions li.is-active {
385
+ background: #b7cfe0;
386
+ }
387
+
388
+ .editor-panel .react-tags__suggestions li.is-disabled {
389
+ opacity: 0.5;
390
+ cursor: auto;
391
+ }
392
+
393
+ .editor-toggle {
394
+ position: fixed;
395
+ top: 1em;
396
+ right: 1em;
397
+ background: var(--blue);
398
+ color: white;
399
+ border: 0;
400
+ border-radius: 0.5em;
401
+ padding: 0.5em 1em;
402
+ font-size: 1em;
403
+ cursor: pointer;
404
+ z-index: 9999999999;
405
+ display: none;
406
+ }
407
+
408
+ .editor-toggle.active {
409
+ display: block;
410
+ }
411
+
412
+ .editor-toggle:hover {
413
+ background: var(--darkBlue);
414
+ }
415
+
416
+ .editor-toggle svg {
417
+ height: 1em;
418
+ width: 1em;
419
+ }
420
+
421
+ .editor-toggle svg path {
422
+ fill: currentColor;
423
+ }