When assembling precision-tolerance parts, humans have an ideal set of capabilities. Combining geometrical understanding, visual guidance, tactile confirmation, and compliant force/torque (F/T) control, it is possible for a human to quickly assemble components despite micrometer tolerances. We take this remarkable suite of abilities for granted. To prove it, just recall that the number-one cliché child’s toy is all about fitting blocks through matching holes in a box. Our babies can do assembly tasks with ease.
+
+
Now, the moment you consider handing the child’s block off to a modern industrial robot, you start to encounter some of a robot’s greatest disadvantages. A robot is, by design, a highly rigid precision machine. The robot must be fed very precise information about the orientation and position of the goal - the box in this case - and it cannot correct mid-action to comply as nearly-aligned pieces try to slide into place. If provided erroneous measurements - even ones that are just a few millimeters off - it will quite simply crush the box, the block, and possibly itself. Rigidity is inherently a difficult obstacle to performing mechanical assembly when high-accuracy measurement and fixturing are impractical.
+
+
Compliant Control
+
+
Despite these difficulties, a respected method has been developed for robots to imitate human flexibility and responsiveness, called compliant feedback control. By rapidly controlling the motion of the robot in response to 6DOF F/T information, a robot can imitate the soft compliant behavior of a human grip. This can be achieved with any modern robot using an after-market 6-axis load cell mounted between the tool flange and the gripper.
+
+
This feedback enables detection of F/T “wrenches” acting on the gripper, so the control system can smoothly move to comply. Pressing on the front of the gripper makes the robot retract. Twisting the gripper makes the robot turn. The robot very convincingly pretends to be much less rigid. When displaced, it applies a constant gentle force toward its desired goal position and patiently waits until permitted to reach it.
+
+
This permits the use of tactile methods of operation - the use of touch to sense the environment and make decisions. The system can correlate data about reaction forces, robot position, and robot velocity to detect the collision mode which best describes the interaction of the robot and the environment. For instance, collision with a flat surface may be identified by sharp resistance in one direction but negligible friction in other directions. The alignment of a cylindrical peg with a receptacle may be detected by resistance in all directions except one, the vector parallel with the receptacle axis. By characterizing these interactions, a reliable understanding of the contact state between the robot and workpiece can be formed.
+
+
Researchers have been experimenting with and implementing compliant assembly systems for years. The Kuka iiwa comes pre-installed with certain compliant features built in. Other companies such as Franka Emika have designed robots specifically to achieve high performance in feedback-based assembly. And on the software side, open-source libraries exist which can control hardware through high-level position or velocity interfaces. In particular, our work makes extensive use of the cartesian_controllers libraries, developed at the FZI Research Center for Information Technology.
+
+
The ConnTact Framework
+
+
NIST hopes to expand the realm of assembly research to smaller developers with less abundant resources and permit a much more agile workflow. To that end, NIST is collaborating with SwRI to develop an open-source framework for compliant assembly tasks, called ConnTact. This framework is meant to provide tools which create a bridge directly from hardware configuration to the real algorithmic development required to accomplish difficult tasks. It also standardizes interfaces to permit the community to share solutions and re-implement them with new hardware for new applications. The framework takes in information about the robot and task location and provides an environment where the user can easily develop tactile algorithms. The overall goal is to significantly ease the load on an end-user who wants to develop a new assembly applications anywhere on the spectrum from straighforward repeatable tasks to complex problems that leverage AI and reinforcement learning methods.
+
+
The key to this framework is the simplification of interfaces. This permits any robot with force sensing and compliance control features to be used with any algorithm. To configure for a given robot, a developer must feed live force, torque, and position data into the Assembly Tools package. In addition, for each task, the task frame, or approximate location and rotation of the task relative to the robot, must be imported. With this basic input, the package provides a development framework with 3 major features: Generalization, Visualization, and Modularity.
+
+
Main Features
+
+
Generalization: The framework seeks to generalize algorithms to any location or task. This is accomplished by transforming all inputs - robot pose, force, and torque inputs - into task space, that is, it converts all spatial measurements to be relative to the task frame. For example, in the case of an Ethernet connector insertion task, given the location of the Ethernet socket relative to the robot, the development environment would provide position data to the algorithm relative to the socket. A command to move the plug to position (x,y,z) = (0,0,0.05) would place the Ethernet plug 5cm from the socket. A force of (0,0,10) always indicates that the gripper is experiencing a force away from the socket and parallel to its axis, even if the socket were upside-down on the underside of a workpiece. This allows the user to focus their efforts on algorithm development with the confidence that their work is applicable to any task location or orientation.
+
+
Visualization: The framework provides visualization options using Python plotting libraries familiar to any modern programmer. Input position and forces are mathematically processed to provide reliable speed, force, torque, and position data streams which are easily displayed at runtime. This built-in visualization is meant to equip every program with a greater degree of transparency.
+
+
Modularity: Finally, we facilitate modular algorithm development with a state machine-based control loop. The example implementation specifies a finite number of states and provides the conditions needed to transition between them. The user can reuse existing algorithmic motion routines from the open-source repository to rapidly produce useful programs. They can also develop their own algorithm modules and easily add them to existing program structures.
+
+
Some sample algorithm modules currently included:
+
+
Moving in a linear direction until a flat surface is detected.
+Searching in a spiral pattern across a surface for a low spot, such as a connector falling a short way into its socket.
+Moving compliantly in a specified direction until colliding with a rigid obstacle.
+Probing in different directions to determine rigid constraint locations.
+
+
Code Release
+
+
The basic WIP framework is being made available publicly now at https://github.com/swri-robotics/ConnTact, and work will proceed over the coming months to add features and documentation. NIST and SwRI welcome any feedback to improve the framework. We aim to make a simple, straightforward, and powerful system to bring agile compliant robotic assembly to a wider developer community and bring tactile robot sensing to the forefront.
+
+
+
+
+
\ No newline at end of file
diff --git a/2021/12/08/ros-industrial-is-buzzing.html b/2021/12/08/ros-industrial-is-buzzing.html
new file mode 100644
index 0000000..c3101ac
--- /dev/null
+++ b/2021/12/08/ros-industrial-is-buzzing.html
@@ -0,0 +1,216 @@
+
+
+
+
+
+
+ ROS-Industrial is buzzing | ROS-Industrial Consortium
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ROS-Industrial is buzzing
+
By ROS-Industrial Europe, December 08, 2021
+
+
+
This year’s ROS-Industrial Conference took place on December 01-02, 2021 as a virtual event. With more than 300 registrants it was the largest conference of the so far 9 conferences that have been organized since 2012. In this article, we try to capture the major developments around the ROS-Industrial initiative presented during the conference.
+
+
At the conference Drag & Bot explained how their system for easy robot programming is being used by industry and showed a number of example applications. Their software is based on ROS and enables programming different industrial robots using a simple drag and drop interface. Drag & Bot also offers an interface for integrating external ROS programs and can be used by developers to deploy their ROS based solutions to industry.
+
+
Another company that has today more than 450 mobile robots running their ROS based navigation is Node Robotics. Robots running Node Robotics software are deployed in BMW’s production facilities and in other companies. Node Robotics software offers easy integration of mobile robots of different types into one fleet. The ROS-based software system enables operating a single AMR, data sharing between AMRs as well as building custom fleet management systems. The companies first deployment of freely navigating AMRs was in 2016 in a plant of the automobile producer Audi.
+
+
The ROS-Industrial ecosystem is producing a number of cutting edge solutions integrating ROS with industry. Pilz is providing a portfolio of safety components that can be used to build a safety system around ROS based mobile robots. The center of the portfolio is the laser scanner PSENscan that can monitor configurable safety zones for the robot. The PSENscan also offers functionalities for integrating speed monitoring and it integrates with ROS via an open source driver.
+
+
Progress has also been made with regards to real-time execution in ROS2 systems. Andrei Kholodnyi (Wind River), co-lead of the ROS2 real-time working group, presented the groups work. Members of the working group have developed a number of new real-time optimized ROS2 executors. Another available component provided by the working group is a Raspberry PI4 based real-time benchmarking system with RT_PREEMPT kernel for Ubuntu 20.04. ROS2 developers that are not satisfied with the real-time performance of RT patched Linux can also choose to switch to Wind River’s vxWorks or Blackberry’s QNX, both systems executing ROS2 applications.
+
+
As previously mentioned, Drag & Bot’s software offers one way to integrate ROS into an industrial robotics platform but more solutions are becoming available. Another approach was presented by Universal Robots (UR) and Forschungszentrum Informatik (FZI) who have been collaborating to develop an advanced ROS interface for UR’s robots. The work enables direct integration of externally running ROS-based applications into URScript programs running on the robot. During the conference they showed a new interface that enable cartesian control and speed scaling for industrial robots from within ROS. UR also showed a prototype of a URCap that enables integration with ROS at the conference. The goal of the development is to leverage ROS’ capabilities for UR’s robots and making them available via URCaps.
+
+
Canonical the publisher of Ubuntu also presented their solutions for deploying robot software. Their solution mainly consists of snap and Ubuntu Core. Snap is a solution to create containerized and easily deployable software applications. Canonical claims that snaps have advantages for embedded systems, compared to other solutions such as docker, because they are more easily integrated with embedded hardware. Ubuntu Core is a minimal operating system including application packages which is based on snap containers which enables a modular and simple architecture for embedded systems. The Canonical software solutions are optimized for ROS and they are already used in industry e.g. in Bosch Rexroth’s CtrlX. Snaps are becoming another way of integrating ROS in industrial control systems and software platforms of the future.
+
+
Ericsson and eProsima presented their work of integrating ROS2 with 5G systems and thus moving ROS2 towards enabling distributed real-time systems. The two organizations collaborated on developing an interface for ROS2 and the underlying DDS middleware implementations to enable creating unique IP flows for specified ROS2 communications and setting 5G quality of service parameters for these IP flows. The interface has been integrated in eProsima’s FastDDS. FastDDS is also the default middleware for the next longterm release ROS2 Humble (May 2022) which means integration of ROS2 with 5G quality of service is becoming simple.
+
+
Another interesting development was presented by Xilinx. Xilinx and AMD are working on providing prime hardware acceleration support for ROS2. The development of hardware acceleration interfaces is driven by the ROS2 hardware acceleration working group. Xilinx is developing the Kria Robotics Stack based on the open interfaces defined by the working group. Major features of the development are easy integration of embedded targets into the ROS2 build system and tools and an API for defining which parts of the ROS2 computation graph is run on CPU or e.g. FPGA. This development promises to make ROS2 a prime platform for deterministic and lightning fast computations that are needed for future robotics applications. Other companies such as NVIDIA are also targeting ROS2 for their hardware acceleration solutions as Katherine Scott (Open Robotics) stated in her presentation.
+
+
Manufacturing systems are becoming a target for cyber criminals. As robots are deployed in all kind of systems that are essential for a countries economy they can even become a prime target in potential cyberwar scenarios. The ROS-Industrial community is aware of the arising problems and members Alias Robotics, Trend Micro as well as Canonical have presented research findings, solutions and services for ROS developers. Alias Robotics provides solutions such as the Robot Immune System (end point protection) as well as services for identifying potential risks in robotic products such as Threat Modeling. Alias Robotics and Trend Micro have together analyzed the DDS standard which is ROS2’s prime middleware and used in a wide range of applications such as medical, automotive and space. A number of security issues where discovered and reported. Canonical provides longterm support for end of life ROS distributions with security updates and the previously described deployment toolchain based on Ubuntu Core and snap which simplifies security updates during production.
+
+
Advanced manipulation has always been a strong suit of the ROS ecosystem. This year’s conference made abundantly clear that this is also true for ROS2. PickNik main driver behind moveit2 gave an overview of new features currently being developed, notably mobile manipulation and hybrid planning. A mobile manipulation demonstration for moveit2 was developed together with HelloRobot (workshop). A demonstrator for hybrid planning which integrates a global planner and local planner is being developed together with Fraunhofer IPA and targeting multi-layer welding. The goal is to perform scanning, welding and local planning at the same time to achieve higher process quality. Another talk focusing on robotic welding was contributed by IRT Jules Vernes that presented how they leveraged ROS for building a lightweight welding robot for mobile welding applications from scratch. They were able to design hardware and controller within a year and create a working prototype. SwRI has developed a ROS2 demonstrator for Scan & Plan applications (workshop).
+
+
ARTC is developing software tools for collision avoidance in dynamic environments. Currently, obstacle avoidance during motion is not easily available for robot arms in ROS2. Therefore, ARTC has developed a dynamic safety joint trajectory controller, that integrates with motion planning solutions such as moveit2 and tesseract. The controller includes collision checking, speed scaling and re-planning. Average execution frequencies of more than 200 Hz are possible on commercial-off-the-shelf hardware.
+
+
Software for modern robot systems is becoming more and more complex. Development and testing is becoming more and more difficult. It is time to work on handling the rising complexity of robotics development. Fraunhofer IPA presented their work on a model-driven development toolchain for ROS-based systems. The toolchain enables extracting models from available handwritten ROS components, defining ROS systems of existing and new components using a graphical tool and deploying the defined systems in different fashions i.e. ROS package or a complete docker container. The toolchain is currently in alpha state and heavily worked on.
+
+
SpaceROS and other news
+
+
+
+
The space industry in the US is on the rise and with it is the interest in robotics solutions for space. ROS is already deployed in a number of non-critical space applications. Open Robotics and PickNik are plotting the next big step for ROS - SpaceROS - qualifying ROS and moveit for mission critical space applications.
+
+
+
TurtleBot4 is coming in 2022 with a base from IRobot
+
+
+
+
Summary
+
+
This year’s conference showed that ROS is being commercially deployed in industry and we are seeing that industrial robotics platform providers (UR, Drag & Bot) are opening their platforms for ROS. Additionally, a number of supplier companies are providing key technologies for building safety systems around ROS-based robot applications. Furthermore, ROS2 has many configuration options for achieving real-time performance and industrial operating system developers such as Blackberry and Wind River are supporting ROS2. ROS2 is becoming a prime robotics platform for new technologies such as 5G and hardware acceleration thus enabling the robot applications of the future. ROS2’s security is moving in the focus of and being monitored by the security research community and a number of specialized security solution providers are available. With ROS2’s cutting edge motion planning capabilities this means building industrial robotics applications with ROS2 and deploying them to industry is becoming much easier.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..55dc4f1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,112 @@
+# ROS-Industrial Website
+
+
+
+## Installing local dependencies
+Follow these [instructions](https://jekyllrb.com/docs/installation/ubuntu/).
+
+## Building locally
+In file `_config.yaml` comment the prefix line and save.
+First time after repo download probably do:
+```
+bundle install
+```
+
+Then use jekyll to build:
+
+```
+bundle exec jekyll serve
+```
+
+## Adding a contributer
+
+Add a .md file with the following contents under `_people/` and add a mugshot under `assets/mugshots`. Files should be named as the contributer with dashes as separators.
+
+```
+---
+name: [Contributer name]
+position: [Contributer position]
+image: /assets/mugshots/[mugshot file]
+---
+short cv
+```
+
+## Adding a package
+Add a .md file with the following contents under `_packages/`. Files should be named as the package with dashes as separators.
+
+```
+---
+name: [package name - should be easy to understand]
+description: [description]
+category: [Driver| Automation Tool| Motion Tool | Development Tool]
+repo: [link to reop]
+ros1: [y|n]
+ros2: [y|n]
+level: [2 - Consortium & Vendor | 1 - Vendor | 0 - Community]
+---
+```
+
+## Adding a member
+Add a .md file with the following contents under `_members/` and a logo under /assets/member-logos/. .md Files should be named as the package with dashes as separators.
+
+```
+---
+name: [Organisation]
+type: [Type]
+logo: /assets/member-logos/logo_[Organisation].png
+---
+[Description]
+```
+
+## Adding a training
+Add a .md file with the following contents under `_trainings/` and an image under /assets/images/. Files should be named as the package with dashes as separators.
+
+```
+---
+title: [title]
+organiser: [Organiser]
+image: /assets/images/[image]
+description: [description]
+contact: [contact]
+mail: [mail]
+---
+```
+
+## Adding an event
+Add a .md file with the following contents under `_events/` and an image under /assets/images/. Files should be named as the event with date as suffix with dashes as separators.
+
+```
+---
+organiser: [Organiser]
+comments: false
+start_date: [e.g. 2022-06-06 09:00:00+00:00]
+end_date: [e.g. 2022-06-06 09:00:00+00:00]
+location: [location]
+slug: [slug]
+title: [title]
+description: [short description]
+media_type: [image|video]
+media_link: [where image is stored | youtube link ]
+layout: event
+---
+
+[Long description]
+```
+
+## Adding an blog post
+Add a .md file with the following contents under `_posts_/` and an image under /assets/images/. Files should be named as the event with date as prefix with dashes as separators.
+
+```
+---
+author: [author]
+comments: false
+date: [date e.g. 2013-05-06 08:15:12+00:00]
+slug: [slug]
+title: [title]
+media_type: [video|image]
+media_link: [link]
+description: [short description]
+layout: post
+---
+[post in markdown or html]
+```
\ No newline at end of file
diff --git a/about/index.html b/about/index.html
new file mode 100644
index 0000000..2d8a76d
--- /dev/null
+++ b/about/index.html
@@ -0,0 +1,278 @@
+
+
+
+
+
+
+ History | ROS-Industrial Consortium
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
History
+ Here you find some key events that have helped shaping the ROS-Industrial Consortium.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
January, 2012
+
ROS-Industrial Organisation on Github
+
The ROS-Industrial repository was founded on GitHub by Shaun Edwards. This development was fueled by a collaboration between Willow Garage, Southwest Research Institute and Yaskawa.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
October, 2012
+
First ROS-Industrial Workshop in Europe
+
Fraunhofer IPA organised the first workshop dicussing the usage of ROS in industrial use cases and protoyping the European ROS-Industrial initiative.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
January, 2013
+
ROS-Industrial Consortium Americas founded
+
The ROS-Industrial Consortium was founded by Southwest Research Institute in San Antonio, Texas.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
January, 2014
+
ROS-Industrial Consortium Europe founded
+
The ROS-Industrial Consortium Europe was founded by Fraunhofer IPA in Stuttgart, Germany.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
January, 2016
+
ROS-Industrial Consortium Asia & Pacfic founded
+
The ROS-Industrial Consortium Asia & Pacific was founded by ARTC in Singapore.
ROS-Industrial Europe joins forces with ABB, Tu Delft, FH Aachen, Tecnalia and ITU and wins an EU-funded R&D project to develop the ROS-Industrial ecosystem.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
January, 2019
+
More than 80 members worldwide
+
After steady growth for since foundation, the consortium has more than 80 member organisations.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/about/people.html b/about/people.html
new file mode 100644
index 0000000..0cb7611
--- /dev/null
+++ b/about/people.html
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+ People | ROS-Industrial Consortium
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
People
+
+
+
+
+
+
+
+
+
+
Christoph Hellmann Santos
+
ROS-Industrial Europe
+
Christoph Hellmann Santos manages the ROS-Industrial Consortium Europe where he aims to foster adoption of open source software in industry. He joined Fraunhofer IPA in 2016, after finishing his studies of mechanical engineering at Karlsruhe Insititue of Technology and his diploma of engineering at Arts et Métiers ParisTech. At Fraunhofer IPA, he has been working in different research and technology transfer projects (ROBOTT-NET, ROSIN, agROBOfood and others). Since 2019, he manages the research group software engineering and system integration and in 2020 he took over the position of ROS-Industrial Consortium Europe Project Manager.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Levi Armstrong
+
ROS-Industrial Americas
+
Mr. Armstrong is the Technical Lead for the ROS-Industrial Consortium Americas and a Lead Engineer in the Adaptive Technologies Section at SwRI. Armstrong has developed technical knowledge in optimization-based motion planning, meshing, collision detection and calibration to develop custom automation solution for industry. Prior to his current role, Armstrong was an engineer at Bell Textron focusing on low-cost composite manufacturing to leverage automation in the areas of drilling, routing, deburring, machining, and heat treatments to meet aerospace engineering specifications. He holds a B.S. and M.E. in Aerospace Engineering from the University of Texas at Arlington.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Matt Robinson
+
ROS-Industrial Americas
+
Mr. Robinson is the Program Manager for the ROS-Industrial Consortium – Americas, in his current role he is tasked with setting the strategy and vision to align the open source development community with industry needs. Prior to his current role, Mr. Robinson was team leader for Caterpillar’s Manufacturing Technology Automation Research. Here, Mr. Robinson led development and deployment of automation tools to improve the performance and productivity of Caterpillar manufacturing facilities around the globe. Mr. Robinson, during this time, also led manufacturing value stream design initiatives that led to the deployment of over 50 robotic/automated manufacturing systems around the world. Mr. Robinson has a Master’s Degree in Welding Engineering from Ohio State University.
Create an open community and common software repository where researchers,
+ robotics professionals, and industrial controls experts can contribute robust and
+ reliable manufacturing related ROS software, combining the relative strengths
+ of ROS and existing technologies (i.e. combining ROS high level functionality with
+ the low level reliability and safety of robot controllers).
+
+
+
Over time ROS Industrial will be positioned to become the leader, and
+ standard, in advanced robotics software by presenting a new way to solve complex
+ challenges through the democratization of tools and capabilities, thus driving end user
+ value through new capability leverage, and solution provider value by focusing on the
+ new capability creation versus recreation of interfaces and building blocks.
` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `
`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `
` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`