diff --git a/README.md b/README.md index 6a71cd56..95d5738f 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,6 @@ use in Weavly: | [github.com/googlefonts/roboto](https://github.com/googlefonts/roboto) | Apache License 2.0 | | [github.com/JedWatson/classnames](https://github.com/JedWatson/classnames) | MIT License | | [github.com/KyleAMathews/typefaces/tree/master/packages/roboto](https://github.com/KyleAMathews/typefaces/tree/master/packages/roboto) | MIT License | -| [github.com/react-bootstrap/react-bootstrap](https://github.com/react-bootstrap/react-bootstrap) | MIT License | | [github.com/sass/node-sass](https://github.com/sass/node-sass) | MIT License | | [github.com/Tonejs/Tone.js](https://github.com/Tonejs/Tone.js) | [MIT License](https://github.com/Tonejs/Tone.js/blob/dev/LICENSE.md)| | [loading.io](https://loading.io/) | [Loading.io Free License](https://loading.io/license/#free-license) | diff --git a/docs/flow-typing.md b/docs/flow-typing.md index 1988aa26..0d2fe633 100644 --- a/docs/flow-typing.md +++ b/docs/flow-typing.md @@ -9,12 +9,11 @@ following packages, as outlined in these commands: npx flow-typed install classnames@2 npx flow-typed install enzyme@3 npx flow-typed install jest@24 -npx flow-typed install react-bootstrap@0.32 npx flow-typed install react-intl@2 ``` -Note that there have been local changes to the flow types for `react-intl` and -`react-bootstrap`, those definitions cannot simply be regenerated or updated. +Note that there have been local changes to the flow types for `react-intl`, +those definitions cannot simply be regenerated or updated. We have manually created types for packages that do note have flow-typed definitions, like `Tone.js`. We also created types for the `messages.json` diff --git a/flow-typed/npm/react-bootstrap_v1.0.x.js b/flow-typed/npm/react-bootstrap_v1.0.x.js deleted file mode 100644 index 0fc5a58a..00000000 --- a/flow-typed/npm/react-bootstrap_v1.0.x.js +++ /dev/null @@ -1,777 +0,0 @@ -// Manually hacked version of 0.32 flow typed definitions to cover the material we use from later versions. -declare module "react-bootstrap" { - import type { Node, Element, Component, ComponentType, Ref } from 'react'; - declare type BsSize = 'lg' | 'large' | 'sm' | 'small'; - declare type BsStyle = 'lg' | 'large' | 'sm' | 'small' | 'xs' | 'xsmall'; - declare type ElementType = string | ComponentType<*>; - declare type TriggerType = 'click' | 'hover' | 'focus'; - declare export class Alert extends React$Component<{ - onDismiss?: Function, - closeLabel?: string, - bsStyle?: 'success' | 'warning' | 'danger' | 'info', - bsClass?: string, - ... - }> {} - - declare export class Badge extends React$Component<{ - pullRight?: boolean, - bsClass?: string, - ... - }> {} - - declare class BreadcrumbItem extends React$Component<{ - active?: boolean, - href: string, - title: Node, - target: string, - ... - }> {} - - declare export class Breadcrumb extends React$Component<{...}> { - static Item: Class; - } - - declare export class Button extends React$Component<{ - active?: boolean, - disabled?: boolean, - block?: boolean, - onClick?: Function, - componentClass?: ElementType, - href?: string, - type?: 'button' | 'reset' | 'submit', - bsStyle?: 'default' | 'primary' | 'success' | 'info' | 'warning' | 'danger' | 'link', - bsSize?: BsStyle, - bsClass?: string, - ... - }> {} - - declare export class ButtonGroup extends React$Component<{ - vertical?: boolean, - justified?: boolean, - block?: boolean, - bsClass?: string, - ... - }> {} - - declare export class ButtonToolbar extends React$Component<{ bsClass?: string, ... }> {} - - declare export class ButtonToolbar extends React$Component<{ - name?: string, - value?: any, - onChange?: Function, - type: 'checkbox' | 'radio', - ... - }> {} - - declare export class ToggleButton extends React$Component<{ - type?: string, - name?: string, - checker?: boolean, - disabled?: boolean, - onChange?: Function, - value: any, - ... - }> {} - - declare class CarouselItem extends React$Component<{ - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - - declare class CarouselCaption extends React$Component<{ - direction?: 'prev' | 'next', - onAnimateOutEnd?: Function, - active?: boolean, - animateIn?: boolean, - animateOut?: boolean, - index: number, - ... - }> {} - - declare export class Carousel extends React$Component<{ - slide?: boolean, - indicators?: boolean, - interval?: number, - controls?: boolean, - pauseOnHover?: boolean, - wrap?: boolean, - onSelect?: Function, - onSelect?: Function, - onSlideEnd?: Function, - activeIndex?: number, - defaultActiveIndex?: number, - direction?: 'prev' | 'next', - prevIcon?: Node, - prevLabel?: string, - nextIcon?: Node, - nextLabel?: string, - bsClass?: string, - ... - }> { - static Item: Class; - static Caption: Class; - } - - // Created manually based on a reading of: https://reactstrap.github.io/components/layout/ - declare export class Container extends React$Component<{ - fluid?: boolean | string, - ... - }>{} - - - declare export class DropdownButton extends React$Component<{ - bsStyle?: string, - bsSize?: string, - title: Node, - noCaret?: boolean, - ... - }> {} - - declare export class SplitButton extends React$Component<{ - bsStyle?: string, - bsSize?: string, - href?: string, - onClick?: Function, - title: Node, - toggleLabel?: string, - ... - }> {} - - declare class DropdownMenu extends React$Component<{...}> {} - declare class DropdownToggle extends React$Component<{...}> {} - - declare export class Dropdown extends React$Component<{ - dropup?: boolean, - id: string | number, - componentClass?: ElementType, - disabled?: boolean, - pullRight?: boolean, - pullRight?: boolean, - open?: boolean, - defaultOpen?: boolean, - onToggle?: Function, - onSelect?: Function, - role?: string, - rootCloseEvent?: 'click' | 'mousedown', - onMouseEnter?: Function, - onMouseLeave?: Function, - ... - }> { - static Menu: Class; - static Toggle: Class; - } - - declare export class MenuItem extends React$Component<{ - active?: boolean, - disabled?: boolean, - //TODO: figure out proper type - divider?: any, - eventKey?: any, - header?: boolean, - href?: string, - onClick?: Function, - onSelect?: Function, - bsClass?: string, - ... - }> {} - - declare export class FormGroup extends React$Component<{ - controlId?: string, - validationState?: 'success' | 'warning' | 'error' | null, - bsSize?: BsSize, - bsClass?: string, - ... - }> {} - - declare class FormControlStatic extends React$Component<{ - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - - declare class FormControlFeedback extends React$Component<{ bsClass?: string, ... }> {} - - declare export class FormControl extends React$Component<{ - componentClass?: ElementType, - type?: string, - id?: string, - inputRef?: Ref<'input'>, - bsSize?: BsSize, - bsClass?: string, - ... - }> { - static Static: Class; - static Feedback: Class; - } - - declare export class ControlLabel extends React$Component<{ - htmlFor?: string, - srOnly?: boolean, - bsClass?: string, - ... - }> {} - - declare export class Checkbox extends React$Component<{ - inline?: boolean, - disabled?: boolean, - title?: string, - validateState?: 'success' | 'warning' | 'error' | null, - inputRef?: Ref<'input'>, - bsClass?: string, - ... - }> {} - - declare export class Radio extends React$Component<{ - inline?: boolean, - disabled?: boolean, - title?: string, - validateState?: 'success' | 'warning' | 'error' | null, - inputRef?: Ref<'input'>, - bsClass?: string, - ... - }> {} - - declare export class HelpBlock extends React$Component<{ bsClass?: string, ... }> {} - - declare export class Form extends React$Component<{ - horizontal?: boolean, - inline?: boolean, - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - - declare class InputGroupAddon extends React$Component<{ bsClass?: string, ... }> {} - - declare class InputGroupButton extends React$Component<{ bsClass?: string, ... }> {} - - declare export class InputGroup extends React$Component<{ - bsSize?: BsSize, - bsClass?: string, - ... - }> { - static Addon: Class; - static Button: Class; - } - - declare export class Image extends React$Component<{ - responsive?: boolean, - rounded?: boolean, - circle?: boolean, - thumbnail?: boolean, - bsClass?: string, - ... - }> {} - - declare export class Thumbnail extends React$Component<{ - src?: string, - alt?: string, - href?: string, - onError?: Function, - onLoad?: Function, - bsClass?: string, - ... - }> {} - - declare export class Jumbotron extends React$Component<{ - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - - declare export class Label extends React$Component<{ - bsStyle?: 'success' | 'warning' | 'danger' | 'info' | 'default' | 'primary', - bsClass?: string, - ... - }> {} - - declare export class ListGroup extends React$Component<{ - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - - declare export class ListGroupItem extends React$Component<{ - active?: any, - disabled?: any, - header?: Node, - listItem?: boolean, - onClick?: Function, - href?: string, - type?: string, - bsStyle?: 'success' | 'warning' | 'danger' | 'info', - bsClass?: string, - ... - }> {} - - - declare class MediaBody extends React$Component<{ - align?: 'top' | 'middle' | 'bottom', - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - declare class MediaLeft extends React$Component<{ - align?: 'top' | 'middle' | 'bottom', - bsClass?: string, - ... - }> {} - declare export class Media extends React$Component<{ - componentClass?: ElementType, - bsClass?: string, - ... - }> { - static Body: Class; - static Left: Class; - } - - declare class Dialog extends React$Component<{ - dialogClassName?: string, - bsSize?: BsSize, - bsClass?: string, - ... - }> {} - declare class Header extends React$Component<{ - closeLabel?: string, - closeButton?: boolean, - onHide?: Function, - bsClass?: string, - ... - }> {} - declare class Title extends React$Component<{ - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - declare class Body extends React$Component<{ - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - declare class Footer extends React$Component<{ - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - declare export class Modal extends React$Component<{ - backdrop?: 'static' | boolean, - backdropClassName?: string, - keyboard?: boolean, - animation?: boolean, - dialogComponentClass?: ElementType, - autoFocus?: boolean, - enforceFocus?: boolean, - restoreFocus?: boolean, - show?: boolean, - onHide?: Function, - onEnter?: Function, - onEntering?: Function, - onEntered?: Function, - onExit?: Function, - onExiting?: Function, - onExited?: Function, - container?: Node | Component<*> | (...args: Array) => Node, - bsSize?: BsSize, - bsClass?: string, - ... - }> { - static Dialog: Class; - static Header: Class
; - static Title: Class; - static Body: Class<Body>; - static Footer: Class<Footer>; - } - - declare export class Nav extends React$Component<{ - activeKey?: any, - activeHref?: string, - // TODO: figure out proper type - justified?: any, - onSelect?: Function, - role?: string, - navbar?: boolean, - pullRight?: boolean, - pullLeft?: boolean, - bsStyle?: 'tabs' | 'pills', - bsClass?: string, - ... - }> { - static Item: Class<NavItem>, - static Link: Class<NavLink> - } - - declare export class NavDropdown extends React$Component<{...}> {} - - declare export class NavItem extends React$Component<{ - active?: boolean, - disabled?: boolean, - role?: string, - href?: string, - onClick?: Function, - onSelect?: Function, - eventKey?: any, - ... - }> {} - - declare class NavbarHeader extends React$Component<{...}> {} - declare class NavbarBrand extends React$Component<{...}> {} - declare class NavbarToggle extends React$Component<{ onClick?: Function, ... }> {} - declare class NavbarCollapse extends React$Component<{...}> {} - declare class NavbarForm extends React$Component<{...}> {} - declare class NavbarLink extends React$Component<{...}> {} - declare class NavbarText extends React$Component<{...}> {} - - declare export class Navbar extends React$Component<{ - fixedTop?: boolean, - fixedBottom?: boolean, - staticTop?: boolean, - inverse?: boolean, - fluid?: boolean, - componentClass?: ElementType, - onToggle?: Function, - onSelect?: Function, - collapseOnSelect?: boolean, - expanded?: boolean, - role?: string, - bsStyle?: 'default' | 'inverse', - ... - }> { - static Header: Class<NavbarHeader>; - static Brand: Class<NavbarBrand>; - static Toggle: Class<NavbarToggle>; - static Collapse: Class<NavbarCollapse>; - static Form: Class<NavbarForm>; - static Link: Class<NavbarLink>; - static Text: Class<NavbarText>; - } - - declare export class Overlay extends React$Component<{ - show?: boolean, - rootClose?: boolean, - onHide?: Function, - animation?: boolean | ElementType, - onEnter?: Function, - onEntering?: Function, - onEntered?: Function, - onExit?: Function, - onExiting?: Function, - placement?: 'top' | 'right' | 'bottom' | 'left', - ... - }> {} - - declare export class PageHeader extends React$Component<{ bsClass?: string, ... }> {} - - declare class PagerItem extends React$Component<{ - disabled?: boolean, - previous?: boolean, - next?: boolean, - onClick?: Function, - onSelect?: Function, - eventKey?: any, - ... - }> {} - - declare export class Pager extends React$Component<{ - onSelect?: Function, - bsClass?: string, - ... - }> { - static Item: Class<PagerItem>; - } - - declare class PaginationItem extends React$Component<{ bsClass?: string, ... }> {} - - declare class PaginationFirst extends React$Component<{ bsClass?: string, ... }> {} - - - declare class PaginationLast extends React$Component<{ bsClass?: string, ... }> {} - - declare class PaginationPrev extends React$Component<{ bsClass?: string, ... }> {} - - declare class PaginationNext extends React$Component<{ bsClass?: string, ... }> {} - - declare class PaginationEllipsis extends React$Component<{ bsClass?: string, ... }> {} - - declare export class Pagination extends React$Component<{ bsClass?: string, ... }> { - static Item: Class<PaginationItem>; - static First: Class<PaginationFirst>; - static Last: Class<PaginationLast>; - static Prev: Class<PaginationPrev>; - static Next: Class<PaginationNext>; - static Ellipsis: Class<PaginationEllipsis>; - } - - declare class PanelHeading extends React$Component<{ - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - declare class PanelBody extends React$Component<{ - collapsible: boolean, - bsClass?: string, - ... - }> {} - declare class PanelTitle extends React$Component<{ - componentClass?: ElementType, - toggle?: boolean, - bsClass?: string, - ... - }> {} - declare class PanelCollapse extends React$Component<{ - onEnter?: Function, - onEntering?: Function, - onEntered?: Function, - onExit?: Function, - onExiting?: Function, - onExited?: Function, - bsClass?: string, - ... - }> {} - declare class PanelToggle extends React$Component<{ - onClick?: Function, - componentClass?: ElementType, - ... - }> {} - declare class PanelFooter extends React$Component<{ bsClass?: string, ... }> {} - declare export class Panel extends React$Component<{ - expanded?: boolean, - onToggle?: Function, - eventKey?: any, - id?: string, - ... - }> { - static Heading: Class<PanelHeading>; - static Body: Class<PanelBody>; - static Title: Class<PanelTitle>; - static Collapse: Class<PanelCollapse>; - static Toggle: Class<PanelToggle>; - static Footer: Class<PanelFooter>; - } - - declare export class PanelGroup extends React$Component<{ - accordion?: boolean, - activeKey?: any, - onSelect?: Function, - role?: string, - generateChildId?: (eventKey: string, type: string) => string, - id?: string, - ... - }> {} - - declare export class Popover extends React$Component<{ - id: string, - placement?: 'top' | 'right' | 'bottom' | 'left', - positionTop?: string | number, - positionLeft?: string | number, - arrowOffsetTop?: string | number, - arrowOffsetLeft?: string | number, - title?: Node, - bsClass?: string, - ... - }> {} - - declare export class ProgressBar extends React$Component<{ - min?: number, - now?: number, - max?: number, - label?: Node, - srOnly?: boolean, - striped?: boolean, - active?: boolean, - children?: Element<typeof ProgressBar>, - isChild?: boolean, - bsStyle?: 'success' | 'warning' | 'danger' | 'info', - bsClass?: string, - ... - }> {} - - declare export class Table extends React$Component<{ - striped?: boolean, - bordered?: boolean, - condensed?: boolean, - hover?: boolean, - responsive?: boolean, - bsClass?: string, - ... - }> {} - - declare export class Tabs extends React$Component<{ - activeKey?: any, - bsStyle?: 'tabs' | 'pills', - animation?: boolean, - id?: string, - onSelect?: Function, - mountOnEnter?: boolean, - unmountOnExit?: boolean, - ... - }> {} - - declare export class Tab extends React$Component<{ - disabled?: boolean, - title?: Node, - tabClassName?: string, - bsClass?: string, - ... - }> { - static Container: Class<Container>, - static Content: Class<Content>, - static Pane: Class<Pane> - } - - declare export class TabContainer extends React$Component<{ - id: string, - generateChildId?: (eventKey: string, type: string) => string, - onSelect?: Function, - activeKey?: any, - ... - }> {} - - declare export class TabContent extends React$Component<{ - componentClass?: ElementType, - animation?: boolean | ElementType, - mountOnEnter?: boolean, - unmountOnExit?: boolean, - bsClass?: string, - ... - }> {} - - declare export class TabPane extends React$Component<{ - eventKey?: any, - animation?: boolean | string, - id?: string, - 'aria-labelledby'?: string, - bsClass?: string, - onEnter?: Function, - onEntering?: Function, - onEntered?: Function, - onExit?: Function, - onExiting?: Function, - onExited?: Function, - mountOnEnter?: boolean, - unmountOnExit?: boolean, - ... - }> {} - - declare export class OverlayTrigger extends React$Component<{ - trigger?: TriggerType | Array<TriggerType>, - delay?: number, - delayShow?: number, - delayHide?: number, - defaultOverlayShown?: boolean, - overlay: Node, - onBlur?: Function, - onClick?: Function, - onFocus?: Function, - onMouseOut?: Function, - onMouseOver?: Function, - target?: null, - onHide?: null, - show?: null, - ... - }> {} - - declare export class Tooltip extends React$Component<{ - id: string | number, - placement?: 'top' | 'right' | 'bottom' | 'left', - positionTop?: string | number, - positionLeft?: string | number, - arrowOffsetTop?: string | number, - arrowOffsetLeft?: string | number, - bsClass?: string, - ... - }> {} - - declare export class Well extends React$Component<{ - bsSize?: BsSize, - bsClass?: string, - ... - }> {} - - declare export class Collapse extends React$Component<{ - in?: boolean, - mountOnEnter?: boolean, - unmountOnExit?: boolean, - appear?: boolean, - timeout?: number, - onEnter?: Function, - onEntering?: Function, - onEntered?: Function, - onExit?: Function, - onExiting?: Function, - onExited?: Function, - dimension?: 'height' | 'width' | Function, - getDimensionValue?: Function, - role?: string, - ... - }> {} - - declare export class Fade extends React$Component<{ - in?: boolean, - mountOnEnter?: boolean, - unmountOnExit?: boolean, - appear?: boolean, - timeout?: number, - onEnter?: Function, - onEntering?: Function, - onEntered?: Function, - onExit?: Function, - onExiting?: Function, - onExited?: Function, - dimension?: 'height' | 'width' | Function, - getDimensionValue?: Function, - role?: string, - ... - }> {} - - declare export class Grid extends React$Component<{ - fluid?: boolean, - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - - declare export class Row extends React$Component<{ - componentClass?: ElementType, - bsClass?: string, - ... - }> {} - - declare export class Col extends React$Component<{ - componentClass?: ElementType, - xs?: number, - sm?: number, - md?: number, - lg?: number, - xsHidden?: boolean, - smHidden?: boolean, - mdHidden?: boolean, - lgHidden?: boolean, - xsOffset?: number, - smOffset?: number, - mdOffset?: number, - lgOffset?: number, - xsPush?: number, - smPush?: number, - mdPush?: number, - lgPush?: number, - xsPull?: number, - smPull?: number, - mdPull?: number, - lgPull?: number, - bsClass?: string, - ... - }> {} - - declare export class Row extends React$Component<{ - componentClass?: ElementType, - visibleXsBlock?: boolean, - visibleSmBlock?: boolean, - visibleMdBlock?: boolean, - visibleLgBlock?: boolean, - bsClass?: string, - ... - }> {} - - declare export class Glyphicon extends React$Component<{ glyph: string, ... }> {} -} diff --git a/package-lock.json b/package-lock.json index a607f267..fbe19f51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,10 +8,8 @@ "name": "c2lc-coding-environment", "version": "1.13.0", "dependencies": { - "bootstrap": "4.6.1", "classnames": "2.3.1", "react": "16.14.0", - "react-bootstrap": "1.6.4", "react-dom": "16.14.0", "react-intl": "5.22.0", "tone": "14.7.77", @@ -3028,34 +3026,6 @@ "node": ">=10" } }, - "node_modules/@popperjs/core": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", - "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@restart/context": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", - "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", - "peerDependencies": { - "react": ">=16.3.2" - } - }, - "node_modules/@restart/hooks": { - "version": "0.3.27", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz", - "integrity": "sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw==", - "dependencies": { - "dequal": "^2.0.2" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, "node_modules/@rushstack/eslint-patch": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz", @@ -3658,11 +3628,6 @@ "@types/node": "*" } }, - "node_modules/@types/invariant": { - "version": "2.2.35", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.35.tgz", - "integrity": "sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==" - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -3771,14 +3736,6 @@ "csstype": "^3.0.2" } }, - "node_modules/@types/react-transition-group": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", - "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/retry": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", @@ -3824,11 +3781,6 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, - "node_modules/@types/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" - }, "node_modules/@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", @@ -5347,19 +5299,6 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "node_modules/bootstrap": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz", - "integrity": "sha512-0dj+VgI9Ecom+rvvpNZ4MUZJz8dcX7WCX+eTID9+/8HgOkv3dsRzi8BGeZJCQU6flWQVYxwTQnEZFrmJSEO7og==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - }, - "peerDependencies": { - "jquery": "1.9.1 - 3", - "popper.js": "^1.16.1" - } - }, "node_modules/boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -6941,14 +6880,6 @@ "node": ">= 0.6" } }, - "node_modules/dequal": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", - "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", - "engines": { - "node": ">=6" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -7034,15 +6965,6 @@ "utila": "~0.4" } }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, "node_modules/dom-serializer": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", @@ -9698,14 +9620,6 @@ "tslib": "^2.1.0" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -10963,12 +10877,6 @@ "node": ">=10" } }, - "node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", - "peer": true - }, "node_modules/js-base64": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", @@ -12951,17 +12859,6 @@ "node": ">=8" } }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -14192,18 +14089,6 @@ "reflect.ownkeys": "^0.2.0" } }, - "node_modules/prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "dependencies": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - }, - "peerDependencies": { - "react": ">=0.14.0" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -14391,34 +14276,6 @@ "node": ">=14" } }, - "node_modules/react-bootstrap": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.4.tgz", - "integrity": "sha512-z3BhBD4bEZuLP8VrYqAD7OT7axdcSkkyvWBWnS2U/4MhyabUihrUyucPWkan7aMI1XIHbmH4LCpEtzWGfx/yfA==", - "dependencies": { - "@babel/runtime": "^7.14.0", - "@restart/context": "^2.1.4", - "@restart/hooks": "^0.3.26", - "@types/invariant": "^2.2.33", - "@types/prop-types": "^15.7.3", - "@types/react": ">=16.14.8", - "@types/react-transition-group": "^4.4.1", - "@types/warning": "^3.0.0", - "classnames": "^2.3.1", - "dom-helpers": "^5.2.1", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "prop-types-extra": "^1.1.0", - "react-overlays": "^5.1.1", - "react-transition-group": "^4.4.1", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, "node_modules/react-dom": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", @@ -14464,30 +14321,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-overlays": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.1.1.tgz", - "integrity": "sha512-eCN2s2/+GVZzpnId4XVWtvDPYYBD2EtOGP74hE+8yDskPzFy9+pV1H3ZZihxuRdEbQzzacySaaDkR7xE0ydl4Q==", - "dependencies": { - "@babel/runtime": "^7.13.8", - "@popperjs/core": "^2.8.6", - "@restart/hooks": "^0.3.26", - "@types/warning": "^3.0.0", - "dom-helpers": "^5.2.0", - "prop-types": "^15.7.2", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.3.0", - "react-dom": ">=16.3.0" - } - }, "node_modules/react-test-renderer": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", @@ -14503,21 +14336,6 @@ "react": "^16.14.0" } }, - "node_modules/react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -16691,20 +16509,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0" - } - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -16933,14 +16737,6 @@ "makeerror": "1.0.12" } }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -19741,25 +19537,6 @@ } } }, - "@popperjs/core": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", - "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==" - }, - "@restart/context": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", - "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", - "requires": {} - }, - "@restart/hooks": { - "version": "0.3.27", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz", - "integrity": "sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw==", - "requires": { - "dequal": "^2.0.2" - } - }, "@rushstack/eslint-patch": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz", @@ -20179,11 +19956,6 @@ "@types/node": "*" } }, - "@types/invariant": { - "version": "2.2.35", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.35.tgz", - "integrity": "sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==" - }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -20292,14 +20064,6 @@ "csstype": "^3.0.2" } }, - "@types/react-transition-group": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", - "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", - "requires": { - "@types/react": "*" - } - }, "@types/retry": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", @@ -20345,11 +20109,6 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, - "@types/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" - }, "@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", @@ -21470,12 +21229,6 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "bootstrap": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz", - "integrity": "sha512-0dj+VgI9Ecom+rvvpNZ4MUZJz8dcX7WCX+eTID9+/8HgOkv3dsRzi8BGeZJCQU6flWQVYxwTQnEZFrmJSEO7og==", - "requires": {} - }, "boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -22590,11 +22343,6 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "dequal": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", - "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==" - }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -22661,15 +22409,6 @@ "utila": "~0.4" } }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, "dom-serializer": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", @@ -24678,14 +24417,6 @@ "tslib": "^2.1.0" } }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, "ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -25618,12 +25349,6 @@ } } }, - "jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", - "peer": true - }, "js-base64": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", @@ -27134,12 +26859,6 @@ "find-up": "^4.0.0" } }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "peer": true - }, "possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -27922,15 +27641,6 @@ "reflect.ownkeys": "^0.2.0" } }, - "prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "requires": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - } - }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -28077,30 +27787,6 @@ "whatwg-fetch": "^3.6.2" } }, - "react-bootstrap": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.4.tgz", - "integrity": "sha512-z3BhBD4bEZuLP8VrYqAD7OT7axdcSkkyvWBWnS2U/4MhyabUihrUyucPWkan7aMI1XIHbmH4LCpEtzWGfx/yfA==", - "requires": { - "@babel/runtime": "^7.14.0", - "@restart/context": "^2.1.4", - "@restart/hooks": "^0.3.26", - "@types/invariant": "^2.2.33", - "@types/prop-types": "^15.7.3", - "@types/react": ">=16.14.8", - "@types/react-transition-group": "^4.4.1", - "@types/warning": "^3.0.0", - "classnames": "^2.3.1", - "dom-helpers": "^5.2.1", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "prop-types-extra": "^1.1.0", - "react-overlays": "^5.1.1", - "react-transition-group": "^4.4.1", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - } - }, "react-dom": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", @@ -28134,26 +27820,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-overlays": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.1.1.tgz", - "integrity": "sha512-eCN2s2/+GVZzpnId4XVWtvDPYYBD2EtOGP74hE+8yDskPzFy9+pV1H3ZZihxuRdEbQzzacySaaDkR7xE0ydl4Q==", - "requires": { - "@babel/runtime": "^7.13.8", - "@popperjs/core": "^2.8.6", - "@restart/hooks": "^0.3.26", - "@types/warning": "^3.0.0", - "dom-helpers": "^5.2.0", - "prop-types": "^15.7.2", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - } - }, "react-test-renderer": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", @@ -28166,17 +27832,6 @@ "scheduler": "^0.19.1" } }, - "react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -29853,17 +29508,6 @@ "which-boxed-primitive": "^1.0.2" } }, - "uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "requires": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - } - }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -30039,14 +29683,6 @@ "makeerror": "1.0.12" } }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", diff --git a/package.json b/package.json index e4fa88d6..6159e3a1 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,8 @@ "version": "1.13.0", "private": true, "dependencies": { - "bootstrap": "4.6.1", "classnames": "2.3.1", "react": "16.14.0", - "react-bootstrap": "1.6.4", "react-dom": "16.14.0", "react-intl": "5.22.0", "tone": "14.7.77", @@ -107,7 +105,6 @@ "!src/**/*.test.js", "!src/App.js", "!src/AudioManagerImpl.js", - "!src/DashDriver.js", "!src/FakeRobotDriver.js", "!src/FakeAudioManager.js", "!src/FeatureDetection.js", diff --git a/src/App.js b/src/App.js index f43f1305..412c9308 100644 --- a/src/App.js +++ b/src/App.js @@ -18,8 +18,6 @@ import C2lcURLParams from './C2lcURLParams'; import CustomBackground from './CustomBackground'; import CustomBackgroundDesignModeButton from './CustomBackgroundDesignModeButton'; import CustomBackgroundSerializer from './CustomBackgroundSerializer'; -import DashConnectionErrorModal from './DashConnectionErrorModal'; -import DashDriver from './DashDriver'; import DesignModeCursorDescriptionBuilder from './DesignModeCursorDescriptionBuilder'; import DesignModeCursorState from './DesignModeCursorState'; import * as FeatureDetection from './FeatureDetection'; @@ -40,7 +38,7 @@ import ProgramSpeedController from './ProgramSpeedController'; import ProgramSerializer from './ProgramSerializer'; import ActionsSimplificationModal from './ActionsSimplificationModal'; import type { TileCode } from './TileData'; -import type { ActionToggleRegister, AudioManager, CommandName, DeviceConnectionStatus, DisplayedCommandName, RobotDriver, RunningState, ThemeName } from './types'; +import type { ActionToggleRegister, AudioManager, CommandName, DisplayedCommandName, RunningState, ThemeName } from './types'; import type { WorldName } from './Worlds'; import { getWorldProperties } from './Worlds'; import WorldSelector from './WorldSelector'; @@ -79,14 +77,6 @@ function getThemeLogo (theme: ThemeName) { return LogoMixedAndLight; } -/* Dash connection removed for version 0.5 -import BluetoothApiWarning from './BluetoothApiWarning'; -import DeviceConnectControl from './DeviceConnectControl'; -*/ - -// Uncomment to use the FakeRobotDriver (see driver construction below also) -//import FakeRobotDriver from './FakeRobotDriver'; - type AppContext = { bluetoothApiIsAvailable: boolean }; @@ -107,8 +97,6 @@ export type AppState = { programSequence: ProgramSequence, characterState: CharacterState, settings: AppSettings, - dashConnectionStatus: DeviceConnectionStatus, - showDashConnectionError: boolean, selectedAction: ?CommandName, isDraggingCommand: boolean, audioEnabled: boolean, @@ -146,7 +134,6 @@ export class App extends React.Component<AppProps, AppState> { version: string; appContext: AppContext; sceneDimensions: SceneDimensions; - dashDriver: RobotDriver; interpreter: Interpreter; audioManager: AudioManager; focusTrapManager: FocusTrapManager; @@ -205,8 +192,6 @@ export class App extends React.Component<AppProps, AppState> { theme: 'default', world: this.defaultWorld }, - dashConnectionStatus: 'notConnected', - showDashConnectionError: false, selectedAction: null, isDraggingCommand: false, audioEnabled: true, @@ -240,10 +225,6 @@ export class App extends React.Component<AppProps, AppState> { keyboardInputSchemeName: "controlalt" }; - // For FakeRobotDriver, replace with: - // this.dashDriver = new FakeRobotDriver(); - this.dashDriver = new DashDriver(); - if (props.audioManager) { this.audioManager = props.audioManager } @@ -443,40 +424,6 @@ export class App extends React.Component<AppProps, AppState> { }); }; - handleClickConnectDash = () => { - this.setState({ - dashConnectionStatus: 'connecting', - showDashConnectionError: false - }); - this.dashDriver.connect(this.handleDashDisconnect).then(() => { - this.setState({ - dashConnectionStatus: 'connected' - }); - }, (error: Error) => { - /* eslint-disable no-console */ - console.log('ERROR'); - console.log(error.name); - console.log(error.message); - /* eslint-enable no-console */ - this.setState({ - dashConnectionStatus: 'notConnected', - showDashConnectionError: true - }); - }); - }; - - handleCancelDashConnection = () => { - this.setState({ - showDashConnectionError: false - }); - }; - - handleDashDisconnect = () => { - this.setState({ - dashConnectionStatus : 'notConnected' - }); - }; - handleCommandFromCommandPalette = (command: CommandName) => { this.setState({ selectedAction: command @@ -1630,10 +1577,6 @@ export class App extends React.Component<AppProps, AppState> { renderModals() { return ( <React.Fragment> - <DashConnectionErrorModal - show={this.state.showDashConnectionError} - onCancel={this.handleCancelDashConnection} - onRetry={this.handleClickConnectDash}/> <KeyboardInputModal show={this.state.showKeyboardModal} keyBindingsEnabled={this.state.keyBindingsEnabled} @@ -2017,27 +1960,6 @@ export class App extends React.Component<AppProps, AppState> { ); } } - - /* Dash connection removed for version 0.5 - if (this.state.dashConnectionStatus !== prevState.dashConnectionStatus) { - console.log(this.state.dashConnectionStatus); - - if (this.state.dashConnectionStatus === 'connected') { - this.interpreter.addCommandHandler('forward', 'dash', - this.dashDriver.forward.bind(this.dashDriver)); - this.interpreter.addCommandHandler('left', 'dash', - this.dashDriver.left.bind(this.dashDriver)); - this.interpreter.addCommandHandler('right', 'dash', - this.dashDriver.right.bind(this.dashDriver)); - } else if (this.state.dashConnectionStatus === 'notConnected') { - // TODO: Remove Dash handlers - - if (this.state.runningState === 'running) { - this.interpreter.stop(); - } - } - } - */ } componentWillUnmount() { diff --git a/src/App.scss b/src/App.scss index 79369d08..88da5924 100644 --- a/src/App.scss +++ b/src/App.scss @@ -112,13 +112,6 @@ body { } } - -/* Dash connection removed for version 0.5 -.App__audio-toggle-switch { - margin-right: 1.5rem; -} -*/ - .App__bluetooth-api-warning-section { margin-top: 1.5rem; } diff --git a/src/AriaDisablingButton.js b/src/AriaDisablingButton.js index c08480d3..d7f1db00 100644 --- a/src/AriaDisablingButton.js +++ b/src/AriaDisablingButton.js @@ -1,7 +1,6 @@ // @flow import * as React from 'react'; -import { Button } from 'react-bootstrap'; import classNames from 'classnames'; type AriaDisablingButtonProps = { @@ -12,7 +11,7 @@ type AriaDisablingButtonProps = { children?: React.Node }; -const AriaDisablingButton = React.forwardRef<AriaDisablingButtonProps, Button>( +const AriaDisablingButton = React.forwardRef<AriaDisablingButtonProps, HTMLElement>( (props, ref) => { const { onClick, @@ -25,12 +24,14 @@ const AriaDisablingButton = React.forwardRef<AriaDisablingButtonProps, Button>( const classes = classNames( className, - disabled && disabledClassName + disabled && disabledClassName, + 'btn' // For compatibility with Bootstrap ); return React.createElement( - Button, + 'button', Object.assign({ + 'type': 'button', 'onClick': disabled ? undefined : onClick, 'aria-disabled': disabled, 'className': classes, diff --git a/src/AriaDisablingButton.test.js b/src/AriaDisablingButton.test.js index dcb2430f..5c630a92 100644 --- a/src/AriaDisablingButton.test.js +++ b/src/AriaDisablingButton.test.js @@ -3,7 +3,6 @@ import React from 'react'; import Adapter from 'enzyme-adapter-react-16'; import { configure, mount, shallow } from 'enzyme'; -import { Button } from 'react-bootstrap'; import AriaDisablingButton from './AriaDisablingButton'; configure({ adapter: new Adapter()}); @@ -21,7 +20,7 @@ test('Enabled button with no className or extra props', () => { </AriaDisablingButton> ); - const wrappedButton = wrapper.find(Button).at(0); + const wrappedButton = wrapper.find('button').at(0); expect(wrappedButton.props()['aria-disabled']).toBe(false); expect(wrappedButton.props()['children']).toBe('someContent'); @@ -44,7 +43,7 @@ test('Disabled button with no className or extra props', () => { </AriaDisablingButton> ); - const wrappedButton = wrapper.find(Button).at(0); + const wrappedButton = wrapper.find('button').at(0); expect(wrappedButton.props()['aria-disabled']).toBe(true); expect(wrappedButton.props()['children']).toBe('someContent'); @@ -70,7 +69,7 @@ test('Enabled button with className and extra props', () => { </AriaDisablingButton> ); - const wrappedButton = wrapper.find(Button).at(0); + const wrappedButton = wrapper.find('button').at(0); expect(wrappedButton.props()['aria-disabled']).toBe(false); expect(wrappedButton.props()['anotherProp1']).toBe('anotherPropValue1'); @@ -100,7 +99,7 @@ test('Disabled button with className and extra props', () => { </AriaDisablingButton> ); - const wrappedButton = wrapper.find(Button).at(0); + const wrappedButton = wrapper.find('button').at(0); expect(wrappedButton.props()['aria-disabled']).toBe(true); expect(wrappedButton.props()['anotherProp1']).toBe('anotherPropValue1'); diff --git a/src/CommandBlock.js b/src/CommandBlock.js index fe841a30..846cf17f 100644 --- a/src/CommandBlock.js +++ b/src/CommandBlock.js @@ -3,7 +3,6 @@ import * as React from 'react'; import AriaDisablingButton from './AriaDisablingButton'; import LoopIterationsInput from './LoopIterationsInput'; -import { Button } from 'react-bootstrap'; import classNames from 'classnames'; import type { KeyboardInputSchemeName } from './KeyboardInputSchemes'; import type { RunningState } from './types'; @@ -59,7 +58,7 @@ export const commandBlockIconTypes = new Map<string, any>([ ['endLoop', LoopEnd] ]); -export default React.forwardRef<CommandBlockProps, Button>( +export default React.forwardRef<CommandBlockProps, HTMLElement>( (props, ref) => { const { commandName, @@ -117,13 +116,13 @@ export default React.forwardRef<CommandBlockProps, Button>( const classes = classNames( 'command-block', + `btn-command-block--${commandName}`, className ); return React.createElement( AriaDisablingButton, Object.assign({ - 'variant': `command-block--${commandName}`, 'className': classes, 'onClick': onClick, 'disabled': disabled, diff --git a/src/CommandBlock.test.js b/src/CommandBlock.test.js index 5b803f7f..435ed0e3 100644 --- a/src/CommandBlock.test.js +++ b/src/CommandBlock.test.js @@ -45,25 +45,25 @@ function getLoopIterationsInput(wrapper) { describe('Rendering commands', () => { test('forward1', () => { const wrapper = createMountCommandBlock(); - expect(getCommandBlock(wrapper).get(0).props.variant).toBe('command-block--forward1'); + expect(getCommandBlock(wrapper).at(0).hasClass('btn-command-block--forward1')).toBe(true); expect(getAriaDiabledButton(wrapper).length).toBe(1); expect(getLoopIterationsInput(wrapper).length).toBe(0); }); test('backward1', () => { const wrapper = createMountCommandBlock({commandName: 'backward1'}); - expect(getCommandBlock(wrapper).get(0).props.variant).toBe('command-block--backward1'); + expect(getCommandBlock(wrapper).at(0).hasClass('btn-command-block--backward1')).toBe(true); expect(getAriaDiabledButton(wrapper).length).toBe(1); expect(getLoopIterationsInput(wrapper).length).toBe(0); }); test('left45', () => { const wrapper = createMountCommandBlock({commandName: 'left45'}); - expect(getCommandBlock(wrapper).get(0).props.variant).toBe('command-block--left45'); + expect(getCommandBlock(wrapper).at(0).hasClass('btn-command-block--left45')).toBe(true); expect(getAriaDiabledButton(wrapper).length).toBe(1); expect(getLoopIterationsInput(wrapper).length).toBe(0); }); test('right45', () => { const wrapper = createMountCommandBlock({commandName: 'right45'}); - expect(getCommandBlock(wrapper).get(0).props.variant).toBe('command-block--right45'); + expect(getCommandBlock(wrapper).at(0).hasClass('btn-command-block--right45')).toBe(true); expect(getAriaDiabledButton(wrapper).length).toBe(1); expect(getLoopIterationsInput(wrapper).length).toBe(0); }); @@ -78,13 +78,13 @@ describe('Rendering commands', () => { keyboardInputSchemeName: 'controlalt', onChangeLoopIterations: () => {} }); - expect(getCommandBlock(wrapper).get(0).props.variant).toBe('command-block--startLoop'); + expect(getCommandBlock(wrapper).at(0).hasClass('btn-command-block--startLoop')).toBe(true); expect(getAriaDiabledButton(wrapper).length).toBe(1); expect(getLoopIterationsInput(wrapper).length).toBe(1); }); test('endLoop', () => { const wrapper = createMountCommandBlock({commandName: 'endLoop'}); - expect(getCommandBlock(wrapper).get(0).props.variant).toBe('command-block--endLoop'); + expect(getCommandBlock(wrapper).at(0).hasClass('btn-command-block--endLoop')).toBe(true); expect(getAriaDiabledButton(wrapper).length).toBe(1); expect(getLoopIterationsInput(wrapper).length).toBe(0); }); diff --git a/src/DashConnectionErrorModal.js b/src/DashConnectionErrorModal.js deleted file mode 100644 index 85232569..00000000 --- a/src/DashConnectionErrorModal.js +++ /dev/null @@ -1,64 +0,0 @@ -// @flow - -import React from 'react'; -import { Button, Modal } from 'react-bootstrap'; -import { injectIntl, FormattedMessage } from 'react-intl'; -import type {IntlShape} from 'react-intl'; -import { ReactComponent as ErrorIcon } from './svg/Error.svg'; -import './DashConnectionErrorModal.scss'; - -type DashConnectionErrorModalProps = { - intl: IntlShape, - show: boolean, - onCancel: () => void, - onRetry: () => void -}; - -class DashConnectionErrorModal extends React.Component<DashConnectionErrorModalProps, {}> { - render() { - return ( - <Modal - show={this.props.show} - onHide={this.props.onCancel} - size='lg' - dialogClassName='DashConnectionErrorModal' - centered> - <Modal.Body className='DashConnectionErrorModal__content'> - <div className='DashConnectionErrorModal__header'> - <span role='img' aria-label={this.props.intl.formatMessage({id:'DashConnectionErrorModal.error'})} > - <ErrorIcon - className='DashConnectionErrorModal__error-svg' - aria-hidden={true} - /> - </span> - <FormattedMessage id='DashConnectionErrorModal.title' /> - </div> - <div className='DashConnectionErrorModal__body'> - <ul> - <li> - <FormattedMessage id='DashConnectionErrorModal.firstMessage' /> - </li> - <li> - <FormattedMessage id='DashConnectionErrorModal.secondMessage' /> - </li> - </ul> - </div> - <div className='DashConnectionErrorModal__footer'> - <Button - className='DashConnectionErrorModal__option-button mr-4' - onClick={this.props.onCancel}> - <FormattedMessage id='DashConnectionErrorModal.cancelButton' /> - </Button> - <Button - className='DashConnectionErrorModal__option-button' - onClick={this.props.onRetry}> - <FormattedMessage id='DashConnectionErrorModal.retryButton' /> - </Button> - </div> - </Modal.Body> - </Modal> - ); - } -} - -export default injectIntl(DashConnectionErrorModal); diff --git a/src/DashConnectionErrorModal.scss b/src/DashConnectionErrorModal.scss deleted file mode 100644 index cc7b5987..00000000 --- a/src/DashConnectionErrorModal.scss +++ /dev/null @@ -1,33 +0,0 @@ -@import 'variables'; - -.DashConnectionErrorModal { - width: 35rem; -} - -.DashConnectionErrorModal__content { - padding: 3rem 4rem; -} - -.DashConnectionErrorModal__header { - font-weight: bold; -} - -.DashConnectionErrorModal__error-svg { - width: 2rem; - height: 2rem; - margin-right: 0.5rem; - margin-bottom: 0.5rem; -} - -.DashConnectionErrorModal__body { - margin-top: 1rem; -} - -.DashConnectionErrorModal__footer { - margin-top: 3rem; - text-align: center; -} - -.DashConnectionErrorModal__option-button { - min-width: 11rem; -} diff --git a/src/DashConnectionErrorModal.test.js b/src/DashConnectionErrorModal.test.js deleted file mode 100644 index 1c40bb90..00000000 --- a/src/DashConnectionErrorModal.test.js +++ /dev/null @@ -1,15 +0,0 @@ -// @flow -import React from 'react'; -import ReactDOM from 'react-dom'; -import DashConnectionErrorModal from './DashConnectionErrorModal'; - -import { IntlProvider } from 'react-intl'; -import messages from './messages.json'; - -it('renders without crashing', () => { - const div = document.createElement('div'); - ReactDOM.render(<IntlProvider locale="en" messages={messages["en"]}> - <DashConnectionErrorModal onCancel={() => { }} onRetry={() => { }} show={true} /> - </IntlProvider>, div); - ReactDOM.unmountComponentAtNode(div); -}); diff --git a/src/DashDriver.js b/src/DashDriver.js deleted file mode 100644 index b6ffb870..00000000 --- a/src/DashDriver.js +++ /dev/null @@ -1,62 +0,0 @@ -// @flow - -import type { RobotDriver } from './types'; - -const dashServiceUuid = 'af237777-879d-6186-1f49-deca0e85d9c1'; -const dashCommandCharacteristicUuid = 'af230002-879d-6186-1f49-deca0e85d9c1'; - -export default class DashDriver implements RobotDriver { - commandCharacteristic: any; - - connect(onDisconnected: () => void): Promise<void> { - return new Promise((resolve, reject) => { - (navigator: any).bluetooth.requestDevice({ - filters: [{ services: [dashServiceUuid] }] - }).then((device) => { - device.addEventListener('gattserverdisconnected', onDisconnected); - return device.gatt.connect(); - }).then((server) => { - return server.getPrimaryService(dashServiceUuid); - }).then((service) => { - return service.getCharacteristic(dashCommandCharacteristicUuid); - }).then((characteristic) => { - this.commandCharacteristic = characteristic; - resolve(); - }).catch((error: Error) => { - reject(error); - }); - }); - } - - sendCommand(bytes: Array<number>, waitTimeMs: number): Promise<void> { - // TODO: Use feedback from Dash to know when the command has finished, - // rather than after a set amount of time - return new Promise((resolve) => { - this.commandCharacteristic.writeValue(new Uint8Array(bytes)); - setTimeout(() => { - resolve(); - }, waitTimeMs); - }); - } - - forward(): Promise<void> { - return this.sendCommand( - [0x23, 0xC8, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x80], - 1900 - ); - } - - left(): Promise<void> { - return this.sendCommand( - [0x23, 0x00, 0x00, 0x9D, 0x03, 0xE8, 0x00, 0x00, 0x80], - 1900 - ); - } - - right(): Promise<void> { - return this.sendCommand( - [0x23, 0x00, 0x00, 0x63, 0x03, 0xE8, 0xC0, 0xC0, 0x80], - 1900 - ); - } -} diff --git a/src/ModalHeader.js b/src/ModalHeader.js index 58ea2b5d..72a8b53d 100644 --- a/src/ModalHeader.js +++ b/src/ModalHeader.js @@ -1,7 +1,6 @@ // @flow import React from 'react'; -import { Modal } from 'react-bootstrap'; import './ModalHeader.scss'; type ModalHeaderProps = { @@ -13,10 +12,10 @@ type ModalHeaderProps = { export default class ModalHeader extends React.Component<ModalHeaderProps, {}> { render() { return ( - <Modal.Title className='ModalHeader' id={this.props.id}> + <div className='ModalHeader modal-title h4' id={this.props.id}> {this.props.children} {this.props.title} - </Modal.Title> + </div> ); } } diff --git a/src/ProgramBlockEditor.test.js b/src/ProgramBlockEditor.test.js index 8603e8d8..b54107a5 100644 --- a/src/ProgramBlockEditor.test.js +++ b/src/ProgramBlockEditor.test.js @@ -3,7 +3,6 @@ import React from 'react'; import Adapter from 'enzyme-adapter-react-16'; import { configure, mount } from 'enzyme'; -import { Button } from 'react-bootstrap'; import { IntlProvider } from 'react-intl'; import AudioManagerImpl from './AudioManagerImpl'; import ActionPanel from './ActionPanel'; @@ -128,7 +127,7 @@ function getProgramBlockWithActionPanel(programBlockEditorWrapper) { } function getActionPanelActionButtons(programBlockEditorWrapper) { - return programBlockEditorWrapper.find(Button) + return programBlockEditorWrapper.find('button') .filter('.ActionPanel__action-buttons'); } diff --git a/src/ProgramSpeedController.js b/src/ProgramSpeedController.js index 62aa1001..bbc97f83 100644 --- a/src/ProgramSpeedController.js +++ b/src/ProgramSpeedController.js @@ -1,7 +1,6 @@ // @flow import React from 'react'; -import { Form } from 'react-bootstrap'; import type { IntlShape } from 'react-intl'; import { injectIntl } from 'react-intl'; import { ReactComponent as SlowIcon } from './svg/Slow.svg'; @@ -25,10 +24,7 @@ class ProgramSpeedController extends React.Component<ProgramSpeedControllerProps <div className='ProgramSpeedController__container'> <SlowIcon aria-hidden={true} /> { - /* $FlowFixMe - Cannot get Form.Control because property Control is missing in statics of Form - */ - <Form.Control + <input aria-label={`${this.props.intl.formatMessage({id:'ProgramSpeedController.slider'})}`} className='ProgramSpeedController__slider' type='range' diff --git a/src/index.scss b/src/index.scss index d0cb0ba8..1041e8fa 100644 --- a/src/index.scss +++ b/src/index.scss @@ -2,8 +2,6 @@ /* Bootstrap */ -// TODO: Use class name wild card to reduce duplication if possible - $theme-colors: ( 'primary': $c2lc-primary-button-color, 'command-block--forward1': $c2lc-forward-command-color, @@ -21,7 +19,32 @@ $theme-colors: ( 'command-block--none': #F8F8F8 ); -@import '~bootstrap/scss/bootstrap.scss'; +/* Bootstrap reboot */ + +@import 'vendor/bootstrap-4.6.2/scss/functions'; +@import 'vendor/bootstrap-4.6.2/scss/variables'; +@import 'vendor/bootstrap-4.6.2/scss/vendor/rfs'; +@import 'vendor/bootstrap-4.6.2/scss/mixins/hover'; +@import 'vendor/bootstrap-4.6.2/scss/reboot'; + +/* Bootstrap type */ + +@import 'vendor/bootstrap-4.6.2/scss/mixins/lists'; +@import 'vendor/bootstrap-4.6.2/scss/type'; + +/* Bootstrap buttons */ + +@import 'vendor/bootstrap-4.6.2/scss/mixins/buttons'; +@import 'vendor/bootstrap-4.6.2/scss/mixins/border-radius'; +@import 'vendor/bootstrap-4.6.2/scss/mixins/box-shadow'; +@import 'vendor/bootstrap-4.6.2/scss/mixins/gradients'; +@import 'vendor/bootstrap-4.6.2/scss/mixins/transition'; +@import 'vendor/bootstrap-4.6.2/scss/buttons'; + +/* Bootstrap utilities/screenreaders */ + +@import 'vendor/bootstrap-4.6.2/scss/mixins/screen-reader'; +@import 'vendor/bootstrap-4.6.2/scss/utilities/screenreaders'; /* C2LC Global Styles */ diff --git a/src/messages.json b/src/messages.json index 8f8fa29e..9ebdb2df 100644 --- a/src/messages.json +++ b/src/messages.json @@ -66,7 +66,6 @@ "App.appHeading.link": "Weavly, learn more about Weavly at Weavly dot org", "App.blockMode": "Block", "App.changeMode": "Change Mode", - "App.connectToDash": "Connect to Dash", "App.privacyModalToggle": "Privacy", "App.privacyModalToggle.ariaLabel": "Weavly privacy policy", "App.run": "Run", @@ -159,12 +158,6 @@ "ConfirmDeleteAllModal.content": "Are you sure you want to delete all steps of your program?", "ConfirmDeleteAllModal.title": "Delete Program", "CustomBackgroundDesignModeButton.customBackgroundDesignMode": "custom background design mode", - "DashConnectionErrorModal.cancelButton": "Cancel connection", - "DashConnectionErrorModal.error": "Connection Error", - "DashConnectionErrorModal.firstMessage": "Make sure your device's bluetooth is turned on", - "DashConnectionErrorModal.retryButton": "Try again", - "DashConnectionErrorModal.secondMessage": "Make sure Dash is turned on and it's near your device", - "DashConnectionErrorModal.title": "Something went wrong!", "DeepOcean.babyJellyfish": "a baby jellyfish", "DeepOcean.character": "the submarine", "DeepOcean.coral": "coral", @@ -527,7 +520,6 @@ "fr": { "App.blockMode": "Block in French", "App.changeMode": "Change Mode in French", - "App.connectToDash": "Se connecter à Dash", "App.run": "Lancer", "App.speechRecognition": "Speech Recognition in French", "App.textMode": "Text in French", diff --git a/src/vendor/bootstrap-4.6.2/LICENSE b/src/vendor/bootstrap-4.6.2/LICENSE new file mode 100644 index 00000000..dda75ca9 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2011-2022 Twitter, Inc. +Copyright (c) 2011-2022 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. diff --git a/src/vendor/bootstrap-4.6.2/README.txt b/src/vendor/bootstrap-4.6.2/README.txt new file mode 100644 index 00000000..b3b49360 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/README.txt @@ -0,0 +1,20 @@ +Subset of Bootstrap + +Sources: + +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/LICENSE +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/_buttons.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/_functions.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/_reboot.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/_type.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/_variables.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/mixins/_border-radius.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/mixins/_box-shadow.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/mixins/_buttons.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/mixins/_gradients.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/mixins/_hover.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/mixins/_lists.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/mixins/_screen-reader.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/mixins/_transition.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/utilities/_screenreaders.scss +https://github.com/twbs/bootstrap/raw/refs/tags/v4.6.2/scss/vendor/_rfs.scss diff --git a/src/vendor/bootstrap-4.6.2/scss/_buttons.scss b/src/vendor/bootstrap-4.6.2/scss/_buttons.scss new file mode 100644 index 00000000..6ee24ba1 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/_buttons.scss @@ -0,0 +1,142 @@ +// stylelint-disable selector-no-qualifying-type + +// +// Base styles +// + +.btn { + display: inline-block; + font-family: $btn-font-family; + font-weight: $btn-font-weight; + color: $body-color; + text-align: center; + text-decoration: if($link-decoration == none, null, none); + white-space: $btn-white-space; + vertical-align: middle; + user-select: none; + background-color: transparent; + border: $btn-border-width solid transparent; + @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius); + @include transition($btn-transition); + + @include hover() { + color: $body-color; + text-decoration: none; + } + + &:focus, + &.focus { + outline: 0; + box-shadow: $btn-focus-box-shadow; + } + + // Disabled comes first so active can properly restyle + &.disabled, + &:disabled { + opacity: $btn-disabled-opacity; + @include box-shadow(none); + } + + &:not(:disabled):not(.disabled) { + cursor: if($enable-pointer-cursor-for-buttons, pointer, null); + + &:active, + &.active { + @include box-shadow($btn-active-box-shadow); + + &:focus { + @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow); + } + } + } +} + +// Future-proof disabling of clicks on `<a>` elements +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + + +// +// Alternate buttons +// + +@each $color, $value in $theme-colors { + .btn-#{$color} { + @include button-variant($value, $value); + } +} + +@each $color, $value in $theme-colors { + .btn-outline-#{$color} { + @include button-outline-variant($value); + } +} + + +// +// Link buttons +// + +// Make a button look and behave like a link +.btn-link { + font-weight: $font-weight-normal; + color: $link-color; + text-decoration: $link-decoration; + + @include hover() { + color: $link-hover-color; + text-decoration: $link-hover-decoration; + } + + &:focus, + &.focus { + text-decoration: $link-hover-decoration; + } + + &:disabled, + &.disabled { + color: $btn-link-disabled-color; + pointer-events: none; + } + + // No need for an active state here +} + + +// +// Button Sizes +// + +.btn-lg { + @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg); +} + +.btn-sm { + @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm); +} + + +// +// Block button +// + +.btn-block { + display: block; + width: 100%; + + // Vertically space out multiple block buttons + + .btn-block { + margin-top: $btn-block-spacing-y; + } +} + +// Specificity overrides +input[type="submit"], +input[type="reset"], +input[type="button"] { + &.btn-block { + width: 100%; + } +} diff --git a/src/vendor/bootstrap-4.6.2/scss/_functions.scss b/src/vendor/bootstrap-4.6.2/scss/_functions.scss new file mode 100644 index 00000000..13d9de0c --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/_functions.scss @@ -0,0 +1,190 @@ +// Bootstrap functions +// +// Utility mixins and functions for evaluating source code across our variables, maps, and mixins. + +// Ascending +// Used to evaluate Sass maps like our grid breakpoints. +@mixin _assert-ascending($map, $map-name) { + $prev-key: null; + $prev-num: null; + @each $key, $num in $map { + @if $prev-num == null or unit($num) == "%" or unit($prev-num) == "%" { + // Do nothing + } @else if not comparable($prev-num, $num) { + @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !"; + } @else if $prev-num >= $num { + @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !"; + } + $prev-key: $key; + $prev-num: $num; + } +} + +// Starts at zero +// Used to ensure the min-width of the lowest breakpoint starts at 0. +@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") { + @if length($map) > 0 { + $values: map-values($map); + $first-value: nth($values, 1); + @if $first-value != 0 { + @warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}."; + } + } +} + +// Replace `$search` with `$replace` in `$string` +// Used on our SVG icon backgrounds for custom forms. +// +// @author Hugo Giraudel +// @param {String} $string - Initial string +// @param {String} $search - Substring to replace +// @param {String} $replace ('') - New value +// @return {String} - Updated string +@function str-replace($string, $search, $replace: "") { + $index: str-index($string, $search); + + @if $index { + @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); + } + + @return $string; +} + +// See https://codepen.io/kevinweber/pen/dXWoRw +// +// Requires the use of quotes around data URIs. + +@function escape-svg($string) { + @if str-index($string, "data:image/svg+xml") { + @each $char, $encoded in $escaped-characters { + // Do not escape the url brackets + @if str-index($string, "url(") == 1 { + $string: url("#{str-replace(str-slice($string, 6, -3), $char, $encoded)}"); + } @else { + $string: str-replace($string, $char, $encoded); + } + } + } + + @return $string; +} + +// Color contrast +@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) { + $r: red($color); + $g: green($color); + $b: blue($color); + + $yiq: (($r * 299) + ($g * 587) + ($b * 114)) * .001; + + @if ($yiq >= $yiq-contrasted-threshold) { + @return $dark; + } @else { + @return $light; + } +} + +// Retrieve color Sass maps +@function color($key: "blue") { + @return map-get($colors, $key); +} + +@function theme-color($key: "primary") { + @return map-get($theme-colors, $key); +} + +@function gray($key: "100") { + @return map-get($grays, $key); +} + +// Request a theme color level +@function theme-color-level($color-name: "primary", $level: 0) { + $color: theme-color($color-name); + $color-base: if($level > 0, $black, $white); + $level: abs($level); + + @return mix($color-base, $color, $level * $theme-color-interval); +} + +// Return valid calc +@function add($value1, $value2, $return-calc: true) { + @if $value1 == null { + @return $value2; + } + + @if $value2 == null { + @return $value1; + } + + @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) { + @return $value1 + $value2; + } + + @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(" + ") + $value2); +} + +@function subtract($value1, $value2, $return-calc: true) { + @if $value1 == null and $value2 == null { + @return null; + } + + @if $value1 == null { + @return -$value2; + } + + @if $value2 == null { + @return $value1; + } + + @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) { + @return $value1 - $value2; + } + + @if type-of($value2) != number { + $value2: unquote("(") + $value2 + unquote(")"); + } + + @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2); +} + +@function divide($dividend, $divisor, $precision: 10) { + $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1); + $dividend: abs($dividend); + $divisor: abs($divisor); + @if $dividend == 0 { + @return 0; + } + @if $divisor == 0 { + @error "Cannot divide by 0"; + } + $remainder: $dividend; + $result: 0; + $factor: 10; + @while ($remainder > 0 and $precision >= 0) { + $quotient: 0; + @while ($remainder >= $divisor) { + $remainder: $remainder - $divisor; + $quotient: $quotient + 1; + } + $result: $result * 10 + $quotient; + $factor: $factor * .1; + $remainder: $remainder * 10; + $precision: $precision - 1; + @if ($precision < 0 and $remainder >= $divisor * 5) { + $result: $result + 1; + } + } + $result: $result * $factor * $sign; + $dividend-unit: unit($dividend); + $divisor-unit: unit($divisor); + $unit-map: ( + "px": 1px, + "rem": 1rem, + "em": 1em, + "%": 1% + ); + @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) { + $result: $result * map-get($unit-map, $dividend-unit); + } + @return $result; +} diff --git a/src/vendor/bootstrap-4.6.2/scss/_reboot.scss b/src/vendor/bootstrap-4.6.2/scss/_reboot.scss new file mode 100644 index 00000000..cd93bfe2 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/_reboot.scss @@ -0,0 +1,484 @@ +// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix + +// Reboot +// +// Normalization of HTML elements, manually forked from Normalize.css to remove +// styles targeting irrelevant browsers while applying new styles. +// +// Normalize is licensed MIT. https://github.com/necolas/normalize.css + + +// Document +// +// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`. +// 2. Change the default font family in all browsers. +// 3. Correct the line height in all browsers. +// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS. +// 5. Change the default tap highlight to be completely transparent in iOS. + +*, +*::before, +*::after { + box-sizing: border-box; // 1 +} + +html { + font-family: sans-serif; // 2 + line-height: 1.15; // 3 + -webkit-text-size-adjust: 100%; // 4 + -webkit-tap-highlight-color: rgba($black, 0); // 5 +} + +// Shim for "new" HTML5 structural elements to display correctly (IE10, older browsers) +// TODO: remove in v5 +// stylelint-disable-next-line selector-list-comma-newline-after +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +// Body +// +// 1. Remove the margin in all browsers. +// 2. As a best practice, apply a default `background-color`. +// 3. Set an explicit initial text-align value so that we can later use +// the `inherit` value on things like `<th>` elements. + +body { + margin: 0; // 1 + font-family: $font-family-base; + @include font-size($font-size-base); + font-weight: $font-weight-base; + line-height: $line-height-base; + color: $body-color; + text-align: left; // 3 + background-color: $body-bg; // 2 +} + +// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline +// on elements that programmatically receive focus but wouldn't normally show a visible +// focus outline. In general, this would mean that the outline is only applied if the +// interaction that led to the element receiving programmatic focus was a keyboard interaction, +// or the browser has somehow determined that the user is primarily a keyboard user and/or +// wants focus outlines to always be presented. +// +// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible +// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/ +[tabindex="-1"]:focus:not(:focus-visible) { + outline: 0 !important; +} + + +// Content grouping +// +// 1. Add the correct box sizing in Firefox. +// 2. Show the overflow in Edge and IE. + +hr { + box-sizing: content-box; // 1 + height: 0; // 1 + overflow: visible; // 2 +} + + +// +// Typography +// + +// Remove top margins from headings +// +// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top +// margin for easier control within type scales as it avoids margin collapsing. +// stylelint-disable-next-line selector-list-comma-newline-after +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: $headings-margin-bottom; +} + +// Reset margins on paragraphs +// +// Similarly, the top margin on `<p>`s get reset. However, we also reset the +// bottom margin to use `rem` units instead of `em`. +p { + margin-top: 0; + margin-bottom: $paragraph-margin-bottom; +} + +// Abbreviations +// +// 1. Duplicate behavior to the data-* attribute for our tooltip plugin +// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. +// 3. Add explicit cursor to indicate changed behavior. +// 4. Remove the bottom border in Firefox 39-. +// 5. Prevent the text-decoration to be skipped. + +abbr[title], +abbr[data-original-title] { // 1 + text-decoration: underline; // 2 + text-decoration: underline dotted; // 2 + cursor: help; // 3 + border-bottom: 0; // 4 + text-decoration-skip-ink: none; // 5 +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: $dt-font-weight; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; // Undo browser default +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari +} + +small { + @include font-size(80%); // Add the correct font size in all browsers +} + +// +// Prevent `sub` and `sup` elements from affecting the line height in +// all browsers. +// + +sub, +sup { + position: relative; + @include font-size(75%); + line-height: 0; + vertical-align: baseline; +} + +sub { bottom: -.25em; } +sup { top: -.5em; } + + +// +// Links +// + +a { + color: $link-color; + text-decoration: $link-decoration; + background-color: transparent; // Remove the gray background on active links in IE 10. + + @include hover() { + color: $link-hover-color; + text-decoration: $link-hover-decoration; + } +} + +// And undo these styles for placeholder links/named anchors (without href). +// It would be more straightforward to just use a[href] in previous block, but that +// causes specificity issues in many other styles that are too complex to fix. +// See https://github.com/twbs/bootstrap/issues/19402 + +a:not([href]):not([class]) { + color: inherit; + text-decoration: none; + + @include hover() { + color: inherit; + text-decoration: none; + } +} + + +// +// Code +// + +pre, +code, +kbd, +samp { + font-family: $font-family-monospace; + @include font-size(1em); // Correct the odd `em` font sizing in all browsers. +} + +pre { + // Remove browser default top margin + margin-top: 0; + // Reset browser default of `1em` to use `rem`s + margin-bottom: 1rem; + // Don't allow content to break outside + overflow: auto; + // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap, + // making it impossible to interact with the content + -ms-overflow-style: scrollbar; +} + + +// +// Figures +// + +figure { + // Apply a consistent margin strategy (matches our type styles). + margin: 0 0 1rem; +} + + +// +// Images and content +// + +img { + vertical-align: middle; + border-style: none; // Remove the border on images inside links in IE 10-. +} + +svg { + // Workaround for the SVG overflow bug in IE10/11 is still required. + // See https://github.com/twbs/bootstrap/issues/26878 + overflow: hidden; + vertical-align: middle; +} + + +// +// Tables +// + +table { + border-collapse: collapse; // Prevent double borders +} + +caption { + padding-top: $table-cell-padding; + padding-bottom: $table-cell-padding; + color: $table-caption-color; + text-align: left; + caption-side: bottom; +} + +// 1. Removes font-weight bold by inheriting +// 2. Matches default `<td>` alignment by inheriting `text-align`. +// 3. Fix alignment for Safari + +th { + font-weight: $table-th-font-weight; // 1 + text-align: inherit; // 2 + text-align: -webkit-match-parent; // 3 +} + + +// +// Forms +// + +label { + // Allow labels to use `margin` for spacing. + display: inline-block; + margin-bottom: $label-margin-bottom; +} + +// Remove the default `border-radius` that macOS Chrome adds. +// +// Details at https://github.com/twbs/bootstrap/issues/24093 +button { + // stylelint-disable-next-line property-disallowed-list + border-radius: 0; +} + +// Explicitly remove focus outline in Chromium when it shouldn't be +// visible (e.g. as result of mouse click or touch tap). It already +// should be doing this automatically, but seems to currently be +// confused and applies its very visible two-tone outline anyway. + +button:focus:not(:focus-visible) { + outline: 0; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; // Remove the margin in Firefox and Safari + font-family: inherit; + @include font-size(inherit); + line-height: inherit; +} + +button, +input { + overflow: visible; // Show the overflow in Edge +} + +button, +select { + text-transform: none; // Remove the inheritance of text transform in Firefox +} + +// Set the cursor for non-`<button>` buttons +// +// Details at https://github.com/twbs/bootstrap/pull/30562 +[role="button"] { + cursor: pointer; +} + +// Remove the inheritance of word-wrap in Safari. +// +// Details at https://github.com/twbs/bootstrap/issues/24990 +select { + word-wrap: normal; +} + + +// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` +// controls in Android 4. +// 2. Correct the inability to style clickable types in iOS and Safari. +button, +[type="button"], // 1 +[type="reset"], +[type="submit"] { + -webkit-appearance: button; // 2 +} + +// Opinionated: add "hand" cursor to non-disabled button elements. +@if $enable-pointer-cursor-for-buttons { + button, + [type="button"], + [type="reset"], + [type="submit"] { + &:not(:disabled) { + cursor: pointer; + } + } +} + +// Remove inner border and padding from Firefox, but don't restore the outline like Normalize. +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; // 1. Add the correct box sizing in IE 10- + padding: 0; // 2. Remove the padding in IE 10- +} + + +textarea { + overflow: auto; // Remove the default vertical scrollbar in IE. + // Textareas should really only resize vertically so they don't break their (horizontal) containers. + resize: vertical; +} + +fieldset { + // Browsers set a default `min-width: min-content;` on fieldsets, + // unlike e.g. `<div>`s, which have `min-width: 0;` by default. + // So we reset that to ensure fieldsets behave more like a standard block element. + // See https://github.com/twbs/bootstrap/issues/12359 + // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements + min-width: 0; + // Reset the default outline behavior of fieldsets so they don't affect page layout. + padding: 0; + margin: 0; + border: 0; +} + +// 1. Correct the text wrapping in Edge and IE. +// 2. Correct the color inheritance from `fieldset` elements in IE. +legend { + display: block; + width: 100%; + max-width: 100%; // 1 + padding: 0; + margin-bottom: .5rem; + @include font-size(1.5rem); + line-height: inherit; + color: inherit; // 2 + white-space: normal; // 1 +} + +progress { + vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera. +} + +// Correct the cursor style of increment and decrement buttons in Chrome. +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + // 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. + outline-offset: -2px; // 2. Correct the outline style in Safari. + -webkit-appearance: none; +} + +// +// Remove the inner padding in Chrome and Safari on macOS. +// + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +// +// 1. Correct the inability to style clickable types in iOS and Safari. +// 2. Change font properties to `inherit` in Safari. +// + +::-webkit-file-upload-button { + font: inherit; // 2 + -webkit-appearance: button; // 1 +} + +// +// Correct element displays +// + +output { + display: inline-block; +} + +summary { + display: list-item; // Add the correct display in all browsers + cursor: pointer; +} + +template { + display: none; // Add the correct display in IE +} + +// Always hide an element with the `hidden` HTML attribute (from PureCSS). +// Needed for proper display in IE 10-. +[hidden] { + display: none !important; +} diff --git a/src/vendor/bootstrap-4.6.2/scss/_type.scss b/src/vendor/bootstrap-4.6.2/scss/_type.scss new file mode 100644 index 00000000..3112a734 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/_type.scss @@ -0,0 +1,125 @@ +// stylelint-disable selector-list-comma-newline-after + +// +// Headings +// + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: $headings-margin-bottom; + font-family: $headings-font-family; + font-weight: $headings-font-weight; + line-height: $headings-line-height; + color: $headings-color; +} + +h1, .h1 { @include font-size($h1-font-size); } +h2, .h2 { @include font-size($h2-font-size); } +h3, .h3 { @include font-size($h3-font-size); } +h4, .h4 { @include font-size($h4-font-size); } +h5, .h5 { @include font-size($h5-font-size); } +h6, .h6 { @include font-size($h6-font-size); } + +.lead { + @include font-size($lead-font-size); + font-weight: $lead-font-weight; +} + +// Type display classes +.display-1 { + @include font-size($display1-size); + font-weight: $display1-weight; + line-height: $display-line-height; +} +.display-2 { + @include font-size($display2-size); + font-weight: $display2-weight; + line-height: $display-line-height; +} +.display-3 { + @include font-size($display3-size); + font-weight: $display3-weight; + line-height: $display-line-height; +} +.display-4 { + @include font-size($display4-size); + font-weight: $display4-weight; + line-height: $display-line-height; +} + + +// +// Horizontal rules +// + +hr { + margin-top: $hr-margin-y; + margin-bottom: $hr-margin-y; + border: 0; + border-top: $hr-border-width solid $hr-border-color; +} + + +// +// Emphasis +// + +small, +.small { + @include font-size($small-font-size); + font-weight: $font-weight-normal; +} + +mark, +.mark { + padding: $mark-padding; + background-color: $mark-bg; +} + + +// +// Lists +// + +.list-unstyled { + @include list-unstyled(); +} + +// Inline turns list items into inline-block +.list-inline { + @include list-unstyled(); +} +.list-inline-item { + display: inline-block; + + &:not(:last-child) { + margin-right: $list-inline-padding; + } +} + + +// +// Misc +// + +// Builds on `abbr` +.initialism { + @include font-size(90%); + text-transform: uppercase; +} + +// Blockquotes +.blockquote { + margin-bottom: $spacer; + @include font-size($blockquote-font-size); +} + +.blockquote-footer { + display: block; + @include font-size($blockquote-small-font-size); + color: $blockquote-small-color; + + &::before { + content: "\2014\00A0"; // em dash, nbsp + } +} diff --git a/src/vendor/bootstrap-4.6.2/scss/_variables.scss b/src/vendor/bootstrap-4.6.2/scss/_variables.scss new file mode 100644 index 00000000..293d238b --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/_variables.scss @@ -0,0 +1,1149 @@ +// Variables +// +// Variables should follow the `$component-state-property-size` formula for +// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs. + +// Color system + +$white: #fff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #6c757d !default; +$gray-700: #495057 !default; +$gray-800: #343a40 !default; +$gray-900: #212529 !default; +$black: #000 !default; + +$grays: () !default; +$grays: map-merge( + ( + "100": $gray-100, + "200": $gray-200, + "300": $gray-300, + "400": $gray-400, + "500": $gray-500, + "600": $gray-600, + "700": $gray-700, + "800": $gray-800, + "900": $gray-900 + ), + $grays +); + +$blue: #007bff !default; +$indigo: #6610f2 !default; +$purple: #6f42c1 !default; +$pink: #e83e8c !default; +$red: #dc3545 !default; +$orange: #fd7e14 !default; +$yellow: #ffc107 !default; +$green: #28a745 !default; +$teal: #20c997 !default; +$cyan: #17a2b8 !default; + +$colors: () !default; +$colors: map-merge( + ( + "blue": $blue, + "indigo": $indigo, + "purple": $purple, + "pink": $pink, + "red": $red, + "orange": $orange, + "yellow": $yellow, + "green": $green, + "teal": $teal, + "cyan": $cyan, + "white": $white, + "gray": $gray-600, + "gray-dark": $gray-800 + ), + $colors +); + +$primary: $blue !default; +$secondary: $gray-600 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $yellow !default; +$danger: $red !default; +$light: $gray-100 !default; +$dark: $gray-800 !default; + +$theme-colors: () !default; +$theme-colors: map-merge( + ( + "primary": $primary, + "secondary": $secondary, + "success": $success, + "info": $info, + "warning": $warning, + "danger": $danger, + "light": $light, + "dark": $dark + ), + $theme-colors +); + +// Set a specific jump point for requesting color jumps +$theme-color-interval: 8% !default; + +// The yiq lightness value that determines when the lightness of color changes from "dark" to "light". Acceptable values are between 0 and 255. +$yiq-contrasted-threshold: 150 !default; + +// Customize the light and dark text colors for use in our YIQ color contrast function. +$yiq-text-dark: $gray-900 !default; +$yiq-text-light: $white !default; + +// Characters which are escaped by the escape-svg function +$escaped-characters: ( + ("<", "%3c"), + (">", "%3e"), + ("#", "%23"), + ("(", "%28"), + (")", "%29"), +) !default; + + +// Options +// +// Quickly modify global styling by enabling or disabling optional features. + +$enable-caret: true !default; +$enable-rounded: true !default; +$enable-shadows: false !default; +$enable-gradients: false !default; +$enable-transitions: true !default; +$enable-prefers-reduced-motion-media-query: true !default; +$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS +$enable-grid-classes: true !default; +$enable-pointer-cursor-for-buttons: true !default; +$enable-print-styles: true !default; +$enable-responsive-font-sizes: false !default; +$enable-validation-icons: true !default; +$enable-deprecation-messages: true !default; + + +// Spacing +// +// Control the default styling of most Bootstrap elements by modifying these +// variables. Mostly focused on spacing. +// You can add more entries to the $spacers map, should you need more variation. + +$spacer: 1rem !default; +$spacers: () !default; +$spacers: map-merge( + ( + 0: 0, + 1: ($spacer * .25), + 2: ($spacer * .5), + 3: $spacer, + 4: ($spacer * 1.5), + 5: ($spacer * 3) + ), + $spacers +); + +// This variable affects the `.h-*` and `.w-*` classes. +$sizes: () !default; +$sizes: map-merge( + ( + 25: 25%, + 50: 50%, + 75: 75%, + 100: 100%, + auto: auto + ), + $sizes +); + + +// Body +// +// Settings for the `<body>` element. + +$body-bg: $white !default; +$body-color: $gray-900 !default; + + +// Links +// +// Style anchor elements. + +$link-color: theme-color("primary") !default; +$link-decoration: none !default; +$link-hover-color: darken($link-color, 15%) !default; +$link-hover-decoration: underline !default; +// Darken percentage for links with `.text-*` class (e.g. `.text-success`) +$emphasized-link-hover-darken-percentage: 15% !default; + +// Paragraphs +// +// Style p element. + +$paragraph-margin-bottom: 1rem !default; + + +// Grid breakpoints +// +// Define the minimum dimensions at which your layout will change, +// adapting to different screen sizes, for use in media queries. + +$grid-breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px +) !default; + +@include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); +@include _assert-starts-at-zero($grid-breakpoints, "$grid-breakpoints"); + + +// Grid containers +// +// Define the maximum width of `.container` for different screen sizes. + +$container-max-widths: ( + sm: 540px, + md: 720px, + lg: 960px, + xl: 1140px +) !default; + +@include _assert-ascending($container-max-widths, "$container-max-widths"); + + +// Grid columns +// +// Set the number of columns and specify the width of the gutters. + +$grid-columns: 12 !default; +$grid-gutter-width: 30px !default; +$grid-row-columns: 6 !default; + + +// Components +// +// Define common padding and border radius sizes and more. + +$line-height-lg: 1.5 !default; +$line-height-sm: 1.5 !default; + +$border-width: 1px !default; +$border-color: $gray-300 !default; + +$border-radius: .25rem !default; +$border-radius-lg: .3rem !default; +$border-radius-sm: .2rem !default; + +$rounded-pill: 50rem !default; + +$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default; +$box-shadow: 0 .5rem 1rem rgba($black, .15) !default; +$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default; + +$component-active-color: $white !default; +$component-active-bg: theme-color("primary") !default; + +$caret-width: .3em !default; +$caret-vertical-align: $caret-width * .85 !default; +$caret-spacing: $caret-width * .85 !default; + +$transition-base: all .2s ease-in-out !default; +$transition-fade: opacity .15s linear !default; +$transition-collapse: height .35s ease !default; +$transition-collapse-width: width .35s ease !default; + +$embed-responsive-aspect-ratios: () !default; +$embed-responsive-aspect-ratios: join( + ( + (21 9), + (16 9), + (4 3), + (1 1), + ), + $embed-responsive-aspect-ratios +); + +// Typography +// +// Font, line-height, and color for body text, headings, and more. + +// stylelint-disable value-keyword-case +$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; +$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default; +$font-family-base: $font-family-sans-serif !default; +// stylelint-enable value-keyword-case + +$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` +$font-size-lg: $font-size-base * 1.25 !default; +$font-size-sm: $font-size-base * .875 !default; + +$font-weight-lighter: lighter !default; +$font-weight-light: 300 !default; +$font-weight-normal: 400 !default; +$font-weight-bold: 700 !default; +$font-weight-bolder: bolder !default; + +$font-weight-base: $font-weight-normal !default; +$line-height-base: 1.5 !default; + +$h1-font-size: $font-size-base * 2.5 !default; +$h2-font-size: $font-size-base * 2 !default; +$h3-font-size: $font-size-base * 1.75 !default; +$h4-font-size: $font-size-base * 1.5 !default; +$h5-font-size: $font-size-base * 1.25 !default; +$h6-font-size: $font-size-base !default; + +$headings-margin-bottom: $spacer * .5 !default; +$headings-font-family: null !default; +$headings-font-weight: 500 !default; +$headings-line-height: 1.2 !default; +$headings-color: null !default; + +$display1-size: 6rem !default; +$display2-size: 5.5rem !default; +$display3-size: 4.5rem !default; +$display4-size: 3.5rem !default; + +$display1-weight: 300 !default; +$display2-weight: 300 !default; +$display3-weight: 300 !default; +$display4-weight: 300 !default; +$display-line-height: $headings-line-height !default; + +$lead-font-size: $font-size-base * 1.25 !default; +$lead-font-weight: 300 !default; + +$small-font-size: .875em !default; + +$text-muted: $gray-600 !default; + +$blockquote-small-color: $gray-600 !default; +$blockquote-small-font-size: $small-font-size !default; +$blockquote-font-size: $font-size-base * 1.25 !default; + +$hr-border-color: rgba($black, .1) !default; +$hr-border-width: $border-width !default; + +$mark-padding: .2em !default; + +$dt-font-weight: $font-weight-bold !default; + +$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default; +$nested-kbd-font-weight: $font-weight-bold !default; + +$list-inline-padding: .5rem !default; + +$mark-bg: #fcf8e3 !default; + +$hr-margin-y: $spacer !default; + + +// Tables +// +// Customizes the `.table` component with basic values, each used across all table variations. + +$table-cell-padding: .75rem !default; +$table-cell-padding-sm: .3rem !default; + +$table-color: $body-color !default; +$table-bg: null !default; +$table-accent-bg: rgba($black, .05) !default; +$table-hover-color: $table-color !default; +$table-hover-bg: rgba($black, .075) !default; +$table-active-bg: $table-hover-bg !default; + +$table-border-width: $border-width !default; +$table-border-color: $border-color !default; + +$table-head-bg: $gray-200 !default; +$table-head-color: $gray-700 !default; +$table-th-font-weight: null !default; + +$table-dark-color: $white !default; +$table-dark-bg: $gray-800 !default; +$table-dark-accent-bg: rgba($white, .05) !default; +$table-dark-hover-color: $table-dark-color !default; +$table-dark-hover-bg: rgba($white, .075) !default; +$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default; + +$table-striped-order: odd !default; + +$table-caption-color: $text-muted !default; + +$table-bg-level: -9 !default; +$table-border-level: -6 !default; + + +// Buttons + Forms +// +// Shared variables that are reassigned to `$input-` and `$btn-` specific variables. + +$input-btn-padding-y: .375rem !default; +$input-btn-padding-x: .75rem !default; +$input-btn-font-family: null !default; +$input-btn-font-size: $font-size-base !default; +$input-btn-line-height: $line-height-base !default; + +$input-btn-focus-width: .2rem !default; +$input-btn-focus-color: rgba($component-active-bg, .25) !default; +$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default; + +$input-btn-padding-y-sm: .25rem !default; +$input-btn-padding-x-sm: .5rem !default; +$input-btn-font-size-sm: $font-size-sm !default; +$input-btn-line-height-sm: $line-height-sm !default; + +$input-btn-padding-y-lg: .5rem !default; +$input-btn-padding-x-lg: 1rem !default; +$input-btn-font-size-lg: $font-size-lg !default; +$input-btn-line-height-lg: $line-height-lg !default; + +$input-btn-border-width: $border-width !default; + + +// Buttons +// +// For each of Bootstrap's buttons, define text, background, and border color. + +$btn-padding-y: $input-btn-padding-y !default; +$btn-padding-x: $input-btn-padding-x !default; +$btn-font-family: $input-btn-font-family !default; +$btn-font-size: $input-btn-font-size !default; +$btn-line-height: $input-btn-line-height !default; +$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping + +$btn-padding-y-sm: $input-btn-padding-y-sm !default; +$btn-padding-x-sm: $input-btn-padding-x-sm !default; +$btn-font-size-sm: $input-btn-font-size-sm !default; +$btn-line-height-sm: $input-btn-line-height-sm !default; + +$btn-padding-y-lg: $input-btn-padding-y-lg !default; +$btn-padding-x-lg: $input-btn-padding-x-lg !default; +$btn-font-size-lg: $input-btn-font-size-lg !default; +$btn-line-height-lg: $input-btn-line-height-lg !default; + +$btn-border-width: $input-btn-border-width !default; + +$btn-font-weight: $font-weight-normal !default; +$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default; +$btn-focus-width: $input-btn-focus-width !default; +$btn-focus-box-shadow: $input-btn-focus-box-shadow !default; +$btn-disabled-opacity: .65 !default; +$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default; + +$btn-link-disabled-color: $gray-600 !default; + +$btn-block-spacing-y: .5rem !default; + +// Allows for customizing button radius independently from global border radius +$btn-border-radius: $border-radius !default; +$btn-border-radius-lg: $border-radius-lg !default; +$btn-border-radius-sm: $border-radius-sm !default; + +$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; + + +// Forms + +$label-margin-bottom: .5rem !default; + +$input-padding-y: $input-btn-padding-y !default; +$input-padding-x: $input-btn-padding-x !default; +$input-font-family: $input-btn-font-family !default; +$input-font-size: $input-btn-font-size !default; +$input-font-weight: $font-weight-base !default; +$input-line-height: $input-btn-line-height !default; + +$input-padding-y-sm: $input-btn-padding-y-sm !default; +$input-padding-x-sm: $input-btn-padding-x-sm !default; +$input-font-size-sm: $input-btn-font-size-sm !default; +$input-line-height-sm: $input-btn-line-height-sm !default; + +$input-padding-y-lg: $input-btn-padding-y-lg !default; +$input-padding-x-lg: $input-btn-padding-x-lg !default; +$input-font-size-lg: $input-btn-font-size-lg !default; +$input-line-height-lg: $input-btn-line-height-lg !default; + +$input-bg: $white !default; +$input-disabled-bg: $gray-200 !default; + +$input-color: $gray-700 !default; +$input-border-color: $gray-400 !default; +$input-border-width: $input-btn-border-width !default; +$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default; + +$input-border-radius: $border-radius !default; +$input-border-radius-lg: $border-radius-lg !default; +$input-border-radius-sm: $border-radius-sm !default; + +$input-focus-bg: $input-bg !default; +$input-focus-border-color: lighten($component-active-bg, 25%) !default; +$input-focus-color: $input-color !default; +$input-focus-width: $input-btn-focus-width !default; +$input-focus-box-shadow: $input-btn-focus-box-shadow !default; + +$input-placeholder-color: $gray-600 !default; +$input-plaintext-color: $body-color !default; + +$input-height-border: $input-border-width * 2 !default; + +$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default; +$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default; +$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default; + +$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default; +$input-height-sm: add($input-line-height-sm * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default; +$input-height-lg: add($input-line-height-lg * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default; + +$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; + +$form-text-margin-top: .25rem !default; + +$form-check-input-gutter: 1.25rem !default; +$form-check-input-margin-y: .3rem !default; +$form-check-input-margin-x: .25rem !default; + +$form-check-inline-margin-x: .75rem !default; +$form-check-inline-input-margin-x: .3125rem !default; + +$form-grid-gutter-width: 10px !default; +$form-group-margin-bottom: 1rem !default; + +$input-group-addon-color: $input-color !default; +$input-group-addon-bg: $gray-200 !default; +$input-group-addon-border-color: $input-border-color !default; + +$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; + +$custom-control-gutter: .5rem !default; +$custom-control-spacer-x: 1rem !default; +$custom-control-cursor: null !default; + +$custom-control-indicator-size: 1rem !default; +$custom-control-indicator-bg: $input-bg !default; + +$custom-control-indicator-bg-size: 50% 50% !default; +$custom-control-indicator-box-shadow: $input-box-shadow !default; +$custom-control-indicator-border-color: $gray-500 !default; +$custom-control-indicator-border-width: $input-border-width !default; + +$custom-control-label-color: null !default; + +$custom-control-indicator-disabled-bg: $input-disabled-bg !default; +$custom-control-label-disabled-color: $gray-600 !default; + +$custom-control-indicator-checked-color: $component-active-color !default; +$custom-control-indicator-checked-bg: $component-active-bg !default; +$custom-control-indicator-checked-disabled-bg: rgba(theme-color("primary"), .5) !default; +$custom-control-indicator-checked-box-shadow: null !default; +$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default; + +$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default; +$custom-control-indicator-focus-border-color: $input-focus-border-color !default; + +$custom-control-indicator-active-color: $component-active-color !default; +$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default; +$custom-control-indicator-active-box-shadow: null !default; +$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default; + +$custom-checkbox-indicator-border-radius: $border-radius !default; +$custom-checkbox-indicator-icon-checked: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/></svg>") !default; + +$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default; +$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default; +$custom-checkbox-indicator-icon-indeterminate: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'><path stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/></svg>") !default; +$custom-checkbox-indicator-indeterminate-box-shadow: null !default; +$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default; + +$custom-radio-indicator-border-radius: 50% !default; +$custom-radio-indicator-icon-checked: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'><circle r='3' fill='#{$custom-control-indicator-checked-color}'/></svg>") !default; + +$custom-switch-width: $custom-control-indicator-size * 1.75 !default; +$custom-switch-indicator-border-radius: $custom-control-indicator-size * .5 !default; +$custom-switch-indicator-size: subtract($custom-control-indicator-size, $custom-control-indicator-border-width * 4) !default; + +$custom-select-padding-y: $input-padding-y !default; +$custom-select-padding-x: $input-padding-x !default; +$custom-select-font-family: $input-font-family !default; +$custom-select-font-size: $input-font-size !default; +$custom-select-height: $input-height !default; +$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator +$custom-select-font-weight: $input-font-weight !default; +$custom-select-line-height: $input-line-height !default; +$custom-select-color: $input-color !default; +$custom-select-disabled-color: $gray-600 !default; +$custom-select-bg: $input-bg !default; +$custom-select-disabled-bg: $gray-200 !default; +$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions +$custom-select-indicator-color: $gray-800 !default; +$custom-select-indicator: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'><path fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>") !default; +$custom-select-background: escape-svg($custom-select-indicator) right $custom-select-padding-x center / $custom-select-bg-size no-repeat !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon) + +$custom-select-feedback-icon-padding-right: add(1em * .75, (2 * $custom-select-padding-y * .75) + $custom-select-padding-x + $custom-select-indicator-padding) !default; +$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default; +$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default; + +$custom-select-border-width: $input-border-width !default; +$custom-select-border-color: $input-border-color !default; +$custom-select-border-radius: $border-radius !default; +$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default; + +$custom-select-focus-border-color: $input-focus-border-color !default; +$custom-select-focus-width: $input-focus-width !default; +$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default; + +$custom-select-padding-y-sm: $input-padding-y-sm !default; +$custom-select-padding-x-sm: $input-padding-x-sm !default; +$custom-select-font-size-sm: $input-font-size-sm !default; +$custom-select-height-sm: $input-height-sm !default; + +$custom-select-padding-y-lg: $input-padding-y-lg !default; +$custom-select-padding-x-lg: $input-padding-x-lg !default; +$custom-select-font-size-lg: $input-font-size-lg !default; +$custom-select-height-lg: $input-height-lg !default; + +$custom-range-track-width: 100% !default; +$custom-range-track-height: .5rem !default; +$custom-range-track-cursor: pointer !default; +$custom-range-track-bg: $gray-300 !default; +$custom-range-track-border-radius: 1rem !default; +$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default; + +$custom-range-thumb-width: 1rem !default; +$custom-range-thumb-height: $custom-range-thumb-width !default; +$custom-range-thumb-bg: $component-active-bg !default; +$custom-range-thumb-border: 0 !default; +$custom-range-thumb-border-radius: 1rem !default; +$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default; +$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default; +$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge +$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default; +$custom-range-thumb-disabled-bg: $gray-500 !default; + +$custom-file-height: $input-height !default; +$custom-file-height-inner: $input-height-inner !default; +$custom-file-focus-border-color: $input-focus-border-color !default; +$custom-file-focus-box-shadow: $input-focus-box-shadow !default; +$custom-file-disabled-bg: $input-disabled-bg !default; + +$custom-file-padding-y: $input-padding-y !default; +$custom-file-padding-x: $input-padding-x !default; +$custom-file-line-height: $input-line-height !default; +$custom-file-font-family: $input-font-family !default; +$custom-file-font-weight: $input-font-weight !default; +$custom-file-color: $input-color !default; +$custom-file-bg: $input-bg !default; +$custom-file-border-width: $input-border-width !default; +$custom-file-border-color: $input-border-color !default; +$custom-file-border-radius: $input-border-radius !default; +$custom-file-box-shadow: $input-box-shadow !default; +$custom-file-button-color: $custom-file-color !default; +$custom-file-button-bg: $input-group-addon-bg !default; +$custom-file-text: ( + en: "Browse" +) !default; + + +// Form validation + +$form-feedback-margin-top: $form-text-margin-top !default; +$form-feedback-font-size: $small-font-size !default; +$form-feedback-valid-color: theme-color("success") !default; +$form-feedback-invalid-color: theme-color("danger") !default; + +$form-feedback-icon-valid-color: $form-feedback-valid-color !default; +$form-feedback-icon-valid: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>") !default; +$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default; +$form-feedback-icon-invalid: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}' viewBox='0 0 12 12'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>") !default; + +$form-validation-states: () !default; +$form-validation-states: map-merge( + ( + "valid": ( + "color": $form-feedback-valid-color, + "icon": $form-feedback-icon-valid + ), + "invalid": ( + "color": $form-feedback-invalid-color, + "icon": $form-feedback-icon-invalid + ), + ), + $form-validation-states +); + +// Z-index master list +// +// Warning: Avoid customizing these values. They're used for a bird's eye view +// of components dependent on the z-axis and are designed to all work together. + +$zindex-dropdown: 1000 !default; +$zindex-sticky: 1020 !default; +$zindex-fixed: 1030 !default; +$zindex-modal-backdrop: 1040 !default; +$zindex-modal: 1050 !default; +$zindex-popover: 1060 !default; +$zindex-tooltip: 1070 !default; + + +// Navs + +$nav-link-padding-y: .5rem !default; +$nav-link-padding-x: 1rem !default; +$nav-link-disabled-color: $gray-600 !default; + +$nav-tabs-border-color: $gray-300 !default; +$nav-tabs-border-width: $border-width !default; +$nav-tabs-border-radius: $border-radius !default; +$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default; +$nav-tabs-link-active-color: $gray-700 !default; +$nav-tabs-link-active-bg: $body-bg !default; +$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default; + +$nav-pills-border-radius: $border-radius !default; +$nav-pills-link-active-color: $component-active-color !default; +$nav-pills-link-active-bg: $component-active-bg !default; + +$nav-divider-color: $gray-200 !default; +$nav-divider-margin-y: $spacer * .5 !default; + + +// Navbar + +$navbar-padding-y: $spacer * .5 !default; +$navbar-padding-x: $spacer !default; + +$navbar-nav-link-padding-x: .5rem !default; + +$navbar-brand-font-size: $font-size-lg !default; +// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link +$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default; +$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default; +$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default; + +$navbar-toggler-padding-y: .25rem !default; +$navbar-toggler-padding-x: .75rem !default; +$navbar-toggler-font-size: $font-size-lg !default; +$navbar-toggler-border-radius: $btn-border-radius !default; + +$navbar-nav-scroll-max-height: 75vh !default; + +$navbar-dark-color: rgba($white, .5) !default; +$navbar-dark-hover-color: rgba($white, .75) !default; +$navbar-dark-active-color: $white !default; +$navbar-dark-disabled-color: rgba($white, .25) !default; +$navbar-dark-toggler-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>") !default; +$navbar-dark-toggler-border-color: rgba($white, .1) !default; + +$navbar-light-color: rgba($black, .5) !default; +$navbar-light-hover-color: rgba($black, .7) !default; +$navbar-light-active-color: rgba($black, .9) !default; +$navbar-light-disabled-color: rgba($black, .3) !default; +$navbar-light-toggler-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-light-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>") !default; +$navbar-light-toggler-border-color: rgba($black, .1) !default; + +$navbar-light-brand-color: $navbar-light-active-color !default; +$navbar-light-brand-hover-color: $navbar-light-active-color !default; +$navbar-dark-brand-color: $navbar-dark-active-color !default; +$navbar-dark-brand-hover-color: $navbar-dark-active-color !default; + + +// Dropdowns +// +// Dropdown menu container and contents. + +$dropdown-min-width: 10rem !default; +$dropdown-padding-x: 0 !default; +$dropdown-padding-y: .5rem !default; +$dropdown-spacer: .125rem !default; +$dropdown-font-size: $font-size-base !default; +$dropdown-color: $body-color !default; +$dropdown-bg: $white !default; +$dropdown-border-color: rgba($black, .15) !default; +$dropdown-border-radius: $border-radius !default; +$dropdown-border-width: $border-width !default; +$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default; +$dropdown-divider-bg: $gray-200 !default; +$dropdown-divider-margin-y: $nav-divider-margin-y !default; +$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default; + +$dropdown-link-color: $gray-900 !default; +$dropdown-link-hover-color: darken($gray-900, 5%) !default; +$dropdown-link-hover-bg: $gray-200 !default; + +$dropdown-link-active-color: $component-active-color !default; +$dropdown-link-active-bg: $component-active-bg !default; + +$dropdown-link-disabled-color: $gray-500 !default; + +$dropdown-item-padding-y: .25rem !default; +$dropdown-item-padding-x: 1.5rem !default; + +$dropdown-header-color: $gray-600 !default; +$dropdown-header-padding: $dropdown-padding-y $dropdown-item-padding-x !default; + + +// Pagination + +$pagination-padding-y: .5rem !default; +$pagination-padding-x: .75rem !default; +$pagination-padding-y-sm: .25rem !default; +$pagination-padding-x-sm: .5rem !default; +$pagination-padding-y-lg: .75rem !default; +$pagination-padding-x-lg: 1.5rem !default; +$pagination-line-height: 1.25 !default; + +$pagination-color: $link-color !default; +$pagination-bg: $white !default; +$pagination-border-width: $border-width !default; +$pagination-border-color: $gray-300 !default; + +$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default; +$pagination-focus-outline: 0 !default; + +$pagination-hover-color: $link-hover-color !default; +$pagination-hover-bg: $gray-200 !default; +$pagination-hover-border-color: $gray-300 !default; + +$pagination-active-color: $component-active-color !default; +$pagination-active-bg: $component-active-bg !default; +$pagination-active-border-color: $pagination-active-bg !default; + +$pagination-disabled-color: $gray-600 !default; +$pagination-disabled-bg: $white !default; +$pagination-disabled-border-color: $gray-300 !default; + +$pagination-border-radius-sm: $border-radius-sm !default; +$pagination-border-radius-lg: $border-radius-lg !default; + + +// Jumbotron + +$jumbotron-padding: 2rem !default; +$jumbotron-color: null !default; +$jumbotron-bg: $gray-200 !default; + + +// Cards + +$card-spacer-y: .75rem !default; +$card-spacer-x: 1.25rem !default; +$card-border-width: $border-width !default; +$card-border-radius: $border-radius !default; +$card-border-color: rgba($black, .125) !default; +$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default; +$card-cap-bg: rgba($black, .03) !default; +$card-cap-color: null !default; +$card-height: null !default; +$card-color: null !default; +$card-bg: $white !default; + +$card-img-overlay-padding: 1.25rem !default; + +$card-group-margin: $grid-gutter-width * .5 !default; +$card-deck-margin: $card-group-margin !default; + +$card-columns-count: 3 !default; +$card-columns-gap: 1.25rem !default; +$card-columns-margin: $card-spacer-y !default; + + +// Tooltips + +$tooltip-font-size: $font-size-sm !default; +$tooltip-max-width: 200px !default; +$tooltip-color: $white !default; +$tooltip-bg: $black !default; +$tooltip-border-radius: $border-radius !default; +$tooltip-opacity: .9 !default; +$tooltip-padding-y: .25rem !default; +$tooltip-padding-x: .5rem !default; +$tooltip-margin: 0 !default; + +$tooltip-arrow-width: .8rem !default; +$tooltip-arrow-height: .4rem !default; +$tooltip-arrow-color: $tooltip-bg !default; + +// Form tooltips must come after regular tooltips +$form-feedback-tooltip-padding-y: $tooltip-padding-y !default; +$form-feedback-tooltip-padding-x: $tooltip-padding-x !default; +$form-feedback-tooltip-font-size: $tooltip-font-size !default; +$form-feedback-tooltip-line-height: $line-height-base !default; +$form-feedback-tooltip-opacity: $tooltip-opacity !default; +$form-feedback-tooltip-border-radius: $tooltip-border-radius !default; + + +// Popovers + +$popover-font-size: $font-size-sm !default; +$popover-bg: $white !default; +$popover-max-width: 276px !default; +$popover-border-width: $border-width !default; +$popover-border-color: rgba($black, .2) !default; +$popover-border-radius: $border-radius-lg !default; +$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default; +$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default; + +$popover-header-bg: darken($popover-bg, 3%) !default; +$popover-header-color: $headings-color !default; +$popover-header-padding-y: .5rem !default; +$popover-header-padding-x: .75rem !default; + +$popover-body-color: $body-color !default; +$popover-body-padding-y: $popover-header-padding-y !default; +$popover-body-padding-x: $popover-header-padding-x !default; + +$popover-arrow-width: 1rem !default; +$popover-arrow-height: .5rem !default; +$popover-arrow-color: $popover-bg !default; + +$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default; + + +// Toasts + +$toast-max-width: 350px !default; +$toast-padding-x: .75rem !default; +$toast-padding-y: .25rem !default; +$toast-font-size: .875rem !default; +$toast-color: null !default; +$toast-background-color: rgba($white, .85) !default; +$toast-border-width: 1px !default; +$toast-border-color: rgba(0, 0, 0, .1) !default; +$toast-border-radius: .25rem !default; +$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default; + +$toast-header-color: $gray-600 !default; +$toast-header-background-color: rgba($white, .85) !default; +$toast-header-border-color: rgba(0, 0, 0, .05) !default; + + +// Badges + +$badge-font-size: 75% !default; +$badge-font-weight: $font-weight-bold !default; +$badge-padding-y: .25em !default; +$badge-padding-x: .4em !default; +$badge-border-radius: $border-radius !default; + +$badge-transition: $btn-transition !default; +$badge-focus-width: $input-btn-focus-width !default; + +$badge-pill-padding-x: .6em !default; +// Use a higher than normal value to ensure completely rounded edges when +// customizing padding or font-size on labels. +$badge-pill-border-radius: 10rem !default; + + +// Modals + +// Padding applied to the modal body +$modal-inner-padding: 1rem !default; + +// Margin between elements in footer, must be lower than or equal to 2 * $modal-inner-padding +$modal-footer-margin-between: .5rem !default; + +$modal-dialog-margin: .5rem !default; +$modal-dialog-margin-y-sm-up: 1.75rem !default; + +$modal-title-line-height: $line-height-base !default; + +$modal-content-color: null !default; +$modal-content-bg: $white !default; +$modal-content-border-color: rgba($black, .2) !default; +$modal-content-border-width: $border-width !default; +$modal-content-border-radius: $border-radius-lg !default; +$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default; +$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default; +$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default; + +$modal-backdrop-bg: $black !default; +$modal-backdrop-opacity: .5 !default; +$modal-header-border-color: $border-color !default; +$modal-footer-border-color: $modal-header-border-color !default; +$modal-header-border-width: $modal-content-border-width !default; +$modal-footer-border-width: $modal-header-border-width !default; +$modal-header-padding-y: 1rem !default; +$modal-header-padding-x: 1rem !default; +$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility + +$modal-xl: 1140px !default; +$modal-lg: 800px !default; +$modal-md: 500px !default; +$modal-sm: 300px !default; + +$modal-fade-transform: translate(0, -50px) !default; +$modal-show-transform: none !default; +$modal-transition: transform .3s ease-out !default; +$modal-scale-transform: scale(1.02) !default; + + +// Alerts +// +// Define alert colors, border radius, and padding. + +$alert-padding-y: .75rem !default; +$alert-padding-x: 1.25rem !default; +$alert-margin-bottom: 1rem !default; +$alert-border-radius: $border-radius !default; +$alert-link-font-weight: $font-weight-bold !default; +$alert-border-width: $border-width !default; + +$alert-bg-level: -10 !default; +$alert-border-level: -9 !default; +$alert-color-level: 6 !default; + + +// Progress bars + +$progress-height: 1rem !default; +$progress-font-size: $font-size-base * .75 !default; +$progress-bg: $gray-200 !default; +$progress-border-radius: $border-radius !default; +$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default; +$progress-bar-color: $white !default; +$progress-bar-bg: theme-color("primary") !default; +$progress-bar-animation-timing: 1s linear infinite !default; +$progress-bar-transition: width .6s ease !default; + + +// List group + +$list-group-color: null !default; +$list-group-bg: $white !default; +$list-group-border-color: rgba($black, .125) !default; +$list-group-border-width: $border-width !default; +$list-group-border-radius: $border-radius !default; + +$list-group-item-padding-y: .75rem !default; +$list-group-item-padding-x: 1.25rem !default; + +$list-group-hover-bg: $gray-100 !default; +$list-group-active-color: $component-active-color !default; +$list-group-active-bg: $component-active-bg !default; +$list-group-active-border-color: $list-group-active-bg !default; + +$list-group-disabled-color: $gray-600 !default; +$list-group-disabled-bg: $list-group-bg !default; + +$list-group-action-color: $gray-700 !default; +$list-group-action-hover-color: $list-group-action-color !default; + +$list-group-action-active-color: $body-color !default; +$list-group-action-active-bg: $gray-200 !default; + + +// Image thumbnails + +$thumbnail-padding: .25rem !default; +$thumbnail-bg: $body-bg !default; +$thumbnail-border-width: $border-width !default; +$thumbnail-border-color: $gray-300 !default; +$thumbnail-border-radius: $border-radius !default; +$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default; + + +// Figures + +$figure-caption-font-size: 90% !default; +$figure-caption-color: $gray-600 !default; + + +// Breadcrumbs + +$breadcrumb-font-size: null !default; + +$breadcrumb-padding-y: .75rem !default; +$breadcrumb-padding-x: 1rem !default; +$breadcrumb-item-padding: .5rem !default; + +$breadcrumb-margin-bottom: 1rem !default; + +$breadcrumb-bg: $gray-200 !default; +$breadcrumb-divider-color: $gray-600 !default; +$breadcrumb-active-color: $gray-600 !default; +$breadcrumb-divider: quote("/") !default; + +$breadcrumb-border-radius: $border-radius !default; + + +// Carousel + +$carousel-control-color: $white !default; +$carousel-control-width: 15% !default; +$carousel-control-opacity: .5 !default; +$carousel-control-hover-opacity: .9 !default; +$carousel-control-transition: opacity .15s ease !default; + +$carousel-indicator-width: 30px !default; +$carousel-indicator-height: 3px !default; +$carousel-indicator-hit-area-height: 10px !default; +$carousel-indicator-spacer: 3px !default; +$carousel-indicator-active-bg: $white !default; +$carousel-indicator-transition: opacity .6s ease !default; + +$carousel-caption-width: 70% !default; +$carousel-caption-color: $white !default; + +$carousel-control-icon-width: 20px !default; + +$carousel-control-prev-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/></svg>") !default; +$carousel-control-next-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/></svg>") !default; + +$carousel-transition-duration: .6s !default; +$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`) + + +// Spinners + +$spinner-width: 2rem !default; +$spinner-height: $spinner-width !default; +$spinner-vertical-align: -.125em !default; +$spinner-border-width: .25em !default; + +$spinner-width-sm: 1rem !default; +$spinner-height-sm: $spinner-width-sm !default; +$spinner-border-width-sm: .2em !default; + + +// Close + +$close-font-size: $font-size-base * 1.5 !default; +$close-font-weight: $font-weight-bold !default; +$close-color: $black !default; +$close-text-shadow: 0 1px 0 $white !default; + + +// Code + +$code-font-size: 87.5% !default; +$code-color: $pink !default; + +$kbd-padding-y: .2rem !default; +$kbd-padding-x: .4rem !default; +$kbd-font-size: $code-font-size !default; +$kbd-color: $white !default; +$kbd-bg: $gray-900 !default; + +$pre-color: $gray-900 !default; +$pre-scrollable-max-height: 340px !default; + + +// Utilities + +$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default; +$overflows: auto, hidden !default; +$positions: static, relative, absolute, fixed, sticky !default; +$user-selects: all, auto, none !default; + + +// Printing + +$print-page-size: a3 !default; +$print-body-min-width: map-get($grid-breakpoints, "lg") !default; diff --git a/src/vendor/bootstrap-4.6.2/scss/mixins/_border-radius.scss b/src/vendor/bootstrap-4.6.2/scss/mixins/_border-radius.scss new file mode 100644 index 00000000..4fad91d6 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/mixins/_border-radius.scss @@ -0,0 +1,76 @@ +// stylelint-disable property-disallowed-list +// Single side border-radius + +// Helper function to replace negative values with 0 +@function valid-radius($radius) { + $return: (); + @each $value in $radius { + @if type-of($value) == number { + $return: append($return, max($value, 0)); + } @else { + $return: append($return, $value); + } + } + @return $return; +} + +@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) { + @if $enable-rounded { + border-radius: valid-radius($radius); + } + @else if $fallback-border-radius != false { + border-radius: $fallback-border-radius; + } +} + +@mixin border-top-radius($radius) { + @if $enable-rounded { + border-top-left-radius: valid-radius($radius); + border-top-right-radius: valid-radius($radius); + } +} + +@mixin border-right-radius($radius) { + @if $enable-rounded { + border-top-right-radius: valid-radius($radius); + border-bottom-right-radius: valid-radius($radius); + } +} + +@mixin border-bottom-radius($radius) { + @if $enable-rounded { + border-bottom-right-radius: valid-radius($radius); + border-bottom-left-radius: valid-radius($radius); + } +} + +@mixin border-left-radius($radius) { + @if $enable-rounded { + border-top-left-radius: valid-radius($radius); + border-bottom-left-radius: valid-radius($radius); + } +} + +@mixin border-top-left-radius($radius) { + @if $enable-rounded { + border-top-left-radius: valid-radius($radius); + } +} + +@mixin border-top-right-radius($radius) { + @if $enable-rounded { + border-top-right-radius: valid-radius($radius); + } +} + +@mixin border-bottom-right-radius($radius) { + @if $enable-rounded { + border-bottom-right-radius: valid-radius($radius); + } +} + +@mixin border-bottom-left-radius($radius) { + @if $enable-rounded { + border-bottom-left-radius: valid-radius($radius); + } +} diff --git a/src/vendor/bootstrap-4.6.2/scss/mixins/_box-shadow.scss b/src/vendor/bootstrap-4.6.2/scss/mixins/_box-shadow.scss new file mode 100644 index 00000000..0726d435 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/mixins/_box-shadow.scss @@ -0,0 +1,20 @@ +@mixin box-shadow($shadow...) { + @if $enable-shadows { + $result: (); + + @if (length($shadow) == 1) { + // We can pass `@include box-shadow(none);` + $result: $shadow; + } @else { + // Filter to avoid invalid properties for example `box-shadow: none, 1px 1px black;` + @for $i from 1 through length($shadow) { + @if nth($shadow, $i) != "none" { + $result: append($result, nth($shadow, $i), "comma"); + } + } + } + @if (length($result) > 0) { + box-shadow: $result; + } + } +} diff --git a/src/vendor/bootstrap-4.6.2/scss/mixins/_buttons.scss b/src/vendor/bootstrap-4.6.2/scss/mixins/_buttons.scss new file mode 100644 index 00000000..d6235aa2 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/mixins/_buttons.scss @@ -0,0 +1,110 @@ +// Button variants +// +// Easily pump out default styles, as well as :hover, :focus, :active, +// and disabled options for all buttons + +@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) { + color: color-yiq($background); + @include gradient-bg($background); + border-color: $border; + @include box-shadow($btn-box-shadow); + + @include hover() { + color: color-yiq($hover-background); + @include gradient-bg($hover-background); + border-color: $hover-border; + } + + &:focus, + &.focus { + color: color-yiq($hover-background); + @include gradient-bg($hover-background); + border-color: $hover-border; + @if $enable-shadows { + @include box-shadow($btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5)); + } @else { + // Avoid using mixin so we can pass custom focus shadow properly + box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5); + } + } + + // Disabled comes first so active can properly restyle + &.disabled, + &:disabled { + color: color-yiq($background); + background-color: $background; + border-color: $border; + // Remove CSS gradients if they're enabled + @if $enable-gradients { + background-image: none; + } + } + + &:not(:disabled):not(.disabled):active, + &:not(:disabled):not(.disabled).active, + .show > &.dropdown-toggle { + color: color-yiq($active-background); + background-color: $active-background; + @if $enable-gradients { + background-image: none; // Remove the gradient for the pressed/active state + } + border-color: $active-border; + + &:focus { + @if $enable-shadows and $btn-active-box-shadow != none { + @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5)); + } @else { + // Avoid using mixin so we can pass custom focus shadow properly + box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5); + } + } + } +} + +@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) { + color: $color; + border-color: $color; + + @include hover() { + color: $color-hover; + background-color: $active-background; + border-color: $active-border; + } + + &:focus, + &.focus { + box-shadow: 0 0 0 $btn-focus-width rgba($color, .5); + } + + &.disabled, + &:disabled { + color: $color; + background-color: transparent; + } + + &:not(:disabled):not(.disabled):active, + &:not(:disabled):not(.disabled).active, + .show > &.dropdown-toggle { + color: color-yiq($active-background); + background-color: $active-background; + border-color: $active-border; + + &:focus { + @if $enable-shadows and $btn-active-box-shadow != none { + @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5)); + } @else { + // Avoid using mixin so we can pass custom focus shadow properly + box-shadow: 0 0 0 $btn-focus-width rgba($color, .5); + } + } + } +} + +// Button sizes +@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) { + padding: $padding-y $padding-x; + @include font-size($font-size); + line-height: $line-height; + // Manually declare to provide an override to the browser default + @include border-radius($border-radius, 0); +} diff --git a/src/vendor/bootstrap-4.6.2/scss/mixins/_gradients.scss b/src/vendor/bootstrap-4.6.2/scss/mixins/_gradients.scss new file mode 100644 index 00000000..88c4d64b --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/mixins/_gradients.scss @@ -0,0 +1,45 @@ +// Gradients + +@mixin gradient-bg($color) { + @if $enable-gradients { + background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x; + } @else { + background-color: $color; + } +} + +// Horizontal gradient, from left to right +// +// Creates two color stops, start and end, by specifying a color and position for each color stop. +@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) { + background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); + background-repeat: repeat-x; +} + +// Vertical gradient, from top to bottom +// +// Creates two color stops, start and end, by specifying a color and position for each color stop. +@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) { + background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); + background-repeat: repeat-x; +} + +@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) { + background-image: linear-gradient($deg, $start-color, $end-color); + background-repeat: repeat-x; +} +@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) { + background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color); + background-repeat: no-repeat; +} +@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) { + background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color); + background-repeat: no-repeat; +} +@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) { + background-image: radial-gradient(circle, $inner-color, $outer-color); + background-repeat: no-repeat; +} +@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) { + background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent); +} diff --git a/src/vendor/bootstrap-4.6.2/scss/mixins/_hover.scss b/src/vendor/bootstrap-4.6.2/scss/mixins/_hover.scss new file mode 100644 index 00000000..409f8244 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/mixins/_hover.scss @@ -0,0 +1,37 @@ +// Hover mixin and `$enable-hover-media-query` are deprecated. +// +// Originally added during our alphas and maintained during betas, this mixin was +// designed to prevent `:hover` stickiness on iOS-an issue where hover styles +// would persist after initial touch. +// +// For backward compatibility, we've kept these mixins and updated them to +// always return their regular pseudo-classes instead of a shimmed media query. +// +// Issue: https://github.com/twbs/bootstrap/issues/25195 + +@mixin hover() { + &:hover { @content; } +} + +@mixin hover-focus() { + &:hover, + &:focus { + @content; + } +} + +@mixin plain-hover-focus() { + &, + &:hover, + &:focus { + @content; + } +} + +@mixin hover-focus-active() { + &:hover, + &:focus, + &:active { + @content; + } +} diff --git a/src/vendor/bootstrap-4.6.2/scss/mixins/_lists.scss b/src/vendor/bootstrap-4.6.2/scss/mixins/_lists.scss new file mode 100644 index 00000000..251cb073 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/mixins/_lists.scss @@ -0,0 +1,7 @@ +// Lists + +// Unstyled keeps list items block level, just removes default browser padding and list-style +@mixin list-unstyled() { + padding-left: 0; + list-style: none; +} diff --git a/src/vendor/bootstrap-4.6.2/scss/mixins/_screen-reader.scss b/src/vendor/bootstrap-4.6.2/scss/mixins/_screen-reader.scss new file mode 100644 index 00000000..70b677e3 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/mixins/_screen-reader.scss @@ -0,0 +1,34 @@ +// Only display content to screen readers +// +// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/ +// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/ + +@mixin sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; // Fix for https://github.com/twbs/bootstrap/issues/25686 + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; + } +} diff --git a/src/vendor/bootstrap-4.6.2/scss/mixins/_transition.scss b/src/vendor/bootstrap-4.6.2/scss/mixins/_transition.scss new file mode 100644 index 00000000..54870bf6 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/mixins/_transition.scss @@ -0,0 +1,26 @@ +// stylelint-disable property-disallowed-list +@mixin transition($transition...) { + @if length($transition) == 0 { + $transition: $transition-base; + } + + @if length($transition) > 1 { + @each $value in $transition { + @if $value == null or $value == none { + @warn "The keyword 'none' or 'null' must be used as a single argument."; + } + } + } + + @if $enable-transitions { + @if nth($transition, 1) != null { + transition: $transition; + } + + @if $enable-prefers-reduced-motion-media-query and nth($transition, 1) != null and nth($transition, 1) != none { + @media (prefers-reduced-motion: reduce) { + transition: none; + } + } + } +} diff --git a/src/vendor/bootstrap-4.6.2/scss/utilities/_screenreaders.scss b/src/vendor/bootstrap-4.6.2/scss/utilities/_screenreaders.scss new file mode 100644 index 00000000..9f26fde0 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/utilities/_screenreaders.scss @@ -0,0 +1,11 @@ +// +// Screenreaders +// + +.sr-only { + @include sr-only(); +} + +.sr-only-focusable { + @include sr-only-focusable(); +} diff --git a/src/vendor/bootstrap-4.6.2/scss/vendor/_rfs.scss b/src/vendor/bootstrap-4.6.2/scss/vendor/_rfs.scss new file mode 100644 index 00000000..e453f441 --- /dev/null +++ b/src/vendor/bootstrap-4.6.2/scss/vendor/_rfs.scss @@ -0,0 +1,228 @@ +// stylelint-disable property-blacklist, scss/dollar-variable-default + +// SCSS RFS mixin +// +// Automated responsive font sizes +// +// Licensed under MIT (https://github.com/twbs/rfs/blob/v8.x/LICENSE) + +// Configuration + +// Base font size +$rfs-base-font-size: 1.25rem !default; +$rfs-font-size-unit: rem !default; + +@if $rfs-font-size-unit != rem and $rfs-font-size-unit != px { + @error "`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`."; +} + +// Breakpoint at where font-size starts decreasing if screen width is smaller +$rfs-breakpoint: 1200px !default; +$rfs-breakpoint-unit: px !default; + +@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem { + @error "`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`."; +} + +// Resize font size based on screen height and width +$rfs-two-dimensional: false !default; + +// Factor of decrease +$rfs-factor: 10 !default; + +@if type-of($rfs-factor) != "number" or $rfs-factor <= 1 { + @error "`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1."; +} + +// Generate enable or disable classes. Possibilities: false, "enable" or "disable" +$rfs-class: false !default; + +// 1 rem = $rfs-rem-value px +$rfs-rem-value: 16 !default; + +// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14 +$rfs-safari-iframe-resize-bug-fix: false !default; + +// Disable RFS by setting $enable-responsive-font-sizes to false +$enable-responsive-font-sizes: true !default; + +// Cache $rfs-base-font-size unit +$rfs-base-font-size-unit: unit($rfs-base-font-size); + +@function divide($dividend, $divisor, $precision: 10) { + $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1); + $dividend: abs($dividend); + $divisor: abs($divisor); + @if $dividend == 0 { + @return 0; + } + @if $divisor == 0 { + @error "Cannot divide by 0"; + } + $remainder: $dividend; + $result: 0; + $factor: 10; + @while ($remainder > 0 and $precision >= 0) { + $quotient: 0; + @while ($remainder >= $divisor) { + $remainder: $remainder - $divisor; + $quotient: $quotient + 1; + } + $result: $result * 10 + $quotient; + $factor: $factor * .1; + $remainder: $remainder * 10; + $precision: $precision - 1; + @if ($precision < 0 and $remainder >= $divisor * 5) { + $result: $result + 1; + } + } + $result: $result * $factor * $sign; + $dividend-unit: unit($dividend); + $divisor-unit: unit($divisor); + $unit-map: ( + "px": 1px, + "rem": 1rem, + "em": 1em, + "%": 1% + ); + @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) { + $result: $result * map-get($unit-map, $dividend-unit); + } + @return $result; +} + +// Remove px-unit from $rfs-base-font-size for calculations +@if $rfs-base-font-size-unit == "px" { + $rfs-base-font-size: divide($rfs-base-font-size, $rfs-base-font-size * 0 + 1); +} +@else if $rfs-base-font-size-unit == "rem" { + $rfs-base-font-size: divide($rfs-base-font-size, divide($rfs-base-font-size * 0 + 1, $rfs-rem-value)); +} + +// Cache $rfs-breakpoint unit to prevent multiple calls +$rfs-breakpoint-unit-cache: unit($rfs-breakpoint); + +// Remove unit from $rfs-breakpoint for calculations +@if $rfs-breakpoint-unit-cache == "px" { + $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1); +} +@else if $rfs-breakpoint-unit-cache == "rem" or $rfs-breakpoint-unit-cache == "em" { + $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value)); +} + +// Internal mixin that adds disable classes to the selector if needed. +@mixin _rfs-disable-class { + @if $rfs-class == "disable" { + // Adding an extra class increases specificity, which prevents the media query to override the font size + &, + .disable-responsive-font-size &, + &.disable-responsive-font-size { + @content; + } + } + @else { + @content; + } +} + +// Internal mixin that adds enable classes to the selector if needed. +@mixin _rfs-enable-class { + @if $rfs-class == "enable" { + .enable-responsive-font-size &, + &.enable-responsive-font-size { + @content; + } + } + @else { + @content; + } +} + +// Internal mixin used to determine which media query needs to be used +@mixin _rfs-media-query($mq-value) { + @if $rfs-two-dimensional { + @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) { + @content; + } + } + @else { + @media (max-width: #{$mq-value}) { + @content; + } + } +} + +// Responsive font size mixin +@mixin rfs($fs, $important: false) { + // Cache $fs unit + $fs-unit: if(type-of($fs) == "number", unit($fs), false); + + // Add !important suffix if needed + $rfs-suffix: if($important, " !important", ""); + + // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value + @if not $fs-unit or $fs-unit != "" and $fs-unit != "px" and $fs-unit != "rem" or $fs == 0 { + font-size: #{$fs}#{$rfs-suffix}; + } + @else { + // Remove unit from $fs for calculations + @if $fs-unit == "px" { + $fs: divide($fs, $fs * 0 + 1); + } + @else if $fs-unit == "rem" { + $fs: divide($fs, divide($fs * 0 + 1, $rfs-rem-value)); + } + + // Set default font size + $rfs-static: if($rfs-font-size-unit == rem, #{divide($fs, $rfs-rem-value)}rem, #{$fs}px); + + // Only add the media query if the font size is bigger than the minimum font size + @if $fs <= $rfs-base-font-size or not $enable-responsive-font-sizes { + font-size: #{$rfs-static}#{$rfs-suffix}; + } + @else { + // Calculate the minimum font size for $fs + $fs-min: $rfs-base-font-size + divide($fs - $rfs-base-font-size, $rfs-factor); + + // Calculate difference between $fs and the minimum font size + $fs-diff: $fs - $fs-min; + + // Base font-size formatting + $min-width: if($rfs-font-size-unit == rem, #{divide($fs-min, $rfs-rem-value)}rem, #{$fs-min}px); + + // Use `vmin` if two-dimensional is enabled + $variable-unit: if($rfs-two-dimensional, vmin, vw); + + // Calculate the variable width between 0 and $rfs-breakpoint + $variable-width: #{divide($fs-diff * 100, $rfs-breakpoint)}#{$variable-unit}; + + // Set the calculated font-size + $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix}; + + // Breakpoint formatting + $mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit}); + + @include _rfs-disable-class { + font-size: #{$rfs-static}#{$rfs-suffix}; + } + + @include _rfs-media-query($mq-value) { + @include _rfs-enable-class { + font-size: $rfs-fluid; + } + + // Include safari iframe resize fix if needed + min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null); + } + } + } +} + +// The font-size & responsive-font-size mixins use RFS to rescale the font size +@mixin font-size($fs, $important: false) { + @include rfs($fs, $important); +} + +@mixin responsive-font-size($fs, $important: false) { + @include rfs($fs, $important); +}