Repository: Talend/ui Branch: master Commit: 4c65e81052c8 Files: 4582 Total size: 14.8 MB Directory structure: gitextract_g_x4juwx/ ├── .changeset/ │ ├── README.md │ └── config.json ├── .editorconfig ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── architecture_decision_record.md │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── actions/ │ │ ├── lint-merge-report/ │ │ │ ├── action.yml │ │ │ └── merge-lint-reports.mjs │ │ └── setup-node/ │ │ └── action.yml │ ├── copilot-instructions.md │ ├── dependabot.yml │ └── workflows/ │ ├── changeset.yml │ ├── clean-demo.yml │ ├── demo.yml │ ├── dependencies.yml │ ├── icons.yml │ ├── pr-demo.yml │ ├── pr-lint.yml │ ├── pr-test.yml │ ├── pre-release.yml │ ├── visual-testing.yml │ └── yarn-deduplicate.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .nojekyll ├── .npmignore ├── .npmrc ├── .prettierignore ├── .prettierrc.js ├── .sass-lint.yml ├── .semgrepignore ├── .tool-versions ├── .vscode/ │ └── settings.json ├── CONTRIBUTING.md ├── I18n.md ├── LICENSE ├── README.md ├── SECURITY.md ├── babel.config.js ├── dependencies-latest.txt ├── docs/ │ ├── adr-2024-04-add-support-to-esm.md │ ├── adr-composition-vs-api.md │ ├── adr-css-modules.md │ ├── adr-data-test.md │ ├── adr-dependencies.md │ └── adr-rework-talend-scripts.md ├── eslint.config.mjs ├── fork/ │ ├── bootstrap-sass/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── assets/ │ │ │ ├── images/ │ │ │ │ └── .keep │ │ │ ├── javascripts/ │ │ │ │ ├── bootstrap/ │ │ │ │ │ ├── affix.js │ │ │ │ │ ├── alert.js │ │ │ │ │ ├── button.js │ │ │ │ │ ├── carousel.js │ │ │ │ │ ├── collapse.js │ │ │ │ │ ├── dropdown.js │ │ │ │ │ ├── modal.js │ │ │ │ │ ├── popover.js │ │ │ │ │ ├── scrollspy.js │ │ │ │ │ ├── tab.js │ │ │ │ │ ├── tooltip.js │ │ │ │ │ └── transition.js │ │ │ │ ├── bootstrap-sprockets.js │ │ │ │ └── bootstrap.js │ │ │ └── stylesheets/ │ │ │ ├── _bootstrap-compass.scss │ │ │ ├── _bootstrap-mincer.scss │ │ │ ├── _bootstrap-sprockets.scss │ │ │ ├── _bootstrap.scss │ │ │ └── bootstrap/ │ │ │ ├── _alerts.scss │ │ │ ├── _badges.scss │ │ │ ├── _breadcrumbs.scss │ │ │ ├── _button-groups.scss │ │ │ ├── _buttons.scss │ │ │ ├── _carousel.scss │ │ │ ├── _close.scss │ │ │ ├── _code.scss │ │ │ ├── _component-animations.scss │ │ │ ├── _dropdowns.scss │ │ │ ├── _forms.scss │ │ │ ├── _glyphicons.scss │ │ │ ├── _grid.scss │ │ │ ├── _input-groups.scss │ │ │ ├── _jumbotron.scss │ │ │ ├── _labels.scss │ │ │ ├── _list-group.scss │ │ │ ├── _media.scss │ │ │ ├── _mixins.scss │ │ │ ├── _modals.scss │ │ │ ├── _navbar.scss │ │ │ ├── _navs.scss │ │ │ ├── _normalize.scss │ │ │ ├── _pager.scss │ │ │ ├── _pagination.scss │ │ │ ├── _panels.scss │ │ │ ├── _popovers.scss │ │ │ ├── _print.scss │ │ │ ├── _progress-bars.scss │ │ │ ├── _responsive-embed.scss │ │ │ ├── _responsive-utilities.scss │ │ │ ├── _scaffolding.scss │ │ │ ├── _tables.scss │ │ │ ├── _theme.scss │ │ │ ├── _thumbnails.scss │ │ │ ├── _tooltip.scss │ │ │ ├── _type.scss │ │ │ ├── _utilities.scss │ │ │ ├── _variables.scss │ │ │ ├── _wells.scss │ │ │ └── mixins/ │ │ │ ├── _alerts.scss │ │ │ ├── _background-variant.scss │ │ │ ├── _border-radius.scss │ │ │ ├── _buttons.scss │ │ │ ├── _center-block.scss │ │ │ ├── _clearfix.scss │ │ │ ├── _forms.scss │ │ │ ├── _gradients.scss │ │ │ ├── _grid-framework.scss │ │ │ ├── _grid.scss │ │ │ ├── _hide-text.scss │ │ │ ├── _image.scss │ │ │ ├── _labels.scss │ │ │ ├── _list-group.scss │ │ │ ├── _nav-divider.scss │ │ │ ├── _nav-vertical-align.scss │ │ │ ├── _opacity.scss │ │ │ ├── _pagination.scss │ │ │ ├── _panels.scss │ │ │ ├── _progress-bar.scss │ │ │ ├── _reset-filter.scss │ │ │ ├── _reset-text.scss │ │ │ ├── _resize.scss │ │ │ ├── _responsive-visibility.scss │ │ │ ├── _size.scss │ │ │ ├── _tab-focus.scss │ │ │ ├── _table-row.scss │ │ │ ├── _text-emphasis.scss │ │ │ ├── _text-overflow.scss │ │ │ └── _vendor-prefixes.scss │ │ ├── composer.json │ │ ├── eslint.config.mjs │ │ └── package.json │ ├── dynamic-cdn-webpack-plugin/ │ │ ├── .all-contributorsrc │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── __mocks__/ │ │ │ └── fs.js │ │ ├── eslint.config.mjs │ │ ├── index.js │ │ ├── license │ │ ├── package.json │ │ ├── readme.md │ │ ├── src/ │ │ │ ├── find.js │ │ │ ├── find.test.js │ │ │ ├── get-resolver.js │ │ │ ├── index.js │ │ │ └── resolve-pkg.js │ │ ├── test/ │ │ │ ├── core.test.js │ │ │ ├── fixtures/ │ │ │ │ ├── app/ │ │ │ │ │ ├── async.js │ │ │ │ │ ├── dir/ │ │ │ │ │ │ └── single.js │ │ │ │ │ ├── mix.js │ │ │ │ │ ├── multiple.js │ │ │ │ │ ├── no-export.js │ │ │ │ │ ├── package.json │ │ │ │ │ ├── peer-dependencies.js │ │ │ │ │ ├── require-file.js │ │ │ │ │ ├── single.js │ │ │ │ │ └── submodule.js │ │ │ │ ├── duplicate-dependencies/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── nested-dependencies/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ └── optional-peer-deps/ │ │ │ │ ├── index.js │ │ │ │ └── package.json │ │ │ ├── helpers/ │ │ │ │ ├── clean-dir.js │ │ │ │ └── run-webpack.js │ │ │ ├── html-webpack-plugin.test.js │ │ │ ├── optional-peer-dep.test.js │ │ │ └── webpack-manifest-plugin.test.js │ │ └── vitest.config.ts │ ├── json-schema-form-core/ │ │ ├── .gitignore │ │ ├── .jscsrc │ │ ├── .mocharc.json │ │ ├── .travis.yml │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── canonical-title-map.spec.js │ │ │ ├── canonical-title-map.ts │ │ │ ├── index.js │ │ │ ├── merge.js │ │ │ ├── merge.spec.js │ │ │ ├── module.spec.js │ │ │ ├── resolve.js │ │ │ ├── resolve.spec.js │ │ │ ├── schema-defaults.test.js │ │ │ ├── schema-defaults.ts │ │ │ ├── select.js │ │ │ ├── select.test.js │ │ │ ├── sf-path.test.js │ │ │ ├── sf-path.ts │ │ │ ├── traverse.test.js │ │ │ ├── traverse.ts │ │ │ ├── validate.js │ │ │ └── validate.test.js │ │ ├── talend-scripts.json │ │ ├── test.md │ │ ├── tsconfig.json │ │ ├── vitest.config.ts │ │ └── webpack.config.js │ ├── module-to-cdn/ │ │ ├── .editorconfig │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── .prettierrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── cache.js │ │ ├── eslint.config.mjs │ │ ├── index.js │ │ ├── index.test.js │ │ ├── jsonschema.json │ │ ├── license │ │ ├── meta/ │ │ │ ├── @angular/ │ │ │ │ ├── animations/ │ │ │ │ │ ├── browser/ │ │ │ │ │ │ └── meta.json │ │ │ │ │ └── meta.json │ │ │ │ ├── common/ │ │ │ │ │ ├── http/ │ │ │ │ │ │ └── meta.json │ │ │ │ │ └── meta.json │ │ │ │ ├── compiler/ │ │ │ │ │ └── meta.json │ │ │ │ ├── core/ │ │ │ │ │ └── meta.json │ │ │ │ ├── forms/ │ │ │ │ │ └── meta.json │ │ │ │ ├── http/ │ │ │ │ │ └── meta.json │ │ │ │ ├── platform-browser/ │ │ │ │ │ └── meta.json │ │ │ │ ├── platform-browser-dynamic/ │ │ │ │ │ └── meta.json │ │ │ │ ├── router/ │ │ │ │ │ └── meta.json │ │ │ │ └── upgrade/ │ │ │ │ ├── meta.json │ │ │ │ └── static/ │ │ │ │ └── meta.json │ │ │ ├── @babel/ │ │ │ │ └── polyfill/ │ │ │ │ └── meta.json │ │ │ ├── @popperjs/ │ │ │ │ └── core/ │ │ │ │ └── meta.json │ │ │ ├── @rooks/ │ │ │ │ └── use-mutation-observer/ │ │ │ │ └── meta.json │ │ │ ├── @sentry/ │ │ │ │ └── browser/ │ │ │ │ └── meta.json │ │ │ ├── aframe/ │ │ │ │ └── meta.json │ │ │ ├── ag-grid/ │ │ │ │ └── meta.json │ │ │ ├── ag-grid-community/ │ │ │ │ └── meta.json │ │ │ ├── ag-grid-enterprise/ │ │ │ │ └── meta.json │ │ │ ├── angular/ │ │ │ │ └── meta.json │ │ │ ├── auth0-lock/ │ │ │ │ └── meta.json │ │ │ ├── axios/ │ │ │ │ └── meta.json │ │ │ ├── babel-polyfill/ │ │ │ │ └── meta.json │ │ │ ├── bootstrap/ │ │ │ │ └── meta.json │ │ │ ├── classnames/ │ │ │ │ └── meta.json │ │ │ ├── core-js/ │ │ │ │ └── meta.json │ │ │ ├── d3/ │ │ │ │ └── meta.json │ │ │ ├── file-saver/ │ │ │ │ └── meta.json │ │ │ ├── focus-outline-manager/ │ │ │ │ └── meta.json │ │ │ ├── history/ │ │ │ │ └── meta.json │ │ │ ├── i18next/ │ │ │ │ └── meta.json │ │ │ ├── immutable/ │ │ │ │ └── meta.json │ │ │ ├── jquery/ │ │ │ │ └── meta.json │ │ │ ├── json-logic-js/ │ │ │ │ └── meta.json │ │ │ ├── jszip/ │ │ │ │ └── meta.json │ │ │ ├── jwt-decode/ │ │ │ │ └── meta.json │ │ │ ├── lodash/ │ │ │ │ └── meta.json │ │ │ ├── mobx/ │ │ │ │ └── meta.json │ │ │ ├── platform/ │ │ │ │ └── meta.json │ │ │ ├── popper.js/ │ │ │ │ └── meta.json │ │ │ ├── preact/ │ │ │ │ └── meta.json │ │ │ ├── preact-compat/ │ │ │ │ └── meta.json │ │ │ ├── prop-types/ │ │ │ │ └── meta.json │ │ │ ├── react/ │ │ │ │ └── meta.json │ │ │ ├── react-ace/ │ │ │ │ └── meta.json │ │ │ ├── react-autowhatever/ │ │ │ │ └── meta.json │ │ │ ├── react-bootstrap/ │ │ │ │ └── meta.json │ │ │ ├── react-css-transition/ │ │ │ │ └── meta.json │ │ │ ├── react-debounce-input/ │ │ │ │ └── meta.json │ │ │ ├── react-dnd/ │ │ │ │ └── meta.json │ │ │ ├── react-dnd-html5-backend/ │ │ │ │ └── meta.json │ │ │ ├── react-dom/ │ │ │ │ └── meta.json │ │ │ ├── react-draggable/ │ │ │ │ └── meta.json │ │ │ ├── react-hook-form/ │ │ │ │ └── meta.json │ │ │ ├── react-i18next/ │ │ │ │ └── meta.json │ │ │ ├── react-is/ │ │ │ │ └── meta.json │ │ │ ├── react-lifecycles-compat/ │ │ │ │ └── meta.json │ │ │ ├── react-popper/ │ │ │ │ └── meta.json │ │ │ ├── react-redux/ │ │ │ │ └── meta.json │ │ │ ├── react-resizable/ │ │ │ │ └── meta.json │ │ │ ├── react-router/ │ │ │ │ └── meta.json │ │ │ ├── react-router-dom/ │ │ │ │ └── meta.json │ │ │ ├── react-side-effect/ │ │ │ │ └── meta.json │ │ │ ├── react-transition-group/ │ │ │ │ └── meta.json │ │ │ ├── react-virtualized/ │ │ │ │ └── meta.json │ │ │ ├── recharts/ │ │ │ │ └── meta.json │ │ │ ├── redux/ │ │ │ │ └── meta.json │ │ │ ├── redux-act/ │ │ │ │ └── meta.json │ │ │ ├── redux-saga/ │ │ │ │ └── meta.json │ │ │ ├── redux-thunk/ │ │ │ │ └── meta.json │ │ │ ├── reflect-metadata/ │ │ │ │ └── meta.json │ │ │ ├── rx/ │ │ │ │ └── meta.json │ │ │ ├── rxjs/ │ │ │ │ └── meta.json │ │ │ ├── scroll-smooth/ │ │ │ │ └── meta.json │ │ │ ├── semantic-ui/ │ │ │ │ └── meta.json │ │ │ ├── simplebar/ │ │ │ │ └── meta.json │ │ │ ├── styled-components/ │ │ │ │ └── meta.json │ │ │ ├── tachyons/ │ │ │ │ └── meta.json │ │ │ ├── three/ │ │ │ │ └── meta.json │ │ │ ├── timezone-support/ │ │ │ │ └── meta.json │ │ │ ├── tooltip.js/ │ │ │ │ └── meta.json │ │ │ ├── uuid/ │ │ │ │ └── meta.json │ │ │ ├── vue/ │ │ │ │ └── meta.json │ │ │ └── zone.js/ │ │ │ └── meta.json │ │ ├── modules.json │ │ ├── modules.test.js │ │ ├── package.json │ │ ├── url.js │ │ ├── version.js │ │ └── vitest.config.ts │ └── react-bootstrap/ │ ├── .babelrc │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── MAINTAINING.md │ ├── README.md │ ├── eslint.config.mjs │ ├── package.json │ ├── server/ │ │ └── ModalSpec.js │ ├── src/ │ │ ├── Accordion.jsx │ │ ├── Alert.jsx │ │ ├── Alert.test.jsx │ │ ├── Badge.jsx │ │ ├── Badge.test.jsx │ │ ├── Breadcrumb.jsx │ │ ├── Breadcrumb.test.jsx │ │ ├── BreadcrumbItem.jsx │ │ ├── BreadcrumbItem.test.jsx │ │ ├── Button.jsx │ │ ├── Button.test.jsx │ │ ├── ButtonGroup.jsx │ │ ├── ButtonGroup.test.jsx │ │ ├── ButtonToolbar.jsx │ │ ├── ButtonToolbar.test.jsx │ │ ├── Carousel.jsx │ │ ├── Carousel.test.jsx │ │ ├── CarouselCaption.jsx │ │ ├── CarouselCaption.test.jsx │ │ ├── CarouselItem.jsx │ │ ├── Checkbox.jsx │ │ ├── Checkbox.test.jsx │ │ ├── Clearfix.jsx │ │ ├── Clearfix.test.jsx │ │ ├── CloseButton.jsx │ │ ├── CloseButton.test.jsx │ │ ├── Col.jsx │ │ ├── Col.test.jsx │ │ ├── Collapse.jsx │ │ ├── Collapse.test.jsx │ │ ├── ControlLabel.jsx │ │ ├── ControlLabel.test.jsx │ │ ├── Dropdown.jsx │ │ ├── Dropdown.test.jsx │ │ ├── DropdownButton.jsx │ │ ├── DropdownButton.test.jsx │ │ ├── DropdownMenu.jsx │ │ ├── DropdownMenu.test.jsx │ │ ├── DropdownToggle.jsx │ │ ├── DropdownToggle.test.jsx │ │ ├── Fade.jsx │ │ ├── Fade.test.jsx │ │ ├── Form.jsx │ │ ├── Form.test.jsx │ │ ├── FormControl.jsx │ │ ├── FormControl.test.jsx │ │ ├── FormControlFeedback.jsx │ │ ├── FormControlFeedback.test.jsx │ │ ├── FormControlStatic.jsx │ │ ├── FormControlStatic.test.jsx │ │ ├── FormGroup.jsx │ │ ├── FormGroup.test.jsx │ │ ├── Glyphicon.jsx │ │ ├── Glyphicon.test.jsx │ │ ├── Grid.jsx │ │ ├── Grid.test.jsx │ │ ├── HelpBlock.jsx │ │ ├── HelpBlock.test.jsx │ │ ├── Image.jsx │ │ ├── Image.test.jsx │ │ ├── InputGroup.jsx │ │ ├── InputGroup.test.jsx │ │ ├── InputGroupAddon.jsx │ │ ├── InputGroupButton.jsx │ │ ├── Jumbotron.jsx │ │ ├── Jumbotron.test.jsx │ │ ├── Label.jsx │ │ ├── Label.test.jsx │ │ ├── ListGroup.jsx │ │ ├── ListGroup.test.jsx │ │ ├── ListGroupItem.jsx │ │ ├── ListGroupItem.test.jsx │ │ ├── Media.jsx │ │ ├── Media.test.jsx │ │ ├── MediaBody.jsx │ │ ├── MediaBody.test.jsx │ │ ├── MediaHeading.jsx │ │ ├── MediaHeading.test.jsx │ │ ├── MediaLeft.jsx │ │ ├── MediaLeft.test.jsx │ │ ├── MediaList.jsx │ │ ├── MediaList.test.jsx │ │ ├── MediaListItem.jsx │ │ ├── MediaListItem.test.jsx │ │ ├── MediaRight.jsx │ │ ├── MediaRight.test.jsx │ │ ├── MenuItem.jsx │ │ ├── MenuItem.test.jsx │ │ ├── Modal.jsx │ │ ├── Modal.test.jsx │ │ ├── ModalBody.jsx │ │ ├── ModalBody.test.jsx │ │ ├── ModalDialog.jsx │ │ ├── ModalFooter.jsx │ │ ├── ModalFooter.test.jsx │ │ ├── ModalHeader.jsx │ │ ├── ModalHeader.test.jsx │ │ ├── ModalTitle.jsx │ │ ├── ModalTitle.test.jsx │ │ ├── Nav.jsx │ │ ├── Nav.test.jsx │ │ ├── NavDropdown.jsx │ │ ├── NavDropdown.test.jsx │ │ ├── NavItem.jsx │ │ ├── NavItem.test.jsx │ │ ├── Navbar.jsx │ │ ├── Navbar.test.jsx │ │ ├── NavbarBrand.jsx │ │ ├── NavbarBrand.test.jsx │ │ ├── NavbarCollapse.jsx │ │ ├── NavbarHeader.jsx │ │ ├── NavbarToggle.jsx │ │ ├── Overlay.jsx │ │ ├── OverlayTrigger.jsx │ │ ├── OverlayTrigger.test.jsx │ │ ├── PageHeader.jsx │ │ ├── PageHeader.test.jsx │ │ ├── PageItem.jsx │ │ ├── Pager.jsx │ │ ├── Pager.test.jsx │ │ ├── PagerItem.jsx │ │ ├── PagerItem.test.jsx │ │ ├── Pagination.jsx │ │ ├── Pagination.test.jsx │ │ ├── PaginationItem.jsx │ │ ├── Panel.jsx │ │ ├── Panel.test.jsx │ │ ├── PanelBody.jsx │ │ ├── PanelCollapse.jsx │ │ ├── PanelFooter.jsx │ │ ├── PanelGroup.jsx │ │ ├── PanelGroup.test.jsx │ │ ├── PanelHeading.jsx │ │ ├── PanelTitle.jsx │ │ ├── PanelToggle.jsx │ │ ├── Popover.jsx │ │ ├── Popover.test.jsx │ │ ├── ProgressBar.jsx │ │ ├── ProgressBar.test.jsx │ │ ├── Radio.jsx │ │ ├── Radio.test.jsx │ │ ├── ResponsiveEmbed.jsx │ │ ├── ResponsiveEmbed.test.jsx │ │ ├── Row.jsx │ │ ├── Row.test.jsx │ │ ├── SafeAnchor.jsx │ │ ├── SafeAnchor.test.jsx │ │ ├── SplitButton.jsx │ │ ├── SplitButton.test.jsx │ │ ├── SplitToggle.jsx │ │ ├── Tab.jsx │ │ ├── Tab.test.jsx │ │ ├── TabContainer.jsx │ │ ├── TabContainer.test.jsx │ │ ├── TabContent.jsx │ │ ├── TabPane.jsx │ │ ├── Table.jsx │ │ ├── Table.test.jsx │ │ ├── Tabs.jsx │ │ ├── Tabs.test.jsx │ │ ├── Thumbnail.jsx │ │ ├── Thumbnail.test.jsx │ │ ├── ToggleButton.jsx │ │ ├── ToggleButtonGroup.jsx │ │ ├── ToggleButtonGroup.test.jsx │ │ ├── Tooltip.jsx │ │ ├── Tooltip.test.jsx │ │ ├── Well.jsx │ │ ├── Well.test.jsx │ │ ├── helpers.jsx │ │ ├── index.jsx │ │ ├── test-setup.jsx │ │ └── utils/ │ │ ├── PropTypes.js │ │ ├── StyleConfig.js │ │ ├── ValidComponentChildren.js │ │ ├── bootstrapUtils.js │ │ ├── capitalize.js │ │ ├── createChainedFunction.js │ │ ├── deprecationWarning.js │ │ ├── index.js │ │ └── splitComponentProps.js │ ├── tsconfig.json │ └── vitest.config.ts ├── index.html ├── mocks/ │ └── dateMock.js ├── npm-audit/ │ └── audit.json ├── package.json ├── packages/ │ ├── a11y/ │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Gesture/ │ │ │ │ ├── constants.ts │ │ │ │ ├── focus.ts │ │ │ │ ├── index.ts │ │ │ │ ├── preventScroll.test.tsx │ │ │ │ ├── preventScroll.ts │ │ │ │ ├── propTypes.ts │ │ │ │ ├── withCalendarGesture.test.tsx │ │ │ │ ├── withCalendarGesture.tsx │ │ │ │ ├── withDynamicListGesture.test.jsx │ │ │ │ ├── withDynamicListGesture.tsx │ │ │ │ ├── withListGesture.test.jsx │ │ │ │ ├── withListGesture.tsx │ │ │ │ ├── withMonthCalendarGesture.test.tsx │ │ │ │ ├── withMonthCalendarGesture.tsx │ │ │ │ ├── withTreeGesture.test.jsx │ │ │ │ └── withTreeGesture.tsx │ │ │ ├── __mocks__/ │ │ │ │ ├── day-calendar.tsx │ │ │ │ ├── list.tsx │ │ │ │ ├── month-calendar.tsx │ │ │ │ └── tree.tsx │ │ │ ├── index.ts │ │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── assets-api/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.test.ts │ │ │ └── index.ts │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── cmf/ │ │ ├── .babelrc.json │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── 6.0-BreakingChanges.md │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── __tests__/ │ │ │ ├── App.test.jsx │ │ │ ├── Dispatcher.test.jsx │ │ │ ├── Inject.test.jsx │ │ │ ├── __snapshots__/ │ │ │ │ ├── cmfConnect.test.jsx.snap │ │ │ │ └── componentState.test.js.snap │ │ │ ├── action.test.js │ │ │ ├── actionCreator.test.js │ │ │ ├── actions/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── componentsActions.test.js.snap │ │ │ │ ├── collectionsActions.test.js │ │ │ │ ├── componentsActions.test.js │ │ │ │ ├── http.test.js │ │ │ │ ├── saga.test.js │ │ │ │ └── settingsAction.test.js │ │ │ ├── assert.test.js │ │ │ ├── bootstrap.test.jsx │ │ │ ├── cmfConnect.test.jsx │ │ │ ├── cmfModule.merge.test.jsx │ │ │ ├── cmfModule.test.js │ │ │ ├── component.test.js │ │ │ ├── componentState.test.js │ │ │ ├── constant.test.js │ │ │ ├── expression.test.jsx │ │ │ ├── expressions/ │ │ │ │ └── index.test.jsx │ │ │ ├── httpInterceptors.test.js │ │ │ ├── localStorage.test.js │ │ │ ├── matchPath.test.js │ │ │ ├── middlewares/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── http.test.js.snap │ │ │ │ ├── cmf.test.js │ │ │ │ ├── constants.test.js │ │ │ │ ├── csrfHandling.test.js │ │ │ │ ├── error.test.js │ │ │ │ └── http.test.js │ │ │ ├── omit.test.js │ │ │ ├── onError.test.jsx │ │ │ ├── onEvent.test.js │ │ │ ├── reducers/ │ │ │ │ ├── collectionsReducers.test.js │ │ │ │ ├── componentsReducers.test.js │ │ │ │ ├── index.test.js │ │ │ │ └── settingsReducers.test.js │ │ │ ├── register.test.js │ │ │ ├── registry.test.js │ │ │ ├── sagas/ │ │ │ │ ├── collection.test.js │ │ │ │ ├── component.test.js │ │ │ │ ├── http.test.js │ │ │ │ └── putActionCreator.test.js │ │ │ ├── selectors/ │ │ │ │ ├── collections.test.js │ │ │ │ ├── index.test.js │ │ │ │ └── toJS.test.js │ │ │ ├── settings.test.jsx │ │ │ └── store.test.js │ │ ├── assets/ │ │ │ ├── diagram-bootstrap.xml │ │ │ ├── diagram-cmfConnect.xml │ │ │ ├── diagram-code-orga.xml │ │ │ ├── diagram-onError-sequence.puml │ │ │ ├── diagram-react-redux-saga-rendering.xml │ │ │ └── diagram-rendering-cycle.xml │ │ ├── cmf.d.ts │ │ ├── docs/ │ │ │ ├── api.md │ │ │ ├── assets/ │ │ │ │ ├── CMF-action-diagram.txt │ │ │ │ └── CMF-bootstrap-diagram.txt │ │ │ ├── best-practices.md │ │ │ ├── core-expressions.md │ │ │ ├── core-onevent.md │ │ │ ├── core-registry.md │ │ │ ├── core-settings.md │ │ │ ├── examples.md │ │ │ ├── getting-started.md │ │ │ ├── how-to-add-a-new-page.md │ │ │ ├── how-to-connect.md │ │ │ ├── how-to-edit-doc.md │ │ │ ├── how-to-manage-collections.md │ │ │ ├── package-redux.md │ │ │ ├── package-router.md │ │ │ ├── package-saga.md │ │ │ └── what-is-cmf.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── scripts/ │ │ │ └── cmf-settings.js │ │ ├── src/ │ │ │ ├── App.jsx │ │ │ ├── App.md │ │ │ ├── Dispatcher.jsx │ │ │ ├── Dispatcher.md │ │ │ ├── Inject.component.jsx │ │ │ ├── RegistryProvider.jsx │ │ │ ├── action.js │ │ │ ├── action.md │ │ │ ├── actionCreator.js │ │ │ ├── actionCreator.md │ │ │ ├── actions/ │ │ │ │ ├── collectionsActions.js │ │ │ │ ├── componentsActions.js │ │ │ │ ├── http.js │ │ │ │ ├── index.js │ │ │ │ ├── saga.js │ │ │ │ └── settingsActions.js │ │ │ ├── api.md │ │ │ ├── assert.js │ │ │ ├── bootstrap.jsx │ │ │ ├── bootstrap.md │ │ │ ├── cmfConnect.jsx │ │ │ ├── cmfConnect.md │ │ │ ├── cmfModule.js │ │ │ ├── cmfModule.merge.jsx │ │ │ ├── component.js │ │ │ ├── componentState.js │ │ │ ├── components/ │ │ │ │ ├── ErrorBoundary/ │ │ │ │ │ ├── ErrorBoundary.component.js │ │ │ │ │ └── ErrorBoundary.component.test.jsx │ │ │ │ ├── ErrorFeedBack/ │ │ │ │ │ ├── ErrorFeedBack.component.jsx │ │ │ │ │ ├── ErrorFeedBack.component.test.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── ErrorPanel/ │ │ │ │ │ ├── ErrorPanel.component.jsx │ │ │ │ │ ├── ErrorPanel.component.test.jsx │ │ │ │ │ └── index.js │ │ │ │ └── Saga/ │ │ │ │ ├── CmfRegisteredSaga.component.js │ │ │ │ ├── CmfRegisteredSaga.component.test.jsx │ │ │ │ ├── Saga.component.js │ │ │ │ ├── Saga.component.md │ │ │ │ ├── Saga.component.test.jsx │ │ │ │ ├── Saga.saga.js │ │ │ │ ├── Saga.saga.test.js │ │ │ │ └── index.js │ │ │ ├── constant.js │ │ │ ├── deprecated.js │ │ │ ├── expression.jsx │ │ │ ├── expression.md │ │ │ ├── expressions/ │ │ │ │ ├── allOf.js │ │ │ │ ├── getInState.js │ │ │ │ ├── includes.js │ │ │ │ ├── index.js │ │ │ │ ├── index.md │ │ │ │ └── oneOf.js │ │ │ ├── httpInterceptors.js │ │ │ ├── httpInterceptors.md │ │ │ ├── index.js │ │ │ ├── localStorage.js │ │ │ ├── matchPath.js │ │ │ ├── middlewares/ │ │ │ │ ├── cmf/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── index.md │ │ │ │ ├── error/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── index.md │ │ │ │ ├── http/ │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── csrfHandling.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index.md │ │ │ │ │ └── middleware.js │ │ │ │ └── index.js │ │ │ ├── mock/ │ │ │ │ ├── collections.js │ │ │ │ ├── components.js │ │ │ │ ├── index.js │ │ │ │ ├── provider.jsx │ │ │ │ ├── rtl.jsx │ │ │ │ ├── settings.js │ │ │ │ └── store.jsx │ │ │ ├── omit.js │ │ │ ├── onError.js │ │ │ ├── onError.md │ │ │ ├── onEvent.js │ │ │ ├── onEvent.md │ │ │ ├── reducers/ │ │ │ │ ├── collectionsReducers.js │ │ │ │ ├── componentsReducers.js │ │ │ │ ├── index.js │ │ │ │ └── settingsReducers.js │ │ │ ├── register.js │ │ │ ├── registry.js │ │ │ ├── registry.md │ │ │ ├── sagas/ │ │ │ │ ├── collection.js │ │ │ │ ├── component.js │ │ │ │ ├── http.js │ │ │ │ ├── index.js │ │ │ │ ├── index.md │ │ │ │ └── putActionCreator.js │ │ │ ├── selectors/ │ │ │ │ ├── collections.js │ │ │ │ ├── collections.md │ │ │ │ ├── index.js │ │ │ │ ├── index.md │ │ │ │ ├── toJS.js │ │ │ │ └── toJS.md │ │ │ ├── settings.jsx │ │ │ ├── settings.md │ │ │ ├── store.js │ │ │ ├── store.md │ │ │ ├── test-setup.ts │ │ │ └── useContext.js │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── cmf-cqrs/ │ │ ├── .babelrc.json │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── docs.json │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── actions/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── ack.test.js.snap │ │ │ │ ├── ack.js │ │ │ │ ├── ack.test.js │ │ │ │ └── index.js │ │ │ ├── components/ │ │ │ │ └── ACKDispatcher/ │ │ │ │ ├── ACKDispatcher.connect.js │ │ │ │ ├── ACKDispatcher.container.js │ │ │ │ ├── ACKDispatcher.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ACKDispatcher.test.js.snap │ │ │ │ │ └── ACKDispatcher.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── constants/ │ │ │ │ ├── ack.js │ │ │ │ ├── index.js │ │ │ │ ├── socketMiddleware.js │ │ │ │ └── status.js │ │ │ ├── index.test.js │ │ │ ├── index.ts │ │ │ ├── middleware/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── socketMiddleware.test.js.snap │ │ │ │ ├── index.js │ │ │ │ ├── smartWebsocket.js │ │ │ │ ├── smartWebsocket.test.js │ │ │ │ ├── socketMiddleware.js │ │ │ │ └── socketMiddleware.test.js │ │ │ ├── reducers/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── ack.test.js.snap │ │ │ │ ├── ack.js │ │ │ │ ├── ack.test.js │ │ │ │ └── index.js │ │ │ ├── registry.js │ │ │ ├── sagas/ │ │ │ │ ├── ack.js │ │ │ │ ├── ack.test.js │ │ │ │ └── index.js │ │ │ ├── test-setup.ts │ │ │ ├── useWebSocket.hook.test.ts │ │ │ └── useWebSocket.hook.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── cmf-router/ │ │ ├── .babelrc.json │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── UIRouter.jsx │ │ │ ├── constant.js │ │ │ ├── expressions.js │ │ │ ├── expressions.md │ │ │ ├── expressions.test.js │ │ │ ├── history.js │ │ │ ├── index.jsx │ │ │ ├── index.test.js │ │ │ ├── middleware.js │ │ │ ├── middleware.md │ │ │ ├── middleware.test.js │ │ │ ├── sagaRouter.js │ │ │ ├── sagaRouter.md │ │ │ ├── sagaRouter.test.js │ │ │ ├── sagas/ │ │ │ │ ├── documentTitle.js │ │ │ │ └── documentTitle.test.js │ │ │ ├── selectors.js │ │ │ └── selectors.test.js │ │ ├── talend-scripts.json │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── components/ │ │ ├── .babelrc.json │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .sass-lint.yml │ │ ├── .storybook/ │ │ │ ├── main.ts │ │ │ ├── preview-head.html │ │ │ └── preview.ts │ │ ├── 6.0 - breaking changes.md │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── __mocks__/ │ │ │ ├── day-calendar.jsx │ │ │ ├── list.jsx │ │ │ └── month-calendar.jsx │ │ ├── custom.d.ts │ │ ├── eslint.config.mjs │ │ ├── i18next-scanner.config.js │ │ ├── package.json │ │ ├── screenshots.config.json │ │ ├── src/ │ │ │ ├── AboutDialog/ │ │ │ │ ├── AboutDialog.component.jsx │ │ │ │ ├── AboutDialog.module.css │ │ │ │ ├── AboutDialog.test.jsx │ │ │ │ ├── AboutDialogTable.component.jsx │ │ │ │ ├── AboutModal.stories.jsx │ │ │ │ └── index.js │ │ │ ├── ActionBar/ │ │ │ │ ├── ActionBar.component.jsx │ │ │ │ ├── ActionBar.module.css │ │ │ │ ├── ActionBar.stories.jsx │ │ │ │ ├── ActionBar.test.jsx │ │ │ │ └── index.js │ │ │ ├── ActionIntercom/ │ │ │ │ ├── Intercom.component.jsx │ │ │ │ ├── Intercom.component.test.jsx │ │ │ │ ├── Intercom.module.css │ │ │ │ ├── Intercom.service.jsx │ │ │ │ ├── Intercom.service.test.jsx │ │ │ │ ├── Intercom.stories.jsx │ │ │ │ └── index.js │ │ │ ├── ActionList/ │ │ │ │ ├── ActionList.component.jsx │ │ │ │ ├── ActionList.module.css │ │ │ │ ├── ActionList.stories.jsx │ │ │ │ ├── ActionList.test.jsx │ │ │ │ └── index.js │ │ │ ├── Actions/ │ │ │ │ ├── Action/ │ │ │ │ │ ├── Action.component.jsx │ │ │ │ │ ├── Action.test.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── ActionButton/ │ │ │ │ │ ├── ActionButton.component.jsx │ │ │ │ │ ├── ActionButton.module.css │ │ │ │ │ ├── ActionButton.test.jsx │ │ │ │ │ ├── Button.stories.jsx │ │ │ │ │ ├── Button.stories.module.css │ │ │ │ │ └── index.js │ │ │ │ ├── ActionDropdown/ │ │ │ │ │ ├── ActionDropdown.component.jsx │ │ │ │ │ ├── ActionDropdown.component.md │ │ │ │ │ ├── ActionDropdown.module.css │ │ │ │ │ ├── ActionDropdown.snapshot.test.jsx │ │ │ │ │ ├── ActionDropdown.test.jsx │ │ │ │ │ ├── Dropdown.stories.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── ActionFile/ │ │ │ │ │ ├── ActionFile.component.jsx │ │ │ │ │ ├── ActionFile.module.css │ │ │ │ │ ├── ActionFile.test.jsx │ │ │ │ │ ├── File.stories.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── ActionIconToggle/ │ │ │ │ │ ├── ActionIconToggle.component.jsx │ │ │ │ │ ├── ActionIconToggle.component.test.jsx │ │ │ │ │ ├── ActionIconToggle.module.css │ │ │ │ │ ├── IconToggle.stories.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── ActionSplitDropdown/ │ │ │ │ │ ├── ActionSplitDropdown.component.jsx │ │ │ │ │ ├── ActionSplitDropdown.module.css │ │ │ │ │ ├── ActionSplitDropdown.test.jsx │ │ │ │ │ ├── SplitDropdown.stories.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── Actions.component.jsx │ │ │ │ ├── Actions.test.jsx │ │ │ │ ├── ButtonGroup.stories.jsx │ │ │ │ ├── index.js │ │ │ │ ├── wrapOnClick.js │ │ │ │ └── wrapOnClick.test.js │ │ │ ├── AppGuidedTour/ │ │ │ │ ├── AppGuidedTour.component.jsx │ │ │ │ ├── AppGuidedTour.stories.jsx │ │ │ │ ├── AppGuidedTour.test.jsx │ │ │ │ ├── DemoContentStep.component.jsx │ │ │ │ ├── DemoContentStep.component.test.jsx │ │ │ │ ├── DemoContentStep.module.css │ │ │ │ └── index.js │ │ │ ├── AppLoader/ │ │ │ │ ├── AppLoader.component.jsx │ │ │ │ ├── AppLoader.md │ │ │ │ ├── AppLoader.stories.jsx │ │ │ │ ├── AppLoader.test.jsx │ │ │ │ ├── constant.js │ │ │ │ └── index.js │ │ │ ├── AppSwitcher/ │ │ │ │ ├── AppSwitcher.component.jsx │ │ │ │ ├── AppSwitcher.component.test.jsx │ │ │ │ ├── AppSwitcher.module.css │ │ │ │ └── index.js │ │ │ ├── Badge/ │ │ │ │ ├── Badge.component.jsx │ │ │ │ ├── Badge.component.test.jsx │ │ │ │ ├── Badge.module.css │ │ │ │ ├── Badge.stories.jsx │ │ │ │ ├── BadgeComposition/ │ │ │ │ │ ├── BadgeCategory/ │ │ │ │ │ │ ├── BadgeCategory.component.jsx │ │ │ │ │ │ ├── BadgeCategory.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgeDelete/ │ │ │ │ │ │ ├── BadgeDelete.component.jsx │ │ │ │ │ │ ├── BadgeDelete.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgeDropdown/ │ │ │ │ │ │ ├── BadgeDropdown.component.jsx │ │ │ │ │ │ ├── BadgeDropdown.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgeIcon/ │ │ │ │ │ │ ├── BadgeIcon.component.jsx │ │ │ │ │ │ ├── BadgeIcon.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── BadgeIcon.component.test.js.snap │ │ │ │ │ │ │ └── BadgeIcon.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgeLabel/ │ │ │ │ │ │ ├── BadgeLabel.component.jsx │ │ │ │ │ │ ├── BadgeLabel.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgeSeparator/ │ │ │ │ │ │ ├── BadgeSeparator.component.jsx │ │ │ │ │ │ ├── BadgeSeparator.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── BadgeSeparator.component.test.js.snap │ │ │ │ │ │ │ └── BadgeSeparator.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── Breadcrumbs/ │ │ │ │ ├── Breadcrumbs.component.jsx │ │ │ │ ├── Breadcrumbs.module.css │ │ │ │ ├── Breadcrumbs.snapshot.test.jsx │ │ │ │ ├── Breadcrumbs.stories.jsx │ │ │ │ ├── Breadcrumbs.test.jsx │ │ │ │ └── index.js │ │ │ ├── Checkbox/ │ │ │ │ ├── Checkbox.jsx │ │ │ │ ├── Checkbox.stories.jsx │ │ │ │ └── index.js │ │ │ ├── CircularProgress/ │ │ │ │ ├── CircularProgress.component.jsx │ │ │ │ ├── CircularProgress.module.css │ │ │ │ ├── CircularProgress.test.jsx │ │ │ │ ├── Spinner.stories.jsx │ │ │ │ └── index.js │ │ │ ├── CollapsiblePanel/ │ │ │ │ ├── CollapsiblePanel.component.jsx │ │ │ │ ├── CollapsiblePanel.module.css │ │ │ │ ├── CollapsiblePanel.snapshot.test.jsx │ │ │ │ ├── CollapsiblePanel.stories.jsx │ │ │ │ ├── CollapsiblePanel.test.jsx │ │ │ │ └── index.js │ │ │ ├── ConfirmDialog/ │ │ │ │ ├── ConfirmDialog.component.jsx │ │ │ │ ├── ConfirmDialog.stories.jsx │ │ │ │ ├── ConfirmDialog.test.jsx │ │ │ │ └── index.js │ │ │ ├── DataViewer/ │ │ │ │ ├── Badges/ │ │ │ │ │ ├── LengthBadge/ │ │ │ │ │ │ ├── LengthBadge.component.jsx │ │ │ │ │ │ ├── LengthBadge.module.css │ │ │ │ │ │ ├── LengthBadge.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── LengthBadge.test.js.snap │ │ │ │ │ │ │ └── LengthBadge.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── Core/ │ │ │ │ │ ├── Tree/ │ │ │ │ │ │ ├── Tree.component.jsx │ │ │ │ │ │ ├── Tree.module.css │ │ │ │ │ │ ├── Tree.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── TreeNode/ │ │ │ │ │ │ ├── TreeNode.component.js │ │ │ │ │ │ ├── TreeNode.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── TreeNodeList/ │ │ │ │ │ │ ├── TreeNodeList.component.jsx │ │ │ │ │ │ ├── TreeNodeList.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── DataViewer.stories.jsx │ │ │ │ ├── Headers/ │ │ │ │ │ ├── TreeHeader/ │ │ │ │ │ │ ├── TreeHeader.component.jsx │ │ │ │ │ │ ├── TreeHeader.module.css │ │ │ │ │ │ ├── TreeHeader.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── TreeHeader.test.js.snap │ │ │ │ │ │ │ └── TreeHeader.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── Icons/ │ │ │ │ │ ├── TreeBranchIcon/ │ │ │ │ │ │ ├── TreeBranchIcon.component.jsx │ │ │ │ │ │ ├── TreeBranchIcon.module.css │ │ │ │ │ │ ├── TreeBranchIcon.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── Managers/ │ │ │ │ │ ├── TreeManager/ │ │ │ │ │ │ ├── TreeManager.container.js │ │ │ │ │ │ ├── TreeManager.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── ModelViewer/ │ │ │ │ │ ├── Branch/ │ │ │ │ │ │ ├── ModelViewerBranch.component.jsx │ │ │ │ │ │ ├── ModelViewerBranch.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Leaf/ │ │ │ │ │ │ ├── ModelViewerLeaf.component.jsx │ │ │ │ │ │ ├── ModelViewerLeaf.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── ModelViewerLeaf.test.js.snap │ │ │ │ │ │ │ └── ModelViewerLeaf.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── ModelViewer.component.jsx │ │ │ │ │ ├── ModelViewer.component.test.jsx │ │ │ │ │ ├── ModelViewer.container.jsx │ │ │ │ │ ├── ModelViewer.container.test.jsx │ │ │ │ │ ├── ModelViewer.module.css │ │ │ │ │ ├── ModelViewer.parser.test.js │ │ │ │ │ ├── README.md │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── ModelViewer.component.test.js.snap │ │ │ │ │ │ ├── ModelViewer.component.test.jsx.snap │ │ │ │ │ │ ├── ModelViewer.container.test.js.snap │ │ │ │ │ │ └── ModelViewer.container.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── RecordsViewer/ │ │ │ │ │ ├── Branch/ │ │ │ │ │ │ ├── RecordsViewerBranch.component.jsx │ │ │ │ │ │ ├── RecordsViewerBranch.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── RecordsViewerBranch.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── CellRenderer/ │ │ │ │ │ │ ├── RecordsCellRenderer.component.jsx │ │ │ │ │ │ ├── RecordsCellRenderer.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── RecordsCellRenderer.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Leaf/ │ │ │ │ │ │ ├── RecordsViewerLeaf.component.jsx │ │ │ │ │ │ ├── RecordsViewerLeaf.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── RecordsViewerLeaf.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── README.md │ │ │ │ │ ├── RecordsViewer.component.jsx │ │ │ │ │ ├── RecordsViewer.component.test.jsx │ │ │ │ │ ├── RecordsViewer.container.jsx │ │ │ │ │ ├── RecordsViewer.container.test.jsx │ │ │ │ │ ├── RecordsViewer.module.css │ │ │ │ │ ├── RecordsViewer.parser.js │ │ │ │ │ ├── RecordsViewer.parser.test.js │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── RecordsViewer.component.test.jsx.snap │ │ │ │ │ │ ├── RecordsViewer.container.test.js.snap │ │ │ │ │ │ └── RecordsViewer.container.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── Text/ │ │ │ │ │ ├── SimpleTextKeyValue/ │ │ │ │ │ │ ├── DefaultValueRenderer.component.jsx │ │ │ │ │ │ ├── DefaultValueRenderer.module.css │ │ │ │ │ │ ├── DefaultValueRenderer.test.jsx │ │ │ │ │ │ ├── SimpleTextKeyValue.component.jsx │ │ │ │ │ │ ├── SimpleTextKeyValue.module.css │ │ │ │ │ │ ├── SimpleTextKeyValue.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── SimpleTextKeyValue.test.js.snap │ │ │ │ │ │ │ └── SimpleTextKeyValue.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── Virtualized/ │ │ │ │ │ ├── TreeCellMeasurer/ │ │ │ │ │ │ ├── TreeCellMeasurer.component.jsx │ │ │ │ │ │ ├── TreeCellMeasurer.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── TreeCellMeasurer.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── VirtualizedTree/ │ │ │ │ │ │ ├── VirtualizedTree.component.jsx │ │ │ │ │ │ ├── VirtualizedTree.module.css │ │ │ │ │ │ ├── VirtualizedTree.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── VirtualizedTree.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── index.js │ │ │ │ ├── jsonPath.js │ │ │ │ ├── jsonPath.test.js │ │ │ │ ├── sample.raw.json │ │ │ │ └── theme.module.css │ │ │ ├── Datalist/ │ │ │ │ ├── Datalist.component.jsx │ │ │ │ ├── Datalist.component.test.jsx │ │ │ │ ├── Datalist.module.css │ │ │ │ ├── Datalist.stories.jsx │ │ │ │ └── index.js │ │ │ ├── DateTimePickers/ │ │ │ │ ├── Date/ │ │ │ │ │ ├── Context.js │ │ │ │ │ ├── Input/ │ │ │ │ │ │ ├── Input.component.jsx │ │ │ │ │ │ ├── Input.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Manager/ │ │ │ │ │ │ ├── Manager.component.jsx │ │ │ │ │ │ ├── Manager.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Picker/ │ │ │ │ │ │ ├── Picker.component.jsx │ │ │ │ │ │ ├── Picker.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── date-extraction.js │ │ │ │ │ ├── date-extraction.test.js │ │ │ │ │ └── index.js │ │ │ │ ├── DateRange/ │ │ │ │ │ ├── Context.js │ │ │ │ │ ├── Input/ │ │ │ │ │ │ ├── Input.component.jsx │ │ │ │ │ │ ├── Input.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Manager/ │ │ │ │ │ │ ├── Manager.component.jsx │ │ │ │ │ │ ├── Manager.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Picker/ │ │ │ │ │ │ ├── Picker.component.jsx │ │ │ │ │ │ ├── Picker.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Picker.component.test.js.snap │ │ │ │ │ │ │ └── Picker.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── constants.js │ │ │ │ │ └── index.js │ │ │ │ ├── DateTime/ │ │ │ │ │ ├── Context.js │ │ │ │ │ ├── Manager/ │ │ │ │ │ │ ├── Manager.component.jsx │ │ │ │ │ │ ├── Manager.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── datetime-extraction.js │ │ │ │ │ ├── datetime-extraction.test.js │ │ │ │ │ └── index.js │ │ │ │ ├── DateTimeRange/ │ │ │ │ │ ├── Context.js │ │ │ │ │ ├── Manager/ │ │ │ │ │ │ ├── Manager.component.jsx │ │ │ │ │ │ ├── Manager.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── InputDatePicker/ │ │ │ │ │ ├── DatePicker.stories.jsx │ │ │ │ │ ├── InputDatePicker.component.jsx │ │ │ │ │ ├── InputDatePicker.module.css │ │ │ │ │ └── index.js │ │ │ │ ├── InputDateRangePicker/ │ │ │ │ │ ├── DateRangePicker.stories.jsx │ │ │ │ │ ├── InputDateRangePicker.component.jsx │ │ │ │ │ ├── InputDateRangePicker.module.css │ │ │ │ │ ├── README.md │ │ │ │ │ └── index.js │ │ │ │ ├── InputDateTimePicker/ │ │ │ │ │ ├── DateTimePicker.stories.jsx │ │ │ │ │ ├── InputDateTimePicker.component.jsx │ │ │ │ │ ├── InputDateTimePicker.component.test.jsx │ │ │ │ │ ├── InputDateTimePicker.module.css │ │ │ │ │ ├── README.md │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── InputDateTimePicker.component.test.js.snap │ │ │ │ │ │ └── InputDateTimePicker.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── InputDateTimeRangePicker/ │ │ │ │ │ ├── DateTimeRangePicker.stories.jsx │ │ │ │ │ ├── InputDateTimeRangePicker.component.jsx │ │ │ │ │ ├── InputDateTimeRangePicker.component.test.jsx │ │ │ │ │ ├── InputDateTimeRangePicker.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── InputDateTimeRangePicker.component.test.js.snap │ │ │ │ │ │ └── InputDateTimeRangePicker.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── InputTimePicker/ │ │ │ │ │ ├── InputTimePicker.component.jsx │ │ │ │ │ ├── InputTimePicker.component.test.jsx │ │ │ │ │ ├── InputTimePicker.module.css │ │ │ │ │ ├── TimePicker.stories.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── LegacyDateTimePickers/ │ │ │ │ │ ├── DateTime/ │ │ │ │ │ │ ├── Context.js │ │ │ │ │ │ ├── Input/ │ │ │ │ │ │ │ ├── Input.component.jsx │ │ │ │ │ │ │ ├── Input.component.test.jsx │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── Manager/ │ │ │ │ │ │ │ ├── Manager.component.jsx │ │ │ │ │ │ │ ├── Manager.component.test.jsx │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── Picker/ │ │ │ │ │ │ │ ├── Picker.component.jsx │ │ │ │ │ │ │ ├── Picker.component.test.jsx │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── Validation/ │ │ │ │ │ │ │ ├── Error.component.test.tsx │ │ │ │ │ │ │ ├── Error.component.tsx │ │ │ │ │ │ │ ├── Validation.component.jsx │ │ │ │ │ │ │ ├── Validation.component.test.jsx │ │ │ │ │ │ │ ├── Validation.module.css │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ ├── date-extraction.js │ │ │ │ │ │ ├── date-extraction.test.js │ │ │ │ │ │ ├── error-messages.js │ │ │ │ │ │ ├── error-messages.test.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── InputDateTimePicker/ │ │ │ │ │ │ ├── InputDateTimePicker.component.jsx │ │ │ │ │ │ ├── InputDateTimePicker.component.test.jsx │ │ │ │ │ │ ├── InputDateTimePicker.module.css │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── LegacyDateTimePicker.stories.jsx │ │ │ │ │ ├── README.md │ │ │ │ │ ├── generator.js │ │ │ │ │ ├── generator.test.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── pickers/ │ │ │ │ │ │ ├── DatePicker/ │ │ │ │ │ │ │ ├── DatePicker.component.jsx │ │ │ │ │ │ │ ├── DatePicker.module.css │ │ │ │ │ │ │ ├── DatePicker.test.jsx │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ ├── DatePicker.test.js.snap │ │ │ │ │ │ │ │ └── DatePicker.test.jsx.snap │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── DateTimePicker/ │ │ │ │ │ │ │ ├── DateTimePicker.component.jsx │ │ │ │ │ │ │ ├── DateTimePicker.module.css │ │ │ │ │ │ │ ├── DateTimePicker.test.jsx │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── MonthPicker/ │ │ │ │ │ │ │ ├── MonthPicker.component.jsx │ │ │ │ │ │ │ ├── MonthPicker.module.css │ │ │ │ │ │ │ ├── MonthPicker.test.jsx │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ ├── MonthPicker.test.js.snap │ │ │ │ │ │ │ │ └── MonthPicker.test.jsx.snap │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── TimePicker/ │ │ │ │ │ │ │ ├── TimePicker.component.jsx │ │ │ │ │ │ │ ├── TimePicker.md │ │ │ │ │ │ │ ├── TimePicker.module.css │ │ │ │ │ │ │ ├── TimePicker.test.jsx │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ ├── TimePicker.test.js.snap │ │ │ │ │ │ │ │ └── TimePicker.test.jsx.snap │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── YearPicker/ │ │ │ │ │ │ ├── YearPicker.component.jsx │ │ │ │ │ │ ├── YearPicker.md │ │ │ │ │ │ ├── YearPicker.module.css │ │ │ │ │ │ ├── YearPicker.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── YearPicker.test.js.snap │ │ │ │ │ │ │ └── YearPicker.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── shared/ │ │ │ │ │ │ └── styles/ │ │ │ │ │ │ ├── mixins.scss │ │ │ │ │ │ └── variables.scss │ │ │ │ │ └── views/ │ │ │ │ │ ├── DateTimeView/ │ │ │ │ │ │ ├── DateTimeView.component.jsx │ │ │ │ │ │ ├── DateTimeView.module.css │ │ │ │ │ │ ├── DateTimeView.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── DateTimeView.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── HeaderTitle/ │ │ │ │ │ │ ├── HeaderTitle.component.jsx │ │ │ │ │ │ ├── HeaderTitle.module.css │ │ │ │ │ │ ├── HeaderTitle.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── HeaderTitle.test.js.snap │ │ │ │ │ │ │ └── HeaderTitle.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── MonthYearView/ │ │ │ │ │ │ ├── MonthYearView.component.jsx │ │ │ │ │ │ ├── MonthYearView.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── MonthYearView.test.js.snap │ │ │ │ │ │ │ └── MonthYearView.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ └── ViewLayout/ │ │ │ │ │ ├── ViewLayout.component.jsx │ │ │ │ │ ├── ViewLayout.module.css │ │ │ │ │ ├── ViewLayout.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── ViewLayout.test.js.snap │ │ │ │ │ │ └── ViewLayout.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── README.md │ │ │ │ ├── Time/ │ │ │ │ │ ├── Context.js │ │ │ │ │ ├── Input/ │ │ │ │ │ │ ├── Input.component.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Manager/ │ │ │ │ │ │ ├── Manager.component.jsx │ │ │ │ │ │ ├── Manager.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── Manager.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Picker/ │ │ │ │ │ │ ├── Picker.component.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── time-extraction.js │ │ │ │ │ └── time-extraction.test.js │ │ │ │ ├── TimeZone/ │ │ │ │ │ ├── TimeZone.component.jsx │ │ │ │ │ ├── TimeZone.component.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── TimeZone.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── generator.js │ │ │ │ ├── generator.test.js │ │ │ │ ├── gesture/ │ │ │ │ │ └── timePickerGesture.js │ │ │ │ ├── hooks/ │ │ │ │ │ └── useInputPickerHandlers.js │ │ │ │ ├── index.js │ │ │ │ ├── pickers/ │ │ │ │ │ ├── CalendarPicker/ │ │ │ │ │ │ ├── CalendarPicker.component.jsx │ │ │ │ │ │ ├── CalendarPicker.module.css │ │ │ │ │ │ ├── CalendarPicker.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── DatePicker/ │ │ │ │ │ │ ├── DatePicker.component.jsx │ │ │ │ │ │ ├── DatePicker.module.css │ │ │ │ │ │ ├── DatePicker.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── DatePicker.test.js.snap │ │ │ │ │ │ │ └── DatePicker.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── MonthPicker/ │ │ │ │ │ │ ├── MonthPicker.component.jsx │ │ │ │ │ │ ├── MonthPicker.module.css │ │ │ │ │ │ ├── MonthPicker.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── MonthPicker.test.js.snap │ │ │ │ │ │ │ └── MonthPicker.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── TimePicker/ │ │ │ │ │ │ ├── TimePicker.component.jsx │ │ │ │ │ │ ├── TimePicker.component.test.jsx │ │ │ │ │ │ ├── TimePicker.module.css │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── TimePicker.component.test.js.snap │ │ │ │ │ │ │ └── TimePicker.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ └── YearPicker/ │ │ │ │ │ ├── YearPicker.component.jsx │ │ │ │ │ ├── YearPicker.md │ │ │ │ │ ├── YearPicker.module.css │ │ │ │ │ ├── YearPicker.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── YearPicker.test.js.snap │ │ │ │ │ │ └── YearPicker.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── shared/ │ │ │ │ │ ├── InputSizer/ │ │ │ │ │ │ ├── InputSizer.component.test.jsx │ │ │ │ │ │ ├── InputSizer.component.tsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── error-messages.js │ │ │ │ │ └── styles/ │ │ │ │ │ ├── mixins.scss │ │ │ │ │ └── variables.scss │ │ │ │ └── views/ │ │ │ │ ├── DateView/ │ │ │ │ │ ├── DateView.component.jsx │ │ │ │ │ ├── DateView.module.css │ │ │ │ │ ├── DateView.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── DateView.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── HeaderTitle/ │ │ │ │ │ ├── HeaderTitle.component.jsx │ │ │ │ │ ├── HeaderTitle.module.css │ │ │ │ │ ├── HeaderTitle.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── HeaderTitle.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── MonthYearView/ │ │ │ │ │ ├── MonthYearView.component.jsx │ │ │ │ │ ├── MonthYearView.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── MonthYearView.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ └── ViewLayout/ │ │ │ │ ├── ViewLayout.component.tsx │ │ │ │ ├── ViewLayout.module.css │ │ │ │ ├── ViewLayout.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ViewLayout.test.js.snap │ │ │ │ │ └── ViewLayout.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Dialog/ │ │ │ │ ├── Dialog.component.jsx │ │ │ │ ├── Dialog.css │ │ │ │ ├── Dialog.stories.jsx │ │ │ │ ├── Dialog.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── Dialog.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Drawer/ │ │ │ │ ├── Drawer.component.jsx │ │ │ │ ├── Drawer.module.css │ │ │ │ ├── Drawer.stories.jsx │ │ │ │ ├── Drawer.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Drawer.test.js.snap │ │ │ │ │ └── Drawer.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── EditableText/ │ │ │ │ ├── EditableText.component.jsx │ │ │ │ ├── EditableText.module.css │ │ │ │ ├── EditableText.stories.jsx │ │ │ │ ├── EditableText.test.jsx │ │ │ │ ├── InlineForm.component.jsx │ │ │ │ ├── InlineForm.component.test.jsx │ │ │ │ ├── InlineForm.module.css │ │ │ │ ├── PlainTextTitle.component.test.jsx │ │ │ │ ├── PlainTextTitle.component.tsx │ │ │ │ ├── PlainTextTitle.module.css │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── EditableText.test.js.snap │ │ │ │ │ ├── EditableText.test.jsx.snap │ │ │ │ │ ├── InlineForm.component.test.js.snap │ │ │ │ │ ├── InlineForm.component.test.jsx.snap │ │ │ │ │ ├── PlainTextTitle.component.test.js.snap │ │ │ │ │ └── PlainTextTitle.component.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Emphasis/ │ │ │ │ ├── Emphasis.component.jsx │ │ │ │ ├── Emphasis.module.css │ │ │ │ ├── Emphasis.stories.jsx │ │ │ │ ├── Emphasis.test.jsx │ │ │ │ └── index.js │ │ │ ├── Enumeration/ │ │ │ │ ├── Enumeration.component.jsx │ │ │ │ ├── Enumeration.module.css │ │ │ │ ├── Enumeration.propTypes.js │ │ │ │ ├── Enumeration.stories.jsx │ │ │ │ ├── Enumeration.stories.module.css │ │ │ │ ├── Enumeration.test.jsx │ │ │ │ ├── Header/ │ │ │ │ │ ├── Header.component.jsx │ │ │ │ │ ├── Header.module.css │ │ │ │ │ ├── Header.propTypes.js │ │ │ │ │ ├── Header.test.jsx │ │ │ │ │ ├── HeaderEnumeration.component.jsx │ │ │ │ │ ├── HeaderInput.component.jsx │ │ │ │ │ ├── HeaderInput.test.jsx │ │ │ │ │ ├── HeaderSelected.component.jsx │ │ │ │ │ └── headerSelected.test.jsx │ │ │ │ ├── Items/ │ │ │ │ │ ├── EmptyListPlaceholder.component.jsx │ │ │ │ │ ├── EmptyListPlaceholder.module.css │ │ │ │ │ ├── Item/ │ │ │ │ │ │ ├── Item.component.jsx │ │ │ │ │ │ ├── Item.module.css │ │ │ │ │ │ ├── Item.propTypes.js │ │ │ │ │ │ ├── Item.test.jsx │ │ │ │ │ │ ├── ItemEdit.component.jsx │ │ │ │ │ │ ├── ItemEdit.propTypes.js │ │ │ │ │ │ ├── ItemEdit.test.jsx │ │ │ │ │ │ ├── utils.js │ │ │ │ │ │ └── utils.test.js │ │ │ │ │ ├── Items.component.jsx │ │ │ │ │ ├── Items.module.css │ │ │ │ │ └── ItemsEnumeration.component.jsx │ │ │ │ ├── displayModes.js │ │ │ │ └── index.js │ │ │ ├── FilterBar/ │ │ │ │ ├── Filter.stories.jsx │ │ │ │ ├── FilterBar.component.jsx │ │ │ │ ├── FilterBar.module.css │ │ │ │ ├── FilterBar.test.jsx │ │ │ │ └── index.js │ │ │ ├── FocusManager/ │ │ │ │ ├── FocusManager.component.jsx │ │ │ │ ├── FocusManager.test.jsx │ │ │ │ └── index.js │ │ │ ├── FormatValue/ │ │ │ │ ├── FormatValue.component.jsx │ │ │ │ ├── FormatValue.module.css │ │ │ │ ├── FormatValue.stories.jsx │ │ │ │ ├── FormatValue.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── FormatValue.test.js.snap │ │ │ │ │ └── FormatValue.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Gesture/ │ │ │ │ └── index.ts │ │ │ ├── GridLayout/ │ │ │ │ ├── Dashboard.stories.jsx │ │ │ │ ├── Grid.component.jsx │ │ │ │ ├── Grid.component.test.jsx │ │ │ │ ├── Grid.module.css │ │ │ │ ├── Tile/ │ │ │ │ │ ├── Body/ │ │ │ │ │ │ ├── TileBody.component.test.tsx │ │ │ │ │ │ ├── TileBody.component.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── TileBody.component.test.tsx.snap │ │ │ │ │ ├── Footer/ │ │ │ │ │ │ ├── TileFooter.component.test.tsx │ │ │ │ │ │ ├── TileFooter.component.tsx │ │ │ │ │ │ ├── TileFooter.module.css │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── TileFooter.component.test.tsx.snap │ │ │ │ │ ├── Header/ │ │ │ │ │ │ ├── TileHeader.component.test.tsx │ │ │ │ │ │ ├── TileHeader.component.tsx │ │ │ │ │ │ ├── TileHeader.module.css │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── TileHeader.component.test.tsx.snap │ │ │ │ │ ├── Skeleton/ │ │ │ │ │ │ ├── SkeletonTile.component.test.tsx │ │ │ │ │ │ ├── SkeletonTile.component.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── SkeletonTile.component.test.tsx.snap │ │ │ │ │ ├── Tile.component.test.tsx │ │ │ │ │ ├── Tile.component.tsx │ │ │ │ │ ├── Tile.module.css │ │ │ │ │ ├── context.ts │ │ │ │ │ └── index.ts │ │ │ │ └── index.js │ │ │ ├── GuidedTour/ │ │ │ │ ├── GuidedTour.component.jsx │ │ │ │ ├── GuidedTour.module.css │ │ │ │ ├── GuidedTour.stories.jsx │ │ │ │ ├── GuidedTour.test.jsx │ │ │ │ ├── README.md │ │ │ │ └── index.js │ │ │ ├── HeaderBar/ │ │ │ │ ├── HeaderBar.component.jsx │ │ │ │ ├── HeaderBar.module.css │ │ │ │ ├── HeaderBar.stories.jsx │ │ │ │ ├── HeaderBar.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── HeaderBar.test.js.snap │ │ │ │ │ └── HeaderBar.test.jsx.snap │ │ │ │ ├── index.js │ │ │ │ └── primitives/ │ │ │ │ ├── AppNotification.component.jsx │ │ │ │ ├── CallToAction.component.jsx │ │ │ │ ├── Environment.component.jsx │ │ │ │ ├── GenericAction.component.jsx │ │ │ │ ├── Help.component.jsx │ │ │ │ ├── Information.component.jsx │ │ │ │ ├── Intercom.component.jsx │ │ │ │ ├── Logo.component.jsx │ │ │ │ ├── Search.component.jsx │ │ │ │ └── User.component.jsx │ │ │ ├── HttpError/ │ │ │ │ ├── HttpError.component.jsx │ │ │ │ ├── HttpError.module.css │ │ │ │ ├── HttpError.snapshot.test.jsx │ │ │ │ ├── HttpError.stories.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── HttpError.snapshot.test.js.snap │ │ │ │ │ └── HttpError.snapshot.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Icon/ │ │ │ │ └── index.ts │ │ │ ├── IconsProvider/ │ │ │ │ ├── README.md │ │ │ │ └── index.ts │ │ │ ├── Inject/ │ │ │ │ ├── Inject.component.tsx │ │ │ │ ├── Inject.md │ │ │ │ ├── Inject.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── Inject.test.jsx.snap │ │ │ │ └── index.ts │ │ │ ├── JSONSchemaRenderer/ │ │ │ │ ├── JSONSchemaRenderer.component.jsx │ │ │ │ ├── JSONSchemaRenderer.module.css │ │ │ │ ├── JSONSchemaRenderer.stories.jsx │ │ │ │ ├── JSONSchemaRenderer.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── JSONSchemaRenderer.test.js.snap │ │ │ │ │ └── JSONSchemaRenderer.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Layout/ │ │ │ │ ├── AppLayout.stories.jsx │ │ │ │ ├── Layout.component.jsx │ │ │ │ ├── Layout.md │ │ │ │ ├── Layout.module.css │ │ │ │ ├── Layout.test.jsx │ │ │ │ ├── OneColumn/ │ │ │ │ │ ├── OneColumn.component.jsx │ │ │ │ │ ├── OneColumn.module.css │ │ │ │ │ ├── OneColumn.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── OneColumn.test.js.snap │ │ │ │ │ │ └── OneColumn.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── SkipLinks/ │ │ │ │ │ ├── SkipLinks.component.tsx │ │ │ │ │ ├── SkipLinks.module.css │ │ │ │ │ ├── SkipLinks.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── SkipLinks.test.js.snap │ │ │ │ │ │ └── SkipLinks.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── TwoColumns/ │ │ │ │ │ ├── TwoColumns.component.jsx │ │ │ │ │ ├── TwoColumns.module.css │ │ │ │ │ ├── TwoColumns.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── TwoColumns.test.js.snap │ │ │ │ │ │ └── TwoColumns.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── Link/ │ │ │ │ └── index.ts │ │ │ ├── List/ │ │ │ │ ├── List.component.jsx │ │ │ │ ├── List.md │ │ │ │ ├── List.module.css │ │ │ │ ├── List.stories.jsx │ │ │ │ ├── List.test.jsx │ │ │ │ ├── ListComposition/ │ │ │ │ │ ├── ColumnChooser/ │ │ │ │ │ │ ├── ColumnChooser.component.jsx │ │ │ │ │ │ ├── ColumnChooser.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── DisplayMode/ │ │ │ │ │ │ ├── DisplayModeToggle.scss │ │ │ │ │ │ ├── ListDisplayMode.component.jsx │ │ │ │ │ │ ├── ListDisplayMode.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── ListDisplayMode.component.test.js.snap │ │ │ │ │ │ │ └── ListDisplayMode.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── ItemsNumber/ │ │ │ │ │ │ ├── ItemsNumber.component.jsx │ │ │ │ │ │ ├── ItemsNumber.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── LazyLoadingList/ │ │ │ │ │ │ ├── LazyLoadingList.component.jsx │ │ │ │ │ │ ├── LazyLoadingList.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── LazyLoadingList.component.test.js.snap │ │ │ │ │ │ │ └── LazyLoadingList.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── List.module.css │ │ │ │ │ ├── Manager/ │ │ │ │ │ │ ├── ListManager.component.jsx │ │ │ │ │ │ ├── ListManager.component.test.jsx │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── useCollectionActions.hook.js │ │ │ │ │ │ │ ├── useCollectionActions.hook.test.jsx │ │ │ │ │ │ │ ├── useCollectionFilter.hook.js │ │ │ │ │ │ │ ├── useCollectionFilter.hook.test.jsx │ │ │ │ │ │ │ ├── useCollectionSelection.hook.js │ │ │ │ │ │ │ ├── useCollectionSelection.hook.test.jsx │ │ │ │ │ │ │ ├── useCollectionSort.hook.js │ │ │ │ │ │ │ ├── useCollectionSort.hook.test.jsx │ │ │ │ │ │ │ ├── useColumnsVisibility.hook.js │ │ │ │ │ │ │ └── useColumnsVisibility.hook.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── README.md │ │ │ │ │ ├── SortBy/ │ │ │ │ │ │ ├── SortBy.component.jsx │ │ │ │ │ │ ├── SortBy.component.test.jsx │ │ │ │ │ │ ├── SortBy.md │ │ │ │ │ │ ├── SortBy.module.css │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── SortBy.component.test.js.snap │ │ │ │ │ │ │ └── SortBy.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── TextFilter/ │ │ │ │ │ │ ├── TextFilter.component.jsx │ │ │ │ │ │ ├── TextFilter.component.md │ │ │ │ │ │ ├── TextFilter.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── TextFilter.component.test.js.snap │ │ │ │ │ │ │ └── TextFilter.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Toolbar/ │ │ │ │ │ │ ├── ListToolbar.component.jsx │ │ │ │ │ │ ├── ListToolbar.component.test.jsx │ │ │ │ │ │ ├── ListToolbar.module.css │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── ListToolbar.component.test.js.snap │ │ │ │ │ │ │ └── ListToolbar.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── VList/ │ │ │ │ │ │ ├── VList.component.jsx │ │ │ │ │ │ ├── VList.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── collection.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── context.js │ │ │ │ │ ├── context.test.jsx │ │ │ │ │ ├── doc/ │ │ │ │ │ │ ├── developer-guide.md │ │ │ │ │ │ └── principle.md │ │ │ │ │ └── index.js │ │ │ │ ├── ListComposition.stories.jsx │ │ │ │ ├── ListToVirtualizedList/ │ │ │ │ │ ├── ListToVirtualizedList.component.jsx │ │ │ │ │ ├── ListToVirtualizedList.test.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── Toolbar/ │ │ │ │ │ ├── ColumnChooserButton/ │ │ │ │ │ │ ├── ColumnChooser/ │ │ │ │ │ │ │ ├── ColumnChooser.component.jsx │ │ │ │ │ │ │ ├── ColumnChooser.component.test.jsx │ │ │ │ │ │ │ ├── ColumnChooser.module.css │ │ │ │ │ │ │ ├── ColumnChooser.stories.jsx │ │ │ │ │ │ │ ├── ColumnChooserBody/ │ │ │ │ │ │ │ │ ├── ColumnChooserBody.component.jsx │ │ │ │ │ │ │ │ ├── ColumnChooserBody.component.test.jsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ ├── ColumnChooserBody.component.test.js.snap │ │ │ │ │ │ │ │ │ └── ColumnChooserBody.component.test.jsx.snap │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── ColumnChooserFooter/ │ │ │ │ │ │ │ │ ├── ColumnChooserFooter.component.jsx │ │ │ │ │ │ │ │ ├── ColumnChooserFooter.component.test.jsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ ├── ColumnChooserFooter.component.test.js.snap │ │ │ │ │ │ │ │ │ └── ColumnChooserFooter.component.test.jsx.snap │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── ColumnChooserHeader/ │ │ │ │ │ │ │ │ ├── ColumnChooserHeader.component.jsx │ │ │ │ │ │ │ │ ├── ColumnChooserHeader.component.test.jsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ ├── ColumnChooserHeader.component.test.js.snap │ │ │ │ │ │ │ │ │ └── ColumnChooserHeader.component.test.jsx.snap │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── ColumnChooserRow/ │ │ │ │ │ │ │ │ ├── ColumnChooserRow.component.jsx │ │ │ │ │ │ │ │ ├── ColumnChooserRow.component.test.jsx │ │ │ │ │ │ │ │ ├── RowCheckbox/ │ │ │ │ │ │ │ │ │ ├── RowCheckbox.component.jsx │ │ │ │ │ │ │ │ │ ├── RowCheckbox.component.test.jsx │ │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ │ ├── RowCheckbox.component.test.js.snap │ │ │ │ │ │ │ │ │ │ └── RowCheckbox.component.test.jsx.snap │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ ├── RowLabel/ │ │ │ │ │ │ │ │ │ ├── RowLabel.component.jsx │ │ │ │ │ │ │ │ │ ├── RowLabel.component.test.jsx │ │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ │ ├── RowLabel.component.test.js.snap │ │ │ │ │ │ │ │ │ │ └── RowLabel.component.test.jsx.snap │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ ├── ColumnChooserRow.component.test.js.snap │ │ │ │ │ │ │ │ │ └── ColumnChooserRow.component.test.jsx.snap │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── ColumnChooserTable/ │ │ │ │ │ │ │ │ ├── ColumnChooserTable.component.jsx │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── SelectAllColumnsCheckbox/ │ │ │ │ │ │ │ │ ├── SelectAllColumnsCheckbox.component.jsx │ │ │ │ │ │ │ │ ├── SelectAllColumnsCheckbox.component.test.jsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ ├── SelectAllColumnsCheckbox.component.test.js.snap │ │ │ │ │ │ │ │ │ └── SelectAllColumnsCheckbox.component.test.jsx.snap │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ ├── ColumnChooser.component.test.js.snap │ │ │ │ │ │ │ │ └── ColumnChooser.component.test.jsx.snap │ │ │ │ │ │ │ ├── columnChooser.context.js │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── ColumnChooserButton.component.jsx │ │ │ │ │ │ ├── ColumnChooserButton.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── columnChooser.propTypes.js │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── columnChooserManager.hook.js │ │ │ │ │ │ │ ├── columnChooserManager.hook.test.jsx │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── service/ │ │ │ │ │ │ ├── columnChooser.utils.js │ │ │ │ │ │ ├── columnChooser.utils.test.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── DisplayModeToggle/ │ │ │ │ │ │ ├── DisplayModeToggle.component.jsx │ │ │ │ │ │ ├── DisplayModeToggle.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── DisplayModeToggle.test.js.snap │ │ │ │ │ │ │ └── DisplayModeToggle.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── ItemsNumber/ │ │ │ │ │ │ ├── ItemsNumber.component.jsx │ │ │ │ │ │ ├── ItemsNumber.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Label/ │ │ │ │ │ │ ├── Label.component.jsx │ │ │ │ │ │ ├── Label.snapshot.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Label.snapshot.test.js.snap │ │ │ │ │ │ │ └── Label.snapshot.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Pagination/ │ │ │ │ │ │ ├── Pagination.component.jsx │ │ │ │ │ │ ├── Pagination.module.css │ │ │ │ │ │ ├── Pagination.snapshot.test.jsx │ │ │ │ │ │ ├── Pagination.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Pagination.snapshot.test.js.snap │ │ │ │ │ │ │ └── Pagination.snapshot.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── SelectAll/ │ │ │ │ │ │ ├── SelectAll.component.jsx │ │ │ │ │ │ ├── SelectAll.component.test.jsx │ │ │ │ │ │ ├── SelectAll.module.css │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── SelectSortBy/ │ │ │ │ │ │ ├── SelectSortBy.component.jsx │ │ │ │ │ │ ├── SelectSortBy.module.css │ │ │ │ │ │ ├── SelectSortBy.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── SelectSortBy.test.js.snap │ │ │ │ │ │ │ └── SelectSortBy.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Toolbar.component.jsx │ │ │ │ │ ├── Toolbar.module.css │ │ │ │ │ ├── Toolbar.snapshot.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── Toolbar.snapshot.test.js.snap │ │ │ │ │ │ └── Toolbar.snapshot.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── List.test.js.snap │ │ │ │ │ └── List.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── ListView/ │ │ │ │ ├── Header/ │ │ │ │ │ ├── Header.component.jsx │ │ │ │ │ ├── Header.module.css │ │ │ │ │ ├── Header.test.jsx │ │ │ │ │ ├── HeaderInput.component.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── Header.test.js.snap │ │ │ │ │ │ └── Header.test.jsx.snap │ │ │ │ │ └── headerInput.test.jsx │ │ │ │ ├── Items/ │ │ │ │ │ ├── Item/ │ │ │ │ │ │ ├── Item.component.jsx │ │ │ │ │ │ ├── Item.propTypes.js │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── item.snapshot.test.js.snap │ │ │ │ │ │ │ └── item.snapshot.test.jsx.snap │ │ │ │ │ │ └── item.snapshot.test.jsx │ │ │ │ │ ├── Items.component.jsx │ │ │ │ │ ├── Items.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── items.test.js.snap │ │ │ │ │ │ └── items.test.jsx.snap │ │ │ │ │ └── items.test.jsx │ │ │ │ ├── ListView.component.jsx │ │ │ │ ├── ListView.module.css │ │ │ │ ├── ListView.stories.jsx │ │ │ │ └── index.js │ │ │ ├── Loader/ │ │ │ │ ├── Loader.component.jsx │ │ │ │ ├── Loader.md │ │ │ │ ├── Loader.module.css │ │ │ │ ├── Loader.stories.jsx │ │ │ │ ├── Loader.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Loader.test.js.snap │ │ │ │ │ └── Loader.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── MultiSelect/ │ │ │ │ ├── Dropdown.container.jsx │ │ │ │ ├── Dropdown.module.css │ │ │ │ ├── ItemOption.component.jsx │ │ │ │ ├── ItemOption.module.css │ │ │ │ ├── ItemView.component.jsx │ │ │ │ ├── MultiSelect.container.jsx │ │ │ │ ├── MultiSelect.module.css │ │ │ │ ├── MultiSelect.stories.jsx │ │ │ │ ├── README.md │ │ │ │ ├── constants.js │ │ │ │ └── index.js │ │ │ ├── Notification/ │ │ │ │ ├── Notification.component.jsx │ │ │ │ ├── Notification.module.css │ │ │ │ ├── Notification.stories.jsx │ │ │ │ ├── Notification.test.jsx │ │ │ │ └── index.js │ │ │ ├── ObjectViewer/ │ │ │ │ ├── DataTreeViewer.stories.jsx │ │ │ │ ├── JSONLike/ │ │ │ │ │ ├── JSONLike.component.jsx │ │ │ │ │ ├── JSONLike.module.css │ │ │ │ │ ├── JSONLike.test.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── List/ │ │ │ │ │ ├── List.component.jsx │ │ │ │ │ ├── List.module.css │ │ │ │ │ ├── List.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── List.test.js.snap │ │ │ │ │ │ └── List.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── ObjectViewer.component.jsx │ │ │ │ ├── ObjectViewer.test.jsx │ │ │ │ ├── Table/ │ │ │ │ │ ├── Table.component.jsx │ │ │ │ │ ├── Table.module.css │ │ │ │ │ ├── Table.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── Table.test.js.snap │ │ │ │ │ │ └── Table.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── convertDate.js │ │ │ │ ├── index.js │ │ │ │ ├── toflat.js │ │ │ │ └── toflat.test.js │ │ │ ├── OverlayTrigger/ │ │ │ │ ├── OverlayTrigger.component.jsx │ │ │ │ ├── OverlayTrigger.forked.jsx │ │ │ │ ├── OverlayTrigger.module.css │ │ │ │ ├── OverlayTrigger.test.jsx │ │ │ │ ├── index.js │ │ │ │ ├── overlay.js │ │ │ │ └── overlay.test.js │ │ │ ├── PieChart/ │ │ │ │ ├── PieChart.component.jsx │ │ │ │ ├── PieChart.module.css │ │ │ │ ├── PieChart.stories.jsx │ │ │ │ ├── PieChart.test.jsx │ │ │ │ ├── PieChartButton.component.jsx │ │ │ │ ├── PieChartButton.test.jsx │ │ │ │ ├── PieChartIcon.component.jsx │ │ │ │ ├── PieChartIcon.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── PieChart.test.jsx.snap │ │ │ │ │ ├── PieChartButton.test.jsx.snap │ │ │ │ │ ├── PieChartIcon.test.js.snap │ │ │ │ │ └── PieChartIcon.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Progress/ │ │ │ │ ├── Progress.component.jsx │ │ │ │ ├── Progress.module.css │ │ │ │ ├── Progress.test.jsx │ │ │ │ ├── ProgressBar.stories.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Progress.test.js.snap │ │ │ │ │ └── Progress.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── QualityBar/ │ │ │ │ ├── QualityBar.component.tsx │ │ │ │ ├── QualityBar.stories.jsx │ │ │ │ └── index.ts │ │ │ ├── RadarChart/ │ │ │ │ ├── RadarChart.component.jsx │ │ │ │ ├── RadarChart.module.css │ │ │ │ ├── RadarChart.stories.jsx │ │ │ │ ├── RadarChart.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── RadarChart.test.js.snap │ │ │ │ │ └── RadarChart.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── RatioBar/ │ │ │ │ ├── RatioBar.component.tsx │ │ │ │ ├── RatioBar.stories.jsx │ │ │ │ └── index.ts │ │ │ ├── ResourceList/ │ │ │ │ ├── Resource/ │ │ │ │ │ ├── Resource.component.jsx │ │ │ │ │ ├── Resource.module.css │ │ │ │ │ ├── Resource.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── Resource.test.js.snap │ │ │ │ │ │ └── Resource.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── ResourceList.component.jsx │ │ │ │ ├── ResourceList.module.css │ │ │ │ ├── ResourceList.propTypes.js │ │ │ │ ├── ResourceList.stories.jsx │ │ │ │ ├── ResourceList.test.jsx │ │ │ │ ├── Toolbar/ │ │ │ │ │ ├── NameFilter/ │ │ │ │ │ │ ├── NameFilter.component.jsx │ │ │ │ │ │ ├── NameFilter.module.css │ │ │ │ │ │ ├── NameFilter.snap.test.jsx │ │ │ │ │ │ ├── NameFilter.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── NameFilter.snap.test.js.snap │ │ │ │ │ │ │ └── NameFilter.snap.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── SortOptions/ │ │ │ │ │ │ ├── OrderChooser/ │ │ │ │ │ │ │ ├── OrderChooser.component.jsx │ │ │ │ │ │ │ ├── OrderChooser.module.css │ │ │ │ │ │ │ ├── OrderChooser.test.jsx │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ ├── OrderChooser.test.js.snap │ │ │ │ │ │ │ │ └── OrderChooser.test.jsx.snap │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── SortOptions.component.jsx │ │ │ │ │ │ ├── SortOptions.module.css │ │ │ │ │ │ ├── SortOptions.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── SortOptions.test.js.snap │ │ │ │ │ │ │ └── SortOptions.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── StateFilter/ │ │ │ │ │ │ ├── StateFilter.component.jsx │ │ │ │ │ │ ├── StateFilter.module.css │ │ │ │ │ │ ├── StateFilter.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── StateFilter.test.js.snap │ │ │ │ │ │ │ └── StateFilter.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Toolbar.component.jsx │ │ │ │ │ ├── Toolbar.module.css │ │ │ │ │ ├── Toolbar.snap.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── Toolbar.snap.test.js.snap │ │ │ │ │ │ └── Toolbar.snap.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── ResourcePicker/ │ │ │ │ ├── ResourcePicker.component.jsx │ │ │ │ ├── ResourcePicker.module.css │ │ │ │ ├── ResourcePicker.stories.jsx │ │ │ │ ├── ResourcePicker.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ResourcePicker.test.js.snap │ │ │ │ │ └── ResourcePicker.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Rich/ │ │ │ │ ├── Error/ │ │ │ │ │ ├── RichError.component.jsx │ │ │ │ │ ├── RichError.component.test.jsx │ │ │ │ │ ├── RichError.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── RichError.component.test.js.snap │ │ │ │ │ │ └── RichError.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── HeaderTitle/ │ │ │ │ │ ├── HeaderTitle.component.jsx │ │ │ │ │ ├── HeaderTitle.component.test.jsx │ │ │ │ │ ├── HeaderTitle.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── HeaderTitle.component.test.js.snap │ │ │ │ │ │ └── HeaderTitle.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── Layout/ │ │ │ │ │ ├── RichLayout.component.jsx │ │ │ │ │ ├── RichLayout.module.css │ │ │ │ │ ├── RichLayout.stories.jsx │ │ │ │ │ ├── RichLayout.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── RichLayout.test.js.snap │ │ │ │ │ │ └── RichLayout.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── SidePanel/ │ │ │ │ ├── SidePanel.component.jsx │ │ │ │ ├── SidePanel.module.css │ │ │ │ ├── SidePanel.stories.jsx │ │ │ │ ├── SidePanel.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── SidePanel.test.js.snap │ │ │ │ │ └── SidePanel.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Skeleton/ │ │ │ │ ├── Skeleton.component.tsx │ │ │ │ ├── Skeleton.md │ │ │ │ ├── Skeleton.module.css │ │ │ │ ├── Skeleton.stories.jsx │ │ │ │ ├── Skeleton.test.jsx │ │ │ │ └── index.ts │ │ │ ├── Slider/ │ │ │ │ ├── Slider.component.tsx │ │ │ │ ├── Slider.module.css │ │ │ │ ├── Slider.stories.jsx │ │ │ │ ├── Slider.test.tsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── Slider.test.tsx.snap │ │ │ │ └── index.ts │ │ │ ├── Status/ │ │ │ │ ├── Status.component.jsx │ │ │ │ ├── Status.module.css │ │ │ │ ├── Status.stories.jsx │ │ │ │ ├── Status.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Status.test.js.snap │ │ │ │ │ └── Status.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Stepper/ │ │ │ │ ├── Stepper.component.jsx │ │ │ │ ├── Stepper.component.module.css │ │ │ │ ├── Stepper.component.test.jsx │ │ │ │ ├── Stepper.stories.jsx │ │ │ │ ├── StepperTransition.component.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Stepper.component.test.js.snap │ │ │ │ │ └── Stepper.component.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── SubHeaderBar/ │ │ │ │ ├── SubHeader.stories.jsx │ │ │ │ ├── SubHeaderBar.component.jsx │ │ │ │ ├── SubHeaderBar.md │ │ │ │ ├── SubHeaderBar.module.css │ │ │ │ ├── SubHeaderBar.test.jsx │ │ │ │ ├── TitleSubHeader/ │ │ │ │ │ ├── SubTitle.component.jsx │ │ │ │ │ ├── SubTitle.test.jsx │ │ │ │ │ ├── TitleSubHeader.component.jsx │ │ │ │ │ ├── TitleSubHeader.module.css │ │ │ │ │ ├── TitleSubHeader.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── SubTitle.test.js.snap │ │ │ │ │ │ ├── SubTitle.test.jsx.snap │ │ │ │ │ │ ├── TitleSubHeader.test.js.snap │ │ │ │ │ │ └── TitleSubHeader.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── SubHeaderBar.test.js.snap │ │ │ │ │ └── SubHeaderBar.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── TabBar/ │ │ │ │ ├── TabBar.component.jsx │ │ │ │ ├── TabBar.module.css │ │ │ │ ├── TabBar.test.jsx │ │ │ │ ├── Tabs.stories.jsx │ │ │ │ └── index.js │ │ │ ├── Tag/ │ │ │ │ ├── Tag.component.jsx │ │ │ │ ├── Tag.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Tag.test.js.snap │ │ │ │ │ └── Tag.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Toggle/ │ │ │ │ ├── LabelToggle/ │ │ │ │ │ ├── LabelToggle.component.jsx │ │ │ │ │ ├── LabelToggle.module.css │ │ │ │ │ ├── LabelToggleComponent.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── LabelToggleComponent.test.js.snap │ │ │ │ │ │ └── LabelToggleComponent.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── Toggle.component.jsx │ │ │ │ ├── Toggle.stories.jsx │ │ │ │ ├── Toggle.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Toggle.test.js.snap │ │ │ │ │ └── Toggle.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── TooltipTrigger/ │ │ │ │ ├── Tooltip.stories.jsx │ │ │ │ ├── TooltipTrigger.component.jsx │ │ │ │ ├── TooltipTrigger.hook.js │ │ │ │ ├── TooltipTrigger.module.css │ │ │ │ ├── TooltipTrigger.test.jsx │ │ │ │ └── index.js │ │ │ ├── TreeView/ │ │ │ │ ├── FolderTreeView.stories.jsx │ │ │ │ ├── TreeView.component.jsx │ │ │ │ ├── TreeView.module.css │ │ │ │ ├── TreeView.test.jsx │ │ │ │ ├── TreeViewItem/ │ │ │ │ │ ├── TreeViewItem.component.jsx │ │ │ │ │ ├── TreeViewItem.module.css │ │ │ │ │ ├── TreeViewItem.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── TreeViewItem.test.js.snap │ │ │ │ │ │ └── TreeViewItem.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── TreeView.test.js.snap │ │ │ │ │ └── TreeView.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Typeahead/ │ │ │ │ ├── Typeahead.component.jsx │ │ │ │ ├── Typeahead.component.renderers.jsx │ │ │ │ ├── Typeahead.module.css │ │ │ │ ├── Typeahead.snapshot.test.jsx │ │ │ │ ├── Typeahead.stories.jsx │ │ │ │ ├── Typeahead.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── Typeahead.snapshot.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── VirtualizedList/ │ │ │ │ ├── CellActions/ │ │ │ │ │ ├── ActionsColumn.component.jsx │ │ │ │ │ ├── CellActions.component.jsx │ │ │ │ │ ├── CellActions.test.jsx │ │ │ │ │ ├── RowLargeCellActions.module.css │ │ │ │ │ ├── RowTableCellActions.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── CellActions.test.js.snap │ │ │ │ │ │ └── CellActions.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── CellBadge/ │ │ │ │ │ ├── BadgeColumn.component.jsx │ │ │ │ │ ├── CellBadge.component.jsx │ │ │ │ │ ├── CellBadge.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── CellBadge.test.js.snap │ │ │ │ │ │ └── CellBadge.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── CellBoolean/ │ │ │ │ │ ├── BooleanColumn.component.jsx │ │ │ │ │ ├── CellBoolean.component.jsx │ │ │ │ │ ├── CellBoolean.module.css │ │ │ │ │ ├── CellBoolean.test.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── CellCheckbox/ │ │ │ │ │ ├── CellCheckbox.component.jsx │ │ │ │ │ ├── CellCheckbox.module.css │ │ │ │ │ ├── CellCheckbox.test.jsx │ │ │ │ │ ├── CheckboxColumn.component.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── CellCheckbox.test.js.snap │ │ │ │ │ │ └── CellCheckbox.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── CellDatetime/ │ │ │ │ │ ├── CellDatetime.component.jsx │ │ │ │ │ ├── CellDatetime.module.css │ │ │ │ │ ├── CellDatetime.test.jsx │ │ │ │ │ ├── DatetimeColumn.component.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── CellDatetime.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── CellIconText/ │ │ │ │ │ ├── CellIconText.component.jsx │ │ │ │ │ ├── CellIconText.module.css │ │ │ │ │ ├── CellIconText.test.jsx │ │ │ │ │ ├── IconTextColumn.component.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── CellIconText.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── CellLabel/ │ │ │ │ │ ├── CellLabel.component.jsx │ │ │ │ │ ├── CellLabel.test.jsx │ │ │ │ │ ├── LabelColumn.component.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── CellLabel.test.js.snap │ │ │ │ │ │ └── CellLabel.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── CellLink/ │ │ │ │ │ ├── CellLink.component.jsx │ │ │ │ │ ├── CellLink.module.css │ │ │ │ │ ├── CellLink.test.jsx │ │ │ │ │ ├── LinkColumn.component.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── CellMappedData/ │ │ │ │ │ ├── CellMappedData.component.jsx │ │ │ │ │ ├── CellMappedData.component.test.jsx │ │ │ │ │ ├── MappedDataColumn.component.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── CellMappedData.component.test.js.snap │ │ │ │ │ │ └── CellMappedData.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── CellQualityBar/ │ │ │ │ │ ├── CellQualityBar.component.jsx │ │ │ │ │ ├── CellQualityBar.test.jsx │ │ │ │ │ ├── QualityBarColumn.component.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── CellQualityBar.test.js.snap │ │ │ │ │ │ └── CellQualityBar.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── CellTextIcon/ │ │ │ │ │ ├── CellWithIcon.component.jsx │ │ │ │ │ ├── CellWithIcon.module.css │ │ │ │ │ ├── CellWithIcon.test.jsx │ │ │ │ │ ├── TextIconColumn.component.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── CellWithIcon.test.js.snap │ │ │ │ │ │ └── CellWithIcon.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── CellTitle/ │ │ │ │ │ ├── CellTitle.component.jsx │ │ │ │ │ ├── CellTitle.module.css │ │ │ │ │ ├── CellTitle.test.jsx │ │ │ │ │ ├── CellTitleActions.component.jsx │ │ │ │ │ ├── CellTitleActions.module.css │ │ │ │ │ ├── CellTitleActions.test.jsx │ │ │ │ │ ├── CellTitleInput.component.jsx │ │ │ │ │ ├── CellTitleInput.test.jsx │ │ │ │ │ ├── CellTitleSelector.component.jsx │ │ │ │ │ ├── CellTitleSelector.test.jsx │ │ │ │ │ ├── TitleColumn.component.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── CellTitle.test.jsx.snap │ │ │ │ │ │ ├── CellTitleInput.test.js.snap │ │ │ │ │ │ ├── CellTitleInput.test.jsx.snap │ │ │ │ │ │ ├── CellTitleSelector.test.js.snap │ │ │ │ │ │ └── CellTitleSelector.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── Content.component.jsx │ │ │ │ ├── Content.component.test.jsx │ │ │ │ ├── HeaderCheckbox/ │ │ │ │ │ ├── HeaderCheckbox.component.jsx │ │ │ │ │ ├── HeaderCheckbox.module.css │ │ │ │ │ ├── HeaderCheckbox.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── HeaderCheckbox.test.js.snap │ │ │ │ │ │ └── HeaderCheckbox.test.jsx.snap │ │ │ │ │ └── index.jsx │ │ │ │ ├── HeaderIcon/ │ │ │ │ │ ├── HeaderIcon.component.jsx │ │ │ │ │ ├── HeaderIcon.component.test.jsx │ │ │ │ │ ├── HeaderIcon.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── HeaderIcon.component.test.js.snap │ │ │ │ │ │ └── HeaderIcon.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── HeaderResizable/ │ │ │ │ │ ├── HeaderResizable.component.jsx │ │ │ │ │ ├── HeaderResizable.component.test.jsx │ │ │ │ │ ├── HeaderResizable.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── HeaderResizable.component.test.js.snap │ │ │ │ │ │ └── HeaderResizable.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── ListGrid/ │ │ │ │ │ ├── ListGrid.component.jsx │ │ │ │ │ ├── ListGrid.module.css │ │ │ │ │ ├── ListGrid.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── ListGrid.test.js.snap │ │ │ │ │ │ └── ListGrid.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── ListTable/ │ │ │ │ │ ├── ListTable.component.jsx │ │ │ │ │ ├── ListTable.module.css │ │ │ │ │ ├── ListTable.test.jsx │ │ │ │ │ ├── RowThemes.js │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── ListTable.test.js.snap │ │ │ │ │ │ └── ListTable.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── NoRows/ │ │ │ │ │ ├── NoRows.component.jsx │ │ │ │ │ ├── NoRows.module.css │ │ │ │ │ ├── NoRows.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── NoRows.test.js.snap │ │ │ │ │ │ └── NoRows.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── PropTypes.js │ │ │ │ ├── README.md │ │ │ │ ├── RendererSelector.component.jsx │ │ │ │ ├── RendererSelector.test.jsx │ │ │ │ ├── RowCollapsiblePanel/ │ │ │ │ │ ├── RowCollapsiblePanel.component.jsx │ │ │ │ │ ├── RowCollapsiblePanel.module.css │ │ │ │ │ ├── RowCollapsiblePanel.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── RowCollapsiblePanel.test.js.snap │ │ │ │ │ │ └── RowCollapsiblePanel.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── RowLarge/ │ │ │ │ │ ├── RowLarge.component.jsx │ │ │ │ │ ├── RowLarge.module.css │ │ │ │ │ ├── RowLarge.test.jsx │ │ │ │ │ ├── RowThemes.js │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── RowLarge.test.js.snap │ │ │ │ │ │ └── RowLarge.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── RowSelection/ │ │ │ │ │ ├── RowSelection.component.jsx │ │ │ │ │ ├── RowSelection.module.css │ │ │ │ │ ├── RowSelection.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── RowSelection.test.js.snap │ │ │ │ │ │ └── RowSelection.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── VirtualizedList.component.jsx │ │ │ │ ├── VirtualizedList.module.css │ │ │ │ ├── VirtualizedList.stories.jsx │ │ │ │ ├── VirtualizedList.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Content.component.test.js.snap │ │ │ │ │ ├── Content.component.test.jsx.snap │ │ │ │ │ ├── RendererSelector.test.js.snap │ │ │ │ │ ├── RendererSelector.test.jsx.snap │ │ │ │ │ └── VirtualizedList.test.jsx.snap │ │ │ │ ├── collection.js │ │ │ │ ├── event/ │ │ │ │ │ ├── rowclick.js │ │ │ │ │ └── rowclick.test.js │ │ │ │ ├── index.js │ │ │ │ ├── utils/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── gridrow.test.jsx.snap │ │ │ │ │ │ ├── tablerow.test.js.snap │ │ │ │ │ │ └── tablerow.test.jsx.snap │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── dictionary.js │ │ │ │ │ ├── gridrow.js │ │ │ │ │ ├── gridrow.test.jsx │ │ │ │ │ ├── resizable.js │ │ │ │ │ ├── resizable.test.js │ │ │ │ │ ├── tablerow.jsx │ │ │ │ │ └── tablerow.test.jsx │ │ │ │ └── virtualizedListContext.jsx │ │ │ ├── WithDrawer/ │ │ │ │ ├── WithDrawer.component.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── withDrawer.test.js.snap │ │ │ │ │ └── withDrawer.test.jsx.snap │ │ │ │ ├── index.js │ │ │ │ ├── withDrawer.module.css │ │ │ │ └── withDrawer.test.jsx │ │ │ ├── constants.js │ │ │ ├── i18n/ │ │ │ │ ├── DateFnsLocale/ │ │ │ │ │ ├── formatters.js │ │ │ │ │ ├── locale.js │ │ │ │ │ └── locale.test.js │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── polyfills/ │ │ │ │ └── element-closest.js │ │ │ ├── test-setup.js │ │ │ ├── theme.test.ts │ │ │ ├── theme.ts │ │ │ ├── translate.js │ │ │ ├── translate.test.js │ │ │ ├── utils/ │ │ │ │ ├── getPropsFrom.js │ │ │ │ ├── getPropsFrom.test.js │ │ │ │ ├── getTabBarBadgeLabel.js │ │ │ │ └── getTabBarBadgeLabel.test.js │ │ │ ├── wrap.test.tsx │ │ │ └── wrap.tsx │ │ ├── stylelint.config.mjs │ │ ├── talend-i18n.json │ │ ├── talend-scripts.json │ │ ├── test/ │ │ │ └── storageMock.js │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── containers/ │ │ ├── .babelrc.json │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .storybook/ │ │ │ ├── cmf.jsx │ │ │ ├── cmfModule/ │ │ │ │ ├── actionCreators.js │ │ │ │ ├── components.js │ │ │ │ ├── expressions.js │ │ │ │ ├── index.js │ │ │ │ ├── reducers.js │ │ │ │ ├── registry.js │ │ │ │ ├── sagas.js │ │ │ │ └── settings.js │ │ │ ├── main.mjs │ │ │ ├── preview-head.html │ │ │ └── preview.jsx │ │ ├── 6.0 - breaking changes.md │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── docs.json │ │ ├── eslint.config.mjs │ │ ├── i18next-scanner.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── AboutDialog/ │ │ │ │ ├── AboutDialog.connect.js │ │ │ │ ├── AboutDialog.constant.js │ │ │ │ ├── AboutDialog.container.jsx │ │ │ │ ├── AboutDialog.sagas.js │ │ │ │ ├── AboutDialog.sagas.test.jsx │ │ │ │ ├── AboutDialog.stories.jsx │ │ │ │ ├── AboutDialog.test.jsx │ │ │ │ └── index.js │ │ │ ├── Action/ │ │ │ │ ├── Action.connect.js │ │ │ │ ├── Action.stories.jsx │ │ │ │ ├── Action.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Action.test.js.snap │ │ │ │ │ └── Action.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── ActionBar/ │ │ │ │ ├── ActionBar.connect.js │ │ │ │ ├── ActionBar.stories.jsx │ │ │ │ ├── ActionBar.test.jsx │ │ │ │ └── index.js │ │ │ ├── ActionButton/ │ │ │ │ ├── ActionButton.connect.jsx │ │ │ │ ├── ActionButton.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ActionButton.test.js.snap │ │ │ │ │ └── ActionButton.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── ActionDropdown/ │ │ │ │ ├── ActionDropdown.connect.jsx │ │ │ │ ├── ActionDropdown.connect.md │ │ │ │ ├── ActionDropdown.stories.jsx │ │ │ │ ├── ActionDropdown.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ActionDropdown.test.js.snap │ │ │ │ │ └── ActionDropdown.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── ActionFile/ │ │ │ │ ├── ActionFile.connect.jsx │ │ │ │ ├── ActionFile.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ActionFile.test.js.snap │ │ │ │ │ └── ActionFile.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── ActionIconToggle/ │ │ │ │ ├── ActionIconToggle.connect.jsx │ │ │ │ ├── ActionIconToggle.connect.md │ │ │ │ ├── ActionIconToggle.stories.jsx │ │ │ │ ├── ActionIconToggle.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ActionIconToggle.test.js.snap │ │ │ │ │ └── ActionIconToggle.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── ActionSplitDropdown/ │ │ │ │ ├── ActionSplitDropdown.connect.jsx │ │ │ │ ├── ActionSplitDropdown.stories.jsx │ │ │ │ ├── ActionSplitDropdown.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ActionSplitDropdown.test.js.snap │ │ │ │ │ └── ActionSplitDropdown.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Actions/ │ │ │ │ ├── Actions.connect.js │ │ │ │ ├── Actions.stories.jsx │ │ │ │ ├── Actions.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Actions.test.js.snap │ │ │ │ │ └── Actions.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── AppLoader/ │ │ │ │ ├── AppLoader.connect.jsx │ │ │ │ ├── AppLoader.connect.test.jsx │ │ │ │ ├── AppLoader.md │ │ │ │ ├── AppLoader.saga.js │ │ │ │ ├── AppLoader.saga.test.jsx │ │ │ │ ├── AppLoader.stories.jsx │ │ │ │ └── index.js │ │ │ ├── Badge/ │ │ │ │ ├── Badge.component.js │ │ │ │ ├── Badge.test.jsx │ │ │ │ └── index.js │ │ │ ├── Breadcrumbs/ │ │ │ │ ├── Breadcrumbs.connect.jsx │ │ │ │ ├── Breadcrumbs.stories.jsx │ │ │ │ ├── Breadcrumbs.test.jsx │ │ │ │ └── index.js │ │ │ ├── ComponentForm/ │ │ │ │ ├── ComponentForm.actions.js │ │ │ │ ├── ComponentForm.actions.test.jsx │ │ │ │ ├── ComponentForm.component.jsx │ │ │ │ ├── ComponentForm.md │ │ │ │ ├── ComponentForm.puml │ │ │ │ ├── ComponentForm.saga.test.jsx │ │ │ │ ├── ComponentForm.sagas.js │ │ │ │ ├── ComponentForm.selectors.js │ │ │ │ ├── ComponentForm.selectors.test.jsx │ │ │ │ ├── ComponentForm.test.jsx │ │ │ │ ├── ComponentForm.test.schema.json │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ComponentForm.test.js.snap │ │ │ │ │ └── ComponentForm.test.jsx.snap │ │ │ │ ├── fields/ │ │ │ │ │ ├── MultiSelect/ │ │ │ │ │ │ ├── MultiSelect.component.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ └── TextMode.component.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── NameResolver/ │ │ │ │ │ │ ├── NameResolver.component.jsx │ │ │ │ │ │ ├── NameResolver.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── index.js │ │ │ │ └── kit/ │ │ │ │ ├── createTriggers.js │ │ │ │ ├── createTriggers.test.jsx │ │ │ │ ├── defaultRegistry.js │ │ │ │ ├── defaultRegistry.md │ │ │ │ ├── defaultRegistry.test.jsx │ │ │ │ ├── flatten.js │ │ │ │ ├── flatten.test.jsx │ │ │ │ └── index.js │ │ │ ├── ConfirmDialog/ │ │ │ │ ├── ConfirmDialog.connect.js │ │ │ │ ├── ConfirmDialog.container.jsx │ │ │ │ ├── ConfirmDialog.stories.jsx │ │ │ │ ├── ConfirmDialog.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── ConfirmDialog.test.jsx.snap │ │ │ │ ├── index.js │ │ │ │ └── showHideConfirmDialog.js │ │ │ ├── DeleteResource/ │ │ │ │ ├── DeleteResource.connect.js │ │ │ │ ├── DeleteResource.container.jsx │ │ │ │ ├── DeleteResource.stories.jsx │ │ │ │ ├── DeleteResource.test.jsx │ │ │ │ ├── README.md │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── DeleteResource.test.js.snap │ │ │ │ │ └── DeleteResource.test.jsx.snap │ │ │ │ ├── actions.js │ │ │ │ ├── actions.test.jsx │ │ │ │ ├── constants.js │ │ │ │ ├── index.js │ │ │ │ ├── sagas.js │ │ │ │ └── sagas.test.jsx │ │ │ ├── EditableText/ │ │ │ │ ├── EditableText.connect.js │ │ │ │ ├── EditableText.container.jsx │ │ │ │ ├── EditableText.selectors.js │ │ │ │ ├── EditableText.stories.jsx │ │ │ │ ├── EditableText.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── EditableText.test.js.snap │ │ │ │ │ └── EditableText.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── FilterBar/ │ │ │ │ ├── FilterBar.connect.js │ │ │ │ ├── FilterBar.container.jsx │ │ │ │ ├── FilterBar.selectors.js │ │ │ │ ├── FilterBar.stories.jsx │ │ │ │ ├── FilterBar.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── FilterBar.test.js.snap │ │ │ │ │ └── FilterBar.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Form/ │ │ │ │ ├── Form.connect.js │ │ │ │ ├── Form.container.jsx │ │ │ │ ├── Form.md │ │ │ │ ├── Form.stories.jsx │ │ │ │ ├── Form.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Form.test.js.snap │ │ │ │ │ └── Form.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── GuidedTour/ │ │ │ │ ├── GuidedTour.connect.js │ │ │ │ ├── GuidedTour.constants.js │ │ │ │ ├── GuidedTour.container.jsx │ │ │ │ ├── GuidedTour.sagas.js │ │ │ │ ├── GuidedTour.sagas.test.jsx │ │ │ │ ├── GuidedTour.stories.jsx │ │ │ │ ├── GuidedTour.test.jsx │ │ │ │ ├── README.md │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── GuidedTour.test.js.snap │ │ │ │ │ └── GuidedTour.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── HeaderBar/ │ │ │ │ ├── HeaderBar.actions.js │ │ │ │ ├── HeaderBar.connect.js │ │ │ │ ├── HeaderBar.constant.js │ │ │ │ ├── HeaderBar.container.jsx │ │ │ │ ├── HeaderBar.md │ │ │ │ ├── HeaderBar.sagas.js │ │ │ │ ├── HeaderBar.sagas.test.jsx │ │ │ │ ├── HeaderBar.test.jsx │ │ │ │ └── index.js │ │ │ ├── HomeListView/ │ │ │ │ ├── HomeListView.component.jsx │ │ │ │ ├── HomeListView.component.test.jsx │ │ │ │ ├── HomeListView.connect.js │ │ │ │ ├── HomeListView.connect.test.jsx │ │ │ │ ├── HomeListView.stories.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── HomeListView.connect.test.js.snap │ │ │ │ │ └── HomeListView.connect.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── List/ │ │ │ │ ├── List.connect.js │ │ │ │ ├── List.constant.js │ │ │ │ ├── List.container.jsx │ │ │ │ ├── List.md │ │ │ │ ├── List.sagas.js │ │ │ │ ├── List.sagas.test.jsx │ │ │ │ ├── List.stories.jsx │ │ │ │ ├── List.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── List.test.jsx.snap │ │ │ │ ├── index.js │ │ │ │ ├── selector.js │ │ │ │ └── selector.test.jsx │ │ │ ├── Notification/ │ │ │ │ ├── Notification.actions.js │ │ │ │ ├── Notification.connect.js │ │ │ │ ├── Notification.constants.js │ │ │ │ ├── Notification.container.jsx │ │ │ │ ├── Notification.sagas.js │ │ │ │ ├── Notification.sagas.test.jsx │ │ │ │ ├── Notification.stories.jsx │ │ │ │ ├── Notification.test.jsx │ │ │ │ ├── README.md │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── Notification.test.jsx.snap │ │ │ │ ├── clearNotifications.js │ │ │ │ ├── index.js │ │ │ │ └── pushNotification.js │ │ │ ├── ObjectViewer/ │ │ │ │ ├── ObjectViewer.connect.js │ │ │ │ ├── ObjectViewer.container.jsx │ │ │ │ ├── ObjectViewer.stories.jsx │ │ │ │ ├── ObjectViewer.test.jsx │ │ │ │ └── index.js │ │ │ ├── PieChartButton/ │ │ │ │ ├── PieChartButton.connect.jsx │ │ │ │ ├── PieChartButton.stories.jsx │ │ │ │ ├── PieChartButton.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── PieChartButton.test.js.snap │ │ │ │ │ └── PieChartButton.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── Redirect/ │ │ │ │ ├── Redirect.container.jsx │ │ │ │ ├── Redirect.test.jsx │ │ │ │ └── index.js │ │ │ ├── SelectObject/ │ │ │ │ ├── SelectObject.component.jsx │ │ │ │ ├── SelectObject.component.test.jsx │ │ │ │ ├── SelectObject.connect.js │ │ │ │ ├── SelectObject.connect.test.jsx │ │ │ │ ├── SelectObject.container.jsx │ │ │ │ ├── SelectObject.container.test.jsx │ │ │ │ ├── SelectObject.module.css │ │ │ │ ├── SelectObject.stories.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── SelectObject.component.test.js.snap │ │ │ │ │ ├── SelectObject.component.test.jsx.snap │ │ │ │ │ └── SelectObject.container.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── ShortcutManager/ │ │ │ │ ├── ShortcutManager.connect.js │ │ │ │ ├── ShortcutManager.container.js │ │ │ │ ├── ShortcutManager.test.jsx │ │ │ │ └── index.js │ │ │ ├── SidePanel/ │ │ │ │ ├── SidePanel.connect.js │ │ │ │ ├── SidePanel.container.jsx │ │ │ │ ├── SidePanel.md │ │ │ │ ├── SidePanel.stories.jsx │ │ │ │ ├── SidePanel.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── SidePanel.test.js.snap │ │ │ │ │ └── SidePanel.test.jsx.snap │ │ │ │ ├── constants.js │ │ │ │ └── index.js │ │ │ ├── Slider/ │ │ │ │ ├── Slider.connect.js │ │ │ │ ├── Slider.container.jsx │ │ │ │ ├── Slider.selectors.js │ │ │ │ ├── Slider.stories.jsx │ │ │ │ ├── Slider.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Slider.test.js.snap │ │ │ │ │ └── Slider.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── SubHeaderBar/ │ │ │ │ ├── SubHeaderBar.connect.js │ │ │ │ ├── SubHeaderBar.container.jsx │ │ │ │ ├── SubHeaderBar.md │ │ │ │ ├── SubHeaderBar.selectors.js │ │ │ │ ├── SubHeaderBar.stories.jsx │ │ │ │ ├── SubHeaderBar.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── SubHeaderBar.test.js.snap │ │ │ │ │ └── SubHeaderBar.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── TabBar/ │ │ │ │ ├── TabBar.connect.js │ │ │ │ ├── TabBar.selectors.js │ │ │ │ ├── TabBar.stories.jsx │ │ │ │ ├── TabBar.test.jsx │ │ │ │ └── index.js │ │ │ ├── TreeView/ │ │ │ │ ├── TreeView.container.jsx │ │ │ │ ├── TreeView.stories.jsx │ │ │ │ ├── TreeView.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── TreeView.test.js.snap │ │ │ │ │ └── TreeView.test.jsx.snap │ │ │ │ ├── index.js │ │ │ │ └── index.test.jsx │ │ │ ├── Typeahead/ │ │ │ │ ├── Typeahead.connect.js │ │ │ │ ├── Typeahead.container.jsx │ │ │ │ ├── Typeahead.stories.jsx │ │ │ │ ├── Typeahead.test.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Typeahead.test.js.snap │ │ │ │ │ └── Typeahead.test.jsx.snap │ │ │ │ └── index.js │ │ │ ├── actionAPI.js │ │ │ ├── actionAPI.test.jsx │ │ │ ├── actionOnClick.js │ │ │ ├── actionOnClick.test.jsx │ │ │ ├── cmfModule.js │ │ │ ├── constant.js │ │ │ ├── containers.js │ │ │ ├── index.js │ │ │ ├── mock.settings.json │ │ │ ├── register.js │ │ │ ├── register.test.jsx │ │ │ ├── renderers.js │ │ │ ├── test-setup.js │ │ │ └── translate.js │ │ ├── stylelint.config.mjs │ │ ├── talend-i18n.json │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── dataviz/ │ │ ├── .babelrc.json │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .storybook/ │ │ │ ├── main.ts │ │ │ └── preview.ts │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── assets/ │ │ │ └── maps/ │ │ │ ├── CA.topo.json │ │ │ ├── FR.topo.json │ │ │ ├── MX.topo.json │ │ │ ├── US.topo.json │ │ │ ├── US_CA.topo.json │ │ │ ├── continents.topo.json │ │ │ └── world.topo.json │ │ ├── eslint.config.mjs │ │ ├── i18next-scanner.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── BarChart/ │ │ │ │ │ ├── ColoredBar/ │ │ │ │ │ │ ├── ColoredBar.component.module.css │ │ │ │ │ │ └── ColoredBar.component.tsx │ │ │ │ │ ├── HorizontalBarChart/ │ │ │ │ │ │ ├── HorizontalBarChart.component.module.css │ │ │ │ │ │ ├── HorizontalBarChart.component.test.tsx │ │ │ │ │ │ ├── HorizontalBarChart.component.tsx │ │ │ │ │ │ ├── HorizontalBarChart.stories.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── HorizontalBarChart.component.test.tsx.snap │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── TooltipCursor/ │ │ │ │ │ │ ├── TooltipCursor.component.module.css │ │ │ │ │ │ └── TooltipCursor.component.tsx │ │ │ │ │ ├── VerticalBarChart/ │ │ │ │ │ │ ├── VerticalBarChart.component.module.css │ │ │ │ │ │ ├── VerticalBarChart.component.test.tsx │ │ │ │ │ │ ├── VerticalBarChart.component.tsx │ │ │ │ │ │ ├── VerticalBarChart.stories.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── VerticalBarChart.component.test.tsx.snap │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── _bar-chart.scss │ │ │ │ │ ├── barChart.tooltip.test.ts │ │ │ │ │ ├── barChart.tooltip.ts │ │ │ │ │ ├── barChart.types.ts │ │ │ │ │ ├── useBarChart.hook.tsx │ │ │ │ │ └── useBarChartHook.test.ts │ │ │ │ ├── BoxPlot/ │ │ │ │ │ ├── BoxPlot.component.module.css │ │ │ │ │ ├── BoxPlot.component.test.tsx │ │ │ │ │ ├── BoxPlot.component.tsx │ │ │ │ │ ├── BoxPlot.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── BoxPlot.component.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── ChartPanel/ │ │ │ │ │ └── VerticalChartFilter/ │ │ │ │ │ ├── VerticalChartFilter.component.module.css │ │ │ │ │ ├── VerticalChartFilter.component.test.tsx │ │ │ │ │ ├── VerticalChartFilter.component.tsx │ │ │ │ │ ├── VerticalChartFilter.stories.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── GeoChart/ │ │ │ │ │ ├── GeoChart.component.tsx │ │ │ │ │ ├── GeoChart.module.css │ │ │ │ │ ├── GeoChart.stories.tsx │ │ │ │ │ ├── GeoChart.test.jsx │ │ │ │ │ ├── GeoChart.utils.ts │ │ │ │ │ ├── README.md │ │ │ │ │ └── index.ts │ │ │ │ ├── KeyValueTooltip/ │ │ │ │ │ ├── KeyValueTooltip.component.module.css │ │ │ │ │ ├── KeyValueTooltip.component.test.tsx │ │ │ │ │ ├── KeyValueTooltip.component.tsx │ │ │ │ │ ├── KeyValueTooltip.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── KeyValueTooltip.component.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── LineChart/ │ │ │ │ │ ├── LineChart.component.test.tsx │ │ │ │ │ ├── LineChart.component.tsx │ │ │ │ │ ├── LineChart.module.css │ │ │ │ │ ├── LineChart.stories.tsx │ │ │ │ │ ├── LineChart.types.ts │ │ │ │ │ ├── LineChartLegend.component.tsx │ │ │ │ │ ├── LineChartLineIcon.component.tsx │ │ │ │ │ ├── LineChartTooltip.component.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── RangeFilter/ │ │ │ │ │ ├── RangeFilter.component.module.css │ │ │ │ │ ├── RangeFilter.component.stories.tsx │ │ │ │ │ ├── RangeFilter.component.test.tsx │ │ │ │ │ ├── RangeFilter.component.tsx │ │ │ │ │ ├── handlers/ │ │ │ │ │ │ ├── DateRangeHandler/ │ │ │ │ │ │ │ ├── DateRangeHandler.test.tsx │ │ │ │ │ │ │ └── DateRangeHandler.tsx │ │ │ │ │ │ ├── DateTimeRangeHandler/ │ │ │ │ │ │ │ ├── DateTimeInputField.component.module.css │ │ │ │ │ │ │ ├── DateTimeRangeHandler.test.tsx │ │ │ │ │ │ │ └── DateTimeRangeHandler.tsx │ │ │ │ │ │ ├── IntegerRangeHandler/ │ │ │ │ │ │ │ ├── IntegerRangeHandler.test.tsx │ │ │ │ │ │ │ └── IntegerRangeHandler.tsx │ │ │ │ │ │ ├── NumberRangeHandler/ │ │ │ │ │ │ │ ├── NumberInputField.component.module.css │ │ │ │ │ │ │ ├── NumberRangeHandler.test.tsx │ │ │ │ │ │ │ └── NumberRangeHandler.tsx │ │ │ │ │ │ ├── TimeRangeHandler/ │ │ │ │ │ │ │ ├── TimeRangeHandler.test.tsx │ │ │ │ │ │ │ └── TimeRangeHandler.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── range-handler.types.ts │ │ │ │ │ │ ├── slider-ticks.utils.test.ts │ │ │ │ │ │ ├── slider-ticks.utils.ts │ │ │ │ │ │ └── useRangeInputField.hook.ts │ │ │ │ │ └── index.ts │ │ │ │ └── Tooltip/ │ │ │ │ ├── Tooltip.component.module.css │ │ │ │ └── Tooltip.component.tsx │ │ │ ├── constants.ts │ │ │ ├── formatters/ │ │ │ │ ├── formatters.test.ts │ │ │ │ └── formatters.ts │ │ │ ├── index.ts │ │ │ ├── setupTests.ts │ │ │ └── types/ │ │ │ ├── index.ts │ │ │ └── types.d.ts │ │ ├── stylelint.config.mjs │ │ ├── talend-i18n.json │ │ ├── talend-scripts.json │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── design-docs/ │ │ ├── .babelrc.json │ │ ├── .storybook/ │ │ │ ├── .babelrc │ │ │ ├── main.mjs │ │ │ ├── manager-head.html │ │ │ ├── manager.mjs │ │ │ ├── preview-head.html │ │ │ ├── preview.mjs │ │ │ └── vite.config.ts │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── netlify.toml │ │ ├── package.json │ │ ├── src/ │ │ │ ├── GettingStarted.mdx │ │ │ ├── Principles.mdx │ │ │ ├── StatusTable.module.css │ │ │ ├── StatusTable.tsx │ │ │ ├── Statuses.mdx │ │ │ ├── Welcome.mdx │ │ │ ├── Welcome.module.css │ │ │ ├── WelcomeImage.tsx │ │ │ ├── content/ │ │ │ │ ├── Capitalization.mdx │ │ │ │ ├── Conventions.mdx │ │ │ │ ├── Internationalization.mdx │ │ │ │ ├── VoiceAndTone.mdx │ │ │ │ └── Wording.mdx │ │ │ ├── index.ts │ │ │ ├── status.json │ │ │ ├── tokens/ │ │ │ │ ├── A-About.mdx │ │ │ │ ├── AB-Colors.mdx │ │ │ │ ├── AC-ColorComposition.mdx │ │ │ │ ├── Borders.mdx │ │ │ │ ├── Brandings.mdx │ │ │ │ ├── BreakPoints.mdx │ │ │ │ ├── ColorChecker.tsx │ │ │ │ ├── ColorComposition.module.css │ │ │ │ ├── ColorComposition.tsx │ │ │ │ ├── ColorCompositions.json │ │ │ │ ├── Elevations.mdx │ │ │ │ ├── ExampleCard.module.css │ │ │ │ ├── ExampleCard.tsx │ │ │ │ ├── Gradients.mdx │ │ │ │ ├── Mesures.mdx │ │ │ │ ├── Opacity.mdx │ │ │ │ ├── Radius.mdx │ │ │ │ ├── Shadows.mdx │ │ │ │ ├── TokenFormatter.ts │ │ │ │ ├── TokenValue.module.css │ │ │ │ ├── TokenValue.tsx │ │ │ │ ├── Transitions.mdx │ │ │ │ ├── Transitions.module.css │ │ │ │ └── Typography.mdx │ │ │ └── types.d.ts │ │ ├── stylelint.config.mjs │ │ ├── talend-scripts.json │ │ └── tsconfig.json │ ├── design-system/ │ │ ├── .babelrc │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .prettierrc.js │ │ ├── .storybook/ │ │ │ ├── main.mjs │ │ │ └── preview.mjs │ │ ├── CHANGELOG.md │ │ ├── CONTRIBUTING.md │ │ ├── DOCTEMPLATE.md │ │ ├── LICENSE │ │ ├── MIGRATING.md │ │ ├── README.md │ │ ├── custom.d.ts │ │ ├── eslint.config.mjs │ │ ├── i18next-scanner.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── Accordion/ │ │ │ │ │ ├── Accordion.test.tsx │ │ │ │ │ ├── Accordion.tsx │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── CollapsiblePanel.module.css │ │ │ │ │ │ ├── CollapsiblePanel.tsx │ │ │ │ │ │ ├── CollapsiblePanelHeader.module.css │ │ │ │ │ │ ├── CollapsiblePanelHeader.tsx │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Accordion.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Badge/ │ │ │ │ │ ├── Badge.test.tsx │ │ │ │ │ ├── Badge.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Badge.test.tsx.snap │ │ │ │ │ ├── button/ │ │ │ │ │ │ ├── BadgeButton.module.css │ │ │ │ │ │ └── BadgeButton.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── primitive/ │ │ │ │ │ │ ├── BadgePrimitive.module.css │ │ │ │ │ │ └── BadgePrimitive.tsx │ │ │ │ │ └── variants/ │ │ │ │ │ ├── BadgeDropdown.module.css │ │ │ │ │ ├── BadgeDropdown.tsx │ │ │ │ │ ├── BadgePopover.tsx │ │ │ │ │ ├── BadgeTag.tsx │ │ │ │ │ ├── BadgeValue.module.css │ │ │ │ │ └── BadgeValue.tsx │ │ │ │ ├── Breadcrumbs/ │ │ │ │ │ ├── Breadcrumbs.module.css │ │ │ │ │ ├── Breadcrumbs.test.tsx │ │ │ │ │ ├── Breadcrumbs.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Breadcrumbs.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Button/ │ │ │ │ │ ├── Button.test.tsx │ │ │ │ │ ├── Button.tsx │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── ButtonPrimitive.tsx │ │ │ │ │ │ └── ButtonStyles.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Button.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── ButtonDestructive.module.css │ │ │ │ │ ├── ButtonDestructive.tsx │ │ │ │ │ ├── ButtonPrimary.module.css │ │ │ │ │ ├── ButtonPrimary.tsx │ │ │ │ │ ├── ButtonSecondary.module.css │ │ │ │ │ ├── ButtonSecondary.tsx │ │ │ │ │ ├── ButtonTertiary.module.css │ │ │ │ │ └── ButtonTertiary.tsx │ │ │ │ ├── ButtonAsLink/ │ │ │ │ │ ├── ButtonAsLink.test.tsx │ │ │ │ │ ├── ButtonAsLink.tsx │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── ButtonPrimitiveAsLink.module.css │ │ │ │ │ │ └── ButtonPrimitiveAsLink.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── ButtonAsLink.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── ButtonDestructiveAsLink.tsx │ │ │ │ │ ├── ButtonPrimaryAsLink.tsx │ │ │ │ │ ├── ButtonSecondaryAsLink.tsx │ │ │ │ │ └── ButtonTertiaryAsLink.tsx │ │ │ │ ├── ButtonIcon/ │ │ │ │ │ ├── ButtonIcon.test.tsx │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── ButtonIcon.module.css │ │ │ │ │ │ └── ButtonIconPrimitive.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── ButtonIcon.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── ButtonIcon.tsx │ │ │ │ │ ├── ButtonIconFloating.tsx │ │ │ │ │ └── ButtonIconToggle.tsx │ │ │ │ ├── Card/ │ │ │ │ │ ├── Card.module.css │ │ │ │ │ ├── Card.test.tsx │ │ │ │ │ ├── Card.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Card.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Clickable/ │ │ │ │ │ ├── Clickable.module.css │ │ │ │ │ ├── Clickable.tsx │ │ │ │ │ ├── Clikable.test.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Clikable.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Combobox/ │ │ │ │ │ ├── Combobox.module.css │ │ │ │ │ ├── Combobox.test.tsx │ │ │ │ │ ├── Combobox.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Combobox.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Disclosure/ │ │ │ │ │ ├── Disclosure.tsx │ │ │ │ │ └── DisclosureContext.ts │ │ │ │ ├── Divider/ │ │ │ │ │ ├── Divider.module.css │ │ │ │ │ ├── Divider.test.tsx │ │ │ │ │ ├── Divider.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Divider.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Drawer/ │ │ │ │ │ ├── Drawer.test.tsx │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── PrimitiveDrawer.module.css │ │ │ │ │ │ └── PrimitiveDrawer.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Drawer.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variants/ │ │ │ │ │ └── FloatingDrawer/ │ │ │ │ │ ├── FloatingDrawer.module.css │ │ │ │ │ └── FloatingDrawer.tsx │ │ │ │ ├── Dropdown/ │ │ │ │ │ ├── Dropdown.cy.tsx │ │ │ │ │ ├── Dropdown.test.tsx │ │ │ │ │ ├── Dropdown.tsx │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── DropdownButton.tsx │ │ │ │ │ │ ├── DropdownDivider.module.css │ │ │ │ │ │ ├── DropdownDivider.tsx │ │ │ │ │ │ ├── DropdownEntry.module.css │ │ │ │ │ │ ├── DropdownLink.tsx │ │ │ │ │ │ ├── DropdownShell.module.css │ │ │ │ │ │ ├── DropdownShell.tsx │ │ │ │ │ │ ├── DropdownTitle.module.css │ │ │ │ │ │ └── DropdownTitle.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Dropdown.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── EmptyState/ │ │ │ │ │ ├── EmptyState.test.tsx │ │ │ │ │ ├── EmptyState.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── EmptyState.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── primitive/ │ │ │ │ │ │ ├── EmptyStatePrimitive.module.css │ │ │ │ │ │ └── EmptyStatePrimitive.tsx │ │ │ │ │ └── variants/ │ │ │ │ │ ├── EmptyStateLarge.tsx │ │ │ │ │ ├── EmptyStateMedium.tsx │ │ │ │ │ └── EmptyStateSmall.tsx │ │ │ │ ├── Enumeration/ │ │ │ │ │ ├── Enumeration.component.tsx │ │ │ │ │ ├── Enumeration.module.css │ │ │ │ │ ├── Enumeration.types.tsx │ │ │ │ │ ├── EnumerationHeader/ │ │ │ │ │ │ ├── EnumerationHeader.component.tsx │ │ │ │ │ │ ├── EnumerationHeader.module.css │ │ │ │ │ │ └── EnumerationIHeader.types.tsx │ │ │ │ │ ├── EnumerationItem/ │ │ │ │ │ │ ├── EnumerationItem.component.tsx │ │ │ │ │ │ ├── EnumerationItem.module.css │ │ │ │ │ │ └── EnumerationItem.types.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ErrorState/ │ │ │ │ │ ├── ErrorState.module.css │ │ │ │ │ ├── ErrorState.test.tsx │ │ │ │ │ ├── ErrorState.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── ErrorState.test.tsx.snap │ │ │ │ │ ├── illutstrations/ │ │ │ │ │ │ └── ErrorIllustration.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Form/ │ │ │ │ │ ├── Affix/ │ │ │ │ │ │ ├── AffixStyles.module.css │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── variations/ │ │ │ │ │ │ ├── AffixButton.tsx │ │ │ │ │ │ ├── AffixReadOnly.tsx │ │ │ │ │ │ └── AffixSelect.tsx │ │ │ │ │ ├── Buttons/ │ │ │ │ │ │ ├── Buttons.module.css │ │ │ │ │ │ ├── Buttons.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Field/ │ │ │ │ │ │ ├── Datalist/ │ │ │ │ │ │ │ ├── Datalist.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── Input/ │ │ │ │ │ │ │ ├── Input.Checkbox.tsx │ │ │ │ │ │ │ ├── Input.Color.tsx │ │ │ │ │ │ │ ├── Input.Copy.tsx │ │ │ │ │ │ │ ├── Input.Date.tsx │ │ │ │ │ │ │ ├── Input.DatetimeLocal.tsx │ │ │ │ │ │ │ ├── Input.Email.tsx │ │ │ │ │ │ │ ├── Input.File.module.css │ │ │ │ │ │ │ ├── Input.File.tsx │ │ │ │ │ │ │ ├── Input.Hidden.tsx │ │ │ │ │ │ │ ├── Input.Month.tsx │ │ │ │ │ │ │ ├── Input.Number.tsx │ │ │ │ │ │ │ ├── Input.Radio.tsx │ │ │ │ │ │ │ ├── Input.Search.tsx │ │ │ │ │ │ │ ├── Input.Tel.tsx │ │ │ │ │ │ │ ├── Input.Text.tsx │ │ │ │ │ │ │ ├── Input.Time.tsx │ │ │ │ │ │ │ ├── Input.ToggleSwitch.module.css │ │ │ │ │ │ │ ├── Input.ToggleSwitch.tsx │ │ │ │ │ │ │ ├── Input.Url.tsx │ │ │ │ │ │ │ ├── Input.Week.tsx │ │ │ │ │ │ │ ├── Input.tsx │ │ │ │ │ │ │ ├── Password/ │ │ │ │ │ │ │ │ ├── Password.cy.tsx │ │ │ │ │ │ │ │ ├── Password.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ │ ├── passwordButton.module.css │ │ │ │ │ │ │ │ ├── useReadOnly.tsx │ │ │ │ │ │ │ │ └── useRevealPassword.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── Select/ │ │ │ │ │ │ │ ├── Select.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── Textarea/ │ │ │ │ │ │ ├── Textarea.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Fieldset/ │ │ │ │ │ │ ├── Fieldset.cy.tsx │ │ │ │ │ │ ├── Fieldset.module.css │ │ │ │ │ │ ├── Fieldset.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Form.module.css │ │ │ │ │ ├── Form.test.tsx │ │ │ │ │ ├── Form.tsx │ │ │ │ │ ├── Label/ │ │ │ │ │ │ ├── Label.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Primitives/ │ │ │ │ │ │ ├── Checkbox/ │ │ │ │ │ │ │ ├── Checkbox.module.css │ │ │ │ │ │ │ └── Checkbox.tsx │ │ │ │ │ │ ├── Field/ │ │ │ │ │ │ │ └── Field.tsx │ │ │ │ │ │ ├── Input/ │ │ │ │ │ │ │ ├── Input.module.css │ │ │ │ │ │ │ └── Input.tsx │ │ │ │ │ │ ├── InputWrapper/ │ │ │ │ │ │ │ ├── InputWrapper.module.css │ │ │ │ │ │ │ └── InputWrapper.tsx │ │ │ │ │ │ ├── Label/ │ │ │ │ │ │ │ ├── Label.module.css │ │ │ │ │ │ │ └── Label.tsx │ │ │ │ │ │ ├── Radio/ │ │ │ │ │ │ │ ├── Radio.module.css │ │ │ │ │ │ │ └── Radio.tsx │ │ │ │ │ │ ├── Select/ │ │ │ │ │ │ │ ├── Select.module.css │ │ │ │ │ │ │ ├── Select.tsx │ │ │ │ │ │ │ └── SelectNoWrapper.tsx │ │ │ │ │ │ ├── Textarea/ │ │ │ │ │ │ │ ├── Textarea.module.css │ │ │ │ │ │ │ └── Textarea.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Row/ │ │ │ │ │ │ ├── Row.module.css │ │ │ │ │ │ ├── Row.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Form.test.tsx.snap │ │ │ │ │ ├── docs/ │ │ │ │ │ │ └── data/ │ │ │ │ │ │ └── CountryCodes.json │ │ │ │ │ └── index.ts │ │ │ │ ├── Icon/ │ │ │ │ │ ├── DeprecatedIconHelper.tsx │ │ │ │ │ ├── Icon.cy.tsx │ │ │ │ │ ├── Icon.module.css │ │ │ │ │ ├── Icon.test.tsx │ │ │ │ │ ├── Icon.tsx │ │ │ │ │ ├── SizedIcon.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Icon.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── IconsProvider/ │ │ │ │ │ ├── IconsProvider.cy.tsx │ │ │ │ │ ├── IconsProvider.module.css │ │ │ │ │ ├── IconsProvider.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── InlineEditing/ │ │ │ │ │ ├── InlineEditing.test.tsx │ │ │ │ │ ├── Primitives/ │ │ │ │ │ │ ├── InlineEditingPrimitive.module.css │ │ │ │ │ │ └── InlineEditingPrimitive.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── InlineEditing.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── InlineEditing.text.tsx │ │ │ │ │ ├── InlineEditing.textarea.cy.tsx │ │ │ │ │ └── InlineEditing.textarea.tsx │ │ │ │ ├── InlineMessage/ │ │ │ │ │ ├── InlineMessage.test.tsx │ │ │ │ │ ├── InlineMessage.tsx │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── InlineMessagePrimitive.module.css │ │ │ │ │ │ └── InlineMessagePrimitive.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── InlineMessage.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── InlineMessageBeta.module.css │ │ │ │ │ ├── InlineMessageBeta.tsx │ │ │ │ │ ├── InlineMessageDestructive.module.css │ │ │ │ │ ├── InlineMessageDestructive.tsx │ │ │ │ │ ├── InlineMessageInformation.module.css │ │ │ │ │ ├── InlineMessageInformation.tsx │ │ │ │ │ ├── InlineMessageSuccess.module.css │ │ │ │ │ ├── InlineMessageSuccess.tsx │ │ │ │ │ ├── InlineMessageWarning.module.css │ │ │ │ │ └── InlineMessageWarning.tsx │ │ │ │ ├── Link/ │ │ │ │ │ ├── Link.cy.tsx │ │ │ │ │ ├── Link.module.css │ │ │ │ │ ├── Link.test.tsx │ │ │ │ │ ├── Link.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Link.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── LinkAsButton/ │ │ │ │ │ ├── LinkAsButton.cy.tsx │ │ │ │ │ ├── LinkAsButton.test.tsx │ │ │ │ │ ├── LinkAsButton.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── LinkAsButton.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Linkable/ │ │ │ │ │ ├── Linkable.test.tsx │ │ │ │ │ ├── Linkable.tsx │ │ │ │ │ ├── LinkableStyles.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Linkable.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Loading/ │ │ │ │ │ ├── Loading.test.tsx │ │ │ │ │ ├── Loading.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Loading.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Message/ │ │ │ │ │ ├── Message.test.tsx │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── MessagePrimitive.tsx │ │ │ │ │ │ └── MessageStyles.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Message.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── MessageCollectionDestructive.tsx │ │ │ │ │ ├── MessageCollectionInformation.tsx │ │ │ │ │ ├── MessageCollectionSuccess.tsx │ │ │ │ │ ├── MessageCollectionWarning.tsx │ │ │ │ │ ├── MessageDestructive.module.css │ │ │ │ │ ├── MessageDestructive.tsx │ │ │ │ │ ├── MessageInformation.module.css │ │ │ │ │ ├── MessageInformation.tsx │ │ │ │ │ ├── MessageSuccess.module.css │ │ │ │ │ ├── MessageSuccess.tsx │ │ │ │ │ ├── MessageWarning.module.css │ │ │ │ │ └── MessageWarning.tsx │ │ │ │ ├── Modal/ │ │ │ │ │ ├── Modal.module.css │ │ │ │ │ ├── Modal.test.tsx │ │ │ │ │ ├── Modal.tsx │ │ │ │ │ ├── Primitives/ │ │ │ │ │ │ ├── Dialog.tsx │ │ │ │ │ │ ├── DialogBackdrop.tsx │ │ │ │ │ │ ├── DialogState.ts │ │ │ │ │ │ └── Portal.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Modal.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Popover/ │ │ │ │ │ ├── Popover.cy.tsx │ │ │ │ │ ├── Popover.module.css │ │ │ │ │ ├── Popover.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── usePopover.tsx │ │ │ │ ├── QualityBar/ │ │ │ │ │ ├── QualityBar.component.test.tsx │ │ │ │ │ ├── QualityBar.component.tsx │ │ │ │ │ ├── QualityBar.stories.tsx │ │ │ │ │ ├── QualityBar.types.ts │ │ │ │ │ ├── QualityBarRatioBars.component.tsx │ │ │ │ │ ├── QualityRatioBar.component.tsx │ │ │ │ │ ├── QualityRatioBar.module.css │ │ │ │ │ ├── QualityRatioBar.utils.ts │ │ │ │ │ ├── SplitQualityBar.component.tsx │ │ │ │ │ ├── SplitQualityBar.stories.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── RatioBar/ │ │ │ │ │ ├── RatioBar.component.test.jsx │ │ │ │ │ ├── RatioBar.component.tsx │ │ │ │ │ ├── RatioBar.module.css │ │ │ │ │ ├── RatioBar.stories.tsx │ │ │ │ │ ├── RatioBarComposition.component.tsx │ │ │ │ │ ├── RatioBarLines.component.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── RatioBar.component.test.jsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── RichRadioButton/ │ │ │ │ │ ├── RichRadioButton.component.tsx │ │ │ │ │ ├── RichRadioButton.module.css │ │ │ │ │ ├── RichRadioButton.types.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Skeleton/ │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── Skeleton.Primitive.tsx │ │ │ │ │ │ └── Skeleton.module.css │ │ │ │ │ ├── Skeleton.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── SkeletonButton.module.css │ │ │ │ │ ├── SkeletonButton.tsx │ │ │ │ │ ├── SkeletonButtonIcon.module.css │ │ │ │ │ ├── SkeletonButtonIcon.tsx │ │ │ │ │ ├── SkeletonHeading.module.css │ │ │ │ │ ├── SkeletonHeading.tsx │ │ │ │ │ ├── SkeletonInput.module.css │ │ │ │ │ ├── SkeletonInput.tsx │ │ │ │ │ ├── SkeletonParagraph.module.css │ │ │ │ │ ├── SkeletonParagraph.tsx │ │ │ │ │ ├── SkeletonSized.module.css │ │ │ │ │ └── SkeletonSized.tsx │ │ │ │ ├── Stack/ │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── StackPrimitive.module.css │ │ │ │ │ │ ├── StackPrimitive.test.tsx │ │ │ │ │ │ └── StackPrimitive.tsx │ │ │ │ │ ├── StackHorizontal.tsx │ │ │ │ │ ├── StackItem.module.css │ │ │ │ │ ├── StackItem.tsx │ │ │ │ │ ├── StackVertical.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Status/ │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── Status.module.css │ │ │ │ │ │ ├── StatusPrimitive.test.tsx │ │ │ │ │ │ └── StatusPrimitive.tsx │ │ │ │ │ ├── Status.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── StatusCanceled.tsx │ │ │ │ │ ├── StatusFailed.tsx │ │ │ │ │ ├── StatusInProgress.tsx │ │ │ │ │ ├── StatusSuccessful.tsx │ │ │ │ │ └── StatusWarning.tsx │ │ │ │ ├── StatusDot/ │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── StatusDotPrimitive.module.css │ │ │ │ │ │ ├── StatusDotPrimitive.test.tsx │ │ │ │ │ │ └── StatusDotPrimitive.tsx │ │ │ │ │ ├── StatusDot.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── StatusDotBeta.tsx │ │ │ │ │ ├── StatusDotError.tsx │ │ │ │ │ ├── StatusDotInformation.tsx │ │ │ │ │ ├── StatusDotSuccess.tsx │ │ │ │ │ └── StatusDotWarning.tsx │ │ │ │ ├── Stepper/ │ │ │ │ │ ├── Progress/ │ │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ │ ├── Progress.module.css │ │ │ │ │ │ │ └── Progress.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── variations/ │ │ │ │ │ │ ├── Progress.horizontal.module.css │ │ │ │ │ │ ├── Progress.horizontal.tsx │ │ │ │ │ │ ├── Progress.vertical.module.css │ │ │ │ │ │ └── Progress.vertical.tsx │ │ │ │ │ ├── Step/ │ │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ │ ├── Step.module.css │ │ │ │ │ │ │ └── Step.tsx │ │ │ │ │ │ ├── Step.cy.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── variations/ │ │ │ │ │ │ ├── Step.Skeleton.module.css │ │ │ │ │ │ ├── Step.disabled.tsx │ │ │ │ │ │ ├── Step.enabled.tsx │ │ │ │ │ │ ├── Step.error.tsx │ │ │ │ │ │ ├── Step.progress.tsx │ │ │ │ │ │ ├── Step.skeleton.tsx │ │ │ │ │ │ └── Step.validated.tsx │ │ │ │ │ ├── Stepper.cy.tsx │ │ │ │ │ ├── Stepper.module.css │ │ │ │ │ ├── Stepper.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── Stepper.horizontal.tsx │ │ │ │ │ └── Stepper.vertical.tsx │ │ │ │ ├── Switch/ │ │ │ │ │ ├── Switch.module.css │ │ │ │ │ ├── Switch.test.tsx │ │ │ │ │ ├── Switch.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Switch.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Tabs/ │ │ │ │ │ ├── Primitive/ │ │ │ │ │ │ ├── TabPanel.tsx │ │ │ │ │ │ ├── TabStyles.module.css │ │ │ │ │ │ ├── Tabs.tsx │ │ │ │ │ │ └── TabsProvider.tsx │ │ │ │ │ ├── Tabs.test.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Tabs.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── variants/ │ │ │ │ │ └── Tabs.tsx │ │ │ │ ├── Tag/ │ │ │ │ │ ├── Tag.cy.tsx │ │ │ │ │ ├── Tag.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── primitive/ │ │ │ │ │ │ ├── TagPrimitive.module.css │ │ │ │ │ │ ├── TagPrimitive.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── variations/ │ │ │ │ │ ├── TagBeta.module.css │ │ │ │ │ ├── TagBeta.tsx │ │ │ │ │ ├── TagDefault.module.css │ │ │ │ │ ├── TagDefault.tsx │ │ │ │ │ ├── TagDestructive.module.css │ │ │ │ │ ├── TagDestructive.tsx │ │ │ │ │ ├── TagInformation.module.css │ │ │ │ │ ├── TagInformation.tsx │ │ │ │ │ ├── TagSuccess.module.css │ │ │ │ │ ├── TagSuccess.tsx │ │ │ │ │ ├── TagWarning.module.css │ │ │ │ │ ├── TagWarning.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ThemeProvider/ │ │ │ │ │ ├── ThemeContext/ │ │ │ │ │ │ ├── ThemeContext.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ThemeProvider.css │ │ │ │ │ ├── ThemeProvider.tsx │ │ │ │ │ ├── ThemeSwitcher/ │ │ │ │ │ │ ├── ThemeSwitcher.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── ThemeProviderWithoutGlobals/ │ │ │ │ │ ├── ThemeProviderWithoutGlobals.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Tooltip/ │ │ │ │ │ ├── Tooltip.cy.tsx │ │ │ │ │ ├── Tooltip.module.css │ │ │ │ │ ├── Tooltip.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── VisuallyHidden/ │ │ │ │ │ ├── VisuallyHidden.module.css │ │ │ │ │ ├── VisuallyHidden.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── constants.ts │ │ │ │ └── illustrations/ │ │ │ │ ├── IconActivity.tsx │ │ │ │ ├── IconChart.tsx │ │ │ │ ├── IconChecklist.tsx │ │ │ │ ├── IconDefault.module.css │ │ │ │ ├── IconDefault.tsx │ │ │ │ ├── IconDocument.tsx │ │ │ │ ├── IconFlask.tsx │ │ │ │ ├── IconInProgress.tsx │ │ │ │ ├── IconLightBulb.tsx │ │ │ │ ├── IconMessage.tsx │ │ │ │ ├── IconPlug.tsx │ │ │ │ ├── IconRocket.tsx │ │ │ │ ├── IconSearch.tsx │ │ │ │ ├── IconSettings.tsx │ │ │ │ ├── IconUpdate.tsx │ │ │ │ ├── IconUser.tsx │ │ │ │ ├── IconWarning.tsx │ │ │ │ ├── SpotDefault.module.css │ │ │ │ ├── SpotDefault.tsx │ │ │ │ └── index.ts │ │ │ ├── declare.d.ts │ │ │ ├── index.ts │ │ │ ├── mergeRef.ts │ │ │ ├── renderChildren.ts │ │ │ ├── renderOrClone.ts │ │ │ ├── stories/ │ │ │ │ ├── Status.block.tsx │ │ │ │ ├── clickable/ │ │ │ │ │ ├── About.mdx │ │ │ │ │ ├── Button.mdx │ │ │ │ │ ├── Button.stories.tsx │ │ │ │ │ ├── ButtonAsLink.mdx │ │ │ │ │ ├── ButtonAsLink.stories.tsx │ │ │ │ │ ├── ButtonIcon.mdx │ │ │ │ │ ├── ButtonIcon.stories.tsx │ │ │ │ │ ├── Dropdown.mdx │ │ │ │ │ ├── Dropdown.stories.tsx │ │ │ │ │ ├── Link.mdx │ │ │ │ │ ├── Link.stories.tsx │ │ │ │ │ └── LinkAsButton.stories.tsx │ │ │ │ ├── docs/ │ │ │ │ │ ├── Area.module.css │ │ │ │ │ ├── Area.tsx │ │ │ │ │ ├── WithSelector.tsx │ │ │ │ │ └── data/ │ │ │ │ │ └── CountryCodes.json │ │ │ │ ├── feedback/ │ │ │ │ │ ├── EmptyState.mdx │ │ │ │ │ ├── EmptyState.stories.tsx │ │ │ │ │ ├── ErrorState.mdx │ │ │ │ │ ├── ErrorState.stories.tsx │ │ │ │ │ ├── Loading.mdx │ │ │ │ │ ├── Loading.stories.tsx │ │ │ │ │ ├── Skeleton.mdx │ │ │ │ │ ├── Skeleton.stories.tsx │ │ │ │ │ ├── Status.mdx │ │ │ │ │ ├── Status.stories.tsx │ │ │ │ │ ├── StatusDot.mdx │ │ │ │ │ └── StatusDot.stories.tsx │ │ │ │ ├── form/ │ │ │ │ │ ├── About.mdx │ │ │ │ │ ├── Affix/ │ │ │ │ │ │ ├── Affix.stories.tsx │ │ │ │ │ │ └── Affixes.mdx │ │ │ │ │ ├── Buttons/ │ │ │ │ │ │ ├── FormButtons.mdx │ │ │ │ │ │ └── FormButtons.stories.tsx │ │ │ │ │ ├── Combobox.stories.tsx │ │ │ │ │ ├── Enumeration/ │ │ │ │ │ │ ├── Enumeration.mdx │ │ │ │ │ │ └── Enumeration.stories.tsx │ │ │ │ │ ├── Field/ │ │ │ │ │ │ ├── Datalist/ │ │ │ │ │ │ │ ├── Input.Datalist.mdx │ │ │ │ │ │ │ └── Input.Datalist.stories.tsx │ │ │ │ │ │ ├── FormField.mdx │ │ │ │ │ │ ├── FormField.stories.tsx │ │ │ │ │ │ ├── Input/ │ │ │ │ │ │ │ ├── Input.Checkbox.mdx │ │ │ │ │ │ │ ├── Input.Checkbox.stories.tsx │ │ │ │ │ │ │ ├── Input.Color.mdx │ │ │ │ │ │ │ ├── Input.Color.stories.tsx │ │ │ │ │ │ │ ├── Input.Copy.mdx │ │ │ │ │ │ │ ├── Input.Copy.stories.tsx │ │ │ │ │ │ │ ├── Input.Date.mdx │ │ │ │ │ │ │ ├── Input.Date.stories.tsx │ │ │ │ │ │ │ ├── Input.DatetimeLocal.mdx │ │ │ │ │ │ │ ├── Input.DatetimeLocal.stories.tsx │ │ │ │ │ │ │ ├── Input.Email.mdx │ │ │ │ │ │ │ ├── Input.Email.stories.tsx │ │ │ │ │ │ │ ├── Input.File.mdx │ │ │ │ │ │ │ ├── Input.File.stories.tsx │ │ │ │ │ │ │ ├── Input.Month.mdx │ │ │ │ │ │ │ ├── Input.Month.stories.tsx │ │ │ │ │ │ │ ├── Input.Number.mdx │ │ │ │ │ │ │ ├── Input.Number.stories.tsx │ │ │ │ │ │ │ ├── Input.Radio.mdx │ │ │ │ │ │ │ ├── Input.Radio.stories.tsx │ │ │ │ │ │ │ ├── Input.Search.mdx │ │ │ │ │ │ │ ├── Input.Search.stories.tsx │ │ │ │ │ │ │ ├── Input.Tel.mdx │ │ │ │ │ │ │ ├── Input.Tel.stories.tsx │ │ │ │ │ │ │ ├── Input.Text.mdx │ │ │ │ │ │ │ ├── Input.Text.stories.tsx │ │ │ │ │ │ │ ├── Input.Time.mdx │ │ │ │ │ │ │ ├── Input.Time.stories.tsx │ │ │ │ │ │ │ ├── Input.Url.mdx │ │ │ │ │ │ │ ├── Input.Url.stories.tsx │ │ │ │ │ │ │ ├── Input.Week.mdx │ │ │ │ │ │ │ ├── Input.Week.stories.tsx │ │ │ │ │ │ │ ├── Password.mdx │ │ │ │ │ │ │ └── Password.stories.tsx │ │ │ │ │ │ ├── Select/ │ │ │ │ │ │ │ ├── Input.Select.mdx │ │ │ │ │ │ │ └── Input.Select.stories.tsx │ │ │ │ │ │ └── Textarea/ │ │ │ │ │ │ ├── Input.Textarea.mdx │ │ │ │ │ │ └── Input.Textarea.stories.tsx │ │ │ │ │ ├── FieldCombobox.mdx │ │ │ │ │ ├── Fieldset/ │ │ │ │ │ │ ├── Fieldset.mdx │ │ │ │ │ │ ├── Fieldset.stories.tsx │ │ │ │ │ │ └── FormFieldset.mdx │ │ │ │ │ ├── Form.mdx │ │ │ │ │ ├── Form.stories.tsx │ │ │ │ │ ├── InlineEditing.mdx │ │ │ │ │ ├── InlineEditing.stories.tsx │ │ │ │ │ ├── RichRadioButton.mdx │ │ │ │ │ ├── RichRadioButton.stories.tsx │ │ │ │ │ ├── Switch.mdx │ │ │ │ │ ├── Switch.stories.tsx │ │ │ │ │ └── ToggleSwitch/ │ │ │ │ │ ├── ToggleSwitch.mdx │ │ │ │ │ └── ToggleSwitch.stories.tsx │ │ │ │ ├── icons/ │ │ │ │ │ ├── About.mdx │ │ │ │ │ ├── Icon.mdx │ │ │ │ │ ├── Icon.stories.tsx │ │ │ │ │ ├── Icons.tsx │ │ │ │ │ ├── SizedIcon.mdx │ │ │ │ │ └── SizedIcon.stories.tsx │ │ │ │ ├── layout/ │ │ │ │ │ ├── Card.mdx │ │ │ │ │ ├── Card.stories.tsx │ │ │ │ │ ├── Modal.mdx │ │ │ │ │ ├── Modal.stories.tsx │ │ │ │ │ ├── Stack.mdx │ │ │ │ │ └── Stack.stories.tsx │ │ │ │ ├── messaging/ │ │ │ │ │ ├── Badge.mdx │ │ │ │ │ ├── Badge.stories.tsx │ │ │ │ │ ├── InlineMessage.mdx │ │ │ │ │ ├── InlineMessage.stories.tsx │ │ │ │ │ ├── Message.mdx │ │ │ │ │ ├── Message.stories.tsx │ │ │ │ │ ├── Popover.mdx │ │ │ │ │ ├── Popover.stories.tsx │ │ │ │ │ ├── Tag.mdx │ │ │ │ │ ├── Tag.stories.tsx │ │ │ │ │ ├── Tooltip.mdx │ │ │ │ │ └── Tooltip.stories.tsx │ │ │ │ ├── navigation/ │ │ │ │ │ ├── Accordion.mdx │ │ │ │ │ ├── Accordion.stories.tsx │ │ │ │ │ ├── Breadcrumbs.mdx │ │ │ │ │ ├── Breadcrumbs.stories.tsx │ │ │ │ │ ├── Divider.mdx │ │ │ │ │ ├── Divider.stories.tsx │ │ │ │ │ ├── FloatingDrawer.mdx │ │ │ │ │ ├── FloatingDrawer.stories.tsx │ │ │ │ │ ├── Stepper.Step.mdx │ │ │ │ │ ├── Stepper.Step.stories.tsx │ │ │ │ │ ├── Stepper.mdx │ │ │ │ │ ├── Stepper.stories.tsx │ │ │ │ │ ├── Tabs.mdx │ │ │ │ │ └── Tabs.stories.tsx │ │ │ │ └── status.json │ │ │ ├── themes/ │ │ │ │ └── index.ts │ │ │ ├── types/ │ │ │ │ └── index.ts │ │ │ ├── useControl.ts │ │ │ ├── useId.ts │ │ │ └── vitest.setup.ts │ │ ├── static/ │ │ │ ├── _headers │ │ │ ├── favicon/ │ │ │ │ ├── browserconfig.xml │ │ │ │ └── site.webmanifest │ │ │ ├── robots.txt │ │ │ └── sw.js │ │ ├── stylelint.config.mjs │ │ ├── talend-i18n.json │ │ ├── talend-scripts.json │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── design-tokens/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── dependencies.json │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── compare.js │ │ │ └── umd.test.js │ │ ├── src/ │ │ │ ├── _tokens.scss │ │ │ ├── dark/ │ │ │ │ ├── _index.scss │ │ │ │ ├── _tokens.scss │ │ │ │ ├── dictionary.ts │ │ │ │ └── index.ts │ │ │ ├── declaration.d.ts │ │ │ ├── index.scss │ │ │ ├── index.ts │ │ │ ├── index.umd.ts │ │ │ ├── light/ │ │ │ │ ├── _index.scss │ │ │ │ ├── dictionary.ts │ │ │ │ └── index.ts │ │ │ ├── qlik-light/ │ │ │ │ ├── _index.scss │ │ │ │ ├── dictionary.ts │ │ │ │ └── index.ts │ │ │ └── types.ts │ │ ├── supernova-exporter/ │ │ │ ├── README.md │ │ │ ├── exporter.json │ │ │ ├── output.json │ │ │ ├── sources.json │ │ │ └── src/ │ │ │ ├── exportCSS/ │ │ │ │ ├── CSS.pr │ │ │ │ ├── css-stylesheet-with-path.pr │ │ │ │ ├── main-renderers/ │ │ │ │ │ ├── css-reference-wrapper.pr │ │ │ │ │ ├── css-rendered-name.pr │ │ │ │ │ ├── css-rendered-token-class.pr │ │ │ │ │ ├── css-rendered-token-style.pr │ │ │ │ │ ├── css-rendered-token-var.pr │ │ │ │ │ └── css-rendered-value.pr │ │ │ │ └── token-renderers/ │ │ │ │ ├── css-rendered-border.pr │ │ │ │ ├── css-rendered-color.pr │ │ │ │ ├── css-rendered-gradient.pr │ │ │ │ ├── css-rendered-lineHeight.pr │ │ │ │ ├── css-rendered-measure.pr │ │ │ │ ├── css-rendered-other.pr │ │ │ │ ├── css-rendered-radius.pr │ │ │ │ ├── css-rendered-shadow.pr │ │ │ │ ├── css-rendered-text.pr │ │ │ │ └── css-rendered-typography.pr │ │ │ ├── exportSCSS/ │ │ │ │ ├── SCSS.pr │ │ │ │ ├── main-renderers/ │ │ │ │ │ ├── scss-reference-wrapper.pr │ │ │ │ │ ├── scss-rendered-description.pr │ │ │ │ │ ├── scss-rendered-token-class.pr │ │ │ │ │ └── scss-rendered-token-var.pr │ │ │ │ └── scss-tokens-with-path.pr │ │ │ ├── exportTS/ │ │ │ │ ├── allTokens.pr │ │ │ │ ├── dictionary.pr │ │ │ │ ├── main-renderers/ │ │ │ │ │ ├── index-file.pr │ │ │ │ │ ├── reference-wrapper.pr │ │ │ │ │ ├── rendered-css-name.pr │ │ │ │ │ ├── rendered-description.pr │ │ │ │ │ ├── rendered-dictionnary-entry.pr │ │ │ │ │ ├── rendered-token-class.pr │ │ │ │ │ ├── rendered-token-var.pr │ │ │ │ │ ├── rendered-ts-name.pr │ │ │ │ │ ├── rendered-type.pr │ │ │ │ │ ├── rendered-value-detailed.pr │ │ │ │ │ └── rendered-value.pr │ │ │ │ ├── token-renderers/ │ │ │ │ │ ├── rendered-border.pr │ │ │ │ │ ├── rendered-color-detailed.pr │ │ │ │ │ ├── rendered-color.pr │ │ │ │ │ ├── rendered-gradient-detailed.pr │ │ │ │ │ ├── rendered-gradient.pr │ │ │ │ │ ├── rendered-lineHeight.pr │ │ │ │ │ ├── rendered-measure-detailed.pr │ │ │ │ │ ├── rendered-measure.pr │ │ │ │ │ ├── rendered-radius-detailed.pr │ │ │ │ │ ├── rendered-radius.pr │ │ │ │ │ ├── rendered-shadow-detailed.pr │ │ │ │ │ ├── rendered-shadow.pr │ │ │ │ │ ├── rendered-text-detailed.pr │ │ │ │ │ ├── rendered-text.pr │ │ │ │ │ ├── rendered-typography-detailed.pr │ │ │ │ │ └── rendered-typography.pr │ │ │ │ ├── ts-dictionnary-with-path.pr │ │ │ │ └── ts-index-with-path.pr │ │ │ └── js/ │ │ │ └── helpers.js │ │ ├── talend-scripts.json │ │ ├── tsconfig.json │ │ └── webpack.config.js │ ├── faceted-search/ │ │ ├── .babelrc │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .storybook/ │ │ │ ├── main.mjs │ │ │ └── preview.jsx │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── i18next-scanner.config.js │ │ ├── jest.setup.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── CRUDBadges.js │ │ │ ├── components/ │ │ │ │ ├── AddFacetPopover/ │ │ │ │ │ ├── AddFacetPopover.component.jsx │ │ │ │ │ ├── AddFacetPopover.module.css │ │ │ │ │ ├── AddFacetPopoverHeader/ │ │ │ │ │ │ ├── AddFacetPopoverHeader.component.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── AddFacetPopoverRow/ │ │ │ │ │ │ ├── AddFacetPopoverRowButton/ │ │ │ │ │ │ │ ├── AddFacetPopoverRowButton.component.jsx │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── AddFacetPopoverRowItem/ │ │ │ │ │ │ │ ├── AddFacetPopoverRowItem.component.jsx │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── AddFacetPopver.component.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── AddFacetPopver.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── AdvancedSearch/ │ │ │ │ │ ├── AdvancedSearch.component.jsx │ │ │ │ │ ├── AdvancedSearch.component.test.jsx │ │ │ │ │ ├── AdvancedSearch.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── AdvancedSearch.component.test.js.snap │ │ │ │ │ │ └── AdvancedSearch.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── Badges/ │ │ │ │ │ ├── BadgeCheckboxes/ │ │ │ │ │ │ ├── BadgeCheckboxes.component.jsx │ │ │ │ │ │ ├── BadgeCheckboxes.component.test.jsx │ │ │ │ │ │ ├── BadgeCheckboxes.module.css │ │ │ │ │ │ ├── BadgeCheckboxesForm.component.jsx │ │ │ │ │ │ ├── BadgeCheckboxesForm.component.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgeDate/ │ │ │ │ │ │ ├── BadgeDate.component.jsx │ │ │ │ │ │ ├── BadgeDate.component.test.jsx │ │ │ │ │ │ ├── BadgeDate.module.css │ │ │ │ │ │ ├── BadgeDateForm.component.jsx │ │ │ │ │ │ ├── BadgeDateForm.component.test.jsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── BadgeDate.component.test.js.snap │ │ │ │ │ │ ├── BadgeDate.component.test.jsx.snap │ │ │ │ │ │ ├── BadgeDateForm.component.test.js.snap │ │ │ │ │ │ └── BadgeDateForm.component.test.jsx.snap │ │ │ │ │ ├── BadgeFaceted/ │ │ │ │ │ │ ├── BadgeFaceted.component.jsx │ │ │ │ │ │ ├── BadgeFaceted.component.test.jsx │ │ │ │ │ │ ├── BadgeFaceted.module.css │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── BadgeFaceted.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgeMenu/ │ │ │ │ │ │ ├── BadgeMenu.component.jsx │ │ │ │ │ │ ├── BadgeMenu.component.test.jsx │ │ │ │ │ │ ├── BadgeMenu.module.css │ │ │ │ │ │ ├── BadgeMenuForm.component.jsx │ │ │ │ │ │ └── BadgeMenuForm.component.test.jsx │ │ │ │ │ ├── BadgeNumber/ │ │ │ │ │ │ ├── BadgeNumber.component.jsx │ │ │ │ │ │ ├── BadgeNumber.component.test.jsx │ │ │ │ │ │ ├── BadgeNumberForm.component.jsx │ │ │ │ │ │ ├── BadgeNumberForm.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── BadgeNumber.component.test.js.snap │ │ │ │ │ │ │ ├── BadgeNumber.component.test.jsx.snap │ │ │ │ │ │ │ ├── BadgeNumberForm.component.test.js.snap │ │ │ │ │ │ │ └── BadgeNumberForm.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgeOperator/ │ │ │ │ │ │ ├── BadgeOperator.module.css │ │ │ │ │ │ ├── BadgeOperatorOverlay.component.jsx │ │ │ │ │ │ ├── BadgeOperatorPopover.component.jsx │ │ │ │ │ │ ├── BadgeOperatorPopover.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── BadgeOperatorPopover.component.test.js.snap │ │ │ │ │ │ │ └── BadgeOperatorPopover.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgeOverlay/ │ │ │ │ │ │ ├── BadgeOverlay.component.jsx │ │ │ │ │ │ ├── BadgeOverlay.component.test.jsx │ │ │ │ │ │ ├── BadgeOverlay.module.css │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── BadgeOverlay.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgePeriod/ │ │ │ │ │ │ ├── BadgePeriod.component.jsx │ │ │ │ │ │ ├── BadgePeriod.component.test.jsx │ │ │ │ │ │ ├── BadgePeriodForm.component.jsx │ │ │ │ │ │ └── BadgePeriodForm.component.test.jsx │ │ │ │ │ ├── BadgeSlider/ │ │ │ │ │ │ ├── BadgeSlider.component.jsx │ │ │ │ │ │ ├── BadgeSlider.component.test.jsx │ │ │ │ │ │ ├── BadgeSlider.module.css │ │ │ │ │ │ ├── BadgeSliderForm.component.jsx │ │ │ │ │ │ ├── BadgeSliderForm.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── BadgeSlider.component.test.js.snap │ │ │ │ │ │ │ ├── BadgeSlider.component.test.jsx.snap │ │ │ │ │ │ │ ├── BadgeSliderForm.component.test.js.snap │ │ │ │ │ │ │ └── BadgeSliderForm.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── BadgeText/ │ │ │ │ │ │ ├── BadgeText.component.jsx │ │ │ │ │ │ ├── BadgeText.component.test.jsx │ │ │ │ │ │ ├── BadgeTextForm.component.jsx │ │ │ │ │ │ ├── BadgeTextForm.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── BadgeText.component.test.js.snap │ │ │ │ │ │ │ ├── BadgeText.component.test.jsx.snap │ │ │ │ │ │ │ ├── BadgeTextForm.component.test.js.snap │ │ │ │ │ │ │ └── BadgeTextForm.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── BadgesGenerator/ │ │ │ │ │ ├── BadgesGenerator.component.jsx │ │ │ │ │ ├── BadgesGenerator.component.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── BadgesGenerator.component.test.js.snap │ │ │ │ │ │ └── BadgesGenerator.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── BasicSearch/ │ │ │ │ │ ├── BasicSearch.component.jsx │ │ │ │ │ ├── BasicSearch.component.test.jsx │ │ │ │ │ ├── BasicSearch.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── BasicSearch.component.test.js.snap │ │ │ │ │ │ └── BasicSearch.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── FacetedManager/ │ │ │ │ │ ├── FacetedManager.component.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── FacetedSearch/ │ │ │ │ │ ├── FacetedSearch.component.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── FacetedToolbar/ │ │ │ │ │ ├── FacetedToolbar.component.jsx │ │ │ │ │ ├── FacetedToolbar.module.css │ │ │ │ │ └── index.js │ │ │ │ ├── QuickSearchInput/ │ │ │ │ │ ├── QuickSearchInput.component.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── README.md │ │ │ │ ├── context/ │ │ │ │ │ ├── badgeFaceted.context.js │ │ │ │ │ └── facetedSearch.context.js │ │ │ │ ├── facetedSearch.propTypes.js │ │ │ │ ├── index.js │ │ │ │ └── types/ │ │ │ │ ├── badgeDefinition.type.js │ │ │ │ └── badgeDefinition.type.test.jsx │ │ │ ├── constants.js │ │ │ ├── controlled.js │ │ │ ├── dictionary/ │ │ │ │ ├── badge.dictionary.js │ │ │ │ ├── badge.dictionary.test.jsx │ │ │ │ ├── helpers.dictionary.js │ │ │ │ ├── helpers.dictionary.test.jsx │ │ │ │ └── operator.dictionary.js │ │ │ ├── helpers/ │ │ │ │ ├── usage.helpers.js │ │ │ │ └── usage.helpers.test.jsx │ │ │ ├── hooks/ │ │ │ │ ├── README.md │ │ │ │ ├── badgeOverlayFlow.hook.js │ │ │ │ └── facetedBadges.hook.js │ │ │ ├── index.js │ │ │ ├── stories/ │ │ │ │ ├── badge.stories.jsx │ │ │ │ ├── badgesDefinitions.js │ │ │ │ └── facetedSearch.stories.jsx │ │ │ └── translate.js │ │ ├── stylelint.config.mjs │ │ ├── talend-i18n.json │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── faceted-search-query-client/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.js │ │ │ ├── tql.js │ │ │ └── tql.test.js │ │ └── vitest.config.ts │ ├── flow-designer/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── licence.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── actions/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── flow.actions.test.ts.snap │ │ │ │ │ ├── link.actions.test.ts.snap │ │ │ │ │ ├── node.actions.test.ts.snap │ │ │ │ │ └── port.actions.test.ts.snap │ │ │ │ ├── flow.actions.test.ts │ │ │ │ ├── flow.actions.ts │ │ │ │ ├── link.actions.test.ts │ │ │ │ ├── link.actions.ts │ │ │ │ ├── node.actions.test.ts │ │ │ │ ├── node.actions.ts │ │ │ │ ├── nodeType.actions.test.ts │ │ │ │ ├── nodeType.actions.ts │ │ │ │ ├── port.actions.test.ts │ │ │ │ └── port.actions.ts │ │ │ ├── api/ │ │ │ │ ├── data/ │ │ │ │ │ ├── data.test.ts │ │ │ │ │ └── data.ts │ │ │ │ ├── index.ts │ │ │ │ ├── link/ │ │ │ │ │ ├── link.test.ts │ │ │ │ │ └── link.ts │ │ │ │ ├── node/ │ │ │ │ │ ├── node.test.ts │ │ │ │ │ └── node.ts │ │ │ │ ├── port/ │ │ │ │ │ ├── port.test.ts │ │ │ │ │ └── port.ts │ │ │ │ ├── position/ │ │ │ │ │ ├── position.test.ts │ │ │ │ │ └── position.ts │ │ │ │ ├── readme.md │ │ │ │ ├── size/ │ │ │ │ │ ├── size.test.ts │ │ │ │ │ └── size.ts │ │ │ │ └── throwInDev.ts │ │ │ ├── components/ │ │ │ │ ├── FlowDesigner.container.test.tsx │ │ │ │ ├── FlowDesigner.container.tsx │ │ │ │ ├── ZoomHandler.component.tsx │ │ │ │ ├── ZoomHandler.test.tsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── FlowDesigner.container.test.tsx.snap │ │ │ │ │ └── ZoomHandler.test.tsx.snap │ │ │ │ ├── configuration/ │ │ │ │ │ ├── LinkType.component.ts │ │ │ │ │ ├── NodeType.component.ts │ │ │ │ │ ├── NodeType.test.tsx │ │ │ │ │ └── PortType.component.ts │ │ │ │ ├── grid/ │ │ │ │ │ ├── Grid.component.tsx │ │ │ │ │ ├── Grid.test.tsx │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ └── Grid.test.tsx.snap │ │ │ │ ├── link/ │ │ │ │ │ ├── AbstractLink.component.tsx │ │ │ │ │ ├── LinkHandle.component.tsx │ │ │ │ │ ├── LinkHandle.test.tsx │ │ │ │ │ ├── LinksRenderer.component.tsx │ │ │ │ │ ├── LinksRenderer.test.tsx │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ ├── LinkHandle.test.tsx.snap │ │ │ │ │ └── LinksRenderer.test.tsx.snap │ │ │ │ ├── node/ │ │ │ │ │ ├── AbstractNode.component.tsx │ │ │ │ │ ├── AbstractNode.snapshot.test.tsx │ │ │ │ │ ├── AbstractNode.test.tsx │ │ │ │ │ ├── NodesRenderer.component.tsx │ │ │ │ │ ├── NodesRenderer.test.tsx │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ ├── AbstractNode.snapshot.test.tsx.snap │ │ │ │ │ └── NodesRenderer.test.tsx.snap │ │ │ │ └── port/ │ │ │ │ ├── AbstractPort.component.tsx │ │ │ │ ├── AbstractPort.test.tsx │ │ │ │ ├── PortsRenderer.component.tsx │ │ │ │ ├── PortsRenderer.test.tsx │ │ │ │ └── __snapshots__/ │ │ │ │ ├── AbstractPort.test.tsx.snap │ │ │ │ └── PortsRenderer.test.tsx.snap │ │ │ ├── constants/ │ │ │ │ ├── flowdesigner.constants.ts │ │ │ │ ├── flowdesigner.model.ts │ │ │ │ └── flowdesigner.proptypes.ts │ │ │ ├── customTypings/ │ │ │ │ └── index.d.ts │ │ │ ├── index.ts │ │ │ ├── reducers/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── flow.reducer.test.ts.snap │ │ │ │ │ ├── link.reducer.test.ts.snap │ │ │ │ │ ├── node.reducer.test.ts.snap │ │ │ │ │ └── port.reducer.test.ts.snap │ │ │ │ ├── flow.reducer.test.ts │ │ │ │ ├── flow.reducer.ts │ │ │ │ ├── index.ts │ │ │ │ ├── link.reducer.test.ts │ │ │ │ ├── link.reducer.ts │ │ │ │ ├── node.reducer.test.ts │ │ │ │ ├── node.reducer.ts │ │ │ │ ├── nodeType.reducer.ts │ │ │ │ ├── port.reducer.test.ts │ │ │ │ └── port.reducer.ts │ │ │ └── selectors/ │ │ │ ├── __snapshots__/ │ │ │ │ └── nodeSelectors.test.ts.snap │ │ │ ├── linkSelectors.ts │ │ │ ├── nodeSelectors.test.ts │ │ │ ├── nodeSelectors.ts │ │ │ ├── portSelectors.test.ts │ │ │ └── portSelectors.ts │ │ ├── test/ │ │ │ ├── fileMock.js │ │ │ ├── styleMock.js │ │ │ └── test-setup.js │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── forms/ │ │ ├── .babelrc.json │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .sass-lint.yml │ │ ├── .storybook/ │ │ │ └── preview.js │ │ ├── 6.0-BreakingChanges.md │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── __mocks__/ │ │ │ ├── data.jsx │ │ │ └── react-virtualized.js │ │ ├── eslint.config.mjs │ │ ├── i18next-scanner.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── FormSkeleton.module.css │ │ │ ├── FormSkeleton.test.tsx │ │ │ ├── FormSkeleton.tsx │ │ │ ├── FormSwitcher.test.tsx │ │ │ ├── FormSwitcher.tsx │ │ │ ├── UIForm/ │ │ │ │ ├── FormTemplate/ │ │ │ │ │ ├── DefaultFormTemplate.component.jsx │ │ │ │ │ ├── TextModeFormTemplate.component.jsx │ │ │ │ │ └── index.js │ │ │ │ ├── Message/ │ │ │ │ │ ├── Message.component.jsx │ │ │ │ │ ├── Message.component.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── Message.component.test.js.snap │ │ │ │ │ │ └── Message.component.test.jsx.snap │ │ │ │ │ ├── generateId.js │ │ │ │ │ ├── generateId.test.js │ │ │ │ │ └── index.js │ │ │ │ ├── README.md │ │ │ │ ├── UIForm.component.jsx │ │ │ │ ├── UIForm.container.jsx │ │ │ │ ├── UIForm.container.test.jsx │ │ │ │ ├── UIForm.module.css │ │ │ │ ├── Widget/ │ │ │ │ │ ├── Widget.component.jsx │ │ │ │ │ ├── Widget.component.module.css │ │ │ │ │ ├── Widget.component.test.jsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Widget.component.test.jsx.snap │ │ │ │ │ └── index.js │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ordering.json │ │ │ │ │ ├── simple-merged.json │ │ │ │ │ ├── simple.json │ │ │ │ │ └── widgets.json │ │ │ │ ├── context.js │ │ │ │ ├── customFormats.js │ │ │ │ ├── customFormats.test.js │ │ │ │ ├── doc/ │ │ │ │ │ ├── conditional-rendering.md │ │ │ │ │ ├── display-mode.md │ │ │ │ │ ├── how-to-use.md │ │ │ │ │ ├── principles.md │ │ │ │ │ ├── triggers.md │ │ │ │ │ ├── validation.md │ │ │ │ │ └── widgets.md │ │ │ │ ├── fields/ │ │ │ │ │ ├── Button/ │ │ │ │ │ │ ├── Button.component.jsx │ │ │ │ │ │ ├── Button.component.test.jsx │ │ │ │ │ │ ├── Buttons.component.jsx │ │ │ │ │ │ ├── Buttons.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── SingleButton.component.jsx │ │ │ │ │ │ ├── SingleButton.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Button.component.test.js.snap │ │ │ │ │ │ │ ├── Button.component.test.jsx.snap │ │ │ │ │ │ │ ├── Buttons.component.test.js.snap │ │ │ │ │ │ │ ├── Buttons.component.test.jsx.snap │ │ │ │ │ │ │ ├── SingleButton.component.test.js.snap │ │ │ │ │ │ │ └── SingleButton.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── CheckBox/ │ │ │ │ │ │ ├── CheckBox.component.jsx │ │ │ │ │ │ ├── CheckBox.test.jsx │ │ │ │ │ │ ├── CheckBoxes.component.jsx │ │ │ │ │ │ ├── CheckBoxes.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── SimpleCheckBox.component.jsx │ │ │ │ │ │ ├── SimpleCheckBox.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── CheckBox.test.js.snap │ │ │ │ │ │ │ ├── CheckBox.test.jsx.snap │ │ │ │ │ │ │ ├── CheckBoxes.test.js.snap │ │ │ │ │ │ │ ├── CheckBoxes.test.jsx.snap │ │ │ │ │ │ │ ├── SimpleCheckBox.test.js.snap │ │ │ │ │ │ │ └── SimpleCheckBox.test.jsx.snap │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextMode.component.jsx │ │ │ │ │ │ │ ├── TextMode.test.jsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ ├── TextMode.test.js.snap │ │ │ │ │ │ │ └── TextMode.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Code/ │ │ │ │ │ │ ├── Code.component.test.tsx │ │ │ │ │ │ ├── Code.component.tsx │ │ │ │ │ │ ├── CodeSkeleton.component.tsx │ │ │ │ │ │ ├── CodeSkeleton.module.css │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextMode.component.test.tsx │ │ │ │ │ │ │ └── TextMode.component.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Comparator/ │ │ │ │ │ │ ├── Comparator.component.jsx │ │ │ │ │ │ ├── Comparator.component.test.jsx │ │ │ │ │ │ ├── Comparator.module.css │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Comparator.component.test.js.snap │ │ │ │ │ │ │ └── Comparator.component.test.jsx.snap │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextMode.component.jsx │ │ │ │ │ │ │ ├── TextMode.test.jsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ ├── TextMode.test.js.snap │ │ │ │ │ │ │ └── TextMode.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Datalist/ │ │ │ │ │ │ ├── Datalist.component.jsx │ │ │ │ │ │ ├── Datalist.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Datalist.component.test.js.snap │ │ │ │ │ │ │ └── Datalist.component.test.jsx.snap │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextMode.component.jsx │ │ │ │ │ │ │ ├── TextMode.component.test.jsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ ├── TextMode.component.test.js.snap │ │ │ │ │ │ │ └── TextMode.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Date/ │ │ │ │ │ │ ├── Date.component.jsx │ │ │ │ │ │ ├── Date.component.test.jsx │ │ │ │ │ │ ├── Date.utils.js │ │ │ │ │ │ ├── Date.utils.test.js │ │ │ │ │ │ ├── DateTime.component.jsx │ │ │ │ │ │ ├── DateTime.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── Time.component.jsx │ │ │ │ │ │ ├── Time.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Date.component.test.js.snap │ │ │ │ │ │ │ ├── Date.component.test.jsx.snap │ │ │ │ │ │ │ ├── DateTime.component.test.js.snap │ │ │ │ │ │ │ ├── DateTime.component.test.jsx.snap │ │ │ │ │ │ │ ├── Time.component.test.js.snap │ │ │ │ │ │ │ └── Time.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Enumeration/ │ │ │ │ │ │ ├── EnumerationWidget.jsx │ │ │ │ │ │ ├── EnumerationWidget.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ ├── utils.js │ │ │ │ │ │ └── utils.test.js │ │ │ │ │ ├── FieldTemplate/ │ │ │ │ │ │ ├── FieldTemplate.component.jsx │ │ │ │ │ │ ├── FieldTemplate.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── FieldTemplate.component.test.js.snap │ │ │ │ │ │ │ └── FieldTemplate.component.test.jsx.snap │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextMode.component.jsx │ │ │ │ │ │ │ ├── TextMode.component.test.jsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ ├── TextMode.component.test.js.snap │ │ │ │ │ │ │ └── TextMode.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── File/ │ │ │ │ │ │ ├── File.component.jsx │ │ │ │ │ │ ├── File.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── File.component.test.js.snap │ │ │ │ │ │ │ └── File.component.test.jsx.snap │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextMode.component.jsx │ │ │ │ │ │ │ ├── TextMode.component.test.jsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ ├── TextMode.component.test.js.snap │ │ │ │ │ │ │ └── TextMode.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── KeyValue/ │ │ │ │ │ │ ├── KeyValue.component.jsx │ │ │ │ │ │ ├── KeyValue.component.test.jsx │ │ │ │ │ │ ├── KeyValue.module.css │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── KeyValue.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── ListView/ │ │ │ │ │ │ ├── ListView.component.jsx │ │ │ │ │ │ ├── ListView.component.test.jsx │ │ │ │ │ │ ├── ListView.utils.js │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── MultiSelectTag/ │ │ │ │ │ │ ├── MultiSelectTag.component.jsx │ │ │ │ │ │ ├── MultiSelectTag.component.test.jsx │ │ │ │ │ │ ├── MultiSelectTag.module.css │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextMode.component.jsx │ │ │ │ │ │ │ └── TextMode.module.css │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── NestedListView/ │ │ │ │ │ │ ├── NestedListView.component.jsx │ │ │ │ │ │ ├── NestedListView.module.css │ │ │ │ │ │ ├── NestedListView.test.jsx │ │ │ │ │ │ ├── NestedListView.utils.js │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── RadioOrSelect/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── RadioOrSelect.component.jsx │ │ │ │ │ │ ├── RadioOrSelect.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── RadioOrSelect.component.test.js.snap │ │ │ │ │ │ │ └── RadioOrSelect.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Radios/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── Radios.component.jsx │ │ │ │ │ │ ├── Radios.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Radios.component.test.js.snap │ │ │ │ │ │ │ └── Radios.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── ResourcePicker/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── ResourcePicker.component.jsx │ │ │ │ │ │ ├── ResourcePicker.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── ResourcePicker.component.test.jsx.snap │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Select/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── Select.component.jsx │ │ │ │ │ │ ├── Select.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Select.component.test.js.snap │ │ │ │ │ │ │ └── Select.component.test.jsx.snap │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextMode.component.jsx │ │ │ │ │ │ │ ├── TextMode.component.test.jsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ ├── TextMode.component.test.js.snap │ │ │ │ │ │ │ └── TextMode.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Text/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── Text.component.jsx │ │ │ │ │ │ ├── Text.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Text.component.test.js.snap │ │ │ │ │ │ │ └── Text.component.test.jsx.snap │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextMode.component.jsx │ │ │ │ │ │ │ ├── TextMode.component.test.jsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ ├── TextMode.component.test.js.snap │ │ │ │ │ │ │ └── TextMode.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── TextArea/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── TextArea.component.jsx │ │ │ │ │ │ ├── TextArea.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── TextArea.component.test.js.snap │ │ │ │ │ │ │ └── TextArea.component.test.jsx.snap │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextMode.component.jsx │ │ │ │ │ │ │ ├── TextMode.component.test.jsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ ├── TextMode.component.test.js.snap │ │ │ │ │ │ │ └── TextMode.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── TimezoneList/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── TimezoneList.component.jsx │ │ │ │ │ │ ├── TimezoneList.component.test.jsx │ │ │ │ │ │ ├── TimezoneList.utils.js │ │ │ │ │ │ ├── TimezoneList.utils.test.js │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── TimezoneList.component.test.js.snap │ │ │ │ │ │ │ └── TimezoneList.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Toggle/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── Toggle.component.jsx │ │ │ │ │ │ ├── Toggle.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Toggle.component.test.js.snap │ │ │ │ │ │ │ └── Toggle.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── fieldsets/ │ │ │ │ │ ├── Array/ │ │ │ │ │ │ ├── Array.component.jsx │ │ │ │ │ │ ├── Array.component.test.jsx │ │ │ │ │ │ ├── ArrayItem.component.jsx │ │ │ │ │ │ ├── ArrayItem.component.test.jsx │ │ │ │ │ │ ├── ArrayItem.module.css │ │ │ │ │ │ ├── DefaultArrayTemplate.component.jsx │ │ │ │ │ │ ├── DefaultArrayTemplate.component.test.jsx │ │ │ │ │ │ ├── DefaultArrayTemplate.module.css │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Array.component.test.js.snap │ │ │ │ │ │ │ ├── Array.component.test.jsx.snap │ │ │ │ │ │ │ ├── ArrayItem.component.test.js.snap │ │ │ │ │ │ │ ├── ArrayItem.component.test.jsx.snap │ │ │ │ │ │ │ ├── DefaultArrayTemplate.component.test.js.snap │ │ │ │ │ │ │ └── DefaultArrayTemplate.component.test.jsx.snap │ │ │ │ │ │ ├── displayMode/ │ │ │ │ │ │ │ ├── TextModeArrayTemplate.component.jsx │ │ │ │ │ │ │ ├── TextModeArrayTemplate.component.test.jsx │ │ │ │ │ │ │ ├── TextModeArrayTemplate.module.css │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ ├── TextModeArrayTemplate.component.test.js.snap │ │ │ │ │ │ │ └── TextModeArrayTemplate.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── CollapsibleFieldset/ │ │ │ │ │ │ ├── CollapsibleFieldset.component.jsx │ │ │ │ │ │ ├── CollapsibleFieldset.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── CollapsibleFieldset.component.test.js.snap │ │ │ │ │ │ │ └── CollapsibleFieldset.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Columns/ │ │ │ │ │ │ ├── Columns.component.jsx │ │ │ │ │ │ ├── Columns.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Columns.component.test.js.snap │ │ │ │ │ │ │ └── Columns.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Fieldset/ │ │ │ │ │ │ ├── Fieldset.component.jsx │ │ │ │ │ │ ├── Fieldset.component.test.jsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Fieldset.component.test.js.snap │ │ │ │ │ │ │ └── Fieldset.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Tabs/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── Tabs.component.jsx │ │ │ │ │ │ ├── Tabs.component.test.jsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Tabs.component.test.js.snap │ │ │ │ │ │ │ └── Tabs.component.test.jsx.snap │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── index.js │ │ │ │ ├── index.test.js │ │ │ │ ├── lang.js │ │ │ │ ├── merge.js │ │ │ │ ├── merge.test.js │ │ │ │ ├── trigger/ │ │ │ │ │ └── index.js │ │ │ │ └── utils/ │ │ │ │ ├── array.js │ │ │ │ ├── array.test.js │ │ │ │ ├── condition.js │ │ │ │ ├── condition.test.js │ │ │ │ ├── errors.js │ │ │ │ ├── errors.test.js │ │ │ │ ├── index.js │ │ │ │ ├── labels.jsx │ │ │ │ ├── labels.module.css │ │ │ │ ├── propTypes.js │ │ │ │ ├── properties.js │ │ │ │ ├── properties.test.js │ │ │ │ ├── templates.js │ │ │ │ ├── triggers.js │ │ │ │ ├── validation.js │ │ │ │ ├── validation.test.js │ │ │ │ └── widgets.js │ │ │ ├── constants.ts │ │ │ ├── declaration.d.ts │ │ │ ├── index.ts │ │ │ ├── rhf/ │ │ │ │ ├── fields/ │ │ │ │ │ ├── Input/ │ │ │ │ │ │ ├── Input.stories.jsx │ │ │ │ │ │ ├── Input.test.jsx │ │ │ │ │ │ ├── RHFInput.component.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── Select/ │ │ │ │ │ │ ├── RHFSelect.component.jsx │ │ │ │ │ │ ├── Select.stories.jsx │ │ │ │ │ │ ├── Select.test.jsx │ │ │ │ │ │ └── index.js │ │ │ │ │ └── TextArea/ │ │ │ │ │ ├── RHFTextArea.component.jsx │ │ │ │ │ ├── RHFTextArea.test.jsx │ │ │ │ │ ├── TextArea.stories.jsx │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── test-setup.tsx │ │ │ ├── translate.ts │ │ │ ├── types/ │ │ │ │ └── index.ts │ │ │ ├── validate.test.ts │ │ │ └── validate.ts │ │ ├── stories/ │ │ │ ├── CustomArrayTemplate.component.tsx │ │ │ ├── SchemaCore.stories.tsx │ │ │ ├── SchemaFields.stories.tsx │ │ │ ├── SchemaFieldsets.stories.tsx │ │ │ ├── SchemaLayout.stories.tsx │ │ │ ├── SchemaState.stories.tsx │ │ │ ├── UIFormStoriesSchemas/ │ │ │ │ ├── customActions.schema.js │ │ │ │ ├── customTemplate.schema.js │ │ │ │ ├── customWidget.schema.js │ │ │ │ ├── displayMode.schema.js │ │ │ │ ├── errors.schema.js │ │ │ │ ├── hoverSubmit.schema.js │ │ │ │ └── updating.schema.js │ │ │ ├── argTypes.ts │ │ │ └── json/ │ │ │ ├── concepts/ │ │ │ │ ├── conditional-render.json │ │ │ │ ├── custom-validation.json │ │ │ │ ├── format-validation.json │ │ │ │ ├── hint.json │ │ │ │ ├── index.ts │ │ │ │ ├── simple.json │ │ │ │ ├── structured-model.json │ │ │ │ └── trigger-after.json │ │ │ ├── fields/ │ │ │ │ ├── core-buttons.json │ │ │ │ ├── core-checkbox.json │ │ │ │ ├── core-code.json │ │ │ │ ├── core-comparator-input.json │ │ │ │ ├── core-datalist.json │ │ │ │ ├── core-date.json │ │ │ │ ├── core-enumeration.json │ │ │ │ ├── core-file.json │ │ │ │ ├── core-keyValue.json │ │ │ │ ├── core-listView.json │ │ │ │ ├── core-multiSelectTag.json │ │ │ │ ├── core-nestedListView.json │ │ │ │ ├── core-radios-or-select.json │ │ │ │ ├── core-radios.json │ │ │ │ ├── core-resource-picker.json │ │ │ │ ├── core-select.json │ │ │ │ ├── core-text.json │ │ │ │ ├── core-timezoneList.json │ │ │ │ ├── core-toggle.json │ │ │ │ └── index.ts │ │ │ ├── fieldsets/ │ │ │ │ ├── core-arrays-collapsible.json │ │ │ │ ├── core-arrays-complex.json │ │ │ │ ├── core-arrays-with-custom-options.json │ │ │ │ ├── core-arrays.json │ │ │ │ ├── core-collapsibleFieldset.json │ │ │ │ ├── core-columns.json │ │ │ │ ├── core-fieldset.json │ │ │ │ ├── core-tabs.json │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── stylelint.config.mjs │ │ ├── talend-i18n.json │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── http/ │ │ ├── .babelrc │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── async.ts │ │ │ ├── config.test.ts │ │ │ ├── config.ts │ │ │ ├── csrfHandling.ts │ │ │ ├── http.common.test.ts │ │ │ ├── http.common.ts │ │ │ ├── http.constants.test.ts │ │ │ ├── http.constants.ts │ │ │ ├── http.types.ts │ │ │ ├── index.ts │ │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── icons/ │ │ ├── .babelrc.json │ │ ├── .fantasticonrc.json │ │ ├── .gitignore │ │ ├── .storybook/ │ │ │ ├── main.mjs │ │ │ └── preview.mjs │ │ ├── 6.0 - breaking changes.md │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── VITE_MIGRATION.md │ │ ├── groovy/ │ │ │ ├── CreateIconTypes.groovy │ │ │ ├── CreatePNGIcons.groovy │ │ │ └── UpdateVersion.groovy │ │ ├── index.js │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── build-webfont.mjs │ │ │ ├── generate-svg-bundles.mjs │ │ │ ├── generate-type-utils.mjs │ │ │ └── post-process-css.mjs │ │ ├── src/ │ │ │ ├── extract.ts │ │ │ ├── index.ts │ │ │ ├── info.ts │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── talend/ │ │ │ │ │ └── icons/ │ │ │ │ │ └── UICustomizer.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── services/ │ │ │ │ └── org.talend.sdk.component.runtime.manager.ComponentManager$Customizer │ │ │ ├── metadata.json │ │ │ ├── svg-deprecated/ │ │ │ │ └── README.md │ │ │ ├── talendicons.css │ │ │ ├── talendicons.template.css │ │ │ └── talendicons.template.hbs │ │ ├── stories/ │ │ │ ├── Icon.stories.tsx │ │ │ ├── Icon.tsx │ │ │ └── IconsFont.stories.tsx │ │ ├── svgo-filters.config.mjs │ │ ├── svgo-icons.config.mjs │ │ ├── tsconfig.json │ │ ├── umd.dependencies.json │ │ ├── umd.min.dependencies.json │ │ └── vite.config.ts │ ├── local-libs-webpack-plugin/ │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ └── vitest.config.ts │ ├── playground/ │ │ ├── .babelrc.json │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .talend/ │ │ │ └── head.html │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── cmf.json │ │ ├── eslint.config.mjs │ │ ├── mockBackend/ │ │ │ ├── jsonForward.js │ │ │ ├── kit.js │ │ │ ├── mock/ │ │ │ │ ├── header-bar/ │ │ │ │ │ └── products-list.json │ │ │ │ └── kit/ │ │ │ │ ├── example.json │ │ │ │ ├── index.js │ │ │ │ └── validation.json │ │ │ └── server.js │ │ ├── package.json │ │ ├── serve-dist.js │ │ ├── src/ │ │ │ ├── app/ │ │ │ │ ├── actions/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── redirect.js │ │ │ │ ├── components/ │ │ │ │ │ ├── ComponentFormSandbox.jsx │ │ │ │ │ ├── ComponentFormSandbox.scss │ │ │ │ │ ├── Dataviz.jsx │ │ │ │ │ ├── FacetedSearch.jsx │ │ │ │ │ ├── Icons.jsx │ │ │ │ │ ├── List.jsx │ │ │ │ │ └── badgesDefinitions.js │ │ │ │ ├── foo.html │ │ │ │ ├── i18n.js │ │ │ │ └── index.jsx │ │ │ ├── assets/ │ │ │ │ └── inject.js │ │ │ └── settings/ │ │ │ └── settings.json │ │ ├── talend-scripts.json │ │ └── webpack.config.dev.js │ ├── playground-vite/ │ │ ├── .babelrc.json │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .talend/ │ │ │ └── head.html │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── cmf.json │ │ ├── eslint.config.mjs │ │ ├── index.html │ │ ├── mockVite/ │ │ │ ├── kit.js │ │ │ ├── mock/ │ │ │ │ ├── header-bar/ │ │ │ │ │ └── products-list.json │ │ │ │ └── kit/ │ │ │ │ ├── example.json │ │ │ │ ├── index.js │ │ │ │ └── validation.json │ │ │ └── server.js │ │ ├── package.json │ │ ├── serve-dist.mjs │ │ ├── src/ │ │ │ ├── app/ │ │ │ │ ├── actions/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── redirect.js │ │ │ │ ├── components/ │ │ │ │ │ ├── ComponentFormSandbox.jsx │ │ │ │ │ ├── ComponentFormSandbox.scss │ │ │ │ │ ├── Dataviz.jsx │ │ │ │ │ ├── FacetedSearch.jsx │ │ │ │ │ ├── Icons.jsx │ │ │ │ │ ├── List.jsx │ │ │ │ │ ├── badgesDefinitions.js │ │ │ │ │ └── example.json │ │ │ │ ├── foo.html │ │ │ │ ├── i18n.js │ │ │ │ └── index.jsx │ │ │ ├── assets/ │ │ │ │ └── inject.js │ │ │ └── settings/ │ │ │ └── settings.json │ │ ├── talend-scripts.json │ │ └── vite.config.js │ ├── router-bridge/ │ │ ├── .babelrc.json │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.js │ │ │ ├── redux/ │ │ │ │ ├── index.js │ │ │ │ ├── redux-legacy-mode.test.js │ │ │ │ └── redux-rr5-mode.test.js │ │ │ └── router/ │ │ │ ├── index.js │ │ │ ├── router-legacy-mode.test.js │ │ │ └── router-rr5-mode.test.js │ │ └── vitest.config.ts │ ├── sagas/ │ │ ├── .babelrc.json │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .sass-lint.yml │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── index.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── constants.js │ │ │ ├── index.js │ │ │ └── pending/ │ │ │ ├── index.js │ │ │ ├── pending.js │ │ │ └── pending.test.js │ │ └── vitest.config.ts │ ├── stepper/ │ │ ├── .babelrc.json │ │ ├── .npmignore │ │ ├── .prettierrc.js │ │ ├── .storybook/ │ │ │ └── preview.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── custom.d.ts │ │ ├── eslint.config.mjs │ │ ├── i18next-scanner.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Stepper.constants.js │ │ │ ├── components/ │ │ │ │ ├── StepperForm/ │ │ │ │ │ ├── StepFooter/ │ │ │ │ │ │ ├── StepFooter.component.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── StepHeader/ │ │ │ │ │ │ ├── StepHeader.component.tsx │ │ │ │ │ │ ├── StepHeader.types.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── StepperForm.component.tsx │ │ │ │ │ ├── StepperForm.context.tsx │ │ │ │ │ ├── StepperForm.module.css │ │ │ │ │ ├── StepperForm.types.ts │ │ │ │ │ ├── StepperForm.utils.ts │ │ │ │ │ ├── StepperFormContainer/ │ │ │ │ │ │ ├── StepperFormContainer.component.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ ├── constants/ │ │ │ │ └── i18n.ts │ │ │ ├── containers/ │ │ │ │ └── Stepper.connect.js │ │ │ ├── hooks/ │ │ │ │ └── useStepperForm/ │ │ │ │ ├── useStepperForm.hook.test.tsx │ │ │ │ ├── useStepperForm.hook.ts │ │ │ │ └── useStepperForm.types.ts │ │ │ ├── index.ts │ │ │ ├── service/ │ │ │ │ ├── Stepper.actions.js │ │ │ │ ├── Stepper.reducer.js │ │ │ │ ├── Stepper.reducer.test.js │ │ │ │ ├── Stepper.selectors.js │ │ │ │ ├── Stepper.selectors.test.js │ │ │ │ └── Stepper.utils.js │ │ │ ├── stories/ │ │ │ │ ├── Stepper.components.tsx │ │ │ │ ├── Stepper.mdx │ │ │ │ └── Stepper.stories.tsx │ │ │ └── translate.js │ │ ├── stylelint.config.mjs │ │ ├── talend-i18n.json │ │ ├── tsconfig.json │ │ └── vitest.config.ts │ ├── storybook-cmf/ │ │ ├── .babelrc │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── register.js │ │ ├── src/ │ │ │ ├── CMFDecorator.jsx │ │ │ ├── CMFStory.component.jsx │ │ │ ├── CMFStory.test.jsx │ │ │ ├── __snapshots__/ │ │ │ │ └── CMFStory.test.jsx.snap │ │ │ ├── index.jsx │ │ │ └── register.jsx │ │ └── vitest.config.ts │ ├── storybook-docs/ │ │ ├── .babelrc │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .prettierrc.js │ │ ├── .storybook/ │ │ │ ├── main.ts │ │ │ ├── manager-head.html │ │ │ ├── manager.js │ │ │ ├── preview.js │ │ │ ├── theme.js │ │ │ └── vite.config.ts │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── custom.d.ts │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── Card.module.css │ │ │ │ ├── Card.tsx │ │ │ │ ├── FigmaContext.ts │ │ │ │ ├── FigmaIframe.module.css │ │ │ │ ├── FigmaIframe.tsx │ │ │ │ ├── FigmaImage.module.css │ │ │ │ ├── FigmaImage.tsx │ │ │ │ ├── Grid.module.css │ │ │ │ ├── Grid.tsx │ │ │ │ ├── SearchBar/ │ │ │ │ │ ├── AlgoliaAutocomplete.tsx │ │ │ │ │ ├── SearchBar.module.css │ │ │ │ │ ├── SearchBar.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Statuses/ │ │ │ │ │ ├── Status.module.css │ │ │ │ │ ├── Status.tsx │ │ │ │ │ ├── Statuses.tsx │ │ │ │ │ ├── Statuses.types.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── Trial/ │ │ │ │ │ ├── Trial.module.css │ │ │ │ │ ├── Trial.stories.tsx │ │ │ │ │ ├── Trial.tsx │ │ │ │ │ └── Trials.mdx │ │ │ │ ├── Use.module.css │ │ │ │ ├── Use.tsx │ │ │ │ └── index.ts │ │ │ ├── globalStyles.css │ │ │ ├── index.ts │ │ │ ├── managerStyles.css │ │ │ └── themes/ │ │ │ ├── dark.ts │ │ │ ├── helper.ts │ │ │ ├── index.ts │ │ │ └── light.ts │ │ ├── stylelint.config.mjs │ │ ├── tsconfig.json │ │ └── webpack.custom.js │ ├── storybook-one/ │ │ ├── .babelrc.json │ │ ├── .storybook/ │ │ │ ├── main.mjs │ │ │ └── preview.mjs │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── talend-scripts.json │ │ └── tsconfig.json │ ├── theme/ │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .stylelintrc.js │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── MIGRATION_SETUP_COMPLETE.md │ │ ├── README.md │ │ ├── VARIABLE_MAPPING.md │ │ ├── dependencies.json │ │ ├── eslint.config.mjs │ │ ├── example/ │ │ │ └── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.js │ │ │ ├── theme/ │ │ │ │ ├── _animation.scss │ │ │ │ ├── _badges.scss │ │ │ │ ├── _breadcrumbs.scss │ │ │ │ ├── _button-groups.scss │ │ │ │ ├── _buttons.scss │ │ │ │ ├── _code.scss │ │ │ │ ├── _colors.scss │ │ │ │ ├── _datagrid.scss │ │ │ │ ├── _dropdowns.scss │ │ │ │ ├── _fonts.scss │ │ │ │ ├── _forms.checkbox.scss │ │ │ │ ├── _forms.input.scss │ │ │ │ ├── _forms.label.scss │ │ │ │ ├── _forms.legend.scss │ │ │ │ ├── _forms.radio.scss │ │ │ │ ├── _forms.scss │ │ │ │ ├── _forms.select.scss │ │ │ │ ├── _forms.switch-nested.scss │ │ │ │ ├── _forms.switch.scss │ │ │ │ ├── _forms.textarea.scss │ │ │ │ ├── _guidelines.scss │ │ │ │ ├── _helpers.scss │ │ │ │ ├── _input-groups.scss │ │ │ │ ├── _labels.scss │ │ │ │ ├── _list-group.scss │ │ │ │ ├── _modals.scss │ │ │ │ ├── _navbar.button.scss │ │ │ │ ├── _navbar.dropdown.scss │ │ │ │ ├── _navbar.scss │ │ │ │ ├── _navbar.search.scss │ │ │ │ ├── _navs.scss │ │ │ │ ├── _paddings.scss │ │ │ │ ├── _pager.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _panels.scss │ │ │ │ ├── _popovers.scss │ │ │ │ ├── _tables.scss │ │ │ │ ├── _tooltip.scss │ │ │ │ ├── _type.scss │ │ │ │ ├── _variables.scss │ │ │ │ ├── _visual-helpers.scss │ │ │ │ ├── _wells.scss │ │ │ │ ├── alerts.scss │ │ │ │ ├── bootstrap.scss │ │ │ │ └── theme.scss │ │ │ └── variables.css │ │ └── webpack.config.js │ └── utils/ │ ├── CHANGELOG.md │ ├── README.md │ ├── eslint.config.mjs │ ├── package.json │ ├── src/ │ │ ├── date/ │ │ │ ├── README.md │ │ │ ├── date.test.ts │ │ │ ├── generator.test.ts │ │ │ ├── generator.ts │ │ │ └── index.ts │ │ ├── filters/ │ │ │ ├── filters.test.ts │ │ │ ├── filters.ts │ │ │ └── index.ts │ │ ├── getDataAttrFromProps.test.ts │ │ ├── getDataAttrFromProps.ts │ │ ├── index.ts │ │ ├── uuid.ts │ │ └── validation/ │ │ ├── README.md │ │ ├── index.ts │ │ ├── methods.test.ts │ │ ├── methods.ts │ │ ├── regexp.ts │ │ └── testValues.ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── vitest.config.ts ├── size.json ├── talend-scripts.json ├── tools/ │ ├── babel-plugin-assets-api/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __fixtures__/ │ │ │ └── first/ │ │ │ ├── code.js │ │ │ └── output.js │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.js │ │ │ └── index.test.js │ │ └── vitest.config.ts │ ├── babel-plugin-import-d3/ │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.js │ │ │ └── index.test.js │ │ └── vitest.config.ts │ ├── babel-plugin-import-from-index/ │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.js │ │ │ ├── index.test.js │ │ │ └── rules.json │ │ └── vitest.config.ts │ ├── babel-plugin-import-from-lib/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── index.js │ │ ├── index.test.js │ │ ├── package.json │ │ ├── rules.json │ │ └── vitest.config.ts │ ├── cmf-webpack-plugin/ │ │ ├── .babelrc.json │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ └── src/ │ │ └── index.js │ ├── codemods/ │ │ └── rb-to-talend-rb/ │ │ ├── README.md │ │ └── index.js │ ├── eslint-plugin/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── docs/ │ │ │ └── rules/ │ │ │ ├── talend-import-d3.md │ │ │ └── talend-import-depth.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.js │ │ │ └── rules/ │ │ │ ├── import-d3.js │ │ │ ├── import-depth.js │ │ │ └── use-bootstrap-class.js │ │ ├── tests/ │ │ │ └── src/ │ │ │ └── rules/ │ │ │ ├── import-d3.test.js │ │ │ ├── import-depth.test.js │ │ │ └── use-bootstrap-class.test.js │ │ └── vitest.config.ts │ ├── scripts-cmf/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── cmf-settings.i18n.js │ │ ├── cmf-settings.i18n.test.js │ │ ├── cmf-settings.js │ │ ├── cmf-settings.merge.js │ │ ├── cmf-settings.utils.js │ │ ├── cmf-settings.utils.test.js │ │ ├── eslint.config.mjs │ │ ├── getJSON.js │ │ └── package.json │ ├── scripts-config-babel/ │ │ ├── .babelrc.json │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── babel-resolver.js │ │ ├── babel.config.js │ │ ├── eslint.config.mjs │ │ ├── index.js │ │ ├── package.json │ │ ├── test/ │ │ │ └── nullish.test.js │ │ └── vitest.config.ts │ ├── scripts-config-cdn/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── cdn.js │ │ ├── eslint.config.mjs │ │ ├── modules.json │ │ ├── package.json │ │ ├── umds.json │ │ └── utils.js │ ├── scripts-config-eslint/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── config.test.js │ │ ├── eslint.config.js │ │ ├── index.js │ │ ├── package.json │ │ └── vitest.config.ts │ ├── scripts-config-prettier/ │ │ ├── .prettierrc.js │ │ ├── CHANGELOG.md │ │ ├── README.MD │ │ ├── eslint.config.mjs │ │ ├── index.js │ │ └── package.json │ ├── scripts-config-react-webpack/ │ │ ├── .browserslistrc │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── config/ │ │ │ ├── icons.js │ │ │ ├── index.tpl.html │ │ │ ├── inject.js │ │ │ ├── licence.js │ │ │ ├── loader.js │ │ │ ├── wdyr.js │ │ │ ├── webpack.config.common.js │ │ │ ├── webpack.config.dev.js │ │ │ ├── webpack.config.js │ │ │ └── webpack.config.prod.js │ │ ├── eslint.config.mjs │ │ ├── index.js │ │ ├── package.json │ │ └── src/ │ │ └── inject.js │ ├── scripts-config-storybook-lib/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── examples/ │ │ │ └── README.md │ │ ├── package.json │ │ ├── public/ │ │ │ └── msw/ │ │ │ └── mockServiceWorker.js │ │ ├── src/ │ │ │ ├── cmf.ts │ │ │ ├── i18n.ts │ │ │ ├── main.ts │ │ │ ├── preview.ts │ │ │ ├── utils.ts │ │ │ └── vite.config.mjs │ │ └── tsconfig.json │ ├── scripts-config-stylelint/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── index.mjs │ │ └── package.json │ ├── scripts-config-typescript/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── index.js │ │ ├── package.json │ │ └── tsconfig.json │ ├── scripts-core/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ ├── fixture/ │ │ │ │ ├── package.json │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── talend-scripts.json │ │ │ └── index.test.js │ │ ├── doc/ │ │ │ ├── customisation.md │ │ │ ├── getting-started.md │ │ │ ├── migration-13-preset.md │ │ │ └── migration.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── config/ │ │ │ │ └── webpack.config.js │ │ │ ├── index.js │ │ │ ├── scripts/ │ │ │ │ ├── build-lib-umd.js │ │ │ │ ├── build-lib.js │ │ │ │ ├── build.js │ │ │ │ ├── extends.js │ │ │ │ └── start.js │ │ │ └── utils/ │ │ │ ├── bin.js │ │ │ ├── env.js │ │ │ ├── log.js │ │ │ └── preset.js │ │ └── vitest.config.ts │ ├── scripts-locales/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── codeshift/ │ │ │ ├── locales.js │ │ │ └── package.json │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ └── src/ │ │ ├── index.js │ │ └── update-code.js │ ├── scripts-publish-local/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ └── src/ │ │ ├── cmd.js │ │ ├── git.js │ │ ├── index.js │ │ ├── npm.js │ │ ├── teardown.js │ │ ├── verdaccio.config.yml │ │ └── verdaccio.js │ ├── scripts-utils/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ ├── fixtures/ │ │ │ │ ├── app/ │ │ │ │ │ ├── package.json │ │ │ │ │ └── src/ │ │ │ │ │ └── app/ │ │ │ │ │ └── index.js │ │ │ │ ├── express/ │ │ │ │ │ ├── package.json │ │ │ │ │ └── src/ │ │ │ │ │ └── index.js │ │ │ │ └── library/ │ │ │ │ ├── package.json │ │ │ │ └── src/ │ │ │ │ └── index.js │ │ │ ├── path.test.js │ │ │ └── pkg.test.js │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── babel.js │ │ │ ├── fs.js │ │ │ ├── glob.js │ │ │ ├── index.js │ │ │ ├── path.js │ │ │ ├── pkg.js │ │ │ └── spawn.js │ │ └── vitest.config.ts │ ├── scripts-yarn-workspace/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ └── src/ │ │ ├── consume.js │ │ ├── index.js │ │ ├── run.js │ │ └── workspace-run.js │ └── upgrade-deps/ │ ├── .gitignore │ ├── .npmignore │ ├── CHANGELOG.md │ ├── README.md │ ├── eslint.config.mjs │ ├── package.json │ ├── src/ │ │ ├── changeset.js │ │ ├── colors.js │ │ ├── https.js │ │ ├── index.js │ │ ├── npm.js │ │ └── yarn.js │ ├── tests/ │ │ ├── cli-security.test.cjs │ │ ├── cli.test.cjs │ │ ├── fixture/ │ │ │ ├── basic/ │ │ │ │ ├── package-lock.json.tpl │ │ │ │ ├── package.json │ │ │ │ └── packages/ │ │ │ │ └── suba/ │ │ │ │ └── package.json │ │ │ └── security/ │ │ │ ├── conf/ │ │ │ │ ├── security-conf-ansi-regex.json │ │ │ │ ├── security-conf-axios.json │ │ │ │ ├── security-conf-css-what.json │ │ │ │ ├── security-conf-glob-parent.json │ │ │ │ ├── security-conf-postcss.json │ │ │ │ ├── security-conf-prompts.json │ │ │ │ ├── security-conf-tmpl.json │ │ │ │ └── security-conf-yargs-parser.json │ │ │ └── package.json │ │ ├── test-setup.js │ │ └── utils.cjs │ └── vitest.config.mjs └── versions/ ├── dependencies.js ├── dependencies.json └── generate-version-audit.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .changeset/README.md ================================================ # Changesets Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works with multi-package repos, or single-package repos to help you version and publish your code. You can find the full documentation for it [in our repository](https://github.com/changesets/changesets) We have a quick list of common questions to get you started engaging with this project in [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) ================================================ FILE: .changeset/config.json ================================================ { "$schema": "https://unpkg.com/@changesets/config@1.6.0/schema.json", "changelog": "@changesets/cli/changelog", "commit": false, "access": "restricted", "baseBranch": "master", "updateInternalDependencies": "patch", "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": { "onlyUpdatePeerDependentsWhenOutOfRange": true }, "ignore": [] } ================================================ FILE: .editorconfig ================================================ # http://editorconfig.org root = true [*] end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.js, *.jsx, *.css, *.scss] indent_style = tab # special rule for json expecially package.json wich npm reset to space for any modification [*.json] indent_style = space indent_size = 2 ================================================ FILE: .github/ISSUE_TEMPLATE/architecture_decision_record.md ================================================ --- name: Architecture Decision Record about: Create an architecture decision record to capture an important architecture decision made along with its context and consequences. title: '' labels: 'architecture decision record' assignees: '' --- ## Status What is the status, such as proposed, accepted, rejected, deprecated, superseded, etc.? ## Context How does it work today and why a decision is needed? If we've to tell to someone new. ## Problems What is the issue that we're seeing that is motivating this decision or change? ## Solutions What is the change that we're proposing and/or doing? ## Consequences What becomes easier or more difficult to do because of this change? ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - OS: [e.g. iOS] - Browser [e.g. chrome, safari] - Version [e.g. 22] **Smartphone (please complete the following information):** - Device: [e.g. iPhone6] - OS: [e.g. iOS8.1] - Browser [e.g. stock browser, safari] - Version [e.g. 22] **Additional context** Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ **What is the problem this PR is trying to solve?** **What is the chosen solution to this problem?** **Please check if the PR fulfills these requirements** - [ ] The PR have used `yarn changeset` to a request a release from the CI if wanted. - [ ] The PR commit message follows our [guidelines](https://github.com/talend/tools/blob/master/tools-root-github/CONTRIBUTING.md) - [ ] Tests for the changes have been added (for bug fixes / features) And [non reg](./screenshots.md) done before need review - [ ] Docs have been added / updated (for bug fixes / features) - [ ] Related design / discussions / pages (not in jira), if any, are all linked or available in the PR **[ ] This PR introduces a breaking change** ================================================ FILE: .github/actions/lint-merge-report/action.yml ================================================ name: 'Lint merge report' description: 'Merge eslint and stylelint reports filtered by git diff' author: 'Talend' inputs: base-branch: description: 'Base branch to compare diff against' required: true head-branch: description: 'Head branch (PR branch)' required: true runs: using: 'composite' steps: - name: Merge lint reports shell: bash run: node $GITHUB_ACTION_PATH/merge-lint-reports.mjs ${{ inputs.base-branch }} ${{ inputs.head-branch }} ================================================ FILE: .github/actions/lint-merge-report/merge-lint-reports.mjs ================================================ #!/usr/bin/env node /* eslint-disable no-console */ import { spawn } from 'child_process'; import fs from 'fs'; import path from 'path'; const [baseBranch, headBranch] = process.argv.slice(2); if (!baseBranch || !headBranch) { console.error('Usage: merge-lint-reports.mjs '); process.exit(1); } const reports = ['eslint-report.json', 'stylelint-report.json']; function getPackageDirs() { const configPath = path.join(process.cwd(), 'talend-scripts.json'); if (fs.existsSync(configPath)) { const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); return config?.lintMergeReport?.packageDirs ?? []; } return []; } function getPackages(packageDirs) { return packageDirs.flatMap(dir => fs.readdirSync(dir).map(subDir => ({ name: subDir, location: `${dir}/${subDir}`, })), ); } function transform(item) { if (item.source && !item.filePath) { item.filePath = item.source; delete item.source; } if (item.warnings && !item.messages) { item.messages = item.warnings.map(w => ({ ...w, severity: 1, message: w.text, ruleId: w.rule, })); item.warningCount = item.warnings.length; delete item.warning; } else if (item.messages) { item.messages = item.messages.map(w => ({ ...w, severity: 1 })); item.warningCount += item.errorCount; item.errorCount = 0; } return item; } function runGitDiff(base, head) { return new Promise((resolve, reject) => { const proc = spawn('git', ['diff', '--name-only', `origin/${base}`, `origin/${head}`]); let stdout = ''; let stderr = ''; proc.stdout.on('data', data => { stdout += data.toString(); }); proc.stderr.on('data', data => { stderr += data.toString(); }); proc.on('close', code => { if (code !== 0) { reject(new Error(`git diff failed (exit ${code}): ${stderr}`)); } else { resolve( stdout .split('\n') .map(s => s.trim()) .filter(Boolean), ); } }); }); } const packageDirs = getPackageDirs(); const packages = getPackages(packageDirs); if (packages.length === 0) { console.error('No packages found. Check lintMergeReport.packageDirs in talend-scripts.json'); process.exit(1); } const files = await runGitDiff(baseBranch, headBranch); const onlyIfInDiff = lint => files.some(f => lint.filePath.endsWith(`/${f}`)); const buff = []; for (const pkg of packages) { for (const report of reports) { const fpath = `${pkg.location}/${report}`; if (fs.existsSync(fpath)) { try { const items = JSON.parse(fs.readFileSync(fpath, 'utf-8')); buff.push(...items.map(transform).filter(onlyIfInDiff)); } catch (e) { console.error(`Failed to read ${fpath}:`, e.message); } } } } const target = path.join(process.cwd(), 'eslint-report.json'); console.log(`Merged ${buff.length} lint result(s) → ${target}`); fs.writeFileSync(target, JSON.stringify(buff, null, 2)); ================================================ FILE: .github/actions/setup-node/action.yml ================================================ name: 'Setup nodejs' description: 'Setup nodejs' author: 'Talend' inputs: NPM_TOKEN: description: 'Token used for GitHub Packages auth (defaults to GITHUB_TOKEN)' required: true runs: using: 'composite' steps: - name: Set up Node.js uses: actions/setup-node@v4 with: node-version-file: '.tool-versions' # set up auth to read in from env.NODE_AUTH_TOKEN. registry-url: 'https://npm.pkg.github.com' scope: '@talend' - name: Install yarn shell: bash run: npm i -g yarn - name: Get yarn cache directory path id: yarn-cache-dir-path shell: bash run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT - uses: actions/cache@v4 id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- ================================================ FILE: .github/copilot-instructions.md ================================================ # Talend/UI — AI Coding Instructions ## Repository Overview This is **Talend/UI**, a Yarn workspaces monorepo containing shared front-end libraries for Talend products. - **Workspaces**: `packages/*`, `tools/*`, `fork/*` - **Stack**: React 18, TypeScript 5, Babel 7 - **Build tooling**: shared `@talend/scripts-*` packages (see `tools/`) - **Versioning**: [Changesets](https://github.com/changesets/changesets) (`@changesets/cli`) - **Package manager**: Yarn 1 (classic) Run `yarn install` at the root. The `postinstall` script builds all libraries (`build:lib` + `build:lib:esm`). --- ## Code Style & Formatting ### Prettier Config: `@talend/scripts-config-prettier` (see `tools/scripts-config-prettier/.prettierrc.js`). | Setting | Value | | ---------------- | ------------------ | | Print width | 100 | | Quotes | Single (`'`) | | Trailing commas | All | | Semicolons | Yes | | Indentation | **Tabs** | | Arrow parens | Avoid (`x => x`) | | JSON / rc files | 2-space indent | | SCSS files | 1000 print width | Prettier runs automatically on commit via `lint-staged` on `*.{json,md,mdx,html,js,jsx,ts,tsx}`. ### EditorConfig - LF line endings, UTF-8 - Trim trailing whitespace, insert final newline - Tabs for `.js`, `.jsx`, `.css`, `.scss` - 2-space indent for `.json` ### ESLint Each package has an `.eslintrc.json` extending `@talend` (resolved from `@talend/eslint-config` → `tools/scripts-config-eslint`). Key rules and extends: - `eslint:recommended`, `airbnb-base`, `plugin:prettier/recommended` - `plugin:react/recommended`, `plugin:react/jsx-runtime` - `plugin:react-hooks/recommended` — `rules-of-hooks` is error, `exhaustive-deps` is warning - `plugin:jsx-a11y/recommended` - `plugin:testing-library/react`, `plugin:jest-dom/recommended` - `plugin:storybook/recommended` Important rules: - **No `console.log`** — only `console.warn` and `console.error` allowed - JSX only in `.jsx` / `.tsx` files (`react/jsx-filename-extension`) - `@talend/import-depth` (error) — controls import depth into packages - `import/prefer-default-export`: off — named exports are fine - `react/jsx-props-no-spreading`: off — spread is allowed - `react/require-default-props`: off - `@typescript-eslint/no-explicit-any`: warning (not error) in `.ts`/`.tsx` files - `import/no-extraneous-dependencies`: off in test and story files For TypeScript projects, the config auto-detects `tsconfig.json` and adds `@typescript-eslint` with `airbnb-typescript`. ### Stylelint Config: `stylelint-config-sass-guidelines` (see `tools/scripts-config-stylelint/.stylelintrc.js`). - Tab indentation - No `!important` (`declaration-no-important`) - No `transition: all` — be specific about transitioned properties - Max nesting depth: 5 - Lowercase hex colors, named colors where possible - No unspaced `calc()` operators --- ## TypeScript Base config: `@talend/scripts-config-typescript/tsconfig.json` (see `tools/scripts-config-typescript/`). | Setting | Value | | ---------------------------- | ---------- | | `strict` | `true` | | `target` | `ES2015` | | `module` | `esnext` | | `moduleResolution` | `bundler` | | `jsx` | `react-jsx`| | `declaration` | `true` | | `sourceMap` | `true` | | `isolatedModules` | `true` | | `esModuleInterop` | `true` | | `forceConsistentCasingInFileNames` | `true` | | `skipLibCheck` | `true` | Each package has a local `tsconfig.json` that extends this base: ```jsonc { "extends": "@talend/scripts-config-typescript/tsconfig.json", "include": ["src/**/*"], "compilerOptions": { "rootDirs": ["src"] } } ``` --- ## Component Architecture ### Closed API Pattern (Design System) Design system components (`packages/design-system`) use **closed APIs** — consumers cannot pass `className`, `style`, or `css` props. This ensures visual homogeneity across all products. - **Atoms** (Button, Link, Input): single-tag elements, accept `string` children, typed to mirror their HTML counterparts. Props extend native HTML attributes minus `className`/`style`. - **Molecules/Organisms** (Modal, Dropdown, Combobox): assembled components with rich props-based APIs. No composition — consumers hydrate via typed props. - **Templates/Layouts**: may use composition (`children`) for page-level arrangement. ### Styling - **CSS Modules** with `.module.css` files — this is the standard for all new code. No Styled Components. - **Design tokens** via CSS custom properties from `@talend/design-tokens`. Use them for all colors, spacing, fonts, border-radius, shadows, transitions, etc. - Use the `classnames` library for conditional class merging. ### Component Conventions - Support `ForwardRef` — wrap components with `forwardRef` so consumers can pass refs. - Match native HTML element types — component props should extend the underlying element's attributes (e.g., `HTMLButtonElement` for buttons). - Export components from the package's root `index.ts`. - Use `DataAttributes` type from `src/types` to support `data-*` attributes. ### `data-testid` Convention All interactive elements must have `data-testid` attributes following this pattern: ``` [data-testid=".[?]."] ``` | Segment | Required | Example | | -------------------- | -------- | --------------------------- | | `block_name` | Yes | `modal`, `inlineediting` | | `element_type` | Yes | `button`, `input`, `textarea` | | `element_index` | No | `[1]`, `[2]` | | `element_identifier` | No | `close`, `reveal`, `edit` | Examples: - `modal.button.close` - `password.button.reveal` - `inlineediting.textarea` - `switch.radio[1]` Components should support a `data-testid` prefix prop so consumers can namespace their test IDs (e.g., `my-prefix.inlineediting.button.edit`). --- ## Component Folder Structure ``` ComponentName/ ├── ComponentName.tsx # Main component implementation ├── ComponentName.test.tsx # Jest + RTL + jest-axe tests ├── ComponentName.module.css # CSS Modules styles (with design tokens) ├── index.ts # Clean public exports ├── Primitive/ # Internal building-block sub-components │ ├── ComponentPrimitive.tsx │ └── ComponentStyles.module.css └── variations/ # Standalone variant sub-components ├── ComponentVariantA.tsx └── ComponentVariantA.module.css ``` - Stories live under `src/stories/` in the design-system package, grouped by category (e.g., `clickable/`, `feedback/`). - The `index.ts` barrel file re-exports everything consumers need. All components must be exported from the package root `src/index.ts`. --- ## Testing ### Framework & Setup - **Vitest** as test runner - **@testing-library/react** for component rendering and queries - **jest-axe** for automated accessibility checks - Timezone forced to `UTC` (`TZ=UTC`) ### Test File Conventions - Name test files `*.test.tsx` or `*.test.ts`, co-located next to the source file. - Test file regex: `(/__tests__/.*|src/).*\.test.(js|jsx|ts|tsx)$` ### Writing Tests Import test globals explicitly: ```tsx import { describe, it, expect } from '@jest/globals'; ``` Use `@testing-library/react` for rendering: ```tsx import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; ``` **Every component test must include an accessibility check:** ```tsx import { axe } from 'jest-axe'; it('should render a11y html', async () => { const { container } = render(
, ); expect(container.firstChild).toMatchSnapshot(); const results = await axe(document.body); expect(results).toHaveNoViolations(); }); ``` **Interaction tests** — use `userEvent.setup()`, not `fireEvent` for user interactions: ```tsx it('should handle click', async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole('button')); }); ``` **Querying elements:** - Prefer `screen.getByRole()`, `screen.getByText()`, `screen.getByLabelText()` - Use `screen.getByTestId()` for `data-testid` attributes - Use `screen.queryBy*` for asserting absence **Mocking:** - Use `jest.fn()` for callback mocks - Mock `@talend/utils` when components generate IDs: ```tsx jest.mock('@talend/utils', () => { let i = 0; return { randomUUID: () => `mocked-uuid-${i++}`, }; }); ``` **Snapshots** — use `container.firstChild` with `toMatchSnapshot()`. --- ## Internationalization (i18n) Uses `react-i18next` backed by `i18next`. ### Namespaces Each package has its own i18n namespace: | Package | Namespace | | ------------ | ---------------- | | components | `tui-components` | | forms | `tui-forms` | ### Translation Keys - Format: `COMPONENTNAME_KEY` — prefix by the parent component name - Examples: `LIST_DISPLAY`, `HEADERBAR_GO_PORTAL`, `DELETE_RESOURCE_MESSAGE` Always provide a `defaultValue`: ```tsx t('SUFFIX_COMPONENT_KEY', { defaultValue: 'Displayed text' }); ``` For markup in translations, use the `Trans` component: ```tsx import { Trans } from 'react-i18next'; Are you sure you want to remove the {{ resourceLabel }} {{ resourceName }}? ``` Extract translation catalogs with `yarn extract-i18n` in the relevant package. --- ## Dependencies Management Follow these rules when adding dependencies to a package's `package.json`: ### `devDependencies` For build-only tools or packages that are also a `peerDependency`. No runtime impact. Examples: `@talend/scripts-core`, `react` (when also in peerDeps), `@types/*` (unless exported types depend on them), `i18next-scanner` ### `dependencies` For packages used at runtime that consumers don't need to configure themselves. Examples: `@talend/design-tokens`, `classnames`, `lodash`, `date-fns`, `react-transition-group` ### `peerDependencies` Only for packages the **consumer must import or configure** for the library to work. Examples: `react`, `react-dom`, `i18next`, `react-i18next`, `@talend/icons` ### Type Dependencies `@types/*` packages go in `devDependencies` unless the library's **exported types** depend on them — in that case, add to `dependencies`. --- ## Build & Module Formats Libraries produce dual output: | Format | Directory | Module | | -------- | --------- | --------- | | CommonJS | `lib/` | `main` | | ESM | `lib-esm/`| `module` | Build commands: ```bash talend-scripts build # CJS → lib/ talend-scripts build --esm # ESM → lib-esm/ ``` Package `exports` field should map both: ```json { "main": "lib/index.js", "module": "lib-esm/index.js", "exports": { ".": { "import": "./lib-esm/index.js", "require": "./lib/index.js" } } } ``` Babel config (`@talend/scripts-config-babel`): - `@babel/preset-env` (targets: last 1 year of browsers, no IE/Samsung/Opera mini) - `@babel/preset-react` with `runtime: 'automatic'` (no need to import React) - `@babel/preset-typescript` with `allExtensions: true, isTSX: true` --- ## Storybook - Stories go in `.stories.tsx` files - Type stories with `StoryFn` or `StoryObj` from `@storybook/react` - Use `action()` from `storybook/actions` for callback args - Documentation pages use `.stories.mdx` format - Stories should cover all component variations, states, and edge cases - Use design tokens and the design system's own components in stories Example structure: ```tsx import { StoryFn, StoryObj } from '@storybook/react'; import { action } from 'storybook/actions'; import { MyComponent } from '../../'; export default { component: MyComponent, title: 'Category/MyComponent', } as StoryObj; export const Default: StoryFn = args => ( ); ``` --- ## Versioning & Releases - Uses **Changesets** for version management. - Run `yarn changeset` to create a changeset file describing your change before opening a PR. - Base branch: `master` - Internal dependency updates use `patch` bumps. - Release: `yarn release` (runs `pre-release` then `changeset publish`). --- ## PR Checklist Before opening a pull request: - [ ] Run `yarn changeset` if a release is needed - [ ] Tests added for bug fixes and features - [ ] Documentation updated if applicable - [ ] Related design links or discussions included in the PR description - [ ] Breaking changes documented (update the [breaking change wiki](https://github.com/Talend/ui/wiki/BREAKING-CHANGE)) --- ## Git Hooks - **Husky** pre-commit hook runs `lint-staged` - `lint-staged` auto-formats all staged `*.{json,md,mdx,html,js,jsx,ts,tsx}` files with Prettier - Code is automatically formatted on every commit — no manual formatting needed --- ## Key ADRs (Architecture Decision Records) These documents in `docs/` define architectural choices. Read them before making structural changes: | ADR | Summary | | --- | ------- | | `adr-css-modules.md` | CSS Modules replace Styled Components for all new styling | | `adr-composition-vs-api.md` | Design system uses closed APIs over composition | | `adr-data-test.md` | `data-testid` naming convention for QA automation | | `adr-dependencies.md` | Guidelines for `dependencies` vs `peerDependencies` vs `devDependencies` | | `adr-2024-04-add-support-to-esm.md` | ESM support strategy and dual CJS/ESM output | ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: "npm" directory: "/" schedule: interval: "weekly" ignore: - dependency-name: "@storybook/*" - dependency-name: "@talend/*" - dependency-name: "@types/react*" versions: ^17 - dependency-name: "react*" versions: ^17 - dependency-name: "css-loader" update-types: [ "version-update:semver-major" ] - dependency-name: "sass-loader" update-types: [ "version-update:semver-major" ] - dependency-name: "style-loader" update-types: [ "version-update:semver-major" ] - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" ================================================ FILE: .github/workflows/changeset.yml ================================================ name: Changeset (Release) on: push: branches: - master permissions: contents: write deployments: read pull-requests: write statuses: write # This allows a subsequently queued workflow run to interrupt previous runs concurrency: group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' cancel-in-progress: true jobs: release: name: Release environment: main runs-on: ubuntu-latest steps: - name: Checkout Repo uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 with: # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits fetch-depth: 0 persist-credentials: false - name: Use Node.js uses: ./.github/actions/setup-node - name: has changeset file id: changesetfiles run: | count=$(find .changeset -name "*.md" -type f | wc -l) echo "count=$count" >> $GITHUB_OUTPUT if [ $count -gt 0 ]; then echo "Found $count md file(s)" find .changeset -name "*.md" -type f else echo "No md files found" fi - name: Install and Build if: steps.changesetfiles.outputs.count == 1 run: yarn --frozen-lockfile env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Install but do not build if: steps.changesetfiles.outputs.count > 1 run: yarn --ignore-scripts --frozen-lockfile env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Create Release Pull Request or Publish to npm id: changesets uses: changesets/action@6a0a831ff30acef54f2c6aa1cbbc1096b066edaf #v1.7.0 with: # This expects you to have a script called release which does a build for your packages and calls changeset publish publish: yarn release commit: "chore: prepare release" title: "chore: prepare release" env: GITHUB_TOKEN: ${{ secrets.CHANGESET_GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} update-cdn-content: needs: release environment: main runs-on: ubuntu-latest steps: - run: | curl -XPOST -u "build-travis-ci:${{ secrets.CDN_CONTENT_PAT }}" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" https://api.github.com/repos/talend/cdn-content/actions/workflows/download-talend-ui.yml/dispatches --data '{"ref": "main"}' ================================================ FILE: .github/workflows/clean-demo.yml ================================================ name: Delete PR folder in gh-pages on: pull_request: types: [closed] permissions: contents: write pull-requests: write statuses: write checks: write pages: write jobs: clean: runs-on: ubuntu-latest steps: - name: Checkout demo branch uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 with: path: demo ref: gh-pages - name: Delete PR folder run: | rm -rf ./demo/${{ github.event.number }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Commit demo for gh-pages uses: actions-js/push@5a7cbd780d82c0c937b5977586e641b2fd94acc5 #v1.5 with: directory: "./demo" github_token: ${{ secrets.GITHUB_TOKEN }} message: "doc: cleanup demo" branch: gh-pages ================================================ FILE: .github/workflows/demo.yml ================================================ name: Demo CI on: push: branches: - master permissions: contents: write pull-requests: write statuses: write checks: write pages: write # This allows a subsequently queued workflow run to interrupt previous runs concurrency: group: "${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}" cancel-in-progress: true jobs: build: name: Build and test environment: pull_request_unsafe runs-on: ubuntu-latest steps: - name: Checkout sources uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 - name: Use Node.js uses: ./.github/actions/setup-node - name: Install working-directory: ./ env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: yarn install --frozen-lockfile - name: Build Demo run: yarn test:demo - name: Checkout demo branch uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 with: path: demo ref: gh-pages - name: Add demo and commit it # symlink creation : workaround to be able to use service worker on storybook both in local and via github pages deployment run: | echo "Prepare demo folder" cd demo && git rm -rf --ignore-unmatch ./main && cd .. mkdir -p ./demo/main cp ./index.html ./demo/main/ mkdir ./demo/main/cmf mkdir ./demo/main/containers mkdir ./demo/main/design-system mkdir ./demo/main/faceted-search mkdir ./demo/main/theme mkdir ./demo/main/storybook-one cp -R packages/containers/storybook-static/* ./demo/main/containers cp -R packages/design-docs/storybook-static/* ./demo/main/design-system cp -R packages/faceted-search/storybook-static/* ./demo/main/faceted-search cp -R packages/theme/dist/* ./demo/main/theme cp -R packages/storybook-one/storybook-static/* ./demo/main/storybook-one echo Size of demo: du -d 1 -h ./demo/main cd demo && git add . - name: Commit demo for gh-pages uses: actions-js/push@5a7cbd780d82c0c937b5977586e641b2fd94acc5 #v1.5 with: directory: "./demo" github_token: ${{ secrets.GITHUB_TOKEN }} message: "doc: update demo" branch: gh-pages ================================================ FILE: .github/workflows/dependencies.yml ================================================ name: Upgrade dependencies on: workflow_dispatch: schedule: - cron: "0 10 * * WED" permissions: contents: write deployments: read pull-requests: write statuses: write jobs: upgrade: name: Upgrade dependencies environment: pull_request_unsafe runs-on: ubuntu-latest continue-on-error: true # we want the PR to popup even if sth goes wrong steps: - name: Checkout uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 - name: Use Node.js uses: ./.github/actions/setup-node - name: Upgrade dependencies run: | yarn --frozen-lockfile --ignore-scripts yarn talend-upgrade-deps --ignore-scripts yarn talend-upgrade-deps --scope=@talend --latest --ignore-scripts yarn talend-upgrade-deps --latest --dry > dependencies-latest.txt git add dependencies-latest.txt env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Create Pull Request uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0 with: reviewers: "@Talend/frontend-admins" commit-message: "chore: upgrade dependencies" title: "chore: upgrade dependencies" body: "Upgrade dependencies using `talend-scripts upgrade:deps`" branch: ci/chore/upgrade-dependencies token: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .github/workflows/icons.yml ================================================ name: Download icons from Figma on: repository_dispatch: workflow_dispatch: permissions: contents: write deployments: read pull-requests: write jobs: download: runs-on: ubuntu-latest name: Download icons from Figma environment: main defaults: run: working-directory: ./packages/icons steps: - name: Checkout sources uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 with: # Required when using a PAT for opening the PR persist-credentials: false - name: Use Node.js uses: ./.github/actions/setup-node - name: Download icons run: npx @talend/figma-icons-downloader env: FIGMA_ACCESS_TOKEN: ${{ secrets.STORYBOOK_FIGMA_ACCESS_TOKEN }} - name: Generate changeset & PR body id: get-pr-body run: | cd ../.. git add ./packages/icons/src while read STATUS ADDR do icon=`basename $ADDR .svg` size=`basename $(dirname $ADDR)` semver=`sed 's/A/minor/;s/D/major/;s/M/patch/' <<< $STATUS` verb=`sed 's/A/added/;s/D/removed/;s/M/changed/' <<< $STATUS` echo -e "---\n'@talend/icons': $semver\n---\n\n$verb icon \`$icon\` in size \`$size\`" > .changeset/$icon-$size-$semver.md done < <(git diff --name-status HEAD ./packages/icons/src/icon/**/*.svg) git add .changeset body=$(git diff --name-only HEAD .changeset/*.md | xargs -L1 sed -n '5p') body="${body//$'\n'/'%0A'}" echo ::set-output name=body::$body - name: Create Pull Request id: cpr uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0 with: commit-message: "chore(icons): from Figma" title: "chore(icons): from Figma" body: ${{ steps.get-pr-body.outputs.body }} branch: ci/icons token: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .github/workflows/pr-demo.yml ================================================ name: PR Demo CI on: pull_request: permissions: contents: write pull-requests: write statuses: write checks: write pages: write concurrency: group: "${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}" cancel-in-progress: true jobs: build: name: Build demo on PR environment: pull_request_unsafe runs-on: ubuntu-latest steps: - name: Checkout sources uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 - name: Use Node.js uses: ./.github/actions/setup-node - name: Install working-directory: ./ env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: yarn install --frozen-lockfile - name: Build Demo run: yarn test:demo - name: Checkout demo branch uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 with: path: demo ref: gh-pages - name: Add demo and commit it # symlink creation : workaround to be able to use service worker on storybook both in local and via github pages deployment run: | echo "Prepare demo folder" cd demo && git rm -rf --ignore-unmatch ${{ github.event.number }} && cd .. mkdir -p ./demo/${{ github.event.number }} cp ./index.html ./demo/${{ github.event.number }}/ mkdir ./demo/${{ github.event.number }}/cmf mkdir ./demo/${{ github.event.number }}/containers mkdir ./demo/${{ github.event.number }}/design-system mkdir ./demo/${{ github.event.number }}/faceted-search mkdir ./demo/${{ github.event.number }}/theme mkdir ./demo/${{ github.event.number }}/storybook-one cp -R packages/containers/storybook-static/* ./demo/${{ github.event.number }}/containers cp -R packages/design-docs/storybook-static/* ./demo/${{ github.event.number }}/design-system cp -R packages/faceted-search/storybook-static/* ./demo/${{ github.event.number }}/faceted-search cp -R packages/theme/dist/* ./demo/${{ github.event.number }}/theme cp -R packages/storybook-one/storybook-static/* ./demo/${{ github.event.number }}/storybook-one echo Size of demo: du -d 1 -h ./demo/${{ github.event.number }} cd demo && git add . - name: Commit demo for gh-pages uses: actions-js/push@5a7cbd780d82c0c937b5977586e641b2fd94acc5 #v1.5 with: directory: "./demo" github_token: ${{ secrets.GITHUB_TOKEN }} message: "doc: update demo from ${{ github.event.number }}" branch: gh-pages - name: Find Comment uses: peter-evans/find-comment@v4 id: fc with: issue-number: ${{ github.event.number }} body-includes: Storybook for this PR deployed on this - name: Create comment uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 #v5.0.0 if: steps.fc.outputs.comment-id == '' with: issue-number: ${{ github.event.number }} body: | Storybook for this PR deployed on this [github page](https://talend.github.io/ui/${{ github.event.number }}) ================================================ FILE: .github/workflows/pr-lint.yml ================================================ name: PR lint on: pull_request: permissions: contents: write deployments: read pull-requests: write # needed to annotate code statuses: write checks: write # This allows a subsequently queued workflow run to interrupt previous runs concurrency: group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' cancel-in-progress: true jobs: build: runs-on: ubuntu-latest environment: pull_request_unsafe name: Lint steps: - name: Checkout sources uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 with: persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal token fetch-depth: 0 # otherwise, you will failed to push refs to dest repo - name: Use Node.js uses: ./.github/actions/setup-node - name: Install run: yarn install --frozen-lockfile --ignore-scripts env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: eslint + stylelint continue-on-error: true id: eslint run: yarn lint - name: Merge lint uses: ./.github/actions/lint-merge-report with: base-branch: master head-branch: ${{ github.head_ref }} - name: Annotate Code Linting Results uses: ataylorme/eslint-annotate-action@d57a1193d4c59cbfbf3f86c271f42612f9dbd9e9 #v3.0.0 with: GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" report-json: ./eslint-report.json ================================================ FILE: .github/workflows/pr-test.yml ================================================ name: PR tests on: pull_request: # This allows a subsequently queued workflow run to interrupt previous runs concurrency: group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' cancel-in-progress: true permissions: contents: read deployments: read pull-requests: write # needed to write comment statuses: write jobs: build: runs-on: ubuntu-latest environment: pull_request_unsafe name: Build and test steps: - name: Checkout sources uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 - name: Use Node.js uses: ./.github/actions/setup-node - name: Install run: yarn install --frozen-lockfile env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Test run: yarn test:cov - name: Jest Coverage Comment uses: MishaKav/jest-coverage-comment@c480abe47ef4f7bcd87bd8b5e6043fdfb1c4d270 #1.0.32 with: multiple-files: | assets-api, ./packages/assets-api/coverage/coverage-summary.json cmf, ./packages/cmf/coverage/coverage-summary.json cmf-cqrs, ./packages/cmf-cqrs/coverage/coverage-summary.json cmf-router, ./packages/cmf-router/coverage/coverage-summary.json components, ./packages/components/coverage/coverage-summary.json containers, ./packages/containers/coverage/coverage-summary.json dataviz, ./packages/dataviz/coverage/coverage-summary.json design-system, ./packages/design-system/coverage/coverage-summary.json faceted-search, ./packages/faceted-search/coverage/coverage-summary.json flow-designer, ./packages/flow-designer/coverage/coverage-summary.json forms, ./packages/forms/coverage/coverage-summary.json http, ./packages/http/coverage/coverage-summary.json sagas, ./packages/sagas/coverage/coverage-summary.json stepper, ./packages/stepper/coverage/coverage-summary.json utils, ./packages/utils/coverage/coverage-summary.json - name: Check design-tokens run: | cd packages/design-tokens node ./scripts/compare.js src/light/_index.scss src/dark/_index.scss ================================================ FILE: .github/workflows/pre-release.yml ================================================ name: pre-release on: pull_request: types: - labeled jobs: integration-publish: if: github.event.pull_request != null && contains(github.event.pull_request.labels.*.name, 'deploy-npm') permissions: contents: read pull-requests: write packages: write runs-on: ubuntu-latest outputs: version: ${{ steps.version.outputs.version }} steps: - name: checkout repository uses: actions/checkout@v6 with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha }} - name: Use Node.js uses: ./.github/actions/setup-node - name: Install run: yarn install --frozen-lockfile - name: Pre-release talend/ui id: version run: | # FIXME: trigger changeset change without commit # generate a random small version POST_VERSION_RANDOM=$(node -e "console.log(Math.floor(Math.random() * 10000))") yarn changeset pre enter next-${POST_VERSION_RANDOM} yarn changeset version # echo diff to see version changes and save it to reuse it after { echo "VERSION_DIFF<> $GITHUB_OUTPUT yarn changeset publish --no-git-checks - name: Comment on the PR with the package version uses: actions-ecosystem/action-create-comment@v1 with: github_token: ${{ secrets.GITHUB_TOKEN }} body: | 🤖 Your package integration package is ready: `${{ steps.version.outputs.VERSION_DIFF }}` - name: Remove deploy-npm label if: always() uses: actions-ecosystem/action-remove-labels@v1 with: github_token: ${{ secrets.GITHUB_TOKEN }} labels: deploy-npm ================================================ FILE: .github/workflows/visual-testing.yml ================================================ name: Visual testing on: workflow_dispatch: pull_request: # By default, a workflow only runs when a pull_request event's activity type is opened, synchronize, or reopened types: [labeled, synchronize, opened, reopened, ready_for_review] branches: - master push: branches: - master # This allows a subsequently queued workflow run to interrupt previous runs concurrency: group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' cancel-in-progress: true permissions: contents: read deployments: read pull-requests: write statuses: write jobs: build: runs-on: ubuntu-latest environment: pull_request_unsafe if: ( github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'need visual approval') ) steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 with: fetch-depth: 0 - name: Use Node.js uses: ./.github/actions/setup-node - name: Install dependencies run: yarn --frozen-lock - name: Publish PR to DS Chromatic if: github.ref != 'refs/heads/master' # https://github.com/chromaui/chromatic-cli/issues/739 uses: chromaui/action@f191a0224b10e1a38b2091cefb7b7a2337009116 #v16.0.0 with: token: ${{ secrets.GITHUB_TOKEN }} projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} workingDir: packages/storybook-one exitZeroOnChanges: true # Option to prevent the workflow from failing in PR # Handle monorepos https://www.chromatic.com/docs/monorepos forceRebuild: true - name: Publish Master to DS Chromatic if: github.ref == 'refs/heads/master' # https://github.com/chromaui/chromatic-cli/issues/739 uses: chromaui/action@f191a0224b10e1a38b2091cefb7b7a2337009116 #v16.0.0 with: token: ${{ secrets.GITHUB_TOKEN }} projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} workingDir: packages/storybook-one autoAcceptChanges: true # Option to accept any change for this baseline refresh forceRebuild: true ================================================ FILE: .github/workflows/yarn-deduplicate.yml ================================================ name: yarn-deduplicate on: pull_request: paths: - "yarn.lock" # This allows a subsequently queued workflow run to interrupt previous runs concurrency: group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' cancel-in-progress: true permissions: contents: write deployments: read pull-requests: write # needed to write comment in PR jobs: dedupe: runs-on: ubuntu-latest name: Deduplicate environment: pull_request_unsafe steps: - name: Checkout sources uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1 with: persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal token fetch-depth: 0 # otherwise, you will failed to push refs to dest repo - name: Use Node.js uses: ./.github/actions/setup-node - name: yarn-deduplicate id: deduplicate run: | yarn install --frozen-lockfile --ignore-scripts yarn yarn-deduplicate echo "::set-output name=diff::$(git status --short yarn.lock)" env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Commit dedupe if: steps.deduplicate.outputs.diff uses: actions-js/push@5a7cbd780d82c0c937b5977586e641b2fd94acc5 #1.5 with: github_token: ${{ secrets.GITHUB_TOKEN }} message: "chore: yarn-deduplicate" branch: ${{ github.head_ref }} ================================================ FILE: .gitignore ================================================ /.static # Log files # *.log # Mac OS index files # .DS_Store # Eclipse project files # .project .settings bin/ # Intellij project files # .idea/ *.ipr *.iml *.iws out/ # JavaScript/NodeJS files # .npm/ npm-debug.log node_modules/ .node-gyp coverage/ # Compilation output # target/ *.class # Mobile Tools for Java (J2ME) .mtj.tmp/ # Package Files # *.jar *.war *.ear # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* .classpath # Talend web apps build directory build/ /packages/*/i18n/ tmp/ lib/ lib-esm/ storybook-static/ dist/ eslint-report.json stylelint-report.json i18n-extract .test-cache ================================================ FILE: .husky/pre-commit ================================================ #!/bin/sh . "$(dirname "$0")/_/husky.sh" npm run lint-staged ================================================ FILE: .nojekyll ================================================ ================================================ FILE: .npmignore ================================================ # Logs logs *.log npm-debug.log* # Runtime data pids *.pid *.seed # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage # nyc test coverage .nyc_output # Grunt intermediate storage # (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # node-waf configuration .lock-wscript # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules jspm_packages # Optional npm cache directory .npm # Optional REPL history .node_repl_history test npm-audit ================================================ FILE: .npmrc ================================================ @talend:registry=https://npm.pkg.github.com/ ================================================ FILE: .prettierignore ================================================ .changeset .github .husky .idea .surge build dist node_modules __fixtures__ tools/scripts-config-storybook-lib/.storybook-templates/main.js ================================================ FILE: .prettierrc.js ================================================ module.exports = { ...require('@talend/scripts-config-prettier'), }; ================================================ FILE: .sass-lint.yml ================================================ options: merge-default-rules: false # formatter: html # output-file: 'linters/sass-lint.html' # File Options files: include: 'src/**/*.s+(a|c)ss' ignore: - 'src/app/css/vendors/libs/**/*.*' # Rule Configuration rules: border-zero: - 2 - convention: 'none' brace-style: - 1 - style: 'stroustrup' allow-single-line: false class-name-format: - 2 - allow-leading-underscore: false convention: 'hyphenatedlowercase' clean-import-paths: - 2 - leading-underscore: false filename-extension: false empty-args: - 2 - include: false extends-before-declarations: 2 extends-before-mixins: 2 final-newline: - 1 - include: true force-attribute-nesting: 0 force-element-nesting: 0 force-pseudo-nesting: 0 function-name-format: - 2 - allow-leading-underscore: false convention: 'hyphenatedlowercase' hex-length: - 2 - style: 'short' hex-notation: - 0 id-name-format: - 2 - allow-leading-underscore: false convention: 'hyphenatedlowercase' indentation: - 1 - size: tab leading-zero: - 2 - include: true mixin-name-format: - 2 - allow-leading-underscore: true convention: 'hyphenatedlowercase' mixins-before-declarations: 2 nesting-depth: - 2 - max-depth: 3 no-color-keywords: 0 no-color-literals: 0 no-css-comments: 0 no-debug: 2 no-duplicate-properties: 2 no-empty-rulesets: 2 no-extends: 0 no-ids: 0 no-important: 2 no-invalid-hex: 2 no-mergeable-selectors: 0 no-misspelled-properties: 2 no-qualifying-elements: - 2 - allow-element-with-attribute: true allow-element-with-class: false allow-element-with-id: false no-trailing-zero: 1 no-transition-all: 2 no-url-protocols: 2 no-vendor-prefixes: 1 no-warn: 2 one-declaration-per-line: 2 placeholder-in-extend: 2 placeholder-name-format: - 2 - allow-leading-underscore: false convention: 'hyphenatedlowercase' property-sort-order: 0 property-units: 0 quotes: - 2 - style: 'single' shorthand-values: - 1 - allowed-shorthands: - 1 - 2 single-line-per-selector: 1 space-after-bang: - 1 - include: false space-after-colon: - 1 - include: true space-after-comma: - 1 - include: true space-around-operator: - 1 - include: true space-before-bang: - 1 - include: true space-before-brace: - 1 - include: true space-before-colon: - 1 - include: false space-between-parens: - 1 - include: false trailing-semicolon: - 2 - include: true url-quotes: 2 variable-for-property: 0 variable-name-format: - 2 - allow-leading-underscore: false convention: 'hyphenatedlowercase' zero-unit: - 1 - include: false ================================================ FILE: .semgrepignore ================================================ # Items added to this file will be ignored by Semgrep. # # This file uses .gitignore syntax: # # To ignore a file anywhere it occurs in your project, enter a # glob pattern here. E.g. "*.min.js". # # To ignore a directory anywhere it occurs in your project, add # a trailing slash to the file name. E.g. "dist/". # # To ignore a file or directory only relative to the project root, # include a slash anywhere except the last character. E.g. # "/dist/", or "src/generated". # # Some parts of .gitignore syntax are not supported, and patterns # using this syntax will be dropped from the ignore list: # - Explicit "include syntax", e.g. "!kept/". # - Multi-character expansion syntax, e.g. "*.py[cod]" # # To include ignore patterns from another file, start a line # with ':include', followed by the path of the file. E.g. # ":include path/to/other/ignore/file". # # To ignore a file with a literal ':' character, escape it with # a backslash, e.g. "\:foo". # Ignore git items .gitignore .git/ :include .gitignore semgrep-core/tests/ # submodule, generated code semgrep-core/tree-sitter-lang/ pfff/ semgrep/tests/e2e/targets/ semgrep/tests/performance/targets/ semgrep/tests/e2e/snapshots/ # rules being tested for performance perf/rules/ perf/r2c-rules/ # END OF DEFAULT SEMGREPIGNORE FILE # TALEND SEMGREPIGNORE *.test.js *.test.tsx *.stories.js ================================================ FILE: .tool-versions ================================================ nodejs 24.14.0 yarn 1.22.22 ================================================ FILE: .vscode/settings.json ================================================ { "prettier.prettierPath": "./node_modules/prettier/index.cjs", "eslint.workingDirectories": [ { "pattern": "packages/**" }, { "pattern": "tools/**" }, { "pattern": "fork/**" } ], "typescript.validate.enable": true, "javascript.validate.enable": true } ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to the project [Contribution guide](https://github.com/Talend/tools/blob/master/tools-root-github/CONTRIBUTING.md) ## Code style [HTML code style](https://github.com/Talend/ui/wiki/HTML-coding-style) [Javascript code style](https://github.com/Talend/ui/wiki/Javascript-coding-style) [CSS code style](https://github.com/Talend/ui/wiki/CSS-coding-style) ================================================ FILE: I18n.md ================================================ # I18n UI uses [react-i18n](https://react.i18next.com/) to make the components internationalizable. This is based on [i18next](https://www.i18next.com/). The application defines the strategy how to get the translations. ### Namespaces Each packages has their own namespace: | Package | Namespace | | ---------- | :------------: | | components | tui-components | | forms | tui-forms | ### Creating a i18n components Each components who has to be internationalizable are exported by default with translate from 'react-i18next' with its namespace. **The component can be used within an internationalized application or not. We import a default i18n configuration that will be ignored if one is provided in the context by react-i18next provider.** ```javascript import React from 'react'; import { withTranslation } from 'react-i18next'; import { I18N_DOMAIN } from '../constants'; import '../translate'; const HelloWorld = ({ t }) =>
{`Hi ${t('HELLO', { defaultValue: 'Hello world' })}`}
; export default withTranslation(I18N_DOMAIN)(HelloWorld); ``` ### Translate In the framework, at each time that the `t` method is called, it is a default value that is displayed, if not translated explicitly by the app. ```javascript t('SUFFIX_COMPONENT_KEY', { defaultValue: 'translated' }); ``` The key has to be prefixed by the main current component to translate. e.g: LIST_DISPLAY HEADERBAR_GO_PORTAL ### Specific translation cases In some cases, you want to add some html markup or style to your translations. For this case, you can use Trans component https://react.i18next.com/components/trans-component.html ```jsx import { Trans } from 'react-i18next'; Are you sure you want to remove the {{ resourceLabel: resourceInfo.resourceTypeLabel }} {{ resourceName: resourceInfo.label }} ? ; ``` For this case, the translation json value is : `Are you sure you want to remove the <1>{{ resourceLabel }} <2><1>{{ resourceName }}?` More infos in the react-i18next's documentation ## Use i18n with UI in your App ### Create an instance of i18n `yarn add i18next` ```javascript import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; i18n.use(initReactI18next).init({ debug: false, wait: true, // globally set to wait for loaded translations in translate hoc }); export default i18n; ``` The UI framework have to be nested into a Provider to allow to translate the labels. The provider is responsible to pass the i18next instance down to all the translate hocs using react context. Next, you need to nest the application in the I18nextProvider with the previous i18n created in order to your environnement: #### Angular Provider with ng-react Each components 'ng-react' will load his provider with a i18n given by the props. The components creates his react Provider with the i18n given. ```javascript import React from 'react'; import translate from 'react-i18next'; import i18n from 'i18next'; const TranslatedApp = translate(I18N_DOMAIN, { i18n })(App); const AppComponent = props => ; angular .module('app', ['react']) .value('AppComponent', AppComponent) .controller('appController', () => { this.props = { i18n, }; }); ; ``` ## Extract a catalog of the key in the framework ```bash yarn extract-i18n ``` ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: README.md ================================================ # UI That repository was created in an effort to simplify the development of Talend's front-end stack. ## Goals - Single code repository / Multiple packages - Global (cross package) test and review tools - Easy cross packages development - Share and love open source. ## The stack - [react-cmf](https://github.com/Talend/ui/tree/master/packages/cmf) - [react-talend-containers](https://github.com/Talend/ui/tree/master/packages/containers) - [react-talend-components](https://github.com/Talend/ui/tree/master/packages/components) - [react-talend-forms](https://github.com/Talend/ui/tree/master/packages/forms) - [talend-icons](https://github.com/Talend/ui/tree/master/packages/icons) - [bootstrap-talend-theme](https://github.com/Talend/ui/tree/master/packages/theme) ## Tools (dev environment) We have quick access from the root to the following npm scripts: - postinstall (trigger build of every package) - pre-release (trigger build of UMD of supported package) - start (start the playground) - test - lint The CI will ensure on each PR that test and lint are OK before you can merge your pull request. It will also provide you a demo so reviewers can play with your change and try to find impact of your PR on other packages. ## Versions and breaking changes The stack is stable and we do our best to not break APIs. To handle versions we rely on [**changeset**](https://github.com/atlassian/changesets/). So on each PR you will be able to request a release intent along your changes. It will fill automatically the changelog at release time. Do not forget to commit the file outputed by the changeset CLI. ## More If you want to know more (release, versions, etc ...) please take a look on [the wiki](https://github.com/Talend/ui/wiki) ================================================ FILE: SECURITY.md ================================================ # Security Policy ## Supported Versions We use `changeset` to provide versioning for our packages with fixes, features and major release in case of breaking changes. The latest package is always the better one. We also provide [talend-scripts upgrade:deps](./tools/upgrade-deps) scripts to make it easier to keep our packages and apps aligned and updated. The script comes with options about security use cases, so please read the documentation first. Distance to latest from npm is added on a [dependencies.txt](./dependencies.txt) file on each upgrade PR. ## Reporting a Vulnerability For information on how to report a new security problem please see [here](https://www.talend.com/security/vulnerability-disclosure/). Our existing security advisories are published [here](https://www.talend.com/security/incident-response/). ================================================ FILE: babel.config.js ================================================ // this file is needed by vscode module.exports = { extends: '@talend/scripts-config-babel', }; ================================================ FILE: dependencies-latest.txt ================================================ yarn run v1.22.22 $ /home/runner/work/ui/ui/node_modules/.bin/talend-upgrade-deps --latest --dry check versions of /home/runner/work/ui/ui/package.json using latest "@types/react": "^18.3.28" => "^19.2.14" "@types/react-dom": "^18.3.7" => "^19.2.3" "tar": ">=7.5.4" => "^7.5.13" "husky": "^8.0.3" => "^9.1.7" "lint-staged": "^15.5.2" => "^16.4.0" "typescript": "^5.9.3" => "^6.0.2" check versions of packages/a11y/package.json using latest "@testing-library/react": "^14.3.1" => "^16.3.2" "@types/react": "^18.3.28" => "^19.2.14" "@types/react-dom": "^18.3.7" => "^19.2.3" "date-fns": "^3.6.0" => "^4.1.0" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" check versions of packages/assets-api/package.json using latest "@types/node": "^6.14.13" => "^25.5.0" "read-pkg-up": "^7.0.1" => "^11.0.0" check versions of packages/cmf-cqrs/package.json using latest "immutable": "^3.8.3" => "^5.1.5" "@testing-library/react": "^14.3.1" => "^16.3.2" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" check versions of packages/cmf-router/package.json using latest "lodash": "^4.18.0" => "^4.17.21" "react-redux": "^7.2.9" => "^9.2.0" "react-router": "~6.3.0" => "^7.13.2" "react-router-dom": "~6.3.0" => "^7.13.2" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" check versions of packages/cmf/package.json using latest "commander": "^6.2.1" => "^14.0.3" "immutable": "^3.8.3" => "^5.1.5" "lodash": "^4.18.0" => "^4.17.21" "nested-combine-reducers": "^1.2.2" => "^2.0.0" "react-redux": "^7.2.9" => "^9.2.0" "redux": "^4.2.1" => "^5.0.1" "redux-thunk": "^2.4.2" => "^3.1.0" "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "@testing-library/react": "^14.3.1" => "^16.3.2" "node-fetch": "^2.7.0" => "^3.3.2" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" check versions of packages/components/package.json using latest "date-fns": "^3.6.0" => "^4.1.0" "dom-helpers": "^3.4.0" => "^6.0.1" "immutable": "^3.8.3" => "^5.1.5" "lodash": "^4.18.0" => "^4.17.21" "react-autowhatever": "10.2.0" => "^10.2.1" "react-grid-layout": "^1.5.3" => "^2.2.3" "react-is": "^18.3.1" => "^19.2.4" "react-transition-group": "^2.9.0" => "^4.4.5" "recharts": "^2.15.4" => "^3.8.1" "styled-components": "^5.3.11" => "^6.3.12" "warning": "^3.0.0" => "^4.0.3" "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "@testing-library/react": "^14.3.1" => "^16.3.2" "@types/react": "^18.3.28" => "^19.2.14" "@types/react-dom": "^18.3.7" => "^19.2.3" "i18next": "^23.16.8" => "^26.0.3" "jsdom": "^26.1.0" => "^29.0.1" "react": "^18.3.1" => "^19.2.4" "react-a11y": "^0.3.4" => "^1.1.0" "react-dom": "^18.3.1" => "^19.2.4" "react-i18next": "^13.5.0" => "^17.0.2" "react-router-dom": "~6.3.0" => "^7.13.2" "react-test-renderer": "^18.3.1" => "^19.2.4" check versions of packages/containers/package.json using latest "immutable": "^3.8.3" => "^5.1.5" "lodash": "^4.18.0" => "^4.17.21" "reselect": "^2.5.4" => "^5.1.1" "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "@testing-library/react": "^14.3.1" => "^16.3.2" "i18next": "^23.16.8" => "^26.0.3" "msw": "2.12.7" => "^2.12.14" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-i18next": "^13.5.0" => "^17.0.2" "react-test-renderer": "^18.3.1" => "^19.2.4" check versions of packages/dataviz/package.json using latest "date-fns": "^3.6.0" => "^4.1.0" "lodash": "^4.18.0" => "^4.17.21" "recharts": "^2.15.4" => "^3.8.1" "@testing-library/react": "^14.3.1" => "^16.3.2" "@types/node": "^6.14.13" => "^25.5.0" "@types/react": "^18.3.28" => "^19.2.14" "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "i18next": "^23.16.8" => "^26.0.3" "jsdom": "^28.1.0" => "^29.0.1" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-i18next": "^13.5.0" => "^17.0.2" check versions of packages/design-docs/package.json using latest "algoliasearch": "^4.27.0" => "^5.50.0" "pkg-dir": "^7.0.0" => "^9.0.0" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "@types/react": "^18.3.28" => "^19.2.14" "i18next": "^23.16.8" => "^26.0.3" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-router-dom": "~6.3.0" => "^7.13.2" check versions of packages/design-system/package.json using latest "@floating-ui/react": "^0.26.28" => "^0.27.19" "react-is": "^18.3.1" => "^19.2.4" "react-transition-group": "^2.9.0" => "^4.4.5" "@types/react": "^18.3.28" => "^19.2.14" "@types/react-dom": "^18.3.7" => "^19.2.3" "@types/react-is": "^18.3.1" => "^19.2.0" "@types/react-transition-group": "^2.9.2" => "^4.4.12" "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "concurrently": "^8.2.2" => "^9.2.1" "i18next": "^23.16.8" => "^26.0.3" "jest-axe": "^8.0.0" => "^10.0.0" "jsdom": "^26.1.0" => "^29.0.1" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-i18next": "^13.5.0" => "^17.0.2" "react-router-dom": "~6.3.0" => "^7.13.2" check versions of packages/design-tokens/package.json using latest check versions of packages/faceted-search-query-client/package.json using latest "lodash": "^4.18.0" => "^4.17.21" check versions of packages/faceted-search/package.json using latest "date-fns": "^3.6.0" => "^4.1.0" "lodash": "^4.18.0" => "^4.17.21" "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "@testing-library/react": "^14.3.1" => "^16.3.2" "i18next": "^23.16.8" => "^26.0.3" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-i18next": "^13.5.0" => "^17.0.2" check versions of packages/flow-designer/package.json using latest "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "@testing-library/react": "^14.3.1" => "^16.3.2" "@types/node": "^6.14.13" => "^25.5.0" "@types/react": "^18.3.28" => "^19.2.14" "@types/react-test-renderer": "^18.3.1" => "^19.1.0" "i18next": "^23.16.8" => "^26.0.3" "immutable": "^3.8.3" => "^5.1.5" "lodash": "^4.18.0" => "^4.17.21" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-i18next": "^13.5.0" => "^17.0.2" "react-redux": "^7.2.9" => "^9.2.0" "react-test-renderer": "^18.3.1" => "^19.2.4" "redux": "^4.2.1" => "^5.0.1" "redux-thunk": "^2.4.2" => "^3.1.0" "reselect": "^4.1.8" => "^5.1.1" check versions of packages/forms/package.json using latest "ace-builds": "1.10.1" => "^1.43.6" "ajv": "^6.14.0" => "^8.18.0" "lodash": "^4.18.0" => "^4.17.21" "react-autowhatever": "10.2.0" => "^10.2.1" "react-ace": "10.1.0" => "^14.0.1" "react-jsonschema-form": "0.51.0" => "^1.8.1" "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "@testing-library/react": "^14.3.1" => "^16.3.2" "i18next": "^23.16.8" => "^26.0.3" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-i18next": "^13.5.0" => "^17.0.2" "react-test-renderer": "^18.3.1" => "^19.2.4" check versions of packages/http/package.json using latest "node-fetch": "^2.7.0" => "^3.3.2" "react-dom": "^18.3.1" => "^19.2.4" "react": "^18.3.1" => "^19.2.4" check versions of packages/icons/package.json using latest "@types/node": "^20.19.37" => "^25.5.0" "mkdirp": "^1.0.4" => "^3.0.1" "react": "^18.3.1" => "^19.2.4" "svgo": "^3.3.3" => "^4.0.1" "typescript": "^5.9.3" => "^6.0.2" "vite": "^7.3.1" => "^8.0.3" check versions of packages/local-libs-webpack-plugin/package.json using latest check versions of packages/playground-vite/package.json using latest "i18next": "^23.16.8" => "^26.0.3" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-i18next": "^13.5.0" => "^17.0.2" "@vitejs/plugin-react": "^4.7.0" => "^6.0.1" "i18next-http-backend": "^1.4.5" => "^3.0.4" "vite": "^7.3.1" => "^8.0.3" check versions of packages/playground/package.json using latest "i18next": "^23.16.8" => "^26.0.3" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-i18next": "^13.5.0" => "^17.0.2" check versions of packages/router-bridge/package.json using latest "react": "^18.3.1" => "^19.2.4" "react-router-dom": "~6.3.0" => "^7.13.2" check versions of packages/sagas/package.json using latest "immutable": "^3.8.3" => "^5.1.5" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" check versions of packages/stepper/package.json using latest "lodash": "^4.18.0" => "^4.17.21" "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "i18next": "^23.16.8" => "^26.0.3" "immutable": "^3.8.3" => "^5.1.5" "jsdom": "^26.1.0" => "^29.0.1" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-i18next": "^13.5.0" => "^17.0.2" "react-redux": "^7.2.9" => "^9.2.0" "react-transition-group": "^2.9.0" => "^4.4.5" check versions of packages/storybook-cmf/package.json using latest "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "@testing-library/react": "^14.3.1" => "^16.3.2" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-redux": "^7.2.9" => "^9.2.0" check versions of packages/storybook-docs/package.json using latest "algoliasearch": "^4.27.0" => "^5.50.0" "react": "^18.3.1" => "^19.2.4" "@figma/rest-api-spec": "^0.36.0" => "^0.37.0" "@types/node": "^6.14.13" => "^25.5.0" "@types/react": "^18.3.28" => "^19.2.14" "@types/react-dom": "^18.3.7" => "^19.2.3" "sass-loader": "^14.2.1" => "^16.0.7" "webpack-cli": "^6.0.1" => "^7.0.2" check versions of packages/storybook-one/package.json using latest "lodash": "^4.18.0" => "^4.17.21" "pkg-dir": "^7.0.0" => "^9.0.0" "@types/react": "^18.3.28" => "^19.2.14" "i18next": "^23.16.8" => "^26.0.3" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-router-dom": "~6.3.0" => "^7.13.2" check versions of packages/theme/package.json using latest "postcss-preset-env": "^7.8.3" => "^11.2.0" "sass-loader": "^14.2.1" => "^16.0.7" "style-loader": "^3.3.4" => "^4.0.0" "webpack-cli": "^6.0.1" => "^7.0.2" check versions of packages/utils/package.json using latest "date-fns": "^3.6.0" => "^4.1.0" "lodash": "^4.18.0" => "^4.17.21" check versions of tools/babel-plugin-assets-api/package.json using latest "read-pkg-up": "^7.0.1" => "^11.0.0" "babel-plugin-tester": "^10.1.0" => "^12.0.0" "@eslint/js": "^9.39.4" => "^10.0.1" "globals": "^15.15.0" => "^17.4.0" "react": "^18.3.1" => "^19.2.4" check versions of tools/babel-plugin-import-d3/package.json using latest "babel-plugin-tester": "^10.1.0" => "^12.0.0" check versions of tools/babel-plugin-import-from-index/package.json using latest "babel-plugin-tester": "^10.1.0" => "^12.0.0" "@eslint/js": "^9.39.4" => "^10.0.1" "globals": "^15.15.0" => "^17.4.0" check versions of tools/babel-plugin-import-from-lib/package.json using latest "babel-plugin-tester": "^10.1.0" => "^12.0.0" check versions of tools/cmf-webpack-plugin/package.json using latest "lodash": "^4.18.0" => "^4.17.21" check versions of tools/eslint-plugin/package.json using latest check versions of tools/scripts-cmf/package.json using latest "commander": "^6.2.1" => "^14.0.3" "deepmerge": "^1.5.2" => "^4.3.1" "i18next": "^23.16.8" => "^26.0.3" "lodash": "^4.18.0" => "^4.17.21" "mkdirp": "^1.0.4" => "^3.0.1" check versions of tools/scripts-config-babel/package.json using latest "babel-core": "^7.0.0-bridge.0" => "^6.26.3" "@eslint/js": "^9.39.4" => "^10.0.1" "globals": "^15.15.0" => "^17.4.0" check versions of tools/scripts-config-cdn/package.json using latest "read-pkg-up": "^7.0.1" => "^11.0.0" "@eslint/js": "^9.39.4" => "^10.0.1" "globals": "^15.15.0" => "^17.4.0" check versions of tools/scripts-config-eslint/package.json using latest "@eslint/js": "^9.39.4" => "^10.0.1" "@testing-library/dom": "^9.3.4" => "^10.4.1" "globals": "^15.15.0" => "^17.4.0" check versions of tools/scripts-config-prettier/package.json using latest "@trivago/prettier-plugin-sort-imports": "^4.3.0" => "^6.0.2" check versions of tools/scripts-config-react-webpack/package.json using latest "@sentry/webpack-plugin": "^1.21.0" => "^5.1.1" "@welldone-software/why-did-you-render": "^7.0.1" => "^10.0.1" "babel-loader": "^9.2.1" => "^10.1.1" "postcss-safe-parser": "^6.0.0" => "^7.0.1" "regenerator-runtime": "^0.13.11" => "^0.14.1" "sass-loader": "^14.2.1" => "^16.0.7" "source-map-loader": "^4.0.2" => "^5.0.0" "style-loader": "^3.3.4" => "^4.0.0" "webpack-bundle-analyzer": "^4.10.2" => "^5.3.0" "webpack-cli": "^6.0.1" => "^7.0.2" check versions of tools/scripts-config-storybook-lib/package.json using latest "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "i18next": "^23.16.8" => "^26.0.3" "i18next-http-backend": "^1.4.5" => "^3.0.4" "vite": "^7.3.1" => "^8.0.3" "lodash": "^4.18.0" => "^4.17.21" "msw": "2.12.7" => "^2.12.14" "react-i18next": "^13.5.0" => "^17.0.2" "@types/react": "^18.3.28" => "^19.2.14" "typescript": "^5.9.3" => "^6.0.2" check versions of tools/scripts-config-stylelint/package.json using latest check versions of tools/scripts-config-typescript/package.json using latest check versions of tools/scripts-core/package.json using latest "babel-loader": "^9.2.1" => "^10.1.1" "fs-extra": "^10.1.0" => "^11.3.4" "lodash": "^4.18.0" => "^4.17.21" "typescript": "^5.9.3" => "^6.0.2" "webpack-merge": "^5.10.0" => "^6.0.1" "yargs": "^15.4.1" => "^18.0.0" check versions of tools/scripts-locales/package.json using latest check versions of tools/scripts-publish-local/package.json using latest check versions of tools/scripts-utils/package.json using latest "fs-extra": "^10.1.0" => "^11.3.4" "glob": "^11.1.0" => "^13.0.6" "which": "^2.0.2" => "^6.0.1" check versions of tools/scripts-yarn-workspace/package.json using latest check versions of tools/upgrade-deps/package.json using latest check versions of fork/bootstrap-sass/package.json using latest check versions of fork/dynamic-cdn-webpack-plugin/package.json using latest "read-pkg-up": "^7.0.1" => "^11.0.0" "@eslint/js": "^9.39.4" => "^10.0.1" "globals": "^15.15.0" => "^17.4.0" "webpack-cli": "^6.0.1" => "^7.0.2" "webpack-manifest-plugin": "^5.0.1" => "^6.0.1" check versions of fork/json-schema-form-core/package.json using latest "objectpath": "^1.2.2" => "^2.0.0" "@types/chai": "^3.5.2" => "^5.2.3" "@types/node": "^6.14.13" => "^25.5.0" check versions of fork/module-to-cdn/package.json using latest "mkdirp": "^1.0.4" => "^3.0.1" "@eslint/js": "^9.39.4" => "^10.0.1" "globals": "^15.15.0" => "^17.4.0" check versions of fork/react-bootstrap/package.json using latest "dom-helpers": "^3.4.0" => "^6.0.1" "react-overlays": "^0.9.3" => "^5.2.1" "react-transition-group": "^2.9.0" => "^4.4.5" "uncontrollable": "^7.2.1" => "^9.0.0" "warning": "^3.0.0" => "^4.0.3" "@vitejs/plugin-react": "^5.2.0" => "^6.0.1" "@testing-library/react": "^14.3.1" => "^16.3.2" "chai": "^4.5.0" => "^6.2.2" "chalk": "^2.4.2" => "^5.6.2" "lodash": "^4.18.0" => "^4.17.21" "react": "^18.3.1" => "^19.2.4" "react-dom": "^18.3.1" => "^19.2.4" "react-test-renderer": "^18.3.1" => "^19.2.4" "sinon": "^11.1.2" => "^21.0.3" Done in 122.82s. ================================================ FILE: docs/adr-2024-04-add-support-to-esm.md ================================================ # ADR: Add support to ECMAScript Modules (ESM) ## Context Our build and bundling setup currently uses CommonJS modules along with webpack and the dynamic-cdn-webpack-plugin. To streamline our development workflow and reduce complexity, we are transitioning from yarn to pnpm. However, it has been identified that pnpm is not compatible with dynamic-cdn-webpack-plugin. This incompatibility, along with the decision to remove the plugin, has resulted in a degradation of the developer experience, primarily through increased build times. At the same time, the entire frontend world is moving towards ECMAScript Modules (ESM). Modern browsers that our customers use now support ESM natively. All existing frameworks are now relying on Vite for the build process, which, under the hood, relies on ESM. Therefore, having to configure a complex toolchain is becoming obsolete. Given this changing context, we can reevaluate our decisions around the "talend-scripts build\*" toolchain. ## Problem The transition from yarn to pnpm has uncovered an incompatibility with dynamic-cdn-webpack-plugin, exacerbating the decision to discontinue using this plugin. This has adversely impacted the developer experience by elongating the build times, a significant concern as it can hinder our overall productivity and agility. ## Decision Our packages must export ESM to be futur proof and let us use modern tooling like vite or parcel. ## Alternatives Considered - **Sticking with webpack and dynamic-cdn-webpack-plugin**: This was initially considered to maintain our current setup and avoid the complexities associated with migration. However, given the incompatibility with pnpm and the underlying issues related to complexity and inefficiency in build times, this option was deemed unsuitable. - **Switching to another build tool without adopting ESM**: Several other build tools could potentially improve build times. However, without addressing the fundamental shift towards ESM in the JavaScript ecosystem, this would be a short-term fix rather than a long-term solution. - **Migrating to Vite while keeping our packages in CommonJS**: This alternative involves moving to Vite for its development speed advantages but not converting our packages to ESM. While this approach could reduce the immediate workload and avoid potential issues with third-party CommonJS dependencies, it would limit our ability to fully leverage Vite’s capabilities. Vite is optimized for ESM, and using CommonJS may result in suboptimal build performance and hinder live module reloading, affecting developer experience and potentially leading to more complex configurations. ## Consequences - **Positive**: Moving to ESM and adopting Vite is expected to reduce build times, enhancing developer experience and productivity. It aligns our development practices with the modern JavaScript ecosystem's move towards ESM. - **Negative**: The migration from CommonJS to ESM syntax could require significant effort. It might also temporarily disrupt our development workflow and necessitate additional training for developers not yet familiar with ESM or Vite. - **Risks**: There is a risk of encountering third-party libraries not yet compatible with ESM, which could complicate the migration process. ================================================ FILE: docs/adr-composition-vs-api.md ================================================ # CSS Modules ## Composition vs closed component APIs ## Problems and definitions **Composition** is what we do when we assemble HTML or JSX elements to build a cohesive whole. For instance: ```tsx ``` The combination of `ul`, `li` and `a` gives us an unordered list with one of its items containing a hyperlink anchor. This is familiar, flexible and commonplace. A **closed component API model** does not rely on consumers performing the composition, but on them using input / output parameters to achieve the same result. For instance: ```tsx Exemplifies a closed API, ] /> --- // Where... type entry = string | React.ReactElement; type ListProps = { entries: entry[]; }; ``` This would achieve the same unordered list with a hyperlink anchor. ### Composition **Pros** Composition is familiar to anybody who's ever built raw HTML. It's the basic building methodology for layout. It's flexible and agnostic. Given the right building blocks, one can compose nearly anything. **Cons** It's flexible and agnostic. You can do whatever you want with it. ```tsx

    I really should not be here

``` This won't break your app. ```tsx performSomePageAction()}> I'm a button, LOL ``` This would also work, despite being semantically wrong and an accessibility faux-pas. Now let's consider the composition of non-native HTML tags such as React components. ```tsx This list // This is fine // This is not exemplifies compositionnal pitfalls // Neither is this ``` Sure, we can provide more opinionated components (`List` and `ListEntry` here would have specific styles and behaviours), but we cannot limit composition: `children` are notoriously untypeable in a way that would only allow some other subset of React components. What's composable isn't "a little bit composable", it's either fully open (`children: React.ReactElement;`) or very closed (`children: string | number | ...`). It's a major risk to a product's homogeneity of patterns and behaviours. ### Closed component APIs **Pros** It removes the need for tedious composition. Developers no longer need to concern themselves with the proper HTML semantics and intricacies of which HTML tag can legally be a child of such and such parent. It enforces homogeneity. Closed typed APIs put hard limits to what a component can display and how it can behave. They become easier to predict and less prone to diverging when different developers implement them. Closed APIs are also strongly typed with TS, providing a better dev experience and overall more reliable components. TS's compiler will break before any poorly-fed component goes online. **Cons** It's rigid, it doesn't allow for "slightly different" use cases. The component will do what its API requires, nothing more, nothing "a few pixels more to the left on this one page". Closed API components are specialised. This can lead to two props-related pitfalls: First, props proliferation: ```tsx RandomCalbackWithValue(20), }, { label: 'with different interfaces', value: 10, onClick: () => RandomCalbackWithValue(10), }, ... ], ]} actionLeft={() => void} actionRight={() => void} offsetXStart={20} offsetXEnd={0} offsetYStart={10} offsetYEnd={0} headerActions={[ { icon: 'talend-pen', label: t('TALEND-EDIT'), onClick: () => void, }, ... ]} footerActions={[ { icon: 'talend-pen', label: t('TALEND-EDIT'), onClick: () => void, }, ... ]} filters={[ { value: 'size', label: t('TALEND-SIZE'), } ... ]} /> ``` This is complex to use, to maintain, to document. Contributors run the risk of "piling in" more props on top of the props-layer-cake just to achieve "one more thing" on top of it all. The other issue is props drilling. In the above component, many of those theoretical surface props wouldn't actually be used by first-level components, but be passed down deeper to their intended hosts. Closed component APIs can lead to poor developer experience. ### What do we need It boils down to one question: "what is the design system trying to achieve?". It's trying to achieve a _cohesive, homogenous experience across all our products_. ## Solutions In order to meet those needs, we need to ship components without opening them up for customization. They must work out of the box and preserve Talend's identity! Our best option to deliver this is to **rely on _exporting_ components with closed APIs** for most things (more on that later)**.** Internally, those components will of course rely on composition. Think of it this way: the design system uses the bricks to build the house, you only have to "import" the house and provide the furniture. What do we mean when we say "most things" will be shipped with closed APIs? Let's dive in. ### Atoms Atoms are often single-tag elements, direct equivalents to HTML's basic blocks. Very obvious ones are `Button` `Link` or `Input` elements. These will offer props that are based on their HTML counterparts minus `className` and `style` since, again, we discourage customisation. Additional props will be added only when it's necessary to ensure homogeneity. For instance, `Button` components may receive an `icon` prop: this enables the design system to enforce which icons can be used, how they are inserted in the button's layout and how they are displayed. Atoms must remain otherwise simple. Composition _inside_ atoms is highly unlikely. Expect them to only accept `string` children (thanks, TS!). ### Molecules and organisms This is often the meat and the core value of a shared component library: interactive components that display things in a rich, interesting way, while enabling contextually relevant actions. The whole point is that they are repetitively used. It would make no sense to offer them as kits that must be assembled by consumers. The design system must provide them already assembled and ready to be hydrated through their closed APIs. If the organisms grow too complicated in props, the first solution would be to create a dedicated component for that subset of needed props (for instance, though there may be a `ContextualMenu` component, a `ContextualMenuWithSearch` declination may be created if the prop specificity requires it.) ### Templates or pages These are often referred to as "layout blocks". Their goal is to arrange "where" things go, what are the basic necessary blocks in there, and then to let users build freely within those boundaries. The more generic those templates are (agnostic of their contents, for instance, a template called `PageWithSubheader`), the more they will rely on composition with very little props on the component itself. The more specific they are (for instance a template called `FormPage`), the less composition will be expected from the end-user. **Composition is a tool we use when we can't document a set pattern**. If we can document it, then we can describe an API for it. ## Why don't you do it like Material / Atlassian / Adobe or other public libraries (Reakit...) out there? Because we don't have to. Public component libraries use composition as a necessity: they are agnostic, built to cater to many products with unpredictable patterns. We're not a sprawling corporation with hundreds of designers spread across the globe with unmanageably different aspirations. A single, strongly documented design language is accessible to us. Those libraries do not rely on consumers perpetually rebuilding the same components over and over again either: they do expect us to use their blocks to create opinionated components that are then shared with consumers. This is what we do. We use our own components (and some of theirs, cc Reakit) internally to compose the ones that our products need. That need is defined collectively as a design decision by Product Designers, PMs and developers alike. The design system documents and caters to that need in the shape of components. ## TL;DR Components will be coded with a "closed public API" approach, using composition privately within the design system. This ensures we can easily compose components on one end (the library) while keeping things homogenous on the other (in the products). Exceptions are expected to happen but must meet two criteria: - Composition, in this case, is a necessity (ex: layout element, unpredictable content) - No consensus can be found for a component's API. In this case, chances are the discussed component specificity is too high for a shared library. It becomes in the design system's interest to provide at least homogenous building blocks for that element. ================================================ FILE: docs/adr-css-modules.md ================================================ # CSS Modules [^1]: tl;dr. ## Context [Styled Components](https://styled-components.com/) are great for managing a design system with several themes or modes. They have been chosen because we needed multi-themes support and including IE11 support. So CSS custom properties were not an option. We've since dropped the support of IE11. We can challenge that choice. ## Problems They intertwine styles and components in a way that muddles the component's typings. Its `as` property is too permissive for a design system, enabling users to break the intended patterns using any HTML element or React component. There is no guarantee about the tokens you use (or not) in your styles. You cannot quickly identify which DOM node will be generated because of the exported Styled Components. You must precise the `displayName` for each component and their variations ### What do we need - A styling solution that does not pollute the components' typing - A styling solution that handles theming (white-labeling as much as a possible dark theme) - A styling solution that easily exploits tokens and variables - We must be able consume variables that represent tokens ### What would we like - Exportable themes-as-variables: our customers (the front-end engineers) mostly use CSS modules with Sass variables in their projects. When the design system doesn't provide everything they need, we should still give them variables accessing the theme. - Global stylesheets - Something simple and familiar to use - No need for displayName ## Solutions By introducing [expertly crafted web design tokens](#3528), represented by CSS custom properties, we are now able to align the Design System with the rest of the Talend/UI packages. By alignment, we are talking about [CSS Modules](https://github.com/css-modules/css-modules). We will replace all current Styled Components usages, tracked by JIRA. But, starting now[^1], any style update in the Design System package will use CSS modules. ================================================ FILE: docs/adr-data-test.md ================================================ # Use [data-testid] attributes for generic automated tests ## Context Quality Assurance teams perform automated tests on Products for non-regression testing. ## Problems QA teams lean on HTML ID attributes or XPath to automate tests on UI, and updates on the shared library can break these scenarios. ## Solutions Systematically enforce [data-testid] attributes for QA purpose in the components or layout markup that require them. They will be mandatory for each interactive element, at least. We see two benefits to that pattern: 1 — Better documentation. The single data attribute acts as a contract with our QA team and it's easy to find which components are under that contract. 2 — Ease of use. Component testing becomes more straightforward as the same pattern can be expected on all design system components. ```css [data-testid=".[?]."] ``` | Identifier | Optional | Description | | -------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | `block_name` | | Component or layout identifier from our design language (ex: modal, search, password, inlineediting, etc.) | | `element_type` | | Element or its type used (ex: button, link, input, textarea, radio, etc.) | | `element_index` | yes | Element index if it's repeated (radio, menu items, etc.) | | `element_identifier` | yes | A short and comprehensive identifier. In case of a form field, we can use its label value (reveal, cancel, edit, submit, etc.) for instance. | Stick to this ruleset but keep in mind: > This ruleset applies to all shared react components: we definitively have to be **context agnostic**. > If we're testing a text input, it could for instance be used for a `first name` or an `API key name`. > That's why we need to **keep it simple and stupid** when naming things. Describe the pattern, not the specific one-shot use you will use it for. The `[data-testid]` attributes here are an addition to what the product team can provide. `[data-testid]` attributes are the default that we can agree on, enabling to write E2E tests without worrying about the HTML markup or the CSS. ### Examples - For a "Close" button of a `Modal` `[data-testid="modal.button.close"]` - For a "Reveal" button of a `Password` form field `[data-testid="password.button.reveal"]` - For a textarea of the `Inline Editing` in edition mode `[data-testid="inlineediting.textarea"]` - For a filter of a list `[data-testid="search.input"]` - For a `Switch` with three options, which uses radio buttons under the hood `[data-testid="switch.radio[1]"]` `[data-testid="switch.radio[2]"]` `[data-testid="switch.radio[3]"]` All of this will be part of the documentation (see below) and each of them will be used in [Cypress component testing](https://docs.cypress.io/guides/component-testing/introduction) in our Design System codebase. ================================================ FILE: docs/adr-dependencies.md ================================================ # Usage of dependencies, peerDependencies, devDependencies in package.json ## Context Dependencies are specified using the package.json file in the library's codebase. We have more and more libraries written and used by projects. We use different distribution formats for our libraries: - UMD for some (react-components, react-cmf, etc ...) - a mix of transpiled JS and SASS files which needs sharing config to make it work for others ## Problems We see commits with a mix of libraries being added to `peerDependencies` and `dependencies` without real guidelines. Each change in peerDependencies leads to [a major release](https://github.com/semver/semver/issues/502). We do not know when to put a dependency in the `"peerDependencies"` or just in the `"dependencies"` of the package.json file. With yarn, `peerDependencies` are hard to manage. Yarn only outputs a warning the first time it encounters the dependency, when it needs to really install it in your node_modules. It's easy to miss and to forget. We have also seen some false positive warnings. With npm, peerDependencies management depends on the version used: - npm 1,2,7,8 install peerDependencies - npm 3,4,5,6 do not install peerDependencies The documentation of npm only covers the behavior of npm, not the definition and actual usage of these peer dependencies. We know our project can't use npm > 7.0 because we have some issues in our peerDependencies definitions! npm > 7 requires all peer dependencies to be at the same level, the same version. That needs to be fixed on our end. ## Solutions Define a clear guideline for dependency requirements in the package.json files of libraries. ### Guideline **`"devDependencies"`** Add **a-dependency** under `devDependencies` if **a-dependency** is used only to build, debug, or because A is also a peerDependencies. Basically use `devDependencies` if this dependency has no impact on runtime. examples: - @talend/scripts-core - @talend/scripts-preset-react-lib - i18next-scanner - cross-env - react (if in peerDependencies) Type dependencies (usually in the format `@types/some-js-library`) can be added to `devDependencies` only if the exported types for the library you're working on do not depend on it. ```javascript import { LibType } from 'some-js-library'; // If this export is available in the bundle, then your bundle has an actual dependency to LibType export myLibType = LibType & { isActive: boolean }; ``` **`"dependencies"`** Add **a-dependency** under `dependencies` only if it is used by the code and does not fall under peerDependencies. examples: - @talend/design-token - @talend/router-bridge - @talend/react-components - @talend/react-containers - @talend/react-dataviz - classnames - keycode - lodash - prop-types - date-fns - react-bootstrap As we've discussed, add type files to dependencies if your exported types depends on it. **`"peerDependencies"`** Add **a-dependency** under peerDependencies only if the consumer will need to import or configure something out of that dependency, to make your library work (ex: i18next is used in my library, the host project will need to configure it for the library to run) At the [begining in 2013](https://nodejs.org/en/blog/npm/peer-dependencies/) the peerDependencies as heen created to cover the Plugin needs. So **a-dependency** can be added even if your library do not use it. examples: - @talend/design-system - @talend/react-cmf - react - react-dom - i18next - react-i18next ================================================ FILE: docs/adr-rework-talend-scripts.md ================================================ # Rework Talend scripts ## Context It would be nide to add a new preset for node applications. While creating it, it would be nice to rework a bit how script are handled. We could avoid to pull all the dependencies for all the scripts, for instance we don't need storybook for node apps etc. ## Proposal The proposal would be to split the scripts in different packages that don't rely on each others. The index.js of talend-scripts would check the package.json and require the right package. if the command is now known, it would fallback to required the package and execute the command like this ``` talend-scripts upgrade:deps -> require ("@talend/upgrade-deps")() ``` ### app-react-ng build (webpack) start (webpack) start-storybook (storybook) build-storybook (storybook) test (jest + karma) lint (eslint + stylelint) ### app-react build (webpack) start (webpack) start-storybook (storybook) build-storybook (storybook) test (jest) lint (eslint + stylelint) ### lib build (tsc || babel) start (storybook) build-storybook (storybook) test (jest) lint (eslint + stylelint) ### node build (tsc || babel) start (ts-node-dev) test (jest) lint (eslint) ## Other scripts - upgrade:deps : could be moved to a dedicated package (available via npx for instance) - publish:local : could be moved to a dedicated package (available via npx for instance) - extends : is it used ? - postinstall : is it used ? ================================================ FILE: eslint.config.mjs ================================================ import config from '@talend/eslint-config'; export default config; ================================================ FILE: fork/bootstrap-sass/.gitignore ================================================ *.gem .sass-cache bootstrap.css bootstrap-responsive.css Gemfile.lock *.gemfile.lock .rvmrc .rbenv-version # Ignore bundler config /.bundle /vendor/cache /vendor/bundle tmp/ test/screenshots/ test/dummy_rails/log/*.log test/dummy_rails/public/assets/ .DS_Store node_modules /.idea ================================================ FILE: fork/bootstrap-sass/CHANGELOG.md ================================================ # Changelog ## 5.6.2 ### Patch Changes - 4408b98: chore: upgrade dependencies ## 5.6.1 ### Patch Changes - 6181519: chore: update eslint 10 ## 5.6.0 ### Minor Changes - c1eae85: Update eslint to v9 + update config ## 5.5.0 ### Minor Changes - bb95e38: Fix CVE's by upgrading sq to v6.14.1, tar to 7.5.4 and eslint to 9.39.2 ## 5.4.0 ### Minor Changes - ed37213: Update dependencies ## 5.3.2 ### Patch Changes - de6ae38: Bump dependencies ## 5.3.1 ### Patch Changes - 4f5cc5c: Bump security CVE ## 5.3.0 ### Minor Changes - c3750a1: chore: upgrade dependencies Major upgrade for all packages that have a peerDependency on react or react-dom. Those packages now ask for react@18 and react-dom@18. ## 5.2.1 ### Patch Changes - 1abc22f: chore: upgrade dependencies ## 5.2.0 ### Minor Changes - 9568363: Use include instead of same-origin in the credentials option of fetch. ## 5.1.0 ### Minor Changes - 18c1d97: `rem` values have been updated to correspond to the new `rem` base (16px) define by the design system ## 5.0.0 ### Major Changes - 3dc3100: chore: remove font-size override (this should not impact the apps as it's done also on the design-system provider) ## 4.0.0 ### Major Changes - 9f9fc07: chore: remove font-size override (this should not impact the apps as it's done also on the design-system provider) ## 3.5.1 ### Patch Changes - f14ebbe23: Add missing deps ## 3.5.0 ### Minor Changes - 9d137cb98: \* 275e7da72 2023-08-03 feat(TDOPS-4875): use elevation tokens (#4821) - bfc02c4fb 2023-07-24 feat(ARCH-720): use design-tokens for colors (#4779) - c18aabb97 2023-01-12 feat(ARCH-662/scripts-core): move to ESM and remove presets (#4531) - aa5223cf3 2021-12-20 chore(ARCH-404/CI): decrease time needed (#3564) - 4842bffc2 2021-11-02 chore: wake up the playground to test UMDs (#3428) - 667cd0a50 2021-10-05 chore: upgrade dependencies (#3459) ## 3.4.8 ### Patch Changes - 809c30848: fix(boostrap-sass): use calc instead of math.div ## 3.4.7 ### Patch Changes - ca60841df: revert usage of @use sass:math ## 3.4.6 ### Patch Changes - f1f4ec5bc: fix(workspace-run): package run order ## 3.4.5 ### Patch Changes - 3e9121287: chore(build): order packages on pre-release hook ## 3.4.0 - Bootstrap rubygem now depends on SassC instead of Sass. - Compass no longer supported. ## 3.3.7 - Allows jQuery 3.x in bower.json. [#1048](https://github.com/twbs/bootstrap-sass/issues/1048) - Adds the `style` and `sass` fields to package.json. [#1045](https://github.com/twbs/bootstrap-sass/issues/1045) - Adds Eyeglass support. [#1007](https://github.com/twbs/bootstrap-sass/pull/1007) ## 3.3.6 - Bumps Sass dependency to 3.3.4+ to avoid compatibility issues with @at-root. - Bumps node-sass dependency to ~3.4.2 for Node.js v5 compatibility. [#986](https://github.com/twbs/bootstrap-sass/issues/986) - Fixes breadcrumb content issues on libsass. [#919](https://github.com/twbs/bootstrap-sass/issues/919) - Fixes a Rails 5 compatibility issue. [#965](https://github.com/twbs/bootstrap-sass/pull/965) Framework version: Bootstrap **v3.3.6** ## 3.3.5 Fix for standalone Compass extension compatibility. [#914](https://github.com/twbs/bootstrap-sass/issues/914) Framework version: Bootstrap **v3.3.5** ## 3.3.4 No Sass-specific changes. Framework version: Bootstrap **v3.3.4** ## 3.3.3 This is a re-packaged release of 3.3.2.1 (v3.3.2+1). Versions are now strictly semver. The PATCH version may be ahead of the upstream. Framework version: Bootstrap **v3.3.2**. ## 3.3.2.1 - Fix glyphicons regression (revert 443d5b49eac84aec1cb2f8ea173554327bfc8c14) ## 3.3.2.0 - Autoprefixer is now required, and `autoprefixer-rails` is now a dependency for the ruby gem. [#824](https://github.com/twbs/bootstrap-sass/issues/824) - Minimum precision reduced from 10 to 8 [#821](https://github.com/twbs/bootstrap-sass/issues/821) - Requiring bootstrap JS from npm now works [#812](https://github.com/twbs/bootstrap-sass/issues/812) - Fix Sass 3.4.x + IE10 compatibility issue [#803](https://github.com/twbs/bootstrap-sass/issues/803) - Provide minified JS bundle [#777](https://github.com/twbs/bootstrap-sass/issues/777) - Bower package is now at bootstrap-sass [#813](https://github.com/twbs/bootstrap-sass/issues/813) ## 3.3.1.0 - Variables override template at templates/project/\_bootstrap-variables.sass - Readme: Bower + Rails configuration ## 3.3.0.1 - Fix loading issue with the ruby gem version ## 3.3.0 - Improve libsass compatibility - Support using Bower package with Rails ## 3.2.0.2 Main bootstrap file is now a partial (\_bootstrap.scss), for compatibility with Compass 1+. Fixed a number of bugs. [Issues closed in v3.2.0.2](https://github.com/twbs/bootstrap-sass/issues?q=is%3Aissue+is%3Aclosed+milestone%3Av3.2.0.2). ## 3.2.0.1 Fixed a number of bugs: [Issues closed in v3.2.0.1](https://github.com/twbs/bootstrap-sass/issues?q=is%3Aissue+is%3Aclosed+milestone%3Av3.2.0.1). ## 3.2.0.0 - Assets (Sass, JS, fonts) moved from `vendor/assets` to `assets`. `bootstrap.js` now contains concatenated JS. - Compass generator now copies JS and fonts, and provides a better default `styles.sass`. - Compass, Sprockets, and Mincer asset path helpers are now provided in pure Sass: `bootstrap-compass`, `bootstrap-sprockets`, and `bootstrap-mincer`. Asset path helpers must be imported before `bootstrap`, more in Readme. - Sprockets / Mincer JS manifest has been moved to `bootstrap-sprockets.js`. It can be required without adding Bootstrap JS directory to load path, as it now uses relative paths. - Sprockets: `depend_on_asset` (`glyphicons.scss`) has been changed to `depend_on` to work around an issue with `depend_on_asset`. [More information](https://github.com/twbs/bootstrap-sass/issues/592#issuecomment-46570286). ## 3.1.1.0 - Updated Bower docs ## 3.1.0.2 - #523: Rails 3.2 compatibility - Bugfixes from upstream up to 7eb532262fbd1112215b5a547b9285794b5360ab. ## 3.1.0.1 - #518: `scale` mixin Sass compatibility issue ## 3.1.0.0 - compiles with libsass master ## 3.0.2.1 - fix vendor paths for compass ## 3.0.0.0 - Fully automated (lots of string juggling) LESS -> Sass conversion. - _Gleb Mazovetskiy_ - Ported rake task from vwall/compass-twitter-bootstrap to convert Bootstrap upstream - _Peter Gumeson_ - Moved javascripts to us `bootstrap-component.js` to `bootstrap/component.js` - _Peter Gumeson_ ## 2.3.2.2 - Allow sass-rails `>= 3.2` - _Thomas McDonald_ ## 2.3.2.1 ## 2.3.2.0 - Update to Bootstrap 2.3.2 - _Dan Allen_ ## 2.3.1.3 - Find the correct Sprockets context for the `image_path` function - _Tristan Harward, Gleb Mazovetskiy_ ## 2.3.1.2 - Fix changes to image url - _Gleb Mazovetskiy_ - Copy \_variables into project on Compass install - _Phil Thompson_ - Add `bootstrap-affix` to the Compass template file - _brief_ ## 2.3.1.1 (yanked) - Change how image*url is handled internally - \_Tristan Harward* - Fix some font variables not having `!default` - _Thomas McDonald_ ## 2.3.0.0 - [#290] Update to Bootstrap 2.3.0 - _Tristan Harward_ - Fix `rake:debug` with new file locations - _Thomas McDonald_ - Add draft contributing document - _Thomas McDonald_ - [#260] Add our load path to the global Sass load path - _Tristan Harward_ - [#275] Use GitHub notation in Sass head testing gemfile - _Timo Schilling_ - [#279, #283] Readme improvements - _theverything, Philip Arndt_ ## 2.2.2.0 - [#270] Update to Bootstrap 2.2.2 - _Tristan Harward_ - [#266] Add license to gemspec - _Peter Marsh_ ## 2.2.1.1 - [#258] Use `bootstrap` prefix for `@import`ing files in `bootstrap/bootstrap.scss` - _Umair Siddique_ ## 2.2.1.0 - [#246] Update to Bootstrap 2.2.1 - _Tristan Harward_ - [#246] Pull Bootstrap updates from jlong/sass-twitter-bootstrap - _Tristan Harward_ ## 2.1.1.0 - Update to Bootstrap 2.1.1 - [#222] Remove 100% multiplier in vertical-three-colours - [#227] Fix IE component animation collapse - [#228] Fix variables documentation link - [#231] Made .input-block-level a class as well as mixin ## 2.1.0.1 - [#219] Fix expected a color. Got: transparent. - [#207] Add missing warning style for table row highlighting - [#208] Use grid-input-span for input spans ## 2.1.0.0 - Updated to Bootstrap 2.1 - Changed some mixin names to be more consistent. Nested mixins in Less are separated by a `-` when they are flattened in Sass. ## 2.0.4.1 - Fix `.row-fluid > spanX` nesting - Small Javascript fixes for those staying on the 2.0.4 release - Add `!default` to z-index variables. ## 2.0.4.0 - Updated to Bootstrap 2.0.4 - Switched to Bootstrap 2.0.3+'s method of separating responsive files - [#149, #150] Fix off by one error introduced with manual revert of media query breakpoints - `rake debug` and `rake test` both compile bootstrap & bootstrap-responsive ## 2.0.3.1 - [#145, #146] Fix button alignment in collapsing navbar as a result of an incorrect variable ## 2.0.3 - Updated to Bootstrap 2.0.3 - [#106] Support for Rails < 3.1 through Compass - [#132] Add CI testing - [#106] Support Rails w/Compass - [#134] Fix support for Rails w/Compass ## 2.0.2 - [#86] Updated to Bootstrap 2.0.2 Things of note: static navbars now have full width. (to be fixed in 2.0.3) `.navbar-inner > .container { width:940px; }` seems to work in the meanwhile - [#62] Fixed asset compilation taking a _very_ long time. - [#69, #79, #80] \(Hopefully) clarified README. Now with less cat humour. - [#91] Removed doubled up Sass extensions for Rails. - [#63, #73] Allow for overriding of image-path - [[SO](http://stackoverflow.com/a/9909626/241212)] Added makeFluidColumn mixin for defining fluid columns. Fluid rows must use `@extend .row-fluid`, and any column inside it can use `@include makeFluidColumn(num)`, where `num` is the number of columns. Unfortunately, there is a rather major limitation to this: margins on first-child elements must be overriden. See the attached Stack Overflow answer for more information. ## 2.0.1 - Updated to Bootstrap 2.0.1 - Modified `@mixin opacity()` to take an argument `0...1` rather than `0...100` to be consistent with Compass. ## 2.0.0 - Updated to Bootstrap 2.0.0 ================================================ FILE: fork/bootstrap-sass/CONTRIBUTING.md ================================================ # Contributing to bootstrap-sass ## Asset Changes Any changes to `bootstrap-sass` assets (scss, javascripts, fonts) should be checked against the `convert` rake task. For usage instructions, see the [README](/README.md). If something is broken in the converter, it's preferable to update the converter along with the asset itself. ## Bugs A bug is a _demonstrable problem_ that is caused by the code in the repository. Good bug reports are extremely helpful - thank you! Guidelines for bug reports: 1. **Does it belong here?** — is this a problem with bootstrap-sass, or it an issue with [twbs/bootstrap](https://github.com/twbs/bootstrap)? We only distribute a direct port and will not modify files if they're not changed upstream. 2. **Use the GitHub issue search** — check if the issue has already been reported. 3. **Isolate the problem** — ideally create a [reduced test case](http://css-tricks.com/6263-reduced-test-cases/) and a live example. A good bug report shouldn't leave others needing to chase you up for more information. Please try to be as detailed as possible in your report. What is your environment? What steps will reproduce the issue? What browser(s) and OS experience the problem? What would you expect to be the outcome? All these details will help people to fix any potential bugs. Example: > Short and descriptive example bug report title > > A summary of the issue and the browser/OS environment in which it occurs. If > suitable, include the steps required to reproduce the bug. > > 1. This is the first step > 2. This is the second step > 3. Further steps, etc. > > `` (a link to the reduced test case) > > Any other information you want to share that is relevant to the issue being > reported. This might include the lines of code that you have identified as > causing the bug, and potential solutions (and your opinions on their > merits). **[File a bug report](https://github.com/twbs/bootstrap-sass/issues/)** ## Pull requests **We will not accept pull requests that modify the SCSS beyond fixing bugs caused by *our* code!** We use a [converter script][converter-readme] to automatically convert upstream bootstrap, written in LESS, to Sass. Issues related to styles or javascript but unrelated to the conversion process should go to [twbs/bootstrap][upstream]. Pull requests that fix bugs caused by our code should not modify the SCSS directly, but should patch the converter instead. Good pull requests - patches, improvements, new features - are a fantastic help. They should remain focused in scope and avoid containing unrelated commits. If your contribution involves a significant amount of work or substantial changes to any part of the project, please open an issue to discuss it first. Make sure to adhere to the coding conventions used throughout a project (indentation, accurate comments, etc.). Please update any documentation that is relevant to the change you're making. ## Do not… Please **do not** use the issue tracker for personal support requests (use [Stack Overflow](http://stackoverflow.com/)). Please **do not** derail or troll issues. Keep the discussion on topic and respect the opinions of others. *props [html5-boilerplate](https://github.com/h5bp/html5-boilerplate/blob/master/CONTRIBUTING.md)* [upstream]: https://github.com/twbs/bootstrap [converter-readme]: https://github.com/twbs/bootstrap-sass/blob/master/README.md#upstream-converter ================================================ FILE: fork/bootstrap-sass/LICENSE ================================================ The MIT License (MIT) Copyright (c) 2011-2016 Twitter, Inc Copyright (c) 2011-2016 The Bootstrap Authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: fork/bootstrap-sass/README.md ================================================ # Bootstrap 3 for Sass Note: this is a fork for [Talend/ui](https://github.com/Talend/ui) maintainance reasons. We fix security and sass compatibility only. For the override please look at `@talend/bootstrap-theme`. [![npm version](https://img.shields.io/npm/v/@talend/bootstrap-sass.svg?style=flat)](https://www.npmjs.com/package/@talend/bootstrap-sass) `bootstrap-sass` is a Sass-powered version of [Bootstrap](https://github.com/twbs/bootstrap) 3, ready to drop right into your Sass powered applications. This is Bootstrap **3**. For Bootstrap **4** use the [Bootstrap rubygem](https://github.com/twbs/bootstrap-rubygem) if you use Ruby, and the [main repo](https://github.com/twbs/bootstrap) otherwise. ## Installation Please see the appropriate guide for your environment of choice: * [Ruby on Rails](#a-ruby-on-rails). * [Bower](#b-bower). * [npm / Node.js](#c-npm--nodejs). ### a. Ruby on Rails `bootstrap-sass` is easy to drop into Rails with the asset pipeline. In your Gemfile you need to add the `bootstrap-sass` gem, and ensure that the `sass-rails` gem is present - it is added to new Rails applications by default. ```ruby gem 'bootstrap-sass', '~> 3.4.1' gem 'sassc-rails', '>= 2.1.0' ``` `bundle install` and restart your server to make the files available through the pipeline. Import Bootstrap styles in `app/assets/stylesheets/application.scss`: ```scss // "bootstrap-sprockets" must be imported before "bootstrap" and "bootstrap/variables" @import "bootstrap-sprockets"; @import "bootstrap"; ``` `bootstrap-sprockets` must be imported before `bootstrap` for the icon fonts to work. Make sure the file has `.scss` extension (or `.sass` for Sass syntax). If you have just generated a new Rails app, it may come with a `.css` file instead. If this file exists, it will be served instead of Sass, so rename it: ```console $ mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss ``` Then, remove all the `*= require_self` and `*= require_tree .` statements from the sass file. Instead, use `@import` to import Sass files. Do not use `*= require` in Sass or your other stylesheets will not be [able to access][antirequire] the Bootstrap mixins or variables. Bootstrap JavaScript depends on jQuery. If you're using Rails 5.1+, add the `jquery-rails` gem to your Gemfile: ```ruby gem 'jquery-rails' ``` ```console $ bundle install ``` Require Bootstrap Javascripts in `app/assets/javascripts/application.js`: ```js //= require jquery //= require bootstrap-sprockets ``` `bootstrap-sprockets` and `bootstrap` [should not both be included](https://github.com/twbs/bootstrap-sass/issues/829#issuecomment-75153827) in `application.js`. `bootstrap-sprockets` provides individual Bootstrap Javascript files (`alert.js` or `dropdown.js`, for example), while `bootstrap` provides a concatenated file containing all Bootstrap Javascripts. #### Bower with Rails When using [bootstrap-sass Bower package](#c-bower) instead of the gem in Rails, configure assets in `config/application.rb`: ```ruby # Bower asset paths root.join('vendor', 'assets', 'bower_components').to_s.tap do |bower_path| config.sass.load_paths << bower_path config.assets.paths << bower_path end # Precompile Bootstrap fonts config.assets.precompile << %r(bootstrap-sass/assets/fonts/bootstrap/[\w-]+\.(?:eot|svg|ttf|woff2?)$) # Minimum Sass number precision required by bootstrap-sass ::Sass::Script::Value::Number.precision = [8, ::Sass::Script::Value::Number.precision].max ``` Replace Bootstrap `@import` statements in `application.scss` with: ```scss $icon-font-path: "bootstrap-sass/assets/fonts/bootstrap/"; @import "bootstrap-sass/assets/stylesheets/bootstrap-sprockets"; @import "bootstrap-sass/assets/stylesheets/bootstrap"; ``` Replace Bootstrap `require` directive in `application.js` with: ```js //= require bootstrap-sass/assets/javascripts/bootstrap-sprockets ``` #### Rails 4.x Please make sure `sprockets-rails` is at least v2.1.4. #### Rails 3.2.x bootstrap-sass is no longer compatible with Rails 3. The latest version of bootstrap-sass compatible with Rails 3.2 is v3.1.1.0. ### b. Bower bootstrap-sass Bower package is compatible with node-sass 3.2.0+. You can install it with: ```console $ bower install bootstrap-sass ``` Sass, JS, and all other assets are located at [assets](/assets). By default, `bower.json` main field list only the main `_bootstrap.scss` and all the static assets (fonts and JS). This is compatible by default with asset managers such as [wiredep](https://github.com/taptapship/wiredep). #### Node.js Mincer If you use [mincer][mincer] with node-sass, import Bootstrap like so: In `application.css.ejs.scss` (NB **.css.ejs.scss**): ```scss // Import mincer asset paths helper integration @import "bootstrap-mincer"; @import "bootstrap"; ``` In `application.js`: ```js //= require bootstrap-sprockets ``` See also this [example manifest.js](/test/dummy_node_mincer/manifest.js) for mincer. ### c. npm / Node.js ```console $ npm install bootstrap3-sass ``` ## Configuration ### Sass By default all of Bootstrap is imported. You can also import components explicitly. To start with a full list of modules copy [`_bootstrap.scss`](assets/stylesheets/_bootstrap.scss) file into your assets as `_bootstrap-custom.scss`. Then comment out components you do not want from `_bootstrap-custom`. In the application Sass file, replace `@import 'bootstrap'` with: ```scss @import 'bootstrap-custom'; ``` ### Sass: Number Precision bootstrap-sass [requires](https://github.com/twbs/bootstrap-sass/issues/409) minimum [Sass number precision][sass-precision] of 8 (default is 5). Precision is set for Ruby automatically when using the `sassc-rails` gem. When using the npm or Bower version with Ruby, you can set it with: ```ruby ::Sass::Script::Value::Number.precision = [8, ::Sass::Script::Value::Number.precision].max ``` ### Sass: Autoprefixer Bootstrap requires the use of [Autoprefixer][autoprefixer]. [Autoprefixer][autoprefixer] adds vendor prefixes to CSS rules using values from [Can I Use](https://caniuse.com/). To match [upstream Bootstrap's level of browser compatibility](https://getbootstrap.com/getting-started/#support), set Autoprefixer's `browsers` option to: ```json [ "Android 2.3", "Android >= 4", "Chrome >= 20", "Firefox >= 24", "Explorer >= 8", "iOS >= 6", "Opera >= 12", "Safari >= 6" ] ``` ### JavaScript [`assets/javascripts/bootstrap.js`](/assets/javascripts/bootstrap.js) contains all of Bootstrap's JavaScript, concatenated in the [correct order](/assets/javascripts/bootstrap-sprockets.js). #### JavaScript with Sprockets or Mincer If you use Sprockets or Mincer, you can require `bootstrap-sprockets` instead to load the individual modules: ```js // Load all Bootstrap JavaScript //= require bootstrap-sprockets ``` You can also load individual modules, provided you also require any dependencies. You can check dependencies in the [Bootstrap JS documentation][jsdocs]. ```js //= require bootstrap/scrollspy //= require bootstrap/modal //= require bootstrap/dropdown ``` ### Fonts The fonts are referenced as: ```scss "#{$icon-font-path}#{$icon-font-name}.eot" ``` `$icon-font-path` defaults to `bootstrap/` if asset path helpers are used, and `../fonts/bootstrap/` otherwise. When using bootstrap-sass with Compass, Sprockets, or Mincer, you **must** import the relevant path helpers before Bootstrap itself, for example: ```scss @import "bootstrap-compass"; @import "bootstrap"; ``` ## Usage ### Sass Import Bootstrap into a Sass file (for example, `application.scss`) to get all of Bootstrap's styles, mixins and variables! ```scss @import "bootstrap"; ``` You can also include optional Bootstrap theme: ```scss @import "bootstrap/theme"; ``` The full list of Bootstrap variables can be found [here](https://getbootstrap.com/customize/#less-variables). You can override these by simply redefining the variable before the `@import` directive, e.g.: ```scss $navbar-default-bg: #312312; $light-orange: #ff8c00; $navbar-default-color: $light-orange; @import "bootstrap"; ``` ### Eyeglass Bootstrap is available as an [Eyeglass](https://github.com/sass-eyeglass/eyeglass) module. After installing Bootstrap via NPM you can import the Bootstrap library via: ```scss @import "bootstrap-sass/bootstrap" ``` or import only the parts of Bootstrap you need: ```scss @import "bootstrap-sass/bootstrap/variables"; @import "bootstrap-sass/bootstrap/mixins"; @import "bootstrap-sass/bootstrap/carousel"; ``` ## Version Bootstrap for Sass version may differ from the upstream version in the last number, known as [PATCH](https://semver.org/spec/v2.0.0.html). The patch version may be ahead of the corresponding upstream minor. This happens when we need to release Sass-specific changes. Before v3.3.2, Bootstrap for Sass version used to reflect the upstream version, with an additional number for Sass-specific changes. This was changed due to Bower and npm compatibility issues. The upstream versions vs the Bootstrap for Sass versions are: | Upstream | Sass | |---------:|--------:| | 3.3.4+ | same | | 3.3.2 | 3.3.3 | | <= 3.3.1 | 3.3.1.x | Always refer to [CHANGELOG.md](/CHANGELOG.md) when upgrading. --- ## Development and Contributing If you'd like to help with the development of bootstrap-sass itself, read this section. ### Upstream Converter Keeping bootstrap-sass in sync with upstream changes from Bootstrap used to be an error prone and time consuming manual process. With Bootstrap 3 we have introduced a converter that automates this. **Note: if you're just looking to *use* Bootstrap 3, see the [installation](#installation) section above.** Upstream changes to the Bootstrap project can now be pulled in using the `convert` rake task. Here's an example run that would pull down the master branch from the main [twbs/bootstrap](https://github.com/twbs/bootstrap) repo: rake convert This will convert the latest LESS to Sass and update to the latest JS. To convert a specific branch or version, pass the branch name or the commit hash as the first task argument: rake convert[e8a1df5f060bf7e6631554648e0abde150aedbe4] The latest converter script is located [here][converter] and does the following: * Converts upstream Bootstrap LESS files to its matching SCSS file. * Copies all upstream JavaScript into `assets/javascripts/bootstrap`, a Sprockets manifest at `assets/javascripts/bootstrap-sprockets.js`, and a concatenation at `assets/javascripts/bootstrap.js`. * Copies all upstream font files into `assets/fonts/bootstrap`. * Sets `Bootstrap::BOOTSTRAP_SHA` in [version.rb][version] to the branch sha. This converter fully converts original LESS to SCSS. Conversion is automatic but requires instructions for certain transformations (see converter output). Please submit GitHub issues tagged with `conversion`. ## Credits bootstrap-sass has a number of major contributors: * [Thomas McDonald](https://twitter.com/thomasmcdonald_) * [Tristan Harward](http://www.trisweb.com) * Peter Gumeson * [Gleb Mazovetskiy](https://github.com/glebm) and a [significant number of other contributors][contrib]. ## You're in good company bootstrap-sass is used to build some awesome projects all over the web, including [Diaspora](https://diasporafoundation.org/), [rails_admin](https://github.com/sferik/rails_admin), Michael Hartl's [Rails Tutorial](https://www.railstutorial.org/), [gitlabhq](http://gitlabhq.com/) and [kandan](http://getkandan.com/). [converter]: https://github.com/twbs/bootstrap-sass/blob/master/tasks/converter/less_conversion.rb [version]: https://github.com/twbs/bootstrap-sass/blob/master/lib/bootstrap-sass/version.rb [contrib]: https://github.com/twbs/bootstrap-sass/graphs/contributors [antirequire]: https://github.com/twbs/bootstrap-sass/issues/79#issuecomment-4428595 [jsdocs]: https://getbootstrap.com/javascript/#transitions [sass-precision]: http://sass-lang.com/documentation/Sass/Script/Value/Number.html#precision%3D-class_method [mincer]: https://github.com/nodeca/mincer [autoprefixer]: https://github.com/postcss/autoprefixer ================================================ FILE: fork/bootstrap-sass/assets/images/.keep ================================================ ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/affix.js ================================================ /* ======================================================================== * Bootstrap: affix.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#affix * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // AFFIX CLASS DEFINITION // ====================== var Affix = function (element, options) { this.options = $.extend({}, Affix.DEFAULTS, options) var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target) this.$target = target .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) this.$element = $(element) this.affixed = null this.unpin = null this.pinnedOffset = null this.checkPosition() } Affix.VERSION = '3.4.1' Affix.RESET = 'affix affix-top affix-bottom' Affix.DEFAULTS = { offset: 0, target: window } Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { var scrollTop = this.$target.scrollTop() var position = this.$element.offset() var targetHeight = this.$target.height() if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false if (this.affixed == 'bottom') { if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' } var initializing = this.affixed == null var colliderTop = initializing ? scrollTop : position.top var colliderHeight = initializing ? targetHeight : height if (offsetTop != null && scrollTop <= offsetTop) return 'top' if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' return false } Affix.prototype.getPinnedOffset = function () { if (this.pinnedOffset) return this.pinnedOffset this.$element.removeClass(Affix.RESET).addClass('affix') var scrollTop = this.$target.scrollTop() var position = this.$element.offset() return (this.pinnedOffset = position.top - scrollTop) } Affix.prototype.checkPositionWithEventLoop = function () { setTimeout($.proxy(this.checkPosition, this), 1) } Affix.prototype.checkPosition = function () { if (!this.$element.is(':visible')) return var height = this.$element.height() var offset = this.options.offset var offsetTop = offset.top var offsetBottom = offset.bottom var scrollHeight = Math.max($(document).height(), $(document.body).height()) if (typeof offset != 'object') offsetBottom = offsetTop = offset if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) if (this.affixed != affix) { if (this.unpin != null) this.$element.css('top', '') var affixType = 'affix' + (affix ? '-' + affix : '') var e = $.Event(affixType + '.bs.affix') this.$element.trigger(e) if (e.isDefaultPrevented()) return this.affixed = affix this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null this.$element .removeClass(Affix.RESET) .addClass(affixType) .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') } if (affix == 'bottom') { this.$element.offset({ top: scrollHeight - height - offsetBottom }) } } // AFFIX PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.affix') var options = typeof option == 'object' && option if (!data) $this.data('bs.affix', (data = new Affix(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.affix $.fn.affix = Plugin $.fn.affix.Constructor = Affix // AFFIX NO CONFLICT // ================= $.fn.affix.noConflict = function () { $.fn.affix = old return this } // AFFIX DATA-API // ============== $(window).on('load', function () { $('[data-spy="affix"]').each(function () { var $spy = $(this) var data = $spy.data() data.offset = data.offset || {} if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom if (data.offsetTop != null) data.offset.top = data.offsetTop Plugin.call($spy, data) }) }) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/alert.js ================================================ /* ======================================================================== * Bootstrap: alert.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#alerts * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.VERSION = '3.4.1' Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } selector = selector === '#' ? [] : selector var $parent = $(document).find(selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { // detach from parent, fire event then clean up data $parent.detach().trigger('closed.bs.alert').remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one('bsTransitionEnd', removeElement) .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.alert') if (!data) $this.data('bs.alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.alert $.fn.alert = Plugin $.fn.alert.Constructor = Alert // ALERT NO CONFLICT // ================= $.fn.alert.noConflict = function () { $.fn.alert = old return this } // ALERT DATA-API // ============== $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/button.js ================================================ /* ======================================================================== * Bootstrap: button.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#buttons * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) this.isLoading = false } Button.VERSION = '3.4.1' Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function (state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state += 'Text' if (data.resetText == null) $el.data('resetText', $el[val]()) // push to event loop to allow forms to submit setTimeout($.proxy(function () { $el[val](data[state] == null ? this.options[state] : data[state]) if (state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d).prop(d, true) } else if (this.isLoading) { this.isLoading = false $el.removeClass(d).removeAttr(d).prop(d, false) } }, this), 0) } Button.prototype.toggle = function () { var changed = true var $parent = this.$element.closest('[data-toggle="buttons"]') if ($parent.length) { var $input = this.$element.find('input') if ($input.prop('type') == 'radio') { if ($input.prop('checked')) changed = false $parent.find('.active').removeClass('active') this.$element.addClass('active') } else if ($input.prop('type') == 'checkbox') { if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false this.$element.toggleClass('active') } $input.prop('checked', this.$element.hasClass('active')) if (changed) $input.trigger('change') } else { this.$element.attr('aria-pressed', !this.$element.hasClass('active')) this.$element.toggleClass('active') } } // BUTTON PLUGIN DEFINITION // ======================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.button') var options = typeof option == 'object' && option if (!data) $this.data('bs.button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } var old = $.fn.button $.fn.button = Plugin $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document) .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { var $btn = $(e.target).closest('.btn') Plugin.call($btn, 'toggle') if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { // Prevent double click on radios, and the double selections (so cancellation) on checkboxes e.preventDefault() // The target component still receive the focus if ($btn.is('input,button')) $btn.trigger('focus') else $btn.find('input:visible,button:visible').first().trigger('focus') } }) .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) }) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/carousel.js ================================================ /* ======================================================================== * Bootstrap: carousel.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#carousel * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CAROUSEL CLASS DEFINITION // ========================= var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = null this.sliding = null this.interval = null this.$active = null this.$items = null this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) } Carousel.VERSION = '3.4.1' Carousel.TRANSITION_DURATION = 600 Carousel.DEFAULTS = { interval: 5000, pause: 'hover', wrap: true, keyboard: true } Carousel.prototype.keydown = function (e) { if (/input|textarea/i.test(e.target.tagName)) return switch (e.which) { case 37: this.prev(); break case 39: this.next(); break default: return } e.preventDefault() } Carousel.prototype.cycle = function (e) { e || (this.paused = false) this.interval && clearInterval(this.interval) this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } Carousel.prototype.getItemIndex = function (item) { this.$items = item.parent().children('.item') return this.$items.index(item || this.$active) } Carousel.prototype.getItemForDirection = function (direction, active) { var activeIndex = this.getItemIndex(active) var willWrap = (direction == 'prev' && activeIndex === 0) || (direction == 'next' && activeIndex == (this.$items.length - 1)) if (willWrap && !this.options.wrap) return active var delta = direction == 'prev' ? -1 : 1 var itemIndex = (activeIndex + delta) % this.$items.length return this.$items.eq(itemIndex) } Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var that = this if ($next.hasClass('active')) return (this.sliding = false) var relatedTarget = $next[0] var slideEvent = $.Event('slide.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) this.$element.trigger(slideEvent) if (slideEvent.isDefaultPrevented()) return this.sliding = true isCycling && this.pause() if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) $nextIndicator && $nextIndicator.addClass('active') } var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" if ($.support.transition && this.$element.hasClass('slide')) { $next.addClass(type) if (typeof $next === 'object' && $next.length) { $next[0].offsetWidth // force reflow } $active.addClass(direction) $next.addClass(direction) $active .one('bsTransitionEnd', function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger(slidEvent) }, 0) }) .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger(slidEvent) } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } var old = $.fn.carousel $.fn.carousel = Plugin $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= var clickHandler = function (e) { var $this = $(this) var href = $this.attr('href') if (href) { href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 } var target = $this.attr('data-target') || href var $target = $(document).find(target) if (!$target.hasClass('carousel')) return var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false Plugin.call($target, options) if (slideIndex) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() } $(document) .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) Plugin.call($carousel, $carousel.data()) }) }) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/collapse.js ================================================ /* ======================================================================== * Bootstrap: collapse.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#collapse * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ /* jshint latedef: false */ +function ($) { 'use strict'; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + '[data-toggle="collapse"][data-target="#' + element.id + '"]') this.transitioning = null if (this.options.parent) { this.$parent = this.getParent() } else { this.addAriaAndCollapsedClass(this.$element, this.$trigger) } if (this.options.toggle) this.toggle() } Collapse.VERSION = '3.4.1' Collapse.TRANSITION_DURATION = 350 Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var activesData var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') if (actives && actives.length) { activesData = actives.data('bs.collapse') if (activesData && activesData.transitioning) return } var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return if (actives && actives.length) { Plugin.call(actives, 'hide') activesData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing')[dimension](0) .attr('aria-expanded', true) this.$trigger .removeClass('collapsed') .attr('aria-expanded', true) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('collapse in')[dimension]('') this.transitioning = 0 this.$element .trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element[dimension](this.$element[dimension]())[0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse in') .attr('aria-expanded', false) this.$trigger .addClass('collapsed') .attr('aria-expanded', false) this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .removeClass('collapsing') .addClass('collapse') .trigger('hidden.bs.collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } Collapse.prototype.getParent = function () { return $(document).find(this.options.parent) .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') .each($.proxy(function (i, element) { var $element = $(element) this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) }, this)) .end() } Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { var isOpen = $element.hasClass('in') $element.attr('aria-expanded', isOpen) $trigger .toggleClass('collapsed', !isOpen) .attr('aria-expanded', isOpen) } function getTargetFromTrigger($trigger) { var href var target = $trigger.attr('data-target') || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 return $(document).find(target) } // COLLAPSE PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.collapse $.fn.collapse = Plugin $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { var $this = $(this) if (!$this.attr('data-target')) e.preventDefault() var $target = getTargetFromTrigger($this) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() Plugin.call($target, option) }) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/dropdown.js ================================================ /* ======================================================================== * Bootstrap: dropdown.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#dropdowns * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle="dropdown"]' var Dropdown = function (element) { $(element).on('click.bs.dropdown', this.toggle) } Dropdown.VERSION = '3.4.1' function getParent($this) { var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = selector !== '#' ? $(document).find(selector) : null return $parent && $parent.length ? $parent : $this.parent() } function clearMenus(e) { if (e && e.which === 3) return $(backdrop).remove() $(toggle).each(function () { var $this = $(this) var $parent = getParent($this) var relatedTarget = { relatedTarget: this } if (!$parent.hasClass('open')) return if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this.attr('aria-expanded', 'false') $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) }) } Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we use a backdrop because click events don't delegate $(document.createElement('div')) .addClass('dropdown-backdrop') .insertAfter($(this)) .on('click', clearMenus) } var relatedTarget = { relatedTarget: this } $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this .trigger('focus') .attr('aria-expanded', 'true') $parent .toggleClass('open') .trigger($.Event('shown.bs.dropdown', relatedTarget)) } return false } Dropdown.prototype.keydown = function (e) { if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return var $this = $(this) e.preventDefault() e.stopPropagation() if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') if (!isActive && e.which != 27 || isActive && e.which == 27) { if (e.which == 27) $parent.find(toggle).trigger('focus') return $this.trigger('click') } var desc = ' li:not(.disabled):visible a' var $items = $parent.find('.dropdown-menu' + desc) if (!$items.length) return var index = $items.index(e.target) if (e.which == 38 && index > 0) index-- // up if (e.which == 40 && index < $items.length - 1) index++ // down if (!~index) index = 0 $items.eq(index).trigger('focus') } // DROPDOWN PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.dropdown') if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.dropdown $.fn.dropdown = Plugin $.fn.dropdown.Constructor = Dropdown // DROPDOWN NO CONFLICT // ==================== $.fn.dropdown.noConflict = function () { $.fn.dropdown = old return this } // APPLY TO STANDARD DROPDOWN ELEMENTS // =================================== $(document) .on('click.bs.dropdown.data-api', clearMenus) .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/modal.js ================================================ /* ======================================================================== * Bootstrap: modal.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#modals * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // MODAL CLASS DEFINITION // ====================== var Modal = function (element, options) { this.options = options this.$body = $(document.body) this.$element = $(element) this.$dialog = this.$element.find('.modal-dialog') this.$backdrop = null this.isShown = null this.originalBodyPad = null this.scrollbarWidth = 0 this.ignoreBackdropClick = false this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom' if (this.options.remote) { this.$element .find('.modal-content') .load(this.options.remote, $.proxy(function () { this.$element.trigger('loaded.bs.modal') }, this)) } } Modal.VERSION = '3.4.1' Modal.TRANSITION_DURATION = 300 Modal.BACKDROP_TRANSITION_DURATION = 150 Modal.DEFAULTS = { backdrop: true, keyboard: true, show: true } Modal.prototype.toggle = function (_relatedTarget) { return this.isShown ? this.hide() : this.show(_relatedTarget) } Modal.prototype.show = function (_relatedTarget) { var that = this var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) this.$element.trigger(e) if (this.isShown || e.isDefaultPrevented()) return this.isShown = true this.checkScrollbar() this.setScrollbar() this.$body.addClass('modal-open') this.escape() this.resize() this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) this.$dialog.on('mousedown.dismiss.bs.modal', function () { that.$element.one('mouseup.dismiss.bs.modal', function (e) { if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true }) }) this.backdrop(function () { var transition = $.support.transition && that.$element.hasClass('fade') if (!that.$element.parent().length) { that.$element.appendTo(that.$body) // don't move modals dom position } that.$element .show() .scrollTop(0) that.adjustDialog() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element.addClass('in') that.enforceFocus() var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) transition ? that.$dialog // wait for modal to slide in .one('bsTransitionEnd', function () { that.$element.trigger('focus').trigger(e) }) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : that.$element.trigger('focus').trigger(e) }) } Modal.prototype.hide = function (e) { if (e) e.preventDefault() e = $.Event('hide.bs.modal') this.$element.trigger(e) if (!this.isShown || e.isDefaultPrevented()) return this.isShown = false this.escape() this.resize() $(document).off('focusin.bs.modal') this.$element .removeClass('in') .off('click.dismiss.bs.modal') .off('mouseup.dismiss.bs.modal') this.$dialog.off('mousedown.dismiss.bs.modal') $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } Modal.prototype.enforceFocus = function () { $(document) .off('focusin.bs.modal') // guard against infinite focus loop .on('focusin.bs.modal', $.proxy(function (e) { if (document !== e.target && this.$element[0] !== e.target && !this.$element.has(e.target).length) { this.$element.trigger('focus') } }, this)) } Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { this.$element.off('keydown.dismiss.bs.modal') } } Modal.prototype.resize = function () { if (this.isShown) { $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) } else { $(window).off('resize.bs.modal') } } Modal.prototype.hideModal = function () { var that = this this.$element.hide() this.backdrop(function () { that.$body.removeClass('modal-open') that.resetAdjustments() that.resetScrollbar() that.$element.trigger('hidden.bs.modal') }) } Modal.prototype.removeBackdrop = function () { this.$backdrop && this.$backdrop.remove() this.$backdrop = null } Modal.prototype.backdrop = function (callback) { var that = this var animate = this.$element.hasClass('fade') ? 'fade' : '' if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate this.$backdrop = $(document.createElement('div')) .addClass('modal-backdrop ' + animate) .appendTo(this.$body) this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { if (this.ignoreBackdropClick) { this.ignoreBackdropClick = false return } if (e.target !== e.currentTarget) return this.options.backdrop == 'static' ? this.$element[0].focus() : this.hide() }, this)) if (doAnimate) this.$backdrop[0].offsetWidth // force reflow this.$backdrop.addClass('in') if (!callback) return doAnimate ? this.$backdrop .one('bsTransitionEnd', callback) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callback() } else if (!this.isShown && this.$backdrop) { this.$backdrop.removeClass('in') var callbackRemove = function () { that.removeBackdrop() callback && callback() } $.support.transition && this.$element.hasClass('fade') ? this.$backdrop .one('bsTransitionEnd', callbackRemove) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callbackRemove() } else if (callback) { callback() } } // these following methods are used to handle overflowing modals Modal.prototype.handleUpdate = function () { this.adjustDialog() } Modal.prototype.adjustDialog = function () { var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight this.$element.css({ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' }) } Modal.prototype.resetAdjustments = function () { this.$element.css({ paddingLeft: '', paddingRight: '' }) } Modal.prototype.checkScrollbar = function () { var fullWindowWidth = window.innerWidth if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 var documentElementRect = document.documentElement.getBoundingClientRect() fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) } this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth this.scrollbarWidth = this.measureScrollbar() } Modal.prototype.setScrollbar = function () { var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) this.originalBodyPad = document.body.style.paddingRight || '' var scrollbarWidth = this.scrollbarWidth if (this.bodyIsOverflowing) { this.$body.css('padding-right', bodyPad + scrollbarWidth) $(this.fixedContent).each(function (index, element) { var actualPadding = element.style.paddingRight var calculatedPadding = $(element).css('padding-right') $(element) .data('padding-right', actualPadding) .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px') }) } } Modal.prototype.resetScrollbar = function () { this.$body.css('padding-right', this.originalBodyPad) $(this.fixedContent).each(function (index, element) { var padding = $(element).data('padding-right') $(element).removeData('padding-right') element.style.paddingRight = padding ? padding : '' }) } Modal.prototype.measureScrollbar = function () { // thx walsh var scrollDiv = document.createElement('div') scrollDiv.className = 'modal-scrollbar-measure' this.$body.append(scrollDiv) var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth this.$body[0].removeChild(scrollDiv) return scrollbarWidth } // MODAL PLUGIN DEFINITION // ======================= function Plugin(option, _relatedTarget) { return this.each(function () { var $this = $(this) var data = $this.data('bs.modal') var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data) $this.data('bs.modal', (data = new Modal(this, options))) if (typeof option == 'string') data[option](_relatedTarget) else if (options.show) data.show(_relatedTarget) }) } var old = $.fn.modal $.fn.modal = Plugin $.fn.modal.Constructor = Modal // MODAL NO CONFLICT // ================= $.fn.modal.noConflict = function () { $.fn.modal = old return this } // MODAL DATA-API // ============== $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { var $this = $(this) var href = $this.attr('href') var target = $this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 var $target = $(document).find(target) var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) if ($this.is('a')) e.preventDefault() $target.one('show.bs.modal', function (showEvent) { if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown $target.one('hidden.bs.modal', function () { $this.is(':visible') && $this.trigger('focus') }) }) Plugin.call($target, option, this) }) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/popover.js ================================================ /* ======================================================================== * Bootstrap: popover.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#popovers * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // POPOVER PUBLIC CLASS DEFINITION // =============================== var Popover = function (element, options) { this.init('popover', element, options) } if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') Popover.VERSION = '3.4.1' Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { placement: 'right', trigger: 'click', content: '', template: '' }) // NOTE: POPOVER EXTENDS tooltip.js // ================================ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) Popover.prototype.constructor = Popover Popover.prototype.getDefaults = function () { return Popover.DEFAULTS } Popover.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() var content = this.getContent() if (this.options.html) { var typeContent = typeof content if (this.options.sanitize) { title = this.sanitizeHtml(title) if (typeContent === 'string') { content = this.sanitizeHtml(content) } } $tip.find('.popover-title').html(title) $tip.find('.popover-content').children().detach().end()[ typeContent === 'string' ? 'html' : 'append' ](content) } else { $tip.find('.popover-title').text(title) $tip.find('.popover-content').children().detach().end().text(content) } $tip.removeClass('fade top bottom left right in') // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do // this manually by checking the contents. if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() } Popover.prototype.hasContent = function () { return this.getTitle() || this.getContent() } Popover.prototype.getContent = function () { var $e = this.$element var o = this.options return $e.attr('data-content') || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) } Popover.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.arrow')) } // POPOVER PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.popover') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.popover', (data = new Popover(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.popover $.fn.popover = Plugin $.fn.popover.Constructor = Popover // POPOVER NO CONFLICT // =================== $.fn.popover.noConflict = function () { $.fn.popover = old return this } }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/scrollspy.js ================================================ /* ======================================================================== * Bootstrap: scrollspy.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#scrollspy * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // SCROLLSPY CLASS DEFINITION // ========================== function ScrollSpy(element, options) { this.$body = $(document.body) this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) this.options = $.extend({}, ScrollSpy.DEFAULTS, options) this.selector = (this.options.target || '') + ' .nav li > a' this.offsets = [] this.targets = [] this.activeTarget = null this.scrollHeight = 0 this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) this.refresh() this.process() } ScrollSpy.VERSION = '3.4.1' ScrollSpy.DEFAULTS = { offset: 10 } ScrollSpy.prototype.getScrollHeight = function () { return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) } ScrollSpy.prototype.refresh = function () { var that = this var offsetMethod = 'offset' var offsetBase = 0 this.offsets = [] this.targets = [] this.scrollHeight = this.getScrollHeight() if (!$.isWindow(this.$scrollElement[0])) { offsetMethod = 'position' offsetBase = this.$scrollElement.scrollTop() } this.$body .find(this.selector) .map(function () { var $el = $(this) var href = $el.data('target') || $el.attr('href') var $href = /^#./.test(href) && $(href) return ($href && $href.length && $href.is(':visible') && [[$href[offsetMethod]().top + offsetBase, href]]) || null }) .sort(function (a, b) { return a[0] - b[0] }) .each(function () { that.offsets.push(this[0]) that.targets.push(this[1]) }) } ScrollSpy.prototype.process = function () { var scrollTop = this.$scrollElement.scrollTop() + this.options.offset var scrollHeight = this.getScrollHeight() var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() var offsets = this.offsets var targets = this.targets var activeTarget = this.activeTarget var i if (this.scrollHeight != scrollHeight) { this.refresh() } if (scrollTop >= maxScroll) { return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) } if (activeTarget && scrollTop < offsets[0]) { this.activeTarget = null return this.clear() } for (i = offsets.length; i--;) { activeTarget != targets[i] && scrollTop >= offsets[i] && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) && this.activate(targets[i]) } } ScrollSpy.prototype.activate = function (target) { this.activeTarget = target this.clear() var selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]' var active = $(selector) .parents('li') .addClass('active') if (active.parent('.dropdown-menu').length) { active = active .closest('li.dropdown') .addClass('active') } active.trigger('activate.bs.scrollspy') } ScrollSpy.prototype.clear = function () { $(this.selector) .parentsUntil(this.options.target, '.active') .removeClass('active') } // SCROLLSPY PLUGIN DEFINITION // =========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.scrollspy') var options = typeof option == 'object' && option if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.scrollspy $.fn.scrollspy = Plugin $.fn.scrollspy.Constructor = ScrollSpy // SCROLLSPY NO CONFLICT // ===================== $.fn.scrollspy.noConflict = function () { $.fn.scrollspy = old return this } // SCROLLSPY DATA-API // ================== $(window).on('load.bs.scrollspy.data-api', function () { $('[data-spy="scroll"]').each(function () { var $spy = $(this) Plugin.call($spy, $spy.data()) }) }) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/tab.js ================================================ /* ======================================================================== * Bootstrap: tab.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#tabs * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TAB CLASS DEFINITION // ==================== var Tab = function (element) { // jscs:disable requireDollarBeforejQueryAssignment this.element = $(element) // jscs:enable requireDollarBeforejQueryAssignment } Tab.VERSION = '3.4.1' Tab.TRANSITION_DURATION = 150 Tab.prototype.show = function () { var $this = this.element var $ul = $this.closest('ul:not(.dropdown-menu)') var selector = $this.data('target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } if ($this.parent('li').hasClass('active')) return var $previous = $ul.find('.active:last a') var hideEvent = $.Event('hide.bs.tab', { relatedTarget: $this[0] }) var showEvent = $.Event('show.bs.tab', { relatedTarget: $previous[0] }) $previous.trigger(hideEvent) $this.trigger(showEvent) if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return var $target = $(document).find(selector) this.activate($this.closest('li'), $ul) this.activate($target, $target.parent(), function () { $previous.trigger({ type: 'hidden.bs.tab', relatedTarget: $this[0] }) $this.trigger({ type: 'shown.bs.tab', relatedTarget: $previous[0] }) }) } Tab.prototype.activate = function (element, container, callback) { var $active = container.find('> .active') var transition = callback && $.support.transition && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) function next() { $active .removeClass('active') .find('> .dropdown-menu > .active') .removeClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', false) element .addClass('active') .find('[data-toggle="tab"]') .attr('aria-expanded', true) if (transition) { element[0].offsetWidth // reflow for transition element.addClass('in') } else { element.removeClass('fade') } if (element.parent('.dropdown-menu').length) { element .closest('li.dropdown') .addClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', true) } callback && callback() } $active.length && transition ? $active .one('bsTransitionEnd', next) .emulateTransitionEnd(Tab.TRANSITION_DURATION) : next() $active.removeClass('in') } // TAB PLUGIN DEFINITION // ===================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tab') if (!data) $this.data('bs.tab', (data = new Tab(this))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tab $.fn.tab = Plugin $.fn.tab.Constructor = Tab // TAB NO CONFLICT // =============== $.fn.tab.noConflict = function () { $.fn.tab = old return this } // TAB DATA-API // ============ var clickHandler = function (e) { e.preventDefault() Plugin.call($(this), 'show') } $(document) .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/tooltip.js ================================================ /* ======================================================================== * Bootstrap: tooltip.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'] var uriAttrs = [ 'background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href' ] var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i var DefaultWhitelist = { // Global attributes allowed on any supplied element below. '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], a: ['target', 'href', 'title', 'rel'], area: [], b: [], br: [], col: [], code: [], div: [], em: [], hr: [], h1: [], h2: [], h3: [], h4: [], h5: [], h6: [], i: [], img: ['src', 'alt', 'title', 'width', 'height'], li: [], ol: [], p: [], pre: [], s: [], small: [], span: [], sub: [], sup: [], strong: [], u: [], ul: [] } /** * A pattern that recognizes a commonly useful subset of URLs that are safe. * * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts */ var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi /** * A pattern that matches safe data URLs. Only matches image, video and audio types. * * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts */ var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i function allowedAttribute(attr, allowedAttributeList) { var attrName = attr.nodeName.toLowerCase() if ($.inArray(attrName, allowedAttributeList) !== -1) { if ($.inArray(attrName, uriAttrs) !== -1) { return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)) } return true } var regExp = $(allowedAttributeList).filter(function (index, value) { return value instanceof RegExp }) // Check if a regular expression validates the attribute. for (var i = 0, l = regExp.length; i < l; i++) { if (attrName.match(regExp[i])) { return true } } return false } function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { if (unsafeHtml.length === 0) { return unsafeHtml } if (sanitizeFn && typeof sanitizeFn === 'function') { return sanitizeFn(unsafeHtml) } // IE 8 and below don't support createHTMLDocument if (!document.implementation || !document.implementation.createHTMLDocument) { return unsafeHtml } var createdDocument = document.implementation.createHTMLDocument('sanitization') createdDocument.body.innerHTML = unsafeHtml var whitelistKeys = $.map(whiteList, function (el, i) { return i }) var elements = $(createdDocument.body).find('*') for (var i = 0, len = elements.length; i < len; i++) { var el = elements[i] var elName = el.nodeName.toLowerCase() if ($.inArray(elName, whitelistKeys) === -1) { el.parentNode.removeChild(el) continue } var attributeList = $.map(el.attributes, function (el) { return el }) var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []) for (var j = 0, len2 = attributeList.length; j < len2; j++) { if (!allowedAttribute(attributeList[j], whitelistedAttributes)) { el.removeAttribute(attributeList[j].nodeName) } } } return createdDocument.body.innerHTML } // TOOLTIP PUBLIC CLASS DEFINITION // =============================== var Tooltip = function (element, options) { this.type = null this.options = null this.enabled = null this.timeout = null this.hoverState = null this.$element = null this.inState = null this.init('tooltip', element, options) } Tooltip.VERSION = '3.4.1' Tooltip.TRANSITION_DURATION = 150 Tooltip.DEFAULTS = { animation: true, placement: 'top', selector: false, template: '', trigger: 'hover focus', title: '', delay: 0, html: false, container: false, viewport: { selector: 'body', padding: 0 }, sanitize : true, sanitizeFn : null, whiteList : DefaultWhitelist } Tooltip.prototype.init = function (type, element, options) { this.enabled = true this.type = type this.$element = $(element) this.options = this.getOptions(options) this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) this.inState = { click: false, hover: false, focus: false } if (this.$element[0] instanceof document.constructor && !this.options.selector) { throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') } var triggers = this.options.trigger.split(' ') for (var i = triggers.length; i--;) { var trigger = triggers[i] if (trigger == 'click') { this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) } else if (trigger != 'manual') { var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) } } this.options.selector ? (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : this.fixTitle() } Tooltip.prototype.getDefaults = function () { return Tooltip.DEFAULTS } Tooltip.prototype.getOptions = function (options) { var dataAttributes = this.$element.data() for (var dataAttr in dataAttributes) { if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) { delete dataAttributes[dataAttr] } } options = $.extend({}, this.getDefaults(), dataAttributes, options) if (options.delay && typeof options.delay == 'number') { options.delay = { show: options.delay, hide: options.delay } } if (options.sanitize) { options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn) } return options } Tooltip.prototype.getDelegateOptions = function () { var options = {} var defaults = this.getDefaults() this._options && $.each(this._options, function (key, value) { if (defaults[key] != value) options[key] = value }) return options } Tooltip.prototype.enter = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true } if (self.tip().hasClass('in') || self.hoverState == 'in') { self.hoverState = 'in' return } clearTimeout(self.timeout) self.hoverState = 'in' if (!self.options.delay || !self.options.delay.show) return self.show() self.timeout = setTimeout(function () { if (self.hoverState == 'in') self.show() }, self.options.delay.show) } Tooltip.prototype.isInStateTrue = function () { for (var key in this.inState) { if (this.inState[key]) return true } return false } Tooltip.prototype.leave = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false } if (self.isInStateTrue()) return clearTimeout(self.timeout) self.hoverState = 'out' if (!self.options.delay || !self.options.delay.hide) return self.hide() self.timeout = setTimeout(function () { if (self.hoverState == 'out') self.hide() }, self.options.delay.hide) } Tooltip.prototype.show = function () { var e = $.Event('show.bs.' + this.type) if (this.hasContent() && this.enabled) { this.$element.trigger(e) var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) if (e.isDefaultPrevented() || !inDom) return var that = this var $tip = this.tip() var tipId = this.getUID(this.type) this.setContent() $tip.attr('id', tipId) this.$element.attr('aria-describedby', tipId) if (this.options.animation) $tip.addClass('fade') var placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement var autoToken = /\s?auto?\s?/i var autoPlace = autoToken.test(placement) if (autoPlace) placement = placement.replace(autoToken, '') || 'top' $tip .detach() .css({ top: 0, left: 0, display: 'block' }) .addClass(placement) .data('bs.' + this.type, this) this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element) this.$element.trigger('inserted.bs.' + this.type) var pos = this.getPosition() var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (autoPlace) { var orgPlacement = placement var viewportDim = this.getPosition(this.$viewport) placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : placement $tip .removeClass(orgPlacement) .addClass(placement) } var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) this.applyPlacement(calculatedOffset, placement) var complete = function () { var prevHoverState = that.hoverState that.$element.trigger('shown.bs.' + that.type) that.hoverState = null if (prevHoverState == 'out') that.leave(that) } $.support.transition && this.$tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() } } Tooltip.prototype.applyPlacement = function (offset, placement) { var $tip = this.tip() var width = $tip[0].offsetWidth var height = $tip[0].offsetHeight // manually read margins because getBoundingClientRect includes difference var marginTop = parseInt($tip.css('margin-top'), 10) var marginLeft = parseInt($tip.css('margin-left'), 10) // we must check for NaN for ie 8/9 if (isNaN(marginTop)) marginTop = 0 if (isNaN(marginLeft)) marginLeft = 0 offset.top += marginTop offset.left += marginLeft // $.fn.offset doesn't round pixel values // so we use setOffset directly with our own function B-0 $.offset.setOffset($tip[0], $.extend({ using: function (props) { $tip.css({ top: Math.round(props.top), left: Math.round(props.left) }) } }, offset), 0) $tip.addClass('in') // check to see if placing tip in new offset caused the tip to resize itself var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (placement == 'top' && actualHeight != height) { offset.top = offset.top + height - actualHeight } var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) if (delta.left) offset.left += delta.left else offset.top += delta.top var isVertical = /top|bottom/.test(placement) var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' $tip.offset(offset) this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) } Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { this.arrow() .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') .css(isVertical ? 'top' : 'left', '') } Tooltip.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() if (this.options.html) { if (this.options.sanitize) { title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn) } $tip.find('.tooltip-inner').html(title) } else { $tip.find('.tooltip-inner').text(title) } $tip.removeClass('fade in top bottom left right') } Tooltip.prototype.hide = function (callback) { var that = this var $tip = $(this.$tip) var e = $.Event('hide.bs.' + this.type) function complete() { if (that.hoverState != 'in') $tip.detach() if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. that.$element .removeAttr('aria-describedby') .trigger('hidden.bs.' + that.type) } callback && callback() } this.$element.trigger(e) if (e.isDefaultPrevented()) return $tip.removeClass('in') $.support.transition && $tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() this.hoverState = null return this } Tooltip.prototype.fixTitle = function () { var $e = this.$element if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') } } Tooltip.prototype.hasContent = function () { return this.getTitle() } Tooltip.prototype.getPosition = function ($element) { $element = $element || this.$element var el = $element[0] var isBody = el.tagName == 'BODY' var elRect = el.getBoundingClientRect() if (elRect.width == null) { // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) } var isSvg = window.SVGElement && el instanceof window.SVGElement // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. // See https://github.com/twbs/bootstrap/issues/20280 var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null return $.extend({}, elRect, scroll, outerDims, elOffset) } Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } } Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { var delta = { top: 0, left: 0 } if (!this.$viewport) return delta var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 var viewportDimensions = this.getPosition(this.$viewport) if (/right|left/.test(placement)) { var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight if (topEdgeOffset < viewportDimensions.top) { // top overflow delta.top = viewportDimensions.top - topEdgeOffset } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset } } else { var leftEdgeOffset = pos.left - viewportPadding var rightEdgeOffset = pos.left + viewportPadding + actualWidth if (leftEdgeOffset < viewportDimensions.left) { // left overflow delta.left = viewportDimensions.left - leftEdgeOffset } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset } } return delta } Tooltip.prototype.getTitle = function () { var title var $e = this.$element var o = this.options title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) return title } Tooltip.prototype.getUID = function (prefix) { do prefix += ~~(Math.random() * 1000000) while (document.getElementById(prefix)) return prefix } Tooltip.prototype.tip = function () { if (!this.$tip) { this.$tip = $(this.options.template) if (this.$tip.length != 1) { throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') } } return this.$tip } Tooltip.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) } Tooltip.prototype.enable = function () { this.enabled = true } Tooltip.prototype.disable = function () { this.enabled = false } Tooltip.prototype.toggleEnabled = function () { this.enabled = !this.enabled } Tooltip.prototype.toggle = function (e) { var self = this if (e) { self = $(e.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(e.currentTarget, this.getDelegateOptions()) $(e.currentTarget).data('bs.' + this.type, self) } } if (e) { self.inState.click = !self.inState.click if (self.isInStateTrue()) self.enter(self) else self.leave(self) } else { self.tip().hasClass('in') ? self.leave(self) : self.enter(self) } } Tooltip.prototype.destroy = function () { var that = this clearTimeout(this.timeout) this.hide(function () { that.$element.off('.' + that.type).removeData('bs.' + that.type) if (that.$tip) { that.$tip.detach() } that.$tip = null that.$arrow = null that.$viewport = null that.$element = null }) } Tooltip.prototype.sanitizeHtml = function (unsafeHtml) { return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn) } // TOOLTIP PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tooltip') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tooltip $.fn.tooltip = Plugin $.fn.tooltip.Constructor = Tooltip // TOOLTIP NO CONFLICT // =================== $.fn.tooltip.noConflict = function () { $.fn.tooltip = old return this } }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap/transition.js ================================================ /* ======================================================================== * Bootstrap: transition.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#transitions * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/) // ============================================================ function transitionEnd() { var el = document.createElement('bootstrap') var transEndEventNames = { WebkitTransition : 'webkitTransitionEnd', MozTransition : 'transitionend', OTransition : 'oTransitionEnd otransitionend', transition : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } return false // explicit for ie8 ( ._.) } // https://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false var $el = this $(this).one('bsTransitionEnd', function () { called = true }) var callback = function () { if (!called) $($el).trigger($.support.transition.end) } setTimeout(callback, duration) return this } $(function () { $.support.transition = transitionEnd() if (!$.support.transition) return $.event.special.bsTransitionEnd = { bindType: $.support.transition.end, delegateType: $.support.transition.end, handle: function (e) { if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) } } }) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap-sprockets.js ================================================ //= require ./bootstrap/affix //= require ./bootstrap/alert //= require ./bootstrap/button //= require ./bootstrap/carousel //= require ./bootstrap/collapse //= require ./bootstrap/dropdown //= require ./bootstrap/modal //= require ./bootstrap/scrollspy //= require ./bootstrap/tab //= require ./bootstrap/transition //= require ./bootstrap/tooltip //= require ./bootstrap/popover ================================================ FILE: fork/bootstrap-sass/assets/javascripts/bootstrap.js ================================================ /*! * Bootstrap v3.4.1 (https://getbootstrap.com/) * Copyright 2011-2019 Twitter, Inc. * Licensed under the MIT license */ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } +function ($) { 'use strict'; var version = $.fn.jquery.split(' ')[0].split('.') if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') } }(jQuery); /* ======================================================================== * Bootstrap: transition.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#transitions * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/) // ============================================================ function transitionEnd() { var el = document.createElement('bootstrap') var transEndEventNames = { WebkitTransition : 'webkitTransitionEnd', MozTransition : 'transitionend', OTransition : 'oTransitionEnd otransitionend', transition : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } return false // explicit for ie8 ( ._.) } // https://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false var $el = this $(this).one('bsTransitionEnd', function () { called = true }) var callback = function () { if (!called) $($el).trigger($.support.transition.end) } setTimeout(callback, duration) return this } $(function () { $.support.transition = transitionEnd() if (!$.support.transition) return $.event.special.bsTransitionEnd = { bindType: $.support.transition.end, delegateType: $.support.transition.end, handle: function (e) { if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) } } }) }(jQuery); /* ======================================================================== * Bootstrap: alert.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#alerts * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.VERSION = '3.4.1' Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } selector = selector === '#' ? [] : selector var $parent = $(document).find(selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { // detach from parent, fire event then clean up data $parent.detach().trigger('closed.bs.alert').remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one('bsTransitionEnd', removeElement) .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.alert') if (!data) $this.data('bs.alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.alert $.fn.alert = Plugin $.fn.alert.Constructor = Alert // ALERT NO CONFLICT // ================= $.fn.alert.noConflict = function () { $.fn.alert = old return this } // ALERT DATA-API // ============== $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(jQuery); /* ======================================================================== * Bootstrap: button.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#buttons * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) this.isLoading = false } Button.VERSION = '3.4.1' Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function (state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state += 'Text' if (data.resetText == null) $el.data('resetText', $el[val]()) // push to event loop to allow forms to submit setTimeout($.proxy(function () { $el[val](data[state] == null ? this.options[state] : data[state]) if (state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d).prop(d, true) } else if (this.isLoading) { this.isLoading = false $el.removeClass(d).removeAttr(d).prop(d, false) } }, this), 0) } Button.prototype.toggle = function () { var changed = true var $parent = this.$element.closest('[data-toggle="buttons"]') if ($parent.length) { var $input = this.$element.find('input') if ($input.prop('type') == 'radio') { if ($input.prop('checked')) changed = false $parent.find('.active').removeClass('active') this.$element.addClass('active') } else if ($input.prop('type') == 'checkbox') { if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false this.$element.toggleClass('active') } $input.prop('checked', this.$element.hasClass('active')) if (changed) $input.trigger('change') } else { this.$element.attr('aria-pressed', !this.$element.hasClass('active')) this.$element.toggleClass('active') } } // BUTTON PLUGIN DEFINITION // ======================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.button') var options = typeof option == 'object' && option if (!data) $this.data('bs.button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } var old = $.fn.button $.fn.button = Plugin $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document) .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { var $btn = $(e.target).closest('.btn') Plugin.call($btn, 'toggle') if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { // Prevent double click on radios, and the double selections (so cancellation) on checkboxes e.preventDefault() // The target component still receive the focus if ($btn.is('input,button')) $btn.trigger('focus') else $btn.find('input:visible,button:visible').first().trigger('focus') } }) .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) }) }(jQuery); /* ======================================================================== * Bootstrap: carousel.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#carousel * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CAROUSEL CLASS DEFINITION // ========================= var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = null this.sliding = null this.interval = null this.$active = null this.$items = null this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) } Carousel.VERSION = '3.4.1' Carousel.TRANSITION_DURATION = 600 Carousel.DEFAULTS = { interval: 5000, pause: 'hover', wrap: true, keyboard: true } Carousel.prototype.keydown = function (e) { if (/input|textarea/i.test(e.target.tagName)) return switch (e.which) { case 37: this.prev(); break case 39: this.next(); break default: return } e.preventDefault() } Carousel.prototype.cycle = function (e) { e || (this.paused = false) this.interval && clearInterval(this.interval) this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } Carousel.prototype.getItemIndex = function (item) { this.$items = item.parent().children('.item') return this.$items.index(item || this.$active) } Carousel.prototype.getItemForDirection = function (direction, active) { var activeIndex = this.getItemIndex(active) var willWrap = (direction == 'prev' && activeIndex === 0) || (direction == 'next' && activeIndex == (this.$items.length - 1)) if (willWrap && !this.options.wrap) return active var delta = direction == 'prev' ? -1 : 1 var itemIndex = (activeIndex + delta) % this.$items.length return this.$items.eq(itemIndex) } Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var that = this if ($next.hasClass('active')) return (this.sliding = false) var relatedTarget = $next[0] var slideEvent = $.Event('slide.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) this.$element.trigger(slideEvent) if (slideEvent.isDefaultPrevented()) return this.sliding = true isCycling && this.pause() if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) $nextIndicator && $nextIndicator.addClass('active') } var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" if ($.support.transition && this.$element.hasClass('slide')) { $next.addClass(type) if (typeof $next === 'object' && $next.length) { $next[0].offsetWidth // force reflow } $active.addClass(direction) $next.addClass(direction) $active .one('bsTransitionEnd', function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger(slidEvent) }, 0) }) .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger(slidEvent) } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } var old = $.fn.carousel $.fn.carousel = Plugin $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= var clickHandler = function (e) { var $this = $(this) var href = $this.attr('href') if (href) { href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 } var target = $this.attr('data-target') || href var $target = $(document).find(target) if (!$target.hasClass('carousel')) return var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false Plugin.call($target, options) if (slideIndex) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() } $(document) .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) Plugin.call($carousel, $carousel.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: collapse.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#collapse * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ /* jshint latedef: false */ +function ($) { 'use strict'; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + '[data-toggle="collapse"][data-target="#' + element.id + '"]') this.transitioning = null if (this.options.parent) { this.$parent = this.getParent() } else { this.addAriaAndCollapsedClass(this.$element, this.$trigger) } if (this.options.toggle) this.toggle() } Collapse.VERSION = '3.4.1' Collapse.TRANSITION_DURATION = 350 Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var activesData var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') if (actives && actives.length) { activesData = actives.data('bs.collapse') if (activesData && activesData.transitioning) return } var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return if (actives && actives.length) { Plugin.call(actives, 'hide') activesData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing')[dimension](0) .attr('aria-expanded', true) this.$trigger .removeClass('collapsed') .attr('aria-expanded', true) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('collapse in')[dimension]('') this.transitioning = 0 this.$element .trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element[dimension](this.$element[dimension]())[0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse in') .attr('aria-expanded', false) this.$trigger .addClass('collapsed') .attr('aria-expanded', false) this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .removeClass('collapsing') .addClass('collapse') .trigger('hidden.bs.collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } Collapse.prototype.getParent = function () { return $(document).find(this.options.parent) .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') .each($.proxy(function (i, element) { var $element = $(element) this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) }, this)) .end() } Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { var isOpen = $element.hasClass('in') $element.attr('aria-expanded', isOpen) $trigger .toggleClass('collapsed', !isOpen) .attr('aria-expanded', isOpen) } function getTargetFromTrigger($trigger) { var href var target = $trigger.attr('data-target') || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 return $(document).find(target) } // COLLAPSE PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.collapse $.fn.collapse = Plugin $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { var $this = $(this) if (!$this.attr('data-target')) e.preventDefault() var $target = getTargetFromTrigger($this) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() Plugin.call($target, option) }) }(jQuery); /* ======================================================================== * Bootstrap: dropdown.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#dropdowns * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle="dropdown"]' var Dropdown = function (element) { $(element).on('click.bs.dropdown', this.toggle) } Dropdown.VERSION = '3.4.1' function getParent($this) { var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = selector !== '#' ? $(document).find(selector) : null return $parent && $parent.length ? $parent : $this.parent() } function clearMenus(e) { if (e && e.which === 3) return $(backdrop).remove() $(toggle).each(function () { var $this = $(this) var $parent = getParent($this) var relatedTarget = { relatedTarget: this } if (!$parent.hasClass('open')) return if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this.attr('aria-expanded', 'false') $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) }) } Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we use a backdrop because click events don't delegate $(document.createElement('div')) .addClass('dropdown-backdrop') .insertAfter($(this)) .on('click', clearMenus) } var relatedTarget = { relatedTarget: this } $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this .trigger('focus') .attr('aria-expanded', 'true') $parent .toggleClass('open') .trigger($.Event('shown.bs.dropdown', relatedTarget)) } return false } Dropdown.prototype.keydown = function (e) { if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return var $this = $(this) e.preventDefault() e.stopPropagation() if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') if (!isActive && e.which != 27 || isActive && e.which == 27) { if (e.which == 27) $parent.find(toggle).trigger('focus') return $this.trigger('click') } var desc = ' li:not(.disabled):visible a' var $items = $parent.find('.dropdown-menu' + desc) if (!$items.length) return var index = $items.index(e.target) if (e.which == 38 && index > 0) index-- // up if (e.which == 40 && index < $items.length - 1) index++ // down if (!~index) index = 0 $items.eq(index).trigger('focus') } // DROPDOWN PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.dropdown') if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.dropdown $.fn.dropdown = Plugin $.fn.dropdown.Constructor = Dropdown // DROPDOWN NO CONFLICT // ==================== $.fn.dropdown.noConflict = function () { $.fn.dropdown = old return this } // APPLY TO STANDARD DROPDOWN ELEMENTS // =================================== $(document) .on('click.bs.dropdown.data-api', clearMenus) .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) }(jQuery); /* ======================================================================== * Bootstrap: modal.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#modals * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // MODAL CLASS DEFINITION // ====================== var Modal = function (element, options) { this.options = options this.$body = $(document.body) this.$element = $(element) this.$dialog = this.$element.find('.modal-dialog') this.$backdrop = null this.isShown = null this.originalBodyPad = null this.scrollbarWidth = 0 this.ignoreBackdropClick = false this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom' if (this.options.remote) { this.$element .find('.modal-content') .load(this.options.remote, $.proxy(function () { this.$element.trigger('loaded.bs.modal') }, this)) } } Modal.VERSION = '3.4.1' Modal.TRANSITION_DURATION = 300 Modal.BACKDROP_TRANSITION_DURATION = 150 Modal.DEFAULTS = { backdrop: true, keyboard: true, show: true } Modal.prototype.toggle = function (_relatedTarget) { return this.isShown ? this.hide() : this.show(_relatedTarget) } Modal.prototype.show = function (_relatedTarget) { var that = this var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) this.$element.trigger(e) if (this.isShown || e.isDefaultPrevented()) return this.isShown = true this.checkScrollbar() this.setScrollbar() this.$body.addClass('modal-open') this.escape() this.resize() this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) this.$dialog.on('mousedown.dismiss.bs.modal', function () { that.$element.one('mouseup.dismiss.bs.modal', function (e) { if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true }) }) this.backdrop(function () { var transition = $.support.transition && that.$element.hasClass('fade') if (!that.$element.parent().length) { that.$element.appendTo(that.$body) // don't move modals dom position } that.$element .show() .scrollTop(0) that.adjustDialog() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element.addClass('in') that.enforceFocus() var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) transition ? that.$dialog // wait for modal to slide in .one('bsTransitionEnd', function () { that.$element.trigger('focus').trigger(e) }) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : that.$element.trigger('focus').trigger(e) }) } Modal.prototype.hide = function (e) { if (e) e.preventDefault() e = $.Event('hide.bs.modal') this.$element.trigger(e) if (!this.isShown || e.isDefaultPrevented()) return this.isShown = false this.escape() this.resize() $(document).off('focusin.bs.modal') this.$element .removeClass('in') .off('click.dismiss.bs.modal') .off('mouseup.dismiss.bs.modal') this.$dialog.off('mousedown.dismiss.bs.modal') $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } Modal.prototype.enforceFocus = function () { $(document) .off('focusin.bs.modal') // guard against infinite focus loop .on('focusin.bs.modal', $.proxy(function (e) { if (document !== e.target && this.$element[0] !== e.target && !this.$element.has(e.target).length) { this.$element.trigger('focus') } }, this)) } Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { this.$element.off('keydown.dismiss.bs.modal') } } Modal.prototype.resize = function () { if (this.isShown) { $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) } else { $(window).off('resize.bs.modal') } } Modal.prototype.hideModal = function () { var that = this this.$element.hide() this.backdrop(function () { that.$body.removeClass('modal-open') that.resetAdjustments() that.resetScrollbar() that.$element.trigger('hidden.bs.modal') }) } Modal.prototype.removeBackdrop = function () { this.$backdrop && this.$backdrop.remove() this.$backdrop = null } Modal.prototype.backdrop = function (callback) { var that = this var animate = this.$element.hasClass('fade') ? 'fade' : '' if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate this.$backdrop = $(document.createElement('div')) .addClass('modal-backdrop ' + animate) .appendTo(this.$body) this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { if (this.ignoreBackdropClick) { this.ignoreBackdropClick = false return } if (e.target !== e.currentTarget) return this.options.backdrop == 'static' ? this.$element[0].focus() : this.hide() }, this)) if (doAnimate) this.$backdrop[0].offsetWidth // force reflow this.$backdrop.addClass('in') if (!callback) return doAnimate ? this.$backdrop .one('bsTransitionEnd', callback) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callback() } else if (!this.isShown && this.$backdrop) { this.$backdrop.removeClass('in') var callbackRemove = function () { that.removeBackdrop() callback && callback() } $.support.transition && this.$element.hasClass('fade') ? this.$backdrop .one('bsTransitionEnd', callbackRemove) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callbackRemove() } else if (callback) { callback() } } // these following methods are used to handle overflowing modals Modal.prototype.handleUpdate = function () { this.adjustDialog() } Modal.prototype.adjustDialog = function () { var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight this.$element.css({ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' }) } Modal.prototype.resetAdjustments = function () { this.$element.css({ paddingLeft: '', paddingRight: '' }) } Modal.prototype.checkScrollbar = function () { var fullWindowWidth = window.innerWidth if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 var documentElementRect = document.documentElement.getBoundingClientRect() fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) } this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth this.scrollbarWidth = this.measureScrollbar() } Modal.prototype.setScrollbar = function () { var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) this.originalBodyPad = document.body.style.paddingRight || '' var scrollbarWidth = this.scrollbarWidth if (this.bodyIsOverflowing) { this.$body.css('padding-right', bodyPad + scrollbarWidth) $(this.fixedContent).each(function (index, element) { var actualPadding = element.style.paddingRight var calculatedPadding = $(element).css('padding-right') $(element) .data('padding-right', actualPadding) .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px') }) } } Modal.prototype.resetScrollbar = function () { this.$body.css('padding-right', this.originalBodyPad) $(this.fixedContent).each(function (index, element) { var padding = $(element).data('padding-right') $(element).removeData('padding-right') element.style.paddingRight = padding ? padding : '' }) } Modal.prototype.measureScrollbar = function () { // thx walsh var scrollDiv = document.createElement('div') scrollDiv.className = 'modal-scrollbar-measure' this.$body.append(scrollDiv) var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth this.$body[0].removeChild(scrollDiv) return scrollbarWidth } // MODAL PLUGIN DEFINITION // ======================= function Plugin(option, _relatedTarget) { return this.each(function () { var $this = $(this) var data = $this.data('bs.modal') var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data) $this.data('bs.modal', (data = new Modal(this, options))) if (typeof option == 'string') data[option](_relatedTarget) else if (options.show) data.show(_relatedTarget) }) } var old = $.fn.modal $.fn.modal = Plugin $.fn.modal.Constructor = Modal // MODAL NO CONFLICT // ================= $.fn.modal.noConflict = function () { $.fn.modal = old return this } // MODAL DATA-API // ============== $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { var $this = $(this) var href = $this.attr('href') var target = $this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 var $target = $(document).find(target) var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) if ($this.is('a')) e.preventDefault() $target.one('show.bs.modal', function (showEvent) { if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown $target.one('hidden.bs.modal', function () { $this.is(':visible') && $this.trigger('focus') }) }) Plugin.call($target, option, this) }) }(jQuery); /* ======================================================================== * Bootstrap: tooltip.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'] var uriAttrs = [ 'background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href' ] var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i var DefaultWhitelist = { // Global attributes allowed on any supplied element below. '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], a: ['target', 'href', 'title', 'rel'], area: [], b: [], br: [], col: [], code: [], div: [], em: [], hr: [], h1: [], h2: [], h3: [], h4: [], h5: [], h6: [], i: [], img: ['src', 'alt', 'title', 'width', 'height'], li: [], ol: [], p: [], pre: [], s: [], small: [], span: [], sub: [], sup: [], strong: [], u: [], ul: [] } /** * A pattern that recognizes a commonly useful subset of URLs that are safe. * * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts */ var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi /** * A pattern that matches safe data URLs. Only matches image, video and audio types. * * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts */ var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i function allowedAttribute(attr, allowedAttributeList) { var attrName = attr.nodeName.toLowerCase() if ($.inArray(attrName, allowedAttributeList) !== -1) { if ($.inArray(attrName, uriAttrs) !== -1) { return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)) } return true } var regExp = $(allowedAttributeList).filter(function (index, value) { return value instanceof RegExp }) // Check if a regular expression validates the attribute. for (var i = 0, l = regExp.length; i < l; i++) { if (attrName.match(regExp[i])) { return true } } return false } function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { if (unsafeHtml.length === 0) { return unsafeHtml } if (sanitizeFn && typeof sanitizeFn === 'function') { return sanitizeFn(unsafeHtml) } // IE 8 and below don't support createHTMLDocument if (!document.implementation || !document.implementation.createHTMLDocument) { return unsafeHtml } var createdDocument = document.implementation.createHTMLDocument('sanitization') createdDocument.body.innerHTML = unsafeHtml var whitelistKeys = $.map(whiteList, function (el, i) { return i }) var elements = $(createdDocument.body).find('*') for (var i = 0, len = elements.length; i < len; i++) { var el = elements[i] var elName = el.nodeName.toLowerCase() if ($.inArray(elName, whitelistKeys) === -1) { el.parentNode.removeChild(el) continue } var attributeList = $.map(el.attributes, function (el) { return el }) var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []) for (var j = 0, len2 = attributeList.length; j < len2; j++) { if (!allowedAttribute(attributeList[j], whitelistedAttributes)) { el.removeAttribute(attributeList[j].nodeName) } } } return createdDocument.body.innerHTML } // TOOLTIP PUBLIC CLASS DEFINITION // =============================== var Tooltip = function (element, options) { this.type = null this.options = null this.enabled = null this.timeout = null this.hoverState = null this.$element = null this.inState = null this.init('tooltip', element, options) } Tooltip.VERSION = '3.4.1' Tooltip.TRANSITION_DURATION = 150 Tooltip.DEFAULTS = { animation: true, placement: 'top', selector: false, template: '', trigger: 'hover focus', title: '', delay: 0, html: false, container: false, viewport: { selector: 'body', padding: 0 }, sanitize : true, sanitizeFn : null, whiteList : DefaultWhitelist } Tooltip.prototype.init = function (type, element, options) { this.enabled = true this.type = type this.$element = $(element) this.options = this.getOptions(options) this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) this.inState = { click: false, hover: false, focus: false } if (this.$element[0] instanceof document.constructor && !this.options.selector) { throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') } var triggers = this.options.trigger.split(' ') for (var i = triggers.length; i--;) { var trigger = triggers[i] if (trigger == 'click') { this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) } else if (trigger != 'manual') { var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) } } this.options.selector ? (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : this.fixTitle() } Tooltip.prototype.getDefaults = function () { return Tooltip.DEFAULTS } Tooltip.prototype.getOptions = function (options) { var dataAttributes = this.$element.data() for (var dataAttr in dataAttributes) { if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) { delete dataAttributes[dataAttr] } } options = $.extend({}, this.getDefaults(), dataAttributes, options) if (options.delay && typeof options.delay == 'number') { options.delay = { show: options.delay, hide: options.delay } } if (options.sanitize) { options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn) } return options } Tooltip.prototype.getDelegateOptions = function () { var options = {} var defaults = this.getDefaults() this._options && $.each(this._options, function (key, value) { if (defaults[key] != value) options[key] = value }) return options } Tooltip.prototype.enter = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true } if (self.tip().hasClass('in') || self.hoverState == 'in') { self.hoverState = 'in' return } clearTimeout(self.timeout) self.hoverState = 'in' if (!self.options.delay || !self.options.delay.show) return self.show() self.timeout = setTimeout(function () { if (self.hoverState == 'in') self.show() }, self.options.delay.show) } Tooltip.prototype.isInStateTrue = function () { for (var key in this.inState) { if (this.inState[key]) return true } return false } Tooltip.prototype.leave = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false } if (self.isInStateTrue()) return clearTimeout(self.timeout) self.hoverState = 'out' if (!self.options.delay || !self.options.delay.hide) return self.hide() self.timeout = setTimeout(function () { if (self.hoverState == 'out') self.hide() }, self.options.delay.hide) } Tooltip.prototype.show = function () { var e = $.Event('show.bs.' + this.type) if (this.hasContent() && this.enabled) { this.$element.trigger(e) var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) if (e.isDefaultPrevented() || !inDom) return var that = this var $tip = this.tip() var tipId = this.getUID(this.type) this.setContent() $tip.attr('id', tipId) this.$element.attr('aria-describedby', tipId) if (this.options.animation) $tip.addClass('fade') var placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement var autoToken = /\s?auto?\s?/i var autoPlace = autoToken.test(placement) if (autoPlace) placement = placement.replace(autoToken, '') || 'top' $tip .detach() .css({ top: 0, left: 0, display: 'block' }) .addClass(placement) .data('bs.' + this.type, this) this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element) this.$element.trigger('inserted.bs.' + this.type) var pos = this.getPosition() var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (autoPlace) { var orgPlacement = placement var viewportDim = this.getPosition(this.$viewport) placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : placement $tip .removeClass(orgPlacement) .addClass(placement) } var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) this.applyPlacement(calculatedOffset, placement) var complete = function () { var prevHoverState = that.hoverState that.$element.trigger('shown.bs.' + that.type) that.hoverState = null if (prevHoverState == 'out') that.leave(that) } $.support.transition && this.$tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() } } Tooltip.prototype.applyPlacement = function (offset, placement) { var $tip = this.tip() var width = $tip[0].offsetWidth var height = $tip[0].offsetHeight // manually read margins because getBoundingClientRect includes difference var marginTop = parseInt($tip.css('margin-top'), 10) var marginLeft = parseInt($tip.css('margin-left'), 10) // we must check for NaN for ie 8/9 if (isNaN(marginTop)) marginTop = 0 if (isNaN(marginLeft)) marginLeft = 0 offset.top += marginTop offset.left += marginLeft // $.fn.offset doesn't round pixel values // so we use setOffset directly with our own function B-0 $.offset.setOffset($tip[0], $.extend({ using: function (props) { $tip.css({ top: Math.round(props.top), left: Math.round(props.left) }) } }, offset), 0) $tip.addClass('in') // check to see if placing tip in new offset caused the tip to resize itself var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (placement == 'top' && actualHeight != height) { offset.top = offset.top + height - actualHeight } var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) if (delta.left) offset.left += delta.left else offset.top += delta.top var isVertical = /top|bottom/.test(placement) var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' $tip.offset(offset) this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) } Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { this.arrow() .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') .css(isVertical ? 'top' : 'left', '') } Tooltip.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() if (this.options.html) { if (this.options.sanitize) { title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn) } $tip.find('.tooltip-inner').html(title) } else { $tip.find('.tooltip-inner').text(title) } $tip.removeClass('fade in top bottom left right') } Tooltip.prototype.hide = function (callback) { var that = this var $tip = $(this.$tip) var e = $.Event('hide.bs.' + this.type) function complete() { if (that.hoverState != 'in') $tip.detach() if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. that.$element .removeAttr('aria-describedby') .trigger('hidden.bs.' + that.type) } callback && callback() } this.$element.trigger(e) if (e.isDefaultPrevented()) return $tip.removeClass('in') $.support.transition && $tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() this.hoverState = null return this } Tooltip.prototype.fixTitle = function () { var $e = this.$element if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') } } Tooltip.prototype.hasContent = function () { return this.getTitle() } Tooltip.prototype.getPosition = function ($element) { $element = $element || this.$element var el = $element[0] var isBody = el.tagName == 'BODY' var elRect = el.getBoundingClientRect() if (elRect.width == null) { // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) } var isSvg = window.SVGElement && el instanceof window.SVGElement // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. // See https://github.com/twbs/bootstrap/issues/20280 var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null return $.extend({}, elRect, scroll, outerDims, elOffset) } Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } } Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { var delta = { top: 0, left: 0 } if (!this.$viewport) return delta var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 var viewportDimensions = this.getPosition(this.$viewport) if (/right|left/.test(placement)) { var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight if (topEdgeOffset < viewportDimensions.top) { // top overflow delta.top = viewportDimensions.top - topEdgeOffset } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset } } else { var leftEdgeOffset = pos.left - viewportPadding var rightEdgeOffset = pos.left + viewportPadding + actualWidth if (leftEdgeOffset < viewportDimensions.left) { // left overflow delta.left = viewportDimensions.left - leftEdgeOffset } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset } } return delta } Tooltip.prototype.getTitle = function () { var title var $e = this.$element var o = this.options title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) return title } Tooltip.prototype.getUID = function (prefix) { do prefix += ~~(Math.random() * 1000000) while (document.getElementById(prefix)) return prefix } Tooltip.prototype.tip = function () { if (!this.$tip) { this.$tip = $(this.options.template) if (this.$tip.length != 1) { throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') } } return this.$tip } Tooltip.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) } Tooltip.prototype.enable = function () { this.enabled = true } Tooltip.prototype.disable = function () { this.enabled = false } Tooltip.prototype.toggleEnabled = function () { this.enabled = !this.enabled } Tooltip.prototype.toggle = function (e) { var self = this if (e) { self = $(e.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(e.currentTarget, this.getDelegateOptions()) $(e.currentTarget).data('bs.' + this.type, self) } } if (e) { self.inState.click = !self.inState.click if (self.isInStateTrue()) self.enter(self) else self.leave(self) } else { self.tip().hasClass('in') ? self.leave(self) : self.enter(self) } } Tooltip.prototype.destroy = function () { var that = this clearTimeout(this.timeout) this.hide(function () { that.$element.off('.' + that.type).removeData('bs.' + that.type) if (that.$tip) { that.$tip.detach() } that.$tip = null that.$arrow = null that.$viewport = null that.$element = null }) } Tooltip.prototype.sanitizeHtml = function (unsafeHtml) { return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn) } // TOOLTIP PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tooltip') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tooltip $.fn.tooltip = Plugin $.fn.tooltip.Constructor = Tooltip // TOOLTIP NO CONFLICT // =================== $.fn.tooltip.noConflict = function () { $.fn.tooltip = old return this } }(jQuery); /* ======================================================================== * Bootstrap: popover.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#popovers * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // POPOVER PUBLIC CLASS DEFINITION // =============================== var Popover = function (element, options) { this.init('popover', element, options) } if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') Popover.VERSION = '3.4.1' Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { placement: 'right', trigger: 'click', content: '', template: '' }) // NOTE: POPOVER EXTENDS tooltip.js // ================================ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) Popover.prototype.constructor = Popover Popover.prototype.getDefaults = function () { return Popover.DEFAULTS } Popover.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() var content = this.getContent() if (this.options.html) { var typeContent = typeof content if (this.options.sanitize) { title = this.sanitizeHtml(title) if (typeContent === 'string') { content = this.sanitizeHtml(content) } } $tip.find('.popover-title').html(title) $tip.find('.popover-content').children().detach().end()[ typeContent === 'string' ? 'html' : 'append' ](content) } else { $tip.find('.popover-title').text(title) $tip.find('.popover-content').children().detach().end().text(content) } $tip.removeClass('fade top bottom left right in') // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do // this manually by checking the contents. if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() } Popover.prototype.hasContent = function () { return this.getTitle() || this.getContent() } Popover.prototype.getContent = function () { var $e = this.$element var o = this.options return $e.attr('data-content') || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) } Popover.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.arrow')) } // POPOVER PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.popover') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.popover', (data = new Popover(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.popover $.fn.popover = Plugin $.fn.popover.Constructor = Popover // POPOVER NO CONFLICT // =================== $.fn.popover.noConflict = function () { $.fn.popover = old return this } }(jQuery); /* ======================================================================== * Bootstrap: scrollspy.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#scrollspy * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // SCROLLSPY CLASS DEFINITION // ========================== function ScrollSpy(element, options) { this.$body = $(document.body) this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) this.options = $.extend({}, ScrollSpy.DEFAULTS, options) this.selector = (this.options.target || '') + ' .nav li > a' this.offsets = [] this.targets = [] this.activeTarget = null this.scrollHeight = 0 this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) this.refresh() this.process() } ScrollSpy.VERSION = '3.4.1' ScrollSpy.DEFAULTS = { offset: 10 } ScrollSpy.prototype.getScrollHeight = function () { return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) } ScrollSpy.prototype.refresh = function () { var that = this var offsetMethod = 'offset' var offsetBase = 0 this.offsets = [] this.targets = [] this.scrollHeight = this.getScrollHeight() if (!$.isWindow(this.$scrollElement[0])) { offsetMethod = 'position' offsetBase = this.$scrollElement.scrollTop() } this.$body .find(this.selector) .map(function () { var $el = $(this) var href = $el.data('target') || $el.attr('href') var $href = /^#./.test(href) && $(href) return ($href && $href.length && $href.is(':visible') && [[$href[offsetMethod]().top + offsetBase, href]]) || null }) .sort(function (a, b) { return a[0] - b[0] }) .each(function () { that.offsets.push(this[0]) that.targets.push(this[1]) }) } ScrollSpy.prototype.process = function () { var scrollTop = this.$scrollElement.scrollTop() + this.options.offset var scrollHeight = this.getScrollHeight() var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() var offsets = this.offsets var targets = this.targets var activeTarget = this.activeTarget var i if (this.scrollHeight != scrollHeight) { this.refresh() } if (scrollTop >= maxScroll) { return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) } if (activeTarget && scrollTop < offsets[0]) { this.activeTarget = null return this.clear() } for (i = offsets.length; i--;) { activeTarget != targets[i] && scrollTop >= offsets[i] && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) && this.activate(targets[i]) } } ScrollSpy.prototype.activate = function (target) { this.activeTarget = target this.clear() var selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]' var active = $(selector) .parents('li') .addClass('active') if (active.parent('.dropdown-menu').length) { active = active .closest('li.dropdown') .addClass('active') } active.trigger('activate.bs.scrollspy') } ScrollSpy.prototype.clear = function () { $(this.selector) .parentsUntil(this.options.target, '.active') .removeClass('active') } // SCROLLSPY PLUGIN DEFINITION // =========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.scrollspy') var options = typeof option == 'object' && option if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.scrollspy $.fn.scrollspy = Plugin $.fn.scrollspy.Constructor = ScrollSpy // SCROLLSPY NO CONFLICT // ===================== $.fn.scrollspy.noConflict = function () { $.fn.scrollspy = old return this } // SCROLLSPY DATA-API // ================== $(window).on('load.bs.scrollspy.data-api', function () { $('[data-spy="scroll"]').each(function () { var $spy = $(this) Plugin.call($spy, $spy.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: tab.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#tabs * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TAB CLASS DEFINITION // ==================== var Tab = function (element) { // jscs:disable requireDollarBeforejQueryAssignment this.element = $(element) // jscs:enable requireDollarBeforejQueryAssignment } Tab.VERSION = '3.4.1' Tab.TRANSITION_DURATION = 150 Tab.prototype.show = function () { var $this = this.element var $ul = $this.closest('ul:not(.dropdown-menu)') var selector = $this.data('target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } if ($this.parent('li').hasClass('active')) return var $previous = $ul.find('.active:last a') var hideEvent = $.Event('hide.bs.tab', { relatedTarget: $this[0] }) var showEvent = $.Event('show.bs.tab', { relatedTarget: $previous[0] }) $previous.trigger(hideEvent) $this.trigger(showEvent) if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return var $target = $(document).find(selector) this.activate($this.closest('li'), $ul) this.activate($target, $target.parent(), function () { $previous.trigger({ type: 'hidden.bs.tab', relatedTarget: $this[0] }) $this.trigger({ type: 'shown.bs.tab', relatedTarget: $previous[0] }) }) } Tab.prototype.activate = function (element, container, callback) { var $active = container.find('> .active') var transition = callback && $.support.transition && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) function next() { $active .removeClass('active') .find('> .dropdown-menu > .active') .removeClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', false) element .addClass('active') .find('[data-toggle="tab"]') .attr('aria-expanded', true) if (transition) { element[0].offsetWidth // reflow for transition element.addClass('in') } else { element.removeClass('fade') } if (element.parent('.dropdown-menu').length) { element .closest('li.dropdown') .addClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', true) } callback && callback() } $active.length && transition ? $active .one('bsTransitionEnd', next) .emulateTransitionEnd(Tab.TRANSITION_DURATION) : next() $active.removeClass('in') } // TAB PLUGIN DEFINITION // ===================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tab') if (!data) $this.data('bs.tab', (data = new Tab(this))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tab $.fn.tab = Plugin $.fn.tab.Constructor = Tab // TAB NO CONFLICT // =============== $.fn.tab.noConflict = function () { $.fn.tab = old return this } // TAB DATA-API // ============ var clickHandler = function (e) { e.preventDefault() Plugin.call($(this), 'show') } $(document) .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) }(jQuery); /* ======================================================================== * Bootstrap: affix.js v3.4.1 * https://getbootstrap.com/docs/3.4/javascript/#affix * ======================================================================== * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // AFFIX CLASS DEFINITION // ====================== var Affix = function (element, options) { this.options = $.extend({}, Affix.DEFAULTS, options) var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target) this.$target = target .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) this.$element = $(element) this.affixed = null this.unpin = null this.pinnedOffset = null this.checkPosition() } Affix.VERSION = '3.4.1' Affix.RESET = 'affix affix-top affix-bottom' Affix.DEFAULTS = { offset: 0, target: window } Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { var scrollTop = this.$target.scrollTop() var position = this.$element.offset() var targetHeight = this.$target.height() if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false if (this.affixed == 'bottom') { if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' } var initializing = this.affixed == null var colliderTop = initializing ? scrollTop : position.top var colliderHeight = initializing ? targetHeight : height if (offsetTop != null && scrollTop <= offsetTop) return 'top' if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' return false } Affix.prototype.getPinnedOffset = function () { if (this.pinnedOffset) return this.pinnedOffset this.$element.removeClass(Affix.RESET).addClass('affix') var scrollTop = this.$target.scrollTop() var position = this.$element.offset() return (this.pinnedOffset = position.top - scrollTop) } Affix.prototype.checkPositionWithEventLoop = function () { setTimeout($.proxy(this.checkPosition, this), 1) } Affix.prototype.checkPosition = function () { if (!this.$element.is(':visible')) return var height = this.$element.height() var offset = this.options.offset var offsetTop = offset.top var offsetBottom = offset.bottom var scrollHeight = Math.max($(document).height(), $(document.body).height()) if (typeof offset != 'object') offsetBottom = offsetTop = offset if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) if (this.affixed != affix) { if (this.unpin != null) this.$element.css('top', '') var affixType = 'affix' + (affix ? '-' + affix : '') var e = $.Event(affixType + '.bs.affix') this.$element.trigger(e) if (e.isDefaultPrevented()) return this.affixed = affix this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null this.$element .removeClass(Affix.RESET) .addClass(affixType) .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') } if (affix == 'bottom') { this.$element.offset({ top: scrollHeight - height - offsetBottom }) } } // AFFIX PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.affix') var options = typeof option == 'object' && option if (!data) $this.data('bs.affix', (data = new Affix(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.affix $.fn.affix = Plugin $.fn.affix.Constructor = Affix // AFFIX NO CONFLICT // ================= $.fn.affix.noConflict = function () { $.fn.affix = old return this } // AFFIX DATA-API // ============== $(window).on('load', function () { $('[data-spy="affix"]').each(function () { var $spy = $(this) var data = $spy.data() data.offset = data.offset || {} if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom if (data.offsetTop != null) data.offset.top = data.offsetTop Plugin.call($spy, data) }) }) }(jQuery); ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/_bootstrap-compass.scss ================================================ @function twbs-font-path($path) { @return font-url($path, true); } @function twbs-image-path($path) { @return image-url($path, true); } $bootstrap-sass-asset-helper: true; ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/_bootstrap-mincer.scss ================================================ // Mincer asset helper functions // // This must be imported into a .css.ejs.scss file. // Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation. @function twbs-font-path($path) { // do something like following // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>" // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>" // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>" @return "<%- asset_path("#{$path}".replace(/[#?].*$/, '')) + "#{$path}".replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>"; } @function twbs-image-path($file) { @return "<%- asset_path("#{$file}") %>"; } $bootstrap-sass-asset-helper: true; ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/_bootstrap-sprockets.scss ================================================ @function twbs-font-path($path) { @return font-path($path); } @function twbs-image-path($path) { @return image-path($path); } $bootstrap-sass-asset-helper: true; ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/_bootstrap.scss ================================================ /*! * Bootstrap v3.4.1 (https://getbootstrap.com/) * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ // Core variables and mixins @import "bootstrap/variables"; @import "bootstrap/mixins"; // Reset and dependencies @import "bootstrap/normalize"; @import "bootstrap/print"; @import "bootstrap/glyphicons"; // Core CSS @import "bootstrap/scaffolding"; @import "bootstrap/type"; @import "bootstrap/code"; @import "bootstrap/grid"; @import "bootstrap/tables"; @import "bootstrap/forms"; @import "bootstrap/buttons"; // Components @import "bootstrap/component-animations"; @import "bootstrap/dropdowns"; @import "bootstrap/button-groups"; @import "bootstrap/input-groups"; @import "bootstrap/navs"; @import "bootstrap/navbar"; @import "bootstrap/breadcrumbs"; @import "bootstrap/pagination"; @import "bootstrap/pager"; @import "bootstrap/labels"; @import "bootstrap/badges"; @import "bootstrap/jumbotron"; @import "bootstrap/thumbnails"; @import "bootstrap/alerts"; @import "bootstrap/progress-bars"; @import "bootstrap/media"; @import "bootstrap/list-group"; @import "bootstrap/panels"; @import "bootstrap/responsive-embed"; @import "bootstrap/wells"; @import "bootstrap/close"; // Components w/ JavaScript @import "bootstrap/modals"; @import "bootstrap/tooltip"; @import "bootstrap/popovers"; @import "bootstrap/carousel"; // Utility classes @import "bootstrap/utilities"; @import "bootstrap/responsive-utilities"; ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_alerts.scss ================================================ // // Alerts // -------------------------------------------------- // Base styles // ------------------------- .alert { padding: $alert-padding; margin-bottom: $line-height-computed; border: 1px solid transparent; border-radius: $alert-border-radius; // Headings for larger alerts h4 { margin-top: 0; color: inherit; // Specified for the h4 to prevent conflicts of changing $headings-color } // Provide class for links that match alerts .alert-link { font-weight: $alert-link-font-weight; } // Improve alignment and spacing of inner content > p, > ul { margin-bottom: 0; } > p + p { margin-top: 5px; } } // Dismissible alerts // // Expand the right padding and account for the close button's positioning. // The misspelled .alert-dismissable was deprecated in 3.2.0. .alert-dismissable, .alert-dismissible { padding-right: ($alert-padding + 20); // Adjust close link position .close { position: relative; top: -2px; right: -21px; color: inherit; } } // Alternate styles // // Generate contextual modifier classes for colorizing the alert. .alert-success { @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text); } .alert-info { @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text); } .alert-warning { @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text); } .alert-danger { @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text); } ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_badges.scss ================================================ // // Badges // -------------------------------------------------- // Base class .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: $font-size-small; font-weight: $badge-font-weight; line-height: $badge-line-height; color: $badge-color; text-align: center; white-space: nowrap; vertical-align: middle; background-color: $badge-bg; border-radius: $badge-border-radius; // Empty badges collapse automatically (not available in IE8) &:empty { display: none; } // Quick fix for badges in buttons .btn & { position: relative; top: -1px; } .btn-xs &, .btn-group-xs > .btn & { top: 0; padding: 1px 5px; } // [converter] extracted a& to a.badge // Account for badges in navs .list-group-item.active > &, .nav-pills > .active > a > & { color: $badge-active-color; background-color: $badge-active-bg; } .list-group-item > & { float: right; } .list-group-item > & + & { margin-right: 5px; } .nav-pills > li > a > & { margin-left: 3px; } } // Hover state, but only for links a.badge { &:hover, &:focus { color: $badge-link-hover-color; text-decoration: none; cursor: pointer; } } ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_breadcrumbs.scss ================================================ // // Breadcrumbs // -------------------------------------------------- .breadcrumb { padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal; margin-bottom: $line-height-computed; list-style: none; background-color: $breadcrumb-bg; border-radius: $border-radius-base; > li { display: inline-block; + li:before { padding: 0 5px; color: $breadcrumb-color; // [converter] Workaround for https://github.com/sass/libsass/issues/1115 $nbsp: "\00a0"; content: "#{$breadcrumb-separator}#{$nbsp}"; // Unicode space added since inline-block means non-collapsing white-space } } > .active { color: $breadcrumb-active-color; } } ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_button-groups.scss ================================================ // // Button groups // -------------------------------------------------- // Make the div behave like a button .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; // match .btn alignment given font-size hack above > .btn { position: relative; float: left; // Bring the "active" button to the front &:hover, &:focus, &:active, &.active { z-index: 2; } } } // Prevent double borders when buttons are next to each other .btn-group { .btn + .btn, .btn + .btn-group, .btn-group + .btn, .btn-group + .btn-group { margin-left: -1px; } } // Optional: Group multiple button groups together for a toolbar .btn-toolbar { margin-left: -5px; // Offset the first child's margin @include clearfix; .btn, .btn-group, .input-group { float: left; } > .btn, > .btn-group, > .input-group { margin-left: 5px; } } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } // Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match .btn-group > .btn:first-child { margin-left: 0; &:not(:last-child):not(.dropdown-toggle) { @include border-right-radius(0); } } // Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { @include border-left-radius(0); } // Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) { > .btn:last-child, > .dropdown-toggle { @include border-right-radius(0); } } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { @include border-left-radius(0); } // On active and open, don't show outline .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } // Sizing // // Remix the default button sizing classes into new ones for easier manipulation. .btn-group-xs > .btn { @extend .btn-xs; } .btn-group-sm > .btn { @extend .btn-sm; } .btn-group-lg > .btn { @extend .btn-lg; } // Split button dropdowns // ---------------------- // Give the line between buttons some depth .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } // The clickable button for toggling the menu // Remove the gradient and set the same inset shadow as the :active state .btn-group.open .dropdown-toggle { @include box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125)); // Show no shadow for `.btn-link` since it has no other button styles. &.btn-link { @include box-shadow(none); } } // Reposition the caret .btn .caret { margin-left: 0; } // Carets in other button sizes .btn-lg .caret { border-width: $caret-width-large $caret-width-large 0; border-bottom-width: 0; } // Upside down carets for .dropup .dropup .btn-lg .caret { border-width: 0 $caret-width-large $caret-width-large; } // Vertical button groups // ---------------------- .btn-group-vertical { > .btn, > .btn-group, > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } // Clear floats so dropdown menus can be properly placed > .btn-group { @include clearfix; > .btn { float: none; } } > .btn + .btn, > .btn + .btn-group, > .btn-group + .btn, > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } } .btn-group-vertical > .btn { &:not(:first-child):not(:last-child) { border-radius: 0; } &:first-child:not(:last-child) { @include border-top-radius($btn-border-radius-base); @include border-bottom-radius(0); } &:last-child:not(:first-child) { @include border-top-radius(0); @include border-bottom-radius($btn-border-radius-base); } } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) { > .btn:last-child, > .dropdown-toggle { @include border-bottom-radius(0); } } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { @include border-top-radius(0); } // Justified button groups // ---------------------- .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; > .btn, > .btn-group { display: table-cell; float: none; width: 1%; } > .btn-group .btn { width: 100%; } > .btn-group .dropdown-menu { left: auto; } } // Checkbox and radio options // // In order to support the browser's form validation feedback, powered by the // `required` attribute, we have to "hide" the inputs via `clip`. We cannot use // `display: none;` or `visibility: hidden;` as that also hides the popover. // Simply visually hiding the inputs via `opacity` would leave them clickable in // certain cases which is prevented by using `clip` and `pointer-events`. // This way, we ensure a DOM element is visible to position the popover from. // // See https://github.com/twbs/bootstrap/pull/12794 and // https://github.com/twbs/bootstrap/pull/14559 for more information. [data-toggle="buttons"] { > .btn, > .btn-group > .btn { input[type="radio"], input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } } } ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_buttons.scss ================================================ // // Buttons // -------------------------------------------------- // Base styles // -------------------------------------------------- .btn { display: inline-block; margin-bottom: 0; // For input.btn font-weight: $btn-font-weight; text-align: center; white-space: nowrap; vertical-align: middle; touch-action: manipulation; cursor: pointer; background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 border: 1px solid transparent; @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base); @include user-select(none); &, &:active, &.active { &:focus, &.focus { @include tab-focus; } } &:hover, &:focus, &.focus { color: $btn-default-color; text-decoration: none; } &:active, &.active { background-image: none; outline: 0; @include box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125)); } &.disabled, &[disabled], fieldset[disabled] & { cursor: $cursor-disabled; @include opacity(.65); @include box-shadow(none); } // [converter] extracted a& to a.btn } a.btn { &.disabled, fieldset[disabled] & { pointer-events: none; // Future-proof disabling of clicks on `` elements } } // Alternate buttons // -------------------------------------------------- .btn-default { @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border); } .btn-primary { @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border); } // Success appears as green .btn-success { @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border); } // Info appears as blue-green .btn-info { @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border); } // Warning appears as orange .btn-warning { @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border); } // Danger and error appear as red .btn-danger { @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border); } // Link buttons // ------------------------- // Make a button look and behave like a link .btn-link { font-weight: 400; color: $link-color; border-radius: 0; &, &:active, &.active, &[disabled], fieldset[disabled] & { background-color: transparent; @include box-shadow(none); } &, &:hover, &:focus, &:active { border-color: transparent; } &:hover, &:focus { color: $link-hover-color; text-decoration: $link-hover-decoration; background-color: transparent; } &[disabled], fieldset[disabled] & { &:hover, &:focus { color: $btn-link-disabled-color; text-decoration: none; } } } // Button Sizes // -------------------------------------------------- .btn-lg { // line-height: ensure even-numbered height of button next to large input @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large); } .btn-sm { // line-height: ensure proper height of button next to small input @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small); } .btn-xs { @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small); } // Block button // -------------------------------------------------- .btn-block { display: block; width: 100%; } // Vertically space out multiple block buttons .btn-block + .btn-block { margin-top: 5px; } // Specificity overrides input[type="submit"], input[type="reset"], input[type="button"] { &.btn-block { width: 100%; } } ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_carousel.scss ================================================ // // Carousel // -------------------------------------------------- // Wrapper for the slide container and indicators .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; > .item { position: relative; display: none; @include transition(.6s ease-in-out left); // Account for jankitude on images > img, > a > img { @include img-responsive; line-height: 1; } // WebKit CSS3 transforms for supported devices @media all and (transform-3d), (-webkit-transform-3d) { @include transition-transform(0.6s ease-in-out); @include backface-visibility(hidden); @include perspective(1000px); &.next, &.active.right { @include translate3d(100%, 0, 0); left: 0; } &.prev, &.active.left { @include translate3d(-100%, 0, 0); left: 0; } &.next.left, &.prev.right, &.active { @include translate3d(0, 0, 0); left: 0; } } } > .active, > .next, > .prev { display: block; } > .active { left: 0; } > .next, > .prev { position: absolute; top: 0; width: 100%; } > .next { left: 100%; } > .prev { left: -100%; } > .next.left, > .prev.right { left: 0; } > .active.left { left: -100%; } > .active.right { left: 100%; } } // Left/right controls for nav // --------------------------- .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: $carousel-control-width; font-size: $carousel-control-font-size; color: $carousel-control-color; text-align: center; text-shadow: $carousel-text-shadow; background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug @include opacity($carousel-control-opacity); // We can't have this transition here because WebKit cancels the carousel // animation if you trip this while in the middle of another animation. // Set gradients for backgrounds &.left { @include gradient-horizontal($start-color: rgba(0, 0, 0, .5), $end-color: rgba(0, 0, 0, .0001)); } &.right { right: 0; left: auto; @include gradient-horizontal($start-color: rgba(0, 0, 0, .0001), $end-color: rgba(0, 0, 0, .5)); } // Hover/focus state &:hover, &:focus { color: $carousel-control-color; text-decoration: none; outline: 0; @include opacity(.9); } // Toggles .icon-prev, .icon-next, .glyphicon-chevron-left, .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; margin-top: -10px; } .icon-prev, .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .icon-next, .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .icon-prev, .icon-next { width: 20px; height: 20px; font-family: serif; line-height: 1; } .icon-prev { &:before { content: "\2039";// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) } } .icon-next { &:before { content: "\203a";// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) } } } // Optional indicator pips // // Add an unordered list with the following class and add a list item for each // slide your carousel holds. .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; // IE8-9 hack for event handling // // Internet Explorer 8-9 does not support clicks on elements without a set // `background-color`. We cannot use `filter` since that's not viewed as a // background color by the browser. Thus, a hack is needed. // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer // // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we // set alpha transparency for the best results possible. background-color: #000 \9; // IE8 background-color: rgba(0, 0, 0, 0); // IE9 border: 1px solid $carousel-indicator-border-color; border-radius: 10px; } .active { width: 12px; height: 12px; margin: 0; background-color: $carousel-indicator-active-bg; } } // Optional captions // ----------------------------- // Hidden by default for smaller viewports .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: $carousel-caption-color; text-align: center; text-shadow: $carousel-text-shadow; & .btn { text-shadow: none; // No shadow for button elements in carousel-caption } } // Scale up controls for tablets and up @media screen and (min-width: $screen-sm-min) { // Scale up the controls a smidge .carousel-control { .glyphicon-chevron-left, .glyphicon-chevron-right, .icon-prev, .icon-next { width: ($carousel-control-font-size * 1.5); height: ($carousel-control-font-size * 1.5); margin-top: calc(#{$carousel-control-font-size} / -2); font-size: ($carousel-control-font-size * 1.5); } .glyphicon-chevron-left, .icon-prev { margin-left: calc(#{$carousel-control-font-size} / -2); } .glyphicon-chevron-right, .icon-next { margin-right: calc(#{$carousel-control-font-size} / -2); } } // Show and left align the captions .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } // Move up the indicators .carousel-indicators { bottom: 20px; } } ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_close.scss ================================================ // // Close icons // -------------------------------------------------- .close { float: right; font-size: ($font-size-base * 1.5); font-weight: $close-font-weight; line-height: 1; color: $close-color; text-shadow: $close-text-shadow; @include opacity(.2); &:hover, &:focus { color: $close-color; text-decoration: none; cursor: pointer; @include opacity(.5); } // [converter] extracted button& to button.close } // Additional properties for button version // iOS requires the button element instead of an anchor tag. // If you want the anchor version, it requires `href="#"`. // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; appearance: none; } ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_code.scss ================================================ // // Code (inline and block) // -------------------------------------------------- // Inline and block code styles code, kbd, pre, samp { font-family: $font-family-monospace; } // Inline code code { padding: 2px 4px; font-size: 90%; color: $code-color; background-color: $code-bg; border-radius: $border-radius-base; } // User input typically entered via keyboard kbd { padding: 2px 4px; font-size: 90%; color: $kbd-color; background-color: $kbd-bg; border-radius: $border-radius-small; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); kbd { padding: 0; font-size: 100%; font-weight: 700; box-shadow: none; } } // Blocks of code pre { display: block; padding: calc((#{$line-height-computed} - 1) / 2); margin: 0 0 calc(#{$line-height-computed} / 2); font-size: ($font-size-base - 1); // 14px to 13px line-height: $line-height-base; color: $pre-color; word-break: break-all; word-wrap: break-word; background-color: $pre-bg; border: 1px solid $pre-border-color; border-radius: $border-radius-base; // Account for some code outputs that place code tags in pre tags code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } } // Enable scrollable blocks of code .pre-scrollable { max-height: $pre-scrollable-max-height; overflow-y: scroll; } ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_component-animations.scss ================================================ // // Component animations // -------------------------------------------------- // Heads up! // // We don't use the `.opacity()` mixin here since it causes a bug with text // fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. .fade { opacity: 0; @include transition(opacity .15s linear); &.in { opacity: 1; } } .collapse { display: none; &.in { display: block; } // [converter] extracted tr&.in to tr.collapse.in // [converter] extracted tbody&.in to tbody.collapse.in } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; @include transition-property(height, visibility); @include transition-duration(.35s); @include transition-timing-function(ease); } ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_dropdowns.scss ================================================ // // Dropdown menus // -------------------------------------------------- // Dropdown arrow/caret .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: $caret-width-base dashed; border-top: $caret-width-base solid \9; // IE8 border-right: $caret-width-base solid transparent; border-left: $caret-width-base solid transparent; } // The dropdown wrapper (div) .dropup, .dropdown { position: relative; } // Prevent the focus on the dropdown toggle when closing dropdowns .dropdown-toggle:focus { outline: 0; } // The dropdown menu (ul) .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: $zindex-dropdown; display: none; // none by default, but block on "open" of the menu float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; // override default ul font-size: $font-size-base; text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) list-style: none; background-color: $dropdown-bg; background-clip: padding-box; border: 1px solid $dropdown-fallback-border; // IE8 fallback border: 1px solid $dropdown-border; border-radius: $border-radius-base; @include box-shadow(0 6px 12px rgba(0, 0, 0, .175)); // Aligns the dropdown menu to right // // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` &.pull-right { right: 0; left: auto; } // Dividers (basically an hr) within the dropdown .divider { @include nav-divider($dropdown-divider-bg); } // Links within the dropdown menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: 400; line-height: $line-height-base; color: $dropdown-link-color; white-space: nowrap; // prevent links from randomly breaking onto new lines &:hover, &:focus { color: $dropdown-link-hover-color; text-decoration: none; background-color: $dropdown-link-hover-bg; } } } // Active state .dropdown-menu > .active > a { &, &:hover, &:focus { color: $dropdown-link-active-color; text-decoration: none; background-color: $dropdown-link-active-bg; outline: 0; } } // Disabled state // // Gray out text and ensure the hover/focus state remains gray .dropdown-menu > .disabled > a { &, &:hover, &:focus { color: $dropdown-link-disabled-color; } // Nuke hover/focus effects &:hover, &:focus { text-decoration: none; cursor: $cursor-disabled; background-color: transparent; background-image: none; // Remove CSS gradient @include reset-filter; } } // Open state for the dropdown .open { // Show the menu > .dropdown-menu { display: block; } // Remove the outline when :focus is triggered > a { outline: 0; } } // Menu positioning // // Add extra class to `.dropdown-menu` to flip the alignment of the dropdown // menu with the parent. .dropdown-menu-right { right: 0; left: auto; // Reset the default from `.dropdown-menu` } // With v3, we enabled auto-flipping if you have a dropdown within a right // aligned nav component. To enable the undoing of that, we provide an override // to restore the default dropdown menu alignment. // // This is only for left-aligning a dropdown menu within a `.navbar-right` or // `.pull-right` nav component. .dropdown-menu-left { right: auto; left: 0; } // Dropdown section headers .dropdown-header { display: block; padding: 3px 20px; font-size: $font-size-small; line-height: $line-height-base; color: $dropdown-header-color; white-space: nowrap; // as with > li > a } // Backdrop to catch body clicks on mobile, etc. .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: ($zindex-dropdown - 10); } // Right aligned dropdowns .pull-right > .dropdown-menu { right: 0; left: auto; } // Allow for dropdowns to go bottom up (aka, dropup-menu) // // Just add .dropup after the standard .dropdown class and you're set, bro. // TODO: abstract this so that the navbar fixed styles are not placed here? .dropup, .navbar-fixed-bottom .dropdown { // Reverse the caret .caret { content: ""; border-top: 0; border-bottom: $caret-width-base dashed; border-bottom: $caret-width-base solid \9; // IE8 } // Different positioning for bottom up menu .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } } // Component alignment // // Reiterate per navbar.less and the modified component alignment there. @media (min-width: $grid-float-breakpoint) { .navbar-right { .dropdown-menu { right: 0; left: auto; } // Necessary for overrides of the default right aligned menu. // Will remove come v4 in all likelihood. .dropdown-menu-left { left: 0; right: auto; } } } ================================================ FILE: fork/bootstrap-sass/assets/stylesheets/bootstrap/_forms.scss ================================================ // // Forms // -------------------------------------------------- // Normalize non-controls // // Restyle and baseline non-control form elements. fieldset { // Chrome and Firefox set a `min-width: min-content;` on fieldsets, // so we reset that to ensure it behaves more like a standard block element. // See https://github.com/twbs/bootstrap/issues/12359. min-width: 0; padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: $line-height-computed; font-size: ($font-size-base * 1.5); line-height: inherit; color: $legend-color; border: 0; border-bottom: 1px solid $legend-border-color; } label { display: inline-block; max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141) margin-bottom: 5px; font-weight: 700; } // Normalize form controls // // While most of our form styles require extra classes, some basic normalization // is required to ensure optimum display with or without those classes to better // address browser inconsistencies. input[type="search"] { // Override content-box in Normalize (* isn't specific enough) @include box-sizing(border-box); // Search inputs in iOS // // This overrides the extra rounded corners on search inputs in iOS so that our // `.form-control` class can properly style them. Note that this cannot simply // be added to `.form-control` as it's not specific enough. For details, see // https://github.com/twbs/bootstrap/issues/11586. -webkit-appearance: none; appearance: none; } // Position radios and checkboxes better input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; // IE8-9 line-height: normal; // Apply same disabled cursor tweak as for inputs // Some special care is needed because