genesys-react-components 0.3.0 → 0.3.1-devengage-1574-implementing-code-fences.220

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/build/index.js DELETED
@@ -1,631 +0,0 @@
1
- import { GenesysDevIcon, GenesysDevIcons } from 'genesys-dev-icons';
2
- import React, { useState, useEffect, useRef } from 'react';
3
- import { v4 } from 'uuid';
4
-
5
- function styleInject(css, ref) {
6
- if ( ref === void 0 ) ref = {};
7
- var insertAt = ref.insertAt;
8
-
9
- if (!css || typeof document === 'undefined') { return; }
10
-
11
- var head = document.head || document.getElementsByTagName('head')[0];
12
- var style = document.createElement('style');
13
- style.type = 'text/css';
14
-
15
- if (insertAt === 'top') {
16
- if (head.firstChild) {
17
- head.insertBefore(style, head.firstChild);
18
- } else {
19
- head.appendChild(style);
20
- }
21
- } else {
22
- head.appendChild(style);
23
- }
24
-
25
- if (style.styleSheet) {
26
- style.styleSheet.cssText = css;
27
- } else {
28
- style.appendChild(document.createTextNode(css));
29
- }
30
- }
31
-
32
- var css_248z$g = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.dx-accordion {\n margin: 0;\n}\n.dx-accordion .accordion-heading {\n border-width: 0 0 1px 0;\n border-style: solid;\n border-color: var(--theme-core-layout-border-color);\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n line-height: 14px;\n color: var(--theme-core-text-color);\n padding: 13px 20px;\n display: flex;\n flex-flow: row nowrap;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n}\n.dx-accordion .accordion-heading .icon {\n line-height: 0;\n}\n.dx-accordion .accordion-heading__left {\n align-self: left;\n}\n.dx-accordion .accordion-content {\n color: var(--theme-core-text-color);\n padding: 13px 20px 20px 20px;\n border-bottom: 1px solid var(--theme-core-layout-border-color);\n}\n.dx-accordion .accordion-content > *:first-child {\n margin-top: 0;\n}\n.dx-accordion .accordion-content > *:last-child {\n margin-bottom: 0;\n}";
33
- styleInject(css_248z$g);
34
-
35
- function DxAccordion(props) {
36
- const [isOpen, setIsOpen] = useState(props.showOpen || false);
37
- const [expandTrigger, setExpandTrigger] = useState(props.expandTrigger);
38
- const [showOpenTrigger, setShowOpenTrigger] = useState(props.showOpenTrigger);
39
- // This one forcibly opens the component
40
- React.useEffect(() => {
41
- if (props.expandTrigger !== expandTrigger) {
42
- setIsOpen(true);
43
- setExpandTrigger(props.expandTrigger);
44
- }
45
- }, [props.expandTrigger, expandTrigger]);
46
- // This one forcibly recalculates the state based on the value for props.showOpen
47
- React.useEffect(() => {
48
- if (props.showOpenTrigger !== showOpenTrigger) {
49
- setIsOpen(props.showOpen);
50
- setShowOpenTrigger(props.showOpenTrigger);
51
- }
52
- }, [props.showOpenTrigger, showOpenTrigger, props.showOpen]);
53
- React.useEffect(() => {
54
- if (props.showOpen === true || props.showOpen === false)
55
- setIsOpen(props.showOpen);
56
- }, [props.showOpen]);
57
- let style = {};
58
- if (props.headingColor)
59
- style.color = props.headingColor;
60
- let icon;
61
- if (props.headingIcon)
62
- icon = React.createElement(GenesysDevIcon, { icon: props.headingIcon, className: "heading-icon" });
63
- return (React.createElement("div", { id: props.containerId || undefined, className: `dx-accordion${props.className ? ' ' + props.className : ''}` },
64
- React.createElement("div", { className: "accordion-heading", style: style, onClick: () => setIsOpen(!isOpen) },
65
- React.createElement("span", { className: "accordion-heading__left" },
66
- icon,
67
- " ",
68
- props.title),
69
- ' ',
70
- React.createElement(GenesysDevIcon, { icon: isOpen ? GenesysDevIcons.AppChevronUp : GenesysDevIcons.AppChevronDown })),
71
- isOpen ? React.createElement("div", { className: "accordion-content" }, props.children) : undefined));
72
- }
73
-
74
- var css_248z$f = ".dx-accordion-group {\n margin: 40px 0;\n}";
75
- styleInject(css_248z$f);
76
-
77
- function DxAccordionGroup(props) {
78
- return React.createElement("div", { className: `dx-accordion-group${props.className ? ' ' + props.className : ''}` }, props.children);
79
- }
80
-
81
- var css_248z$e = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.dx-button {\n margin: 15px 10px;\n border-radius: 2px;\n padding: 8px 15px;\n cursor: pointer;\n font-weight: 500;\n}\n.dx-button-primary {\n color: var(--theme-dxbutton-primary-text-color);\n border: 1px solid var(--theme-dxbutton-primary-background-color);\n background-color: var(--theme-dxbutton-primary-background-color);\n}\n.dx-button-primary:hover {\n background-color: var(--theme-dxbutton-primary-hover-background-color);\n border-color: var(--theme-dxbutton-primary-hover-background-color);\n transition: 0.1s;\n}\n.dx-button-primary:focus {\n background-color: var(--theme-dxbutton-primary-background-color);\n border-color: var(--theme-dxbutton-primary-background-color);\n box-shadow: 0 0 0 2px var(--theme-dxbutton-primary-shadow-color);\n transition: 0.1s;\n}\n.dx-button-primary:disabled {\n background-color: var(--theme-dxbutton-primary-disabled-background-color);\n border-color: var(--theme-dxbutton-primary-disabled-background-color);\n transition: 0.1s;\n cursor: not-allowed;\n}\n.dx-button-secondary {\n background-color: var(--theme-dxbutton-secondary-background-color);\n border: 1px solid var(--theme-dxbutton-secondary-border-color);\n color: var(--theme-dxbutton-secondary-border-color);\n}\n.dx-button-secondary:hover {\n color: var(--theme-dxbutton-secondary-hover-border-color);\n border-color: var(--theme-dxbutton-secondary-border-color);\n transition: 0.1s;\n}\n.dx-button-secondary:focus {\n color: var(--theme-dxbutton-secondary-border-color);\n border-color: var(--theme-dxbutton-secondary-border-color);\n box-shadow: 0 0 0 2px var(--theme-dxbutton-secondary-shadow-color);\n transition: 0.1s;\n}\n.dx-button-secondary:disabled {\n color: var(--theme-dxbutton-secondary-disabled-text-color);\n background-color: var(--theme-dxbutton-secondary-disabled-background-color);\n border-color: var(--theme-dxbutton-secondary-disabled-background-color);\n transition: 0.1s;\n cursor: not-allowed;\n}\n.dx-button-link {\n color: var(--theme-core-link-color);\n background: transparent;\n margin: 0;\n padding: 0 2px;\n border: 0;\n}\n.dx-button-link:hover {\n color: var(--theme-core-link-hover-color);\n border-color: var(--theme-dxbutton-secondary-border-color);\n}\n.dx-button-link:disabled {\n color: #8a9a9e;\n transition: 0.1s;\n cursor: not-allowed;\n text-decoration: line-through;\n}";
82
- styleInject(css_248z$e);
83
-
84
- function DxButton(props) {
85
- let classNames = ['dx-button'];
86
- classNames.push(`dx-button-${props.type || 'primary'}`);
87
- if (props.className)
88
- classNames.push(props.className);
89
- const handleClick = (e) => {
90
- if (!props.onClick)
91
- return;
92
- e.preventDefault();
93
- e.stopPropagation();
94
- props.onClick();
95
- };
96
- return (React.createElement("button", { className: classNames.join(' '), type: "button", onClick: handleClick, disabled: props.disabled === true }, props.children));
97
- }
98
-
99
- var css_248z$d = ".dx-item-group {\n display: block;\n border: 0;\n margin: 0;\n padding: 0;\n}";
100
- styleInject(css_248z$d);
101
-
102
- var css_248z$c = "";
103
- styleInject(css_248z$c);
104
-
105
- var css_248z$b = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.dx-select-group {\n appearance: none;\n position: relative;\n}\n.dx-select-group select {\n border: 1px solid var(--theme-core-control-border-color);\n border-radius: 2px;\n background-color: var(--theme-core-control-alt-background-color);\n font-style: normal;\n font-weight: 300;\n font-size: 12px;\n line-height: 14px;\n color: var(--theme-core-control-textbox-text-color);\n padding: 8px 32px 8px 12px;\n width: 100%;\n appearance: none;\n}\n.dx-select-group select:focus-visible {\n outline: 2px solid var(--theme-core-control-focus-color);\n}\n.dx-select-group::after {\n position: absolute;\n bottom: 12px;\n right: 12px;\n content: \"\\f105\";\n font-size: 8px;\n font-family: genesys-dev-icons !important;\n font-style: normal;\n font-weight: normal !important;\n font-feature-settings: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n pointer-events: none;\n}\n.dx-select-group.disabled::after {\n color: var(--theme-core-control-disabled-text-color);\n}\n.dx-select-group.disabled select:disabled {\n background-color: var(--theme-core-control-disabled-background-color);\n border-color: var(--theme-core-control-disabled-border-color);\n color: var(--theme-core-control-disabled-text-color);\n cursor: not-allowed;\n}";
106
- styleInject(css_248z$b);
107
-
108
- var css_248z$a = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.dx-multiselect-group {\n appearance: none;\n position: relative;\n}\n.dx-multiselect-group select {\n border: 1px solid var(--theme-core-control-border-color);\n border-radius: 2px;\n background-color: var(--theme-core-control-alt-background-color);\n font-style: normal;\n font-weight: 300;\n font-size: 12px;\n line-height: 14px;\n color: var(--theme-core-control-textbox-text-color);\n width: 100%;\n appearance: none;\n scrollbar-color: #b0b2b5 transparent;\n}\n.dx-multiselect-group select:focus-visible {\n outline: 2px solid var(--theme-core-control-focus-color);\n}\n.dx-multiselect-group select option {\n overflow: hidden;\n white-space: pre;\n text-overflow: ellipsis;\n -webkit-appearance: none;\n font-style: normal;\n font-weight: 300;\n font-size: 12px;\n line-height: 31px;\n padding: 8px 12px;\n color: var(--theme-core-control-textbox-text-color);\n}\n.dx-multiselect-group select option:checked {\n color: var(--theme-core-tag-text-color);\n background-color: var(--theme-core-tag-background-color);\n}\n.dx-multiselect-group select option:disabled {\n color: #8a9a9e;\n cursor: not-allowed;\n}\n.dx-multiselect-group select::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 7px;\n height: 7px;\n}\n.dx-multiselect-group select::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: #b0b2b5;\n}\n.dx-multiselect-group select::-webkit-scrollbar-corner {\n background: transparent;\n}\n.dx-multiselect-group.disabled select:disabled {\n background-color: var(--theme-core-control-disabled-background-color);\n border-color: var(--theme-core-control-disabled-border-color);\n cursor: not-allowed;\n}\n.dx-multiselect-group.disabled select:disabled option {\n color: var(--theme-core-control-disabled-text-color);\n}";
109
- styleInject(css_248z$a);
110
-
111
- var css_248z$9 = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.dx-label {\n margin: 20px 0;\n display: block;\n}\n.dx-label .label-text,\n.dx-label .input-description {\n display: block;\n font-family: Roboto;\n font-style: normal;\n font-weight: 400;\n font-size: 12px;\n line-height: 14px;\n color: var(--theme-core-control-label-color);\n}\n.dx-label .label-text {\n margin: 0 0 4px 0;\n}\n.dx-label .input-description {\n padding: 6px 20px;\n display: flex;\n flex-flow: row nowrap;\n gap: 8px;\n}\n.dx-label .input-description .icon {\n color: var(--theme-alertblock-info-icon-color);\n line-height: 0;\n}";
112
- styleInject(css_248z$9);
113
-
114
- function DxLabel(props) {
115
- const hasLabel = props.label && props.label !== '';
116
- const description = props.description ? (React.createElement("div", { className: 'input-description' },
117
- React.createElement(GenesysDevIcon, { icon: GenesysDevIcons.AppInfoSolid }),
118
- React.createElement("span", null, props.description))) : undefined;
119
- const contents = (React.createElement(React.Fragment, null,
120
- ' ',
121
- hasLabel ? React.createElement("span", { className: 'label-text' }, props.label) : undefined,
122
- props.children,
123
- description));
124
- const className = `dx-label${props.className ? ' ' + props.className : ''}`;
125
- if (props.useFieldset) {
126
- return React.createElement("fieldset", { className: className }, contents);
127
- }
128
- return React.createElement("label", { className: className }, contents);
129
- }
130
-
131
- var css_248z$8 = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.dx-checkbox {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n margin: 15px 0;\n}\n.dx-checkbox:first-of-type {\n margin-top: 0;\n}\n.dx-checkbox .label-text {\n font-family: Roboto;\n font-style: normal;\n font-weight: normal;\n font-size: 12px;\n line-height: 18px;\n color: var(--theme-core-text-color);\n}\n.dx-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n margin: 0 8px 0 0;\n width: 16px;\n height: 16px;\n border: 1px solid var(--theme-core-control-border-color);\n border-radius: 2px;\n background-color: var(--theme-core-control-background-color);\n flex-shrink: 0;\n}\n.dx-checkbox input[type=checkbox]::before {\n display: none;\n}\n.dx-checkbox input[type=checkbox]:checked {\n background-color: var(--theme-core-control-background-color);\n}\n.dx-checkbox input[type=checkbox]:checked::before {\n display: block;\n position: relative;\n top: 7px;\n left: 3px;\n font-size: 9px;\n line-height: 0;\n color: var(--theme-core-control-punch-color);\n content: \"\\f104\";\n font-family: genesys-dev-icons !important;\n font-style: normal;\n font-weight: normal !important;\n font-feature-settings: normal;\n font-variant: normal;\n text-transform: none;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.dx-checkbox input[type=checkbox]:not(:disabled):hover {\n border-color: var(--theme-core-control-punch-color);\n}\n.dx-checkbox input[type=checkbox]:not(:disabled):focus {\n outline: var(--theme-core-control-focus-color) solid 2px;\n}\n.dx-checkbox input[type=checkbox]:not(:disabled):focus-visible {\n outline: 0;\n}\n.dx-checkbox input[type=radio] {\n -webkit-appearance: none;\n appearance: none;\n margin: 0 8px 0 0;\n width: 16px;\n height: 16px;\n border: 1px solid var(--theme-core-control-border-color);\n border-radius: 8px;\n background-color: var(--theme-core-control-background-color);\n flex-shrink: 0;\n}\n.dx-checkbox input[type=radio]::before {\n display: none;\n}\n.dx-checkbox input[type=radio]:checked::before {\n content: \"\";\n display: block;\n width: 10px;\n height: 10px;\n border-radius: 8px;\n position: relative;\n top: 2px;\n left: 2px;\n background-color: var(--theme-core-control-punch-color);\n}\n.dx-checkbox input[type=radio]:not(:disabled):hover {\n border-color: var(--theme-core-control-punch-color);\n}\n.dx-checkbox input[type=radio]:not(:disabled):focus {\n outline: var(--theme-core-control-focus-color) solid 2px;\n}\n.dx-checkbox input[type=radio]:not(:disabled):focus-visible {\n outline: 0;\n}\n.dx-checkbox.disabled {\n cursor: not-allowed;\n}\n.dx-checkbox.disabled input {\n border-color: var(--theme-core-control-disabled-border-color);\n cursor: not-allowed;\n}\n.dx-checkbox.disabled input:checked {\n background-color: var(--theme-core-control-disabled-background-color);\n cursor: not-allowed;\n}\n\n.dx-label .dx-checkbox .label-text {\n margin: 0;\n}";
132
- styleInject(css_248z$8);
133
-
134
- function DxCheckbox(props) {
135
- let initialValue = props.checked !== undefined ? props.checked : props.initiallyChecked || false;
136
- const [checked, setChecked] = useState(initialValue);
137
- useEffect(() => {
138
- if (props.checked === undefined || props.checked === checked)
139
- return;
140
- setChecked(props.checked);
141
- }, [props.checked]);
142
- useEffect(() => {
143
- if (props.onCheckChanged)
144
- props.onCheckChanged(checked);
145
- }, [checked]);
146
- return (React.createElement("label", { className: `dx-checkbox${props.className ? ' ' + props.className : ''}${props.disabled ? ' disabled' : ''}` },
147
- React.createElement("input", { type: props.useRadioType ? 'radio' : 'checkbox', name: props.name, value: props.itemValue, checked: checked, onChange: (e) => setChecked(e.target.checked), disabled: props.disabled === true }),
148
- React.createElement("span", { className: 'label-text' }, props.label)));
149
- }
150
-
151
- function DxItemGroup(props) {
152
- var _a, _b;
153
- const [data, setData] = useState(props.items.map((item) => {
154
- return { item, isSelected: item.isSelected !== undefined ? item.isSelected : false };
155
- }));
156
- const [id] = useState(v4());
157
- const [title, setTitle] = useState(props.title);
158
- const [description, setDescription] = useState(props.description);
159
- const [format, setFormat] = useState(props.format);
160
- const [disabled, setDisabled] = useState(props.disabled);
161
- const [className, setClassName] = useState(props.className);
162
- // data changed
163
- useEffect(() => {
164
- if (props.onItemsChanged)
165
- props.onItemsChanged(data);
166
- // eslint-disable-next-line react-hooks/exhaustive-deps
167
- }, [data]);
168
- // Recalculate on props changed
169
- useEffect(() => {
170
- setTitle(props.title);
171
- setDescription(props.description);
172
- setFormat(props.format);
173
- setDisabled(props.disabled);
174
- setClassName(props.className);
175
- }, [props.title, props.description, props.format, props.items, props.disabled, props.className]);
176
- useEffect(() => {
177
- setData(props.items.map((item) => {
178
- return { item, isSelected: item.isSelected !== undefined ? item.isSelected : false };
179
- }));
180
- }, [props.items]);
181
- // Handle individual item changed
182
- const itemChanged = (idx, item, checked) => {
183
- if (props.onItemChanged)
184
- props.onItemChanged(item, checked);
185
- let newData = [...data];
186
- // Unselect everything if it's radio buttons
187
- if (format === 'radio')
188
- newData.forEach((value) => (value.isSelected = false));
189
- // Set the selected state of the new item
190
- newData[idx].isSelected = checked;
191
- setData(newData);
192
- };
193
- const selectChanged = (e) => {
194
- const options = e.target.options;
195
- let newData = [...data];
196
- // Assign selected value for each item in the list
197
- for (let i = 0; i < options.length; i++) {
198
- const thisItem = newData.find((value) => value.item.value === options[i].value);
199
- thisItem.isSelected = options[i].selected;
200
- }
201
- // Update entire data list
202
- setData(newData);
203
- // Trigger individual update
204
- const changedItemIdx = newData.findIndex((value) => value.item.value === e.target.value);
205
- if (changedItemIdx >= 0)
206
- itemChanged(changedItemIdx, newData[changedItemIdx].item, newData[changedItemIdx].isSelected);
207
- };
208
- switch (format) {
209
- case 'multiselect':
210
- case 'dropdown': {
211
- const isMulti = format === 'multiselect';
212
- return (React.createElement(DxLabel, { label: title, description: description, className: className },
213
- React.createElement("div", { className: `dx-item-group${isMulti ? ' dx-multiselect-group' : ' dx-select-group'}${disabled ? ' disabled' : ''}` },
214
- React.createElement("select", { multiple: isMulti, disabled: disabled === true, onChange: (e) => selectChanged(e), value: isMulti
215
- ? (_a = data.filter((item) => item.isSelected)) === null || _a === void 0 ? void 0 : _a.map((item) => item.item.value)
216
- : (_b = data.find((item) => item.isSelected)) === null || _b === void 0 ? void 0 : _b.item.value }, data.map((d, i) => (React.createElement("option", { key: i, value: d.item.value, disabled: d.item.disabled }, d.item.label)))))));
217
- }
218
- case 'checkbox':
219
- case 'radio':
220
- default: {
221
- return (React.createElement(DxLabel, { label: title, description: description, className: `dx-item-group${disabled ? ' disabled' : ''}${className ? ' ' + className : ''}`, useFieldset: true },
222
- React.createElement("div", { onChange: (e) => {
223
- var _a;
224
- const i = data.findIndex((d) => { var _a; return d.item.value === ((_a = e.target) === null || _a === void 0 ? void 0 : _a.value); });
225
- if (i < 0)
226
- return;
227
- itemChanged(i, data[i].item, (_a = e.target) === null || _a === void 0 ? void 0 : _a.checked);
228
- } }, data.map((d, i) => (React.createElement(DxCheckbox, { key: d.item.value, name: format === 'checkbox' ? `${id}-${d.item.value}` : id, label: d.item.label, itemValue: d.item.value, checked: d.isSelected, useRadioType: format === 'radio', disabled: disabled || d.item.disabled }))))));
229
- }
230
- }
231
- }
232
-
233
- var css_248z$7 = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.dx-tabbed-content {\n margin: 40px 0;\n}\n.dx-tabbed-content .tab-titles {\n border-bottom: 1px solid var(--theme-core-layout-border-color);\n font-weight: normal;\n font-size: 14px;\n line-height: 20px;\n}\n.dx-tabbed-content .tab-titles .tab-title {\n display: inline-block;\n padding: 5px 20px;\n border-bottom: 1px solid transparent;\n cursor: pointer;\n}\n.dx-tabbed-content .tab-titles .tab-title:hover {\n border-color: var(--theme-core-control-punch-color);\n}\n.dx-tabbed-content .tab-titles .tab-title.active {\n border-bottom-color: var(--theme-core-control-punch-color);\n font-weight: bold;\n}\n.dx-tabbed-content .tab-titles .tab-title p {\n margin: 0;\n display: inline;\n}\n.dx-tabbed-content .tab-content {\n padding: 13px 20px 20px 20px;\n border-bottom: 1px solid var(--theme-core-layout-border-color);\n}\n.dx-tabbed-content .tab-content > *:first-child {\n margin-top: 0;\n}\n.dx-tabbed-content .tab-content > *:last-child {\n margin-bottom: 0;\n}";
234
- styleInject(css_248z$7);
235
-
236
- function DxTabbedContent(props) {
237
- const [activeTab, setActiveTab] = useState(props.initialTabId || 0);
238
- const [titles] = useState(
239
- // Scrape titles from child elements
240
- React.Children.toArray(props.children).map((child) => {
241
- if (!child || !child.props || !child.props.title)
242
- return 'Unknown title';
243
- return child.props.title;
244
- }));
245
- return (React.createElement("div", { className: `dx-tabbed-content${props.className ? ' ' + props.className : ''}` },
246
- React.createElement("div", { className: 'tab-titles' }, titles.map((title, i) => (React.createElement("span", { key: i, className: `tab-title${i === activeTab ? ' active' : ''}`, onClick: () => setActiveTab(i) }, title)))),
247
- React.createElement("div", { className: 'tab-content' }, React.Children.toArray(props.children)[activeTab])));
248
- }
249
-
250
- var css_248z$6 = "";
251
- styleInject(css_248z$6);
252
-
253
- function DxTabPanel(props) {
254
- return React.createElement("div", { className: `dx-tab-panel${props.className ? ' ' + props.className : ''}` }, props.children);
255
- }
256
-
257
- var css_248z$5 = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.dx-textbox {\n display: flex;\n flex-flow: row nowrap;\n justify-content: space-between;\n align-items: center;\n gap: 10px;\n border: 1px solid var(--theme-core-control-border-color);\n border-radius: 2px;\n margin: 0;\n padding: 0 10px;\n height: 32px;\n background-color: var(--theme-core-control-alt-background-color);\n}\n.dx-textbox.with-label {\n margin-top: 0;\n}\n.dx-textbox:focus-within {\n outline: #aac9ff solid 2px;\n}\n.dx-textbox .icon {\n display: block;\n flex: none;\n color: var(--theme-core-control-textbox-text-color);\n}\n.dx-textbox .icon.input-icon {\n font-size: 14px;\n line-height: 0;\n}\n.dx-textbox .icon.clear-icon {\n font-size: 11px;\n line-height: 0;\n cursor: pointer;\n padding: 4px;\n margin-right: -4px;\n}\n.dx-textbox .dx-input {\n flex-grow: 1;\n border: 0;\n background: transparent;\n box-sizing: border-box;\n height: 32px;\n width: 100%;\n padding: 0;\n margin: 0;\n font-family: Roboto;\n font-style: normal;\n font-weight: normal;\n font-size: 14px;\n line-height: 16px;\n color: var(--theme-core-control-textbox-text-color);\n}\n.dx-textbox .dx-input:focus-visible {\n outline: 0;\n}\n.dx-textbox .dx-input::placeholder {\n font-style: normal;\n font-weight: 300;\n font-size: 14px;\n line-height: 16px;\n color: var(--theme-core-control-textbox-placeholder-text-color);\n}\n.dx-textbox.disabled {\n background-color: var(--theme-dxbutton-secondary-disabled-background-color);\n cursor: not-allowed;\n}\n.dx-textbox.disabled input {\n cursor: not-allowed;\n color: var(--theme-dxbutton-secondary-disabled-text-color);\n}\n.dx-textbox.disabled .icon,\n.dx-textbox.disabled input::placeholder {\n color: var(--theme-dxbutton-secondary-disabled-text-color);\n}\n\n.dx-textarea {\n padding: 10px;\n border: 1px solid var(--theme-core-control-border-color);\n border-radius: 2px;\n width: 100%;\n font-family: \"Roboto\", sans-serif;\n box-sizing: border-box;\n background-color: var(--theme-core-control-alt-background-color);\n color: var(--theme-core-control-textbox-text-color);\n}\n.dx-textarea:focus-within {\n outline: var(--theme-core-control-focus-color) solid 2px;\n}\n.dx-textarea::placeholder {\n font-family: \"Roboto\", sans-serif;\n font-style: normal;\n font-weight: 300;\n font-size: 14px;\n line-height: 16px;\n color: var(--theme-core-control-textbox-placeholder-text-color);\n}";
258
- styleInject(css_248z$5);
259
-
260
- function DxTextbox(props) {
261
- const [debounceMs, setDebounceMs] = useState(props.changeDebounceMs || 300);
262
- const [value, setValue] = useState(props.initialValue || props.value || '');
263
- const [isFocused, setIsFocused] = useState(false);
264
- const [escapePressed, setEscapePressed] = useState(Date.now());
265
- const [step, setStep] = useState(undefined);
266
- let [timer, setTimer] = useState(undefined);
267
- // Constructor
268
- useEffect(() => {
269
- // Register global key bindings
270
- document.addEventListener('keydown', globalKeyBindings, false);
271
- return () => {
272
- document.removeEventListener('keydown', globalKeyBindings, false);
273
- };
274
- }, []);
275
- // Value prop updated
276
- useEffect(() => {
277
- // Ignore value changed if initial value was set; they're mutually exclusive
278
- if (!props.initialValue) {
279
- setValue(props.value || '');
280
- }
281
- }, [props.value]);
282
- // Escape pressed
283
- useEffect(() => {
284
- var _a;
285
- if (!isFocused || props.clearOnEscape === false)
286
- return;
287
- setValue('');
288
- (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
289
- // eslint-disable-next-line react-hooks/exhaustive-deps
290
- }, [escapePressed]);
291
- // Value changed
292
- useEffect(() => {
293
- if (props.inputType === 'decimal') {
294
- // Normalize step setting
295
- if (!isNaN(parseFloat(value))) {
296
- const match = /\.(.+)/.exec(value);
297
- console.log(match);
298
- if (match) {
299
- const s = `0.${Array.apply(null, Array(match[1].length - 1))
300
- .map(() => '0')
301
- .join('')}1`;
302
- console.log(s);
303
- setStep(s);
304
- }
305
- }
306
- }
307
- else if (props.inputType === 'integer') {
308
- // Overwrite value as integer to forcibly truncate floating point numbers
309
- setValue(parseInt(value).toString());
310
- }
311
- // Debounce onChange notification
312
- if (!props.onChange)
313
- return;
314
- clearTimeout(timer);
315
- setTimer(setTimeout(() => (props.onChange ? props.onChange(value) : undefined), debounceMs));
316
- // eslint-disable-next-line react-hooks/exhaustive-deps
317
- }, [value]);
318
- // Update state from props
319
- useEffect(() => {
320
- setDebounceMs(props.changeDebounceMs || 300);
321
- }, [props.changeDebounceMs]);
322
- // Normalize inputRef
323
- let inputRef; // = useRef<HTMLInputElement>(null);
324
- if (props.inputRef)
325
- inputRef = props.inputRef;
326
- else if (props.inputType === 'textarea')
327
- inputRef = useRef(null);
328
- else
329
- inputRef = useRef(null);
330
- const hasLabel = props.label && props.label !== '';
331
- // Global key bindings
332
- function globalKeyBindings(event) {
333
- // Escape - cancel search
334
- if (event.key === 'Escape') {
335
- event.stopPropagation();
336
- event.preventDefault();
337
- setEscapePressed(Date.now());
338
- return;
339
- }
340
- }
341
- // Normalize input type
342
- let inputType = props.inputType;
343
- if (inputType === 'integer' || inputType === 'decimal')
344
- inputType = 'number';
345
- let component;
346
- switch (inputType) {
347
- case 'textarea': {
348
- component = (React.createElement("textarea", { className: "dx-textarea", placeholder: props.placeholder, ref: inputRef, value: value, onChange: (e) => setValue(e.target.value), onFocus: () => {
349
- setIsFocused(true);
350
- if (props.onFocus)
351
- props.onFocus();
352
- }, onBlur: () => {
353
- setIsFocused(false);
354
- if (props.onBlur)
355
- props.onBlur();
356
- }, disabled: props.disabled === true, autoFocus: props.autoFocus }));
357
- break;
358
- }
359
- // TODO: special handling for other inputType values
360
- default: {
361
- component = (React.createElement("div", { className: `dx-textbox${hasLabel ? ' with-label' : ''}${props.disabled ? ' disabled' : ''}` },
362
- props.icon ? React.createElement(GenesysDevIcon, { icon: props.icon, className: "input-icon" }) : undefined,
363
- React.createElement("input", { className: "dx-input", type: inputType, step: step, value: value, placeholder: props.placeholder, onChange: (e) => setValue(e.target.value), ref: inputRef, onFocus: () => {
364
- setIsFocused(true);
365
- if (props.onFocus)
366
- props.onFocus();
367
- }, onBlur: () => {
368
- setIsFocused(false);
369
- if (props.onBlur)
370
- props.onBlur();
371
- }, disabled: props.disabled === true, autoFocus: props.autoFocus }),
372
- props.clearButton && (value || isFocused) && !props.disabled ? (React.createElement(GenesysDevIcon, { icon: GenesysDevIcons.AppTimes, className: "clear-icon", onClick: () => setValue('') })) : undefined));
373
- }
374
- }
375
- // Render
376
- return (React.createElement(DxLabel, { label: props.label, description: props.description, className: props.className }, component));
377
- }
378
-
379
- var css_248z$4 = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.dx-toggle-container {\n display: inline-block;\n}\n.dx-toggle-container .dx-toggle {\n border: 1px solid var(--theme-core-control-border-color);\n background: var(--theme-core-control-background-color);\n border-radius: 6px;\n height: 26px;\n padding: 0px 4px;\n display: flex;\n flex-flow: row nowrap;\n justify-content: space-between;\n align-items: center;\n gap: 2px;\n cursor: pointer;\n}\n.dx-toggle-container .dx-toggle:hover .slider {\n border-color: var(--theme-core-control-focus-color);\n}\n.dx-toggle-container .dx-toggle .icon {\n font-size: 10px;\n line-height: 0;\n margin: 0 5px;\n color: var(--theme-core-control-border-color);\n}\n.dx-toggle-container .dx-toggle .clear-placeholder {\n width: 19px;\n padding: 0 1px 0 0;\n margin: 0;\n display: block;\n}\n.dx-toggle-container .dx-toggle .slider {\n height: 22px;\n width: 22px;\n border-radius: 22px;\n background-color: var(--theme-core-control-punch-color);\n box-shadow: 0px 1px 2px var(--theme-core-box-shadow-color);\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid transparent;\n}\n.dx-toggle-container .dx-toggle .slider .icon {\n font-size: 10px;\n line-height: 0;\n color: var(--theme-core-control-background-color);\n padding: 0;\n margin: 0;\n}\n.dx-toggle-container.disabled .dx-toggle {\n cursor: not-allowed;\n opacity: 0.7;\n border-color: var(--theme-core-control-border-color);\n color: var(--theme-core-control-background-color);\n}\n.dx-toggle-container.disabled .dx-toggle:hover .slider {\n border-color: transparent;\n}\n.dx-toggle-container.disabled .dx-toggle .slider {\n opacity: 0.7;\n color: var(--theme-core-control-background-color);\n background-color: var(--theme-core-control-punch-color);\n}";
380
- styleInject(css_248z$4);
381
-
382
- function DxToggle(props) {
383
- let initialValue = props.value !== undefined ? props.value : props.initialValue;
384
- if (!props.isTriState)
385
- initialValue = initialValue || false;
386
- const [value, setValue] = useState(initialValue);
387
- const trueIcon = props.trueIcon || GenesysDevIcons.AppCheck;
388
- const falseIcon = props.falseIcon || GenesysDevIcons.AppTimes;
389
- useEffect(() => {
390
- if (props.initialValue || props.value === value || (!props.isTriState && props.value === undefined))
391
- return;
392
- setValue(props.value);
393
- }, [props.value]);
394
- useEffect(() => {
395
- if (props.onChange)
396
- props.onChange(value);
397
- // eslint-disable-next-line react-hooks/exhaustive-deps
398
- }, [value]);
399
- const toggleValue = () => {
400
- if (props.disabled)
401
- return;
402
- if (props.isTriState) {
403
- if (value === undefined)
404
- setValue(true);
405
- else if (value === true)
406
- setValue(false);
407
- else
408
- setValue(undefined);
409
- }
410
- else {
411
- setValue(!value);
412
- }
413
- };
414
- return (React.createElement(DxLabel, { label: props.label, description: props.description, className: props.className },
415
- React.createElement("div", { className: `dx-toggle-container${props.disabled ? ' disabled' : ''}` },
416
- React.createElement("div", { className: 'dx-toggle', onClick: toggleValue },
417
- value !== false ? React.createElement(GenesysDevIcon, { icon: falseIcon }) : undefined,
418
- value === true && props.isTriState ? React.createElement("div", { className: 'clear-placeholder' }, "\u00A0") : undefined,
419
- React.createElement("div", { className: 'slider' }, value !== undefined ? React.createElement(GenesysDevIcon, { icon: value ? trueIcon : falseIcon }) : undefined),
420
- value === false && props.isTriState ? React.createElement("div", { className: 'clear-placeholder' }, "\u00A0") : undefined,
421
- value !== true ? React.createElement(GenesysDevIcon, { icon: trueIcon }) : undefined))));
422
- }
423
-
424
- var css_248z$3 = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.alert-container {\n margin: 40px 0;\n padding: 0;\n}\n.toc-link + .alert-container {\n margin-top: 0;\n}\n.alert-container .alert {\n display: flex;\n flex-flow: row nowrap;\n gap: 20px;\n background-color: var(--theme-alertblock-default-background-color);\n border: 1px solid var(--theme-alertblock-default-border-color);\n color: var(--theme-alertblock-default-text-color);\n border-radius: 4px;\n padding: 15px 20px;\n font-size: 14px;\n line-height: 14px;\n}\n.alert-container .alert .clickable {\n cursor: pointer;\n}\n.alert-container .alert .info-icon {\n display: inline-block;\n font-size: 16px;\n line-height: 0;\n margin-top: 2px;\n color: var(--theme-alertblock-default-icon-color);\n}\n.alert-container .alert .alert-content {\n flex-grow: 1;\n font-size: 14px;\n line-height: 20px;\n margin: 0;\n}\n.alert-container .alert .alert-content .alert-title {\n font-size: 14px;\n line-height: 20px;\n font-weight: bold;\n margin-bottom: 6px;\n}\n.alert-container .alert .alert-content .alert-title.collapsed {\n margin-bottom: 0;\n}\n.alert-container .alert p:last-of-type {\n margin-bottom: 0;\n}\n.alert-container .alert.alert-info {\n color: var(--theme-alertblock-info-text-color);\n background-color: var(--theme-alertblock-info-background-color);\n border-color: var(--theme-alertblock-info-border-color);\n}\n.alert-container .alert.alert-info .icon {\n color: var(--theme-alertblock-info-icon-color);\n}\n.alert-container .alert.alert-warning {\n color: var(--theme-alertblock-warning-text-color);\n background-color: var(--theme-alertblock-warning-background-color);\n border-color: var(--theme-alertblock-warning-border-color);\n}\n.alert-container .alert.alert-warning .icon {\n color: var(--theme-alertblock-warning-icon-color);\n}\n.alert-container .alert.alert-critical {\n color: var(--theme-alertblock-critical-text-color);\n background-color: var(--theme-alertblock-critical-background-color);\n border-color: var(--theme-alertblock-critical-border-color);\n}\n.alert-container .alert.alert-critical .icon {\n color: var(--theme-alertblock-critical-icon-color);\n}\n.alert-container .alert.alert-success {\n color: var(--theme-alertblock-success-text-color);\n background-color: var(--theme-alertblock-success-background-color);\n border-color: var(--theme-alertblock-success-border-color);\n}\n.alert-container .alert.alert-success .icon {\n color: var(--theme-alertblock-success-icon-color);\n}\n.alert-container .alert.alert-toast {\n color: var(--theme-alertblock-toast-text-color);\n background-color: var(--theme-alertblock-toast-background-color);\n border-color: var(--theme-alertblock-toast-border-color);\n}\n.alert-container .alert.alert-toast .icon {\n color: var(--theme-alertblock-toast-icon-color);\n}";
425
- styleInject(css_248z$3);
426
-
427
- function AlertBlock(props) {
428
- const isCollapsible = props.collapsible === false ? false : props.collapsible || props.autoCollapse || false;
429
- const [isCollapsed, setIsCollapsed] = useState(isCollapsible ? props.autoCollapse || false : false);
430
- let title;
431
- if (props.title) {
432
- title = (React.createElement("div", { className: `alert-title${isCollapsible ? ' clickable' : ''}${isCollapsed ? ' collapsed' : ''}`, onClick: isCollapsible ? () => setIsCollapsed(!isCollapsed) : undefined }, props.title));
433
- }
434
- let icon;
435
- switch (props.alertType) {
436
- case 'info': {
437
- icon = React.createElement(GenesysDevIcon, { className: "info-icon", icon: GenesysDevIcons.AppInfoSolid });
438
- break;
439
- }
440
- case 'success': {
441
- icon = React.createElement(GenesysDevIcon, { className: "info-icon", icon: GenesysDevIcons.AppSuccessSolid });
442
- break;
443
- }
444
- case 'critical': {
445
- icon = React.createElement(GenesysDevIcon, { className: "info-icon", icon: GenesysDevIcons.AppCriticalSolid });
446
- break;
447
- }
448
- case 'warning': {
449
- icon = React.createElement(GenesysDevIcon, { className: "info-icon", icon: GenesysDevIcons.AppWarnSolid });
450
- break;
451
- }
452
- }
453
- if (icon && isCollapsible) {
454
- icon = (React.createElement("span", { className: "clickable", onClick: () => setIsCollapsed(!isCollapsed) }, icon));
455
- }
456
- //TODO: remove the card fence classes and build a proper collapser
457
- return (React.createElement("div", { className: `alert-container${props.indentation && props.indentation > 0 ? ` indent-${props.indentation}` : ''} ${props.className || ''}` },
458
- React.createElement("div", { className: `alert alert-${props.alertType}`, role: "alert" },
459
- icon,
460
- React.createElement("div", { className: "alert-content" },
461
- title,
462
- isCollapsed ? undefined : React.createElement("div", null, props.children)),
463
- isCollapsible ? (React.createElement("span", { className: "clickable", onClick: () => setIsCollapsed(!isCollapsed) },
464
- React.createElement(GenesysDevIcon, { icon: isCollapsed ? GenesysDevIcons.AppChevronDown : GenesysDevIcons.AppChevronUp }))) : undefined)));
465
- }
466
-
467
- var css_248z$2 = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.loading-placeholder {\n position: relative;\n width: 160px;\n height: 160px;\n margin: 60px auto;\n}\n.loading-placeholder .text {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n width: 100%;\n height: 100%;\n font-style: normal;\n font-weight: 300;\n font-size: 16px;\n line-height: 20px;\n color: var(--theme-loadingplaceholder-text-color);\n position: relative;\n top: 5px;\n left: 5px;\n opacity: 0.5;\n}\n.loading-placeholder div {\n position: absolute;\n border: 4px solid var(--theme-loadingplaceholder-wave-color);\n opacity: 1;\n border-radius: 50%;\n animation: loading-placeholder 1s cubic-bezier(0, 0.2, 0.8, 1) infinite;\n}\n.loading-placeholder div:nth-child(2) {\n animation-delay: -0.5s;\n}\n@keyframes loading-placeholder {\n 0% {\n top: 80px;\n left: 80px;\n width: 0;\n height: 0;\n opacity: 1;\n }\n 100% {\n top: 0px;\n left: 0px;\n width: 160px;\n height: 160px;\n opacity: 0;\n }\n}";
468
- styleInject(css_248z$2);
469
-
470
- // SimCity loading messages! https://gist.github.com/erikcox/7e96d031d00d7ecb1a2f
471
- const MESSAGES = [
472
- 'Adding Hidden Agendas',
473
- 'Adjusting Bell Curves',
474
- 'Aesthesizing Industrial Areas',
475
- 'Aligning Covariance Matrices',
476
- 'Applying Feng Shui Shaders',
477
- 'Applying Theatre Soda Layer',
478
- 'Asserting Packed Exemplars',
479
- 'Attempting to Lock Back-Buffer',
480
- 'Binding Sapling Root System',
481
- 'Building Data Trees',
482
- 'Bureacritizing Bureaucracies',
483
- 'Calculating Inverse Probability Matrices',
484
- 'Calculating Llama Expectoration Trajectory',
485
- 'Calibrating Blue Skies',
486
- 'Charging Ozone Layer',
487
- 'Coalescing Cloud Formations',
488
- 'Cohorting Exemplars',
489
- 'Collecting Meteor Particles',
490
- 'Compounding Inert Tessellations',
491
- 'Compressing Fish Files',
492
- 'Computing Optimal Bin Packing',
493
- 'Concatenating Sub-Contractors',
494
- 'Containing Existential Buffer',
495
- 'Debunching Unionized Commercial Services',
496
- 'Deciding What Message to Display Next',
497
- 'Decomposing Singular Values',
498
- 'Decrementing Tectonic Plates',
499
- 'Deleting Ferry Routes',
500
- 'Depixelating Inner Mountain Surface Back Faces',
501
- 'Deunionizing Bulldozers',
502
- 'Dicing Models',
503
- 'Diluting Livestock Nutrition Variables',
504
- 'Downloading Satellite Terrain Data',
505
- 'Exposing Flash Variables to Streak System',
506
- 'Extracting Resources',
507
- 'Flushing Pipe Network',
508
- 'Gathering Particle Sources',
509
- 'Generating Jobs',
510
- 'Gesticulating Mimes',
511
- 'Graphing Whale Migration',
512
- 'Hiding Willio Webnet Mask',
513
- 'Increasing Accuracy of RCI Simulators',
514
- 'Increasing Magmafacation',
515
- 'Initializing My Sim Tracking Mechanism',
516
- 'Initializing Robotic Click-Path AI',
517
- 'Inserting Sublimated Messages',
518
- 'Integrating Curves',
519
- 'Integrating Illumination Form Factors',
520
- 'Integrating Population Graphs',
521
- 'Iterating Cellular Automata',
522
- 'Lecturing Errant Subsystems',
523
- 'Modeling Object Components',
524
- 'Mopping Occupant Leaks',
525
- 'Normalizing Power',
526
- 'Obfuscating Quigley Matrix',
527
- 'Partitioning Singularities',
528
- 'Perturbing Matrices',
529
- 'Polishing Water Highlights',
530
- 'Populating Lot Templates',
531
- 'Preparing Sprites for Random Walks',
532
- 'Prioritizing Landmarks',
533
- 'Projecting Law Enforcement Pastry Intake',
534
- 'Realigning Alternate Time Frames',
535
- 'Relaxing Splines',
536
- 'Removing Road Network Speed Bumps',
537
- 'Removing Texture Gradients',
538
- 'Removing Vehicle Avoidance Behavior',
539
- 'Reticulating Splines',
540
- 'Retracting Phong Shader',
541
- 'Retrieving from Back Store',
542
- 'Reverse Engineering Image Consultant',
543
- 'Routing Neural Network Infanstructure',
544
- 'Scattering Rhino Food Sources',
545
- 'Scrubbing Terrain',
546
- 'Searching for Llamas',
547
- 'Seeding Architecture Simulation Parameters',
548
- 'Sequencing Particles',
549
- 'Setting Advisor Moods',
550
- 'Setting Inner Deity Indicators',
551
- 'Setting Universal Physical Constants',
552
- 'Sonically Enhancing Occupant-Free Timber',
553
- 'Speculating Stock Market Indices',
554
- 'Splatting Transforms',
555
- 'Stratifying Ground Layers',
556
- 'Sub-Sampling Water Data',
557
- 'Synthesizing Gravity',
558
- 'Synthesizing Wavelets',
559
- 'Time-Compressing Simulator Clock',
560
- 'Unable to Reveal Current Activity',
561
- ];
562
- function LoadingPlaceholder(props) {
563
- return (React.createElement("div", { className: "loading-placeholder" },
564
- React.createElement("span", { className: "text" }, props.text || MESSAGES[Math.floor(Math.random() * (MESSAGES.length - 1))]),
565
- React.createElement("div", null),
566
- React.createElement("div", null)));
567
- }
568
-
569
- var css_248z$1 = "/* Custom properties */\n:root {\n --tooltip-text-color: white;\n --tooltip-background-color: black;\n --tooltip-margin: 10px;\n --tooltip-arrow-size: 6px;\n}\n\n/* Wrapping */\n.tooltip-container {\n display: inline-block;\n position: relative;\n line-height: 0;\n /* Absolute positioning */\n}\n.tooltip-container .tooltip-tip {\n position: absolute;\n border-radius: 4px;\n left: 50%;\n transform: translateX(-50%);\n padding: 6px;\n color: var(--tooltip-text-color);\n background: var(--tooltip-background-color);\n font-size: 14px;\n line-height: 1;\n z-index: 10000;\n max-width: 300px;\n width: max-content;\n opacity: 0;\n visibility: hidden;\n transition: visibility 1.1s ease-out, opacity 1s ease-out;\n /* CSS border triangles */\n /* Absolute positioning */\n /* Absolute positioning */\n /* Absolute positioning */\n /* Absolute positioning */\n}\n.tooltip-container .tooltip-tip.visible {\n opacity: 1;\n visibility: visible;\n transition: visibility 0s, opacity 0.1s ease-in;\n}\n.tooltip-container .tooltip-tip::before {\n content: \" \";\n left: 50%;\n border: solid transparent;\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none;\n border-width: var(--tooltip-arrow-size);\n margin-left: calc(var(--tooltip-arrow-size) * -1);\n}\n.tooltip-container .tooltip-tip.top {\n bottom: 130%;\n /* CSS border triangles */\n}\n.tooltip-container .tooltip-tip.top::before {\n top: 100%;\n border-top-color: var(--tooltip-background-color);\n}\n.tooltip-container .tooltip-tip.right {\n left: calc(100% + var(--tooltip-margin));\n top: 50%;\n transform: translateX(0) translateY(-50%);\n /* CSS border triangles */\n}\n.tooltip-container .tooltip-tip.right::before {\n left: calc(var(--tooltip-arrow-size) * -1);\n top: 50%;\n transform: translateX(0) translateY(-50%);\n border-right-color: var(--tooltip-background-color);\n}\n.tooltip-container .tooltip-tip.bottom {\n top: 110%;\n /* CSS border triangles */\n}\n.tooltip-container .tooltip-tip.bottom::before {\n bottom: 100%;\n border-bottom-color: var(--tooltip-background-color);\n}\n.tooltip-container .tooltip-tip.left {\n left: auto;\n right: calc(100% + var(--tooltip-margin));\n top: 50%;\n transform: translateX(0) translateY(-50%);\n /* CSS border triangles */\n}\n.tooltip-container .tooltip-tip.left::before {\n left: auto;\n right: calc(var(--tooltip-arrow-size) * -2);\n top: 50%;\n transform: translateX(0) translateY(-50%);\n border-left-color: var(--tooltip-background-color);\n}";
570
- styleInject(css_248z$1);
571
-
572
- // Inspired by https://paladini.dev/posts/how-to-make-an-extremely-reusable-tooltip-component-with-react--and-nothing-else/
573
- function Tooltip(props) {
574
- const [isShowing, setIsShowing] = useState(false);
575
- const timeout = useRef();
576
- useEffect(() => {
577
- if (props.isShowing === undefined)
578
- return;
579
- setIsShowing(props.isShowing === true);
580
- }, [props.isShowing]);
581
- const showTip = (e) => {
582
- // Ignore mouse events from the tooltip itself
583
- if (e.target.className.includes('tooltip-tip'))
584
- return;
585
- // Ignore mouse events when manually controlled
586
- if (props.isShowing !== undefined)
587
- return;
588
- timeout.current = setTimeout(() => {
589
- setIsShowing(true);
590
- }, 100);
591
- };
592
- const hideTip = () => {
593
- if (props.isShowing !== undefined)
594
- return;
595
- if (timeout.current)
596
- clearInterval(timeout.current);
597
- setIsShowing(false);
598
- };
599
- return (React.createElement("div", { className: `tooltip-container ${props.className || ''}`, onMouseEnter: showTip, onMouseLeave: hideTip },
600
- props.children,
601
- React.createElement("div", { className: `tooltip-tip ${props.position || 'top'}${isShowing ? ' visible' : ''}` }, props.text)));
602
- }
603
-
604
- var css_248z = "/*** \n * Core colors\n ***/\n/*** \n\t* Component-specific properties \n\t***/\n/*** \n\t* Theme definitions\n\t***/\n.copy-button {\n cursor: pointer;\n border: 0;\n background: transparent;\n color: var(--theme-core-text-color);\n}";
605
- styleInject(css_248z);
606
-
607
- function CopyButton(props) {
608
- let [copyState, setCopyState] = useState(false);
609
- // Copy function will set the component state to indicate we have copied the record and then show the tool tip. With the copyState set to true we will see 'Copied'
610
- const copyCode = (e) => {
611
- e.stopPropagation();
612
- setCopyState(true);
613
- navigator.clipboard.writeText(props.copyText);
614
- return;
615
- };
616
- // Once we lose focus on the copy button, we want to set the copyState to false so that we can hide the tool tip and set the default tool tip to ''
617
- const loseFocus = () => {
618
- setCopyState(false);
619
- return;
620
- };
621
- const buttonClasses = ['copy-button'];
622
- if (props.className)
623
- buttonClasses.push(props.className);
624
- return (React.createElement(React.Fragment, null,
625
- React.createElement(Tooltip, { isShowing: copyState, text: "Copied", position: props.tooltipPosition },
626
- React.createElement("button", { type: "button", className: buttonClasses.join(' '), onClick: copyCode, onMouseOut: loseFocus },
627
- React.createElement(GenesysDevIcon, { icon: GenesysDevIcons.AppCopy })))));
628
- }
629
-
630
- export { AlertBlock, CopyButton, DxAccordion, DxAccordionGroup, DxButton, DxCheckbox, DxItemGroup, DxLabel, DxTabPanel, DxTabbedContent, DxTextbox, DxToggle, LoadingPlaceholder, Tooltip };
631
- //# sourceMappingURL=index.js.map