## Components - box with highlights
`AuroraBoxWithHighlights` is a special container provided by Aurora that does not use projections. The primary purpose of this container is to provide a way to apply selection and rollover highlights on complex content that behaves as a single unit.
### Example
Every row in this vertical list is an `AuroraBoxWithHighlights`. Selection and rollover state facets are applied on the label - compare the light-on-dark visuals of unselected rows vs the dark-on-light visuals of the selected one.
Let's take a look at the moving parts. First we start with managing state, one for the lazy list and one for the selected index:
```kotlin
val lazyListState = rememberLazyListState()
val stateSelection = mutableStateOf(-1)
```
Next we get the `MessageFormat` object for fetching the locale-aware texts of each row:
```kotlin
val commandMf = MessageFormat(resourceBundle.getString("Group.entrySimple"))
```
And now the scrollable content itself that uses `AuroraBoxWithHighlights` to wrap the content of each row:
```kotlin
Box(modifier = Modifier.fillMaxSize().padding(6.dp)) {
val itemsList = (0 until itemCount).toList()
val backgroundColorScheme = AuroraSkin.colors.getBackgroundColorScheme(
decorationAreaType = AuroraSkin.decorationAreaType
)
val backgroundEvenRows = backgroundColorScheme.backgroundFillColor
val backgroundOddRows = backgroundColorScheme.accentedBackgroundFillColor
LazyColumn(
modifier = Modifier.fillMaxSize()
.padding(end = ScrollBarSizingConstants.DefaultScrollBarThickness),
state = lazyListState
) {
itemsIndexed(itemsList) { index, item ->
AuroraBoxWithHighlights(
modifier = Modifier.fillMaxWidth().height(32.dp)
.background(if (index % 2 == 0) backgroundEvenRows else backgroundOddRows),
selected = (stateSelection.value == item),
onClick = { stateSelection.value = item },
sides = Sides.ClosedRectangle,
content = {
LabelProjection(
contentModel = LabelContentModel(
text = commandMf.format(arrayOf(index)),
icon = icons[item % icons.size]
),
presentationModel = LabelPresentationModel(
inheritStateFromParent = true,
iconEnabledFilterStrategy = IconFilterStrategy.ThemedFollowText,
horizontalGapScaleFactor = 2.0f
)
).project()
}
)
}
}
AuroraVerticalScrollbar(
modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
adapter = rememberScrollbarAdapter(scrollState = lazyListState)
)
}
```
Let's take a closer look at all the parts:
- The top-level container is a `Box` that has two child composables, `LazyColumn` for the scrollable content and `AuroraVerticalScrollbar` for the scrollbar. Note the `Modifier.padding(end)` on the `LazyColumn` that "reserves" the space for the vertical scroll bar, and the usage of our `lazyListState` to keep the vertical scroll bar in sync with the current scroll state.
- Each item in the list is a wrapped `LabelProjection`. Note the `inheritStateFromParent=true` attribute on the presentation model that instructs Aurora to propagate the state (selected and rollover facets) from the wrapper down to the label projection, and the usage of `IconFilterStrategy.ThemedFollowText` to keep the icon painted in the same color as the label text.
- The wrapper around each label projection is our `AuroraBoxWithHighlights`. Note how it syncs its `selected` attribute with the `stateSelection` state variable, and then updates that state variable in `onClick` lambda.
### Next
Continue to [context menu](ContextMenu.md).