Skip to content

CardWindowHeader ​

A retro operating system window title bar featuring tri-color status lamps on the left, a centered monospace uppercase title, and ASCII-style window controls on the right. Supports a multi-mode adaptive architecture: serves as a purely decorative layer in presentation cards, or as full interactive control buttons with keyboard focus and accessibility semantics.

Preview ​

Preview

交互控制模式(工控实体按钮)

Control_Terminal_v3.0

> LAST_EVENT: 等待操作...

> 点击右侧 [ _ ] [ □ ] [ X ] 或左侧红黄绿指示灯可直接触发动作并支持 Tab 聚焦。

默认静态装饰模式

System Monitor v2.0

> CPU ██████████░░░░ 68%

> MEM ███████░░░░░░░ 47%

> STATUS: ALL SYSTEMS NOMINAL (静态展示,无 a11y 负担)

隐藏控制符(纯标题栏)

Read Only Panel
showControls 为 false 时右侧不渲染 ASCII 控制符,适合静态展示面板。

自定义操作区插槽

Config Editor
> actions 插槽优先级最高,可放置任意操作按钮。

Installation ​

pnpm dlx brutx-vue@latest add card-window-header

Usage ​

Basic Usage (Decorative) ​

vue
<script setup>
import { CardWindowHeader } from 'brutx-ui-vue'
</script>

<template>
    <div class="border-3 border-brutal shadow-brutal">
        <CardWindowHeader title="System Monitor v2.0" />
        <div class="p-4">Window body…</div>
    </div>
</template>

Interactive Control Mode ​

Enable window control actions with closable, minimizable, or maximizable. Supports Tab keyboard navigation, Enter / Space activation, and @close / @minimize / @maximize event handling.

vue
<script setup>
import { ref } from 'vue'
import { CardWindowHeader } from 'brutx-ui-vue'

const isCollapsed = ref(false)

function onClose() {
    console.log('Window closed')
}
function onMinimize() {
    isCollapsed.value = !isCollapsed.value
}
</script>

<template>
    <div class="border-3 border-brutal shadow-brutal">
        <CardWindowHeader
            title="Terminal_Shell"
            closable
            minimizable
            maximizable
            interactive-lamps
            @close="onClose"
            @minimize="onMinimize"
        />
        <div v-show="!isCollapsed" class="p-4">Collapsible console content…</div>
    </div>
</template>

Custom Actions Area Slot ​

The actions slot has highest priority and replaces the default control buttons with arbitrary action components.

vue
<template>
    <CardWindowHeader title="Config Editor">
        <template #actions>
            <Button size="sm" variant="accent">SAVE</Button>
        </template>
    </CardWindowHeader>
</template>

API Reference ​

CardWindowHeader — Props
NameTypeDefaultDescription
title
Required
string
—
The centered window title, styled in uppercase monospace text and truncated when too long.
Details

Declared type

string

Default value details

Not declared
—

Source

CardWindowHeader.vue:13

packages/ui/src/components/card-window-header/CardWindowHeader.vue

showControls
boolean | undefined
true
Shows static ASCII controls on the right when there is no actions slot and none of the three interactive controls are enabled.
Details

Declared type

boolean | undefined

Literal values

  • false
  • true

Default value details

Resolved value
true

Source

CardWindowHeader.vue:15

packages/ui/src/components/card-window-header/CardWindowHeader.vue

closable
boolean | undefined
false
Enables the close button on the right; an actions slot replaces this button.
Details

Declared type

boolean | undefined

Literal values

  • false
  • true

Default value details

Resolved value
false

Source

CardWindowHeader.vue:17

packages/ui/src/components/card-window-header/CardWindowHeader.vue

minimizable
boolean | undefined
false
Enables the minimize button on the right; an actions slot replaces this button.
Details

Declared type

boolean | undefined

Literal values

  • false
  • true

Default value details

Resolved value
false

Source

CardWindowHeader.vue:19

packages/ui/src/components/card-window-header/CardWindowHeader.vue

maximizable
boolean | undefined
false
Enables the maximize button on the right; an actions slot replaces this button.
Details

Declared type

boolean | undefined

Literal values

  • false
  • true

Default value details

Resolved value
false

Source

CardWindowHeader.vue:21

packages/ui/src/components/card-window-header/CardWindowHeader.vue

interactiveLamps
boolean | undefined
false
Makes the left lamps trigger their corresponding actions: red closes, yellow minimizes, and green maximizes.
  • When none of the three controls is enabled, all lamps are interactive. Otherwise, only lamps for enabled actions are interactive. The actions slot does not replace the left lamps.
Details

Declared type

boolean | undefined

Literal values

  • false
  • true

Default value details

Resolved value
false

Source

CardWindowHeader.vue:23

packages/ui/src/components/card-window-header/CardWindowHeader.vue

closeAriaLabel
string | undefined
undefined

Runtime fallback:When omitted or blank after trimming, uses the localized cardWindowHeader.close message.

The accessible name of the close button on the right.
Details

Declared type

string | undefined

Default value details

Resolved value
undefined
Runtime fallback
When omitted or blank after trimming, uses the localized cardWindowHeader.close message.

Applied by the component under the documented runtime conditions.

Source

CardWindowHeader.vue:25

packages/ui/src/components/card-window-header/CardWindowHeader.vue

minimizeAriaLabel
string | undefined
undefined

Runtime fallback:When omitted or blank after trimming, uses the localized cardWindowHeader.minimize message.

The accessible name of the minimize button on the right.
Details

Declared type

string | undefined

Default value details

Resolved value
undefined
Runtime fallback
When omitted or blank after trimming, uses the localized cardWindowHeader.minimize message.

Applied by the component under the documented runtime conditions.

Source

CardWindowHeader.vue:27

packages/ui/src/components/card-window-header/CardWindowHeader.vue

maximizeAriaLabel
string | undefined
undefined

Runtime fallback:When omitted or blank after trimming, uses the localized cardWindowHeader.maximize message.

The accessible name of the maximize button on the right.
Details

Declared type

string | undefined

Default value details

Resolved value
undefined
Runtime fallback
When omitted or blank after trimming, uses the localized cardWindowHeader.maximize message.

Applied by the component under the documented runtime conditions.

Source

CardWindowHeader.vue:29

packages/ui/src/components/card-window-header/CardWindowHeader.vue

class
string | undefined
undefined
Custom CSS classes merged onto the window header root container.
Details

Declared type

string | undefined

Default value details

Resolved value
undefined

Source

CardWindowHeader.vue:31

packages/ui/src/components/card-window-header/CardWindowHeader.vue

CardWindowHeader — Events
NameSignature or typeDescription
@close
[event: MouseEvent | KeyboardEvent]
Emitted when the close button or interactive red lamp is activated. The consumer performs the actual close action.
Details

Declared type

[event: MouseEvent | KeyboardEvent]

Source

CardWindowHeader.vue

packages/ui/src/components/card-window-header/CardWindowHeader.vue

@minimize
[event: MouseEvent | KeyboardEvent]
Emitted when the minimize button or interactive yellow lamp is activated. The consumer performs the actual collapse or minimize action.
Details

Declared type

[event: MouseEvent | KeyboardEvent]

Source

CardWindowHeader.vue

packages/ui/src/components/card-window-header/CardWindowHeader.vue

@maximize
[event: MouseEvent | KeyboardEvent]
Emitted when the maximize button or interactive green lamp is activated. The consumer performs the actual expand or maximize action.
Details

Declared type

[event: MouseEvent | KeyboardEvent]

Source

CardWindowHeader.vue

packages/ui/src/components/card-window-header/CardWindowHeader.vue

CardWindowHeader — Slots
NameSignature or typeDescription
#actions
{}
Replaces the entire right actions area, taking precedence over built-in interactive buttons and static ASCII controls.
Details

Declared type

{}

Source

CardWindowHeader.vue

packages/ui/src/components/card-window-header/CardWindowHeader.vue

Accessibility ​

  • Adaptive semantics: When no interactive props are set, controls and status lamps carry aria-hidden="true", producing zero screen reader clutter. When interactive props are provided, elements upgrade to semantic <button> tags with accurate aria-labels.
  • Keyboard navigation: Buttons feature FOCUS_RING_CLASSES high-contrast brutalist focus rings, supporting Tab key focus and Enter / Space activation.

Brute force builds.