@teselagen/ui 0.7.36 → 0.8.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 (153) hide show
  1. package/index.cjs.js +1 -2
  2. package/index.es.js +1 -2
  3. package/package.json +1 -1
  4. package/src/AdvancedOptions.spec.js +26 -0
  5. package/src/AsyncValidateFieldSpinner/index.js +12 -0
  6. package/src/BlueprintError/index.js +14 -0
  7. package/src/BounceLoader/index.js +16 -0
  8. package/src/BounceLoader/style.css +45 -0
  9. package/src/CollapsibleCard/index.js +68 -0
  10. package/src/CollapsibleCard/style.css +23 -0
  11. package/src/DNALoader/index.js +20 -0
  12. package/src/DNALoader/style.css +251 -0
  13. package/src/DataTable/index.js +3220 -0
  14. package/src/DataTable/style.css +608 -0
  15. package/src/DataTable/utils/index.js +55 -0
  16. package/{queryParams.js → src/DataTable/utils/queryParams.js} +0 -1
  17. package/src/DialogFooter/index.js +86 -0
  18. package/src/DialogFooter/style.css +9 -0
  19. package/src/FormComponents/index.js +1266 -0
  20. package/src/FormComponents/style.css +275 -0
  21. package/src/FormComponents/utils.js +6 -0
  22. package/src/HotkeysDialog/index.js +79 -0
  23. package/src/HotkeysDialog/style.css +54 -0
  24. package/src/InfoHelper/index.js +78 -0
  25. package/src/InfoHelper/style.css +7 -0
  26. package/src/IntentText/index.js +18 -0
  27. package/src/Loading/index.js +70 -0
  28. package/src/Loading/style.css +4 -0
  29. package/src/MenuBar/index.js +423 -0
  30. package/src/MenuBar/style.css +45 -0
  31. package/src/PromptUnsavedChanges/index.js +38 -0
  32. package/src/ResizableDraggableDialog/index.js +141 -0
  33. package/src/ResizableDraggableDialog/style.css +42 -0
  34. package/src/ScrollToTop/index.js +72 -0
  35. package/src/TagSelect/index.js +69 -0
  36. package/src/TagSelect/style.css +13 -0
  37. package/src/TgHtmlSelect/index.js +20 -0
  38. package/src/TgSelect/index.js +537 -0
  39. package/src/TgSelect/style.css +61 -0
  40. package/src/TgSuggest/index.js +124 -0
  41. package/src/Timeline/index.js +15 -0
  42. package/src/enhancers/withDialog/index.js +196 -0
  43. package/src/index.js +87 -0
  44. package/src/showConfirmationDialog/index.js +148 -0
  45. package/src/style.css +265 -0
  46. package/{isBeingCalledExcessively.js → src/utils/isBeingCalledExcessively.js} +0 -2
  47. /package/{AdvancedOptions.js → src/AdvancedOptions.js} +0 -0
  48. /package/{AssignDefaultsModeContext.js → src/AssignDefaultsModeContext.js} +0 -0
  49. /package/{CellDragHandle.js → src/DataTable/CellDragHandle.js} +0 -0
  50. /package/{ColumnFilterMenu.js → src/DataTable/ColumnFilterMenu.js} +0 -0
  51. /package/{Columns.js → src/DataTable/Columns.js} +0 -0
  52. /package/{DisabledLoadingComponent.js → src/DataTable/DisabledLoadingComponent.js} +0 -0
  53. /package/{DisplayOptions.js → src/DataTable/DisplayOptions.js} +0 -0
  54. /package/{DropdownCell.js → src/DataTable/DropdownCell.js} +0 -0
  55. /package/{EditableCell.js → src/DataTable/EditableCell.js} +0 -0
  56. /package/{FilterAndSortMenu.js → src/DataTable/FilterAndSortMenu.js} +0 -0
  57. /package/{PagingTool.js → src/DataTable/PagingTool.js} +0 -0
  58. /package/{RenderCell.js → src/DataTable/RenderCell.js} +0 -0
  59. /package/{SearchBar.js → src/DataTable/SearchBar.js} +0 -0
  60. /package/{SortableColumns.js → src/DataTable/SortableColumns.js} +0 -0
  61. /package/{TableFormTrackerContext.js → src/DataTable/TableFormTrackerContext.js} +0 -0
  62. /package/{ThComponent.js → src/DataTable/ThComponent.js} +0 -0
  63. /package/{dataTableEnhancer.js → src/DataTable/dataTableEnhancer.js} +0 -0
  64. /package/{defaultFormatters.js → src/DataTable/defaultFormatters.js} +0 -0
  65. /package/{defaultValidators.js → src/DataTable/defaultValidators.js} +0 -0
  66. /package/{editCellHelper.js → src/DataTable/editCellHelper.js} +0 -0
  67. /package/{getCellVal.js → src/DataTable/getCellVal.js} +0 -0
  68. /package/{getVals.js → src/DataTable/getVals.js} +0 -0
  69. /package/{isTruthy.js → src/DataTable/isTruthy.js} +0 -0
  70. /package/{isValueEmpty.js → src/DataTable/isValueEmpty.js} +0 -0
  71. /package/{convertSchema.js → src/DataTable/utils/convertSchema.js} +0 -0
  72. /package/{formatPasteData.js → src/DataTable/utils/formatPasteData.js} +0 -0
  73. /package/{getAllRows.js → src/DataTable/utils/getAllRows.js} +0 -0
  74. /package/{getCellCopyText.js → src/DataTable/utils/getCellCopyText.js} +0 -0
  75. /package/{getCellInfo.js → src/DataTable/utils/getCellInfo.js} +0 -0
  76. /package/{getFieldPathToField.js → src/DataTable/utils/getFieldPathToField.js} +0 -0
  77. /package/{getIdOrCodeOrIndex.js → src/DataTable/utils/getIdOrCodeOrIndex.js} +0 -0
  78. /package/{getLastSelectedEntity.js → src/DataTable/utils/getLastSelectedEntity.js} +0 -0
  79. /package/{getNewEntToSelect.js → src/DataTable/utils/getNewEntToSelect.js} +0 -0
  80. /package/{getRowCopyText.js → src/DataTable/utils/getRowCopyText.js} +0 -0
  81. /package/{getTableConfigFromStorage.js → src/DataTable/utils/getTableConfigFromStorage.js} +0 -0
  82. /package/{handleCopyColumn.js → src/DataTable/utils/handleCopyColumn.js} +0 -0
  83. /package/{handleCopyHelper.js → src/DataTable/utils/handleCopyHelper.js} +0 -0
  84. /package/{handleCopyRows.js → src/DataTable/utils/handleCopyRows.js} +0 -0
  85. /package/{handleCopyTable.js → src/DataTable/utils/handleCopyTable.js} +0 -0
  86. /package/{isBottomRightCornerOfRectangle.js → src/DataTable/utils/isBottomRightCornerOfRectangle.js} +0 -0
  87. /package/{isEntityClean.js → src/DataTable/utils/isEntityClean.js} +0 -0
  88. /package/{primarySelectedValue.js → src/DataTable/utils/primarySelectedValue.js} +0 -0
  89. /package/{removeCleanRows.js → src/DataTable/utils/removeCleanRows.js} +0 -0
  90. /package/{rowClick.js → src/DataTable/utils/rowClick.js} +0 -0
  91. /package/{selection.js → src/DataTable/utils/selection.js} +0 -0
  92. /package/{useTableEntities.js → src/DataTable/utils/useTableEntities.js} +0 -0
  93. /package/{utils.js → src/DataTable/utils/utils.js} +0 -0
  94. /package/{withSelectedEntities.js → src/DataTable/utils/withSelectedEntities.js} +0 -0
  95. /package/{withTableParams.js → src/DataTable/utils/withTableParams.js} +0 -0
  96. /package/{validateTableWideErrors.js → src/DataTable/validateTableWideErrors.js} +0 -0
  97. /package/{viewColumn.js → src/DataTable/viewColumn.js} +0 -0
  98. /package/{DropdownButton.js → src/DropdownButton.js} +0 -0
  99. /package/{FillWindow.css → src/FillWindow.css} +0 -0
  100. /package/{FillWindow.js → src/FillWindow.js} +0 -0
  101. /package/{FormSeparator.js → src/FormComponents/FormSeparator.js} +0 -0
  102. /package/{LoadingDots.js → src/FormComponents/LoadingDots.js} +0 -0
  103. /package/{Uploader.js → src/FormComponents/Uploader.js} +0 -0
  104. /package/{getNewName.js → src/FormComponents/getNewName.js} +0 -0
  105. /package/{itemUpload.js → src/FormComponents/itemUpload.js} +0 -0
  106. /package/{sortify.js → src/FormComponents/sortify.js} +0 -0
  107. /package/{tryToMatchSchemas.js → src/FormComponents/tryToMatchSchemas.js} +0 -0
  108. /package/{MatchHeaders.js → src/MatchHeaders.js} +0 -0
  109. /package/{SimpleStepViz.js → src/SimpleStepViz.js} +0 -0
  110. /package/{Tag.js → src/Tag.js} +0 -0
  111. /package/{TimelineEvent.js → src/Timeline/TimelineEvent.js} +0 -0
  112. /package/{style.css → src/Timeline/style.css} +0 -0
  113. /package/{UploadCsvWizard.css → src/UploadCsvWizard.css} +0 -0
  114. /package/{UploadCsvWizard.js → src/UploadCsvWizard.js} +0 -0
  115. /package/{autoTooltip.js → src/autoTooltip.js} +0 -0
  116. /package/{constants.js → src/constants.js} +0 -0
  117. /package/{customIcons.js → src/customIcons.js} +0 -0
  118. /package/{tg_modalState.js → src/enhancers/withDialog/tg_modalState.js} +0 -0
  119. /package/{withField.js → src/enhancers/withField.js} +0 -0
  120. /package/{withFields.js → src/enhancers/withFields.js} +0 -0
  121. /package/{withLocalStorage.js → src/enhancers/withLocalStorage.js} +0 -0
  122. /package/{rerenderOnWindowResize.js → src/rerenderOnWindowResize.js} +0 -0
  123. /package/{showAppSpinner.js → src/showAppSpinner.js} +0 -0
  124. /package/{showDialogOnDocBody.js → src/showDialogOnDocBody.js} +0 -0
  125. /package/{throwFormError.js → src/throwFormError.js} +0 -0
  126. /package/{toastr.js → src/toastr.js} +0 -0
  127. /package/{typeToCommonType.js → src/typeToCommonType.js} +0 -0
  128. /package/{useDialog.js → src/useDialog.js} +0 -0
  129. /package/{adHoc.js → src/utils/adHoc.js} +0 -0
  130. /package/{basicHandleActionsWithFullState.js → src/utils/basicHandleActionsWithFullState.js} +0 -0
  131. /package/{browserUtils.js → src/utils/browserUtils.js} +0 -0
  132. /package/{combineReducersWithFullState.js → src/utils/combineReducersWithFullState.js} +0 -0
  133. /package/{commandControls.js → src/utils/commandControls.js} +0 -0
  134. /package/{commandUtils.js → src/utils/commandUtils.js} +0 -0
  135. /package/{determineBlackOrWhiteTextColor.js → src/utils/determineBlackOrWhiteTextColor.js} +0 -0
  136. /package/{getDayjsFormatter.js → src/utils/getDayjsFormatter.js} +0 -0
  137. /package/{getTextFromEl.js → src/utils/getTextFromEl.js} +0 -0
  138. /package/{handlerHelpers.js → src/utils/handlerHelpers.js} +0 -0
  139. /package/{index.js → src/utils/hooks/index.js} +0 -0
  140. /package/{useDeepEqualMemo.js → src/utils/hooks/useDeepEqualMemo.js} +0 -0
  141. /package/{useStableReference.js → src/utils/hooks/useStableReference.js} +0 -0
  142. /package/{hotkeyUtils.js → src/utils/hotkeyUtils.js} +0 -0
  143. /package/{menuUtils.js → src/utils/menuUtils.js} +0 -0
  144. /package/{popoverOverflowModifiers.js → src/utils/popoverOverflowModifiers.js} +0 -0
  145. /package/{pureNoFunc.js → src/utils/pureNoFunc.js} +0 -0
  146. /package/{renderOnDoc.js → src/utils/renderOnDoc.js} +0 -0
  147. /package/{showProgressToast.js → src/utils/showProgressToast.js} +0 -0
  148. /package/{tagUtils.js → src/utils/tagUtils.js} +0 -0
  149. /package/{tgFormValues.js → src/utils/tgFormValues.js} +0 -0
  150. /package/{useTraceUpdate.js → src/utils/useTraceUpdate.js} +0 -0
  151. /package/{withSelectTableRecords.js → src/utils/withSelectTableRecords.js} +0 -0
  152. /package/{withStore.js → src/utils/withStore.js} +0 -0
  153. /package/{wrapDialog.js → src/wrapDialog.js} +0 -0
package/index.cjs.js CHANGED
@@ -15848,7 +15848,6 @@ var itemSizeEstimator = /* @__PURE__ */ __name(function itemSizeEstimator2() {
15848
15848
  return 41.36;
15849
15849
  }, "itemSizeEstimator");
15850
15850
  var ReactTableDefaults = defaultProps;
15851
- var VIRTUALIZE_CUTOFF_LENGTH = 200;
15852
15851
  var ReactTable = function(_Methods) {
15853
15852
  _inherits$8(ReactTable2, _Methods);
15854
15853
  function ReactTable2(props) {
@@ -16434,7 +16433,7 @@ var ReactTable = function(_Methods) {
16434
16433
  minWidth: rowMinWidth + "px"
16435
16434
  })
16436
16435
  }, tBodyProps.rest),
16437
- _this2.props.noVirtual || pageRows.length < VIRTUALIZE_CUTOFF_LENGTH ? pageRows.map(function(d2, i2) {
16436
+ pageRows.length < 200 ? pageRows.map(function(d2, i2) {
16438
16437
  return makePageRow(d2, i2);
16439
16438
  }) : React.createElement(ReactList, {
16440
16439
  type: "variable",
package/index.es.js CHANGED
@@ -15830,7 +15830,6 @@ var itemSizeEstimator = /* @__PURE__ */ __name(function itemSizeEstimator2() {
15830
15830
  return 41.36;
15831
15831
  }, "itemSizeEstimator");
15832
15832
  var ReactTableDefaults = defaultProps;
15833
- var VIRTUALIZE_CUTOFF_LENGTH = 200;
15834
15833
  var ReactTable = function(_Methods) {
15835
15834
  _inherits$8(ReactTable2, _Methods);
15836
15835
  function ReactTable2(props) {
@@ -16416,7 +16415,7 @@ var ReactTable = function(_Methods) {
16416
16415
  minWidth: rowMinWidth + "px"
16417
16416
  })
16418
16417
  }, tBodyProps.rest),
16419
- _this2.props.noVirtual || pageRows.length < VIRTUALIZE_CUTOFF_LENGTH ? pageRows.map(function(d2, i2) {
16418
+ pageRows.length < 200 ? pageRows.map(function(d2, i2) {
16420
16419
  return makePageRow(d2, i2);
16421
16420
  }) : React__default.createElement(ReactList, {
16422
16421
  type: "variable",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teselagen/ui",
3
- "version": "0.7.36",
3
+ "version": "0.8.1",
4
4
  "main": "./src/index.js",
5
5
  "type": "module",
6
6
  "exports": {
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+ import { render, fireEvent } from "@testing-library/react";
3
+ import AdvancedOptions from "./AdvancedOptions";
4
+
5
+ describe("AdvancedOptions", () => {
6
+ test("renders correctly with given props and default state", () => {
7
+ const { queryByText, container } = render(
8
+ <AdvancedOptions label="Test Label" content="Test Content" />
9
+ );
10
+ expect(queryByText("Test Label")).toBeInTheDocument();
11
+ expect(queryByText("Test Content")).not.toBeInTheDocument();
12
+
13
+ expect(
14
+ container.querySelector(".bp3-icon-caret-right")
15
+ ).toBeInTheDocument();
16
+ });
17
+
18
+ test("toggles content when clicked", () => {
19
+ const { getByText, queryByText, container } = render(
20
+ <AdvancedOptions label="Test Label" content="Test Content" />
21
+ );
22
+ fireEvent.click(getByText("Test Label"));
23
+ expect(queryByText("Test Content")).toBeInTheDocument();
24
+ expect(container.querySelector(".bp3-icon-caret-down")).toBeInTheDocument();
25
+ });
26
+ });
@@ -0,0 +1,12 @@
1
+ /* Copyright (C) 2018 TeselaGen Biotechnology, Inc. */
2
+
3
+ import React from "react";
4
+ import { Spinner } from "@blueprintjs/core";
5
+
6
+ export default function AsyncValidateFieldSpinner({ validating }) {
7
+ if (validating) {
8
+ return <Spinner size="18" />;
9
+ } else {
10
+ return null;
11
+ }
12
+ }
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import { Classes } from "@blueprintjs/core";
3
+ import classNames from "classnames";
4
+
5
+ export default function BlueprintError({ error }) {
6
+ if (!error) return null;
7
+ return (
8
+ <div className={classNames(Classes.FORM_GROUP, Classes.INTENT_DANGER)}>
9
+ <div className={classNames(Classes.FORM_HELPER_TEXT, "preserve-newline")}>
10
+ {error}
11
+ </div>
12
+ </div>
13
+ );
14
+ }
@@ -0,0 +1,16 @@
1
+ /* taken from http://tobiasahlin.com/spinkit/ */
2
+ import React from "react";
3
+ import classNames from "classnames";
4
+ import "./style.css";
5
+
6
+ export function BounceLoader({ style, className }) {
7
+ return (
8
+ <div className={classNames("tg-bounce-loader", className)} style={style}>
9
+ <div className="rect1" />
10
+ <div className="rect2" />
11
+ <div className="rect3" />
12
+ <div className="rect4" />
13
+ <div className="rect5" />
14
+ </div>
15
+ );
16
+ }
@@ -0,0 +1,45 @@
1
+ .tg-bounce-loader {
2
+ width: 50px;
3
+ height: 40px;
4
+ text-align: center;
5
+ font-size: 10px;
6
+ display: flex;
7
+ align-items: center;
8
+ }
9
+
10
+ .tg-bounce-loader > div {
11
+ background-color: #006cab;
12
+ height: 100%;
13
+ max-height: 30px;
14
+ width: 6px;
15
+ display: inline-block;
16
+ margin-right: 3px;
17
+ animation: sk-stretchdelay 1.2s infinite ease-in-out;
18
+ }
19
+
20
+ .tg-bounce-loader .rect2 {
21
+ animation-delay: -1.1s;
22
+ }
23
+
24
+ .tg-bounce-loader .rect3 {
25
+ animation-delay: -1s;
26
+ }
27
+
28
+ .tg-bounce-loader .rect4 {
29
+ animation-delay: -0.9s;
30
+ }
31
+
32
+ .tg-bounce-loader .rect5 {
33
+ animation-delay: -0.8s;
34
+ }
35
+
36
+ @keyframes sk-stretchdelay {
37
+ 0%,
38
+ 40%,
39
+ 100% {
40
+ transform: scaleY(0.4);
41
+ }
42
+ 20% {
43
+ transform: scaleY(1);
44
+ }
45
+ }
@@ -0,0 +1,68 @@
1
+ import React, { useState } from "react";
2
+ import { Button, Classes, Icon } from "@blueprintjs/core";
3
+ import classNames from "classnames";
4
+ import "./style.css";
5
+
6
+ export default function CollapsibleCard({
7
+ title,
8
+ icon,
9
+ openTitleElements,
10
+ noCard = false,
11
+ className,
12
+ style,
13
+ children,
14
+ initialClosed = false,
15
+ toggle,
16
+ isOpen
17
+ }) {
18
+ let [open, setOpen] = useState(!initialClosed);
19
+ if (isOpen !== undefined) open = isOpen;
20
+
21
+ const toggleCardInfo = () => {
22
+ if (toggle) toggle();
23
+ else {
24
+ setOpen(!open);
25
+ }
26
+ };
27
+
28
+ return (
29
+ <div
30
+ className={classNames({ "tg-card": !noCard, open }, className)}
31
+ style={{
32
+ paddingTop: 10,
33
+ paddingBottom: 10,
34
+ paddingLeft: 15,
35
+ paddingRight: 15,
36
+ ...style
37
+ }}
38
+ >
39
+ <div className="tg-card-header" style={{ marginBottom: 8 }}>
40
+ <div className="tg-card-header-title">
41
+ {icon && <Icon icon={icon} />}
42
+ <h6
43
+ style={{
44
+ marginBottom: 0,
45
+ marginRight: 10,
46
+ marginLeft: 10
47
+ }}
48
+ >
49
+ {title}
50
+ </h6>
51
+ <div>{open && openTitleElements}</div>
52
+ </div>
53
+ <div>
54
+ <Button
55
+ icon={open ? "minimize" : "maximize"}
56
+ className={classNames(
57
+ Classes.MINIMAL,
58
+ "info-btn",
59
+ "tg-collapse-toggle"
60
+ )}
61
+ onClick={toggleCardInfo}
62
+ />
63
+ </div>
64
+ </div>
65
+ {open && children}
66
+ </div>
67
+ );
68
+ }
@@ -0,0 +1,23 @@
1
+ /* Use in the place of .bp3-card */
2
+ .tg-card {
3
+ padding: 20px;
4
+ margin-bottom: 20px;
5
+ border-radius: 5px;
6
+ background: white;
7
+ box-shadow:
8
+ 0 1px 3px rgba(0, 0, 0, 0.12),
9
+ 0 1px 2px rgba(0, 0, 0, 0.18);
10
+ }
11
+
12
+ .tg-card-header {
13
+ display: flex;
14
+ flex-direction: row;
15
+ justify-content: space-between;
16
+ align-items: center;
17
+ }
18
+
19
+ .tg-card-header-title {
20
+ display: flex;
21
+ flex-direction: row;
22
+ align-items: center;
23
+ }
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import classNames from "classnames";
3
+ import "./style.css";
4
+
5
+ export default function DNALoader({ style, className }) {
6
+ return (
7
+ <div className={classNames("dna-loader", className)} style={style}>
8
+ <div className="nucleobase" />
9
+ <div className="nucleobase" />
10
+ <div className="nucleobase" />
11
+ <div className="nucleobase" />
12
+ <div className="nucleobase" />
13
+ <div className="nucleobase" />
14
+ <div className="nucleobase" />
15
+ <div className="nucleobase" />
16
+ <div className="nucleobase" />
17
+ <div className="nucleobase" />
18
+ </div>
19
+ );
20
+ }
@@ -0,0 +1,251 @@
1
+ .dna-loader {
2
+ display: inline-block;
3
+ position: relative;
4
+ transform: scale(0.45);
5
+ }
6
+
7
+ .nucleobase {
8
+ display: inline-block;
9
+ position: relative;
10
+ vertical-align: middle;
11
+ }
12
+
13
+ .nucleobase:not(:last-child) {
14
+ margin-right: 4.86vh;
15
+ }
16
+
17
+ .nucleobase:before,
18
+ .nucleobase:after {
19
+ content: "";
20
+ display: inline-block;
21
+ width: 3vh;
22
+ height: 3vh;
23
+ border-radius: 50%;
24
+ position: absolute;
25
+ }
26
+
27
+ .nucleobase:nth-child(10) {
28
+ animation-delay: -1.869s;
29
+ }
30
+
31
+ .nucleobase:nth-child(10):before {
32
+ animation: animBefore 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
33
+ animation-delay: -1.869s;
34
+ background-color: #339bb9;
35
+ }
36
+
37
+ .nucleobase:nth-child(10):after {
38
+ animation: animAfter 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
39
+ animation-delay: -1.869s;
40
+ background-color: #006cab;
41
+ }
42
+
43
+ .nucleobase:nth-child(9) {
44
+ animation-delay: -3.738s;
45
+ }
46
+
47
+ .nucleobase:nth-child(9):before {
48
+ animation: animBefore 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
49
+ animation-delay: -3.738s;
50
+ background-color: #339bb9;
51
+ }
52
+
53
+ .nucleobase:nth-child(9):after {
54
+ animation: animAfter 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
55
+ animation-delay: -3.738s;
56
+ background-color: #006cab;
57
+ }
58
+
59
+ .nucleobase:nth-child(8) {
60
+ animation-delay: -5.607s;
61
+ }
62
+
63
+ .nucleobase:nth-child(8):before {
64
+ animation: animBefore 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
65
+ animation-delay: -5.607s;
66
+ background-color: #339bb9;
67
+ }
68
+
69
+ .nucleobase:nth-child(8):after {
70
+ animation: animAfter 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
71
+ animation-delay: -5.607s;
72
+ background-color: #006cab;
73
+ }
74
+
75
+ .nucleobase:nth-child(7) {
76
+ animation-delay: -7.476s;
77
+ }
78
+
79
+ .nucleobase:nth-child(7):before {
80
+ animation: animBefore 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
81
+ animation-delay: -7.476s;
82
+ background-color: #339bb9;
83
+ }
84
+
85
+ .nucleobase:nth-child(7):after {
86
+ animation: animAfter 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
87
+ animation-delay: -7.476s;
88
+ background-color: #006cab;
89
+ }
90
+
91
+ .nucleobase:nth-child(6) {
92
+ animation-delay: -9.345s;
93
+ }
94
+
95
+ .nucleobase:nth-child(6):before {
96
+ animation: animBefore 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
97
+ animation-delay: -9.345s;
98
+ background-color: #339bb9;
99
+ }
100
+
101
+ .nucleobase:nth-child(6):after {
102
+ animation: animAfter 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
103
+ animation-delay: -9.345s;
104
+ background-color: #006cab;
105
+ }
106
+
107
+ .nucleobase:nth-child(5) {
108
+ animation-delay: -11.214s;
109
+ }
110
+
111
+ .nucleobase:nth-child(5):before {
112
+ animation: animBefore 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
113
+ animation-delay: -11.214s;
114
+ background-color: #339bb9;
115
+ }
116
+
117
+ .nucleobase:nth-child(5):after {
118
+ animation: animAfter 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
119
+ animation-delay: -11.214s;
120
+ background-color: #006cab;
121
+ }
122
+
123
+ .nucleobase:nth-child(4) {
124
+ animation-delay: -13.083s;
125
+ }
126
+
127
+ .nucleobase:nth-child(4):before {
128
+ animation: animBefore 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
129
+ animation-delay: -13.083s;
130
+ background-color: #339bb9;
131
+ }
132
+
133
+ .nucleobase:nth-child(4):after {
134
+ animation: animAfter 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
135
+ animation-delay: -13.083s;
136
+ background-color: #006cab;
137
+ }
138
+
139
+ .nucleobase:nth-child(3) {
140
+ animation-delay: -14.952s;
141
+ }
142
+
143
+ .nucleobase:nth-child(3):before {
144
+ animation: animBefore 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
145
+ animation-delay: -14.952s;
146
+ background-color: #339bb9;
147
+ }
148
+
149
+ .nucleobase:nth-child(3):after {
150
+ animation: animAfter 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
151
+ animation-delay: -14.952s;
152
+ background-color: #006cab;
153
+ }
154
+
155
+ .nucleobase:nth-child(2) {
156
+ animation-delay: -16.821s;
157
+ }
158
+
159
+ .nucleobase:nth-child(2):before {
160
+ animation: animBefore 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
161
+ animation-delay: -16.821s;
162
+ background-color: #339bb9;
163
+ }
164
+
165
+ .nucleobase:nth-child(2):after {
166
+ animation: animAfter 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
167
+ animation-delay: -16.821s;
168
+ background-color: #006cab;
169
+ }
170
+
171
+ .nucleobase:nth-child(1) {
172
+ animation-delay: -18.69s;
173
+ }
174
+
175
+ .nucleobase:nth-child(1):before {
176
+ animation: animBefore 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
177
+ animation-delay: -18.69s;
178
+ background-color: #339bb9;
179
+ }
180
+
181
+ .nucleobase:nth-child(1):after {
182
+ animation: animAfter 2.1s cubic-bezier(0.42, 0, 0.58, 1) infinite;
183
+ animation-delay: -18.69s;
184
+ background-color: #006cab;
185
+ }
186
+
187
+ @keyframes animBefore {
188
+ 0% {
189
+ top: -6vh;
190
+ z-index: 1;
191
+ }
192
+ 25% {
193
+ transform: scale(1.2);
194
+ z-index: 1;
195
+ }
196
+ 50% {
197
+ top: 6vh;
198
+ z-index: -1;
199
+ }
200
+ 75% {
201
+ background-color: #5bc0de;
202
+ transform: scale(0.8);
203
+ z-index: -1;
204
+ }
205
+ 100% {
206
+ top: -6vh;
207
+ z-index: -1;
208
+ }
209
+ }
210
+
211
+ @keyframes animAfter {
212
+ 0% {
213
+ top: 6vh;
214
+ z-index: -1;
215
+ }
216
+ 25% {
217
+ background-color: #055e75;
218
+ transform: scale(0.8);
219
+ z-index: -1;
220
+ }
221
+ 50% {
222
+ top: -6vh;
223
+ z-index: 1;
224
+ }
225
+ 75% {
226
+ transform: scale(1.2);
227
+ z-index: 1;
228
+ }
229
+ 100% {
230
+ top: 6vh;
231
+ z-index: 1;
232
+ }
233
+ }
234
+
235
+ @keyframes animDotBar {
236
+ 0% {
237
+ height: 8.25vh;
238
+ }
239
+ 25% {
240
+ height: 0;
241
+ }
242
+ 50% {
243
+ height: 8.25vh;
244
+ }
245
+ 75% {
246
+ height: 0;
247
+ }
248
+ 100% {
249
+ height: 8.25vh;
250
+ }
251
+ }