@cdc/core 4.25.10 → 4.26.1

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 (134) hide show
  1. package/_stories/Gallery.Charts.stories.tsx +307 -0
  2. package/_stories/Gallery.DataBite.stories.tsx +72 -0
  3. package/_stories/Gallery.Maps.stories.tsx +230 -0
  4. package/_stories/Gallery.WaffleChart.stories.tsx +187 -0
  5. package/_stories/PageART.stories.tsx +192 -0
  6. package/_stories/PageBRFSS.stories.tsx +289 -0
  7. package/_stories/PageCancerRegistries.stories.tsx +199 -0
  8. package/_stories/PageEasternEquineEncephalitis.stories.tsx +202 -0
  9. package/_stories/PageExcessiveAlcoholUse.stories.tsx +196 -0
  10. package/_stories/PageMaternalMortality.stories.tsx +192 -0
  11. package/_stories/PageOralHealth.stories.tsx +196 -0
  12. package/_stories/PageRespiratory.stories.tsx +332 -0
  13. package/_stories/PageSmokingTobacco.stories.tsx +195 -0
  14. package/_stories/PageStateDiabetesProfiles.stories.tsx +196 -0
  15. package/_stories/PageWastewater.stories.tsx +463 -0
  16. package/_stories/StoryRenderingTests.stories.tsx +164 -0
  17. package/assets/icon-magnifying-glass.svg +5 -0
  18. package/assets/icon-warming-stripes.svg +13 -0
  19. package/components/AdvancedEditor/AdvancedEditor.tsx +7 -1
  20. package/components/AdvancedEditor/EmbedEditor.tsx +281 -0
  21. package/components/ComboBox/ComboBox.tsx +345 -0
  22. package/components/ComboBox/combobox.styles.css +185 -0
  23. package/components/ComboBox/index.ts +1 -0
  24. package/components/CustomColorsEditor/CustomColorsEditor.css +299 -0
  25. package/components/CustomColorsEditor/CustomColorsEditor.tsx +209 -0
  26. package/components/CustomColorsEditor/index.ts +1 -0
  27. package/components/DataTable/DataTable.tsx +132 -58
  28. package/components/DataTable/DataTableStandAlone.tsx +8 -3
  29. package/components/DataTable/components/DataTableEditorPanel.tsx +12 -2
  30. package/components/DataTable/data-table.css +217 -210
  31. package/components/DataTable/helpers/mapCellMatrix.tsx +28 -9
  32. package/components/DataTable/helpers/standardizeState.js +2 -2
  33. package/components/DataTable/helpers/tests/standardizeState.test.js +54 -0
  34. package/components/EditorPanel/ColumnsEditor.tsx +37 -19
  35. package/components/EditorPanel/DataTableEditor.tsx +54 -28
  36. package/components/EditorPanel/EditorPanel.styles.css +439 -0
  37. package/components/EditorPanel/EditorPanel.tsx +144 -0
  38. package/components/EditorPanel/EditorPanelDispatch.tsx +75 -0
  39. package/components/EditorPanel/FieldSetWrapper.tsx +66 -23
  40. package/components/EditorPanel/FootnotesEditor.tsx +44 -37
  41. package/components/EditorPanel/Inputs.tsx +44 -8
  42. package/components/EditorPanel/VizFilterEditor/NestedDropdownEditor.tsx +35 -62
  43. package/components/EditorPanel/VizFilterEditor/VizFilterEditor.tsx +246 -175
  44. package/components/EditorPanel/components/MarkupVariablesEditor.tsx +61 -22
  45. package/components/EditorPanel/sections/VisualSection.tsx +169 -0
  46. package/components/Filters/Filters.tsx +57 -10
  47. package/components/Filters/components/Dropdown.tsx +6 -1
  48. package/components/Filters/helpers/getNestedOptions.ts +2 -1
  49. package/components/Filters/helpers/handleSorting.ts +1 -1
  50. package/components/Footnotes/Footnotes.tsx +35 -25
  51. package/components/Footnotes/FootnotesStandAlone.tsx +42 -6
  52. package/components/HeaderThemeSelector/HeaderThemeSelector.css +43 -0
  53. package/components/HeaderThemeSelector/HeaderThemeSelector.stories.tsx +74 -0
  54. package/components/HeaderThemeSelector/HeaderThemeSelector.tsx +61 -0
  55. package/components/HeaderThemeSelector/index.ts +2 -0
  56. package/components/Layout/components/Sidebar/components/sidebar.styles.scss +82 -0
  57. package/components/Layout/components/Visualization/index.tsx +16 -1
  58. package/components/Layout/components/Visualization/visualizations.scss +7 -0
  59. package/components/Layout/styles/editor.scss +2 -1
  60. package/components/Legend/Legend.Gradient.tsx +1 -1
  61. package/components/Loader/Loader.tsx +1 -1
  62. package/components/MediaControls.tsx +63 -34
  63. package/components/PaletteConversionModal.tsx +7 -4
  64. package/components/PaletteSelector/PaletteSelector.css +49 -6
  65. package/components/Table/components/Cell.tsx +23 -2
  66. package/components/Table/components/Row.tsx +5 -3
  67. package/components/_stories/Filters.stories.tsx +20 -1
  68. package/components/_stories/Footnotes.CSV.stories.tsx +247 -0
  69. package/components/_stories/Footnotes.stories.tsx +768 -3
  70. package/components/_stories/Inputs.stories.tsx +2 -2
  71. package/components/_stories/styles.scss +0 -1
  72. package/components/ui/Accordion.jsx +1 -1
  73. package/components/ui/Icon.tsx +3 -1
  74. package/components/ui/Title/index.tsx +30 -2
  75. package/components/ui/Title/title.styles.css +42 -0
  76. package/components/ui/accordion.styles.css +57 -0
  77. package/data/chartColorPalettes.ts +1 -1
  78. package/dist/cove-main.css +75 -6
  79. package/dist/cove-main.css.map +1 -1
  80. package/generateViteConfig.js +8 -1
  81. package/helpers/addValuesToFilters.ts +11 -1
  82. package/helpers/constants.ts +37 -0
  83. package/helpers/cove/number.ts +33 -12
  84. package/helpers/coveUpdateWorker.ts +20 -11
  85. package/helpers/embedCodeGenerator.ts +109 -0
  86. package/helpers/fetchRemoteData.ts +3 -15
  87. package/helpers/getUniqueValues.ts +19 -0
  88. package/helpers/hashObj.ts +25 -0
  89. package/helpers/isRightAlignedTableValue.js +5 -0
  90. package/helpers/markupProcessor.ts +27 -12
  91. package/helpers/mergeCustomOrderValues.ts +37 -0
  92. package/helpers/metrics/helpers.ts +1 -0
  93. package/helpers/parseCsvWithQuotes.ts +65 -0
  94. package/helpers/pivotData.ts +2 -2
  95. package/helpers/prepareScreenshot.ts +268 -0
  96. package/helpers/queryStringUtils.ts +29 -0
  97. package/helpers/testing.ts +17 -4
  98. package/helpers/tests/prepareScreenshot.test.ts +414 -0
  99. package/helpers/tests/queryStringUtils.test.ts +381 -0
  100. package/helpers/tests/testStandaloneBuild.ts +23 -5
  101. package/helpers/useDataVizClasses.ts +0 -1
  102. package/helpers/ver/4.25.11.ts +13 -0
  103. package/helpers/ver/4.26.1.ts +80 -0
  104. package/helpers/viewports.ts +2 -0
  105. package/hooks/useDataColumns.ts +63 -0
  106. package/hooks/useFilterManagement.ts +94 -0
  107. package/hooks/useLegendSeparators.ts +26 -0
  108. package/hooks/useListManagement.ts +192 -0
  109. package/package.json +6 -4
  110. package/styles/_button-section.scss +0 -3
  111. package/styles/_common-components.css +73 -0
  112. package/styles/_global.scss +25 -5
  113. package/styles/base.scss +0 -50
  114. package/styles/cove-main.scss +3 -1
  115. package/styles/filters.scss +10 -3
  116. package/styles/v2/base/index.scss +0 -1
  117. package/styles/v2/components/editor.scss +14 -6
  118. package/styles/v2/utils/_breakpoints.scss +1 -1
  119. package/styles/v2/utils/index.scss +0 -1
  120. package/styles/waiting.scss +1 -1
  121. package/types/Axis.ts +1 -0
  122. package/types/ForecastingSeriesKey.ts +1 -0
  123. package/types/MarkupInclude.ts +5 -3
  124. package/types/MarkupVariable.ts +1 -1
  125. package/types/Series.ts +3 -0
  126. package/types/Table.ts +1 -0
  127. package/types/Visualization.ts +1 -0
  128. package/types/VizFilter.ts +2 -0
  129. package/LICENSE +0 -201
  130. package/styles/_mixins.scss +0 -13
  131. package/styles/_typography.scss +0 -0
  132. package/styles/v2/base/_typography.scss +0 -0
  133. package/styles/v2/components/guidance-block.scss +0 -74
  134. package/styles/v2/utils/_functions.scss +0 -0
@@ -5,8 +5,10 @@ import { Visualization } from '../../types/Visualization'
5
5
  import { UpdateFieldFunc } from '../../types/UpdateFieldFunc'
6
6
  import { Column } from '../../types/Column'
7
7
  import _ from 'lodash'
8
- import React, { useState } from 'react'
8
+ import React, { useState, useMemo } from 'react'
9
9
  import FieldSetWrapper from './FieldSetWrapper'
10
+ import { useDataColumns } from '../../hooks/useDataColumns'
11
+ import Alert from '../Alert/components/Alert'
10
12
 
11
13
  interface ColumnsEditorProps {
12
14
  config: Partial<Visualization>
@@ -52,19 +54,21 @@ const FieldSet: React.FC<ColumnsEditorProps & { colKey: string; controls: OpenCo
52
54
  updateField(null, null, 'columns', newColumns)
53
55
  }
54
56
 
55
- const getColumns = () => {
56
- const columns: string[] = config.data.flatMap(row => {
57
- return Object.keys(row).map(columnName => columnName)
58
- })
57
+ // Extract column names from data with memoization (replaces getColumns)
58
+ const allColumns = useDataColumns(config.data)
59
+
60
+ // Filter out groupBy and already configured columns
61
+ const availableColumns = useMemo(() => {
59
62
  const configuredColumns = Object.values(config.columns).map(col => col.name)
60
- const cols = _.uniq(columns).filter(key => {
63
+ const cols = allColumns.filter(key => {
61
64
  if (config.table.groupBy === key) return false
62
65
  if (configuredColumns.includes(key)) return false
63
66
  return true
64
67
  })
68
+ // Add current column name if it exists
65
69
  if (config.columns[colKey]?.name) cols.push(config.columns[colKey].name)
66
70
  return cols
67
- }
71
+ }, [allColumns, config.table.groupBy, config.columns, colKey])
68
72
 
69
73
  const colName = config.columns[colKey]?.name
70
74
 
@@ -82,7 +86,7 @@ const FieldSet: React.FC<ColumnsEditorProps & { colKey: string; controls: OpenCo
82
86
  fieldName='name'
83
87
  section={'columns'}
84
88
  initial={'-Select-'}
85
- options={getColumns()}
89
+ options={availableColumns}
86
90
  updateField={(_section, _subsection, _fieldName, value) => changeName(value)}
87
91
  />
88
92
  {config.type !== 'table' && (
@@ -92,7 +96,11 @@ const FieldSet: React.FC<ColumnsEditorProps & { colKey: string; controls: OpenCo
92
96
  fieldName={'series'}
93
97
  section='columns'
94
98
  initial={'Select series'}
95
- options={config.series?.map(series => series.dataKey) || []}
99
+ options={
100
+ config.visualizationType === 'Pie'
101
+ ? config.runtime?.seriesKeys || []
102
+ : config.series?.map(series => series.dataKey) || []
103
+ }
96
104
  updateField={(_section, _subsection, _fieldName, value) => editColumn('series', value)}
97
105
  />
98
106
  )}
@@ -147,16 +155,26 @@ const FieldSet: React.FC<ColumnsEditorProps & { colKey: string; controls: OpenCo
147
155
  </li>
148
156
  <li>
149
157
  {config.table.showVertical && (
150
- <label className='checkbox'>
151
- <input
152
- type='checkbox'
153
- checked={config.columns[colKey].dataTable ?? true}
154
- onChange={event => {
155
- editColumn('dataTable', event.target.checked)
156
- }}
157
- />
158
- <span className='edit-label'>Show in Data Table</span>
159
- </label>
158
+ <>
159
+ <label className='checkbox'>
160
+ <input
161
+ type='checkbox'
162
+ checked={config.columns[colKey].dataTable ?? true}
163
+ onChange={event => {
164
+ editColumn('dataTable', event.target.checked)
165
+ }}
166
+ />
167
+ <span className='edit-label'>Show in Data Table</span>
168
+ </label>
169
+ {(config.confidenceKeys?.upper === colName || config.confidenceKeys?.lower === colName) && (
170
+ <Alert
171
+ type="danger"
172
+ message="Confidence Interval column - required for 508 compliance"
173
+ showCloseButton={false}
174
+ iconSize={14}
175
+ />
176
+ )}
177
+ </>
160
178
  )}
161
179
  </li>
162
180
  {config.visualizationType === 'Pie' && (
@@ -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(() => {
@@ -195,7 +195,7 @@ const DataTableEditor: React.FC<DataTableProps> = ({ config, updateField, isDash
195
195
  updateField={updateField}
196
196
  />
197
197
  )}
198
- {config?.visualizationType !== 'Sankey' && (
198
+ {config?.visualizationType !== 'Sankey' && config?.visualizationType !== 'Warming Stripes' && (
199
199
  <label onClick={e => e.preventDefault()}>
200
200
  <span className='edit-label column-heading mt-1'>Exclude Columns </span>
201
201
  <MultiSelect
@@ -283,11 +283,35 @@ const DataTableEditor: React.FC<DataTableProps> = ({ config, updateField, isDash
283
283
  <CheckBox
284
284
  value={config.table.showDownloadImgButton}
285
285
  fieldName='showDownloadImgButton'
286
- label='Display Image Button'
286
+ label='Display Image Download Link'
287
287
  section='table'
288
288
  updateField={updateField}
289
289
  />
290
290
  )}
291
+ {config.type !== 'table' && config.table.showDownloadImgButton && (
292
+ <CheckBox
293
+ value={config.table.includeContextInDownload}
294
+ fieldName='includeContextInDownload'
295
+ className='ms-4'
296
+ label='Include Heading & Context'
297
+ section='table'
298
+ updateField={updateField}
299
+ tooltip={
300
+ <Tooltip style={{ textTransform: 'none' }}>
301
+ <Tooltip.Target>
302
+ <Icon display='question' style={{ marginLeft: '0.5rem' }} />
303
+ </Tooltip.Target>
304
+ <Tooltip.Content>
305
+ <p>
306
+ When enabled, the image download will include the section heading (H2 or H3) and any explanatory
307
+ paragraphs that appear immediately before the visualization. Be sure to test the image download on the
308
+ published page to ensure the correct context is included.
309
+ </p>
310
+ </Tooltip.Content>
311
+ </Tooltip>
312
+ }
313
+ />
314
+ )}
291
315
  <label>
292
316
  <span className='edit-label column-heading'>Table Cell Min Width</span>
293
317
  <input
@@ -296,7 +320,7 @@ const DataTableEditor: React.FC<DataTableProps> = ({ config, updateField, isDash
296
320
  onChange={e => updateField('table', null, 'cellMinWidth', e.target.value)}
297
321
  />
298
322
  </label>
299
- {config?.visualizationType !== 'Sankey' && (
323
+ {config?.visualizationType !== 'Sankey' && config?.visualizationType !== 'Warming Stripes' && (
300
324
  <Select
301
325
  value={config.table.groupBy}
302
326
  fieldName={'groupBy'}
@@ -322,28 +346,30 @@ const DataTableEditor: React.FC<DataTableProps> = ({ config, updateField, isDash
322
346
  }
323
347
  />
324
348
  )}
325
- <Select
326
- label='Pivot Column'
327
- tooltip={
328
- <Tooltip style={{ textTransform: 'none' }}>
329
- <Tooltip.Target>
330
- <Icon display='question' style={{ marginLeft: '0.5rem' }} />
331
- </Tooltip.Target>
332
- <Tooltip.Content>
333
- <p>Select a Column whos data values will be pivoted to Column Values.</p>
334
- </Tooltip.Content>
335
- </Tooltip>
336
- }
337
- value={config.table.pivot?.columnName}
338
- options={groupPivotColumns.filter(
339
- col => col !== config.table.groupBy && !(config.table.pivot?.valueColumns || []).includes(col)
340
- )}
341
- initial='-Select-'
342
- section='table'
343
- subsection='pivot'
344
- fieldName='columnName'
345
- updateField={updateField}
346
- />
349
+ {config.visualizationType !== 'Warming Stripes' && (
350
+ <Select
351
+ label='Pivot Column'
352
+ tooltip={
353
+ <Tooltip style={{ textTransform: 'none' }}>
354
+ <Tooltip.Target>
355
+ <Icon display='question' style={{ marginLeft: '0.5rem' }} />
356
+ </Tooltip.Target>
357
+ <Tooltip.Content>
358
+ <p>Select a Column whos data values will be pivoted to Column Values.</p>
359
+ </Tooltip.Content>
360
+ </Tooltip>
361
+ }
362
+ value={config.table.pivot?.columnName}
363
+ options={groupPivotColumns.filter(
364
+ col => col !== config.table.groupBy && !(config.table.pivot?.valueColumns || []).includes(col)
365
+ )}
366
+ initial='-Select-'
367
+ section='table'
368
+ subsection='pivot'
369
+ fieldName='columnName'
370
+ updateField={updateField}
371
+ />
372
+ )}
347
373
  {config.table.pivot?.columnName && (
348
374
  <label>
349
375
  <span className='edit-label column-heading mt-1'>
@@ -0,0 +1,439 @@
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
+ }
424
+
425
+ /* Shared styles consolidated from package-specific EditorPanel.styles.css files */
426
+ /* Previously duplicated in: data-bite, filtered-text, markup-include */
427
+ .editor-panel .condition-section :is(label) {
428
+ font-size: 1em;
429
+ }
430
+
431
+ :is(span).edit-label {
432
+ margin-bottom: 0.3em;
433
+ display: block;
434
+ }
435
+
436
+ .react-tooltip {
437
+ position: absolute;
438
+ width: 250px;
439
+ }