# Ring Width, Color, and Offset
Utilities for creating outline rings with box-shadows. These are useful for focus states or highlighting elements without affecting layout.
- [Basic Usage](#basic-usage)
- [Quick Reference](#quick-reference)
- [Variants](#variants)
- [Responsive Design](#responsive-design)
- [Dark Mode](#dark-mode)
- [Arbitrary Values](#arbitrary-values)
- [Customizing Theme](#customizing-theme)
- [Related Documentation](#related-documentation)
```dart
// Default ring (3px blue-500)
WDiv(className: 'ring')
// Custom width and color
WDiv(className: 'ring-4 ring-red-500')
// With offset
WDiv(className: 'ring-2 ring-offset-2')
```
## Basic Usage
Use `ring-{width}` utilities to apply a solid box-shadow to an element. By default, this adds a 3px blue ring.
> [!NOTE]
> Rings in Wind are implemented using `BoxShadow` with a spread radius and zero blur. They do not take up space in the layout, unlike borders.
```dart
WDiv(
className: 'ring-4 ring-blue-500 rounded-lg p-4',
child: WText('Ring Example'),
)
```
## Quick Reference
| Class | Value | Description |
|:------|:------|:------------|
| `ring-0` | 0px | No ring |
| `ring-1` | 1px | 1px ring width |
| `ring-2` | 2px | 2px ring width |
| `ring` | 3px | Default ring width (3px) |
| `ring-4` | 4px | 4px ring width |
| `ring-8` | 8px | 8px ring width |
| `ring-inset` | - | Forces ring to be on the inside |
| `ring-offset-{width}` | - | Simulates an offset by adding a transparent gap |
## Variants
### Ring Color
Use `ring-{color}` to set the color of the ring. You can also use opacity modifiers like `/50`.
```dart
WDiv(className: 'ring-2 ring-blue-500')
WDiv(className: 'ring-2 ring-red-500/50') // 50% opacity
```
### Ring Offset
Use `ring-offset-{width}` to simulate space between the element and the ring. This is helpful for focus states on colored backgrounds.
```dart
// Creates a 2px gap between the element and the ring
WDiv(className: 'ring-2 ring-offset-2 ring-offset-white')
```
| Class | Value | Description |
|:------|:------|:------------|
| `ring-offset-0` | 0px | No offset |
| `ring-offset-1` | 1px | 1px offset |
| `ring-offset-2` | 2px | 2px offset |
| `ring-offset-4` | 4px | 4px offset |
| `ring-offset-8` | 8px | 8px offset |
### Ring Inset
Use `ring-inset` to force the ring to render on the inside of the element instead of the outside. This is useful for elements that shouldn't overflow their container.
```dart
WDiv(className: 'ring-2 ring-inset ring-pink-500')
```
## Responsive Design
Apply different ring utilities at different breakpoints using the standard `sm:`, `md:`, `lg:`, `xl:`, and `2xl:` prefixes.
```dart
WDiv(className: 'ring-2 md:ring-4 lg:ring-8')
```
## Dark Mode
Use the `dark:` prefix to apply different ring styles when the application is in dark mode.
```dart
WDiv(className: 'ring-slate-900/5 dark:ring-white/10')
```
## Arbitrary Values
If the built-in scale doesn't meet your needs, use bracket notation to apply custom values directly.
```dart
// Custom color
WDiv(className: 'ring-[#50d71e]')
// Custom color with opacity
WDiv(className: 'ring-[#50d71e]/50')
```
> [!NOTE]
> Currently, arbitrary values are supported for **colors only** (`ring-[#hex]`). Arbitrary widths (`ring-[10px]`) are not yet supported in the parser.
## Customizing Theme
To extend or override the default scale for rings, modify the `WindThemeData` in your app root.
```dart
WindTheme(
data: WindThemeData(
// Default color when no ring color class is present
ringColor: Colors.blue,
// Custom ring widths
ringWidths: {
'DEFAULT': 3,
'6': 6,
'10': 10,
},
// Custom offset widths
ringOffsets: {
'3': 3,
'6': 6,
},
),
child: MyApp(),
)
```
## Related Documentation
- [Borders](./borders.md)
- [Box Shadow](../styling/shadow.md)