/* @conduction/nextcloud-vue — Main CSS entry point */

/* Third-party stylesheets that the library's OWN components hard-require.
 *
 * The library must ship every stylesheet its components need — a consumer app
 * importing `@conduction/nextcloud-vue/css/index.css` gets a complete library,
 * and must never have to re-import a transitive dependency's CSS itself (that
 * duplicates the rules in every app and silently rots when this library changes
 * its internals).
 *
 * GridStack specifically: CnDashboardGrid/CnWidgetGrid and utils/gridStack.js
 * each do `import 'gridstack/dist/gridstack.min.css'`, but a JS-side side-effect
 * CSS import does not survive to consumers — a consumer's webpack tree-shakes
 * side-effect imports reached through an aliased package, and the rule set never
 * reaches dist/nextcloud-vue.css either (verified: 0 occurrences of gridstack's
 * base rules in the built sheet, while leaflet's 174 rules ARE there). The
 * consequence is severe and silent: GridStack >= 11 sets left/top INLINE but
 * takes `position:absolute` on items and `position:relative` on the container
 * from this stylesheet, so without it every widget falls into normal flow —
 * correct widths, no horizontal placement, and a whole 12-column dashboard
 * renders as one stacked column. Routing it through this aggregator instead
 * makes postcss-import inline it into the extracted sheet, which covers BOTH
 * resolution paths: consumers on the published dist AND consumers webpack-
 * aliased to `../nextcloud-vue/src`.
 */
.grid-stack{position:relative}.grid-stack-placeholder>.placeholder-content{background-color:rgba(0,0,0,.1);margin:0;position:absolute;width:auto;z-index:0!important}.grid-stack>.grid-stack-item{position:absolute;padding:0;top:0;width:var(--gs-column-width);height:var(--gs-cell-height)}.grid-stack>.grid-stack-item>.grid-stack-item-content{margin:0;position:absolute;width:auto;overflow-x:hidden;overflow-y:auto}.grid-stack>.grid-stack-item.size-to-content:not(.size-to-content-max)>.grid-stack-item-content{overflow-y:hidden}.grid-stack:not(.grid-stack-rtl)>.grid-stack-item{left:0}.grid-stack.grid-stack-rtl>.grid-stack-item{right:0}.grid-stack>.grid-stack-item>.grid-stack-item-content,.grid-stack>.grid-stack-placeholder>.placeholder-content{top:var(--gs-item-margin-top);right:var(--gs-item-margin-right);bottom:var(--gs-item-margin-bottom);left:var(--gs-item-margin-left)}.grid-stack-item>.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none;user-select:none;z-index:100}.grid-stack-item.ui-resizable-autohide>.ui-resizable-handle,.grid-stack-item.ui-resizable-disabled>.ui-resizable-handle{display:none}.grid-stack-item>.ui-resizable-ne,.grid-stack-item>.ui-resizable-nw,.grid-stack-item>.ui-resizable-se,.grid-stack-item>.ui-resizable-sw{background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="%23666" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 20 20"><path d="m10 3 2 2H8l2-2v14l-2-2h4l-2 2"/></svg>');background-repeat:no-repeat;background-position:center;z-index:101}.grid-stack-item>.ui-resizable-ne{transform:rotate(45deg)}.grid-stack-item>.ui-resizable-sw{transform:rotate(45deg)}.grid-stack-item>.ui-resizable-nw{transform:rotate(-45deg)}.grid-stack-item>.ui-resizable-se{transform:rotate(-45deg)}.grid-stack-item>.ui-resizable-nw{cursor:nw-resize;width:20px;height:20px;top:var(--gs-item-margin-top);left:var(--gs-item-margin-left)}.grid-stack-item>.ui-resizable-n{cursor:n-resize;height:10px;top:var(--gs-item-margin-top);left:25px;right:25px}.grid-stack-item>.ui-resizable-ne{cursor:ne-resize;width:20px;height:20px;top:var(--gs-item-margin-top);right:var(--gs-item-margin-right)}.grid-stack-item>.ui-resizable-e{cursor:e-resize;width:10px;top:15px;bottom:15px;right:var(--gs-item-margin-right)}.grid-stack-item>.ui-resizable-se{cursor:se-resize;width:20px;height:20px;bottom:var(--gs-item-margin-bottom);right:var(--gs-item-margin-right)}.grid-stack-item>.ui-resizable-s{cursor:s-resize;height:10px;left:25px;bottom:var(--gs-item-margin-bottom);right:25px}.grid-stack-item>.ui-resizable-sw{cursor:sw-resize;width:20px;height:20px;bottom:var(--gs-item-margin-bottom);left:var(--gs-item-margin-left)}.grid-stack-item>.ui-resizable-w{cursor:w-resize;width:10px;top:15px;bottom:15px;left:var(--gs-item-margin-left)}.grid-stack-item.ui-draggable-dragging>.ui-resizable-handle{display:none!important}.grid-stack-item.ui-draggable-dragging{will-change:left,right,top}.grid-stack-item.ui-resizable-resizing{will-change:width,height}.ui-draggable-dragging,.ui-resizable-resizing{z-index:10000}.ui-draggable-dragging>.grid-stack-item-content,.ui-resizable-resizing>.grid-stack-item-content{box-shadow:1px 4px 6px rgba(0,0,0,.2);opacity:.8}.grid-stack-animate,.grid-stack-animate .grid-stack-item{transition:left .3s,right .3s,top .3s,height .3s,width .3s}.grid-stack-animate .grid-stack-item.grid-stack-placeholder,.grid-stack-animate .grid-stack-item.ui-draggable-dragging,.grid-stack-animate .grid-stack-item.ui-resizable-resizing{transition:left 0s,right 0s,top 0s,height 0s,width 0s}.grid-stack>.grid-stack-item[gs-y="0"]{top:0}.grid-stack:not(.grid-stack-rtl)>.grid-stack-item[gs-x="0"]{left:0}.grid-stack.grid-stack-rtl>.grid-stack-item[gs-x="0"]{right:0}.gs-print-show{display:none}@media print{@page gs-landscape{size:landscape}@page gs-portrait{size:portrait}.grid-stack{display:block!important;height:auto!important;position:static!important}.grid-stack>.grid-stack-item{display:block!important;float:left!important;position:static!important;height:auto!important;left:auto!important;top:auto!important;width:calc(100% * var(--gs-w)/ var(--gs-columns,12))!important;break-inside:avoid!important;page-break-inside:avoid!important}.grid-stack>.grid-stack-item>.grid-stack-item-content{position:relative!important;height:auto!important;overflow:visible!important;white-space:normal!important;margin-top:var(--gs-item-margin-top)!important;margin-right:var(--gs-item-margin-right)!important;margin-bottom:var(--gs-item-margin-bottom)!important;margin-left:var(--gs-item-margin-left)!important;top:auto!important;right:auto!important;bottom:auto!important;left:auto!important}.gs-print-hide{display:none}.gs-print-show{display:block}.grid-stack>.grid-stack-item.gs-print-hide{display:none!important}.grid-stack>.grid-stack-item[gs-page-break=true],.grid-stack>.grid-stack-item[gs-print-orientation]{float:none!important;clear:both!important}.grid-stack>.grid-stack-item[gs-page-break=true]{page-break-before:always!important;break-before:page!important}.grid-stack>.grid-stack-item[gs-print-orientation=landscape]{page:gs-landscape;min-width:calc(100vmax * var(--gs-w)/ var(--gs-columns,12))!important}.grid-stack>.grid-stack-item[gs-print-orientation=portrait]{page:gs-portrait;min-width:calc(100vmin * var(--gs-w)/ var(--gs-columns,12))!important}.grid-stack>.grid-stack-item>.ui-resizable-handle{display:none!important}}

:root {
  --color-new: var(--color-text-maxcontrast-default);
}
/* ========================================
   @conduction/nextcloud-vue — Table Styles
   ======================================== */

/* Table Container */
.cn-table-container {
	background: var(--color-main-background);
	border-radius: var(--border-radius);
	box-shadow: 0 2px 4px var(--color-box-shadow);
	border: 1px solid var(--color-border);
	margin-bottom: calc(5 * var(--default-grid-baseline));
}

/* Horizontal scroll for wide tables lives HERE, not on `.cn-table-container`.
   `overflow-x: auto` on the container coerces its `overflow-y` from `visible`
   to `auto` (CSS forbids mixing `visible` with a non-visible value), which
   silently turns the container into the nearest scrollport. The sticky footer
   below then anchors to a container that never scrolls, so "View all" scrolled
   out of view with the rows instead of pinning to the bottom of the enclosing
   widget card. Keeping the overflow on an inner wrapper leaves the container
   transparent to scrolling, so the footer sticks to whichever ancestor really
   scrolls. */
.cn-data-table__scroll {
	overflow-x: auto;
}

.cn-table-container.cn-table-container--scrollable {
	max-height: 400px;
	overflow-y: auto;
}

/* Borderless: drop the card chrome so the table sits flush inside a parent that
   already provides a card (e.g. a CnWidgetWrapper dashboard slot). Folded in
   from the retired CnTableWidget. */
.cn-table-container.cn-table-container--borderless {
	border: none;
	border-radius: 0;
	box-shadow: none;
	background: transparent;
	margin-bottom: 0;
}

/* Fill: grow to the full height of a flex-column card/widget content area and
   push the footer to the bottom (via `margin-top: auto`) instead of letting it
   float directly under a short list. When the list overflows, the container
   grows past the parent and the sticky footer keeps it pinned. No-op when the
   parent has no constrained height. */
.cn-table-container.cn-table-container--fill {
	min-height: 100%;
	display: flex;
	flex-direction: column;
}

/* Optional card header + "View all" footer (folded from CnTableWidget). */
.cn-data-table__header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 12px 16px;
	border-bottom: 1px solid var(--color-border);
}

.cn-data-table__title {
	margin: 0;
	font-size: 14px;
	font-weight: 600;
}

.cn-data-table__count {
	font-size: 12px;
	color: var(--color-text-maxcontrast);
	background: var(--color-background-dark);
	padding: 2px 8px;
	border-radius: 10px;
}

.cn-data-table__footer {
	padding: 8px 16px;
	border-top: 1px solid var(--color-border);
	text-align: center;
	/* Keep the footer (e.g. "+ New" / "View all") pinned to the bottom of the
	   scroll region so it stays reachable while a long list scrolls. Sticks to
	   whichever ancestor scrolls — the container's own `--scrollable` region
	   (max-height 400) or the enclosing widget card's content area. The opaque
	   background stops scrolling rows from showing through behind it. */
	position: sticky;
	bottom: 0;
	background: var(--color-main-background);
}

/* Must follow the base `.cn-data-table__footer` rule above: it is the more
   specific selector, and stylelint's no-descending-specificity forbids the
   reverse order. Pushes the footer to the bottom of a `--fill` container
   (see the flex-column block near the top of this file). */
.cn-table-container--fill .cn-data-table__footer {
	margin-top: auto;
}

/* Rendered as <a :href> when the route resolves, as <button type="button">
   otherwise. The resets neutralise Nextcloud's global button chrome (border,
   background, 44px min-height, padding) so both variants look the same. */
.cn-data-table__view-all {
	display: inline;
	min-height: 0;
	margin: 0;
	padding: 0;
	border: none;
	background: none;
	font: inherit;
	font-size: 13px;
	color: var(--color-primary-element);
	cursor: pointer;
	text-decoration: none;
}

.cn-data-table__view-all:hover {
	text-decoration: underline;
}

/* Both variants are keyboard focusable, so they need a visible focus
   indicator (WCAG 2.4.7). The button reset above drops Nextcloud's, which
   would otherwise have covered the button but never the link. */
.cn-data-table__view-all:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
	border-radius: var(--border-radius, 3px);
	text-decoration: underline;
}

/* Base Table */
.cn-data-table {
	width: 100%;
	border-collapse: collapse;
	background-color: var(--color-main-background);
}

.cn-data-table th,
.cn-data-table td {
	padding: calc(3 * var(--default-grid-baseline));
	text-align: left;
	border-bottom: 1px solid var(--color-border);
	vertical-align: middle;
}

/* Opt-in fixed layout (CnDataTable's `fixedLayout` prop).

   Under the default `table-layout: auto` a column's declared `width` is only a
   hint: the browser sizes columns from their content, so one long unbreakable
   value (a PHP FQCN, a UUID) widens its own column, and any column left unsized
   soaks up every remaining pixel. `fixed` makes the declared widths
   authoritative and splits what is left between the unsized columns.

   `overflow-wrap: anywhere` is the necessary companion: with the column width
   no longer negotiable, content that does not fit would otherwise paint past
   the cell box and collide with the next column. Breaking mid-word keeps it
   inside. Cells opting into `white-space: nowrap` (e.g. `cn-cell--end`) still
   win, since that rule is more specific. */
.cn-data-table--fixed {
	table-layout: fixed;
}

.cn-data-table--fixed th,
.cn-data-table--fixed td {
	overflow-wrap: anywhere;
}

/* `overflow-wrap` on the cell is not enough on its own. CnCellRenderer wraps
   every value in an INLINE span, whose box is sized by its own content rather
   than by the cell, so a long unbreakable value (a URL, a PHP FQCN) makes the
   span measurably wider than its `td` and paints over the next column —
   exactly the overlap fixed layout was meant to end. Promoting the wrapper to
   a block gives it the column's width, which is what the inherited
   `overflow-wrap` needs to break against. `min-width: 0` stops it floor-ing at
   its min-content size. */
.cn-data-table--fixed td > .cn-cell-renderer {
	display: block;
	min-width: 0;
}

.cn-data-table th {
	background: var(--color-background-dark);
	font-weight: 500;
	color: var(--color-text-maxcontrast);
}

/* Reusable cell utilities — set on a column's `cellClass`. Handy for compact
   list widgets (name + trailing status) that use `hideHeader`. */
.cn-data-table td.cn-cell--strong {
	font-weight: 500;
}

.cn-data-table td.cn-cell--muted {
	color: var(--color-text-maxcontrast);
}

.cn-data-table td.cn-cell--end {
	text-align: right;
	white-space: nowrap;
}

/* Single-line cell with a trailing ellipsis. For a value that is one long
   unbreakable token — a URL, a fully-qualified class name — where wrapping is
   worse than clipping: `overflow-wrap` would break it mid-token across three
   lines and make every row that tall. The full text stays reachable through
   the `title` tooltip CnCellRenderer already sets on the value.

   The inner rule is the one that actually clips. `text-overflow` on a
   `display: table-cell` box is unreliable, so the constraint is placed on
   CnCellRenderer's own wrapper span, promoted to a block so it takes the
   cell's width. Pair with `fixedLayout`, which is what gives the column a
   width worth clipping against. */
.cn-data-table td.cn-cell--truncate {
	overflow: hidden;
	white-space: nowrap;
}

.cn-data-table td.cn-cell--truncate > .cn-cell-renderer {
	display: block;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.cn-data-table th.cn-table-header--sortable {
	cursor: pointer;
	user-select: none;
	transition: background-color var(--animation-quick) ease;
}

.cn-data-table th.cn-table-header--sortable:hover {
	background-color: var(--color-background-hover);
}

.cn-table-sort-indicator {
	margin-left: var(--default-grid-baseline);
	opacity: 0.6;
}

/* A column carrying a `description` gets a dotted underline — the long-standing
   convention for "there is an explanation here". Without it the tooltip is
   undiscoverable: nobody hovers a header that gives no sign of having more to
   say. `help` on the cursor rather than `pointer`, since hovering explains
   rather than navigates; a sortable column keeps its own pointer cursor on the
   th, which wins because it is the element actually being clicked. */
.cn-table-header--described {
	text-decoration: underline dotted;
	text-underline-offset: 3px;
	text-decoration-color: var(--color-text-maxcontrast);
	cursor: help;
}

.cn-data-table th.cn-table-header--sortable:focus-visible {
	outline: 2px solid var(--color-main-text);
	outline-offset: -2px;
}

/* Multi-column sort priority badge (1, 2, 3) — only rendered once more than
   one sort key is active; a single active sort shows the arrow alone. */
.cn-table-sort-badge {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 14px;
	height: 14px;
	margin-left: 2px;
	padding: 0 3px;
	border-radius: 7px;
	background-color: var(--color-primary-element);
	color: var(--color-primary-element-text);
	font-size: 10px;
	line-height: 14px;
	font-weight: bold;
	vertical-align: middle;
}

/* Row States */
.cn-table-row {
	border-bottom: 1px solid var(--color-border);
	cursor: pointer;
	transition: background-color var(--animation-quick) ease;
}

.cn-table-row:hover {
	background: var(--color-background-hover);
}

.cn-table-row--selected {
	background-color: var(--color-primary-light);
	box-shadow: inset 3px 0 0 0 var(--color-primary);
}

.cn-table-row--selected:hover {
	background-color: var(--color-primary-light);
}

/* Column Types */
.cn-table-col--checkbox {
	width: 50px;
	text-align: center;
}

.cn-table-col--icon {
	width: 40px;
	padding-right: 0;
	text-align: center;
	color: var(--color-text-maxcontrast);
}

.cn-table-col--icon .material-design-icon {
	display: inline-flex;
}

.cn-table-col--actions {
	width: 120px;
	text-align: center;
	min-width: 120px;
}

.cn-table-col--constrained {
	width: 150px;
	max-width: 150px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.cn-table-col--expanded {
	width: auto;
	min-width: 200px;
}

.cn-table-col--title {
	min-width: 120px;
	max-width: 200px;
	overflow-wrap: break-word;
	overflow: hidden;
}

/* Loading State */
.cn-table-loading {
	text-align: center;
	padding: calc(12 * var(--default-grid-baseline));
}

.cn-table-loading p {
	margin-top: calc(5 * var(--default-grid-baseline));
	color: var(--color-text-maxcontrast);
}

/* Empty State (inside table) */
.cn-table-empty td {
	text-align: center;
	padding: calc(12 * var(--default-grid-baseline)) calc(6 * var(--default-grid-baseline));
	color: var(--color-text-maxcontrast);
}

/* ========================================
   Backwards compatibility aliases
   (legacy OpenRegister CSS class names)
   ======================================== */
.viewTableContainer { background: var(--color-main-background); border-radius: var(--border-radius); overflow-x: hidden; overflow-y: visible; box-shadow: 0 2px 4px var(--color-box-shadow); border: 1px solid var(--color-border); margin-bottom: calc(5 * var(--default-grid-baseline)); }

.viewTableContainer.scrollable { max-height: 400px; overflow-y: auto; }

.viewTable { width: 100%; border-collapse: collapse; background-color: var(--color-main-background); }

.viewTable th, .viewTable td { padding: calc(3 * var(--default-grid-baseline)); text-align: left; border-bottom: 1px solid var(--color-border); vertical-align: middle; }

.viewTable th { background: var(--color-background-hover); font-weight: 500; color: var(--color-text-maxcontrast); background-color: var(--color-background-dark); }

.viewTableRow { border-bottom: 1px solid var(--color-border); cursor: pointer; transition: background-color var(--animation-quick) ease; }

.viewTableRow:hover { background: var(--color-background-hover); }

.viewTableRow.active, .viewTableRowSelected { background: var(--color-primary-light); }

.tableColumnCheckbox { width: 50px; text-align: center; }

.tableColumnActions { width: 120px; text-align: center; min-width: 120px; }

.tableColumnConstrained { width: 150px; max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.tableColumnExpanded { width: auto; min-width: 200px; }

.tableColumnTitle { min-width: 120px; max-width: 200px; overflow-wrap: break-word; overflow: hidden; }

/* ========================================
   Tables inside widgets go EDGE TO EDGE
   ======================================== */

/*
 * A table inside a widget card must touch the card's border — never sit in a
 * gutter. `CnWidgetWrapper`'s content area carries `padding: 16px` by default,
 * which put a visible margin between the widget border and the table border on
 * every table widget whose host forgot to pass `flush`.
 *
 * The rule lives HERE, in the table stylesheet, and keys off the presence of a
 * table rather than off a prop. `CnDataTable` imports this file, so the rule
 * arrives exactly when — and only when — a table is on the page, and no app can
 * reintroduce the gutter by forgetting a prop: there is no prop left to forget.
 *
 * `:has()` is what makes this possible (Baseline since 2023; every browser
 * Nextcloud 30+ supports has it). Unscoped on purpose — a scoped rule cannot
 * see across the component boundary into the wrapper.
 */
.cn-widget-wrapper__content:has(.cn-table-container),
.cn-detail-card__content:has(.cn-table-container) {
	padding: 0;
}

/* ...and the footer "Add" must stop bleeding once that padding is gone.
   `CnObjectListWidget` pulls its footer button out by -16px on the inline axis
   and the bottom so its divider crosses the wrapper's 16px content padding.
   With the rule above that padding is zero, so the bleed crosses nothing and
   simply pushes the button 16px past the card on the right and below it. Both
   overflows are scrollable, so the card grows a vertical scrollbar AND a
   horizontal one, underneath the table's own legitimate horizontal bar. That
   is the double scrollbar seen on a dossiq case's Tasks card.

   Only the inline and bottom margins are reset: `margin-top: auto` is what
   pins the button to the bottom of the flex column and must survive. */
.cn-widget-wrapper__content:has(.cn-table-container) .cn-object-list-widget__add,
.cn-detail-card__content:has(.cn-table-container) .cn-object-list-widget__add {
	margin-inline: 0 !important;
	margin-bottom: 0 !important;
}

/* The table's own card chrome is redundant inside a widget that already draws
   one, and a second border reads as the same gutter defect. Flatten it. */
.cn-widget-wrapper__content .cn-table-container,
.cn-detail-card__content .cn-table-container {
	margin-bottom: 0;
	border: none;
	border-radius: 0;
	box-shadow: none;
}

/* The header/footer keep their own inset so the title and "View all" do not
   collide with the card edge — the rows are what go edge to edge. */
.cn-widget-wrapper__content .cn-data-table__header,
.cn-widget-wrapper__content .cn-data-table__footer {
	padding-inline: 16px;
}
/* ========================================
   @conduction/nextcloud-vue — Card Styles
   ======================================== */

/* Card Grid */
.cn-card-grid {
	display: grid;
	gap: calc(4 * var(--default-grid-baseline));
	grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
	padding: 0.25rem;
}

/* Base Card */
.cn-card {
	background: var(--color-main-background);
	border-radius: var(--border-radius-large);
	padding: calc(5 * var(--default-grid-baseline));
	box-shadow: 0 2px 8px var(--color-box-shadow);
	min-height: 200px;
	transition: transform var(--animation-quick) ease-in-out;
	border: 1px solid var(--color-border);
}

.cn-card:hover {
	transform: scale(1.01);
	box-shadow: 0 4px 12px var(--color-box-shadow);
}

/* Card Header */
.cn-card-header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: calc(2 * var(--default-grid-baseline));
	margin-bottom: calc(3 * var(--default-grid-baseline));
	padding-bottom: calc(2 * var(--default-grid-baseline));
	border-bottom: 1px solid var(--color-border);
}

.cn-card-header h2,
.cn-card-header h3 {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
	margin: 0;
	color: var(--color-main-text);
}

.cn-card-header h2 { font-size: 1.2em; }

.cn-card-header h3 { font-size: 1.1em; }

/* Settings Card */
.cn-settings-card {
	background: var(--color-background-hover);
	border-radius: var(--border-radius-large);
	padding: calc(5 * var(--default-grid-baseline));
	margin-bottom: calc(5 * var(--default-grid-baseline));
}

.cn-settings-card h4 {
	margin: 0 0 calc(4 * var(--default-grid-baseline)) 0;
	color: var(--color-main-text);
	font-size: 16px;
	font-weight: 600;
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
}

.cn-settings-card--collapsible h4 {
	cursor: pointer;
	user-select: none;
	display: flex;
	justify-content: space-between;
	align-items: center;
	transition: color var(--animation-quick) ease;
	margin-bottom: 0;
}

.cn-settings-card--collapsible h4:hover {
	color: var(--color-primary-element);
}

.cn-settings-card__chevron {
	transition: transform var(--animation-slow) ease;
	color: var(--color-text-maxcontrast);
}

.cn-settings-card--collapsible h4:hover .cn-settings-card__chevron {
	color: var(--color-primary-element);
}

.cn-settings-card__content {
	padding-top: calc(4 * var(--default-grid-baseline));
}

/* Stat Grid */
.cn-stat-grid {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: calc(3 * var(--default-grid-baseline));
	margin-bottom: calc(4 * var(--default-grid-baseline));
}

.cn-stat-item {
	display: flex;
	flex-direction: column;
	gap: var(--default-grid-baseline);
}

.cn-stat-label {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}

.cn-stat-value {
	font-size: 1.1em;
	font-weight: 600;
}

/* Backwards compatibility aliases */
.cardGrid { display: grid; gap: calc(4 * var(--default-grid-baseline)); grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }

.card { background: var(--color-main-background); border-radius: var(--border-radius-large); padding: calc(5 * var(--default-grid-baseline)); box-shadow: 0 2px 8px var(--color-box-shadow); min-height: 200px; transition: transform var(--animation-quick) ease-in-out; border: 1px solid var(--color-border); }

.card:hover { transform: scale(1.01); box-shadow: 0 4px 12px var(--color-box-shadow); }

.cardHeader { display: flex; align-items: center; justify-content: space-between; gap: calc(2 * var(--default-grid-baseline)); margin-bottom: calc(3 * var(--default-grid-baseline)); padding-bottom: calc(2 * var(--default-grid-baseline)); border-bottom: 1px solid var(--color-border); }

.statGrid { display: grid; grid-template-columns: repeat(2, 1fr); gap: calc(3 * var(--default-grid-baseline)); margin-bottom: calc(4 * var(--default-grid-baseline)); }

.statItem { display: flex; flex-direction: column; gap: var(--default-grid-baseline); }

.statLabel { color: var(--color-text-maxcontrast); font-size: 0.9em; }

.statValue { font-size: 1.1em; font-weight: 600; }

/* Notes composer width, stated globally rather than only in the component's
   scoped block.
 *
 * Nextcloud's server stylesheet sets `width: 130px` on every `textarea`. The
 * component's own `width: 100%` normally beats it on specificity, but it is a
 * SCOPED rule, so it only applies where the scope attribute is present. In
 * OpenRegister's self-contained `integration-global` bundle the component
 * resolves without its scope id, and the composer then rendered 130px wide
 * inside a ~1000px panel: a one-line box for writing a case note.
 *
 * A plain class here is (0,1,0) against Nextcloud's (0,0,1) and carries no
 * scope id, so it holds wherever the markup renders. This is deliberately a
 * floor, not a replacement: the scoped rule still owns the rest of the
 * composer's appearance. The underlying resolution gap is tracked in
 * ConductionNL/openregister#3387. */
.cn-notes-card__textarea {
	width: 100%;
	box-sizing: border-box;
}
/* ========================================
   @conduction/nextcloud-vue — Pagination
   ======================================== */

.cn-pagination {
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: calc(4 * var(--default-grid-baseline));
	margin-top: calc(8 * var(--default-grid-baseline));
	padding: calc(5 * var(--default-grid-baseline));
	flex-wrap: nowrap;
}

.cn-pagination__info {
	display: flex;
	align-items: center;
	flex-shrink: 0;
}

.cn-pagination__page-info {
	color: var(--color-text-maxcontrast);
	font-size: 0.9rem;
}

.cn-pagination__nav {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
	flex-grow: 1;
	justify-content: center;
}

.cn-pagination__numbers {
	display: flex;
	align-items: center;
	gap: var(--default-grid-baseline);
}

.cn-pagination__ellipsis {
	padding: 0 var(--default-grid-baseline);
	color: var(--color-text-maxcontrast);
	font-size: 0.9rem;
}

.cn-pagination__page-size {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
	flex-shrink: 0;
	min-width: 0;
}

.cn-pagination__page-size label {
	font-size: 0.9rem;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
}

.cn-pagination__page-size-select {
	min-width: 100px !important;
	max-width: 120px !important;
}

/* Backwards compatibility aliases */
.viewPagination { display: flex; justify-content: space-between; align-items: center; gap: calc(4 * var(--default-grid-baseline)); margin-top: calc(8 * var(--default-grid-baseline)); padding: calc(5 * var(--default-grid-baseline)); flex-wrap: nowrap; }

.viewPaginationInfo { display: flex; align-items: center; flex-shrink: 0; }

.viewPageInfo { color: var(--color-text-maxcontrast); font-size: 0.9rem; }

.viewPaginationNav { display: flex; align-items: center; gap: calc(2 * var(--default-grid-baseline)); flex-grow: 1; justify-content: center; }

.viewPaginationNumbers { display: flex; align-items: center; gap: var(--default-grid-baseline); }

.viewPaginationEllipsis { padding: 0 var(--default-grid-baseline); color: var(--color-text-maxcontrast); font-size: 0.9rem; }

.viewPaginationPageSize { display: flex; align-items: center; gap: calc(2 * var(--default-grid-baseline)); flex-shrink: 0; min-width: 0; }

/* Compact pagination — the widget-sized variant (`:compact="true"`). Sized to
   sit in a dashboard widget's footer rather than under an index page: no top
   margin, tight padding, and the item range on the left with a Prev/Next pair
   on the right. */
.cn-pagination.cn-pagination--compact {
	justify-content: space-between;
	gap: calc(2 * var(--default-grid-baseline));
	margin-top: 0;
	padding: calc(2 * var(--default-grid-baseline)) 0;
}

.cn-pagination--compact .cn-pagination__page-info {
	font-size: 0.8rem;
}

.cn-pagination__nav.cn-pagination__nav--compact {
	flex-grow: 0;
	justify-content: flex-end;
	gap: var(--default-grid-baseline);
}
/* ========================================
   @conduction/nextcloud-vue — The KPI card
   ======================================== */

/*
 * ONE canonical KPI look, for every app.
 *
 * There were two. `CnStatsBlock` (OpenCatalogi's KPIs) drew a grey card with a
 * circular tinted icon above a large coloured number; `CnStatWidget` (dossiq's)
 * drew a transparent row with the icon beside a smaller number. Two components
 * meant two designs, and the same dashboard read as two products.
 *
 * The visual contract now lives HERE, in one stylesheet, under one class
 * family, and both components render that markup. Neither owns the look any
 * more, so they cannot drift apart again: changing this file changes both.
 * Each component keeps its own legacy class names on the same elements for
 * backwards compatibility with app CSS that targets them.
 *
 * WHAT THE CANONICAL CARD LOOKS LIKE — changed 2026-08-30. It was OpenCatalogi's
 * grey box with the icon stacked ABOVE a centred number. It is now pipelinq's
 * "Gewonnen deals" tile: no fill of its own, and a large circular icon BESIDE
 * the number, both left-aligned.
 *
 * The reason is the box, not the taste. Every KPI already sits inside a
 * `CnWidgetWrapper`, which draws the white bordered card. A card that also
 * drew its own grey fill produced a box inside a box on every dashboard in the
 * fleet, and the one tile that looked right — the `delta` widget — looked right
 * only because it had never joined this stylesheet and hand-rolled the two
 * rules below. Making the odd one out the standard is what removes the nesting.
 *
 * So the base class is now flat and horizontal, and the OLD look is the opt-in:
 * `--filled` puts the grey box back, `--vertical` stacks the icon again. The
 * `--flat` and `--horizontal` modifiers are kept as no-ops so existing markup
 * and app CSS that names them keeps matching.
 *
 * Colours are Nextcloud tokens throughout — never literals. The nldesign app
 * re-themes by overriding those variables, so a hardcoded hex would opt the
 * card out of government theming (NL Design System).
 */

/* ----------------------------------------
   The KPI scale
   ----------------------------------------

   Every number that decides what a KPI LOOKS like is declared once, here, and
   read by `var()` everywhere else — in this sheet and in the scoped blocks of
   the components that render KPI-shaped content but are not themselves a card
   (CnKpiGrid's tracks, CnStatsPanel's sections, CnFederationStatus's summary
   row). A component that wants the canonical treatment consumes the token; it
   does not restate the value. That is the whole anti-drift mechanism: a
   restated value is a value that can be changed in one place and not the
   other, which is exactly how the library ended up with several KPI looks.

   They live on `:root` rather than on `.cn-kpi-card` so a component that is
   NOT a card can still read them. Every `var()` below also carries the
   literal as its fallback, so a consumer that somehow loads a component
   without this sheet still renders at the canonical size instead of at the
   browser default.

   An app may re-scale every KPI in one declaration by overriding these on
   `:root` — that is a supported use, and preferable to per-app overrides of
   the class names below. */
:root {
	/* Box */
	/* The default card draws no fill, so it needs only enough padding to keep
	   the icon off the wrapper's border. `--cn-kpi-padding` is what a `--filled`
	   card uses, where the padding has a visible box to sit inside. */
	--cn-kpi-padding-flat: 8px;
	--cn-kpi-padding: 16px;
	--cn-kpi-gap: 8px;
	--cn-kpi-gap-horizontal: 16px;
	--cn-kpi-radius: var(--border-radius-large, 10px);
	/* The gutter BETWEEN tiles — a CnKpiGrid's tracks, a CnStatsPanel stack,
	   the entries a CnStatsBlockWidget stacks inside one widget. One value, so
	   three surfaces that show the same tiles space them the same way. */
	--cn-kpi-grid-gap: 16px;
	--cn-kpi-stack-gap: 12px;

	/* Icon */
	--cn-kpi-icon-size: 44px;
	--cn-kpi-icon-size-sm: 36px;
	/* Share of the semantic colour mixed into the icon's circle. */
	--cn-kpi-icon-tint: 12%;

	/* Title — the name of the thing being counted. */
	--cn-kpi-title-size: 14px;
	--cn-kpi-title-weight: 600;

	/* Value — the number itself, the point of the tile.

	   The canonical card is horizontal, which spends ~60px of the tile's width
	   on the icon and its gap. At 2rem a six-figure currency value ("€224,070")
	   overflowed that remaining width and was CLIPPED by the card's
	   `overflow: hidden` — a KPI showing "€224,0" is worse than a smaller one,
	   because a truncated number still reads as a number. The stacked card gets
	   the full width back and keeps 2rem (see `--vertical`). */
	--cn-kpi-value-size: 1.75rem;
	--cn-kpi-value-size-stacked: 2rem;
	/* A KPI number rendered inline in a dense row (a summary strip, a list
	   header) rather than alone on a tile. Same family, same weight, same
	   colour rules — one step down in size so it does not out-shout the row
	   it sits in. */
	--cn-kpi-value-size-compact: 1.25rem;
	--cn-kpi-value-weight: 700;
	--cn-kpi-value-line: 1.1;

	/* Label — the unit or qualifier beside the number, and every piece of
	   secondary KPI text (captions, breakdowns, empty and loading lines). */
	--cn-kpi-label-size: 13px;
	--cn-kpi-label-color: var(--color-text-maxcontrast);

	/* Section heading above a group of KPIs. */
	--cn-kpi-section-title-size: 14px;

	/* The tile's semantic colour. The variant modifiers below re-point THIS,
	   and the icon and the value both read it — so a card can never say
	   "success" with its icon and "primary" with its number. */
	--cn-kpi-accent: var(--color-primary-element);
}

/* The canonical card: icon beside the number, left-aligned, no fill of its own.
   The surrounding CnWidgetWrapper is what draws the visible card. */
.cn-kpi-card {
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: flex-start;
	gap: var(--cn-kpi-gap-horizontal, 16px);
	width: 100%;
	height: 100%;
	min-width: 0;
	min-height: 64px;
	padding: var(--cn-kpi-padding-flat, 8px);
	box-sizing: border-box;
	overflow: hidden;
	text-align: left;
	text-decoration: none;
	color: inherit;
	background: transparent;
	border: 2px solid transparent;
	border-radius: var(--cn-kpi-radius, 10px);
	transition: border-color 0.15s ease, box-shadow 0.15s ease;
	/* The tile sizes its own number — see the container query below. */
	container-type: inline-size;
	container-name: cn-kpi;
}


/* The icon: a circle tinted from the card's own semantic colour. `color-mix`
   rather than a frozen rgba() so a re-themed palette re-tints it too. */
.cn-kpi-card__icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: var(--cn-kpi-icon-size, 44px);
	height: var(--cn-kpi-icon-size, 44px);
	border-radius: 50%;
	flex-shrink: 0;
	color: var(--cn-kpi-accent, var(--color-primary-element));
	background: color-mix(in srgb, var(--cn-kpi-accent, var(--color-primary-element)) var(--cn-kpi-icon-tint, 12%), transparent);
}

.cn-kpi-card__icon svg {
	fill: currentcolor;
}

.cn-kpi-card__title {
	margin: 0;
	font-size: var(--cn-kpi-title-size, 14px);
	font-weight: var(--cn-kpi-title-weight, 600);
	color: var(--color-main-text);
	/* One line, ellipsised. A two-line `-webkit-line-clamp` was tried and
	   removed: this element is ALSO the flex row that carries CnStatWidget's
	   range select, and `display: -webkit-box` cannot be both. The clamp lost
	   to the scoped `display: flex` and silently did nothing, which is worse
	   than not attempting it. Each component sets `title` on the element, so
	   the full name is still reachable on hover. */
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	max-width: 100%;
}

/* The stack between the icon and the card edge: title, value row, and
   whatever else the component puts inside (a breakdown, an empty line).
   Canonical rather than per-component, because a body that stacks one way in
   CnStatsBlock and another in CnStatWidget is two looks again — the spacing
   between a title and its number is part of the KPI's identity. */
.cn-kpi-card__body {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 2px;
	/* Takes whatever the icon leaves, and is allowed to shrink below its
	   content's intrinsic width — without `min-width: 0` a flex item refuses to
	   shrink past its longest word, which is what pushed the number out of the
	   card in the first place. */
	flex: 1 1 auto;
	min-width: 0;
	max-width: 100%;
}

.cn-kpi-card__value-row {
	display: flex;
	align-items: baseline;
	justify-content: flex-start;
	gap: 6px;
	max-width: 100%;
	min-width: 0;
}

/* The number is the point of the card, so it never shrinks and never wraps —
   the decoration around it is what gives way in a narrow tile. */
.cn-kpi-card__value {
	flex: 0 0 auto;
	font-size: var(--cn-kpi-value-size, 2rem);
	font-weight: var(--cn-kpi-value-weight, 700);
	line-height: var(--cn-kpi-value-line, 1.1);
	white-space: nowrap;
	color: var(--cn-kpi-accent, var(--color-primary-element));
}

/* A TEXT value is a different shape from a number and needs the opposite rule.
   `objectField` lets a tile headline a name ("Omgevingsvergunning kleine
   bouwactiviteit") instead of a count, and the no-wrap rule above pushed it
   straight out of the card. Text shrinks, wraps and clamps to two lines; a
   number still never does. */
.cn-kpi-card__value--text {
	flex: 0 1 auto;
	min-width: 0;
	font-size: var(--cn-kpi-value-text-size, 1.25rem);
	line-height: 1.2;
	white-space: normal;
	overflow-wrap: anywhere;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.cn-kpi-card__label {
	flex: 1 1 auto;
	min-width: 0;
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* Semantic variants. Each re-points the ONE accent token, so the icon tint
   and the number move together by construction — there is no second place to
   forget. The inline KPI below shares the same modifiers for the same reason:
   `success` must mean one colour across every KPI surface, not one per class
   family.

   THE `-text` TOKENS, NOT THE PLAIN ONES: the accent paints the NUMBER, not
   just the icon tint. Nextcloud's `--color-success` / `--color-warning` /
   `--color-error` are FILL colours meant to sit behind something; DefaultTheme
   ships `--color-success-text` and friends for foreground use. Using a fill as
   a text colour failed WCAG AA — axe measured `#d8f3da` on `#f5f5f5`, a
   contrast of 1.08 against the required 3:1, serious, on filinq's dashboard
   (gate-33, run 33261801989). Only `success` was on screen there; `warning`
   and `error` carried the same defect unrendered.

   Each keeps the plain token as a fallback, so a theme predating the `-text`
   tokens degrades to the old colour rather than to none. */
.cn-kpi-card--success,
.cn-kpi-inline--success { --cn-kpi-accent: var(--color-success-text, var(--color-success)); }

.cn-kpi-card--warning,
.cn-kpi-inline--warning { --cn-kpi-accent: var(--color-warning-text, var(--color-warning)); }

.cn-kpi-card--error,
.cn-kpi-inline--error { --cn-kpi-accent: var(--color-error-text, var(--color-error)); }

/* No semantic reading at all — a count that is neither good nor bad (an
   "unknown" bucket). Muted rather than coloured, so it cannot be mistaken for
   a status. */
.cn-kpi-inline--muted { --cn-kpi-accent: var(--color-text-maxcontrast); }

/* Clickable card (a `route`/`link` on the widget, or `clickable` on the block). */
.cn-kpi-card--clickable {
	cursor: pointer;
}

.cn-kpi-card--clickable:hover {
	border-color: var(--color-primary-element);
	box-shadow: 0 2px 8px var(--color-box-shadow);
}

.cn-kpi-card--clickable:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}

/* ── Card-fit tiles: the WRAPPER is the card, so the hover goes on the wrapper ──
   A stat / gauge / delta tile is rendered `flush` and then given its padding
   back by the card-fit rule (`padding: 8px 14px`, CnDashboardPage), so that a
   short KPI tile does not scroll. That leaves the KPI INSET inside the
   wrapper, and the wrapper is what draws the border, the radius and the
   background the user reads as "the card".

   The `--clickable:hover` border above therefore paints a SECOND rounded box
   8-14px inside the first, which reads as a card inside a card. Measured: a
   card-fit stat widget sits 9px from the wrapper's top and 15px from its left,
   while a non-card-fit stats block sits at 1px and so lands on the wrapper's
   own edge. That is the whole difference, and it is why only the card-fit
   variants show the effect.

   So: suppress the inner border, and give the affordance to the wrapper, which
   is the edge being hovered. `:has()` is Baseline since 2023 and is already
   used across this stylesheet set (table.css, dashboard.css, detail-page.css).
   Both card-fit hosts are covered: dashboard pages and detail pages. */
.cn-dashboard-page__card-fit .cn-kpi-card--clickable:hover,
.cn-detail-page__card-fit .cn-kpi-card--clickable:hover {
	border-color: transparent;
	box-shadow: none;
}

.cn-dashboard-page__card-fit:has(.cn-kpi-card--clickable:hover),
.cn-detail-page__card-fit:has(.cn-kpi-card--clickable:hover) {
	border-color: var(--color-primary-element);
	box-shadow: 0 2px 8px var(--color-box-shadow);
}

/* Vertical: the icon stacked ABOVE a centred number — the pre-2026-08-30
   canonical look, now opt-in via `content.layout: 'vertical'`. For a tile that
   is taller than it is wide, where a sideways row would leave the card empty
   down its middle. */
.cn-kpi-card--vertical {
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: var(--cn-kpi-gap, 8px);
	text-align: center;
}

.cn-kpi-card--vertical .cn-kpi-card__body {
	align-items: center;
	text-align: center;
}

.cn-kpi-card--vertical .cn-kpi-card__value-row {
	justify-content: center;
}

/* Stacked: the number gets the card's full width back, so it takes the larger
   size, and the title fits on one line again. */
.cn-kpi-card--vertical .cn-kpi-card__value {
	font-size: var(--cn-kpi-value-size-stacked, 2rem);
}

/* Filled: the card draws its own grey box, for a KPI that is NOT already
   inside a wrapper that draws one. Opt-in via `content.flat: false`. */
.cn-kpi-card--filled {
	padding: var(--cn-kpi-padding, 16px);
	background: var(--color-background-hover);
}

/* Compact: a smaller icon, for a tile too short to give a 44px circle room. */
.cn-kpi-card--compact .cn-kpi-card__icon {
	width: var(--cn-kpi-icon-size-sm, 36px);
	height: var(--cn-kpi-icon-size-sm, 36px);
}

/* `--horizontal` and `--flat` ARE the base card since 2026-08-30, so this
   sheet deliberately declares NO rule for either. Both names are still emitted
   onto the element by CnStatWidget and CnStatsBlock and are still matched by
   app CSS in the field — they just no longer need to carry anything.
   Do NOT "restore" them as rules that re-assert the base: `--flat` is emitted
   alongside `--vertical` on a flat vertical tile, so a `flex-direction: row`
   here would silently un-stack it. */

/* ----------------------------------------
   The inline KPI
   ----------------------------------------

   A number and its label rendered IN a row — a summary strip above a list, a
   status roll-up in a panel header — rather than alone on a tile. Not every
   KPI earns a card: a four-way "3 up / 1 degraded / 0 down" roll-up above a
   node list is one line of context, and boxing each count would out-weigh the
   list it introduces.

   So the box is dropped and nothing else is. The number keeps the card's
   weight, line-height and accent colour and steps down one size
   (`--cn-kpi-value-size-compact`); the label keeps the card's label size and
   colour; the variant modifiers are literally the card's own. It reads as the
   same design at a different density, which is the whole point — the
   alternative, a bespoke `0.85em` count with an inherited colour, is a second
   KPI look wearing a different class name. */
.cn-kpi-inline {
	display: inline-flex;
	align-items: baseline;
	gap: 6px;
	min-width: 0;
}

.cn-kpi-inline__value {
	flex: 0 0 auto;
	font-size: var(--cn-kpi-value-size-compact, 1.25rem);
	font-weight: var(--cn-kpi-value-weight, 700);
	line-height: var(--cn-kpi-value-line, 1.1);
	white-space: nowrap;
	color: var(--cn-kpi-accent, var(--color-primary-element));
}

.cn-kpi-inline__label {
	min-width: 0;
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* The `--flat` rule that used to live here is gone: dropping the box IS the
   base card now, so the modifier had nothing left to declare. See the note
   beside `--filled` above for why the class is still emitted. */

/* ----------------------------------------
   Narrow tiles
   ----------------------------------------

   THIS BLOCK MUST STAY LAST. A container query carries no extra specificity —
   `.cn-kpi-card__value` inside it and the base `.cn-kpi-card__value` above are
   equal, so whichever comes later wins. It was written directly beneath
   `.cn-kpi-card`, ABOVE the base rule, and therefore never applied: measured
   live on pipelinq, a 173px tile still rendered its value at 1.75rem and
   "€224,070" was clipped by the card's `overflow: hidden`. Appending the very
   same rule last took it to 1.25rem and the number fitted.

   The first verification missed it because it injected the rule with
   `!important`, which hides exactly this class of ordering bug. */
/* A narrow tile steps its number down rather than clipping it.
   A three-column KPI leaves roughly 130px beside the icon, which a six-figure
   currency value overruns at the full size; the card's `overflow: hidden` then
   cuts it mid-digit, and "€224,0" reads as a number rather than as damage.
   Keyed to the CARD, not the viewport: the same tile is narrow at 3 columns on
   a desktop and wide at 12 on a phone, so a media query would size it by the
   wrong box.

   The ICON deliberately does not shrink with it. A large circular icon beside
   the number is the identity of this card, and 44px of a 173px tile still
   leaves the value room once it steps down; shrinking both made the tile read
   as a different, smaller component. */
@container cn-kpi (max-width: 230px) {
	.cn-kpi-card__value {
		font-size: var(--cn-kpi-value-size-compact, 1.25rem);
	}
}
/* ========================================
   @conduction/nextcloud-vue — Form widgets
   ======================================== */

/*
 * The shared look of a form-shaped dashboard widget — the `CnFormWidgetBase`
 * primitive that CnInteractionFormWidget and every future form widget render.
 *
 * These rules are LIFTED VERBATIM from CnInteractionFormWidget's own scoped
 * block, value for value. That widget's rendering is the reference: it is
 * liked as it stands, and the extraction onto a shared base was required to
 * change nothing a user can see. Keeping the numbers identical is what makes
 * that true, and `e2e/interaction-form-widget.e2e.js` screenshots the widget
 * to prove it.
 *
 * Unscoped on purpose: the markup now lives in CnFormWidgetBase, so a scoped
 * block in the host widget would no longer match its own elements.
 */

.cn-form-widget {
	display: flex;
	flex-direction: column;
	gap: 12px;
	width: 100%;
}

.cn-form-widget__field {
	display: flex;
	flex-direction: column;
	gap: 4px;
	min-width: 0;
}

.cn-form-widget__label {
	font-weight: 500;
	font-size: 0.9em;
}

.cn-form-widget__textarea {
	width: 100%;
	min-height: 80px;
	padding: 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	font: inherit;
	resize: vertical;
}

.cn-form-widget__actions {
	display: flex;
	gap: 8px;
	justify-content: flex-end;
}

.cn-form-widget__error {
	color: var(--color-error);
	margin: 0;
}
/* ========================================
   @conduction/nextcloud-vue — Detail Grid & Layout Utility Styles
   ======================================== */

/* Detail Grid (metadata display) */
.cn-detail-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
	gap: calc(4 * var(--default-grid-baseline));
	margin-bottom: calc(5 * var(--default-grid-baseline));
}

.cn-detail-item {
	display: flex;
	flex-direction: column;
	gap: var(--default-grid-baseline);
	padding: calc(2 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline));
	border-left: 3px solid var(--color-primary-element);
	background: var(--color-background-hover);
	border-radius: 0 var(--border-radius) var(--border-radius) 0;
}

.cn-detail-item__label {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	font-weight: 500;
}

.cn-detail-item__value {
	font-size: 1em;
	color: var(--color-main-text);
	overflow-wrap: anywhere;
}

/* Detail Layout */
.cn-detail-layout {
	max-width: 1000px;
	padding: calc(5 * var(--default-grid-baseline));
}

.cn-detail-layout__header {
	display: flex;
	align-items: center;
	gap: calc(3 * var(--default-grid-baseline));
	margin-bottom: calc(6 * var(--default-grid-baseline));
}

.cn-detail-layout__title {
	flex: 1;
	margin: 0;
	font-size: 1.5em;
	color: var(--color-main-text);
}

.cn-detail-layout__actions {
	display: flex;
	gap: calc(2 * var(--default-grid-baseline));
	flex-shrink: 0;
}

.cn-detail-layout__content {
	margin-top: calc(4 * var(--default-grid-baseline));
}

/* Backwards compatibility aliases */
.detail-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: calc(4 * var(--default-grid-baseline)); margin-bottom: calc(5 * var(--default-grid-baseline)); }

.detail-item { display: flex; flex-direction: column; gap: var(--default-grid-baseline); padding: calc(2 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline)); border-left: 3px solid var(--color-primary-element); background: var(--color-background-hover); border-radius: 0 var(--border-radius) var(--border-radius) 0; }

.detailContainer { margin-block-start: calc(5 * var(--default-grid-baseline)); margin-inline-start: calc(5 * var(--default-grid-baseline)); margin-inline-end: calc(5 * var(--default-grid-baseline)); }
/* ========================================
   @conduction/nextcloud-vue — Status Badge
   ======================================== */

.cn-status-badge {
	display: inline-flex;
	align-items: center;
	gap: calc(0.5 * var(--default-grid-baseline));
	padding: calc(0.5 * var(--default-grid-baseline)) calc(2.5 * var(--default-grid-baseline));
	border-radius: var(--border-radius-pill);
	font-size: 0.85em;
	font-weight: 500;
	line-height: 1.4;
	white-space: nowrap;
}

/* Size variants */
.cn-status-badge--small {
	padding: calc(0.25 * var(--default-grid-baseline)) calc(2 * var(--default-grid-baseline));
	font-size: 0.75em;
}

/* Color variants */
.cn-status-badge--default {
	background-color: var(--color-background-dark);
	color: var(--color-main-text);
}

.cn-status-badge--primary {
	background-color: var(--color-primary-element-light);
	color: var(--color-primary-element);
}

.cn-status-badge--success {
	background-color: var(--color-success-light, rgba(70, 186, 97, 0.15));
	color: var(--color-success-text, var(--color-success));
}

.cn-status-badge--warning {
	background-color: var(--color-warning-light, rgba(232, 163, 39, 0.15));
	color: var(--color-warning-text, var(--color-warning));
}

.cn-status-badge--error {
	background-color: var(--color-error-light, rgba(224, 68, 68, 0.15));
	color: var(--color-error-text, var(--color-error));
}

.cn-status-badge--info {
	background-color: var(--color-info-light, rgba(0, 130, 201, 0.15));
	color: var(--color-info-text, var(--color-info, #0082c9));
}

/* Solid variants — solid background with white text for use on colored backgrounds */
.cn-status-badge--solid.cn-status-badge--default {
	background-color: var(--color-background-dark);
	color: var(--color-main-text);
}

.cn-status-badge--solid.cn-status-badge--primary {
	background-color: var(--color-primary-element);
	color: white;
}

.cn-status-badge--solid.cn-status-badge--success {
	background-color: var(--color-success);
	color: white;
}

.cn-status-badge--solid.cn-status-badge--warning {
	background-color: var(--color-warning);
	color: var(--color-primary-text);
}

.cn-status-badge--solid.cn-status-badge--error {
	background-color: var(--color-error);
	color: white;
}

.cn-status-badge--solid.cn-status-badge--info {
	background-color: var(--color-info, #0082c9);
	color: white;
}
/* ========================================
   @conduction/nextcloud-vue — Layout & Filter Utility Styles
   ======================================== */

/* List View Layout */
.cn-list-layout {
	padding: calc(5 * var(--default-grid-baseline));
}

.cn-list-layout__header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	margin-bottom: calc(4 * var(--default-grid-baseline));
}

.cn-list-layout__title {
	display: flex;
	align-items: baseline;
	gap: calc(2 * var(--default-grid-baseline));
}

.cn-list-layout__title h2 {
	margin: 0;
	font-size: 1.4em;
	color: var(--color-main-text);
}

.cn-list-layout__title .cn-list-layout__count {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}

.cn-list-layout__actions {
	display: flex;
	gap: calc(2 * var(--default-grid-baseline));
}

/* Filter Bar */
.cn-filter-bar {
	display: flex;
	align-items: center;
	gap: calc(3 * var(--default-grid-baseline));
	margin-bottom: calc(4 * var(--default-grid-baseline));
	flex-wrap: wrap;
}

.cn-filter-bar__search {
	flex: 1;
	min-width: 200px;
	max-width: 400px;
}

.cn-filter-bar__filters {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
	flex-wrap: wrap;
}

.cn-filter-bar__filter {
	min-width: 150px;
	max-width: 200px;
}

.cn-filter-bar__clear {
	margin-left: auto;
}

/* Dashboard Content */
.cn-dashboard-content {
	margin-inline: auto;
	max-width: 1200px;
	padding-block: calc(5 * var(--default-grid-baseline));
	padding-inline: calc(5 * var(--default-grid-baseline));
}

/* Loading Container */
.cn-loading-container {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
	color: var(--color-text-maxcontrast);
	justify-content: center;
	padding-block: calc(10 * var(--default-grid-baseline));
}

/* Backwards compatibility aliases */
.dashboardContent { margin-inline: auto; max-width: 1200px; padding-block: calc(5 * var(--default-grid-baseline)); padding-inline: calc(5 * var(--default-grid-baseline)); }

.loadingContainer { display: flex; align-items: center; gap: calc(2 * var(--default-grid-baseline)); color: var(--color-text-maxcontrast); justify-content: center; padding-block: calc(10 * var(--default-grid-baseline)); }
/* ========================================
   @conduction/nextcloud-vue — Shared responsive grid engine
   ========================================

   One 12-column CSS grid used by CnWidgetGrid (v2 manifest slots) and
   CnDetailPage (explicit grid mode + schema-driven auto-body). Cell
   placement comes from CSS custom properties emitted by
   `src/utils/grid.js` (cnGridCellStyle), so the responsive collapse
   (12 → 6 → 1) lives here in one place instead of per-component.

   Column count is driven by `--cn-grid-cols` (default 12) so single-column
   slots (e.g. the sidebar) can opt out by setting it to 1. Add the
   `cn-grid--responsive` modifier to multi-column grids to enable the
   breakpoint collapse; single-column grids omit it and stay put. */

.cn-grid {
	display: grid;
	grid-template-columns: repeat(var(--cn-grid-cols, 12), 1fr);
	gap: calc(4 * var(--default-grid-baseline, 4px));
	width: 100%;
}

.cn-grid__item {
	min-width: 0;
	grid-column: var(--cn-grid-cs, auto) / span var(--cn-grid-cspan, var(--cn-grid-cols, 12));
}

/* Explicit row placement — opt-in via the modifier so flow items stay
   auto-placed. */
.cn-grid__item--row {
	grid-row: var(--cn-grid-rs) / span var(--cn-grid-rspan);
}

/* Tablet: collapse to 6 columns; items span at most 6 and auto-flow. */
@media (max-width: 900px) {
	.cn-grid--responsive {
		grid-template-columns: repeat(6, 1fr);
	}

	.cn-grid--responsive > .cn-grid__item {
		grid-column: span var(--cn-grid-cspan-md, 6);
		grid-row: auto;
	}
}

/* Mobile: single column, every item full width. */
@media (max-width: 600px) {
	.cn-grid--responsive {
		grid-template-columns: 1fr;
	}

	.cn-grid--responsive > .cn-grid__item {
		grid-column: 1 / -1;
		grid-row: auto;
	}
}
/* ========================================
   @conduction/nextcloud-vue — Utilities
   ======================================== */

/* Text Utilities */
.cn-text-ellipsis {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.cn-text-description {
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
}

.cn-text-success { color: var(--color-success); }

.cn-text-error { color: var(--color-error); }

.cn-text-warning { color: var(--color-warning); }

.cn-text-muted { color: var(--color-text-maxcontrast); }

/* Vue Transition Animations */
.cn-slide-fade-enter-active {
	transition: all var(--animation-slow) cubic-bezier(0.4, 0, 0.2, 1);
}

.cn-slide-fade-leave-active {
	transition: all var(--animation-quick) cubic-bezier(0.4, 0, 1, 1);
}

.cn-slide-fade-enter,
.cn-slide-fade-enter-from {
	transform: translateY(-10px);
	opacity: 0;
}

.cn-slide-fade-leave-to {
	transform: translateY(-5px);
	opacity: 0;
}

/* Backwards compatibility aliases */
.textEllipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.textDescription { font-size: 0.9em; color: var(--color-text-maxcontrast); }

.successMessage { color: var(--color-success); }

.errorMessage { color: var(--color-error); }
/* CnPageHeader — Reusable page header styles */

.cn-page-header {
	display: flex;
	align-items: flex-start;
	gap: calc(3 * var(--default-grid-baseline));
	margin-bottom: calc(4 * var(--default-grid-baseline));
	/* Clear the Nextcloud navigation toggle button (44px wide, absolutely
	   positioned at the left edge of .app-content) plus 12px breathing
	   room. Only the HEADER shifts right — body content keeps full width. */
	padding-inline-start: 56px;
}

.cn-page-header__icon {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	padding-top: var(--default-grid-baseline);
	color: var(--color-primary);
}

.cn-page-header__text {
	flex: 1;
	min-width: 0;
}

.cn-page-header__title {
	margin: 0 0 var(--default-grid-baseline) 0;
	font-size: 2rem;
	font-weight: 300;
}

.cn-page-header__description {
	color: var(--color-text-maxcontrast);
	margin: 0;
	font-size: var(--default-font-size);
}

/* Accessible-heading mode (`:visually-hidden="true"`).

   The page primitives that hide their inline header (CnIndexPage,
   CnSettingsPage, CnChatPage, CnFilesPage, CnLogsPage) surface the title in
   the app sidebar instead — which sits OUTSIDE the <main> landmark, leaving
   the main content region with no heading at all (WCAG 2.4.6 / 1.3.1). This
   keeps the <h1> in the DOM and in the accessibility tree while removing it
   from the visual layout entirely, so there is no visual regression.

   `position: absolute` + 1px box + `clip`/`clip-path` is the standard
   visually-hidden recipe. `display: none` / `visibility: hidden` would
   remove the heading from the accessibility tree too and defeat the point.
   The `!important` overrides the flex/padding/margin block above without
   needing a more specific selector on every property. */
.cn-page-header--visually-hidden {
	position: absolute !important;
	width: 1px !important;
	height: 1px !important;
	padding: 0 !important;
	margin: -1px !important;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}
/* CnActionsBar — Reusable actions toolbar styles */

.cn-actions-bar {
	display: flex;
	justify-content: space-between;
	align-items: center;
	/* Wrap the actions cluster below the search on narrow containers instead of
	   overflowing (clipping the Add button / Actions menu). */
	flex-wrap: wrap;
	gap: calc(2 * var(--default-grid-baseline));
	margin-bottom: calc(5 * var(--default-grid-baseline));
	padding: calc(2 * var(--default-grid-baseline));
	background: var(--color-background-hover);
	border-radius: var(--border-radius);
	/* Named inline-size container so the narrow-layout rules below respond to
	   the BAR's own width (page content minus nav/sidebar), not the viewport. */
	container: cn-actions-bar / inline-size;
}

.cn-actions-bar__info {
	font-weight: 500;
	font-size: var(--default-font-size);
	/* Let the search area grow to fill the row but shrink (min-width:0) so the
	   actions can stay beside it until there's genuinely no room, then wrap.
	   Flex row so `#after-search` controls (filter buttons) sit BESIDE the
	   search field — the left side groups "narrow what you see". */
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
	flex: 1 1 220px;
	min-width: 0;
}

.cn-actions-bar__count {
	color: var(--color-text-maxcontrast);
}

/* Inline search field */
.cn-actions-bar__search {
	position: relative;
	display: flex;
	align-items: center;
	/* Fill the (flexible) info area up to a comfortable cap; shrinks below it. */
	width: 100%;
	max-width: 320px;
}

.cn-actions-bar__search-icon {
	position: absolute;
	left: 12px;
	color: var(--color-text-maxcontrast);
	pointer-events: none;
	display: inline-flex;
}

/* Scoped under the search wrapper (specificity 0,2,0) + !important on the
   inline padding so NC core's global `input` rule can't reset the left inset
   and let the placeholder slide under the magnifier icon. */
.cn-actions-bar__search .cn-actions-bar__search-input {
	width: 100%;
	height: 40px;
	margin: 0;
	padding-block: 0;
	padding-inline: 38px 12px !important;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-pill);
	background: var(--color-main-background);
	font-size: var(--default-font-size);
	font-weight: 400;
}

.cn-actions-bar__view-toggle-icon {
	display: inline-flex;
}

/* Standalone sort control: a leading icon + a compact select, kept on one
   line (the visible "Sort by" label is dropped; it lives on the icon's
   aria-label and the combobox's accessible name instead). */
.cn-actions-bar__sort {
	display: flex;
	align-items: center;
	gap: 4px;
}

.cn-actions-bar__sort-icon {
	display: inline-flex;
	color: var(--color-text-maxcontrast);
}

.cn-actions-bar__sort .cn-actions-bar__sort-select {
	min-width: 140px;
}

.cn-actions-bar__actions {
	display: flex;
	align-items: center;
	/* Wrap the toggle / sort / add / overflow cluster onto a second line rather
	   than overflowing when the container is narrow. */
	flex-wrap: wrap;
	justify-content: flex-end;
	gap: calc(2 * var(--default-grid-baseline));
}

.cn-actions-bar__actions .button-vue {
	/* fix issue when adding custom content, button gets squished when not needed */
	/* this is a quick and dirty fix and its possible that this will caused issue of its own when there are too many buttons */
	min-width: fit-content !important;
}

/* View mode toggle — segmented control with a sliding thumb.
   Styled entirely with Nextcloud CSS variables so any active theme (incl.
   the nldesign design systems) colours it automatically. The thumb is an
   absolutely-positioned pill that animates with `transform` between the two
   segments, giving the toggle its sliding feel. */
.cn-actions-bar__view-toggle {
	position: relative;
	display: inline-flex;
	align-items: center;
	box-sizing: border-box;
	padding: 4px;
	border-radius: var(--border-radius-pill);
	background: var(--color-background-dark);
	/* Lives in the (shrinkable) left info group — never crush the segments;
	   the search field is the one that gives up width. */
	flex: 0 0 auto;
}

/* Scoped under the toggle (specificity 0,2,0) so it beats any stale copy of the
   PREVIOUS actions-bar.css that other apps may co-load on the same page. Older
   builds shipped `.cn-actions-bar__view-toggle span { max-height: 34px }`
   (specificity 0,1,1); since the thumb is a <span>, that rule would cap it at
   34px and break the vertical centring. `max-height: none` here overrides it.
   The inset top/bottom (not a calc'd height) keeps the thumb centred and 40px. */
.cn-actions-bar__view-toggle .cn-actions-bar__view-toggle-thumb {
	position: absolute;
	top: 4px;
	bottom: 4px;
	left: 4px;
	width: calc(50% - 4px);
	max-height: none;
	border-radius: var(--border-radius-pill);
	background: var(--color-main-background);
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12);
	transition: transform 0.25s ease;
	will-change: transform;
}

.cn-actions-bar__view-toggle-thumb--right,
.cn-actions-bar__view-toggle-thumb--pos-1 {
	transform: translateX(100%);
}

.cn-actions-bar__view-toggle-thumb--pos-2 {
	transform: translateX(200%);
}

/* Three-segment layout (Cards / Table / Map): the thumb shrinks to one third of
   the track so a single translateX(100%) step lands it exactly on the next
   segment. The two-segment default above (50% - 4px) is untouched. */
.cn-actions-bar__view-toggle--three .cn-actions-bar__view-toggle-thumb {
	width: calc((100% - 8px) / 3);
}

/* Segment buttons must shed Nextcloud core's global <button> chrome (server.css
   gives every button a tinted background, 1px border, rounded corners, box-shadow
   and a 3px margin). NC's selectors vary in specificity and some outrank a plain
   scoped class, so the chrome reset uses !important — a deliberate, contained
   reset against framework CSS. Without it the button backgrounds hide the sliding
   thumb and the 3px button margin inflates the track height. The old toggle got
   this for free from NcCheckboxRadioSwitch; raw buttons have to opt out. */
.cn-actions-bar__view-toggle .cn-actions-bar__view-toggle-btn {
	position: relative;
	z-index: 1;
	display: inline-flex;
	flex: 1 1 50%;
	align-items: center;
	justify-content: center;
	gap: 8px;
	min-width: 0;
	min-height: 40px;
	margin: 0 !important;
	padding-block: 4px;
	/* Symmetric inline padding so the centred icon+label sit dead-centre in the
	   segment (and under the thumb). Asymmetric padding offsets the centring box. */
	padding-inline: 12px;
	appearance: none;
	-webkit-appearance: none;
	border: none !important;
	border-radius: var(--border-radius-pill) !important;
	background: transparent !important;
	box-shadow: none !important;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	font-size: 14px;
	font-weight: 500;
	line-height: 140%;
	cursor: pointer;
	transition: color 0.25s ease;
}

/* Neutralise Nextcloud's global button hover/focus (tint / border / shadow). */
.cn-actions-bar__view-toggle .cn-actions-bar__view-toggle-btn:hover,
.cn-actions-bar__view-toggle .cn-actions-bar__view-toggle-btn:focus,
.cn-actions-bar__view-toggle .cn-actions-bar__view-toggle-btn:active {
	background: transparent !important;
	border: none !important;
	box-shadow: none !important;
}

.cn-actions-bar__view-toggle .cn-actions-bar__view-toggle-btn:hover {
	color: var(--color-main-text);
}

.cn-actions-bar__view-toggle .cn-actions-bar__view-toggle-btn:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: -2px;
}

.cn-actions-bar__view-toggle .cn-actions-bar__view-toggle-btn--active {
	color: var(--color-main-text);
}

.cn-actions-bar__view-toggle-label {
	white-space: nowrap;
}

/* Contextual selection strip: its own full-width row inside the bar while a
   selection is active, primary-tinted so the selection mode reads as a
   distinct state (Proton Pass / Gmail / Files pattern). */
.cn-actions-bar__selection {
	flex: 1 1 100%;
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: calc(2 * var(--default-grid-baseline));
	padding: var(--default-grid-baseline) calc(2 * var(--default-grid-baseline));
	border-radius: var(--border-radius);
	background: var(--color-primary-element-light);
	color: var(--color-primary-element-light-text);
}

.cn-actions-bar__selection-count {
	font-weight: 600;
}

/* Clear sits at the far end of the strip. */
.cn-actions-bar__selection-clear {
	margin-inline-start: auto;
}

/* Visually-hidden live region (role="status") for the selection count —
   always present so assistive tech announces selection changes (WCAG 2.1
   SC 4.1.3 Status Messages). */
.cn-actions-bar__sr-status {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}

/* Override Nextcloud's pointer-events:none on disabled action items
   so native title tooltip is visible on hover.
   The button's disabled attribute still prevents click events. */
.action.action--disabled {
	pointer-events: auto !important;
	cursor: not-allowed;
}

.action.action--disabled button {
	cursor: not-allowed;
}

/* Narrow-container layout (the bar is a named inline-size container;
   browsers without container-query support keep the default wrapping —
   functional, just less tidy).

   The MARKUP already groups by role at every width: the left info group
   holds the visual controls (search, #after-search filters, the view
   toggle), the right cluster the act controls (add, overflow) plus the
   standalone sort select — a display control kept on the right as legacy
   placement from before this split.
   Under ~900px of bar width — where wrapping becomes a real possibility —
   both groups flatten (`display: contents`) into the bar's own flex row
   so the controls wrap as individual items in that same role order, and
   every control grows to fill its row: on a break the view toggle stays
   with the search group and the act buttons drop to their own full-width
   row — no ragged right-aligned staircase. The view-toggle segments also
   go icon-only (labels stay in the accessibility tree) to keep one row
   viable longer. */
@container cn-actions-bar (max-width: 900px) {
	.cn-actions-bar__info,
	.cn-actions-bar__actions {
		display: contents;
	}

	/* #after-search filter buttons + the view toggle ride beside the
	   search field (DOM order — search first via its own order). */
	.cn-actions-bar__info > * {
		order: 1;
	}

	.cn-actions-bar__search {
		order: 0;
		flex: 1 1 200px;
		max-width: none;
	}

	.cn-actions-bar__actions > * {
		order: 2;
		flex: 1 1 auto;
	}

	/* On its own wrapped row the toggle may stretch (segments share the
	   width); the base no-shrink rule keeps it intact while inline. */
	.cn-actions-bar__view-toggle {
		flex: 1 1 auto;
	}

	/* The sort control's select grows with its row (the 140px floor stays
	   as the flex basis via min-width on the select itself). */
	.cn-actions-bar__sort .cn-actions-bar__sort-select {
		flex: 1 1 auto;
	}

	/* Visually hidden, NOT display:none — the label remains each segment
	   button's accessible name. */
	.cn-actions-bar__view-toggle-label {
		position: absolute;
		width: 1px;
		height: 1px;
		overflow: hidden;
		clip-path: inset(50%);
		white-space: nowrap;
	}

	/* The flattened groups get explicit orders (0/1/2); keep the selection
	   strip after ALL of them so it stays the bar's last row. */
	.cn-actions-bar__selection {
		order: 3;
	}

	/* Narrow strip: Clear drops to its OWN row, flowing from the start — a
	   right-pinned control on a wrapped row reads as detached. The ::after
	   pseudo (order 1) is a full-width flex line-break between the bulk
	   actions (order 0, the default) and Clear (order 2). */
	.cn-actions-bar__selection::after {
		content: "";
		flex-basis: 100%;
		order: 1;
	}

	.cn-actions-bar__selection .cn-actions-bar__selection-clear {
		margin-inline-start: 0;
		order: 2;
	}
}
/* CnIndexPage — Index page layout styles */
/* Header styles: see page-header.css (CnPageHeader) */
/* Actions bar styles: see actions-bar.css (CnActionsBar) */

.cn-index-page {
	display: flex;
	flex-direction: column;
	height: 100%;
	min-height: 0;
	padding: calc(5 * var(--default-grid-baseline));
}

.cn-index-page__below-header {
    margin-bottom: calc(4 * var(--default-grid-baseline));
}

/* A below-header wrapper whose slot renders nothing on this route (e.g. an
   empty breadcrumb trail at the root) must not leave its margin as a blank
   band above the actions bar. Vue leaves only comment placeholders for
   v-if'd-away content, and comments don't defeat :empty. */
.cn-index-page__below-header:empty {
	display: none;
}

/* Body layout */
.cn-index-page__body {
	display: flex;
	flex: 1;
	min-height: 0;
}

.cn-index-page__main {
	flex: 1;
	min-width: 0;
	min-height: 0;
	overflow-y: auto;
}

/* Map view fills the remaining space instead of sitting at a fixed height — no
   dead area under the map and nothing to scroll past to reach the cases. The map
   pans internally, so the column itself must not scroll. */
.cn-index-page__main--map {
	display: flex;
	flex-direction: column;
	overflow: hidden;
}

.cn-index-page__map {
	flex: 1;
	min-height: 300px;
}

/* Opt-in folder navigation pane (left of the list). */
.cn-index-page__folder-pane {
	flex: 0 0 240px;
	min-width: 0;
	padding: 8px 12px 8px 0;
	margin-right: 12px;
	border-right: 1px solid var(--color-border);
	overflow-y: auto;
}

.cn-index-page__loading {
	display: flex;
	justify-content: center;
	padding: calc(15 * var(--default-grid-baseline));
}

.cn-index-page__empty {
	padding: calc(10 * var(--default-grid-baseline)) calc(5 * var(--default-grid-baseline));
	text-align: center;
}

/* Explicit `0` rather than dropping the declaration: this element carries both
   `.cn-pagination` and `.cn-index-page__pagination`, and `.cn-pagination` sets
   `margin-top: calc(8 * baseline)` at the same (0,1,0) specificity. Only the
   later import (index-page.css, see index.css) wins the tie — deleting the
   declaration here would hand the element the larger 8-baseline margin instead
   of none. CnPagination's own 5-baseline padding supplies the spacing. */
.cn-index-page__pagination {
	margin-top: 0;
}

/* Table view owns both scroll axes. With the page column scrolling instead, the
   table's horizontal scrollbar sat at the bottom of the (taller-than-viewport)
   table, so it only appeared after scrolling down, and the pagination was
   likewise out of reach. Moving overflow onto the table container puts the
   horizontal scrollbar at the bottom edge of the visible table and keeps the
   pagination pinned below it. Must stay after the base `__main` /
   `__pagination` rules above — it overrides both. */
.cn-index-page__main--table {
	display: flex;
	flex-direction: column;
	overflow: hidden;
}

.cn-index-page__main--table > .cn-table-container {
	flex: 1;
	min-height: 0;
	/* Clip rather than scroll: the scrollport is `.cn-data-table__scroll` below.
	   A flex column so that wrapper can take the leftover height. */
	display: flex;
	flex-direction: column;
	overflow: hidden;
	/* CnPagination's own padding supplies the spacing below the table; the
	   container's bottom margin would only add dead space above the pinned
	   pagination row. */
	margin-bottom: 0;
}

/* CnDataTable puts horizontal overflow on its own `.cn-data-table__scroll`
   wrapper, NOT on `.cn-table-container`, so a dashboard widget-card's sticky
   footer anchors to the card instead of the table (see table.css). Per the
   overflow spec its `overflow-y` then computes from `visible` to `auto`, making
   that wrapper the nearest scrollport for everything inside the table — but its
   height is content-driven, so it never actually scrolls. Both of this view's
   guarantees broke on it: the sticky `th` pinned to a box that never moves, and
   the horizontal scrollbar sat at the bottom of the full table instead of the
   visible edge. Constraining its height makes it the real scrollport on BOTH
   axes, which also keeps the keyboard tab stop CnDataTable puts on this element
   (`scrollable-region-focusable`) on the element that genuinely scrolls. */
.cn-index-page__main--table .cn-data-table__scroll {
	flex: 1;
	min-height: 0;
	overflow: auto;
}

.cn-index-page__main--table > .cn-index-page__pagination {
	flex: 0 0 auto;
}

/* Pin the column headers while the rows scroll. Only viable in this view mode,
   where the scroll wrapper above is height-constrained — elsewhere CnDataTable's
   nearest scrolling ancestor is the page or a widget body, and pinning to that
   is wrong. Sticky sits on the `th`, NOT on `thead`/`tr`: `.cn-data-table` is
   `border-collapse: collapse`, and browsers don't reliably honour sticky on the
   row/group elements under the collapsed-border model. `th` already carries an
   opaque background, so rows can't show through. */
.cn-index-page__main--table .cn-data-table thead th {
	position: sticky;
	top: 0;
	z-index: 1;
	/* The collapsed bottom border belongs to the table's border layer and stays
	   behind when the cell pins, leaving the pinned header with no bottom rule —
	   redraw it as an inset shadow, which travels with the cell. */
	box-shadow: inset 0 -1px 0 var(--color-border);
}
/* CnIndexSidebar — NcAppSidebar wrapper styles */

/* Tab content: limit height to container so overflow shows a scrollbar */
.cn-index-sidebar__tab-content {
	max-height: 100%;
	min-height: 0;
	overflow-y: auto;
}

/* Sidebar header icon (compact mode figure area) */
.cn-index-sidebar__header-icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 100%;
	color: var(--color-primary-element);
}

.cn-index-sidebar__header-emoji {
	font-size: 28px;
	line-height: 1;
}

/* Search tab sections */
.cn-index-sidebar__section {
	padding: calc(4 * var(--default-grid-baseline));
}

.cn-index-sidebar__section h3 {
	margin: 0 0 calc(3 * var(--default-grid-baseline)) 0;
	font-size: 15px;
	font-weight: 600;
}

.cn-index-sidebar__description {
	color: var(--color-text-maxcontrast);
	font-size: 13px;
	margin: 0 0 calc(4 * var(--default-grid-baseline)) 0;
}

.cn-index-sidebar__filter-group {
	margin-bottom: calc(3 * var(--default-grid-baseline));
}

.cn-index-sidebar__filter-header {
	display: flex;
	align-items: center;
	gap: var(--default-grid-baseline);
	margin-bottom: var(--default-grid-baseline);
}

.cn-index-sidebar__filter-label {
	font-size: 13px;
	font-weight: 500;
	color: var(--color-main-text);
}

.cn-index-sidebar__info-btn {
	min-width: var(--clickable-area-small, 24px) !important;
	min-height: var(--clickable-area-small, 24px) !important;
	width: var(--clickable-area-small, 24px) !important;
	height: var(--clickable-area-small, 24px) !important;
	padding: 0 !important;
	color: var(--color-text-maxcontrast);
}

.cn-index-sidebar__info-btn:hover {
	color: var(--color-primary);
}

.cn-index-sidebar__filter-description {
	padding: calc(2 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline));
	max-width: 260px;
	font-size: 13px;
	color: var(--color-main-text);
	margin: 0;
	line-height: var(--default-line-height, 1.4);
}

.cn-index-sidebar__select {
	width: 100%;
}

/* Visually hide NcSelect's rendered label — the filter heading already shows it.
   Keep input-label prop for screen-reader accessibility. */
.cn-index-sidebar__select label {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

.cn-index-sidebar__empty {
	color: var(--color-text-maxcontrast);
	font-size: 13px;
	font-style: italic;
}

/* ── Columns tab ── */

.cn-sidebar-columns {
	padding: calc(4 * var(--default-grid-baseline));
}

.cn-sidebar-columns h3 {
	margin-top: 0;
	margin-bottom: calc(2 * var(--default-grid-baseline));
	font-size: 18px;
	font-weight: 600;
}

.cn-sidebar-columns__description {
	color: var(--color-text-maxcontrast);
	margin-bottom: calc(4 * var(--default-grid-baseline));
	font-size: var(--default-font-size);
}

/* Collapsible column group card */
.cn-sidebar-columns__group {
	margin-bottom: calc(6 * var(--default-grid-baseline));
}

.cn-sidebar-columns__group h4 {
	margin-top: 0;
	margin-bottom: calc(3 * var(--default-grid-baseline));
	font-size: var(--default-font-size);
	font-weight: 600;
	color: var(--color-text-light);
	border-bottom: 1px solid var(--color-border);
	padding-bottom: calc(2 * var(--default-grid-baseline));
}

.cn-sidebar-columns__group .checkbox-radio-switch {
	margin-bottom: calc(2 * var(--default-grid-baseline));
}

.cn-sidebar-columns__group .checkbox-radio-switch__content {
	padding: var(--default-grid-baseline) 0;
}

.cn-sidebar-columns__group--collapsible {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 0;
	margin-bottom: calc(3 * var(--default-grid-baseline));
}

.cn-sidebar-columns__group-header {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
	padding: calc(3 * var(--default-grid-baseline));
	cursor: pointer;
	user-select: none;
	transition: background-color var(--animation-quick) ease;
}

.cn-sidebar-columns__group-header:hover {
	background-color: var(--color-background-hover);
}

.cn-sidebar-columns__group-header h4 {
	margin: 0;
	padding: 0;
	border: none;
	flex: 1;
	color: var(--color-main-text);
}

.cn-sidebar-columns__select-all {
	margin: 0 !important;
	font-size: 12px;
}

.cn-sidebar-columns__group-content {
	padding: calc(3 * var(--default-grid-baseline));
	border-top: 1px solid var(--color-border);
	display: flex;
	flex-direction: column;
	gap: calc(2 * var(--default-grid-baseline));
}

.cn-sidebar-columns__empty {
	color: var(--color-text-maxcontrast);
	font-size: 13px;
	font-style: italic;
}
/* @conduction/nextcloud-vue — Dashboard component styles */

/* Dashboard page layout */
.cn-dashboard-page {
	padding: 20px;
	max-width: 1800px;
	/* Centre the leftover space once the cap engages, so a wide screen shows
	   an even gutter instead of one dead column on the right. Matches
	   .cn-detail-page. */
	margin-inline: auto;
}

/* Widget-wrapped grid items draw no chrome on the grid cell itself — the inner
   .cn-widget-wrapper already provides the rounded border, background and shadow.
   Leaving the cell a white square with a 1px border makes square corners peek out
   behind the wrapper's 16px rounding. Mirrors the .cn-detail-page__grid reset in
   detail-page.css. This is a global stylesheet, not a scoped SFC block, so the
   descendant selector is written plainly — a Vue deep-selector wrapper here is
   invalid CSS and the whole rule gets dropped. */
.cn-dashboard-grid .grid-stack-item-content:has(.cn-widget-wrapper) {
	border: none;
	background: transparent;
	box-shadow: none;
}

/* Dashboard widget content area */
.cn-dashboard-widget-content {
	padding: 16px;
}

/* Dashboard KPI row inside grid */
.cn-dashboard-kpi-row {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 16px;
	height: 100%;
}

/* Dashboard chart container */
.cn-dashboard-chart {
	padding: 16px;
	height: 100%;
	display: flex;
	flex-direction: column;
}

.cn-dashboard-chart__title {
	margin: 0 0 12px;
	font-size: 15px;
	font-weight: 600;
}

.cn-dashboard-chart__content {
	flex: 1;
	min-height: 0;
	overflow: auto;
}

/* Dashboard list widget */
.cn-dashboard-list {
	padding: 0;
	margin: 0;
	list-style: none;
}

.cn-dashboard-list__item {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 16px;
	cursor: pointer;
	border-bottom: 1px solid var(--color-border-dark);
}

.cn-dashboard-list__item:last-child {
	border-bottom: none;
}

.cn-dashboard-list__item:hover {
	background: var(--color-background-hover);
}
/* ========================================
   @conduction/nextcloud-vue — CnDetailPage Styles
   ======================================== */

.cn-detail-page {
	margin-inline: auto;
	padding: calc(5 * var(--default-grid-baseline));
	position: relative;
}

/* Header */
.cn-detail-page__header {
	display: flex;
	justify-content: space-between;
	/* Pin the action surface to the TOP-right (not vertically centred against a
	   tall header) so actions always sit on the title row. */
	align-items: flex-start;
	margin-bottom: calc(4 * var(--default-grid-baseline));
	/* Keep actions on the same row — the header content shrinks (min-width:0
	   on the first child below) rather than wrapping actions onto a new line. */
	flex-wrap: nowrap;
	gap: calc(4 * var(--default-grid-baseline));
	/* Clear the Nextcloud navigation toggle button (44px wide, absolutely
	   positioned at the left edge of .app-content) plus 12px breathing
	   room. Only the HEADER shifts right — body content keeps full width. */
	padding-inline-start: 56px;
}

/* Header content block (#header slot / default left block) takes the remaining
   width and may shrink so the actions stay top-right. */
.cn-detail-page__header > :first-child {
	flex: 1 1 auto;
	min-width: 0;
}

.cn-detail-page__header-left {
	display: flex;
	align-items: center;
	gap: calc(3 * var(--default-grid-baseline));
	min-width: 0;
}

.cn-detail-page__header-text {
	min-width: 0;
}

.cn-detail-page__icon {
	flex-shrink: 0;
}

.cn-detail-page__title-group {
	display: flex;
	align-items: baseline;
	gap: calc(3 * var(--default-grid-baseline));
	min-width: 0;
}

.cn-detail-page__type-eyebrow {
	margin: 0 0 2px;
	font-size: 12px;
	font-weight: 600;
	letter-spacing: 0.02em;
	text-transform: uppercase;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

.cn-detail-page__title {
	margin: 0;
	font-size: 22px;
	font-weight: 700;
	line-height: 1.3;
	color: var(--color-main-text);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

.cn-detail-page__subtitle {
	font-size: 14px;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
}

.cn-detail-page__description {
	margin: 4px 0 0;
	font-size: var(--default-font-size);
	color: var(--color-text-maxcontrast);
}

.cn-detail-page__header-actions {
	display: flex;
	gap: calc(2 * var(--default-grid-baseline));
	flex-wrap: wrap;
	flex-shrink: 0;
}

/* Loading state */
.cn-detail-page__loading {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
	color: var(--color-text-maxcontrast);
	justify-content: center;
	padding-block: calc(8 * var(--default-grid-baseline));
}

/* Error state */
.cn-detail-page__error {
	padding: calc(8 * var(--default-grid-baseline)) calc(4 * var(--default-grid-baseline));
}

/* Empty state */
.cn-detail-page__empty {
	padding: calc(8 * var(--default-grid-baseline)) calc(4 * var(--default-grid-baseline));
}

/* Statistics table */
.cn-detail-page__stats {
	margin-bottom: calc(5 * var(--default-grid-baseline));
}

.cn-detail-page__section-title {
	margin: 0 0 calc(2 * var(--default-grid-baseline));
	font-size: 1.1em;
	font-weight: 600;
	color: var(--color-main-text);
}

.cn-detail-page__stats-table {
	width: 100%;
	border-collapse: collapse;
	background: var(--color-main-background);
	border-radius: var(--border-radius-large);
	overflow: hidden;
	border: 1px solid var(--color-border);
}

.cn-detail-page__stats-table thead th {
	padding: calc(1.5 * var(--default-grid-baseline)) calc(2 * var(--default-grid-baseline));
	text-align: left;
	font-weight: 600;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	background: var(--color-background-hover);
	border-bottom: 1px solid var(--color-border);
}

.cn-detail-page__stats-row--sub td {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}

.cn-detail-page__stats-table tbody td {
	padding: calc(1.5 * var(--default-grid-baseline)) calc(2 * var(--default-grid-baseline));
	border-bottom: 1px solid var(--color-border-dark);
	color: var(--color-main-text);
	font-size: 0.95em;
}

.cn-detail-page__stats-table tbody tr:last-child td {
	border-bottom: none;
}

.cn-detail-page__stats-cell--indented {
	padding-left: calc(5 * var(--default-grid-baseline)) !important;
}

.cn-detail-page__stats-cell--center {
	text-align: center;
}

.cn-detail-page__stats-cell--right {
	text-align: right;
}

/* Body & content */
.cn-detail-page__body {
	display: flex;
	flex-direction: column;
	gap: calc(5 * var(--default-grid-baseline));
}

.cn-detail-page__content {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: calc(4 * var(--default-grid-baseline));
}

/* Grid layout mode + schema-driven auto-body both render on the GridStack
   engine (CnDashboardGrid). The default Data + Related body is seeded as a
   real drag/resize grid so Buildiq edit mode can rearrange it. */
.cn-detail-page__grid {
	width: 100%;
}

/* Each widget fills its grid cell; GridStack's `.grid-stack-item-content` is
   `overflow: hidden`, so let a tall widget (e.g. a long data form) scroll
   within its cell rather than clip. */
.cn-detail-page__grid .grid-stack-item-content {
	overflow: auto;
}

/* dashboard.css draws a square cell border + background around any grid cell
   holding a CnWidgetWrapper — a DASHBOARD look. On detail pages the widget's
   own rounded card (ADR-062) is the only chrome; the square cell outline
   showed as a stray gray line behind the rounded corners. The doubled class
   outranks the dashboard rule at equal source order. */
.cn-dashboard-grid.cn-detail-page__grid .grid-stack-item-content:has(.cn-widget-wrapper) {
	border: none;
	background: transparent;
	box-shadow: none;
}

.cn-detail-page__grid-item {
	min-width: 0;
	height: 100%;
	position: relative;
}

/* Content-only catalog widgets (object-list / table) rendered on the
   CnWidgetWrapper card chrome (ADR-062). The wrapper fills its grid cell so
   the widget can fit its row count to the cell height, and the table region
   flexes between the card header and the view-all footer. */
.cn-detail-page__catalog-card {
	height: 100%;
	display: flex;
	flex-direction: column;
}

.cn-detail-page__catalog-card .cn-widget-wrapper__content {
	flex: 1 1 auto;
	min-height: 0;
	display: flex;
	flex-direction: column;
}

/* Registry "card" widgets (stat / gauge / delta) get the same titled card
   chrome as content-only widgets, plus a centred, non-scrolling body so a
   short KPI tile fits its cell without an inner scrollbar (ADR-062). */
.cn-detail-page__card-fit {
	height: 100%;
	display: flex;
	flex-direction: column;
}

.cn-detail-page__card-fit .cn-widget-wrapper__content {
	overflow: hidden;
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding: 8px 14px;
}

.cn-detail-page__card-fit .cn-stat-widget,
.cn-detail-page__card-fit .cn-gauge-widget,
.cn-detail-page__card-fit .cn-delta-widget {
	min-width: 0;
	max-width: 100%;
}

/* Buildiq in-app edit cog (ADR-041), shown over a configurable widget
   while the page is in edit mode. Mirrors the dashboard's widget-edit cog. */
.cn-detail-page__widget-edit {
	position: absolute;
	top: 4px;
	inset-inline-end: 4px;
	z-index: 5;
	background: var(--color-main-background);
	border-radius: var(--border-radius);
	box-shadow: 0 1px 4px var(--color-box-shadow, rgba(0, 0, 0, 0.2));
}

.cn-detail-page__widget-title {
	margin: 0 0 calc(2 * var(--default-grid-baseline)) 0;
	font-size: 16px;
	font-weight: 600;
	line-height: 1.4;
}

.cn-detail-page__sections {
	margin-top: calc(4 * var(--default-grid-baseline));
}

/* Sidebar */
.cn-detail-page__sidebar {
	width: 340px;
	flex-shrink: 0;
	position: sticky;
	top: calc(5 * var(--default-grid-baseline));
}

.cn-detail-page__sidebar-toggle {
	position: fixed;
	right: calc(5 * var(--default-grid-baseline));
	top: 80px;
	z-index: 10;
}

/* Footer */
.cn-detail-page__footer {
	margin-top: calc(4 * var(--default-grid-baseline));
	padding-top: calc(3 * var(--default-grid-baseline));
	border-top: 1px solid var(--color-border);
}

/* Responsive */
@media (max-width: 768px) {
	.cn-detail-page {
		padding: calc(3 * var(--default-grid-baseline));
	}

	.cn-detail-page__header {
		flex-direction: column;
	}

	.cn-detail-page__header-actions {
		width: 100%;
	}
}
.cn-schema-form__detail-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 20px;
  margin-bottom: 20px;
  padding: 0 20px;
  width: 100%;
  box-sizing: border-box;
}

.cn-schema-form__detail-item {
  display: flex;
  flex-direction: column;
  padding: 15px;
  background-color: var(--color-background-hover);
  border-radius: var(--border-radius);
  border-left: 3px solid var(--color-primary);
  box-shadow: 0 1px 3px var(--color-box-shadow);
  transition: transform var(--animation-quick) ease,
    box-shadow var(--animation-quick) ease;
}

.cn-schema-form__detail-item:hover {
  transform: translateY(-1px);
  box-shadow: 0 2px 6px var(--color-box-shadow);
}

.cn-schema-form__detail-label {
  font-weight: bold;
  color: var(--color-text-maxcontrast);
  margin-bottom: 5px;
  font-size: 0.9em;
}

.cn-schema-form__detail-value {
  overflow-wrap: anywhere;
  color: var(--color-main-text);
  line-height: 1.4;
}

.cn-schema-form__id-card {
  background-color: var(--color-background-hover);
  border-left-color: var(--color-primary-element);
}

.cn-schema-form__id-card-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  width: 100%;
  margin-bottom: 5px;
}

.cn-schema-form__id-card .cn-schema-form__detail-value {
  word-break: break-all;
  margin-top: 4px;
  font-family: monospace;
  font-size: 0.9em;
  background-color: var(--color-background-dark);
  padding: 4px 6px;
  border-radius: var(--border-radius-small);
}

.cn-schema-form__uuid-value {
  font-size: 0.9em;
  color: var(--color-text-maxcontrast);
  font-family: monospace;
  margin-top: 4px;
  display: block;
  background-color: var(--color-background-dark);
  padding: 4px 6px;
  border-radius: var(--border-radius-small);
}

.cn-schema-form__copy-button {
  height: 30px;
  flex-shrink: 0;
  margin-top: 5px;
}

/* Tab container */
.cn-schema-form__tabContainer {
  margin-top: 20px;
}

.cn-schema-form__tabContainer > * ul > li {
  display: flex;
  flex: 1;
}

.cn-schema-form__tabContainer > * ul > li > a {
  flex: 1;
  text-align: center;
}

.cn-schema-form__tabContainer > * ul > li > .active {
  background: transparent !important;
  color: var(--color-main-text) !important;
  border-bottom: var(--default-grid-baseline) solid var(--color-primary-element) !important;
}

.cn-schema-form__tabContainer > * ul[role="tablist"] {
  display: flex;
  margin: 10px 8px 0 8px;
  justify-content: space-between;
  border-bottom: 1px solid var(--color-border);
}

.cn-schema-form__tabContainer > * ul[role="tablist"] > * a[role="tab"] {
  padding-inline-start: 10px;
  padding-inline-end: 10px;
  padding-block-start: 10px;
  padding-block-end: 10px;
}

.cn-schema-form__tabContainer > * div[role="tabpanel"] {
  margin-block-start: var(--OR-margin-10);
}

/* Table styles */
.cn-schema-form__scrollable {
  max-height: 400px;
  overflow-y: auto;
}

.cn-schema-form__viewTable {
  width: 100%;
  border-collapse: collapse;
  background-color: var(--color-main-background);
}

.cn-schema-form__viewTable th,
.cn-schema-form__viewTable td {
  padding: 12px;
  text-align: left;
  border-bottom: 1px solid var(--color-border);
  vertical-align: middle;
}

.cn-schema-form__viewTable th {
  background: var(--color-background-hover);
  font-weight: 500;
  color: var(--color-text-maxcontrast);
  background-color: var(--color-background-dark);
}

.cn-schema-form__viewTable tbody tr.cn-schema-form__selected-row {
  background-color: var(--color-primary-light);
  border-left: 3px solid var(--color-primary);
}

.cn-schema-form__viewTable tbody tr.cn-schema-form__selected-row:hover {
  background-color: var(--color-primary-light);
}

/* Applied to each td of the row currently being edited so inputs sit at the same baseline */
.cn-schema-form__editing-cell {
  vertical-align: baseline !important;
}

.cn-schema-form__viewTable tbody tr.cn-schema-form__modified-row {
  background-color: var(--color-warning);
  border-left: 3px solid var(--color-element-warning);
}

.cn-schema-form__viewTable tbody tr.cn-schema-form__modified-row:hover {
  background-color: var(--color-warning);
}

.cn-schema-form__viewTable
  tbody
  tr.cn-schema-form__modified-row.cn-schema-form__selected-row {
  background-color: var(--color-primary-light);
  border-left: 3px solid var(--color-primary);
}

.cn-schema-form__viewTable tbody tr.cn-schema-form__inherited-row {
  background-color: var(--color-background-dark);
  border-left: 3px solid var(--color-text-maxcontrast);
  cursor: default;
  opacity: 0.8;
}

.cn-schema-form__viewTable tbody tr.cn-schema-form__inherited-row:hover {
  background-color: var(--color-background-dark);
}

/* Form editor */
.cn-schema-form__form-editor {
  display: flex;
  flex-direction: column;
  gap: 16px;
  padding: 16px;
}

/* Property row inline editing */
.cn-schema-form__name-input-container {
  display: flex;
  align-items: center;
  gap: 8px;
}

.cn-schema-form__warning-icon {
  color: var(--color-warning-text);
  flex-shrink: 0;
}

.cn-schema-form__lock-icon {
  color: var(--color-text-maxcontrast);
  flex-shrink: 0;
}

/* Table column widths */
.cn-schema-form__tableColumnActions {
  width: 150px;
  text-align: right;
}

/* Table actions button */
.cn-schema-form__table-actions {
  margin-bottom: 15px;
  display: flex;
  justify-content: flex-end;
}

/* Enum preview styling */
.cn-schema-form__enum-preview {
  margin-top: 4px;
  display: flex;
  align-items: center;
  gap: 4px;
  flex-wrap: wrap;
}

.cn-schema-form__enum-label {
  color: var(--color-text-maxcontrast);
  font-size: 11px;
  font-weight: 500;
  margin-right: 4px;
}

.cn-schema-form__enum-value-chip {
  background: var(--color-primary-light);
  color: var(--color-primary-light-text);
  padding: 2px 6px;
  border-radius: var(--border-radius-container);
  font-size: 10px;
  font-weight: 500;
  border: 1px solid var(--color-primary-element-light);
}

.cn-schema-form__property-chip.cn-schema-form__chip-info {
  background: var(--color-info);
  color: var(--color-primary-text);
}

.cn-schema-form__property-chip.cn-schema-form__chip-table {
  background: var(--color-primary);
  color: var(--color-primary-text);
}

/* Enum chip styling for action menu using NcActionButton */
.cn-schema-form__enum-action-chip {
  background: var(--color-primary-element-light) !important;
  border-radius: var(--border-radius-container-large) !important;
  margin: 2px 4px !important;
  padding: 4px 12px !important;
}

.cn-schema-form__enum-action-chip:hover {
  background: var(--color-primary-element) !important;
}

.cn-schema-form__enum-action-chip .action-button__text {
  color: var(--color-primary-text) !important;
  font-size: 12px !important;
  font-weight: 500 !important;
}

.cn-schema-form__enum-action-chip .action-button__icon {
  color: var(--color-primary-text) !important;
}

/* RBAC Security Tab Styling */
.cn-schema-form__security-section {
  padding: 20px 0;
}

.cn-schema-form__loading-groups {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 20px;
  justify-content: center;
}

.cn-schema-form__rbac-table-container {
  margin-top: 20px;
}

.cn-schema-form__rbac-table-container h3 {
  margin-bottom: 15px;
  color: var(--color-main-text);
  font-size: 16px;
  font-weight: 600;
}

.cn-schema-form__rbac-table {
  width: 100%;
  border-collapse: collapse;
  border: 1px solid var(--color-border-dark);
  border-radius: var(--border-radius-element);
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(var(--color-box-shadow-rgb), 0.1);
}

.cn-schema-form__rbac-table th {
  background: var(--color-background-dark);
  color: var(--color-main-text);
  font-weight: 600;
  padding: 12px 16px;
  text-align: left;
  border-bottom: 2px solid var(--color-border-dark);
}

.cn-schema-form__rbac-table th:first-child {
  width: 40%;
}

.cn-schema-form__rbac-table th:not(:first-child) {
  width: 15%;
  text-align: center;
}

.cn-schema-form__rbac-table td {
  padding: 12px 16px;
  border-bottom: 1px solid var(--color-border);
  vertical-align: middle;
}

.cn-schema-form__rbac-table td:not(.cn-schema-form__group-name) {
  text-align: center;
}

.cn-schema-form__rbac-table tr:hover {
  background: var(--color-background-hover);
}

.cn-schema-form__public-row {
  background: var(--color-primary-light) !important;
}

.cn-schema-form__user-row {
  background: var(--color-warning) !important;
}

.cn-schema-form__admin-row {
  background: var(--color-success) !important;
}

.cn-schema-form__admin-row:hover {
  background: var(--color-success) !important;
}

.cn-schema-form__group-name {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.cn-schema-form__group-badge {
  display: inline-block;
  padding: 4px 8px;
  border-radius: var(--border-radius-container);
  font-size: 12px;
  font-weight: 600;
  background: var(--color-primary-element-light);
  color: var(--color-primary-light-text);
}

.cn-schema-form__group-badge.cn-schema-form__public {
  background: var(--color-info);
  color: var(--color-primary-text);
}

.cn-schema-form__group-badge.cn-schema-form__user {
  background: var(--color-warning);
  color: var(--color-warning-text);
}

.cn-schema-form__group-badge.cn-schema-form__admin {
  background: var(--color-success);
  color: var(--color-success-text);
}

.cn-schema-form__group-name small {
  color: var(--color-text-maxcontrast);
  font-size: 11px;
  font-style: italic;
}

.cn-schema-form__rbac-summary {
  margin-top: 20px;
}

.cn-schema-form__inherit-from-public {
  margin-top: 20px;
  padding: 12px;
  background-color: var(--color-background-hover);
  border-radius: var(--border-radius);
}

.cn-schema-form__inherit-from-public-description {
  margin-top: 4px;
  margin-left: 28px;
  font-size: 0.85rem;
  color: var(--color-text-maxcontrast);
}

/* Property-level RBAC Styling - Action Menu Based */
.cn-schema-form__property-permission-text {
  font-family: monospace;
  font-size: 12px;
  font-weight: 600;
}

.cn-schema-form__property-permission-remove-btn {
  font-size: 11px;
  color: var(--color-error);
}

/* Schema Extension Status Pill */
.cn-schema-form__statusPill {
  display: inline-block;
  padding: 4px 12px;
  border-radius: var(--border-radius-container);
  font-size: 0.75em;
  font-weight: 600;
  text-transform: uppercase;
  margin-left: 8px;
  white-space: nowrap;
  vertical-align: middle;
}

.cn-schema-form__statusPill--alert {
  background-color: var(--color-warning);
  color: var(--color-warning-text);
}

/* Title with badge layout */
.cn-schema-form__title-with-badge {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
}

.cn-schema-form__title-with-badge > :first-child {
  flex: 1;
  min-width: 0;
}

/* Parent schema link styling */
.cn-schema-form__parent-schema-link {
  margin-top: 12px;
  padding: 8px 12px;
  background-color: var(--color-background-dark);
  border-radius: var(--border-radius);
  font-size: 0.9em;
}

.cn-schema-form__parent-schema-link strong {
  color: var(--color-main-text);
}

/* Extend info card styling */
.cn-schema-form__extend-info {
  margin-top: 12px;
  margin-bottom: 12px;
}

.cn-schema-form__extend-info p {
  margin: 8px 0;
}

.cn-schema-form__extend-info p:first-of-type {
  margin-top: 0;
}

.cn-schema-form__extend-info p:last-of-type {
  margin-bottom: 0;
}

/* Property name with chips (moved from openregister/css/main.css) */
.cn-schema-form__name-display-container {
  display: flex;
  align-items: center;
  gap: 8px;
}

.cn-schema-form__name-with-chips {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

.cn-schema-form__inline-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  align-items: center;
}

.cn-schema-form__property-chip {
  display: inline-block;
  padding: 2px 6px;
  border-radius: var(--border-radius-pill);
  font-size: 0.7em;
  font-weight: 500;
  line-height: 1.2;
  white-space: nowrap;
}

.cn-schema-form__chip-primary {
  background-color: var(--color-primary-element-light);
  color: var(--color-primary-element-text);
}

.cn-schema-form__chip-secondary {
  background-color: var(--color-background-dark);
  color: var(--color-text-maxcontrast);
  border: 1px solid var(--color-border);
}

.cn-schema-form__chip-warning {
  background-color: var(--color-warning);
  color: var(--color-warning-text);
}

.cn-schema-form__chip-success {
  background-color: var(--color-success);
  color: var(--color-success-text);
}

.cn-schema-form__chip-inherited {
  background-color: var(--color-background-dark);
  color: var(--color-text-maxcontrast);
  border: 1px solid var(--color-border);
}

.cn-schema-form__properties-warning {
  margin-top: 15px;
}

/* Copied from openregister — also used in other files */
.cn-schema-form__property-name {
  font-weight: 500;
}

.cn-schema-form__statusPill--success {
  background-color: var(--color-success);
  color: var(--color-success-text);
}

.cn-schema-form__statusPill--info {
  background-color: var(--color-info);
  color: var(--color-info-text);
}

/* Advanced: Conditional Access Rules — accordion + rule cards */
.cn-schema-form__conditional-section {
  margin-top: 32px;
}

.cn-schema-form__cond-accordion-header {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 12px 16px;
  background: var(--color-background-dark);
  border: 1px solid var(--color-border);
  border-radius: var(--border-radius-element);
  cursor: pointer;
  font-size: 14px;
  font-weight: 600;
  color: var(--color-main-text);
  text-align: left;
  transition: background var(--animation-quick) ease;
}

.cn-schema-form__cond-accordion-header:hover {
  background: var(--color-background-hover);
}

.cn-schema-form__cond-chevron {
  flex-shrink: 0;
  color: var(--color-text-maxcontrast);
}

.cn-schema-form__cond-count-badge {
  margin-left: auto;
  padding: 2px 8px;
  background: var(--color-primary-element);
  color: var(--color-primary-element-text);
  border-radius: var(--border-radius-pill);
  font-size: 12px;
  font-weight: 600;
}

.cn-schema-form__cond-accordion-body {
  margin-top: 4px;
  border: 1px solid var(--color-border);
  border-radius: var(--border-radius-element);
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

/* Per-action container — same border/radius pattern as the RBAC table container */
.cn-schema-form__cond-action {
  margin-top: 16px;
  border: 1px solid var(--color-border-dark);
  border-radius: var(--border-radius-element);
  /* overflow visible so NcSelect dropdowns (appendToBody:true) can position correctly */
  overflow: visible;
  box-shadow: 0 2px 8px rgba(var(--color-box-shadow-rgb), 0.06);
}

.cn-schema-form__cond-action:first-of-type {
  margin-top: 12px;
}

/* Action header — matches RBAC table <th> row */
.cn-schema-form__cond-action-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 16px;
  background: var(--color-background-dark);
  border-bottom: 2px solid var(--color-border-dark);
  border-radius: var(--border-radius-element) var(--border-radius-element) 0 0;
}

.cn-schema-form__cond-action-name {
  font-size: 14px;
  font-weight: 600;
  color: var(--color-main-text);
  text-transform: capitalize;
}

.cn-schema-form__cond-empty {
  padding: 12px 16px;
  color: var(--color-text-maxcontrast);
  font-style: italic;
  font-size: 13px;
  background: var(--color-main-background);
}

/* Rule card — standalone card so each rule is visually distinct */
.cn-schema-form__cond-rule-card {
  margin: 8px;
  padding: 14px 16px;
  background: var(--color-main-background);
  border: 1px solid var(--color-border);
  border-radius: var(--border-radius-element);
  display: flex;
  flex-direction: column;
  gap: 12px;
  overflow: visible;
  box-shadow: 0 1px 4px rgba(var(--color-box-shadow-rgb), 0.08);
  transition: background var(--animation-quick) ease,
    box-shadow var(--animation-quick) ease;
}

/* Group-based left border — same color variables as the group badges in the RBAC table */
.cn-schema-form__cond-rule-card--public {
  border-left: 3px solid var(--color-info);
}

.cn-schema-form__cond-rule-card--authenticated {
  border-left: 3px solid var(--color-warning);
}

.cn-schema-form__cond-rule-card--admin {
  border-left: 3px solid var(--color-success);
}

/* Rule header row: group badge + select + remove button */
.cn-schema-form__cond-rule-header {
  display: flex;
  align-items: center;
  gap: 12px;
}

/* Suppress the badge text since the select already shows the group */
.cn-schema-form__cond-rule-header .cn-schema-form__group-badge {
  display: none;
}

.cn-schema-form__cond-rule-group-select {
  flex: 1;
  max-width: 260px;
}

/* Remove extra spacing from vue-select so the group select aligns with the Remove rule button */
.cn-schema-form__cond-rule-group-select .v-select {
  margin: 0;
}

.cn-schema-form__cond-rule-group-select .vs__dropdown-toggle {
  padding-bottom: 0;
}

/* Conditions list */
.cn-schema-form__cond-match-list {
  padding-left: 4px;
}

.cn-schema-form__cond-match-empty {
  font-size: 12px;
  font-style: italic;
  color: var(--color-text-maxcontrast);
  padding: 4px 0;
  margin: 0;
}

.cn-schema-form__cond-match-table {
  width: 100%;
  border-collapse: collapse;
  border: 1px solid var(--color-border-dark);
  border-radius: var(--border-radius-element);
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(var(--color-box-shadow-rgb), 0.1);
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-schema-form__cond-match-table th {
  background: var(--color-background-dark);
  color: var(--color-main-text);
  font-weight: 600;
  padding: 10px 16px;
  text-align: left;
  border-bottom: 2px solid var(--color-border-dark);
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-schema-form__cond-match-table td {
  padding: 10px 16px;
  vertical-align: middle;
  border-bottom: 1px solid var(--color-border);
}

.cn-schema-form__cond-match-table tbody tr:last-child td {
  border-bottom: none;
}

.cn-schema-form__cond-match-actions {
  width: 44px;
  text-align: right;
}

/* Add-condition inline form */
.cn-schema-form__cond-add-form {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 14px;
  background: var(--color-background-hover);
  border-radius: var(--border-radius);
  border: 1px dashed var(--color-border-dark);
}

/* Three equal columns for Property / Operator / Value selects */
.cn-schema-form__cond-add-row {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 12px;
  align-items: start;
}

.cn-schema-form__cond-add-field {
  min-width: 0;
}

/* NcSelect (vue-select) must fill its grid cell */
.cn-schema-form__cond-add-field .v-select {
  width: 100%;
  min-width: 0;
}

/* Custom value input — full width below the three selects, never displaces them */
.cn-schema-form__cond-custom-row {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.cn-schema-form__cond-custom-input {
  width: 100%;
  height: 34px;
  padding: 4px 10px;
  border: 1px solid var(--color-border-dark);
  border-radius: var(--border-radius);
  background: var(--color-main-background);
  color: var(--color-main-text);
  font-size: 13px;
  box-sizing: border-box;
}

.cn-schema-form__cond-custom-input:focus {
  outline: 2px solid var(--color-primary-element);
  outline-offset: -1px;
}

.cn-schema-form__cond-add-actions {
  display: flex;
  gap: 8px;
}

/* Copied from openregister/SolrWarmupModal — also used in other files */
.cn-schema-form__schema-option {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}

.cn-schema-form__option-title {
  font-weight: 500;
}

.cn-schema-form__option-description {
  font-size: 0.875rem;
  color: var(--color-text-maxcontrast);
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
/* =============================================
   CnTimelineStages — Timeline / progress stages
   ============================================= */

/* ---------- Root container ---------- */
.cn-timeline-stages {
	display: flex;
	align-items: flex-start;
	gap: 0;
	width: 100%;
}

/* Horizontal: left-to-right, scrollable overflow */
.cn-timeline-stages--horizontal {
	flex-direction: row;
	overflow-x: auto;
	padding-bottom: calc(var(--default-grid-baseline, 4px) * 1);
}

/* Vertical: top-to-bottom */
.cn-timeline-stages--vertical {
	flex-direction: column;
}

/* ---------- Stage node ---------- */
.cn-timeline-stages__stage {
	display: flex;
	flex-direction: column;
	align-items: center;
	position: relative;
	flex: 1 1 0;
	min-width: calc(var(--default-grid-baseline, 4px) * 20); /* 80px */
	text-align: center;
	padding: calc(var(--default-grid-baseline, 4px) * 1);
	border-radius: var(--border-radius-large, 10px);
	transition: background-color 0.15s ease;
}

/* Vertical stages: row layout, TOP aligned.
   It used to be `center`, which centred the indicator and the label against the
   tallest thing in the row. A stage carrying a reason is taller than one
   without, so the label of that one stage slid down out of line with every
   other label on the strip, and the indicator with it. Top alignment makes the
   indicator, the label and anything under it start on the same line whatever
   the row contains. The horizontal variant is unaffected: there the stage is a
   COLUMN, so its `align-items: center` centres the label under the indicator
   horizontally and has nothing to do with vertical drift. */
.cn-timeline-stages--vertical .cn-timeline-stages__stage {
	flex-direction: row;
	align-items: flex-start;
	text-align: left;
	min-width: 0;
	gap: calc(var(--default-grid-baseline, 4px) * 3);
}

/* ---------- Track line (horizontal) ---------- */
.cn-timeline-stages--horizontal .cn-timeline-stages__stage + .cn-timeline-stages__stage::before {
	content: '';
	position: absolute;
	/* Indicator sits below the stage's top padding (4px), so its vertical
	   center is at padding-top + indicator-radius = 4px + 16px = 20px.
	   Subtract 1px (half the line height) to center the 2px line on it. */
	top: calc(var(--default-grid-baseline, 4px) * 1 + 16px - 1px);
	right: calc(50% + 16px + 4px);
	left: calc(-50% + 16px + 4px);
	height: 2px;
	background-color: var(--color-border, #ededed);
	z-index: 0;
}

/* Completed + current track segments: filled */
.cn-timeline-stages--horizontal .cn-timeline-stages__stage--completed + .cn-timeline-stages__stage::before,
.cn-timeline-stages--horizontal .cn-timeline-stages__stage--completed + .cn-timeline-stages__stage--current::before {
	background-color: var(--color-success-text, var(--color-success, #46ba61));
}

/* ---------- Track line (vertical) ---------- */
/* THE LINE HAS TO STAY ON THE CIRCLES, and top alignment is what makes that
   possible rather than what breaks it.
   It used to hang off the FOLLOWING stage and reach upwards by a percentage of
   that stage's own height, which only found the previous circle when every row
   was exactly as tall as its neighbour. It was written that way because
   `align-items: center` put the circle at 50% of a row whose height nothing
   controlled, so there was no fixed number to aim at. One stage carrying a
   reason was enough to slide the line off the circles.
   Top aligned, the circle's centre is a CONSTANT: the row's top padding (4px)
   plus the indicator's radius (16px). So each stage draws the segment BELOW
   itself, from its own centre (20px down from its top edge) to the next stage's
   centre (20px past its bottom edge, where the next row begins, since the
   vertical container has no gap between stages). Both ends are exact numbers,
   the line runs down the middle of every circle whatever a row contains, and
   the last stage draws nothing because there is nothing under it to reach. */
.cn-timeline-stages--vertical .cn-timeline-stages__stage:not(:last-child)::before {
	content: '';
	position: absolute;
	left: calc(var(--default-grid-baseline, 4px) * 1 + 16px - 1px); /* center of 32px indicator, minus half line width */
	top: calc(var(--default-grid-baseline, 4px) * 1 + 16px); /* this indicator's center */
	bottom: calc((var(--default-grid-baseline, 4px) * 1 + 16px) * -1); /* the next indicator's center */
	width: 2px;
	background-color: var(--color-border, #ededed);
	z-index: 0;
}

/* Completed track segments: filled (vertical). The segment under a completed
   stage is the one the record has travelled, which is what it was before as
   well: the rule moved with the pseudo-element, from "the stage after a
   completed one" to "the completed stage itself". */
.cn-timeline-stages--vertical .cn-timeline-stages__stage--completed:not(:last-child)::before {
	background-color: var(--color-success-text, var(--color-success, #46ba61));
}

/* ---------- Indicator (circle) ---------- */
.cn-timeline-stages__indicator {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	flex-shrink: 0;
	position: relative;
	z-index: 1;
	border: 2px solid var(--color-border, #ededed);
	background-color: var(--color-main-background, #fff);
	transition: background-color 0.15s ease, border-color 0.15s ease;
}

/* Completed indicator: success green with white icon */
.cn-timeline-stages__stage--completed .cn-timeline-stages__indicator {
	background-color: var(--color-success-text, var(--color-success, #46ba61));
	border-color: var(--color-success-text, var(--color-success, #46ba61));
	color: #fff;
}

/* Current indicator: primary blue */
.cn-timeline-stages__stage--current .cn-timeline-stages__indicator {
	background-color: var(--color-primary-element, #0082c9);
	border-color: var(--color-primary-element, #0082c9);
	color: var(--color-primary-element-text, #fff);
}

/* ---------- Checkmark SVG ---------- */
.cn-timeline-stages__checkmark {
	width: 16px;
	height: 16px;
}

/* ---------- Current dot ---------- */
.cn-timeline-stages__dot {
	display: block;
	width: 10px;
	height: 10px;
	border-radius: 50%;
	background-color: currentColor;
}

/* ---------- Label ---------- */
.cn-timeline-stages__label {
	display: block;
	margin-top: calc(var(--default-grid-baseline, 4px) * 1);
	font-size: 0.9em;
	line-height: 1.3;
	color: var(--color-text-maxcontrast, #767676);
	overflow-wrap: anywhere;
}

/* Vertical: label aligns with indicator center */
.cn-timeline-stages--vertical .cn-timeline-stages__label {
	margin-top: 0;
}

/* Completed stage label */
.cn-timeline-stages__stage--completed .cn-timeline-stages__label {
	color: var(--color-main-text, #222);
}

/* Current stage label: bold and prominent */
.cn-timeline-stages__stage--current .cn-timeline-stages__label {
	color: var(--color-main-text, #222);
	font-weight: bold;
}

/* ---------- Subtitle ---------- */
.cn-timeline-stages__subtitle {
	display: block;
	font-size: 0.8em;
	line-height: 1.3;
	color: var(--color-text-maxcontrast, #767676);
	margin-top: 2px;
}

/* ---------- Small size variant ---------- */
.cn-timeline-stages--small .cn-timeline-stages__indicator {
	width: 20px;
	height: 20px;
}

.cn-timeline-stages--small .cn-timeline-stages__checkmark {
	width: 12px;
	height: 12px;
}

.cn-timeline-stages--small .cn-timeline-stages__dot {
	width: 6px;
	height: 6px;
}

.cn-timeline-stages--small .cn-timeline-stages__label {
	font-size: 0.85em;
}

.cn-timeline-stages--small .cn-timeline-stages__stage {
	min-width: calc(var(--default-grid-baseline, 4px) * 14); /* 56px */
}

/* Small horizontal track line offset */
.cn-timeline-stages--small.cn-timeline-stages--horizontal .cn-timeline-stages__stage + .cn-timeline-stages__stage::before {
	top: calc(var(--default-grid-baseline, 4px) * 1 + 10px - 1px); /* padding + indicator radius, minus half line height */
	right: calc(50% + 10px + 4px);
	left: calc(-50% + 10px + 4px);
}

/* Small vertical track line offset: the same three numbers with a 20px
   indicator, so its 10px radius replaces the 16px one. */
.cn-timeline-stages--small.cn-timeline-stages--vertical .cn-timeline-stages__stage:not(:last-child)::before {
	left: calc(var(--default-grid-baseline, 4px) * 1 + 10px - 1px); /* center of 20px indicator, minus half line width */
	top: calc(var(--default-grid-baseline, 4px) * 1 + 10px);
	bottom: calc((var(--default-grid-baseline, 4px) * 1 + 10px) * -1);
}

/* ---------- Clickable mode ---------- */
.cn-timeline-stages--clickable .cn-timeline-stages__stage {
	cursor: pointer;
}

.cn-timeline-stages--clickable .cn-timeline-stages__stage:hover {
	background-color: var(--color-background-dark, #ededed);
}

/* A stage that cannot be chosen keeps its focus stop but reads as inert.
   It must also LOOK different from a stage that is merely later in the
   process: dimmed, with a not-allowed cursor. Without the dimming the only
   difference a sighted person could perceive was the cursor, which nobody
   notices, so a blocked stage and an upcoming one were the same picture. */
.cn-timeline-stages--clickable .cn-timeline-stages__stage--disabled:not(.cn-timeline-stages__stage--blocked) {
	cursor: not-allowed;
	opacity: 0.55;
}

/* The dimming must not take the reason with it: an explanation nobody can read
   is the state this rule exists to fix. */
.cn-timeline-stages--clickable .cn-timeline-stages__stage--disabled .cn-stages-widget__reason {
	opacity: 1;
	color: var(--color-text-maxcontrast);
}

/* The stage the record is ON is not a move, and it is not blocked either. It
   carries no `aria-disabled` and no not-allowed cursor: both said "you may not
   go here" about the place the record already is. It simply offers nothing. */
.cn-timeline-stages--clickable .cn-timeline-stages__stage--current {
	cursor: default;
}

.cn-timeline-stages--clickable .cn-timeline-stages__stage--current:hover {
	background-color: transparent;
}

.cn-timeline-stages--clickable .cn-timeline-stages__stage--disabled:hover {
	background-color: transparent;
}

/* Dashed says "later in the process". A refused stage is not that, and takes
   the warning treatment below instead. */
.cn-timeline-stages--clickable .cn-timeline-stages__stage--upcoming.cn-timeline-stages__stage--disabled:not(.cn-timeline-stages__stage--blocked) .cn-timeline-stages__indicator {
	border-style: dashed;
}

/* ---------- Refused: a guard said no ---------- */
/* A STAGE A GUARD REFUSED IS NOT A STAGE THAT IS SIMPLY NEXT WEEK, and it must
   not look like one. On a real case page every stage the record could not reach
   rendered in the same grey, so the one the person was aiming at was the
   faintest thing on the strip and the whole timeline read as broken rather than
   as guarded.
   Dimming is right for "not your step yet" and wrong here, so a refused stage
   keeps full contrast and takes the warning colour. Only the stages a guard
   actually refused get it: if everything is orange, nothing reads as refused,
   which is why the merely-unreachable ones are deliberately left grey.
   There is no error-coloured variant, because `available-actions` answers one
   boolean, `blocked: true`, and no severity beside it. Splitting the colour
   into "refused" and "refused harder" would encode a distinction nobody sent. */
.cn-timeline-stages--clickable .cn-timeline-stages__stage--blocked {
	cursor: not-allowed;
}

.cn-timeline-stages--clickable .cn-timeline-stages__stage--blocked .cn-timeline-stages__indicator {
	border-color: var(--color-warning-text, var(--color-warning, #e9a300));
	color: var(--color-warning-text, var(--color-warning, #e9a300));
}

.cn-timeline-stages--clickable .cn-timeline-stages__stage--blocked .cn-timeline-stages__label {
	color: var(--color-warning-text, var(--color-warning, #e9a300));
}

/* The exclamation mark inside a refused indicator: the part of the signal that
   survives a reader who cannot tell orange from grey. */
.cn-timeline-stages__alert {
	width: 16px;
	height: 16px;
}

.cn-timeline-stages--small .cn-timeline-stages__alert {
	width: 12px;
	height: 12px;
}

/* Focus ring (keyboard only) */
.cn-timeline-stages--clickable .cn-timeline-stages__stage:focus-visible {
	outline: 2px solid var(--color-primary-element, #0082c9);
	outline-offset: 2px;
}

/* Remove default outline for mouse clicks */
.cn-timeline-stages--clickable .cn-timeline-stages__stage:focus:not(:focus-visible) {
	outline: none;
}
/* useContextMenu — Position the context menu popper at cursor coordinates.
 *
 * Scoped to `[data-cn-ctx-menu-popper]`, the marker attribute CnContextMenu
 * stamps on its *own* popper element (see CnContextMenu#tagPopper).
 *
 * This used to be keyed on `html[data-cn-ctx-menu]` alone, which matches EVERY
 * `.v-popper__popper` in the document — that attribute says "a context menu is
 * open", it does not identify which popper belongs to it. So any other popover
 * alive at the same time (most visibly a table row's own actions menu) was
 * yanked to the last right-click coordinates instead of rendering under its
 * trigger. That was permanent rather than transient because the attribute was
 * cleared from NcActions' `@closed` event, which never fires: @nextcloud/vue 9
 * binds `onAfterClose` on NcPopover, which only emits `afterHide`. Keying on the
 * per-popper marker makes both problems moot.
 *
 * The marker must NOT be a class. floating-vue binds a dynamic `class` on this
 * element (`--shown` / `--hidden` / `--show-from` / …); Vue's `patchClass`
 * assigns `el.className` wholesale, so a class added from JS is wiped the first
 * time the popper opens — the rule then matches nothing and the menu renders at
 * its offscreen trigger (≈ -9905px) instead of at the cursor.
 */
.v-popper__popper[data-cn-ctx-menu-popper] {
	transform: translate3d(var(--cn-ctx-menu-x), var(--cn-ctx-menu-y), 0px) !important;
}

.v-popper__popper[data-cn-ctx-menu-popper][data-popper-placement="top"] {
	transform: translate3d(var(--cn-ctx-menu-x), calc(var(--cn-ctx-menu-y) - 50vh + 34px), 0px) !important;
}

.v-popper__popper[data-cn-ctx-menu-popper] .v-popper__arrow-container {
	display: none;
}

/* Destructive action styling. Shared across every action menu — CnRowActions
   sets the same class — so it must not be gated on a context menu being open.
   It previously sat behind `html[data-cn-ctx-menu]`, which meant a row actions
   menu only picked up the error colour while a right-click menu happened to be
   open (or, thanks to the stale attribute above, ever after the first one). */
.cn-row-action--destructive {
	color: var(--color-error) !important;
}
/*
 * Global theme override for NcDateTimePicker's disabled calendar cells.
 * The underlying vue2-datepicker library ships hardcoded `#f3f3f3` / `#ccc`,
 * which breaks dark mode. The popup is portaled to <body>, so this must be
 * unscoped and lives here rather than in each modal that uses the picker.
 */
.mx-calendar-content .cell.disabled {
	background-color: var(--color-background-dark) !important;
	color: var(--color-text-maxcontrast) !important;
	cursor: not-allowed;
}

.mx-calendar-content .cell.disabled,
.mx-calendar-content .cell.disabled * {
	cursor: not-allowed !important;
}

.mx-calendar-content .cell.disabled:hover {
	background-color: var(--color-background-dark) !important;
}

/*
 * Buildiq edit button — brand orange, ALWAYS applied.
 * CnBuildiqEditButton styles its trigger orange via `\3c style scoped>`, but the
 * scoped `data-v-*` hash can miss the live element when the library is bundled
 * in duplicate in a consuming app (the trigger then falls back to the tertiary
 * transparent default and the button is intermittently not orange). These
 * unscoped globals guarantee the ADR-041 brand orange regardless of the hash.
 */
.cn-buildiq-edit__actions .button-vue,
.cn-buildiq-edit__actions .action-item__menutoggle {
	background-color: var(--c-orange-knvb, #f36c21) !important;
	color: #fff !important;
	border-radius: var(--border-radius-element, var(--border-radius-large, 8px));
}

.cn-buildiq-edit__actions .button-vue__wrapper {
	justify-content: center;
}

.cn-buildiq-edit__actions .button-vue__icon {
	display: flex !important;
	align-items: center;
	justify-content: center;
	color: #fff;
}

.cn-buildiq-edit__glyph {
	color: #fff !important;
}

/*
 * KPI date-chip overlay — keep the headerless `title-meta` chip out of normal
 * flow so a compact flush stat tile never overflows its grid cell (which shows
 * an inner scrollbar). Same scoped-hash caveat as above: the scoped rule can
 * miss under duplicate bundling, so anchor it globally. `position: relative` on
 * the wrapper gives the absolute chip something to anchor to without moving any
 * content (no offsets on the wrapper itself).
 */
.cn-widget-wrapper {
	position: relative;
}

.cn-widget-wrapper__floating-meta {
	position: absolute;
	top: 8px;
	inset-inline-end: 10px;
	z-index: 2;
}

/*
 * NO KPI RULES HERE. The KPI card's look lives in ONE place — src/css/kpi-card.css.
 *
 * This block used to hold an unscoped mirror of CnStatWidget's card styling,
 * added when that look still lived in the component's `\3c style scoped>` and a
 * duplicate bundling of the library could make the `data-v-*` hash miss the
 * live element. The look has since moved OUT of the scoped block into
 * kpi-card.css, which is plain unscoped CSS imported both by this aggregator
 * and by the component module itself — so there is no hash to miss and no
 * mirror to keep.
 *
 * Leaving the mirror in place was worse than useless: this file is imported
 * LAST by index.css, and `.cn-stat-widget` beats nothing but ties with
 * `.cn-kpi-card` on specificity, so source order handed the win to the stale
 * copy. Every app loading the library stylesheet got the PRE-consolidation
 * widget (1.6em value, 0.95em label, 40px icon, transparent row) painted over
 * the canonical card (2rem value, 14px title, 44px icon, grey card) that
 * CnStatsBlock renders — two visibly different KPI looks on one dashboard,
 * from a file whose whole job was to stop exactly that.
 *
 * If a KPI ever needs a global rule again, add it to kpi-card.css. A second
 * copy of a value is a second look waiting to happen.
 */

/*
 * Modal / dialog stacking baseline.
 *
 * `@nextcloud/vue` v9 ships a flat `.modal-mask { z-index: 9998 }` in NcModal's
 * scoped stylesheet, which lands every dialog on the same layer. 9998 also sits
 * below Nextcloud chrome that apps expect a dialog to cover, so this baseline
 * lifts dialog masks clear of it — it is the value this library used to hardcode
 * as `!important` from inside CnEditDataModal's unscoped \3c style> block.
 *
 * It MUST NOT be `!important`. `src/utils/modalStack.js` writes a per-modal
 * layer as an inline `z-index` so the most recently opened modal receives
 * pointer events, and an `!important` baseline would beat that inline value —
 * flattening every open dialog back onto one layer, where the winner is decided
 * by DOM order between two nodes teleported to <body>. That race is what made
 * clicks on a nested dialog land on the dialog underneath it.
 *
 * Deliberately unscoped: the mask is teleported out of the component tree, so a
 * `data-v-*` scoped rule would never match it.
 */
.modal-mask.dialog__modal {
	z-index: 10005;
}

/*
 * NcSelect's dropdown, when it is inside a dialog.
 *
 * `NcSelect.appendToBody` defaults to TRUE, so vue-select teleports its menu
 * out of the dialog and makes it a `<body>` sibling — leaving the dialog's
 * stacking context entirely — and `@nextcloud/vue` gives that menu
 * `--vs-dropdown-z-index: 9999`.
 *
 * 9999 clears a STOCK NcModal mask, which sits at 9998. It does not clear the
 * baseline directly above: this library raises dialog masks to 10005 (and
 * `modalStack.js` writes 10005 + 5n inline for nested dialogs). So the dialog
 * paints over its own dropdown. The options render, they are visible, and every
 * click on them is swallowed by the mask — Playwright reports it as
 * "subtree intercepts pointer events", and a real user simply cannot pick an
 * option. Measured on pipelinq (#757).
 *
 * This is ours to fix, not upstream's: at @nextcloud/vue's own 9998 the
 * combination works, and it is THIS stylesheet that moved the mask above the
 * dropdown.
 *
 * `@nextcloud/vue` ships exactly this override for the timezone select inside
 * NcDateTimePicker — `.vs__dropdown-menu--floating { z-index: 100001 !important }`
 * — so this adopts the same selector and the same value rather than inventing a
 * layer. Do NOT rely on that upstream rule: it lives in NcDateTimePicker's own
 * stylesheet chunk, so an app gets it only if it happens to load that component's
 * CSS. That accident is why this bug looks intermittent across apps — and why the
 * rule belongs here, where every consumer of this library gets it.
 *
 * `!important` for the same reason upstream uses it: the value it must beat is
 * `.vs__dropdown-menu`'s own single-class rule, so without it the winner would
 * come down to stylesheet order — and a lazily-imported chunk can load after
 * this file. Unlike the mask baseline above, nothing writes an inline z-index on
 * this element, so `!important` here overrides no one.
 *
 * Scoped to the `--floating` variant deliberately: that is the appended-to-body
 * case. A dropdown left in the DOM stacks correctly inside its own dialog and
 * must not be lifted over unrelated chrome.
 */
.vs__dropdown-menu--floating {
	z-index: 100001 !important;
}

/*
 * vue-select's search input must not look like a second field.
 *
 * `NcSelect` wraps vue-select, whose `.vs__search` is the type-to-filter input
 * that sits BESIDE the selected value inside one control. Stock vue-select
 * gives it a transparent border; the LA SUITE theme sets
 *
 *     input[type="text"], input[type="search"], … {
 *         border: 1px solid var(--lasuite-color-gray-300) !important;
 *     }
 *
 * which lands on it and draws an empty bordered box to the right of the
 * selected value — a second, broken-looking field on every Provider, Agent and
 * Execution dropdown in the fleet.
 *
 * `!important` is REQUIRED here and not laziness: the theme's rule carries it,
 * so no amount of specificity can win. The override is narrow — `.vs__search`
 * is never a standalone input, always the inner field of a composite control —
 * so this cannot reach a real text box the theme meant to style.
 *
 * The root cause is the theme reaching into a composite control it does not
 * own; fixing it there would be better, and this stays until it does.
 *
 * Unscoped and here rather than in a component, because the control belongs to
 * @nextcloud/vue: no Conduction component owns the element, and each app
 * patching it locally is the same rule written sixteen times.
 *
 * Focus stays visible — see the rule below, which is the other half of this
 * patch and not optional.
 */
.v-select .vs__search,
.v-select .vs__search:focus {
	border: none !important;
	box-shadow: none !important;
	min-height: unset;
	background-color: transparent;
}

/*
 * ...and the focus indicator it removes goes back on the WHOLE control.
 *
 * `box-shadow: none` above does not just delete a border. Nextcloud draws input
 * focus WITH box-shadow, so suppressing it suppresses the focus indicator too,
 * and nothing else puts one back: core's global focus rule deliberately skips
 * Vue apps — `.content:not(#content-vue) :focus-visible`, commented "let vue
 * apps handle the focus themselves" — and the accessibility themes (high
 * contrast, dyslexia font) only swap colours and fonts. Deleting this rule is
 * therefore a WCAG 2.4.7 failure on every select in the fleet, which is exactly
 * what it does not look like from the diff.
 *
 * It rings `.vs__dropdown-toggle` rather than `.vs__search`, where it used to
 * live. The search input is the empty strip beside the selected value, so a ring
 * on it framed blank space — the second-field look this whole patch exists to
 * remove, redrawn in the focus colour. The toggle is what the user perceives as
 * the control, so that is what lights up.
 *
 * `.vs__search` must then have its own outline explicitly cleared: nothing in
 * vue-select or @nextcloud/vue suppresses it, so the user agent's default ring
 * would step straight into the vacancy and reinstate the box we just removed.
 * The indicator is not lost with it — `:focus-within` fires on the toggle
 * whenever that input is focused, which is the only way this control takes focus.
 *
 * `!important` because NcSelect sets `outline` on this same element at equal
 * specificity (`…:not(.vs--disabled, .vs--open) .vs__dropdown-toggle:focus-within`,
 * a background-coloured spacer ring). Equal specificity makes stylesheet order
 * the tie-breaker, and NcSelect's CSS is a lazily-imported chunk that can load
 * after this file — the same race the z-index patch above documents.
 *
 * `--color-main-text` and not the primary colour: NcSelect already uses it for
 * its own focus and open states, so a focused select reads as a Nextcloud
 * select rather than a Conduction one.
 */
.v-select .vs__dropdown-toggle:focus-within {
	outline: 2px solid var(--color-main-text) !important;
	outline-offset: 2px;
}

.v-select .vs__search:focus-visible {
	outline: none;
}


.cn-chart-widget[data-v-1c42daff] {
	width: 100%;
	/* A chart FITS its container — it is never a scroll region. apexcharts
	   sizes its SVG from the element it is mounted in, but it also enforces
	   its own minimum widths (axis labels, legend, a bar's minimum body), so
	   on a narrow tile the SVG comes out wider than the box and the widget
	   card grows a horizontal scrollbar. `max-width` + `overflow: hidden`
	   settle it in the box's favour: the graph clips its own margins rather
	   than handing the user a bar to drag. Applies in BOTH modes, not just
	   the percentage-height `--fit` one — the horizontal overflow has nothing
	   to do with how the height was configured, which is why the existing
	   `--fit` rules never caught it. */
	max-width: 100%;
	min-height: 100px;
	overflow-x: hidden;
}

/* Container-fitting mode (`height` given as a percentage). The root claims the
   full height it is given and lays its children out as a column; the canvas box
   takes what is left, so the chart is sized by the box rather than sizing it.
   `min-height: 0` drops the 100px floor — on a fixed-height surface a floor is
   the thing that produces the overflow it was meant to prevent. */
.cn-chart-widget--fit[data-v-1c42daff] {
	height: 100%;
	min-height: 0;
	display: flex;
	flex-direction: column;
}
.cn-chart-widget__canvas[data-v-1c42daff] {
	min-width: 0;
	max-width: 100%;
	overflow-x: hidden;
}

/* apexcharts writes an inline `width` onto its own wrapper from its measured
   minimum, which beats the container when the container is narrower. Cap the
   painted box so the inline width cannot push past the widget's border. */
.cn-chart-widget[data-v-1c42daff] .apexcharts-canvas,
.cn-chart-widget[data-v-1c42daff] .apexcharts-canvas svg {
	max-width: 100%;
}

/* `flex: 1 1 0` (not `1 1 auto`) is load-bearing: with an `auto` basis the box
   would grow to its content, i.e. to the chart, and the percentage height would
   resolve against a box the chart itself defined. `overflow: hidden` keeps a
   sub-pixel rounding difference from reintroducing a scrollbar. */
.cn-chart-widget--fit .cn-chart-widget__canvas[data-v-1c42daff] {
	flex: 1 1 0;
	min-height: 0;
	overflow: hidden;
}
.cn-chart-widget__fallback[data-v-1c42daff] {
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 150px;
	color: var(--color-text-maxcontrast);
}
.cn-chart-widget__empty[data-v-1c42daff] {
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 150px;
	color: var(--color-text-maxcontrast);
	font-size: 14px;
	text-align: center;
	padding: 12px;
}

/* The empty / fallback placeholders carry a 150px floor for the normal
   content-sized case; in fit mode they take the leftover space and centre in it
   instead, since the floor would overflow a short tile. Declared after the base
   rules so the cascade order matches specificity (no-descending-specificity). */
.cn-chart-widget--fit .cn-chart-widget__empty[data-v-1c42daff],
.cn-chart-widget--fit .cn-chart-widget__fallback[data-v-1c42daff] {
	flex: 1 1 0;
	min-height: 0;
}
.cn-chart-widget__error[data-v-1c42daff] {
	font-size: 14px;
	margin: 0;
}

/* In-widget view switcher pills (views[] prop) — compact segmented row,
   mirroring the dashboard date-range pill styling. */
.cn-chart-widget__views[data-v-1c42daff] {
	display: flex;
	gap: 4px;
	margin-bottom: 6px;
	justify-content: flex-end;
}
.cn-chart-widget__view-pill[data-v-1c42daff] {
	padding: 2px 10px;
	border: 1px solid var(--color-border);
	border-radius: 999px;
	background: var(--color-main-background);
	color: var(--color-text-maxcontrast);
	font-size: 12px;
	cursor: pointer;
}
.cn-chart-widget__view-pill--active[data-v-1c42daff] {
	background: var(--color-primary-element-light, #aad2ed);
	color: var(--color-main-text);
	border-color: var(--color-primary-element, #0082c9);
}

/* ─── ApexCharts HTML chrome ───────────────────────────────────────────────
   Everything apexcharts draws INSIDE the SVG takes its colour from
   `mergedOptions` (foreColor, grid.borderColor, legend.labels.colors, axis
   label styles), so it already follows the Nextcloud theme. Its HTML chrome —
   the hover tooltip, the crosshair axis tooltips, the toolbar menu — does not:
   apexcharts styles those from a stylesheet it injects itself at chart-create
   time (`\3c style id="apexcharts-css">`) using hardcoded hex values. In dark mode
   the hover tooltip stayed a white box while its text inherited the near-white
   `--color-main-text` — white on white, unreadable.

   `tooltip.theme` is not the fix: both apexcharts themes are hardcoded
   palettes, neither of them Nextcloud's, and choosing between them would need
   JS theme detection that a themed or nldesign install would still get wrong.
   Restyling with tokens means ONE rule set that is correct in light, dark,
   high-contrast and custom themes, because the tokens flip themselves. Both
   theme classes are listed so an `options.tooltip.theme` override cannot drop
   a consumer back onto a hardcoded palette.

   The specificity is deliberate. apexcharts injects its stylesheet when the
   first chart is created, so it lands AFTER the app's CSS and wins every tie —
   each override below therefore carries one more class than the apexcharts rule
   it replaces, and holds even without the scope attribute this block compiles
   with. */
.cn-chart-widget[data-v-1c42daff] .apexcharts-tooltip.apexcharts-theme-light,
.cn-chart-widget[data-v-1c42daff] .apexcharts-tooltip.apexcharts-theme-dark {
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	color: var(--color-main-text);
	box-shadow: 0 1px 5px var(--color-box-shadow, rgba(0, 0, 0, 0.2));
}

/* The title row is the date/category header ("Aug 26"). Its own background is
   what made it unreadable rather than merely off-theme. */
.cn-chart-widget[data-v-1c42daff] .apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title,
.cn-chart-widget[data-v-1c42daff] .apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {
	background: var(--color-background-hover);
	border-bottom: 1px solid var(--color-border);
	color: var(--color-main-text);
}

/* Crosshair axis tooltips. apexcharts puts light hex values on the BASE class
   here and only overrides them for its dark theme, so the base rule has to be
   replaced too — not just the theme variants. */
.cn-chart-widget[data-v-1c42daff] .apexcharts-xaxistooltip,
.cn-chart-widget[data-v-1c42daff] .apexcharts-yaxistooltip {
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	color: var(--color-main-text);
}

/* Their pointer arrows are two stacked triangles: `::before` paints the border
   edge, `::after` the fill. Both need the tokens the box above uses, or the
   arrow keeps the old palette and reads as a stray light wedge. */
.cn-chart-widget[data-v-1c42daff] .apexcharts-xaxistooltip-bottom::after,
.cn-chart-widget[data-v-1c42daff] .apexcharts-xaxistooltip-top::after {
	border-bottom-color: var(--color-main-background);
	border-top-color: var(--color-main-background);
}
.cn-chart-widget[data-v-1c42daff] .apexcharts-xaxistooltip-bottom::before,
.cn-chart-widget[data-v-1c42daff] .apexcharts-xaxistooltip-top::before {
	border-bottom-color: var(--color-border);
	border-top-color: var(--color-border);
}
.cn-chart-widget[data-v-1c42daff] .apexcharts-yaxistooltip-left::after,
.cn-chart-widget[data-v-1c42daff] .apexcharts-yaxistooltip-right::after {
	border-left-color: var(--color-main-background);
	border-right-color: var(--color-main-background);
}
.cn-chart-widget[data-v-1c42daff] .apexcharts-yaxistooltip-left::before,
.cn-chart-widget[data-v-1c42daff] .apexcharts-yaxistooltip-right::before {
	border-left-color: var(--color-border);
	border-right-color: var(--color-border);
}

/* Toolbar menu — only reachable with `toolbar: true`, but the same defect: a
   hardcoded `#fff` panel under inherited near-white text. */
.cn-chart-widget[data-v-1c42daff] .apexcharts-menu {
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	color: var(--color-main-text);
}
.cn-chart-widget[data-v-1c42daff] .apexcharts-menu .apexcharts-menu-item:hover {
	background: var(--color-background-hover);
}

/* Toolbar icons: `#6e8192` at rest and `#333` on hover, i.e. the hover state
   vanishes against a dark background. One selector per icon class, matching
   apexcharts' own list, to clear its (0,3,1) hover rules. */
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-menu-icon svg,
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-reset-icon svg,
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-selection-icon svg,
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-zoom-icon svg,
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-zoomin-icon svg,
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-zoomout-icon svg {
	fill: var(--color-text-maxcontrast);
}
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-menu-icon:hover svg,
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-reset-icon:hover svg,
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-selection-icon:hover svg,
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-zoom-icon:hover svg,
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-zoomin-icon:hover svg,
.cn-chart-widget[data-v-1c42daff] .apexcharts-toolbar .apexcharts-zoomout-icon:hover svg {
	fill: var(--color-main-text);
}


.cn-filter-rows[data-v-aeb98722] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-filter-rows__label[data-v-aeb98722] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-filter-rows__row[data-v-aeb98722] {
	display: flex;
	gap: 8px;
	align-items: flex-end;
}
.cn-filter-rows__row[data-v-aeb98722] > *:first-child {
	flex: 2;
}
.cn-filter-rows__row[data-v-aeb98722] > *:nth-child(2) {
	flex: 1;
	min-width: 90px;
}
.cn-filter-rows__row[data-v-aeb98722] > *:nth-child(3) {
	flex: 2;
}
.cn-filter-rows__row[data-v-aeb98722] .button-vue {
	flex: 0 0 auto;
}


.cn-register-schema-select[data-v-94c101a2] {
	display: flex;
	gap: 12px;
}
.cn-register-schema-select[data-v-94c101a2] > * {
	flex: 1;
	min-width: 0;
}


.cn-chart-widget-form[data-v-e74d3672] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-chart-widget-form__section[data-v-e74d3672] {
	margin: 8px 0 0;
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--color-text-maxcontrast);
}
.cn-chart-widget-form__hint[data-v-e74d3672] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	margin: 0;
}
.cn-chart-widget-form__row2[data-v-e74d3672] {
	display: flex;
	gap: 12px;
	align-items: flex-end;
}
.cn-chart-widget-form__row2[data-v-e74d3672] > * {
	flex: 1;
	min-width: 0;
}


/* Match vue-material-design-icons: inline path icons inherit text colour. */
.cn-widget-icon__path[data-v-6082e422] {
	fill: currentColor;
}


.cn-countdown-widget__value[data-v-ba22bf36] {
	white-space: nowrap;
}
.cn-countdown-widget__sub[data-v-ba22bf36] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
}


.cn-countdown-form[data-v-c713d8a6] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-countdown-form__section[data-v-c713d8a6] {
	margin: 8px 0 0;
}
.cn-countdown-form__hint[data-v-c713d8a6] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	margin: 0;
}

/* required styles */

.leaflet-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-container,
.leaflet-pane > svg,
.leaflet-pane > canvas,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer {
	position: absolute;
	left: 0;
	top: 0;
	}
.leaflet-container {
	overflow: hidden;
	}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
	-webkit-user-select: none;
	   -moz-user-select: none;
	        user-select: none;
	  -webkit-user-drag: none;
	}
/* Prevents IE11 from highlighting tiles in blue */
.leaflet-tile::selection {
	background: transparent;
}
/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
.leaflet-safari .leaflet-tile {
	image-rendering: -webkit-optimize-contrast;
	}
/* hack that prevents hw layers "stretching" when loading new tiles */
.leaflet-safari .leaflet-tile-container {
	width: 1600px;
	height: 1600px;
	-webkit-transform-origin: 0 0;
	}
.leaflet-marker-icon,
.leaflet-marker-shadow {
	display: block;
	}
/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
.leaflet-container .leaflet-overlay-pane svg {
	max-width: none !important;
	max-height: none !important;
	}
.leaflet-container .leaflet-marker-pane img,
.leaflet-container .leaflet-shadow-pane img,
.leaflet-container .leaflet-tile-pane img,
.leaflet-container img.leaflet-image-layer,
.leaflet-container .leaflet-tile {
	max-width: none !important;
	max-height: none !important;
	width: auto;
	padding: 0;
	}

.leaflet-container img.leaflet-tile {
	/* See: https://bugs.chromium.org/p/chromium/issues/detail?id=600120 */
	mix-blend-mode: plus-lighter;
}

.leaflet-container.leaflet-touch-zoom {
	-ms-touch-action: pan-x pan-y;
	touch-action: pan-x pan-y;
	}
.leaflet-container.leaflet-touch-drag {
	-ms-touch-action: pinch-zoom;
	/* Fallback for FF which doesn't support pinch-zoom */
	touch-action: none;
	touch-action: pinch-zoom;
}
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
	-ms-touch-action: none;
	touch-action: none;
}
.leaflet-container {
	-webkit-tap-highlight-color: transparent;
}
.leaflet-container a {
	-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
}
.leaflet-tile {
	filter: inherit;
	visibility: hidden;
	}
.leaflet-tile-loaded {
	visibility: inherit;
	}
.leaflet-zoom-box {
	width: 0;
	height: 0;
	-moz-box-sizing: border-box;
	     box-sizing: border-box;
	z-index: 800;
	}
/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
.leaflet-overlay-pane svg {
	-moz-user-select: none;
	}

.leaflet-pane         { z-index: 400; }

.leaflet-tile-pane    { z-index: 200; }
.leaflet-overlay-pane { z-index: 400; }
.leaflet-shadow-pane  { z-index: 500; }
.leaflet-marker-pane  { z-index: 600; }
.leaflet-tooltip-pane   { z-index: 650; }
.leaflet-popup-pane   { z-index: 700; }

.leaflet-map-pane canvas { z-index: 100; }
.leaflet-map-pane svg    { z-index: 200; }

.leaflet-vml-shape {
	width: 1px;
	height: 1px;
	}
.lvml {
	behavior: url(#default#VML);
	display: inline-block;
	position: absolute;
	}


/* control positioning */

.leaflet-control {
	position: relative;
	z-index: 800;
	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
	pointer-events: auto;
	}
.leaflet-top,
.leaflet-bottom {
	position: absolute;
	z-index: 1000;
	pointer-events: none;
	}
.leaflet-top {
	top: 0;
	}
.leaflet-right {
	right: 0;
	}
.leaflet-bottom {
	bottom: 0;
	}
.leaflet-left {
	left: 0;
	}
.leaflet-control {
	float: left;
	clear: both;
	}
.leaflet-right .leaflet-control {
	float: right;
	}
.leaflet-top .leaflet-control {
	margin-top: 10px;
	}
.leaflet-bottom .leaflet-control {
	margin-bottom: 10px;
	}
.leaflet-left .leaflet-control {
	margin-left: 10px;
	}
.leaflet-right .leaflet-control {
	margin-right: 10px;
	}


/* zoom and fade animations */

.leaflet-fade-anim .leaflet-popup {
	opacity: 0;
	-webkit-transition: opacity 0.2s linear;
	   -moz-transition: opacity 0.2s linear;
	        transition: opacity 0.2s linear;
	}
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
	opacity: 1;
	}
.leaflet-zoom-animated {
	-webkit-transform-origin: 0 0;
	    -ms-transform-origin: 0 0;
	        transform-origin: 0 0;
	}
svg.leaflet-zoom-animated {
	will-change: transform;
}

.leaflet-zoom-anim .leaflet-zoom-animated {
	-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
	   -moz-transition:    -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
	        transition:         transform 0.25s cubic-bezier(0,0,0.25,1);
	}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile {
	-webkit-transition: none;
	   -moz-transition: none;
	        transition: none;
	}

.leaflet-zoom-anim .leaflet-zoom-hide {
	visibility: hidden;
	}


/* cursors */

.leaflet-interactive {
	cursor: pointer;
	}
.leaflet-grab {
	cursor: -webkit-grab;
	cursor:    -moz-grab;
	cursor:         grab;
	}
.leaflet-crosshair,
.leaflet-crosshair .leaflet-interactive {
	cursor: crosshair;
	}
.leaflet-popup-pane,
.leaflet-control {
	cursor: auto;
	}
.leaflet-dragging .leaflet-grab,
.leaflet-dragging .leaflet-grab .leaflet-interactive,
.leaflet-dragging .leaflet-marker-draggable {
	cursor: move;
	cursor: -webkit-grabbing;
	cursor:    -moz-grabbing;
	cursor:         grabbing;
	}

/* marker & overlays interactivity */
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-image-layer,
.leaflet-pane > svg path,
.leaflet-tile-container {
	pointer-events: none;
	}

.leaflet-marker-icon.leaflet-interactive,
.leaflet-image-layer.leaflet-interactive,
.leaflet-pane > svg path.leaflet-interactive,
svg.leaflet-image-layer.leaflet-interactive path {
	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
	pointer-events: auto;
	}

/* visual tweaks */

.leaflet-container {
	background: #ddd;
	outline-offset: 1px;
	}
.leaflet-container a {
	color: #0078A8;
	}
.leaflet-zoom-box {
	border: 2px dotted #38f;
	background: rgba(255,255,255,0.5);
	}


/* general typography */
.leaflet-container {
	font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
	font-size: 12px;
	font-size: 0.75rem;
	line-height: 1.5;
	}


/* general toolbar styles */

.leaflet-bar {
	box-shadow: 0 1px 5px rgba(0,0,0,0.65);
	border-radius: 4px;
	}
.leaflet-bar a {
	background-color: #fff;
	border-bottom: 1px solid #ccc;
	width: 26px;
	height: 26px;
	line-height: 26px;
	display: block;
	text-align: center;
	text-decoration: none;
	color: black;
	}
.leaflet-bar a,
.leaflet-control-layers-toggle {
	background-position: 50% 50%;
	background-repeat: no-repeat;
	display: block;
	}
.leaflet-bar a:hover,
.leaflet-bar a:focus {
	background-color: #f4f4f4;
	}
.leaflet-bar a:first-child {
	border-top-left-radius: 4px;
	border-top-right-radius: 4px;
	}
.leaflet-bar a:last-child {
	border-bottom-left-radius: 4px;
	border-bottom-right-radius: 4px;
	border-bottom: none;
	}
.leaflet-bar a.leaflet-disabled {
	cursor: default;
	background-color: #f4f4f4;
	color: #bbb;
	}

.leaflet-touch .leaflet-bar a {
	width: 30px;
	height: 30px;
	line-height: 30px;
	}
.leaflet-touch .leaflet-bar a:first-child {
	border-top-left-radius: 2px;
	border-top-right-radius: 2px;
	}
.leaflet-touch .leaflet-bar a:last-child {
	border-bottom-left-radius: 2px;
	border-bottom-right-radius: 2px;
	}

/* zoom control */

.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
	font: bold 18px 'Lucida Console', Monaco, monospace;
	text-indent: 1px;
	}

.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out  {
	font-size: 22px;
	}


/* layers control */

.leaflet-control-layers {
	box-shadow: 0 1px 5px rgba(0,0,0,0.4);
	background: #fff;
	border-radius: 5px;
	}
.leaflet-control-layers-toggle {
	background-image: url(images/layers.png);
	width: 36px;
	height: 36px;
	}
.leaflet-retina .leaflet-control-layers-toggle {
	background-image: url(images/layers-2x.png);
	background-size: 26px 26px;
	}
.leaflet-touch .leaflet-control-layers-toggle {
	width: 44px;
	height: 44px;
	}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
	display: none;
	}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
	display: block;
	position: relative;
	}
.leaflet-control-layers-expanded {
	padding: 6px 10px 6px 6px;
	color: #333;
	background: #fff;
	}
.leaflet-control-layers-scrollbar {
	overflow-y: scroll;
	overflow-x: hidden;
	padding-right: 5px;
	}
.leaflet-control-layers-selector {
	margin-top: 2px;
	position: relative;
	top: 1px;
	}
.leaflet-control-layers label {
	display: block;
	font-size: 13px;
	font-size: 1.08333em;
	}
.leaflet-control-layers-separator {
	height: 0;
	border-top: 1px solid #ddd;
	margin: 5px -10px 5px -6px;
	}

/* Default icon URLs */
.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */
	background-image: url(images/marker-icon.png);
	}


/* attribution and scale controls */

.leaflet-container .leaflet-control-attribution {
	background: #fff;
	background: rgba(255, 255, 255, 0.8);
	margin: 0;
	}
.leaflet-control-attribution,
.leaflet-control-scale-line {
	padding: 0 5px;
	color: #333;
	line-height: 1.4;
	}
.leaflet-control-attribution a {
	text-decoration: none;
	}
.leaflet-control-attribution a:hover,
.leaflet-control-attribution a:focus {
	text-decoration: underline;
	}
.leaflet-attribution-flag {
	display: inline !important;
	vertical-align: baseline !important;
	width: 1em;
	height: 0.6669em;
	}
.leaflet-left .leaflet-control-scale {
	margin-left: 5px;
	}
.leaflet-bottom .leaflet-control-scale {
	margin-bottom: 5px;
	}
.leaflet-control-scale-line {
	border: 2px solid #777;
	border-top: none;
	line-height: 1.1;
	padding: 2px 5px 1px;
	white-space: nowrap;
	-moz-box-sizing: border-box;
	     box-sizing: border-box;
	background: rgba(255, 255, 255, 0.8);
	text-shadow: 1px 1px #fff;
	}
.leaflet-control-scale-line:not(:first-child) {
	border-top: 2px solid #777;
	border-bottom: none;
	margin-top: -2px;
	}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
	border-bottom: 2px solid #777;
	}

.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
	box-shadow: none;
	}
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
	border: 2px solid rgba(0,0,0,0.2);
	background-clip: padding-box;
	}


/* popup */

.leaflet-popup {
	position: absolute;
	text-align: center;
	margin-bottom: 20px;
	}
.leaflet-popup-content-wrapper {
	padding: 1px;
	text-align: left;
	border-radius: 12px;
	}
.leaflet-popup-content {
	margin: 13px 24px 13px 20px;
	line-height: 1.3;
	font-size: 13px;
	font-size: 1.08333em;
	min-height: 1px;
	}
.leaflet-popup-content p {
	margin: 17px 0;
	margin: 1.3em 0;
	}
.leaflet-popup-tip-container {
	width: 40px;
	height: 20px;
	position: absolute;
	left: 50%;
	margin-top: -1px;
	margin-left: -20px;
	overflow: hidden;
	pointer-events: none;
	}
.leaflet-popup-tip {
	width: 17px;
	height: 17px;
	padding: 1px;

	margin: -10px auto 0;
	pointer-events: auto;

	-webkit-transform: rotate(45deg);
	   -moz-transform: rotate(45deg);
	    -ms-transform: rotate(45deg);
	        transform: rotate(45deg);
	}
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
	background: white;
	color: #333;
	box-shadow: 0 3px 14px rgba(0,0,0,0.4);
	}
.leaflet-container a.leaflet-popup-close-button {
	position: absolute;
	top: 0;
	right: 0;
	border: none;
	text-align: center;
	width: 24px;
	height: 24px;
	font: 16px/24px Tahoma, Verdana, sans-serif;
	color: #757575;
	text-decoration: none;
	background: transparent;
	}
.leaflet-container a.leaflet-popup-close-button:hover,
.leaflet-container a.leaflet-popup-close-button:focus {
	color: #585858;
	}
.leaflet-popup-scrolled {
	overflow: auto;
	}

.leaflet-oldie .leaflet-popup-content-wrapper {
	-ms-zoom: 1;
	}
.leaflet-oldie .leaflet-popup-tip {
	width: 24px;
	margin: 0 auto;

	-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
	filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
	}

.leaflet-oldie .leaflet-control-zoom,
.leaflet-oldie .leaflet-control-layers,
.leaflet-oldie .leaflet-popup-content-wrapper,
.leaflet-oldie .leaflet-popup-tip {
	border: 1px solid #999;
	}


/* div icon */

.leaflet-div-icon {
	background: #fff;
	border: 1px solid #666;
	}


/* Tooltip */
/* Base styles for the element that has a tooltip */
.leaflet-tooltip {
	position: absolute;
	padding: 6px;
	background-color: #fff;
	border: 1px solid #fff;
	border-radius: 3px;
	color: #222;
	white-space: nowrap;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
	pointer-events: none;
	box-shadow: 0 1px 3px rgba(0,0,0,0.4);
	}
.leaflet-tooltip.leaflet-interactive {
	cursor: pointer;
	pointer-events: auto;
	}
.leaflet-tooltip-top:before,
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
	position: absolute;
	pointer-events: none;
	border: 6px solid transparent;
	background: transparent;
	content: "";
	}

/* Directions */

.leaflet-tooltip-bottom {
	margin-top: 6px;
}
.leaflet-tooltip-top {
	margin-top: -6px;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-top:before {
	left: 50%;
	margin-left: -6px;
	}
.leaflet-tooltip-top:before {
	bottom: 0;
	margin-bottom: -12px;
	border-top-color: #fff;
	}
.leaflet-tooltip-bottom:before {
	top: 0;
	margin-top: -12px;
	margin-left: -6px;
	border-bottom-color: #fff;
	}
.leaflet-tooltip-left {
	margin-left: -6px;
}
.leaflet-tooltip-right {
	margin-left: 6px;
}
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
	top: 50%;
	margin-top: -6px;
	}
.leaflet-tooltip-left:before {
	right: 0;
	margin-right: -12px;
	border-left-color: #fff;
	}
.leaflet-tooltip-right:before {
	left: 0;
	margin-left: -12px;
	border-right-color: #fff;
	}

/* Printing */

@media print {
	/* Prevent printers from removing background-images of controls. */
	.leaflet-control {
		-webkit-print-color-adjust: exact;
		print-color-adjust: exact;
		}
	}

.leaflet-cluster-anim .leaflet-marker-icon, .leaflet-cluster-anim .leaflet-marker-shadow {
	-webkit-transition: -webkit-transform 0.3s ease-out, opacity 0.3s ease-in;
	-moz-transition: -moz-transform 0.3s ease-out, opacity 0.3s ease-in;
	-o-transition: -o-transform 0.3s ease-out, opacity 0.3s ease-in;
	transition: transform 0.3s ease-out, opacity 0.3s ease-in;
}

.leaflet-cluster-spider-leg {
	/* stroke-dashoffset (duration and function) should match with leaflet-marker-icon transform in order to track it exactly */
	-webkit-transition: -webkit-stroke-dashoffset 0.3s ease-out, -webkit-stroke-opacity 0.3s ease-in;
	-moz-transition: -moz-stroke-dashoffset 0.3s ease-out, -moz-stroke-opacity 0.3s ease-in;
	-o-transition: -o-stroke-dashoffset 0.3s ease-out, -o-stroke-opacity 0.3s ease-in;
	transition: stroke-dashoffset 0.3s ease-out, stroke-opacity 0.3s ease-in;
}

.marker-cluster-small {
	background-color: rgba(181, 226, 140, 0.6);
	}
.marker-cluster-small div {
	background-color: rgba(110, 204, 57, 0.6);
	}

.marker-cluster-medium {
	background-color: rgba(241, 211, 87, 0.6);
	}
.marker-cluster-medium div {
	background-color: rgba(240, 194, 12, 0.6);
	}

.marker-cluster-large {
	background-color: rgba(253, 156, 115, 0.6);
	}
.marker-cluster-large div {
	background-color: rgba(241, 128, 23, 0.6);
	}

	/* IE 6-8 fallback colors */
.leaflet-oldie .marker-cluster-small {
	background-color: rgb(181, 226, 140);
	}
.leaflet-oldie .marker-cluster-small div {
	background-color: rgb(110, 204, 57);
	}

.leaflet-oldie .marker-cluster-medium {
	background-color: rgb(241, 211, 87);
	}
.leaflet-oldie .marker-cluster-medium div {
	background-color: rgb(240, 194, 12);
	}

.leaflet-oldie .marker-cluster-large {
	background-color: rgb(253, 156, 115);
	}
.leaflet-oldie .marker-cluster-large div {
	background-color: rgb(241, 128, 23);
}

.marker-cluster {
	background-clip: padding-box;
	border-radius: 20px;
	}
.marker-cluster div {
	width: 30px;
	height: 30px;
	margin-left: 5px;
	margin-top: 5px;

	text-align: center;
	border-radius: 15px;
	font: 12px "Helvetica Neue", Arial, Helvetica, sans-serif;
	}
.marker-cluster span {
	line-height: 30px;
	}

.cn-map-widget[data-v-11d35e7b] {
	position: relative;
	width: 100%;
	min-height: 200px;
}
.cn-map-widget__leaflet[data-v-11d35e7b] {
	width: 100%;
	height: 100%;
}
.cn-map-widget__fallback[data-v-11d35e7b] {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 100%;
	min-height: 150px;
	color: var(--color-text-maxcontrast);
}
.cn-map-widget__error[data-v-11d35e7b] {
	font-size: 14px;
	margin: 0;
}
.cn-map-widget__legend[data-v-11d35e7b] {
	position: absolute;
	top: 12px;
	right: 12px;
	z-index: 1000;
	background: var(--color-main-background);
	padding: 8px 12px;
	border-radius: var(--border-radius-large, 8px);
	box-shadow: 0 2px 8px rgba(0, 0, 0, .15);
}

/* Fullscreen overlay. A CSS-fixed box rather than the Fullscreen API, so it needs
   no permission prompt; the z-index clears the Nextcloud header. */
.cn-map-widget--fullscreen[data-v-11d35e7b] {
	position: fixed;
	top: 0;
	left: 0;
	width: 100vw;
	height: 100vh;
	z-index: 3000;
}

/* Custom control bar (fit / locate / fullscreen), themed to Nextcloud rather than
   Leaflet's default white-on-grey buttons.
   ::v-deep is required — Leaflet builds the control DOM via L.DomUtil.create, so
   those nodes never receive this SFC's scoped data-v attribute. */
.cn-map-widget[data-v-11d35e7b] .cn-map-widget__control {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 30px;
	height: 30px;
	color: var(--color-main-text);
	background: var(--color-main-background);
}
.cn-map-widget[data-v-11d35e7b] .cn-map-widget__control:hover,
.cn-map-widget[data-v-11d35e7b] .cn-map-widget__control:focus-visible {
	background: var(--color-background-hover);
}


.cn-map-widget-form[data-v-67df777a] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-map-widget-form__row[data-v-67df777a] {
	display: flex;
	gap: 8px;
}
.cn-map-widget-form__row[data-v-67df777a] > * {
	flex: 1;
	min-width: 0;
}
.cn-map-widget-form__hint[data-v-67df777a] {
	color: var(--color-text-maxcontrast);
	font-size: 90%;
	margin: 0;
}
.cn-map-widget-form__field[data-v-67df777a] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-map-widget-form__range[data-v-67df777a] {
	width: 100%;
	/* Native range inputs ship a default 2px margin on ALL sides. The left/right
	   2px pushes the width:100% track past the form and shows a phantom
	   horizontal scrollbar; zeroing it also drops the top/bottom 2px, which was
	   padding the form's height. */
	margin: 0;
}


.cn-fk-resolve-cell[data-v-471db666] {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}


.cn-cell-renderer--uuid[data-v-37d7b88f] {
	font-family: monospace;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}
.cn-cell-renderer--number[data-v-37d7b88f] {
	font-variant-numeric: tabular-nums;
}
.cn-cell-renderer--date[data-v-37d7b88f] {
	white-space: nowrap;
}
.cn-cell-renderer__dash[data-v-37d7b88f] {
	color: var(--color-text-maxcontrast);
}
.cn-cell-renderer__icon--success[data-v-37d7b88f] {
	color: var(--color-success);
}
.cn-cell-renderer__swatch-wrap[data-v-37d7b88f] {
	display: inline-flex;
	align-items: center;
	gap: 8px;
}
.cn-cell-renderer__swatch-dot[data-v-37d7b88f] {
	display: inline-block;
	width: 12px;
	height: 12px;
	border-radius: 50%;
	flex-shrink: 0;
	border: 1px solid var(--color-border-dark);
}


.cn-lock-indicator[data-v-0ce20743] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	vertical-align: middle;
	flex-shrink: 0;
}
.cn-lock-indicator--other[data-v-0ce20743] {
	color: var(--color-warning-text, var(--color-warning, #e9a300));
}
.cn-lock-indicator--mine[data-v-0ce20743] {
	color: var(--color-text-maxcontrast, #767676);
}
.cn-lock-indicator__text[data-v-0ce20743] {
	font-size: 0.85em;
	white-space: nowrap;
}

/* ========================================
   @conduction/nextcloud-vue — Table Styles
   ======================================== */

/* Table Container */
.cn-table-container {
	background: var(--color-main-background);
	border-radius: var(--border-radius);
	box-shadow: 0 2px 4px var(--color-box-shadow);
	border: 1px solid var(--color-border);
	margin-bottom: calc(5 * var(--default-grid-baseline));
}

/* Horizontal scroll for wide tables lives HERE, not on `.cn-table-container`.
   `overflow-x: auto` on the container coerces its `overflow-y` from `visible`
   to `auto` (CSS forbids mixing `visible` with a non-visible value), which
   silently turns the container into the nearest scrollport. The sticky footer
   below then anchors to a container that never scrolls, so "View all" scrolled
   out of view with the rows instead of pinning to the bottom of the enclosing
   widget card. Keeping the overflow on an inner wrapper leaves the container
   transparent to scrolling, so the footer sticks to whichever ancestor really
   scrolls. */
.cn-data-table__scroll {
	overflow-x: auto;
}

.cn-table-container.cn-table-container--scrollable {
	max-height: 400px;
	overflow-y: auto;
}

/* Borderless: drop the card chrome so the table sits flush inside a parent that
   already provides a card (e.g. a CnWidgetWrapper dashboard slot). Folded in
   from the retired CnTableWidget. */
.cn-table-container.cn-table-container--borderless {
	border: none;
	border-radius: 0;
	box-shadow: none;
	background: transparent;
	margin-bottom: 0;
}

/* Fill: grow to the full height of a flex-column card/widget content area and
   push the footer to the bottom (via `margin-top: auto`) instead of letting it
   float directly under a short list. When the list overflows, the container
   grows past the parent and the sticky footer keeps it pinned. No-op when the
   parent has no constrained height. */
.cn-table-container.cn-table-container--fill {
	min-height: 100%;
	display: flex;
	flex-direction: column;
}

/* Optional card header + "View all" footer (folded from CnTableWidget). */
.cn-data-table__header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 12px 16px;
	border-bottom: 1px solid var(--color-border);
}

.cn-data-table__title {
	margin: 0;
	font-size: 14px;
	font-weight: 600;
}

.cn-data-table__count {
	font-size: 12px;
	color: var(--color-text-maxcontrast);
	background: var(--color-background-dark);
	padding: 2px 8px;
	border-radius: 10px;
}

.cn-data-table__footer {
	padding: 8px 16px;
	border-top: 1px solid var(--color-border);
	text-align: center;
	/* Keep the footer (e.g. "+ New" / "View all") pinned to the bottom of the
	   scroll region so it stays reachable while a long list scrolls. Sticks to
	   whichever ancestor scrolls — the container's own `--scrollable` region
	   (max-height 400) or the enclosing widget card's content area. The opaque
	   background stops scrolling rows from showing through behind it. */
	position: sticky;
	bottom: 0;
	background: var(--color-main-background);
}

/* Must follow the base `.cn-data-table__footer` rule above: it is the more
   specific selector, and stylelint's no-descending-specificity forbids the
   reverse order. Pushes the footer to the bottom of a `--fill` container
   (see the flex-column block near the top of this file). */
.cn-table-container--fill .cn-data-table__footer {
	margin-top: auto;
}

/* Rendered as <a :href> when the route resolves, as <button type="button">
   otherwise. The resets neutralise Nextcloud's global button chrome (border,
   background, 44px min-height, padding) so both variants look the same. */
.cn-data-table__view-all {
	display: inline;
	min-height: 0;
	margin: 0;
	padding: 0;
	border: none;
	background: none;
	font: inherit;
	font-size: 13px;
	color: var(--color-primary-element);
	cursor: pointer;
	text-decoration: none;
}

.cn-data-table__view-all:hover {
	text-decoration: underline;
}

/* Both variants are keyboard focusable, so they need a visible focus
   indicator (WCAG 2.4.7). The button reset above drops Nextcloud's, which
   would otherwise have covered the button but never the link. */
.cn-data-table__view-all:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
	border-radius: var(--border-radius, 3px);
	text-decoration: underline;
}

/* Base Table */
.cn-data-table {
	width: 100%;
	border-collapse: collapse;
	background-color: var(--color-main-background);
}

.cn-data-table th,
.cn-data-table td {
	padding: calc(3 * var(--default-grid-baseline));
	text-align: left;
	border-bottom: 1px solid var(--color-border);
	vertical-align: middle;
}

/* Opt-in fixed layout (CnDataTable's `fixedLayout` prop).

   Under the default `table-layout: auto` a column's declared `width` is only a
   hint: the browser sizes columns from their content, so one long unbreakable
   value (a PHP FQCN, a UUID) widens its own column, and any column left unsized
   soaks up every remaining pixel. `fixed` makes the declared widths
   authoritative and splits what is left between the unsized columns.

   `overflow-wrap: anywhere` is the necessary companion: with the column width
   no longer negotiable, content that does not fit would otherwise paint past
   the cell box and collide with the next column. Breaking mid-word keeps it
   inside. Cells opting into `white-space: nowrap` (e.g. `cn-cell--end`) still
   win, since that rule is more specific. */
.cn-data-table--fixed {
	table-layout: fixed;
}

.cn-data-table--fixed th,
.cn-data-table--fixed td {
	overflow-wrap: anywhere;
}

/* `overflow-wrap` on the cell is not enough on its own. CnCellRenderer wraps
   every value in an INLINE span, whose box is sized by its own content rather
   than by the cell, so a long unbreakable value (a URL, a PHP FQCN) makes the
   span measurably wider than its `td` and paints over the next column —
   exactly the overlap fixed layout was meant to end. Promoting the wrapper to
   a block gives it the column's width, which is what the inherited
   `overflow-wrap` needs to break against. `min-width: 0` stops it floor-ing at
   its min-content size. */
.cn-data-table--fixed td > .cn-cell-renderer {
	display: block;
	min-width: 0;
}

.cn-data-table th {
	background: var(--color-background-dark);
	font-weight: 500;
	color: var(--color-text-maxcontrast);
}

/* Reusable cell utilities — set on a column's `cellClass`. Handy for compact
   list widgets (name + trailing status) that use `hideHeader`. */
.cn-data-table td.cn-cell--strong {
	font-weight: 500;
}

.cn-data-table td.cn-cell--muted {
	color: var(--color-text-maxcontrast);
}

.cn-data-table td.cn-cell--end {
	text-align: right;
	white-space: nowrap;
}

/* Single-line cell with a trailing ellipsis. For a value that is one long
   unbreakable token — a URL, a fully-qualified class name — where wrapping is
   worse than clipping: `overflow-wrap` would break it mid-token across three
   lines and make every row that tall. The full text stays reachable through
   the `title` tooltip CnCellRenderer already sets on the value.

   The inner rule is the one that actually clips. `text-overflow` on a
   `display: table-cell` box is unreliable, so the constraint is placed on
   CnCellRenderer's own wrapper span, promoted to a block so it takes the
   cell's width. Pair with `fixedLayout`, which is what gives the column a
   width worth clipping against. */
.cn-data-table td.cn-cell--truncate {
	overflow: hidden;
	white-space: nowrap;
}

.cn-data-table td.cn-cell--truncate > .cn-cell-renderer {
	display: block;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.cn-data-table th.cn-table-header--sortable {
	cursor: pointer;
	user-select: none;
	transition: background-color var(--animation-quick) ease;
}

.cn-data-table th.cn-table-header--sortable:hover {
	background-color: var(--color-background-hover);
}

.cn-table-sort-indicator {
	margin-left: var(--default-grid-baseline);
	opacity: 0.6;
}

/* A column carrying a `description` gets a dotted underline — the long-standing
   convention for "there is an explanation here". Without it the tooltip is
   undiscoverable: nobody hovers a header that gives no sign of having more to
   say. `help` on the cursor rather than `pointer`, since hovering explains
   rather than navigates; a sortable column keeps its own pointer cursor on the
   th, which wins because it is the element actually being clicked. */
.cn-table-header--described {
	text-decoration: underline dotted;
	text-underline-offset: 3px;
	text-decoration-color: var(--color-text-maxcontrast);
	cursor: help;
}

.cn-data-table th.cn-table-header--sortable:focus-visible {
	outline: 2px solid var(--color-main-text);
	outline-offset: -2px;
}

/* Multi-column sort priority badge (1, 2, 3) — only rendered once more than
   one sort key is active; a single active sort shows the arrow alone. */
.cn-table-sort-badge {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 14px;
	height: 14px;
	margin-left: 2px;
	padding: 0 3px;
	border-radius: 7px;
	background-color: var(--color-primary-element);
	color: var(--color-primary-element-text);
	font-size: 10px;
	line-height: 14px;
	font-weight: bold;
	vertical-align: middle;
}

/* Row States */
.cn-table-row {
	border-bottom: 1px solid var(--color-border);
	cursor: pointer;
	transition: background-color var(--animation-quick) ease;
}

.cn-table-row:hover {
	background: var(--color-background-hover);
}

.cn-table-row--selected {
	background-color: var(--color-primary-light);
	box-shadow: inset 3px 0 0 0 var(--color-primary);
}

.cn-table-row--selected:hover {
	background-color: var(--color-primary-light);
}

/* Column Types */
.cn-table-col--checkbox {
	width: 50px;
	text-align: center;
}

.cn-table-col--icon {
	width: 40px;
	padding-right: 0;
	text-align: center;
	color: var(--color-text-maxcontrast);
}

.cn-table-col--icon .material-design-icon {
	display: inline-flex;
}

.cn-table-col--actions {
	width: 120px;
	text-align: center;
	min-width: 120px;
}

.cn-table-col--constrained {
	width: 150px;
	max-width: 150px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.cn-table-col--expanded {
	width: auto;
	min-width: 200px;
}

.cn-table-col--title {
	min-width: 120px;
	max-width: 200px;
	overflow-wrap: break-word;
	overflow: hidden;
}

/* Loading State */
.cn-table-loading {
	text-align: center;
	padding: calc(12 * var(--default-grid-baseline));
}

.cn-table-loading p {
	margin-top: calc(5 * var(--default-grid-baseline));
	color: var(--color-text-maxcontrast);
}

/* Empty State (inside table) */
.cn-table-empty td {
	text-align: center;
	padding: calc(12 * var(--default-grid-baseline)) calc(6 * var(--default-grid-baseline));
	color: var(--color-text-maxcontrast);
}

/* ========================================
   Backwards compatibility aliases
   (legacy OpenRegister CSS class names)
   ======================================== */
.viewTableContainer { background: var(--color-main-background); border-radius: var(--border-radius); overflow-x: hidden; overflow-y: visible; box-shadow: 0 2px 4px var(--color-box-shadow); border: 1px solid var(--color-border); margin-bottom: calc(5 * var(--default-grid-baseline)); }

.viewTableContainer.scrollable { max-height: 400px; overflow-y: auto; }

.viewTable { width: 100%; border-collapse: collapse; background-color: var(--color-main-background); }

.viewTable th, .viewTable td { padding: calc(3 * var(--default-grid-baseline)); text-align: left; border-bottom: 1px solid var(--color-border); vertical-align: middle; }

.viewTable th { background: var(--color-background-hover); font-weight: 500; color: var(--color-text-maxcontrast); background-color: var(--color-background-dark); }

.viewTableRow { border-bottom: 1px solid var(--color-border); cursor: pointer; transition: background-color var(--animation-quick) ease; }

.viewTableRow:hover { background: var(--color-background-hover); }

.viewTableRow.active, .viewTableRowSelected { background: var(--color-primary-light); }

.tableColumnCheckbox { width: 50px; text-align: center; }

.tableColumnActions { width: 120px; text-align: center; min-width: 120px; }

.tableColumnConstrained { width: 150px; max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.tableColumnExpanded { width: auto; min-width: 200px; }

.tableColumnTitle { min-width: 120px; max-width: 200px; overflow-wrap: break-word; overflow: hidden; }

/* ========================================
   Tables inside widgets go EDGE TO EDGE
   ======================================== */

/*
 * A table inside a widget card must touch the card's border — never sit in a
 * gutter. `CnWidgetWrapper`'s content area carries `padding: 16px` by default,
 * which put a visible margin between the widget border and the table border on
 * every table widget whose host forgot to pass `flush`.
 *
 * The rule lives HERE, in the table stylesheet, and keys off the presence of a
 * table rather than off a prop. `CnDataTable` imports this file, so the rule
 * arrives exactly when — and only when — a table is on the page, and no app can
 * reintroduce the gutter by forgetting a prop: there is no prop left to forget.
 *
 * `:has()` is what makes this possible (Baseline since 2023; every browser
 * Nextcloud 30+ supports has it). Unscoped on purpose — a scoped rule cannot
 * see across the component boundary into the wrapper.
 */
.cn-widget-wrapper__content:has(.cn-table-container),
.cn-detail-card__content:has(.cn-table-container) {
	padding: 0;
}

/* ...and the footer "Add" must stop bleeding once that padding is gone.
   `CnObjectListWidget` pulls its footer button out by -16px on the inline axis
   and the bottom so its divider crosses the wrapper's 16px content padding.
   With the rule above that padding is zero, so the bleed crosses nothing and
   simply pushes the button 16px past the card on the right and below it. Both
   overflows are scrollable, so the card grows a vertical scrollbar AND a
   horizontal one, underneath the table's own legitimate horizontal bar. That
   is the double scrollbar seen on a dossiq case's Tasks card.

   Only the inline and bottom margins are reset: `margin-top: auto` is what
   pins the button to the bottom of the flex column and must survive. */
.cn-widget-wrapper__content:has(.cn-table-container) .cn-object-list-widget__add,
.cn-detail-card__content:has(.cn-table-container) .cn-object-list-widget__add {
	margin-inline: 0 !important;
	margin-bottom: 0 !important;
}

/* The table's own card chrome is redundant inside a widget that already draws
   one, and a second border reads as the same gutter defect. Flatten it. */
.cn-widget-wrapper__content .cn-table-container,
.cn-detail-card__content .cn-table-container {
	margin-bottom: 0;
	border: none;
	border-radius: 0;
	box-shadow: none;
}

/* The header/footer keep their own inset so the title and "View all" do not
   collide with the card edge — the rows are what go edge to edge. */
.cn-widget-wrapper__content .cn-data-table__header,
.cn-widget-wrapper__content .cn-data-table__footer {
	padding-inline: 16px;
}


/* Mirrors `.cn-form-dialog__helper` so the line looks identical now that it
   renders from this component rather than inline in CnFormDialog.
   Flex row because NcPopover's trigger wrapper is a plain <div> (floating-vue
   renders `<div class="v-popper">`), which as a block pushed the ⓘ onto its own
   line under the text. Making the helper a flex container puts the wrapper back
   beside the text. */
.cn-field-helper[data-v-3797f4ea] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-field-helper--error[data-v-3797f4ea] {
	color: var(--color-error);
}

/* The button sits inside NcPopover's wrapper, so it is that wrapper — not the
   button — that must hold its width against the text beside it. */
.cn-field-helper[data-v-3797f4ea] >  .v-popper {
	flex: 0 0 auto;
	display: inline-flex;
}

/* Server's core/css/inputs.css gives every bare button
   `min-height: var(--default-clickable-area)` with `width: auto`, so the target
   came out 34px tall but only as wide as the 16px glyph. Size both axes to the
   clickable area and centre the icon in it. */
.cn-field-helper__trigger[data-v-3797f4ea] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	inline-size: var(--default-clickable-area);
	block-size: var(--default-clickable-area);
	padding: 0;
	border: none;
	background: transparent;
	color: var(--color-text-maxcontrast);
	cursor: pointer;
}

/* vue-material-design-icons ships a stylesheet nothing here imports, so the
   icon span is an unstyled inline box and its svg sits on the text baseline
   with descender slack under it — enough to read as off-centre. Make it a flex
   box so the glyph is the whole item and centres exactly. */
.cn-field-helper__trigger[data-v-3797f4ea] .material-design-icon {
	display: flex;
	line-height: 1;
}
.cn-field-helper__trigger[data-v-3797f4ea]:hover,
.cn-field-helper__trigger[data-v-3797f4ea]:focus-visible {
	color: var(--color-main-text);
}
.cn-field-helper__full[data-v-3797f4ea] {
	max-width: 380px;
	max-height: 320px;
	overflow-y: auto;
	padding: 12px;
	font-size: 0.9em;
	line-height: 1.4;
	white-space: pre-wrap;
}


.cn-json-viewer[data-v-f9f54b22] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-json-viewer__codemirror[data-v-f9f54b22] {
	position: relative;
}
.cn-json-viewer__codemirror[data-v-f9f54b22] .cm-editor {
	height: 100%;
	outline: none !important;
}
.cn-json-viewer__codemirror[data-v-f9f54b22] .cm-scroller {
	overflow: auto;
}
.cn-json-viewer__codemirror[data-v-f9f54b22] .cm-content {
	border-radius: 0 !important;
	border: none !important;
}
.cn-json-viewer__codemirror--light > .vue-codemirror[data-v-f9f54b22] {
	border: 1px dotted silver;
}
.cn-json-viewer__codemirror--dark > .vue-codemirror[data-v-f9f54b22] {
	border: 1px dotted grey;
}

/* Text cursor */
.cn-json-viewer__codemirror[data-v-f9f54b22] .cm-content * {
	cursor: text !important;
}

/* PATCH SELECTION COLOR - default selection system does not work */
/* Selection background — CodeMirror uses .cm-selectionBackground instead of ::selection */
.cn-json-viewer__codemirror--light[data-v-f9f54b22] .cm-selectionBackground {
	background: #3390ff !important;
}
.cn-json-viewer__codemirror--light[data-v-f9f54b22] .cm-selectionBackground + .cm-selectionBackground,
.cn-json-viewer__codemirror--light[data-v-f9f54b22] .cm-line ::selection {
	color: white !important;
}
.cn-json-viewer__codemirror--dark[data-v-f9f54b22] .cm-selectionBackground {
	background: #3390ff !important;
}

/* Selected text color */
.cn-json-viewer__codemirror--light[data-v-f9f54b22] .cm-content ::selection {
	background: #3390ff !important;
	color: white !important;
}
.cn-json-viewer__codemirror--dark[data-v-f9f54b22] .cm-content ::selection {
	background: #3390ff !important;
	color: white !important;
}
.cn-json-viewer__format-btn[data-v-f9f54b22] {
	margin-top: 8px;
}
.cn-json-viewer__error[data-v-f9f54b22] {
	color: var(--color-error);
	font-size: 14px;
}


.cn-icon-browser-panel[data-v-69357dca] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-icon-browser-panel__preview[data-v-69357dca] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-icon-browser-panel__preview-icon[data-v-69357dca] {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	width: 40px;
	height: 40px;
	border: 1px solid var(--color-border);
	border-radius: 4px;
	background-color: var(--color-background-hover);
}
.cn-icon-browser-panel__preview-img[data-v-69357dca],
.cn-icon-browser-panel__preview-svg[data-v-69357dca] {
	width: 24px;
	height: 24px;
}
.cn-icon-browser-panel__preview-svg[data-v-69357dca] {
	fill: var(--color-main-text);
}
.cn-icon-browser-panel__preview-label[data-v-69357dca] {
	font-size: 13px;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-icon-browser-panel__clear[data-v-69357dca] {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	margin-inline-start: auto;
	padding: 4px;
	background: transparent;
	border: none;
	border-radius: var(--border-radius, 4px);
	color: var(--color-text-maxcontrast);
	cursor: pointer;
}
.cn-icon-browser-panel__clear[data-v-69357dca]:hover,
.cn-icon-browser-panel__clear[data-v-69357dca]:focus-visible {
	background-color: var(--color-background-hover);
	color: var(--color-main-text);
}
.cn-icon-browser-panel__tabs[data-v-69357dca] {
	display: flex;
	/* Icons + one tab per icon set + Custom: wrap rather than overflow a narrow
	   popover. */
	flex-wrap: wrap;
	gap: 4px;
	border-bottom: 1px solid var(--color-border);
}
.cn-icon-browser-panel__tab[data-v-69357dca] {
	padding: 6px 12px;
	background: transparent;
	border: none;
	border-bottom: 2px solid transparent;
	font: inherit;
	color: var(--color-text-maxcontrast);
	cursor: pointer;
}
.cn-icon-browser-panel__tab--active[data-v-69357dca] {
	color: var(--color-main-text);
	border-bottom-color: var(--color-primary-element);
}
.cn-icon-browser-panel__icons[data-v-69357dca],
.cn-icon-browser-panel__custom[data-v-69357dca] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-icon-browser-panel__search[data-v-69357dca],
.cn-icon-browser-panel__url-input[data-v-69357dca] {
	width: 100%;
	padding: 6px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius, 4px);
	font-size: 14px;
}
.cn-icon-browser-panel__grid[data-v-69357dca] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(40px, 1fr));
	gap: 4px;
	max-height: 260px;
	overflow-y: auto;
}
.cn-icon-browser-panel__cell[data-v-69357dca] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 2px;
	padding: 6px;
	background: transparent;
	border: 1px solid transparent;
	border-radius: 4px;
	cursor: pointer;
	color: var(--color-main-text);
}
.cn-icon-browser-panel__cell[data-v-69357dca]:hover {
	background-color: var(--color-background-hover);
}
.cn-icon-browser-panel__cell--active[data-v-69357dca] {
	border-color: var(--color-primary-element);
	background-color: var(--color-primary-element-light);
}
.cn-icon-browser-panel__cell-svg[data-v-69357dca],
.cn-icon-browser-panel__cell-img[data-v-69357dca],
.cn-icon-browser-panel__cell-component[data-v-69357dca] {
	width: 24px;
	height: 24px;
	object-fit: contain;
}
.cn-icon-browser-panel__cell-svg[data-v-69357dca] {
	fill: var(--color-main-text);
}
.cn-icon-browser-panel__cell-label[data-v-69357dca] {
	font-size: 10px;
	text-align: center;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	max-width: 100%;
}
.cn-icon-browser-panel__hint[data-v-69357dca],
.cn-icon-browser-panel__empty[data-v-69357dca] {
	margin: 0;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-icon-browser-panel__upload-label[data-v-69357dca] {
	display: inline-flex;
	cursor: pointer;
}
.cn-icon-browser-panel__file-input[data-v-69357dca] {
	display: none;
}
.cn-icon-browser-panel__upload-button[data-v-69357dca],
.cn-icon-browser-panel__format[data-v-69357dca] {
	padding: 6px 12px;
	border: 1px solid var(--color-border);
	border-radius: 4px;
	background-color: var(--color-background-hover);
	font-size: 14px;
}
.cn-icon-browser-panel__format[data-v-69357dca] {
	align-self: flex-start;
	font: inherit;
	color: var(--color-main-text);
	cursor: pointer;
}
.cn-icon-browser-panel__upload-label:hover .cn-icon-browser-panel__upload-button[data-v-69357dca] {
	background-color: var(--color-background-dark);
}
.cn-icon-browser-panel__error[data-v-69357dca] {
	margin: 0;
	padding: 4px 8px;
	font-size: 12px;
	color: var(--color-error);
	background-color: var(--color-background-hover);
	border-radius: 2px;
}


.cn-icon-browser[data-v-2bf476ce] {
	position: relative;
	display: inline-block;
}
.cn-icon-browser--inline[data-v-2bf476ce] {
	display: block;
	width: 100%;
}
.cn-icon-browser__field-label[data-v-2bf476ce] {
	display: block;
	margin-bottom: 4px;
	font-size: 13px;
	font-weight: 600;
}
.cn-icon-browser__trigger[data-v-2bf476ce] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	padding: 6px;
	background-color: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: 4px;
	cursor: pointer;
}
.cn-icon-browser__trigger[data-v-2bf476ce]:hover {
	background-color: var(--color-background-hover);
}
.cn-icon-browser__trigger-img[data-v-2bf476ce],
.cn-icon-browser__trigger-svg[data-v-2bf476ce] {
	width: 24px;
	height: 24px;
}
.cn-icon-browser__trigger-svg[data-v-2bf476ce] {
	fill: var(--color-main-text);
}
.cn-icon-browser__trigger-placeholder[data-v-2bf476ce] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
}


.cn-icon-browser__popper .v-popper__inner {
	width: 320px;
	max-width: 90vw;
	padding: 12px !important;
}


.cn-resource-select__create[data-v-37b7ff6f] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	color: var(--color-primary-element);
	font-weight: 600;
}


/* Chromeless: the surface around it already draws the card and names it. */
.cn-detail-card--chromeless[data-v-2d778c62] {
	background: none;
	border: none;
	border-radius: 0;
	box-shadow: none;
	padding: 0;
}
.cn-detail-card[data-v-2d778c62] {
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 12px);
	overflow: hidden;
}
.cn-detail-card__header[data-v-2d778c62] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 12px 16px;
	border-bottom: 1px solid var(--color-border);
	flex-shrink: 0;
}
.cn-detail-card__header--clickable[data-v-2d778c62] {
	cursor: pointer;
	user-select: none;
}
.cn-detail-card__header--clickable[data-v-2d778c62]:hover {
	background: var(--color-background-hover);
}
.cn-detail-card--collapsed .cn-detail-card__header[data-v-2d778c62] {
	border-bottom: none;
}
.cn-detail-card__header-left[data-v-2d778c62] {
	display: flex;
	align-items: center;
	gap: 8px;
	min-width: 0;
}
.cn-detail-card__header-right[data-v-2d778c62] {
	display: flex;
	align-items: center;
	gap: 4px;
	flex-shrink: 0;
}
.cn-detail-card__icon[data-v-2d778c62] {
	color: var(--color-primary-element);
	flex-shrink: 0;
}
.cn-detail-card__title[data-v-2d778c62] {
	font-weight: 600;
	font-size: 14px;
	margin: 0;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-detail-card__collapse-btn[data-v-2d778c62] {
	display: flex;
	align-items: center;
	justify-content: center;
	background: none;
	border: none;
	padding: 4px;
	cursor: pointer;
	color: var(--color-text-maxcontrast);
	border-radius: var(--border-radius);
}
.cn-detail-card__collapse-btn[data-v-2d778c62]:hover {
	background: var(--color-background-dark);
}
.cn-detail-card__chevron--rotated[data-v-2d778c62] {
	transform: rotate(-90deg);
	transition: transform 0.2s ease;
}
.cn-detail-card__content[data-v-2d778c62] {
	padding: 16px;
}
.cn-detail-card__content--flush[data-v-2d778c62] {
	padding: 0;
}
.cn-detail-card__footer[data-v-2d778c62] {
	padding: 8px 16px;
	border-top: 1px solid var(--color-border);
}


.cn-activity-card__empty[data-v-2f1e8732] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-activity-card__headline[data-v-2f1e8732] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-activity-card__headline-line[data-v-2f1e8732] {
	font-size: 1.05em;
	color: var(--color-main-text);
}
.cn-activity-card__headline-recent[data-v-2f1e8732] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-activity-card__headline-actor[data-v-2f1e8732] {
	font-weight: 500;
}
.cn-activity-card__headline-subject[data-v-2f1e8732] {
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-activity-card__chip[data-v-2f1e8732] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-activity-card__chip-label[data-v-2f1e8732] {
	display: inline-flex;
	gap: 4px;
	color: var(--color-main-text);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-activity-card__chip-actor[data-v-2f1e8732] {
	font-weight: 500;
}
.cn-activity-card__chip-sep[data-v-2f1e8732] {
	opacity: 0.6;
}
.cn-activity-card__chip-subject[data-v-2f1e8732] {
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-activity-card__day[data-v-2f1e8732] {
	margin-bottom: 10px;
}
.cn-activity-card__day-header[data-v-2f1e8732] {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 4px 0;
	font-size: 0.8em;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
	border-bottom: 1px solid var(--color-border);
}
.cn-activity-card__day-count[data-v-2f1e8732] {
	margin-left: auto;
	font-weight: normal;
	font-size: 0.8em;
	padding: 1px 6px;
	border-radius: 9px;
	background: var(--color-background-hover);
}
.cn-activity-card__list[data-v-2f1e8732] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-activity-card__row[data-v-2f1e8732] {
	display: flex;
	align-items: flex-start;
	gap: 6px;
	padding: 6px 0;
}
.cn-activity-card__row-main[data-v-2f1e8732] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
}
.cn-activity-card__row-subject[data-v-2f1e8732] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	font-size: 0.95em;
}
.cn-activity-card__row-meta[data-v-2f1e8732] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}


.cn-activity-tab__banner[data-v-26b7b50e] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-activity-tab__filters[data-v-26b7b50e] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	margin-bottom: 12px;
}
.cn-activity-tab__filter-row[data-v-26b7b50e] {
	display: flex;
	gap: 8px;
}
.cn-activity-tab__filter[data-v-26b7b50e] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-activity-tab__filter-label[data-v-26b7b50e] {
	font-size: 0.78em;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
}
.cn-activity-tab__select[data-v-26b7b50e] {
	width: 100%;
	min-height: 34px;
	padding: 4px 6px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-activity-tab__range[data-v-26b7b50e] {
	display: flex;
	gap: 4px;
}
.cn-activity-tab__range-btn[data-v-26b7b50e] {
	flex: 1;
	padding: 4px 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-text-maxcontrast);
	font-size: 0.82em;
	cursor: pointer;
}
.cn-activity-tab__range-btn--active[data-v-26b7b50e] {
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
	border-color: var(--color-primary-element);
}
.cn-activity-tab__error[data-v-26b7b50e] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-activity-tab__empty[data-v-26b7b50e] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-activity-tab__empty-icon[data-v-26b7b50e] {
	color: var(--color-text-maxcontrast);
}
.cn-activity-tab__day[data-v-26b7b50e] {
	margin-bottom: 14px;
}
.cn-activity-tab__day-header[data-v-26b7b50e] {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 4px 0;
	font-size: 0.85em;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
	border-bottom: 1px solid var(--color-border);
}
.cn-activity-tab__day-label[data-v-26b7b50e] {
	flex: 1;
}
.cn-activity-tab__day-count[data-v-26b7b50e] {
	font-weight: normal;
	font-size: 0.85em;
	padding: 1px 6px;
	border-radius: 9px;
	background: var(--color-background-hover);
}
.cn-activity-tab__list[data-v-26b7b50e] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}

/* Actor avatar with an overlapping activity-type badge, mirroring the
   NC Activity feed's per-event glyph. */
.cn-activity-tab__avatar-wrap[data-v-26b7b50e] {
	position: relative;
	display: inline-flex;
	width: 36px;
	height: 36px;
}
.cn-activity-tab__type-badge[data-v-26b7b50e] {
	position: absolute;
	right: -2px;
	bottom: -2px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 16px;
	height: 16px;
	border-radius: 50%;
	border: 2px solid var(--color-main-background);
	color: var(--color-primary-element-text);
	background: var(--color-primary-element);
}
.cn-activity-tab__type-badge--comment[data-v-26b7b50e] {
	background: var(--color-success, #46ba61);
}
.cn-activity-tab__type-badge--share[data-v-26b7b50e] {
	background: var(--color-primary-element);
}
.cn-activity-tab__type-badge--tag[data-v-26b7b50e] {
	background: var(--color-warning, #e9a40f);
}
.cn-activity-tab__type-badge--file[data-v-26b7b50e] {
	background: var(--color-text-maxcontrast);
}
.cn-activity-tab__subject[data-v-26b7b50e] {
	color: var(--color-main-text);
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-activity-tab__subname[data-v-26b7b50e] {
	display: block;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-text-maxcontrast);
}
.cn-activity-tab__actor[data-v-26b7b50e] {
	font-weight: 500;
}
.cn-activity-tab__time[data-v-26b7b50e] {
	color: var(--color-text-maxcontrast);
	font-size: 0.8em;
	white-space: nowrap;
}
.cn-activity-tab__footer[data-v-26b7b50e] {
	margin-top: 8px;
}


.cn-analytics-card__empty[data-v-4000c99f] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-analytics-card__headline[data-v-4000c99f] {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-analytics-card__headline-line[data-v-4000c99f] {
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-analytics-card__headline-recent[data-v-4000c99f] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
}
.cn-analytics-card__headline-name[data-v-4000c99f] {
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	flex: 1;
	min-width: 0;
}
.cn-analytics-card__headline-name[data-v-4000c99f]:hover {
	text-decoration: underline;
}
.cn-analytics-card__chip[data-v-4000c99f] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 10px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-analytics-card__chip a[data-v-4000c99f] {
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-analytics-card__chip a[data-v-4000c99f]:hover {
	text-decoration: underline;
}
.cn-analytics-card__list[data-v-4000c99f] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-analytics-card__row[data-v-4000c99f] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-analytics-card__row[data-v-4000c99f]:last-child {
	border-bottom: none;
}
.cn-analytics-card__row-icon[data-v-4000c99f] {
	flex-shrink: 0;
	color: var(--color-primary-element);
	width: 18px;
	height: 18px;
	display: flex;
	align-items: center;
	justify-content: center;
}
.cn-analytics-card__row-main[data-v-4000c99f] {
	flex: 1;
	min-width: 0;
	display: flex;
	align-items: center;
	gap: 6px;
}
.cn-analytics-card__title[data-v-4000c99f] {
	flex: 1;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
	font-size: 13px;
}
a.cn-analytics-card__title[data-v-4000c99f]:hover {
	text-decoration: underline;
}
.cn-analytics-card__badge[data-v-4000c99f] {
	display: inline-flex;
	align-items: center;
	padding: 1px 6px;
	border-radius: 8px;
	background: var(--color-background-hover);
	color: var(--color-main-text);
	font-size: 10px;
	font-weight: 600;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	flex-shrink: 0;
}
.cn-analytics-card__badge--type-3[data-v-4000c99f] { background: var(--color-primary-element-light, var(--color-primary-light)); color: var(--color-primary-element-text);
}
.cn-analytics-card__badge--type-4[data-v-4000c99f] { background: var(--color-success, #46ba61); color: var(--color-main-background);
}
.cn-analytics-card__badge--type-2[data-v-4000c99f] { background: var(--color-warning, #e9a40f); color: var(--color-main-background);
}
.cn-analytics-card__view-all[data-v-4000c99f] {
	margin-top: 6px;
	font-size: 0.8em;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-analytics-card__view-all a[data-v-4000c99f] {
	color: var(--color-primary-element);
	text-decoration: none;
}
.cn-analytics-card__view-all a[data-v-4000c99f]:hover {
	text-decoration: underline;
}


.cn-analytics-report-create[data-v-3dfb6632] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-analytics-report-create__error[data-v-3dfb6632] {
	margin: 4px 0;
}
.cn-analytics-report-create__field[data-v-3dfb6632] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-analytics-report-create__label[data-v-3dfb6632] {
	font-size: 13px;
	font-weight: 500;
	color: var(--color-text-maxcontrast);
}


.cn-analytics-report-picker[data-v-8f4257ea] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-analytics-report-picker__error[data-v-8f4257ea] {
	margin: 4px 0;
}
.cn-analytics-report-picker__search[data-v-8f4257ea] {
	width: 100%;
}
.cn-analytics-report-picker__list[data-v-8f4257ea] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-analytics-report-picker__row[data-v-8f4257ea] {
	border-radius: var(--border-radius);
}
.cn-analytics-report-picker__row-button[data-v-8f4257ea] {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	width: 100%;
	padding: 8px 10px;
	background: var(--color-background-hover);
	border: 2px solid transparent;
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-analytics-report-picker__row-button[data-v-8f4257ea]:hover {
	background: var(--color-background-dark, var(--color-background-hover));
}
.cn-analytics-report-picker__row--selected .cn-analytics-report-picker__row-button[data-v-8f4257ea] {
	border-color: var(--color-primary-element);
}
.cn-analytics-report-picker__row-icon[data-v-8f4257ea] {
	flex-shrink: 0;
	color: var(--color-primary-element);
	padding-top: 2px;
}
.cn-analytics-report-picker__row-main[data-v-8f4257ea] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 3px;
}
.cn-analytics-report-picker__name[data-v-8f4257ea] {
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-analytics-report-picker__sub[data-v-8f4257ea] {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px;
	font-size: 11px;
	color: var(--color-text-maxcontrast);
}
.cn-analytics-report-picker__badge[data-v-8f4257ea] {
	display: inline-flex;
	align-items: center;
	padding: 1px 6px;
	border-radius: 8px;
	background: var(--color-background-darker, var(--color-background-dark));
	color: var(--color-main-text);
	font-size: 10px;
	font-weight: 600;
	letter-spacing: 0.04em;
	text-transform: uppercase;
}
.cn-analytics-report-picker__when[data-v-8f4257ea] {
	white-space: nowrap;
}


.cn-analytics-tab[data-v-52d520d6] {
	padding: 12px;
	overflow-x: hidden;
}
.cn-analytics-tab__actions[data-v-52d520d6] {
	display: flex;
	gap: 8px;
	margin-bottom: 10px;
	flex-wrap: wrap;
}
.cn-analytics-tab__banner[data-v-52d520d6] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-analytics-tab__error[data-v-52d520d6] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-analytics-tab__empty[data-v-52d520d6] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-analytics-tab__empty-icon[data-v-52d520d6] {
	color: var(--color-text-maxcontrast);
}
.cn-analytics-tab__list[data-v-52d520d6] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}

/* Chart-type icon avatar — tinted with the descriptor accent (or NC primary). */
.cn-analytics-tab__row-icon[data-v-52d520d6] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border-radius: var(--border-radius-large, 8px);
	background: var(--color-primary-element-light, var(--color-background-hover));
	color: var(--cn-iw-accent, var(--color-primary-element, #0082c9));
}

/* Subtitle row: type badge + data source + modified date, single muted line. */
.cn-analytics-tab__sub[data-v-52d520d6] {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px;
	font-size: 11px;
	color: var(--color-text-maxcontrast);
	min-width: 0;
}
.cn-analytics-tab__badge[data-v-52d520d6] {
	flex-shrink: 0;
}
.cn-analytics-tab__subheader[data-v-52d520d6] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	max-width: 100%;
}
.cn-analytics-tab__when[data-v-52d520d6] {
	white-space: nowrap;
}

/* Headline KPI value, right-aligned in the details slot — Analytics style. */
.cn-analytics-tab__kpi[data-v-52d520d6] {
	font-weight: 700;
	font-size: 15px;
	color: var(--color-main-text);
	white-space: nowrap;
}


.cn-audit-card__list[data-v-d4cd20e2] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-audit-card__row[data-v-d4cd20e2] {
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-audit-card__row[data-v-d4cd20e2]:last-child {
	border-bottom: none;
}
.cn-audit-card__row-head[data-v-d4cd20e2] {
	display: flex;
	justify-content: space-between;
	gap: 8px;
}
.cn-audit-card__action[data-v-d4cd20e2] {
	color: var(--color-main-text);
}
.cn-audit-card__when[data-v-d4cd20e2] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	white-space: nowrap;
}
.cn-audit-card__row-body[data-v-d4cd20e2] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-audit-card__empty[data-v-d4cd20e2] {
	color: var(--color-text-maxcontrast);
	text-align: center;
	padding: 12px 0;
}
.cn-audit-card__show-all[data-v-d4cd20e2] {
	background: none;
	border: none;
	color: var(--color-primary-element);
	cursor: pointer;
	padding: 4px 0;
	font: inherit;
}
.cn-audit-card__show-all[data-v-d4cd20e2]:hover {
	text-decoration: underline;
}


.cn-sidebar-tab[data-v-fd0dc97c] { padding: 12px;
}
.cn-sidebar-tab__empty[data-v-fd0dc97c] {
	text-align: center;
	padding: 24px 12px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-sidebar-tab__list[data-v-fd0dc97c] { display: flex; flex-direction: column; gap: 2px;
}
.cn-audit-filters[data-v-fd0dc97c] {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 8px;
	margin-bottom: 12px;
}
.cn-audit-filters__select[data-v-fd0dc97c] { min-width: 0;
}
.cn-audit-filters__date[data-v-fd0dc97c] { min-width: 0;
}
.cn-sidebar-tab__load-more[data-v-fd0dc97c] { margin-top: 8px;
}
.cn-audit-entry[data-v-fd0dc97c] { cursor: pointer;
}
.cn-audit-details[data-v-fd0dc97c] {
	padding: 8px 12px 12px 52px;
	font-size: 12px;
	border-bottom: 1px solid var(--color-border);
	animation: cn-slide-down-fd0dc97c 0.15s ease;
}
@keyframes cn-slide-down-fd0dc97c {
from { opacity: 0; max-height: 0;
}
to { opacity: 1; max-height: 600px;
}
}
.cn-audit-details__row[data-v-fd0dc97c] {
	display: flex;
	gap: 8px;
	padding: 2px 0;
}
.cn-audit-details__label[data-v-fd0dc97c] {
	color: var(--color-text-maxcontrast);
	min-width: 56px;
	font-weight: 500;
}
.cn-audit-details__mono[data-v-fd0dc97c] {
	font-family: monospace;
	font-size: 11px;
	word-break: break-all;
}
.cn-audit-details__changes[data-v-fd0dc97c] {
	margin-top: 8px;
	padding-top: 8px;
	border-top: 1px solid var(--color-border);
}
.cn-audit-details__change[data-v-fd0dc97c] {
	padding: 4px 0 4px 8px;
	border-left: 2px solid var(--color-border);
	margin: 4px 0;
}
.cn-audit-details__field[data-v-fd0dc97c] {
	font-weight: 500;
	display: block;
	margin-bottom: 2px;
}
.cn-audit-details__values[data-v-fd0dc97c] {
	display: flex;
	gap: 6px;
	align-items: baseline;
	flex-wrap: wrap;
}
.cn-audit-details__old[data-v-fd0dc97c] {
	color: var(--color-error, #e53935);
	text-decoration: line-through;
}
.cn-audit-details__arrow[data-v-fd0dc97c] {
	color: var(--color-text-maxcontrast);
}
.cn-audit-details__new[data-v-fd0dc97c] {
	color: var(--color-success, #43a047);
}
.cn-audit-details__null[data-v-fd0dc97c] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
}


.cn-bookmarks-card__empty[data-v-86bb63e6] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-bookmarks-card__headline[data-v-86bb63e6] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-bookmarks-card__headline-line[data-v-86bb63e6] {
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-bookmarks-card__headline-recent[data-v-86bb63e6] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-bookmarks-card__headline-recent a[data-v-86bb63e6] {
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-bookmarks-card__headline-recent a[data-v-86bb63e6]:hover {
	text-decoration: underline;
}
.cn-bookmarks-card__chip[data-v-86bb63e6] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-bookmarks-card__chip a[data-v-86bb63e6] {
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-bookmarks-card__chip a[data-v-86bb63e6]:hover {
	text-decoration: underline;
}
.cn-bookmarks-card__favicon[data-v-86bb63e6] {
	width: 14px;
	height: 14px;
	object-fit: contain;
	flex-shrink: 0;
}
.cn-bookmarks-card__list[data-v-86bb63e6] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-bookmarks-card__row[data-v-86bb63e6] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-bookmarks-card__row[data-v-86bb63e6]:last-child {
	border-bottom: none;
}
.cn-bookmarks-card__row-icon[data-v-86bb63e6] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
	width: 16px;
	height: 16px;
	display: flex;
	align-items: center;
	justify-content: center;
}
.cn-bookmarks-card__row-main[data-v-86bb63e6] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
}
.cn-bookmarks-card__title[data-v-86bb63e6] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-bookmarks-card__title[data-v-86bb63e6]:hover {
	text-decoration: underline;
}
.cn-bookmarks-card__view-all[data-v-86bb63e6] {
	margin-top: 6px;
	font-size: 0.8em;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-bookmarks-card__view-all a[data-v-86bb63e6] {
	color: var(--color-primary-element);
	text-decoration: none;
}
.cn-bookmarks-card__view-all a[data-v-86bb63e6]:hover {
	text-decoration: underline;
}


.cn-bookmark-create[data-v-2378b46f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-bookmark-create__error[data-v-2378b46f] {
	margin: 4px 0;
}


.cn-bookmark-picker[data-v-bd9d2aa2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-bookmark-picker__error[data-v-bd9d2aa2] {
	margin: 4px 0;
}
.cn-bookmark-picker__search[data-v-bd9d2aa2] {
	width: 100%;
}
.cn-bookmark-picker__list[data-v-bd9d2aa2] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-bookmark-picker__row[data-v-bd9d2aa2] {
	border-radius: var(--border-radius);
}
.cn-bookmark-picker__row--selected[data-v-bd9d2aa2] {
	background: var(--color-primary-element-light);
}
.cn-bookmark-picker__row-button[data-v-bd9d2aa2] {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	width: 100%;
	padding: 8px 10px;
	background: transparent;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-bookmark-picker__row-button[data-v-bd9d2aa2]:hover {
	background: var(--color-background-hover);
}
.cn-bookmark-picker__row--selected .cn-bookmark-picker__row-button[data-v-bd9d2aa2] {
	border-color: var(--color-primary-element);
}
.cn-bookmark-picker__row-icon[data-v-bd9d2aa2] {
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	display: flex;
	align-items: center;
	justify-content: center;
	color: var(--color-text-maxcontrast);
	padding-top: 2px;
}
.cn-bookmark-picker__favicon[data-v-bd9d2aa2] {
	width: 16px;
	height: 16px;
	object-fit: contain;
}
.cn-bookmark-picker__row-main[data-v-bd9d2aa2] {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	min-width: 0;
	gap: 2px;
}
.cn-bookmark-picker__row-title[data-v-bd9d2aa2] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-weight: 500;
}
.cn-bookmark-picker__row-url[data-v-bd9d2aa2] {
	font-size: 0.75em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-bookmark-picker__row-description[data-v-bd9d2aa2] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
}
.cn-bookmark-picker__tags[data-v-bd9d2aa2] {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
	margin-top: 2px;
}
.cn-bookmark-picker__tag[data-v-bd9d2aa2] {
	display: inline-block;
	padding: 1px 6px;
	border-radius: 8px;
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
	font-size: 0.7em;
}


.cn-bookmarks-tab__actions[data-v-56da56a8] {
	display: flex;
	gap: 8px;
	margin-bottom: 8px;
	flex-wrap: wrap;
}
.cn-bookmarks-tab__banner[data-v-56da56a8] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-bookmarks-tab__error[data-v-56da56a8] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-bookmarks-tab__empty[data-v-56da56a8] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-bookmarks-tab__empty-icon[data-v-56da56a8] {
	color: var(--color-text-maxcontrast);
}
.cn-bookmarks-tab__filters[data-v-56da56a8] {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	margin-bottom: 10px;
}
.cn-bookmarks-tab__chip[data-v-56da56a8] {
	display: inline-flex;
	align-items: center;
	padding: 3px 10px;
	border-radius: 12px;
	border: 1px solid var(--color-border);
	background: var(--color-background-hover);
	color: var(--color-main-text);
	font-size: 0.8em;
	cursor: pointer;
}
.cn-bookmarks-tab__chip[data-v-56da56a8]:hover {
	background: var(--color-background-darker, var(--color-background-hover));
}
.cn-bookmarks-tab__chip--active[data-v-56da56a8] {
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
	border-color: var(--color-primary-element);
}
.cn-bookmarks-tab__chip--clear[data-v-56da56a8] {
	font-style: italic;
	color: var(--color-text-maxcontrast);
}
.cn-bookmarks-tab__list[data-v-56da56a8] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}

/* Favicon / fallback glyph rendered inside NcListItem's #icon slot,
   sized like a real NC Bookmarks site icon. */
.cn-bookmarks-tab__row-icon[data-v-56da56a8] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
	width: 32px;
	height: 32px;
	display: flex;
	align-items: center;
	justify-content: center;
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
}

/* Truncated URL subline with a trailing external-link affordance. */
.cn-bookmarks-tab__url[data-v-56da56a8] {
	display: inline-flex;
	align-items: center;
	gap: 3px;
	max-width: 100%;
	color: var(--color-text-maxcontrast);
}
.cn-bookmarks-tab__url-text[data-v-56da56a8] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-bookmarks-tab__url-ext[data-v-56da56a8] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
}
.cn-bookmarks-tab__description[data-v-56da56a8] {
	display: -webkit-box;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	-webkit-line-clamp: 1;
	-webkit-box-orient: vertical;
}
.cn-bookmarks-tab__tags[data-v-56da56a8] {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
	margin-top: 2px;
}


.cn-calendar-card__empty[data-v-00027907] {
	text-align: center;
	padding: 16px 12px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-calendar-card__error[data-v-00027907] {
	color: var(--color-error);
	padding: 8px 0;
	font-size: 13px;
}
.cn-calendar-card__list[data-v-00027907] {
	display: flex;
	flex-direction: column;
}
.cn-calendar-card__row[data-v-00027907] {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	padding: 8px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-calendar-card__row[data-v-00027907]:last-child {
	border-bottom: none;
}
.cn-calendar-card__row-icon[data-v-00027907] {
	flex-shrink: 0;
	padding-top: 1px;
}
.cn-calendar-card__icon--upcoming[data-v-00027907] { color: var(--color-primary-element);
}
.cn-calendar-card__icon--past[data-v-00027907]     { color: var(--color-text-maxcontrast);
}
.cn-calendar-card__row-main[data-v-00027907] {
	flex: 1;
	min-width: 0;
}
.cn-calendar-card__title[data-v-00027907] {
	display: block;
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-calendar-card__meta[data-v-00027907] {
	display: flex;
	align-items: center;
	gap: 6px;
	margin-top: 2px;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-calendar-card__when[data-v-00027907] {
	white-space: nowrap;
}
.cn-calendar-card__location[data-v-00027907] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-calendar-card__chip[data-v-00027907] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 10px;
	border-radius: var(--border-radius-pill, 999px);
	background: var(--color-background-hover);
	font-size: 13px;
	max-width: 100%;
}
.cn-calendar-card__chip-icon[data-v-00027907] {
	color: var(--color-primary-element);
	flex-shrink: 0;
}
.cn-calendar-card__chip-title[data-v-00027907] {
	font-weight: 500;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-calendar-card__chip-when[data-v-00027907] {
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
}
.cn-calendar-card__chip-status[data-v-00027907] {
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	padding: 1px 6px;
	border-radius: var(--border-radius-pill, 999px);
	background: var(--color-background-darker);
}
.cn-calendar-card__chip-status--confirmed[data-v-00027907] { background: var(--color-success); color: var(--color-main-background);
}
.cn-calendar-card__chip-status--tentative[data-v-00027907] { background: var(--color-warning, #e9a40f); color: var(--color-main-background);
}
.cn-calendar-card__chip-status--cancelled[data-v-00027907] { background: var(--color-error); color: var(--color-main-background);
}
.cn-calendar-card__cta[data-v-00027907],
.cn-calendar-card__show-all[data-v-00027907] {
	background: none;
	border: none;
	color: var(--color-primary-element);
	font-size: 13px;
	font-weight: 500;
	cursor: pointer;
	padding: 0;
	width: 100%;
	text-align: center;
	text-decoration: none;
	display: inline-block;
}
.cn-calendar-card__cta[data-v-00027907]:hover,
.cn-calendar-card__show-all[data-v-00027907]:hover {
	text-decoration: underline;
}


.cn-calendar-event-create[data-v-5f5a49aa] {
	padding: 20px;
	min-width: 480px;
}
.cn-calendar-event-create__form[data-v-5f5a49aa] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-calendar-event-create__grid[data-v-5f5a49aa] {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 8px;
}
.cn-calendar-event-create__banner[data-v-5f5a49aa] {
	padding: 8px 12px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-calendar-event-create__banner--error[data-v-5f5a49aa] {
	background: var(--color-error, #e9322d);
}

/* Visually-hidden in-form submit button — Enter-to-submit keyboard bridge. */
.cn-calendar-event-create__submit-bridge[data-v-5f5a49aa] {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	border: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}


.cn-calendar-event-picker[data-v-7e2f4262] {
	padding: 20px;
	min-width: 480px;
}
.cn-calendar-event-picker__instructions[data-v-7e2f4262] {
	color: var(--color-text-maxcontrast);
	margin-bottom: 12px;
}
.cn-calendar-event-picker__banner[data-v-7e2f4262] {
	padding: 8px 12px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-calendar-event-picker__banner--error[data-v-7e2f4262] {
	background: var(--color-error, #e9322d);
}
.cn-calendar-event-picker__calendar-list[data-v-7e2f4262],
.cn-calendar-event-picker__event-list[data-v-7e2f4262] {
	list-style: none;
	padding: 0;
	margin: 0;
	max-height: 360px;
	overflow-y: auto;
}
.cn-calendar-event-picker__calendar[data-v-7e2f4262] {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 8px 12px;
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-calendar-event-picker__calendar[data-v-7e2f4262]:hover,
.cn-calendar-event-picker__calendar[data-v-7e2f4262]:focus {
	background: var(--color-background-hover);
}
.cn-calendar-event-picker__color-swatch[data-v-7e2f4262] {
	width: 14px;
	height: 14px;
	border-radius: 50%;
	flex-shrink: 0;
}
.cn-calendar-event-picker__calendar-name[data-v-7e2f4262] {
	font-size: 14px;
}
.cn-calendar-event-picker__breadcrumb[data-v-7e2f4262] {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-bottom: 12px;
}
.cn-calendar-event-picker__breadcrumb-calendar[data-v-7e2f4262] {
	font-weight: 600;
}
.cn-calendar-event-picker__filter[data-v-7e2f4262] {
	margin-bottom: 12px;
}
.cn-calendar-event-picker__event[data-v-7e2f4262] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding: 8px 12px;
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-calendar-event-picker__event[data-v-7e2f4262]:hover,
.cn-calendar-event-picker__event[data-v-7e2f4262]:focus {
	background: var(--color-background-hover);
}
.cn-calendar-event-picker__event--selected[data-v-7e2f4262] {
	background: var(--color-primary-element-light);
}
.cn-calendar-event-picker__event-summary[data-v-7e2f4262] {
	font-weight: 500;
}
.cn-calendar-event-picker__event-meta[data-v-7e2f4262] {
	display: flex;
	gap: 12px;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-calendar-event-picker__empty[data-v-7e2f4262] {
	padding: 24px;
	text-align: center;
	color: var(--color-text-maxcontrast);
}


.cn-calendar-tab[data-v-24a83724] {
	padding: 12px;
	overflow-x: hidden;
}
.cn-calendar-tab__action-row[data-v-24a83724] {
	display: flex;
	gap: 8px;
	margin-bottom: 12px;
}
.cn-calendar-tab__banner[data-v-24a83724] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-calendar-tab__banner--error[data-v-24a83724] {
	background: var(--color-error, #e9322d);
}
.cn-calendar-tab__empty[data-v-24a83724] {
	text-align: center;
	padding: 24px 12px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-calendar-tab__agenda[data-v-24a83724] {
	display: flex;
	flex-direction: column;
	gap: 14px;
}
.cn-calendar-tab__group[data-v-24a83724] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-calendar-tab__group-title[data-v-24a83724] {
	margin: 0 0 4px 0;
	font-size: 12px;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--color-text-maxcontrast);
}
.cn-calendar-tab__group-title--past[data-v-24a83724] {
	opacity: 0.7;
}

/* Event row */
.cn-calendar-tab__event[data-v-24a83724] {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding: 8px;
	border-radius: var(--border-radius-large, 8px);
	border-left: 3px solid var(--color-primary-element);
	background: var(--color-background-hover);
}
.cn-calendar-tab__event + .cn-calendar-tab__event[data-v-24a83724] {
	margin-top: 4px;
}
.cn-calendar-tab__event--past[data-v-24a83724] {
	border-left-color: var(--color-border-dark, var(--color-border));
	background: transparent;
	opacity: 0.72;
}

/* Date block */
.cn-calendar-tab__date[data-v-24a83724] {
	flex-shrink: 0;
	width: 44px;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	padding: 4px 0;
	border-radius: var(--border-radius);
	background: var(--color-primary-element);
	color: var(--color-primary-element-text, #fff);
	line-height: 1.1;
}
.cn-calendar-tab__date--past[data-v-24a83724] {
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}
.cn-calendar-tab__date-month[data-v-24a83724] {
	font-size: 10px;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.05em;
}
.cn-calendar-tab__date-day[data-v-24a83724] {
	font-size: 18px;
	font-weight: 700;
}

/* Main column */
.cn-calendar-tab__main[data-v-24a83724] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 3px;
}
.cn-calendar-tab__title-row[data-v-24a83724] {
	display: flex;
	align-items: center;
	gap: 6px;
	min-width: 0;
}
.cn-calendar-tab__title[data-v-24a83724] {
	font-size: 14px;
	font-weight: 600;
	color: var(--color-main-text);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-calendar-tab__when[data-v-24a83724],
.cn-calendar-tab__location[data-v-24a83724] {
	display: flex;
	align-items: center;
	gap: 5px;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
	min-width: 0;
}
.cn-calendar-tab__meta-icon[data-v-24a83724] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
}
.cn-calendar-tab__location-text[data-v-24a83724] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* Attendees */
.cn-calendar-tab__attendees[data-v-24a83724] {
	display: flex;
	align-items: center;
	margin-top: 2px;
}
.cn-calendar-tab__avatar[data-v-24a83724] {
	width: 24px;
	height: 24px;
	border-radius: 50%;
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 10px;
	font-weight: 600;
	background: var(--color-primary-element-light, var(--color-primary-light));
	color: var(--color-primary-element-light-text, var(--color-primary-element));
	border: 2px solid var(--color-main-background);
	margin-left: -6px;
	flex-shrink: 0;
}
.cn-calendar-tab__avatar[data-v-24a83724]:first-child {
	margin-left: 0;
}
.cn-calendar-tab__avatar--more[data-v-24a83724] {
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}

/* Actions */
.cn-calendar-tab__actions[data-v-24a83724] {
	flex-shrink: 0;
}


.cn-collectives-card__empty[data-v-0b91825d] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-collectives-card__headline[data-v-0b91825d] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-collectives-card__headline-line[data-v-0b91825d] {
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-collectives-card__headline-recent[data-v-0b91825d] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-collectives-card__headline-recent a[data-v-0b91825d] {
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-collectives-card__headline-recent a[data-v-0b91825d]:hover {
	text-decoration: underline;
}
.cn-collectives-card__headline-collective[data-v-0b91825d] {
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-collectives-card__chip[data-v-0b91825d] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-collectives-card__chip a[data-v-0b91825d] {
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-collectives-card__chip a[data-v-0b91825d]:hover {
	text-decoration: underline;
}
.cn-collectives-card__chip-emoji[data-v-0b91825d] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 16px;
	height: 16px;
	line-height: 1;
	font-size: 0.95em;
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-collectives-card__chip-collective[data-v-0b91825d] {
	color: var(--color-text-maxcontrast);
}
.cn-collectives-card__chip--fallback[data-v-0b91825d] {
	opacity: 0.85;
}
.cn-collectives-card__list[data-v-0b91825d] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-collectives-card__row[data-v-0b91825d] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-collectives-card__row[data-v-0b91825d]:last-child {
	border-bottom: none;
}
.cn-collectives-card__row-main[data-v-0b91825d] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
}
.cn-collectives-card__title[data-v-0b91825d] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-collectives-card__title[data-v-0b91825d]:hover {
	text-decoration: underline;
}
.cn-collectives-card__row-collective[data-v-0b91825d] {
	font-size: 0.75em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-collectives-card__view-all[data-v-0b91825d] {
	margin-top: 6px;
	font-size: 0.8em;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-collectives-card__view-all a[data-v-0b91825d] {
	color: var(--color-primary-element);
	text-decoration: none;
}
.cn-collectives-card__view-all a[data-v-0b91825d]:hover {
	text-decoration: underline;
}


.cn-collective-page-create[data-v-fc91c1e2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-collective-page-create__error[data-v-fc91c1e2] {
	margin: 4px 0;
}
.cn-collective-page-create__collective[data-v-fc91c1e2] {
	width: 100%;
}


.cn-collective-page-picker[data-v-2182dacf] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-collective-page-picker__error[data-v-2182dacf] {
	margin: 4px 0;
}
.cn-collective-page-picker__collective[data-v-2182dacf],
.cn-collective-page-picker__search[data-v-2182dacf] {
	width: 100%;
}
.cn-collective-page-picker__list[data-v-2182dacf] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-collective-page-picker__row[data-v-2182dacf] {
	border-radius: var(--border-radius);
}
.cn-collective-page-picker__row-button[data-v-2182dacf] {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	width: 100%;
	padding: 8px 10px;
	background: var(--color-background-hover);
	border: 2px solid transparent;
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-collective-page-picker__row-button[data-v-2182dacf]:hover {
	background: var(--color-background-dark, var(--color-background-hover));
}
.cn-collective-page-picker__row--selected .cn-collective-page-picker__row-button[data-v-2182dacf] {
	border-color: var(--color-primary-element);
}
.cn-collective-page-picker__emoji[data-v-2182dacf] {
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 1.05em;
	line-height: 1;
	color: var(--color-text-maxcontrast);
}
.cn-collective-page-picker__main[data-v-2182dacf] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-collective-page-picker__title[data-v-2182dacf] {
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-collective-page-picker__sub[data-v-2182dacf] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-collective-page-picker__when[data-v-2182dacf] {
	white-space: nowrap;
}


.cn-collectives-tab__actions[data-v-23e94f50] {
	display: flex;
	gap: 8px;
	margin-bottom: 10px;
	flex-wrap: wrap;
}
.cn-collectives-tab__banner[data-v-23e94f50] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-collectives-tab__error[data-v-23e94f50] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-collectives-tab__empty[data-v-23e94f50] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-collectives-tab__empty-icon[data-v-23e94f50] {
	color: var(--color-text-maxcontrast);
}
.cn-collectives-tab__groups[data-v-23e94f50] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-collectives-tab__group-header[data-v-23e94f50] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.8em;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--color-text-maxcontrast);
	margin-bottom: 2px;
	padding: 0 4px;
}
.cn-collectives-tab__list[data-v-23e94f50] {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* Emoji glyph stands in for the NcListItem avatar — circular tile
   tinted with the collective accent, mirroring NC Collectives pages. */
.cn-collectives-tab__emoji[data-v-23e94f50] {
	flex-shrink: 0;
	width: 40px;
	height: 40px;
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 1.25em;
	line-height: 1;
	border-radius: 50%;
	background: var(--color-background-hover);
	color: var(--color-primary-element);
}
.cn-collectives-tab__subname[data-v-23e94f50] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}
.cn-collectives-tab__subname-line[data-v-23e94f50] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-text-maxcontrast);
}
.cn-collectives-tab__snippet[data-v-23e94f50] {
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
}
.cn-collectives-tab__time[data-v-23e94f50] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}


.cn-contactmoment-card__list[data-v-651fc85a] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-contactmoment-card__item[data-v-651fc85a] {
	border-left: 3px solid var(--color-primary-element);
	background: var(--color-background-hover);
	border-radius: 0 var(--border-radius) var(--border-radius) 0;
	padding: 8px 12px;
}
.cn-contactmoment-card__head[data-v-651fc85a] {
	display: flex;
	justify-content: space-between;
	gap: 8px;
}
.cn-contactmoment-card__subject[data-v-651fc85a] {
	font-weight: 500;
}
.cn-contactmoment-card__channel[data-v-651fc85a],
.cn-contactmoment-card__meta[data-v-651fc85a] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
}
.cn-contactmoment-card__meta[data-v-651fc85a] {
	display: flex;
	gap: 12px;
	margin-top: 4px;
}
.cn-contactmoment-card__summary[data-v-651fc85a] {
	margin-top: 2px;
	overflow-wrap: anywhere;
}
.cn-contactmoment-card__state[data-v-651fc85a] {
	align-items: center;
	color: var(--color-text-maxcontrast);
	display: flex;
	gap: 8px;
	padding: 8px 0;
}
.cn-contactmoment-card__state--error[data-v-651fc85a] {
	color: var(--color-error);
}
.cn-contactmoment-card__more[data-v-651fc85a] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	margin-top: 8px;
}


.cn-contacts-card[data-v-52f5ec32] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 12px;
	/* Same card chrome as the other detail-page leaves (CnDetailCard) —
	   ADR-062: every body widget renders on visible card chrome. The chip
	   variant below overrides this back to its pill look. */
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 8px);
	height: 100%;
}
.cn-contacts-card--chip[data-v-52f5ec32] {
	flex-direction: row;
	align-items: center;
	padding: 4px 8px;
	background-color: var(--color-background-hover);
	border: none;
	border-radius: var(--border-radius-pill, 16px);
	max-width: fit-content;
	height: auto;
}
.cn-contacts-card__chip-text[data-v-52f5ec32] {
	display: flex;
	flex-direction: column;
	min-width: 0;
}
.cn-contacts-card__chip-name[data-v-52f5ec32] {
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-contacts-card__chip-role[data-v-52f5ec32] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
	font-style: italic;
}
.cn-contacts-card__header[data-v-52f5ec32] {
	display: flex;
	align-items: center;
	gap: 6px;
	color: var(--color-text-maxcontrast);
}
.cn-contacts-card__header-title[data-v-52f5ec32] {
	font-size: 13px;
	font-weight: 600;
	flex: 1;
}
.cn-contacts-card__header-count[data-v-52f5ec32] {
	font-size: 12px;
	background-color: var(--color-background-dark);
	padding: 2px 8px;
	border-radius: var(--border-radius-pill, 12px);
}
.cn-contacts-card__empty[data-v-52f5ec32],
.cn-contacts-card__error[data-v-52f5ec32] {
	text-align: center;
	padding: 12px 8px;
	color: var(--color-text-maxcontrast);
	font-size: 12px;
}
.cn-contacts-card__error[data-v-52f5ec32] {
	color: var(--color-error);
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
}
.cn-contacts-card__list[data-v-52f5ec32] {
	list-style: none;
	padding: 0;
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-contacts-card__item[data-v-52f5ec32] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 4px;
	border-bottom: 1px solid var(--color-border);
}
.cn-contacts-card__item[data-v-52f5ec32]:last-child {
	border-bottom: none;
}
.cn-contacts-card__item-text[data-v-52f5ec32] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
}
.cn-contacts-card__item-name[data-v-52f5ec32] {
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-contacts-card__item-email[data-v-52f5ec32] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-contacts-card__item-role[data-v-52f5ec32] {
	font-size: 11px;
	color: var(--color-text-lighter);
	font-style: italic;
	white-space: nowrap;
}
.cn-contacts-card__footer[data-v-52f5ec32] {
	margin-top: 4px;
}
.cn-contacts-card__view-all[data-v-52f5ec32] {
	background: none;
	border: none;
	color: var(--color-primary-element);
	font-size: 12px;
	font-weight: 500;
	cursor: pointer;
	padding: 4px 0;
	width: 100%;
	text-align: center;
}
.cn-contacts-card__view-all[data-v-52f5ec32]:hover {
	text-decoration: underline;
}


.cn-contact-create[data-v-0041ff73] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	min-height: 260px;
}
.cn-contact-create__role[data-v-0041ff73] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-contact-create__role label[data-v-0041ff73] {
	font-weight: 500;
}


.cn-contact-picker[data-v-7c213897] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	min-height: 320px;
}
.cn-contact-picker__search[data-v-7c213897] {
	width: 100%;
}
.cn-contact-picker__loading[data-v-7c213897] {
	margin: 24px auto;
}
.cn-contact-picker__kind[data-v-7c213897] {
	margin-inline-start: 6px;
	padding: 1px 6px;
	border-radius: var(--border-radius-pill, 100px);
	background-color: var(--color-primary-element-light, #d8e5f3);
	color: var(--color-primary-element-light-text, #1a3a5c);
	font-size: 0.75rem;
}
.cn-contact-picker__period[data-v-7c213897] {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
}
.cn-contact-picker__period[data-v-7c213897] > * {
	flex: 1 1 140px;
	min-width: 0;
}
.cn-contact-picker__note[data-v-7c213897] {
	width: 100%;
}
.cn-contact-picker__list[data-v-7c213897] {
	list-style: none;
	padding: 0;
	margin: 0;
	max-height: 320px;
	overflow-y: auto;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-contact-picker__row[data-v-7c213897] {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 8px;
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-contact-picker__row[data-v-7c213897]:hover {
	background-color: var(--color-background-hover);
}
.cn-contact-picker__row--selected[data-v-7c213897] {
	background-color: var(--color-primary-element-light);
	color: var(--color-primary-element-text);
}
.cn-contact-picker__avatar[data-v-7c213897] {
	width: 36px;
	height: 36px;
	border-radius: 50%;
	background-color: var(--color-primary-element-light);
	color: var(--color-primary-element-text);
	display: flex;
	align-items: center;
	justify-content: center;
	font-weight: 600;
	font-size: 13px;
	flex-shrink: 0;
	overflow: hidden;
}
.cn-contact-picker__avatar img[data-v-7c213897] {
	width: 100%;
	height: 100%;
	object-fit: cover;
}
.cn-contact-picker__details[data-v-7c213897] {
	flex: 1;
	min-width: 0;
}
.cn-contact-picker__name[data-v-7c213897] {
	font-weight: 500;
}
.cn-contact-picker__email[data-v-7c213897],
.cn-contact-picker__org[data-v-7c213897] {
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-contact-picker__role[data-v-7c213897] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-contact-picker__role label[data-v-7c213897] {
	flex-shrink: 0;
	font-weight: 500;
}


.cn-contacts-tab[data-v-2623b78e] {
	padding: 12px;
	overflow-x: hidden;
}
.cn-contacts-tab__header[data-v-2623b78e] {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
	margin-bottom: 12px;
	flex-wrap: wrap;
}
.cn-contacts-tab__group[data-v-2623b78e] {
	margin-bottom: 16px;
}
.cn-contacts-tab__group-title[data-v-2623b78e] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 13px;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
	margin: 0 0 4px;
	text-transform: uppercase;
	letter-spacing: 0.5px;
}
.cn-contacts-tab__group-count[data-v-2623b78e] {
	font-weight: 600;
	font-size: 11px;
	min-width: 18px;
	padding: 0 6px;
	height: 18px;
	line-height: 18px;
	text-align: center;
	border-radius: 9px;
	background-color: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}
.cn-contacts-tab__list[data-v-2623b78e] {
	list-style: none;
	padding: 0;
	margin: 0;
	display: flex;
	flex-direction: column;
}
.cn-contacts-tab__item[data-v-2623b78e] {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding: 10px 8px;
	border-radius: var(--border-radius-large, 8px);
	cursor: pointer;
	transition: background-color 0.1s ease-in-out;
}
.cn-contacts-tab__item[data-v-2623b78e]:hover,
.cn-contacts-tab__item[data-v-2623b78e]:focus-within {
	background-color: var(--color-background-hover);
}
.cn-contacts-tab__avatar[data-v-2623b78e] {
	flex-shrink: 0;
	display: flex;
	align-items: center;
}
.cn-contacts-tab__details[data-v-2623b78e] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding-top: 2px;
}
.cn-contacts-tab__name-row[data-v-2623b78e] {
	display: flex;
	align-items: center;
	gap: 8px;
	min-width: 0;
}
.cn-contacts-tab__name[data-v-2623b78e] {
	font-size: 14px;
	font-weight: 600;
	color: var(--color-main-text);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-contacts-tab__sub[data-v-2623b78e] {
	display: flex;
	align-items: center;
	gap: 5px;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
	min-width: 0;
}
.cn-contacts-tab__sub-icon[data-v-2623b78e] {
	flex-shrink: 0;
	opacity: 0.7;
}
.cn-contacts-tab__sub-text[data-v-2623b78e] {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-contacts-tab__unlink[data-v-2623b78e] {
	background: none;
	border: none;
	padding: 4px;
	cursor: pointer;
	color: var(--color-text-maxcontrast);
	border-radius: 50%;
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	align-self: center;
}
.cn-contacts-tab__unlink[data-v-2623b78e]:hover,
.cn-contacts-tab__unlink[data-v-2623b78e]:focus {
	background-color: var(--color-background-dark);
	color: var(--color-error);
}


.cn-cospend-card__empty[data-v-b777ec12] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-cospend-card__headline[data-v-b777ec12] {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-cospend-card__headline-line[data-v-b777ec12] {
	font-size: 1.05em;
	color: var(--color-main-text);
}
.cn-cospend-card__totals[data-v-b777ec12] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-cospend-card__totals-row[data-v-b777ec12] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-cospend-card__totals-label[data-v-b777ec12] {
	display: inline-flex;
	align-items: center;
	gap: 3px;
}
.cn-cospend-card__totals-amount[data-v-b777ec12] {
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-cospend-card__headline-recent[data-v-b777ec12] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-cospend-card__headline-recent a[data-v-b777ec12] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-cospend-card__headline-recent a[data-v-b777ec12]:hover {
	text-decoration: underline;
}
.cn-cospend-card__chip[data-v-b777ec12] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-cospend-card__chip a[data-v-b777ec12] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-cospend-card__chip a[data-v-b777ec12]:hover {
	text-decoration: underline;
}
.cn-cospend-card__chip-pill[data-v-b777ec12] {
	display: inline-block;
	padding: 1px 6px;
	font-size: 0.7em;
	font-weight: 600;
	border-radius: 8px;
	background: var(--color-background-dark);
	color: var(--color-main-text);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	white-space: nowrap;
}
.cn-cospend-card__chip-pill--bill[data-v-b777ec12] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-cospend-card__chip-pill--project[data-v-b777ec12] {
	background: var(--color-primary-element, #21468B);
	color: var(--color-main-background);
}
.cn-cospend-card__rows[data-v-b777ec12] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-cospend-card__row[data-v-b777ec12] {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 4px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	font-size: 0.85em;
}
.cn-cospend-card__row--highlight[data-v-b777ec12] {
	border-color: var(--color-primary-element, #21468B);
	background: var(--color-primary-element-light, var(--color-background-darker));
	font-weight: 600;
}
.cn-cospend-card__title[data-v-b777ec12] {
	flex: 1;
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
a.cn-cospend-card__title[data-v-b777ec12]:hover {
	text-decoration: underline;
}
.cn-cospend-card__amount[data-v-b777ec12] {
	font-weight: 600;
	color: var(--color-main-text);
	font-size: 0.85em;
}


.cn-cospend-create[data-v-6d0bf1d2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-cospend-create__error[data-v-6d0bf1d2] {
	margin: 4px 0;
}
.cn-cospend-create__currency[data-v-6d0bf1d2] {
	width: 100%;
}


.cn-cospend-picker[data-v-4559403b] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-cospend-picker__error[data-v-4559403b] {
	margin: 4px 0;
}
.cn-cospend-picker__search[data-v-4559403b] {
	width: 100%;
}
.cn-cospend-picker__list[data-v-4559403b] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-cospend-picker__row[data-v-4559403b] {
	border-radius: var(--border-radius);
}
.cn-cospend-picker__row-button[data-v-4559403b] {
	display: flex;
	align-items: center;
	gap: 10px;
	width: 100%;
	padding: 8px 10px;
	background: var(--color-background-hover);
	border: 2px solid transparent;
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-cospend-picker__row-button[data-v-4559403b]:hover {
	background: var(--color-background-dark, var(--color-background-hover));
}
.cn-cospend-picker__row--selected .cn-cospend-picker__row-button[data-v-4559403b] {
	border-color: var(--color-primary-element);
}
.cn-cospend-picker__icon[data-v-4559403b] {
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	display: flex;
	align-items: center;
	justify-content: center;
	color: var(--color-text-maxcontrast);
}
.cn-cospend-picker__main[data-v-4559403b] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-cospend-picker__title[data-v-4559403b] {
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-cospend-picker__sub[data-v-4559403b] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
}


.cn-cospend-tab__actions[data-v-037c757e] {
	display: flex;
	gap: 8px;
	margin-bottom: 10px;
	flex-wrap: wrap;
}
.cn-cospend-tab__banner[data-v-037c757e] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-cospend-tab__error[data-v-037c757e] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-cospend-tab__empty[data-v-037c757e] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-cospend-tab__empty-icon[data-v-037c757e] {
	color: var(--color-text-maxcontrast);
}
.cn-cospend-tab__list[data-v-037c757e] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}

/* Coloured left rail per row type, echoing Cospend's project/bill split. */
.cn-cospend-tab__row[data-v-037c757e] {
	border-radius: var(--border-radius);
}
.cn-cospend-tab__row--bill[data-v-037c757e] {
	border-left: 3px solid var(--color-warning, #e9a40f);
}
.cn-cospend-tab__row--project[data-v-037c757e] {
	border-left: 3px solid var(--color-primary-element, #21468B);
}
.cn-cospend-tab__row-icon[data-v-037c757e] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	color: var(--color-main-background);
}
.cn-cospend-tab__row-icon--bill[data-v-037c757e] {
	background: var(--color-warning, #e9a40f);
}
.cn-cospend-tab__row-icon--project[data-v-037c757e] {
	background: var(--color-primary-element, #21468B);
}
.cn-cospend-tab__title[data-v-037c757e] {
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-cospend-tab__subline[data-v-037c757e] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-cospend-tab__subline-text[data-v-037c757e] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-cospend-tab__type-chip[data-v-037c757e] {
	flex-shrink: 0;
}
.cn-cospend-tab__amount[data-v-037c757e] {
	font-weight: 700;
	font-size: 0.95em;
	white-space: nowrap;
	color: var(--color-main-text);
}
.cn-cospend-tab__amount--bill[data-v-037c757e] {
	color: var(--color-warning-text, var(--color-main-text));
}
.cn-cospend-tab__totals[data-v-037c757e] {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 8px;
	margin-top: 8px;
	padding: 8px 10px;
	border-top: 1px solid var(--color-border);
}
.cn-cospend-tab__totals-label[data-v-037c757e] {
	font-weight: 600;
	color: var(--color-main-text);
	text-transform: uppercase;
	font-size: 0.78em;
	letter-spacing: 0.04em;
}
.cn-cospend-tab__totals-list[data-v-037c757e] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
	text-align: right;
}
.cn-cospend-tab__totals-row[data-v-037c757e] {
	display: flex;
	align-items: baseline;
	justify-content: flex-end;
	gap: 8px;
	font-size: 0.85em;
}
.cn-cospend-tab__totals-currency[data-v-037c757e] {
	color: var(--color-text-maxcontrast);
}
.cn-cospend-tab__totals-amount[data-v-037c757e] {
	font-weight: 700;
	color: var(--color-main-text);
}


.cn-deck-card__empty[data-v-02981da7] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-deck-card__headline[data-v-02981da7] {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-deck-card__headline-line[data-v-02981da7] {
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-deck-card__distribution[data-v-02981da7] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-deck-card__distribution-row[data-v-02981da7] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-deck-card__distribution-count[data-v-02981da7] {
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-deck-card__headline-recent[data-v-02981da7] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-deck-card__headline-recent a[data-v-02981da7] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-deck-card__headline-recent a[data-v-02981da7]:hover {
	text-decoration: underline;
}
.cn-deck-card__chip[data-v-02981da7] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-deck-card__chip a[data-v-02981da7] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-deck-card__chip a[data-v-02981da7]:hover {
	text-decoration: underline;
}
.cn-deck-card__chip-stack[data-v-02981da7] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
}
.cn-deck-card__kanban[data-v-02981da7] {
	display: flex;
	gap: 8px;
	align-items: flex-start;
}
.cn-deck-card__column[data-v-02981da7] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
	padding: 6px;
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
}
.cn-deck-card__column-header[data-v-02981da7] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 4px;
}
.cn-deck-card__column-title[data-v-02981da7] {
	font-size: 0.85em;
	font-weight: 600;
	color: var(--color-main-text);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-deck-card__column-count[data-v-02981da7] {
	font-size: 0.7em;
	color: var(--color-text-maxcontrast);
}
.cn-deck-card__column-list[data-v-02981da7] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 3px;
}
.cn-deck-card__row[data-v-02981da7] {
	padding: 4px 6px;
	border-radius: 4px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	font-size: 0.8em;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-deck-card__row--highlight[data-v-02981da7] {
	border-color: var(--color-primary-element, #21468B);
	background: var(--color-primary-element-light, var(--color-background-darker));
	font-weight: 600;
}
.cn-deck-card__title[data-v-02981da7] {
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-deck-card__title[data-v-02981da7]:hover {
	text-decoration: underline;
}


.cn-deck-card-create[data-v-52ee66cf] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-deck-card-create__error[data-v-52ee66cf] {
	margin: 4px 0;
}
.cn-deck-card-create__date[data-v-52ee66cf] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-deck-card-create__date-label[data-v-52ee66cf] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-deck-card-create__date-input[data-v-52ee66cf] {
	border-radius: var(--border-radius);
	padding: 6px 8px;
	border: 1px solid var(--color-border);
	background: var(--color-main-background);
	color: var(--color-main-text);
}


.cn-deck-card-picker[data-v-5eb1c5e2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-deck-card-picker__steps[data-v-5eb1c5e2] {
	display: flex;
	gap: 16px;
	list-style: none;
	margin: 0;
	padding: 0 4px 8px;
	border-bottom: 1px solid var(--color-border);
}
.cn-deck-card-picker__step[data-v-5eb1c5e2] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-deck-card-picker__step--active[data-v-5eb1c5e2] {
	color: var(--color-main-text);
	font-weight: 600;
}
.cn-deck-card-picker__step--done[data-v-5eb1c5e2] {
	color: var(--color-success, #46ba61);
}
.cn-deck-card-picker__error[data-v-5eb1c5e2] {
	margin: 4px 0;
}
.cn-deck-card-picker__panel[data-v-5eb1c5e2] {
	min-height: 180px;
}
.cn-deck-card-picker__list[data-v-5eb1c5e2] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-deck-card-picker__row[data-v-5eb1c5e2] {
	border-radius: var(--border-radius);
}
.cn-deck-card-picker__row--selected[data-v-5eb1c5e2] {
	background: var(--color-primary-element-light);
}
.cn-deck-card-picker__row-button[data-v-5eb1c5e2] {
	display: flex;
	width: 100%;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	background: transparent;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-deck-card-picker__row-button[data-v-5eb1c5e2]:hover {
	background: var(--color-background-hover);
}
.cn-deck-card-picker__row--selected .cn-deck-card-picker__row-button[data-v-5eb1c5e2] {
	border-color: var(--color-primary-element);
}
.cn-deck-card-picker__row-label[data-v-5eb1c5e2] {
	flex: 1 1 auto;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}


.cn-deck-tab__actions[data-v-3501a864] {
	display: flex;
	gap: 8px;
	margin-bottom: 8px;
	flex-wrap: wrap;
}
.cn-deck-tab__banner[data-v-3501a864] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-deck-tab__error[data-v-3501a864] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-deck-tab__empty[data-v-3501a864] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-deck-tab__empty-icon[data-v-3501a864] {
	color: var(--color-text-maxcontrast);
}
.cn-deck-tab__kanban[data-v-3501a864] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-deck-tab__column[data-v-3501a864] {
	display: flex;
	flex-direction: column;
	gap: 6px;
	padding: 8px;
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
}
.cn-deck-tab__column-header[data-v-3501a864] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	padding: 0 2px;
}
.cn-deck-tab__column-title[data-v-3501a864] {
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-deck-tab__column-count[data-v-3501a864] {
	font-size: 0.75em;
	color: var(--color-text-maxcontrast);
	background: var(--color-background-dark);
	padding: 1px 6px;
	border-radius: 8px;
}
.cn-deck-tab__column-list[data-v-3501a864] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-deck-tab__card[data-v-3501a864] {
	display: flex;
	flex-direction: column;
	gap: 5px;
	padding: 8px 10px;
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
	transition: box-shadow 0.1s ease-in-out, border-color 0.1s ease-in-out;
}
.cn-deck-tab__card[data-v-3501a864]:hover {
	box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12);
	border-color: var(--color-border-dark);
}
.cn-deck-tab__card--overdue[data-v-3501a864] {
	border-color: var(--color-error);
}
.cn-deck-tab__card-board[data-v-3501a864] {
	display: inline-flex;
	align-items: center;
	gap: 3px;
	align-self: flex-start;
	max-width: 100%;
	padding: 1px 7px;
	font-size: 0.7em;
	font-weight: 500;
	border-radius: 10px;
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-deck-tab__card-title[data-v-3501a864] {
	color: var(--color-main-text);
	text-decoration: none;
	font-weight: 600;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
a.cn-deck-tab__card-title[data-v-3501a864]:hover {
	text-decoration: underline;
}
.cn-deck-tab__card-labels[data-v-3501a864] {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
}

/* Deck label chips: solid card-label colour with a readable text shade. */
.cn-deck-tab__chip[data-v-3501a864] {
	display: inline-block;
	max-width: 100%;
	padding: 1px 8px;
	font-size: 0.7em;
	font-weight: 500;
	line-height: 1.5;
	border-radius: 8px;
	background: var(--color-background-dark);
	color: var(--color-main-text);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-deck-tab__card-footer[data-v-3501a864] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	flex-wrap: wrap;
	margin-top: 2px;
}
.cn-deck-tab__due-icon[data-v-3501a864] {
	display: inline-flex;
	margin-right: 2px;
	vertical-align: text-bottom;
}
.cn-deck-tab__avatars[data-v-3501a864] {
	display: flex;
	align-items: center;
	margin-left: auto;
}
.cn-deck-tab__avatar[data-v-3501a864] {
	border: 2px solid var(--color-main-background);
	border-radius: 50%;
}
.cn-deck-tab__avatar[data-v-3501a864]:not(:first-child) {
	margin-left: -8px;
}
.cn-deck-tab__avatar-overflow[data-v-3501a864] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 24px;
	height: 24px;
	margin-left: -8px;
	border: 2px solid var(--color-main-background);
	border-radius: 50%;
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
	font-size: 0.65em;
	font-weight: 600;
}


.cn-email-card__list[data-v-fda51a6a] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-email-card__row[data-v-fda51a6a] {
	padding: 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-email-card__row[data-v-fda51a6a]:last-child {
	border-bottom: none;
}
.cn-email-card__open[data-v-fda51a6a] {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	width: 100%;
	background: none;
	border: none;
	padding: 6px 0;
	cursor: pointer;
	text-align: left;
	color: inherit;
	font: inherit;
}
.cn-email-card__open:hover .cn-email-card__subject[data-v-fda51a6a] {
	color: var(--color-primary-element);
}
.cn-email-card__avatar[data-v-fda51a6a] {
	flex: 0 0 auto;
}
.cn-email-card__text[data-v-fda51a6a] {
	flex: 1 1 auto;
	min-width: 0;
}
.cn-email-card__row-head[data-v-fda51a6a] {
	display: flex;
	justify-content: space-between;
	gap: 8px;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-email-card__subject[data-v-fda51a6a] {
	color: var(--color-main-text);
	font-weight: normal;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-email-card__row--unread .cn-email-card__subject[data-v-fda51a6a] {
	font-weight: bold;
}
.cn-email-card__snippet[data-v-fda51a6a] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-email-card__when[data-v-fda51a6a] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	white-space: nowrap;
}
.cn-email-card__row-body[data-v-fda51a6a] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-email-card__empty[data-v-fda51a6a] {
	color: var(--color-text-maxcontrast);
	text-align: center;
	padding: 12px 0;
}
.cn-email-card__show-all[data-v-fda51a6a] {
	background: none;
	border: none;
	color: var(--color-primary-element);
	cursor: pointer;
	padding: 4px 0;
	font: inherit;
}
.cn-email-card__show-all[data-v-fda51a6a]:hover {
	text-decoration: underline;
}


.cn-email-picker[data-v-0b90bc0f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-email-picker__steps[data-v-0b90bc0f] {
	display: flex;
	gap: 16px;
	list-style: none;
	margin: 0;
	padding: 0 4px 8px;
	border-bottom: 1px solid var(--color-border);
}
.cn-email-picker__step[data-v-0b90bc0f] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-email-picker__step--active[data-v-0b90bc0f] {
	color: var(--color-main-text);
	font-weight: 600;
}
.cn-email-picker__step--done[data-v-0b90bc0f] {
	color: var(--color-success, #46ba61);
}
.cn-email-picker__error[data-v-0b90bc0f] {
	margin: 4px 0;
}
.cn-email-picker__panel[data-v-0b90bc0f] {
	min-height: 180px;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-email-picker__filter[data-v-0b90bc0f] {
	width: 100%;
}
.cn-email-picker__list[data-v-0b90bc0f] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
	max-height: 360px;
	overflow-y: auto;
}
.cn-email-picker__list--messages[data-v-0b90bc0f] {
	max-height: 320px;
}
.cn-email-picker__row[data-v-0b90bc0f] {
	border-radius: var(--border-radius);
}
.cn-email-picker__row--selected[data-v-0b90bc0f] {
	background: var(--color-primary-element-light);
}
.cn-email-picker__row-button[data-v-0b90bc0f] {
	display: flex;
	width: 100%;
	align-items: center;
	gap: 10px;
	padding: 8px 10px;
	background: transparent;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-email-picker__row-button[data-v-0b90bc0f]:hover {
	background: var(--color-background-hover);
}
.cn-email-picker__row--selected .cn-email-picker__row-button[data-v-0b90bc0f] {
	border-color: var(--color-primary-element);
}
.cn-email-picker__row-button--message[data-v-0b90bc0f] {
	align-items: flex-start;
}
.cn-email-picker__row-label[data-v-0b90bc0f] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	flex: 1 1 auto;
	overflow: hidden;
}
.cn-email-picker__row-primary[data-v-0b90bc0f] {
	font-weight: 500;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-email-picker__row-secondary[data-v-0b90bc0f] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-email-picker__message[data-v-0b90bc0f] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	flex: 1 1 auto;
	overflow: hidden;
}
.cn-email-picker__message-subject[data-v-0b90bc0f] {
	font-weight: 500;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-email-picker__message-meta[data-v-0b90bc0f] {
	display: flex;
	gap: 8px;
	justify-content: space-between;
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}
.cn-email-picker__message-sender[data-v-0b90bc0f] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-email-picker__message-date[data-v-0b90bc0f] {
	flex-shrink: 0;
}
.cn-email-picker__load-more[data-v-0b90bc0f] {
	margin-top: 4px;
}


.cn-sidebar-tab[data-v-0bcebbac] {
	padding: 12px;
	overflow-x: hidden;
}
.cn-sidebar-tab__loading[data-v-0bcebbac] {
	display: flex;
	justify-content: center;
	padding: 24px 0;
}
.cn-sidebar-tab__empty[data-v-0bcebbac] {
	text-align: center;
	padding: 24px 12px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-sidebar-tab__empty--error[data-v-0bcebbac] {
	color: var(--color-error);
}
.cn-sidebar-tab__load-more[data-v-0bcebbac] {
	margin-top: 8px;
}
.cn-email-tab__actions[data-v-0bcebbac] {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
	margin-bottom: 8px;
}

/* NC-Mail-style message list */
.cn-email-tab__list[data-v-0bcebbac] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
}
.cn-email-tab__row[data-v-0bcebbac] {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	padding: 8px 6px;
	border-radius: var(--border-radius-large, 8px);
	cursor: pointer;
	position: relative;
}
.cn-email-tab__row[data-v-0bcebbac]:hover {
	background-color: var(--color-background-hover);
}
.cn-email-tab__unread-dot[data-v-0bcebbac] {
	flex: 0 0 auto;
	width: 8px;
	align-self: center;
	visibility: hidden;
}
.cn-email-tab__unread-dot.is-shown[data-v-0bcebbac] {
	visibility: visible;
}
.cn-email-tab__unread-dot.is-shown[data-v-0bcebbac]::before {
	content: '';
	display: block;
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background-color: var(--cn-email-accent, var(--color-primary-element));
}
.cn-email-tab__avatar[data-v-0bcebbac] {
	flex: 0 0 auto;
}
.cn-email-tab__body[data-v-0bcebbac] {
	flex: 1 1 auto;
	min-width: 0;
}
.cn-email-tab__line[data-v-0bcebbac] {
	display: flex;
	align-items: baseline;
	gap: 8px;
}
.cn-email-tab__subject[data-v-0bcebbac] {
	flex: 1 1 auto;
	min-width: 0;
	color: var(--color-main-text);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-email-tab__row--unread .cn-email-tab__subject[data-v-0bcebbac] {
	font-weight: bold;
}
.cn-email-tab__date[data-v-0bcebbac] {
	flex: 0 0 auto;
	color: var(--color-text-maxcontrast);
	font-size: 0.8em;
	white-space: nowrap;
}
.cn-email-tab__sender[data-v-0bcebbac] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-email-tab__snippet[data-v-0bcebbac] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	margin-top: 1px;
}


.cn-field-inspection[data-v-471e815e] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-field-inspection__sync[data-v-471e815e] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
}
.cn-field-inspection__dot[data-v-471e815e] {
	width: 10px;
	height: 10px;
	border-radius: 50%;
}
.cn-field-inspection__sync--success .cn-field-inspection__dot[data-v-471e815e] { background: var(--color-success);
}
.cn-field-inspection__sync--warning .cn-field-inspection__dot[data-v-471e815e] { background: var(--color-warning);
}
.cn-field-inspection__sync--error .cn-field-inspection__dot[data-v-471e815e] { background: var(--color-error);
}
.cn-field-inspection__actions[data-v-471e815e] {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-wrap: wrap;
}
.cn-field-inspection__meta[data-v-471e815e] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-field-inspection__list[data-v-471e815e] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-field-inspection__row-btn[data-v-471e815e] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	width: 100%;
	padding: 12px 14px;
	min-height: 44px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	background: var(--color-main-background);
	cursor: pointer;
	color: var(--color-main-text);
}
.cn-field-inspection__row-btn[data-v-471e815e]:hover {
	background: var(--color-background-hover);
}
.cn-field-inspection__row-status[data-v-471e815e] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-field-inspection__checklist-head[data-v-471e815e] {
	display: flex;
	align-items: center;
	gap: 12px;
}
.cn-field-inspection__progress[data-v-471e815e] {
	color: var(--color-text-maxcontrast);
}
.cn-field-inspection__question[data-v-471e815e] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 12px;
	margin-bottom: 12px;
}
.cn-field-inspection__input[data-v-471e815e] {
	width: 100%;
	min-height: 44px;
	margin-top: 6px;
}
.cn-field-inspection__required[data-v-471e815e] { color: var(--color-error);
}
.cn-field-inspection__error[data-v-471e815e] {
	color: var(--color-error);
	font-size: 0.85em;
	display: block;
	margin-top: 4px;
}


.cn-field-inspection-tab[data-v-5b51f537] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 8px;
}
.cn-field-inspection-tab__sync[data-v-5b51f537] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
}
.cn-field-inspection-tab__dot[data-v-5b51f537] {
	width: 10px;
	height: 10px;
	border-radius: 50%;
}
.cn-field-inspection-tab__sync--success .cn-field-inspection-tab__dot[data-v-5b51f537] { background: var(--color-success);
}
.cn-field-inspection-tab__sync--warning .cn-field-inspection-tab__dot[data-v-5b51f537] { background: var(--color-warning);
}
.cn-field-inspection-tab__sync--error .cn-field-inspection-tab__dot[data-v-5b51f537] { background: var(--color-error);
}
.cn-field-inspection-tab__actions[data-v-5b51f537] {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
}
.cn-field-inspection-tab__empty[data-v-5b51f537] {
	text-align: center;
	color: var(--color-text-maxcontrast);
	padding: 16px 0;
}
.cn-field-inspection-tab__hint[data-v-5b51f537] {
	font-size: 0.85em;
}
.cn-field-inspection-tab__list[data-v-5b51f537] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-field-inspection-tab__row[data-v-5b51f537] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	padding: 10px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
}
.cn-field-inspection-tab__row-status[data-v-5b51f537] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}


.cn-files-card__list[data-v-46f7e3c9] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-files-card__row[data-v-46f7e3c9] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-files-card__row[data-v-46f7e3c9]:last-child {
	border-bottom: none;
}
.cn-files-card__icon[data-v-46f7e3c9] {
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-files-card__name[data-v-46f7e3c9] {
	flex: 1;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-files-card__name[data-v-46f7e3c9]:hover {
	text-decoration: underline;
}
.cn-files-card__size[data-v-46f7e3c9] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	flex-shrink: 0;
}
.cn-files-card__empty[data-v-46f7e3c9] {
	color: var(--color-text-maxcontrast);
	text-align: center;
	padding: 12px 0;
}
.cn-files-card__show-all[data-v-46f7e3c9] {
	background: none;
	border: none;
	color: var(--color-primary-element);
	cursor: pointer;
	padding: 4px 0;
	font: inherit;
}
.cn-files-card__show-all[data-v-46f7e3c9]:hover {
	text-decoration: underline;
}


.cn-files-browser[data-v-f5bdd9e2] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	min-width: 0;
	border-radius: var(--border-radius-large, 8px);
}
.cn-files-browser--dragging[data-v-f5bdd9e2] {
	outline: 2px dashed var(--color-primary-element);
	outline-offset: 4px;
}
.cn-files-browser__bar[data-v-f5bdd9e2] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	min-width: 0;
}
.cn-files-browser__crumbs[data-v-f5bdd9e2] {
	min-width: 0;
	flex: 1 1 auto;
}
.cn-files-browser__file-input[data-v-f5bdd9e2] {
	display: none;
}
.cn-files-browser__uploads[data-v-f5bdd9e2] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-files-browser__upload[data-v-f5bdd9e2] {
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-files-browser__upload-name[data-v-f5bdd9e2] {
	font-size: 13px;
}
.cn-files-browser__upload-error[data-v-f5bdd9e2] {
	color: var(--color-error);
	font-size: 13px;
}
.cn-files-browser__loading[data-v-f5bdd9e2] {
	padding: 24px 0;
}
.cn-files-browser__table[data-v-f5bdd9e2] {
	width: 100%;
	border-collapse: collapse;
	table-layout: fixed;
}
.cn-files-browser__table th[data-v-f5bdd9e2] {
	text-align: start;
	font-weight: normal;
	color: var(--color-text-maxcontrast);
	padding: 4px 8px;
	border-bottom: 1px solid var(--color-border);
}
.cn-files-browser__sort[data-v-f5bdd9e2] {
	background: none;
	border: none;
	padding: 0;
	font: inherit;
	color: inherit;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	gap: 2px;
}
.cn-files-browser__sort[data-v-f5bdd9e2]:hover,
.cn-files-browser__sort[data-v-f5bdd9e2]:focus-visible {
	color: var(--color-main-text);
}
.cn-files-browser__row[data-v-f5bdd9e2] {
	cursor: pointer;
}
.cn-files-browser__row[data-v-f5bdd9e2]:hover,
.cn-files-browser__row[data-v-f5bdd9e2]:focus-within {
	background-color: var(--color-background-hover);
}
.cn-files-browser__table td[data-v-f5bdd9e2] {
	padding: 4px 8px;
	border-bottom: 1px solid var(--color-border);
	vertical-align: middle;
}
.cn-files-browser__col-icon[data-v-f5bdd9e2] {
	width: 48px;
}
.cn-files-browser__col-size[data-v-f5bdd9e2] {
	width: 96px;
	white-space: nowrap;
	color: var(--color-text-maxcontrast);
}
.cn-files-browser__col-mtime[data-v-f5bdd9e2] {
	width: 140px;
	white-space: nowrap;
	color: var(--color-text-maxcontrast);
}
.cn-files-browser__col-actions[data-v-f5bdd9e2] {
	width: 48px;
}
.cn-files-browser__col-name[data-v-f5bdd9e2] {
	min-width: 0;
}
.cn-files-browser__name[data-v-f5bdd9e2] {
	display: block;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-files-browser__row--linked[data-v-f5bdd9e2] {
	color: var(--color-text-maxcontrast);
}
.cn-files-browser__note[data-v-f5bdd9e2] {
	color: var(--color-text-maxcontrast);
	display: block;
	font-size: var(--font-size-small, 13px);
}
.cn-files-browser__note-link[data-v-f5bdd9e2] {
	color: inherit;
	text-decoration: underline;
}
.cn-files-browser__row--folder .cn-files-browser__name[data-v-f5bdd9e2] {
	font-weight: 600;
}
.cn-files-browser__mime[data-v-f5bdd9e2],
.cn-files-browser__thumb[data-v-f5bdd9e2] {
	width: 32px;
	height: 32px;
	display: block;
}
.cn-files-browser__thumb[data-v-f5bdd9e2] {
	object-fit: cover;
	border-radius: var(--border-radius, 4px);
}
.cn-files-browser__new-folder[data-v-f5bdd9e2] {
	padding: 8px 0;
}
.hidden-visually[data-v-f5bdd9e2] {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}


.cn-sidebar-tab[data-v-6b917036] { padding: 12px;
}
.cn-sidebar-tab__upload-error[data-v-6b917036] {
	padding: 8px 12px;
	margin-bottom: 8px;
	border-radius: var(--border-radius, 4px);
	background-color: var(--color-error-light, rgba(229, 57, 53, 0.1));
	color: var(--color-error, #e53935);
	font-size: 13px;
}
.cn-sidebar-tab__dropzone[data-v-6b917036] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 8px;
	padding: 20px 12px;
	margin-bottom: 16px;
	border: 2px dashed var(--color-border);
	border-radius: var(--border-radius-large, 8px);
	cursor: pointer;
	transition: border-color 0.15s ease, background-color 0.15s ease;
}
.cn-sidebar-tab__dropzone[data-v-6b917036]:hover {
	border-color: var(--color-primary-element);
	background-color: var(--color-primary-element-light, rgba(0, 130, 201, 0.08));
}
.cn-sidebar-tab__dropzone--active[data-v-6b917036] {
	border-color: var(--color-primary-element);
	background-color: var(--color-primary-element-light, rgba(0, 130, 201, 0.12));
}
.cn-sidebar-tab__share[data-v-6b917036] { margin-bottom: 12px;
}
.cn-sidebar-tab__dropzone-icon[data-v-6b917036] { color: var(--color-text-maxcontrast);
}
.cn-sidebar-tab__dropzone--active .cn-sidebar-tab__dropzone-icon[data-v-6b917036],
.cn-sidebar-tab__dropzone:hover .cn-sidebar-tab__dropzone-icon[data-v-6b917036] { color: var(--color-primary-element);
}
.cn-sidebar-tab__dropzone-text[data-v-6b917036] { font-size: 13px; color: var(--color-text-maxcontrast);
}
.cn-sidebar-tab__file-input[data-v-6b917036] { display: none;
}
.cn-sidebar-tab__empty[data-v-6b917036] {
	text-align: center;
	padding: 24px 12px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-sidebar-tab__list[data-v-6b917036] { display: flex; flex-direction: column; gap: 2px;
}
.cn-sidebar-tab__mime[data-v-6b917036],
.cn-sidebar-tab__thumb[data-v-6b917036] {
	width: 32px;
	height: 32px;
	display: block;
}
.cn-sidebar-tab__thumb[data-v-6b917036] {
	object-fit: cover;
	border-radius: var(--border-radius, 4px);
}
.cn-sidebar-tab__meta[data-v-6b917036] { color: var(--color-text-maxcontrast);
}
.cn-sidebar-tab__load-more[data-v-6b917036] { margin-top: 8px;
}


.cn-flow-card__empty[data-v-3dfce3f2] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-flow-card__headline[data-v-3dfce3f2] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-flow-card__headline-line[data-v-3dfce3f2] {
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-flow-card__headline-recent[data-v-3dfce3f2] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-flow-card__headline-recent a[data-v-3dfce3f2] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-flow-card__headline-recent a[data-v-3dfce3f2]:hover {
	text-decoration: underline;
}
.cn-flow-card__headline-entity[data-v-3dfce3f2] {
	color: var(--color-text-maxcontrast);
}
.cn-flow-card__chip[data-v-3dfce3f2] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-flow-card__chip a[data-v-3dfce3f2] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-flow-card__chip a[data-v-3dfce3f2]:hover {
	text-decoration: underline;
}
.cn-flow-card__chip-enabled[data-v-3dfce3f2],
.cn-flow-card__enabled[data-v-3dfce3f2] {
	width: 8px;
	height: 8px;
	border-radius: 50%;
	flex-shrink: 0;
}
.cn-flow-card__enabled--on[data-v-3dfce3f2] {
	background: var(--color-success, #46ba61);
}
.cn-flow-card__enabled--off[data-v-3dfce3f2] {
	background: var(--color-text-maxcontrast);
}
.cn-flow-card__list[data-v-3dfce3f2] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-flow-card__row[data-v-3dfce3f2] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	padding: 8px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-flow-card__row[data-v-3dfce3f2]:last-child {
	border-bottom: none;
}
.cn-flow-card__row--disabled[data-v-3dfce3f2] {
	opacity: 0.7;
}
.cn-flow-card__row-header[data-v-3dfce3f2] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-flow-card__row-icon[data-v-3dfce3f2] {
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-flow-card__title[data-v-3dfce3f2] {
	flex: 1;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-flow-card__title[data-v-3dfce3f2]:hover {
	text-decoration: underline;
}
.cn-flow-card__subtitle[data-v-3dfce3f2] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	padding-left: 24px;
}


.cn-flow-operation-picker[data-v-772dce49] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-flow-operation-picker__error[data-v-772dce49],
.cn-flow-operation-picker__admin-only[data-v-772dce49] {
	margin: 4px 0;
}
.cn-flow-operation-picker__deep-link[data-v-772dce49] {
	display: inline-block;
	margin-top: 6px;
	color: var(--color-primary-element);
	text-decoration: underline;
}
.cn-flow-operation-picker__search[data-v-772dce49] {
	width: 100%;
}
.cn-flow-operation-picker__list[data-v-772dce49] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-flow-operation-picker__row[data-v-772dce49] {
	border-radius: var(--border-radius);
}
.cn-flow-operation-picker__row--selected[data-v-772dce49] {
	background: var(--color-primary-element-light);
}
.cn-flow-operation-picker__row-button[data-v-772dce49] {
	display: flex;
	align-items: center;
	gap: 8px;
	width: 100%;
	padding: 8px 10px;
	background: transparent;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-flow-operation-picker__row-button[data-v-772dce49]:hover {
	background: var(--color-background-hover);
}
.cn-flow-operation-picker__row--selected .cn-flow-operation-picker__row-button[data-v-772dce49] {
	border-color: var(--color-primary-element);
}
.cn-flow-operation-picker__row-main[data-v-772dce49] {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	min-width: 0;
}
.cn-flow-operation-picker__row-title[data-v-772dce49] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-weight: 500;
}
.cn-flow-operation-picker__row-meta[data-v-772dce49] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}
.cn-flow-operation-picker__enabled[data-v-772dce49] {
	display: inline-flex;
	align-items: center;
	padding: 1px 8px;
	border-radius: 10px;
	font-size: 0.75em;
	font-weight: 500;
	flex-shrink: 0;
}
.cn-flow-operation-picker__enabled--on[data-v-772dce49] {
	background: var(--color-success, #46ba61);
	color: var(--color-primary-element-text, #ffffff);
}
.cn-flow-operation-picker__enabled--off[data-v-772dce49] {
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}


.cn-flow-tab__banner[data-v-15f62f6e] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-flow-tab__actions[data-v-15f62f6e] {
	margin-bottom: 8px;
}
.cn-flow-tab__error[data-v-15f62f6e] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-flow-tab__empty[data-v-15f62f6e] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-flow-tab__empty-icon[data-v-15f62f6e] {
	color: var(--color-text-maxcontrast);
}
.cn-flow-tab__list[data-v-15f62f6e] {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* Mirror NC Flow's rule rows: a round robot avatar, the bold rule
   name, a trigger/condition subline, and an enabled/disabled chip. */
.cn-flow-tab__row--disabled[data-v-15f62f6e] {
	opacity: 0.7;
}
.cn-flow-tab__avatar[data-v-15f62f6e] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	border-radius: 50%;
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-flow-tab__avatar.cn-flow-tab__enabled--on[data-v-15f62f6e] {
	background: var(--color-primary-element-light, var(--color-background-dark));
	color: var(--color-primary-element, #0082c9);
}
.cn-flow-tab__avatar.cn-flow-tab__enabled--off[data-v-15f62f6e] {
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}
.cn-flow-tab__summary[data-v-15f62f6e] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-flow-tab__meta[data-v-15f62f6e] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}
.cn-flow-tab__details[data-v-15f62f6e] {
	display: inline-flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 6px;
}
.cn-flow-tab__events[data-v-15f62f6e] {
	display: inline-flex;
	flex-wrap: wrap;
	gap: 4px;
}
.cn-flow-tab__chip[data-v-15f62f6e] {
	display: inline-block;
	padding: 1px 8px;
	border-radius: 10px;
	background: var(--color-background-hover);
	color: var(--color-main-text);
	font-size: 0.75em;
}


.cn-forms-card__empty[data-v-0c622af1] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-forms-card__headline[data-v-0c622af1] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-forms-card__headline-line[data-v-0c622af1] {
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-forms-card__headline-total[data-v-0c622af1] {
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
}
.cn-forms-card__headline-recent[data-v-0c622af1] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-forms-card__headline-recent a[data-v-0c622af1] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-forms-card__headline-recent a[data-v-0c622af1]:hover {
	text-decoration: underline;
}
.cn-forms-card__chip[data-v-0c622af1] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-forms-card__chip a[data-v-0c622af1] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-forms-card__chip a[data-v-0c622af1]:hover {
	text-decoration: underline;
}
.cn-forms-card__chip-status[data-v-0c622af1] {
	padding: 1px 6px;
	border-radius: 8px;
	font-size: 0.75em;
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}
.cn-forms-card__list[data-v-0c622af1] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-forms-card__row[data-v-0c622af1] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	padding: 8px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-forms-card__row[data-v-0c622af1]:last-child {
	border-bottom: none;
}
.cn-forms-card__row--closed[data-v-0c622af1] {
	opacity: 0.85;
}
.cn-forms-card__row-header[data-v-0c622af1] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-forms-card__row-icon[data-v-0c622af1] {
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-forms-card__title[data-v-0c622af1] {
	flex: 1;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-forms-card__title[data-v-0c622af1]:hover {
	text-decoration: underline;
}
.cn-forms-card__status[data-v-0c622af1],
.cn-forms-card__chip-status[data-v-0c622af1] {
	flex-shrink: 0;
	padding: 1px 6px;
	border-radius: 8px;
	font-size: 0.7em;
	font-weight: 500;
}
.cn-forms-card__status--open[data-v-0c622af1] {
	background: var(--color-success, #46ba61);
	color: var(--color-primary-element-text, #ffffff);
}
.cn-forms-card__status--closed[data-v-0c622af1] {
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}
.cn-forms-card__status--draft[data-v-0c622af1] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-forms-card__subtitle[data-v-0c622af1] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	padding-left: 24px;
}


.cn-form-create[data-v-251d04be] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-form-create__field[data-v-251d04be] {
	width: 100%;
}
.cn-form-create__error[data-v-251d04be] {
	color: var(--color-error);
	font-size: 0.9em;
}


.cn-form-picker[data-v-7eca5350] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	min-height: 240px;
}
.cn-form-picker__search[data-v-7eca5350] {
	max-width: 100%;
}
.cn-form-picker__list[data-v-7eca5350] {
	list-style: none;
	margin: 0;
	padding: 0;
	max-height: 360px;
	overflow-y: auto;
}
.cn-form-picker__row[data-v-7eca5350] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	padding: 10px 12px;
	border-radius: var(--border-radius);
	cursor: pointer;
	border: 1px solid transparent;
}
.cn-form-picker__row[data-v-7eca5350]:hover,
.cn-form-picker__row[data-v-7eca5350]:focus-within {
	background: var(--color-background-hover);
}
.cn-form-picker__row--selected[data-v-7eca5350] {
	border-color: var(--color-primary-element);
	background: var(--color-primary-element-light, var(--color-primary-light));
}
.cn-form-picker__row-main[data-v-7eca5350] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-form-picker__row-icon[data-v-7eca5350] {
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-form-picker__row-text[data-v-7eca5350] {
	flex: 1;
	min-width: 0;
}
.cn-form-picker__row-title[data-v-7eca5350] {
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-form-picker__row-description[data-v-7eca5350] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-form-picker__row-status[data-v-7eca5350] {
	flex-shrink: 0;
	padding: 1px 8px;
	border-radius: 10px;
	font-size: 0.75em;
	font-weight: 500;
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}
.cn-form-picker__row-status--open[data-v-7eca5350] {
	background: var(--color-success, #46ba61);
	color: var(--color-primary-element-text, #ffffff);
}
.cn-form-picker__row-status--closed[data-v-7eca5350],
.cn-form-picker__row-status--archived[data-v-7eca5350] {
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}
.cn-form-picker__row-status--draft[data-v-7eca5350] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-form-picker__row-meta[data-v-7eca5350] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	padding-left: 28px;
	display: flex;
	gap: 12px;
}
.cn-form-picker__row-linked[data-v-7eca5350] {
	color: var(--color-primary-element);
	font-style: italic;
}
.cn-form-picker__mode[data-v-7eca5350] {
	display: flex;
	flex-direction: column;
	gap: 6px;
	border-top: 1px solid var(--color-border);
	padding-top: 10px;
}
.cn-form-picker__mode-row[data-v-7eca5350] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
}
.cn-form-picker__mode-hint[data-v-7eca5350] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
}


.cn-forms-tab[data-v-ea0d6578] {
	padding: 12px;
}
.cn-forms-tab__header[data-v-ea0d6578] {
	display: flex;
	gap: 8px;
	justify-content: flex-end;
	margin-bottom: 10px;
	flex-wrap: wrap;
}
.cn-forms-tab__banner[data-v-ea0d6578] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-forms-tab__error[data-v-ea0d6578] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-forms-tab__empty[data-v-ea0d6578] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-forms-tab__empty-icon[data-v-ea0d6578] {
	color: var(--color-text-maxcontrast);
}
.cn-forms-tab__list[data-v-ea0d6578] {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* Forms brand accent on the row icon, mirroring the real Forms app. */
.cn-forms-tab__row-icon[data-v-ea0d6578] {
	color: var(--cn-forms-accent, #0d7000);
	flex-shrink: 0;
}
.cn-forms-tab__row--closed[data-v-ea0d6578] {
	opacity: 0.85;
}
.cn-forms-tab__row--closed .cn-forms-tab__row-icon[data-v-ea0d6578] {
	color: var(--color-text-maxcontrast);
}
.cn-forms-tab__description[data-v-ea0d6578] {
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	color: var(--color-text-maxcontrast);
}
.cn-forms-tab__details[data-v-ea0d6578] {
	display: flex;
	align-items: center;
	gap: 6px;
	flex-wrap: wrap;
	justify-content: flex-end;
}
.cn-forms-tab__expiry[data-v-ea0d6578] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
}

/* Status chip colours layered on top of CnStatusBadge variants so the
   open/closed/draft state reads at a glance, like the real Forms app. */
.cn-forms-tab__status--open[data-v-ea0d6578] {
	--cn-forms-status: var(--color-success, #46ba61);
}
.cn-forms-tab__status--closed[data-v-ea0d6578] {
	--cn-forms-status: var(--color-text-maxcontrast);
}
.cn-forms-tab__status--draft[data-v-ea0d6578] {
	--cn-forms-status: var(--color-warning, #e9a40f);
}


.cn-maps-card__empty[data-v-4c0775e7] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-maps-card__headline[data-v-4c0775e7] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-maps-card__headline-line[data-v-4c0775e7] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-maps-card__headline-icon[data-v-4c0775e7] {
	color: var(--color-primary-element, #21468B);
	flex-shrink: 0;
}
.cn-maps-card__headline-recent[data-v-4c0775e7] {
	display: flex;
	align-items: center;
	gap: 4px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-maps-card__headline-recent a[data-v-4c0775e7] {
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-maps-card__headline-recent a[data-v-4c0775e7]:hover {
	text-decoration: underline;
}
.cn-maps-card__headline-category[data-v-4c0775e7] {
	color: var(--color-text-maxcontrast);
}
.cn-maps-card__headline-coords[data-v-4c0775e7] {
	font-family: var(--font-face-monospace, monospace);
	font-size: 0.75em;
	color: var(--color-text-maxcontrast);
}
.cn-maps-card__chip[data-v-4c0775e7] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-maps-card__chip a[data-v-4c0775e7] {
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-maps-card__chip a[data-v-4c0775e7]:hover {
	text-decoration: underline;
}
.cn-maps-card__chip-category[data-v-4c0775e7] {
	color: var(--color-text-maxcontrast);
}
.cn-maps-card__chip--fallback[data-v-4c0775e7] {
	opacity: 0.85;
}
.cn-maps-card__list[data-v-4c0775e7] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-maps-card__row[data-v-4c0775e7] {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-maps-card__row[data-v-4c0775e7]:last-child {
	border-bottom: none;
}
.cn-maps-card__row-icon[data-v-4c0775e7] {
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
	padding-top: 3px;
}
.cn-maps-card__row-main[data-v-4c0775e7] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-maps-card__row-header[data-v-4c0775e7] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-maps-card__title[data-v-4c0775e7] {
	flex: 1;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-maps-card__title[data-v-4c0775e7]:hover {
	text-decoration: underline;
}
.cn-maps-card__category[data-v-4c0775e7] {
	flex-shrink: 0;
	font-size: 0.65em;
	padding: 1px 6px;
	border-radius: 8px;
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
	text-transform: uppercase;
	letter-spacing: 0.03em;
}
.cn-maps-card__coords[data-v-4c0775e7] {
	font-family: var(--font-face-monospace, monospace);
	font-size: 0.7em;
	color: var(--color-text-maxcontrast);
}
.cn-maps-card__view-all[data-v-4c0775e7] {
	margin-top: 6px;
	font-size: 0.8em;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-maps-card__view-all a[data-v-4c0775e7] {
	color: var(--color-primary-element);
	text-decoration: none;
}
.cn-maps-card__view-all a[data-v-4c0775e7]:hover {
	text-decoration: underline;
}


.cn-map-poi-create[data-v-2e2369ef] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-map-poi-create__error[data-v-2e2369ef] {
	margin: 4px 0;
}
.cn-map-poi-create__coords[data-v-2e2369ef] {
	display: flex;
	gap: 10px;
}
.cn-map-poi-create__coords[data-v-2e2369ef] > * {
	flex: 1;
	min-width: 0;
}


.cn-map-poi-picker[data-v-154e33af] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-map-poi-picker__error[data-v-154e33af] {
	margin: 4px 0;
}
.cn-map-poi-picker__search[data-v-154e33af] {
	width: 100%;
}
.cn-map-poi-picker__list[data-v-154e33af] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-map-poi-picker__row[data-v-154e33af] {
	border-radius: var(--border-radius);
}
.cn-map-poi-picker__row-button[data-v-154e33af] {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	width: 100%;
	padding: 8px 10px;
	background: var(--color-background-hover);
	border: 2px solid transparent;
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-map-poi-picker__row-button[data-v-154e33af]:hover {
	background: var(--color-background-dark, var(--color-background-hover));
}
.cn-map-poi-picker__row--selected .cn-map-poi-picker__row-button[data-v-154e33af] {
	border-color: var(--color-primary-element);
}
.cn-map-poi-picker__row-icon[data-v-154e33af] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
	padding-top: 2px;
}
.cn-map-poi-picker__row-main[data-v-154e33af] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-map-poi-picker__row-header[data-v-154e33af] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-map-poi-picker__name[data-v-154e33af] {
	flex: 1;
	min-width: 0;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-map-poi-picker__category[data-v-154e33af] {
	flex-shrink: 0;
	font-size: 0.7em;
	padding: 2px 8px;
	border-radius: 10px;
	background: var(--color-background-darker, var(--color-background-dark));
	color: var(--color-text-maxcontrast);
	text-transform: uppercase;
	letter-spacing: 0.03em;
}
.cn-map-poi-picker__coords[data-v-154e33af] {
	font-size: 0.75em;
	color: var(--color-text-maxcontrast);
	font-family: var(--font-face-monospace, monospace);
}


.cn-maps-tab__actions[data-v-00a3cb8e] {
	display: flex;
	gap: 8px;
	margin-bottom: 10px;
	flex-wrap: wrap;
}
.cn-maps-tab__banner[data-v-00a3cb8e] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-maps-tab__error[data-v-00a3cb8e] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-maps-tab__empty[data-v-00a3cb8e] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-maps-tab__empty-icon[data-v-00a3cb8e] {
	color: var(--color-text-maxcontrast);
}
.cn-maps-tab__list[data-v-00a3cb8e] {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* Offline-safe static pin tile — a tinted rounded square with a marker
   glyph, mirroring a Maps favourite thumbnail without loading any tiles. */
.cn-maps-tab__pin[data-v-00a3cb8e] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border-radius: var(--border-radius-large, 8px);
	background: var(--cn-iw-accent, var(--color-primary-element, #0082c9));
	color: var(--color-primary-element-text, #fff);
	flex-shrink: 0;
}
.cn-maps-tab__pin-icon[data-v-00a3cb8e] {
	color: var(--color-primary-element-text, #fff);
}
.cn-maps-tab__title[data-v-00a3cb8e] {
	font-weight: 500;
	color: var(--color-main-text);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-maps-tab__category[data-v-00a3cb8e] {
	flex-shrink: 0;
	margin-inline-start: 6px;
	font-size: 0.7em;
	padding: 2px 8px;
	border-radius: 10px;
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
	text-transform: uppercase;
	letter-spacing: 0.03em;
	vertical-align: middle;
}
.cn-maps-tab__subname[data-v-00a3cb8e] {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 4px 10px;
}
.cn-maps-tab__address[data-v-00a3cb8e] {
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-maps-tab__coords[data-v-00a3cb8e] {
	display: inline-flex;
	align-items: center;
	gap: 3px;
	color: var(--color-text-maxcontrast);
}
.cn-maps-tab__coords-icon[data-v-00a3cb8e] {
	color: var(--cn-iw-accent, var(--color-primary-element));
}
.cn-maps-tab__coords-text[data-v-00a3cb8e] {
	font-family: var(--font-face-monospace, monospace);
}
.cn-maps-tab__open-link[data-v-00a3cb8e] {
	color: var(--color-primary-element);
	text-decoration: none;
}
.cn-maps-tab__open-link[data-v-00a3cb8e]:hover {
	text-decoration: underline;
}
.cn-maps-tab__comment[data-v-00a3cb8e] {
	display: -webkit-box;
	margin-top: 2px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
}

/* Compact coordinate chip in the row indicator slot. */
.cn-maps-tab__coord-chip[data-v-00a3cb8e] {
	display: inline-flex;
	align-items: center;
	gap: 3px;
	padding: 1px 6px;
	border-radius: 10px;
	font-size: 0.7em;
	font-family: var(--font-face-monospace, monospace);
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
}


.cn-user-action-menu[data-v-d70b5ba2] {
	display: inline;
}
.cn-user-action-menu__trigger--interactive[data-v-d70b5ba2] {
	cursor: pointer;
	color: var(--color-primary-element);
	font-weight: 600;
}
.cn-user-action-menu__trigger--interactive[data-v-d70b5ba2]:hover {
	text-decoration: underline;
}
.cn-user-action-menu__trigger--interactive[data-v-d70b5ba2]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
	border-radius: var(--border-radius);
}
.cn-user-action-menu__popover[data-v-d70b5ba2] {
	min-width: 220px;
	padding: 8px 0;
}
.cn-user-action-menu__header[data-v-d70b5ba2] {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 8px 12px 12px;
	border-bottom: 1px solid var(--color-border);
	margin-bottom: 4px;
}
.cn-user-action-menu__user-info[data-v-d70b5ba2] {
	display: flex;
	flex-direction: column;
	min-width: 0;
}
.cn-user-action-menu__display-name[data-v-d70b5ba2] {
	font-weight: 600;
	font-size: 14px;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-user-action-menu__email[data-v-d70b5ba2] {
	font-size: 12px;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-user-action-menu__actions[data-v-d70b5ba2] {
	padding: 4px 0;
}
.cn-user-action-menu__no-actions[data-v-d70b5ba2] {
	padding: 12px 16px;
	text-align: center;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}


.cn-notes-card__add-form[data-v-290fcd46] {
	margin-bottom: 12px;
}
.cn-notes-card__textarea[data-v-290fcd46] {
	width: 100%;
	padding: 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	resize: vertical;
	font-family: inherit;
	font-size: 13px;
	margin-bottom: 8px;
	background: var(--color-main-background);
	color: var(--color-main-text);
	box-sizing: border-box;
}
.cn-notes-card__textarea[data-v-290fcd46]:focus {
	border-color: var(--color-primary-element);
	outline: none;
}
.cn-notes-card__empty[data-v-290fcd46] {
	text-align: center;
	padding: 16px 12px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-notes-card__list[data-v-290fcd46] {
	display: flex;
	flex-direction: column;
}
.cn-notes-card__note[data-v-290fcd46] {
	padding: 10px 0;
	border-bottom: 1px solid var(--color-border);
	position: relative;
}
.cn-notes-card__note[data-v-290fcd46]:last-child {
	border-bottom: none;
}
.cn-notes-card__note-header[data-v-290fcd46] {
	display: flex;
	justify-content: space-between;
	align-items: baseline;
	margin-bottom: 4px;
}
.cn-notes-card__author[data-v-290fcd46] {
	font-size: 13px;
}
.cn-notes-card__author--self[data-v-290fcd46] {
	color: var(--color-main-text);
}
.cn-notes-card__time[data-v-290fcd46] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
	margin-left: 8px;
}
.cn-notes-card__body[data-v-290fcd46] {
	font-size: 13px;
	margin: 0;
	white-space: pre-wrap;
	overflow-wrap: anywhere;
	padding-right: 32px;
}
.cn-notes-card__delete-btn[data-v-290fcd46] {
	position: absolute;
	top: 8px;
	right: -4px;
	opacity: 0;
	transition: opacity 0.15s ease;
}
.cn-notes-card__note:hover .cn-notes-card__delete-btn[data-v-290fcd46] {
	opacity: 1;
}
.cn-notes-card__show-all[data-v-290fcd46] {
	background: none;
	border: none;
	color: var(--color-primary-element);
	font-size: 13px;
	font-weight: 500;
	cursor: pointer;
	padding: 0;
	width: 100%;
	text-align: center;
}
.cn-notes-card__show-all[data-v-290fcd46]:hover {
	text-decoration: underline;
}


.cn-sidebar-tab[data-v-6e7356a8] { padding: 12px;
}
.cn-sidebar-tab__action[data-v-6e7356a8] { margin-bottom: 16px;
}
.cn-sidebar-tab__action--row[data-v-6e7356a8] { display: flex; gap: 8px; align-items: flex-end; margin-top: 8px;
}
.cn-sidebar-tab__composer[data-v-6e7356a8] {
	width: 100%;
}
.cn-sidebar-tab__empty[data-v-6e7356a8] {
	text-align: center;
	padding: 24px 12px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-sidebar-tab__list[data-v-6e7356a8] { display: flex; flex-direction: column; gap: 2px; margin: 0; padding: 0; list-style: none;
}
.cn-notes-tab__mention[data-v-6e7356a8] {
	display: inline-block;
	padding: 0 6px;
	border-radius: var(--border-radius-pill, 100px);
	background-color: var(--color-primary-element-light);
	color: var(--color-main-text);
	font-weight: bold;
}
.cn-notes-tab__mention--unknown[data-v-6e7356a8] {
	opacity: 0.6;
	font-weight: normal;
}


.cn-openproject-card__empty[data-v-70e3c271] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-openproject-card__headline[data-v-70e3c271] {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-openproject-card__headline-line[data-v-70e3c271] {
	display: flex;
	align-items: center;
	gap: 8px;
	font-size: 1.05em;
	color: var(--color-main-text);
}
.cn-openproject-card__distribution[data-v-70e3c271] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-openproject-card__distribution-row[data-v-70e3c271] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-openproject-card__distribution-label[data-v-70e3c271] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
}
.cn-openproject-card__distribution-dot[data-v-70e3c271] {
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background: var(--color-background-dark);
}
.cn-openproject-card__distribution-dot.cn-openproject-card__chip-pill--new[data-v-70e3c271] {
	background: var(--color-background-darker, var(--color-background-dark));
}
.cn-openproject-card__distribution-dot.cn-openproject-card__chip-pill--progress[data-v-70e3c271] {
	background: var(--color-warning, #e9a40f);
}
.cn-openproject-card__distribution-dot.cn-openproject-card__chip-pill--done[data-v-70e3c271] {
	background: var(--color-success, #46ba61);
}
.cn-openproject-card__distribution-dot.cn-openproject-card__chip-pill--blocked[data-v-70e3c271] {
	background: var(--color-error, #e9322d);
}
.cn-openproject-card__distribution-count[data-v-70e3c271] {
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-openproject-card__headline-recent[data-v-70e3c271] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-openproject-card__headline-recent a[data-v-70e3c271] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-openproject-card__headline-recent a[data-v-70e3c271]:hover {
	text-decoration: underline;
}
.cn-openproject-card__auth-badge[data-v-70e3c271] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	padding: 2px 8px;
	border-radius: 10px;
	font-size: 0.75em;
	font-weight: 500;
}
.cn-openproject-card__auth-badge--ok[data-v-70e3c271] {
	background: var(--color-success, #46ba61);
	color: var(--color-main-background);
}
.cn-openproject-card__auth-badge--warn[data-v-70e3c271] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-openproject-card__auth-badge--error[data-v-70e3c271] {
	background: var(--color-error, #e9322d);
	color: var(--color-main-background);
}
.cn-openproject-card__chip[data-v-70e3c271] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-openproject-card__chip a[data-v-70e3c271] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-openproject-card__chip a[data-v-70e3c271]:hover {
	text-decoration: underline;
}
.cn-openproject-card__chip-pill[data-v-70e3c271] {
	display: inline-block;
	padding: 1px 8px;
	border-radius: 10px;
	background: var(--color-background-dark);
	color: var(--color-main-text);
	font-size: 0.78em;
	font-weight: 500;
}
.cn-openproject-card__chip-pill--new[data-v-70e3c271] {
	background: var(--color-background-darker, var(--color-background-dark));
}
.cn-openproject-card__chip-pill--progress[data-v-70e3c271] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-openproject-card__chip-pill--done[data-v-70e3c271] {
	background: var(--color-success, #46ba61);
	color: var(--color-main-background);
}
.cn-openproject-card__chip-pill--blocked[data-v-70e3c271] {
	background: var(--color-error, #e9322d);
	color: var(--color-main-background);
}
.cn-openproject-card__rows[data-v-70e3c271] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-openproject-card__row[data-v-70e3c271] {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 4px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	font-size: 0.85em;
}
.cn-openproject-card__row--highlight[data-v-70e3c271] {
	border-color: var(--color-primary-element, #21468B);
	background: var(--color-primary-element-light, var(--color-background-darker));
	font-weight: 600;
}
.cn-openproject-card__title[data-v-70e3c271] {
	flex: 1;
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
a.cn-openproject-card__title[data-v-70e3c271]:hover {
	text-decoration: underline;
}
.cn-openproject-card__assignee[data-v-70e3c271] {
	display: inline-flex;
	align-items: center;
	gap: 3px;
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
}


.cn-openproject-create[data-v-aeeaedde] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-openproject-create__error[data-v-aeeaedde] {
	margin: 4px 0;
}
.cn-openproject-create__project[data-v-aeeaedde] {
	width: 100%;
}


.cn-openproject-picker[data-v-e523ad96] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-openproject-picker__error[data-v-e523ad96] {
	margin: 4px 0;
}
.cn-openproject-picker__project[data-v-e523ad96],
.cn-openproject-picker__search[data-v-e523ad96] {
	width: 100%;
}
.cn-openproject-picker__list[data-v-e523ad96] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-openproject-picker__row[data-v-e523ad96] {
	border-radius: var(--border-radius);
}
.cn-openproject-picker__row-button[data-v-e523ad96] {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	width: 100%;
	padding: 8px 10px;
	background: var(--color-background-hover);
	border: 2px solid transparent;
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-openproject-picker__row-button[data-v-e523ad96]:hover {
	background: var(--color-background-dark, var(--color-background-hover));
}
.cn-openproject-picker__row--selected .cn-openproject-picker__row-button[data-v-e523ad96] {
	border-color: var(--color-primary-element);
}
.cn-openproject-picker__icon[data-v-e523ad96] {
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	display: flex;
	align-items: center;
	justify-content: center;
	color: var(--color-text-maxcontrast);
}
.cn-openproject-picker__main[data-v-e523ad96] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-openproject-picker__title[data-v-e523ad96] {
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-openproject-picker__sub[data-v-e523ad96] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}


.cn-openproject-tab__actions[data-v-4c26c5c4] {
	display: flex;
	gap: 8px;
	margin-bottom: 10px;
}
.cn-openproject-tab__unlink[data-v-4c26c5c4] {
	flex-shrink: 0;
}
.cn-openproject-tab__banner[data-v-4c26c5c4] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-openproject-tab__banner--warn[data-v-4c26c5c4] {
	background: var(--color-warning, #e9a40f);
}
.cn-openproject-tab__banner--auth[data-v-4c26c5c4] {
	background: var(--color-error, #e9322d);
}
.cn-openproject-tab__banner-cta[data-v-4c26c5c4] {
	margin-left: auto;
	color: var(--color-main-background);
	text-decoration: underline;
}
.cn-openproject-tab__error[data-v-4c26c5c4] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-openproject-tab__empty[data-v-4c26c5c4] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-openproject-tab__empty-icon[data-v-4c26c5c4] {
	color: var(--color-text-maxcontrast);
}
.cn-openproject-tab__list[data-v-4c26c5c4] {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* High-priority work packages get a coloured left rail so case handlers
   spot them while scanning the list. */
.cn-openproject-tab__row--high-priority[data-v-4c26c5c4] {
	border-left: 3px solid var(--color-error);
}

/* Type indicator: a rounded square chip echoing OpenProject's
   colour-coded work-package types. */
.cn-openproject-tab__type-icon[data-v-4c26c5c4] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 30px;
	height: 30px;
	border-radius: var(--border-radius);
	background: var(--color-primary-element, #1A67A3);
	color: var(--color-primary-element-text, #fff);
}
.cn-openproject-tab__type-icon.cn-openproject-tab__type-badge--bug[data-v-4c26c5c4] {
	background: var(--color-error);
}
.cn-openproject-tab__type-icon.cn-openproject-tab__type-badge--feature[data-v-4c26c5c4] {
	background: var(--color-success, #46ba61);
}
.cn-openproject-tab__type-icon.cn-openproject-tab__type-badge--task[data-v-4c26c5c4] {
	background: #1A67A3;
}
.cn-openproject-tab__subline[data-v-4c26c5c4] {
	display: inline-flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 6px;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}

/* OpenProject-style `#id` reference, monospaced for a ticket feel. */
.cn-openproject-tab__ref[data-v-4c26c5c4] {
	font-family: var(--font-face-monospace, monospace);
	font-weight: 600;
	color: var(--color-text-maxcontrast);
}
.cn-openproject-tab__project[data-v-4c26c5c4] {
	display: inline-flex;
	align-items: center;
	gap: 3px;
}
.cn-openproject-tab__type-label[data-v-4c26c5c4] {
	font-size: 0.78em;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
}
.cn-openproject-tab__indicators[data-v-4c26c5c4] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
}
.cn-openproject-tab__priority[data-v-4c26c5c4] {
	display: inline-flex;
	align-items: center;
	color: var(--color-text-maxcontrast);
}
.cn-openproject-tab__priority--high[data-v-4c26c5c4] {
	color: var(--color-error);
}
.cn-openproject-tab__priority--medium[data-v-4c26c5c4] {
	color: var(--color-warning, #e9a40f);
}
.cn-openproject-tab__assignee[data-v-4c26c5c4] {
	flex-shrink: 0;
}

/* CnStatusBadge keeps its own colours; the legacy status-pill modifier
   hooks are retained so existing tests and consumers keep matching. */
.cn-openproject-tab__status-pill[data-v-4c26c5c4] {
	flex-shrink: 0;
}


.cn-photos-card__empty[data-v-3ab3b432] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-photos-card__headline[data-v-3ab3b432] {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-photos-card__headline-line[data-v-3ab3b432] {
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-photos-card__photo-total[data-v-3ab3b432] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	font-weight: 400;
}
.cn-photos-card__headline-album[data-v-3ab3b432] {
	display: flex;
	align-items: center;
	gap: 8px;
	overflow: hidden;
}
.cn-photos-card__headline-cover[data-v-3ab3b432] {
	width: 32px;
	height: 32px;
	border-radius: var(--border-radius);
	overflow: hidden;
	flex-shrink: 0;
	background: var(--color-background-darker, var(--color-background-dark));
	display: flex;
	align-items: center;
	justify-content: center;
}
.cn-photos-card__headline-cover-img[data-v-3ab3b432] {
	width: 100%;
	height: 100%;
	object-fit: cover;
}
.cn-photos-card__headline-name[data-v-3ab3b432] {
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-size: 0.95em;
}
.cn-photos-card__headline-name[data-v-3ab3b432]:hover {
	text-decoration: underline;
}
.cn-photos-card__chip[data-v-3ab3b432] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 10px 4px 4px;
	border-radius: 14px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
}
.cn-photos-card__chip-cover[data-v-3ab3b432] {
	width: 20px;
	height: 20px;
	border-radius: 50%;
	object-fit: cover;
	flex-shrink: 0;
}
.cn-photos-card__chip a[data-v-3ab3b432] {
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-photos-card__chip a[data-v-3ab3b432]:hover {
	text-decoration: underline;
}
.cn-photos-card__grid[data-v-3ab3b432] {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: 8px;
}
.cn-photos-card__tile[data-v-3ab3b432] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	text-decoration: none;
	color: inherit;
	border-radius: var(--border-radius);
	overflow: hidden;
	background: var(--color-background-hover);
}
.cn-photos-card__tile[data-v-3ab3b432]:hover,
.cn-photos-card__tile[data-v-3ab3b432]:focus-within {
	background: var(--color-background-dark, var(--color-background-hover));
}
.cn-photos-card__tile-cover[data-v-3ab3b432] {
	width: 100%;
	aspect-ratio: 1 / 1;
	background: var(--color-background-darker, var(--color-background-dark));
	display: flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
}
.cn-photos-card__tile-cover-img[data-v-3ab3b432] {
	width: 100%;
	height: 100%;
	object-fit: cover;
}
.cn-photos-card__tile-fallback[data-v-3ab3b432] {
	color: var(--color-text-maxcontrast);
}
.cn-photos-card__tile-name[data-v-3ab3b432] {
	padding: 4px 6px 6px;
	font-size: 12px;
	color: var(--color-main-text);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-photos-card__view-all[data-v-3ab3b432] {
	margin-top: 6px;
	font-size: 0.8em;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-photos-card__view-all a[data-v-3ab3b432] {
	color: var(--color-primary-element);
	text-decoration: none;
}
.cn-photos-card__view-all a[data-v-3ab3b432]:hover {
	text-decoration: underline;
}


.cn-photo-album-create[data-v-15252c8f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-photo-album-create__error[data-v-15252c8f] {
	margin: 4px 0;
}


.cn-photo-album-picker[data-v-84baa162] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-photo-album-picker__error[data-v-84baa162] {
	margin: 4px 0;
}
.cn-photo-album-picker__search[data-v-84baa162] {
	width: 100%;
}
.cn-photo-album-picker__grid[data-v-84baa162] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
	gap: 10px;
}
.cn-photo-album-picker__tile[data-v-84baa162] {
	border-radius: var(--border-radius);
}
.cn-photo-album-picker__tile-button[data-v-84baa162] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	width: 100%;
	padding: 0 0 6px;
	background: var(--color-background-hover);
	border: 2px solid transparent;
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
	overflow: hidden;
}
.cn-photo-album-picker__tile-button[data-v-84baa162]:hover {
	background: var(--color-background-dark, var(--color-background-hover));
}
.cn-photo-album-picker__tile--selected .cn-photo-album-picker__tile-button[data-v-84baa162] {
	border-color: var(--color-primary-element);
}
.cn-photo-album-picker__cover[data-v-84baa162] {
	position: relative;
	aspect-ratio: 1 / 1;
	width: 100%;
	background: var(--color-background-darker, var(--color-background-dark));
	display: flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
}
.cn-photo-album-picker__cover-img[data-v-84baa162] {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}
.cn-photo-album-picker__cover-fallback[data-v-84baa162] {
	color: var(--color-text-maxcontrast);
}
.cn-photo-album-picker__name[data-v-84baa162] {
	font-size: 13px;
	font-weight: 500;
	padding: 0 8px;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-photo-album-picker__count[data-v-84baa162] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
	padding: 0 8px;
}


.cn-photos-tab[data-v-7921c8e4] {
	padding: 12px;
	overflow-x: hidden;
}
.cn-photos-tab__actions[data-v-7921c8e4] {
	display: flex;
	gap: 8px;
	margin-bottom: 10px;
	flex-wrap: wrap;
}
.cn-photos-tab__banner[data-v-7921c8e4] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-photos-tab__error[data-v-7921c8e4] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-photos-tab__empty[data-v-7921c8e4] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-photos-tab__empty-icon[data-v-7921c8e4] {
	color: var(--color-text-maxcontrast);
}

/*
 * Dense edge-to-edge mosaic that mirrors the NC Photos timeline: square
 * thumbnails packed tight with a thin main-background gutter (the same
 * 2px border NC Photos draws between tiles), name + date revealed in a
 * bottom scrim on hover/focus so the imagery dominates at rest.
 */
.cn-photos-tab__grid[data-v-7921c8e4] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(104px, 1fr));
	gap: 2px;
	border-radius: var(--border-radius-large, var(--border-radius));
	overflow: hidden;
}
.cn-photos-tab__tile[data-v-7921c8e4] {
	position: relative;
}
.cn-photos-tab__unlink[data-v-7921c8e4] {
	position: absolute;
	top: 4px;
	right: 4px;
	z-index: 3;
	opacity: 0;
	background: var(--color-main-background);
	border-radius: 50%;
	transition: opacity 0.15s ease;
}
.cn-photos-tab__tile:hover .cn-photos-tab__unlink[data-v-7921c8e4],
.cn-photos-tab__tile:focus-within .cn-photos-tab__unlink[data-v-7921c8e4] {
	opacity: 1;
}
.cn-photos-tab__tile-link[data-v-7921c8e4] {
	display: block;
	text-decoration: none;
	color: inherit;
}
.cn-photos-tab__cover[data-v-7921c8e4] {
	position: relative;
	aspect-ratio: 1 / 1;
	width: 100%;
	/* Match the NC Photos selection outline on focus. */
	border: 2px solid var(--color-main-background);
	box-sizing: border-box;
	background: var(--color-primary-element-light, var(--color-background-darker));
	display: flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
}
.cn-photos-tab__tile-link:focus-visible .cn-photos-tab__cover[data-v-7921c8e4] {
	outline: var(--color-primary-element) solid 2px;
	outline-offset: -2px;
}
.cn-photos-tab__cover-img[data-v-7921c8e4] {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 0.2s ease;
}
.cn-photos-tab__tile:hover .cn-photos-tab__cover-img[data-v-7921c8e4],
.cn-photos-tab__tile:focus-within .cn-photos-tab__cover-img[data-v-7921c8e4] {
	transform: scale(1.04);
}
.cn-photos-tab__cover-placeholder[data-v-7921c8e4] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 100%;
}
.cn-photos-tab__cover-fallback[data-v-7921c8e4] {
	color: var(--color-primary-element);
}

/* Photo-count badge (mirrors the album stack count overlay). */
.cn-photos-tab__badge[data-v-7921c8e4] {
	position: absolute;
	top: 4px;
	left: 4px;
	z-index: 2;
	display: inline-flex;
	align-items: center;
	gap: 3px;
	padding: 1px 6px 1px 4px;
	border-radius: var(--border-radius-pill, 12px);
	background: rgba(0, 0, 0, 0.55);
	color: #fff;
	font-size: 11px;
	font-weight: 500;
	line-height: 1.6;
}
.cn-photos-tab__badge-count[data-v-7921c8e4] {
	white-space: nowrap;
}

/* Bottom scrim: hidden at rest, revealed on hover/focus. */
.cn-photos-tab__meta[data-v-7921c8e4] {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	display: flex;
	flex-direction: column;
	gap: 1px;
	padding: 16px 8px 6px;
	background: linear-gradient(to top, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0));
	opacity: 0;
	transition: opacity 0.15s ease;
	pointer-events: none;
}
.cn-photos-tab__tile:hover .cn-photos-tab__meta[data-v-7921c8e4],
.cn-photos-tab__tile:focus-within .cn-photos-tab__meta[data-v-7921c8e4] {
	opacity: 1;
}
.cn-photos-tab__name[data-v-7921c8e4] {
	font-size: 12px;
	font-weight: 600;
	color: #fff;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-photos-tab__when[data-v-7921c8e4] {
	font-size: 10px;
	color: rgba(255, 255, 255, 0.85);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}


.cn-polls-card__empty[data-v-5977968a] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-polls-card__headline[data-v-5977968a] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-polls-card__headline-line[data-v-5977968a] {
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-polls-card__headline-recent[data-v-5977968a] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-polls-card__headline-recent a[data-v-5977968a] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-polls-card__headline-recent a[data-v-5977968a]:hover {
	text-decoration: underline;
}
.cn-polls-card__headline-leader[data-v-5977968a] {
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-polls-card__chip[data-v-5977968a] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-polls-card__chip a[data-v-5977968a] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-polls-card__chip a[data-v-5977968a]:hover {
	text-decoration: underline;
}
.cn-polls-card__chip-leader[data-v-5977968a] {
	color: var(--color-text-maxcontrast);
}
.cn-polls-card__list[data-v-5977968a] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-polls-card__row[data-v-5977968a] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	padding: 8px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-polls-card__row[data-v-5977968a]:last-child {
	border-bottom: none;
}
.cn-polls-card__row--closed[data-v-5977968a] {
	opacity: 0.85;
}
.cn-polls-card__row-header[data-v-5977968a] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-polls-card__row-icon[data-v-5977968a] {
	display: inline-flex;
	color: var(--color-primary-element);
	flex-shrink: 0;
}
.cn-polls-card__row--closed .cn-polls-card__row-icon[data-v-5977968a] {
	color: var(--color-text-maxcontrast);
}
.cn-polls-card__status[data-v-5977968a] {
	flex-shrink: 0;
}
.cn-polls-card__title[data-v-5977968a] {
	flex: 1;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-polls-card__title[data-v-5977968a]:hover {
	text-decoration: underline;
}
.cn-polls-card__subtitle[data-v-5977968a] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	padding-left: 24px;
}
.cn-polls-card__options[data-v-5977968a] {
	list-style: none;
	margin: 2px 0 0;
	padding: 0 0 0 24px;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-polls-card__option[data-v-5977968a] {
	display: flex;
	flex-direction: column;
	gap: 1px;
}
.cn-polls-card__option-label[data-v-5977968a] {
	display: flex;
	justify-content: space-between;
	gap: 6px;
	font-size: 0.8em;
}
.cn-polls-card__option-text[data-v-5977968a] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
}
.cn-polls-card__option-count[data-v-5977968a] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
}
.cn-polls-card__option-bar[data-v-5977968a] {
	height: 4px;
	border-radius: 2px;
	background: var(--color-background-dark);
	overflow: hidden;
}
.cn-polls-card__option-bar-fill[data-v-5977968a] {
	height: 100%;
	background: var(--color-primary-element, #21468B);
	transition: width 0.2s ease;
}


.cn-poll-create[data-v-b810b7e2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-poll-create__error[data-v-b810b7e2] {
	margin: 4px 0;
}
.cn-poll-create__type[data-v-b810b7e2] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 8px 12px;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-poll-create__type legend[data-v-b810b7e2] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	padding: 0 4px;
}
.cn-poll-create__type-option[data-v-b810b7e2] {
	display: flex;
	align-items: center;
	gap: 8px;
	cursor: pointer;
}
.cn-poll-create__options[data-v-b810b7e2] {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-poll-create__options-header[data-v-b810b7e2] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
}
.cn-poll-create__options-label[data-v-b810b7e2] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-poll-create__options-list[data-v-b810b7e2] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-poll-create__option[data-v-b810b7e2] {
	display: flex;
	align-items: flex-end;
	gap: 4px;
}
.cn-poll-create__option-input[data-v-b810b7e2] {
	flex: 1 1 auto;
}
.cn-poll-create__deadline[data-v-b810b7e2] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-poll-create__deadline-label[data-v-b810b7e2] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-poll-create__deadline-input[data-v-b810b7e2] {
	border-radius: var(--border-radius);
	padding: 6px 8px;
	border: 1px solid var(--color-border);
	background: var(--color-main-background);
	color: var(--color-main-text);
}


.cn-poll-picker[data-v-2df93d62] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-poll-picker__error[data-v-2df93d62] {
	margin: 4px 0;
}
.cn-poll-picker__search[data-v-2df93d62] {
	width: 100%;
}
.cn-poll-picker__list[data-v-2df93d62] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-poll-picker__row[data-v-2df93d62] {
	border-radius: var(--border-radius);
}
.cn-poll-picker__row--selected[data-v-2df93d62] {
	background: var(--color-primary-element-light);
}
.cn-poll-picker__row-button[data-v-2df93d62] {
	display: flex;
	align-items: center;
	gap: 8px;
	width: 100%;
	padding: 8px 10px;
	background: transparent;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-poll-picker__row-button[data-v-2df93d62]:hover {
	background: var(--color-background-hover);
}
.cn-poll-picker__row--selected .cn-poll-picker__row-button[data-v-2df93d62] {
	border-color: var(--color-primary-element);
}
.cn-poll-picker__row-main[data-v-2df93d62] {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	min-width: 0;
}
.cn-poll-picker__row-title[data-v-2df93d62] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-weight: 500;
}
.cn-poll-picker__row-meta[data-v-2df93d62] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}


.cn-polls-tab__actions[data-v-abac3b8c] {
	display: flex;
	gap: 8px;
	margin-bottom: 8px;
	flex-wrap: wrap;
}
.cn-polls-tab__banner[data-v-abac3b8c] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-polls-tab__error[data-v-abac3b8c] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-polls-tab__empty[data-v-abac3b8c] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-polls-tab__empty-icon[data-v-abac3b8c] {
	color: var(--color-text-maxcontrast);
}
.cn-polls-tab__list[data-v-abac3b8c] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-polls-tab__row[data-v-abac3b8c] {
	display: flex;
	flex-direction: column;
	gap: 6px;
	padding: 10px;
	border-radius: var(--border-radius-large, 8px);
	border-left: 3px solid var(--color-primary-element);
	background: var(--color-background-hover);
}
.cn-polls-tab__row--closed[data-v-abac3b8c] {
	border-left-color: var(--color-border-dark, var(--color-border));
	background: transparent;
	opacity: 0.78;
}
.cn-polls-tab__row-header[data-v-abac3b8c] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-polls-tab__row-icon[data-v-abac3b8c] {
	display: inline-flex;
	color: var(--color-primary-element);
	flex-shrink: 0;
}
.cn-polls-tab__row--closed .cn-polls-tab__row-icon[data-v-abac3b8c] {
	color: var(--color-text-maxcontrast);
}
.cn-polls-tab__title[data-v-abac3b8c] {
	flex: 1;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
	font-weight: 600;
}
a.cn-polls-tab__title[data-v-abac3b8c]:hover {
	text-decoration: underline;
}
.cn-polls-tab__status[data-v-abac3b8c] {
	flex-shrink: 0;
}
.cn-polls-tab__unlink[data-v-abac3b8c] {
	flex-shrink: 0;
}
.cn-polls-tab__meta[data-v-abac3b8c] {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 12px;
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	padding-left: 28px;
}
.cn-polls-tab__meta-item[data-v-abac3b8c] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
}
.cn-polls-tab__meta-icon[data-v-abac3b8c] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
}
.cn-polls-tab__time[data-v-abac3b8c] {
	font-size: 1em;
	color: var(--color-text-maxcontrast);
}
.cn-polls-tab__options[data-v-abac3b8c] {
	list-style: none;
	margin: 4px 0 0;
	padding: 0 0 0 28px;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-polls-tab__option[data-v-abac3b8c] {
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-polls-tab__option-label[data-v-abac3b8c] {
	display: flex;
	justify-content: space-between;
	gap: 8px;
	font-size: 0.85em;
}
.cn-polls-tab__option-text[data-v-abac3b8c] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
}
.cn-polls-tab__option-count[data-v-abac3b8c] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
}
.cn-polls-tab__option-bar[data-v-abac3b8c] {
	height: 6px;
	border-radius: 3px;
	background: var(--color-background-dark);
	overflow: hidden;
}
.cn-polls-tab__option-bar-fill[data-v-abac3b8c] {
	height: 100%;
	background: var(--color-primary-element, #21468B);
	transition: width 0.2s ease;
}
.cn-polls-tab__description[data-v-abac3b8c] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	padding-left: 28px;
}


.cn-shares-card__empty[data-v-83a6f172] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-shares-card__headline[data-v-83a6f172] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-shares-card__headline-line[data-v-83a6f172] {
	font-size: 1.05em;
	color: var(--color-main-text);
}
.cn-shares-card__headline-recent[data-v-83a6f172] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-shares-card__chip[data-v-83a6f172] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-shares-card__chip-label[data-v-83a6f172] {
	color: var(--color-main-text);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-shares-card__group[data-v-83a6f172] {
	margin-bottom: 10px;
}
.cn-shares-card__group-header[data-v-83a6f172] {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 4px 0;
	font-size: 0.8em;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
	border-bottom: 1px solid var(--color-border);
}
.cn-shares-card__group-count[data-v-83a6f172] {
	margin-left: auto;
	font-weight: normal;
	font-size: 0.8em;
	padding: 1px 6px;
	border-radius: 9px;
	background: var(--color-background-hover);
}
.cn-shares-card__list[data-v-83a6f172] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-shares-card__row[data-v-83a6f172] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 0;
}
.cn-shares-card__row-main[data-v-83a6f172] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
}
.cn-shares-card__title[data-v-83a6f172] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	font-size: 0.95em;
}
.cn-shares-card__subtitle[data-v-83a6f172] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}


.cn-share-create[data-v-3290039e] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-share-create__error[data-v-3290039e] {
	margin: 4px 0;
}
.cn-share-create__field[data-v-3290039e] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-share-create__label[data-v-3290039e] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-share-create__type[data-v-3290039e],
.cn-share-create__permissions[data-v-3290039e] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 8px 12px;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-share-create__type legend[data-v-3290039e],
.cn-share-create__permissions legend[data-v-3290039e] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	padding: 0 4px;
}
.cn-share-create__type-option[data-v-3290039e] {
	display: flex;
	align-items: center;
	gap: 8px;
	cursor: pointer;
}
.cn-share-create__datetime[data-v-3290039e] {
	border-radius: var(--border-radius);
	padding: 6px 8px;
	border: 1px solid var(--color-border);
	background: var(--color-main-background);
	color: var(--color-main-text);
}


.cn-shares-tab__banner[data-v-56e70e2e] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-shares-tab__toolbar[data-v-56e70e2e] {
	display: flex;
	justify-content: flex-end;
	margin-bottom: 10px;
}
.cn-shares-tab__error[data-v-56e70e2e] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-shares-tab__empty[data-v-56e70e2e] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-shares-tab__empty-icon[data-v-56e70e2e] {
	color: var(--color-text-maxcontrast);
}
.cn-shares-tab__group[data-v-56e70e2e] {
	margin-bottom: 12px;
}
.cn-shares-tab__group-header[data-v-56e70e2e] {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 4px 0;
	font-size: 0.85em;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
	border-bottom: 1px solid var(--color-border);
}
.cn-shares-tab__group-label[data-v-56e70e2e] {
	flex: 1;
}
.cn-shares-tab__group-count[data-v-56e70e2e] {
	font-weight: normal;
	font-size: 0.85em;
	padding: 1px 6px;
	border-radius: 9px;
	background: var(--color-background-hover);
}
.cn-shares-tab__list[data-v-56e70e2e] {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* Share-type icon tile, mirroring the NcAvatar slot in NC's share list. */
.cn-shares-tab__avatar[data-v-56e70e2e] {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 34px;
	border-radius: 50%;
	background: var(--color-background-dark);
	color: var(--color-main-text);
}
.cn-shares-tab__avatar-lock[data-v-56e70e2e] {
	position: absolute;
	right: -2px;
	bottom: -2px;
	color: var(--color-warning, #e9a40f);
	background: var(--color-main-background);
	border-radius: 50%;
}
.cn-shares-tab__permissions[data-v-56e70e2e] {
	display: inline-flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 4px;
}
.cn-shares-tab__badge[data-v-56e70e2e] {
	white-space: nowrap;
}
.cn-shares-tab__expiry[data-v-56e70e2e] {
	display: inline-flex;
	align-items: center;
	gap: 3px;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
}
.cn-shares-tab__footer[data-v-56e70e2e] {
	margin-top: 12px;
	display: flex;
	justify-content: flex-end;
}


.cn-sidebar-tab[data-v-3efeae54] { padding: 12px;
}
.cn-sidebar-tab__action[data-v-3efeae54] { margin-bottom: 16px;
}
.cn-sidebar-tab__action--row[data-v-3efeae54] { display: flex; gap: 8px; align-items: flex-end;
}
.cn-sidebar-tab__empty[data-v-3efeae54] {
	text-align: center;
	padding: 24px 12px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-sidebar-tab__tags[data-v-3efeae54] { display: flex; flex-wrap: wrap; gap: 6px; padding: 4px 0;
}
.cn-sidebar-tab__tag[data-v-3efeae54] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	padding: 3px 8px;
	border-radius: var(--border-radius-pill, 16px);
	background: var(--color-primary-element-light, rgba(0, 130, 201, 0.1));
	color: var(--color-primary-element);
	font-size: 12px;
	font-weight: 500;
}
.cn-sidebar-tab__tag-remove[data-v-3efeae54] {
	display: flex;
	align-items: center;
	justify-content: center;
	background: none;
	border: none;
	padding: 0;
	cursor: pointer;
	color: var(--color-primary-element);
	opacity: 0.6;
	border-radius: 50%;
}
.cn-sidebar-tab__tag-remove[data-v-3efeae54]:hover { opacity: 1; background: rgba(0, 0, 0, 0.08);
}
.cn-sidebar-tab__tag-suggestions[data-v-3efeae54] {
	margin-top: 4px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	max-height: 160px;
	overflow-y: auto;
}
.cn-sidebar-tab__tag-suggestion[data-v-3efeae54] {
	display: flex;
	align-items: center;
	gap: 8px;
	width: 100%;
	padding: 6px 12px;
	border: none;
	background: none;
	cursor: pointer;
	font-size: 13px;
	color: var(--color-main-text);
	text-align: left;
}
.cn-sidebar-tab__tag-suggestion[data-v-3efeae54]:hover { background: var(--color-background-hover);
}


.cn-tags-card__list[data-v-18776d8f] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
}
.cn-tags-card__pill[data-v-18776d8f] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	padding: 2px 10px;
	border-radius: 999px;
	background: var(--color-background-dark);
	color: var(--color-main-text);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-tags-card__empty[data-v-18776d8f] {
	color: var(--color-text-maxcontrast);
	text-align: center;
	padding: 12px 0;
}


.cn-talk-card__empty[data-v-5f0c0447] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-talk-card__headline[data-v-5f0c0447] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-talk-card__headline-line[data-v-5f0c0447] {
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-talk-card__headline-recent[data-v-5f0c0447] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-talk-card__headline-recent a[data-v-5f0c0447] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-talk-card__headline-recent a[data-v-5f0c0447]:hover {
	text-decoration: underline;
}
.cn-talk-card__headline-preview[data-v-5f0c0447] {
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-talk-card__chip[data-v-5f0c0447] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-talk-card__chip a[data-v-5f0c0447] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-talk-card__chip a[data-v-5f0c0447]:hover {
	text-decoration: underline;
}
.cn-talk-card__chip-badge[data-v-5f0c0447] {
	display: inline-block;
	min-width: 16px;
	height: 16px;
	padding: 0 5px;
	border-radius: 8px;
	background: var(--color-primary-element, #4376FC);
	color: var(--color-primary-element-text, #ffffff);
	font-size: 0.7em;
	font-weight: bold;
	line-height: 16px;
	text-align: center;
}
.cn-talk-card__list[data-v-5f0c0447] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-talk-card__row[data-v-5f0c0447] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-talk-card__row[data-v-5f0c0447]:last-child {
	border-bottom: none;
}
.cn-talk-card__row-icon[data-v-5f0c0447] {
	position: relative;
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
}
.cn-talk-card__badge[data-v-5f0c0447] {
	position: absolute;
	top: -4px;
	right: -8px;
	min-width: 16px;
	height: 16px;
	padding: 0 5px;
	border-radius: 8px;
	background: var(--color-primary-element, #4376FC);
	color: var(--color-primary-element-text, #ffffff);
	font-size: 0.7em;
	font-weight: bold;
	line-height: 16px;
	text-align: center;
}
.cn-talk-card__row-main[data-v-5f0c0447] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
}
.cn-talk-card__title[data-v-5f0c0447] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-talk-card__row--unread .cn-talk-card__title[data-v-5f0c0447] {
	font-weight: 600;
}
a.cn-talk-card__title[data-v-5f0c0447]:hover {
	text-decoration: underline;
}
.cn-talk-card__subtitle[data-v-5f0c0447] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}


.cn-talk-room-create[data-v-5074c6e2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-talk-room-create__error[data-v-5074c6e2] {
	margin: 4px 0;
}


.cn-talk-room-picker[data-v-557e52cf] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-talk-room-picker__error[data-v-557e52cf] {
	margin: 4px 0;
}
.cn-talk-room-picker__search[data-v-557e52cf] {
	max-width: 100%;
}
.cn-talk-room-picker__panel[data-v-557e52cf] {
	min-height: 180px;
}
.cn-talk-room-picker__list[data-v-557e52cf] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-talk-room-picker__row[data-v-557e52cf] {
	border-radius: var(--border-radius);
}
.cn-talk-room-picker__row--selected[data-v-557e52cf] {
	background: var(--color-primary-element-light);
}
.cn-talk-room-picker__row-button[data-v-557e52cf] {
	display: flex;
	width: 100%;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	background: transparent;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-talk-room-picker__row-button[data-v-557e52cf]:hover {
	background: var(--color-background-hover);
}
.cn-talk-room-picker__row--selected .cn-talk-room-picker__row-button[data-v-557e52cf] {
	border-color: var(--color-primary-element);
}
.cn-talk-room-picker__row-label[data-v-557e52cf] {
	flex: 1 1 auto;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-talk-room-picker__row-meta[data-v-557e52cf] {
	flex-shrink: 0;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}


.cn-talk-tab[data-v-e4b81da4] {
	padding: 8px 0;
}
.cn-talk-tab__banner[data-v-e4b81da4] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-talk-tab__actions[data-v-e4b81da4] {
	display: flex;
	gap: 8px;
	margin-bottom: 10px;
	flex-wrap: wrap;
}
.cn-talk-tab__error[data-v-e4b81da4] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-talk-tab__empty[data-v-e4b81da4] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-talk-tab__empty-icon[data-v-e4b81da4] {
	color: var(--color-text-maxcontrast);
}
.cn-talk-tab__list[data-v-e4b81da4] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}

/* Last-message preview — single line, muted, like NC Talk. */
.cn-talk-tab__preview[data-v-e4b81da4] {
	display: block;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-text-maxcontrast);
}
.cn-talk-tab__time[data-v-e4b81da4] {
	color: var(--color-text-maxcontrast);
	font-size: 0.8em;
	white-space: nowrap;
}


.cn-sidebar-tab[data-v-57bf973f] {
	padding: 12px;
	overflow-x: hidden;
}
.cn-sidebar-tab__section[data-v-57bf973f] {
	margin-bottom: 12px;
}
.cn-sidebar-tab__section--filters[data-v-57bf973f] {
	padding-top: 12px;
	border-top: 1px solid var(--color-border);
}
.cn-sidebar-tab__action--row[data-v-57bf973f] {
	display: flex;
	gap: 8px;
	align-items: flex-end;
	margin-bottom: 8px;
}
.cn-sidebar-tab__grid[data-v-57bf973f] {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 8px;
}
.cn-sidebar-tab__grid[data-v-57bf973f] > * {
	min-width: 0;
}
.cn-sidebar-tab__empty[data-v-57bf973f] {
	text-align: center;
	padding: 24px 12px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-sidebar-tab__list[data-v-57bf973f] {
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-sidebar-tab__load-more[data-v-57bf973f] { margin-top: 8px;
}
.cn-sidebar-tab__task-checkbox[data-v-57bf973f] {
	display: flex;
	align-items: center;
	justify-content: center;
	background: none;
	border: none;
	padding: 0;
	cursor: pointer;
	color: inherit;
}
.cn-sidebar-tab__task-done[data-v-57bf973f] { color: var(--color-success);
}
.cn-sidebar-tab__task-overdue-icon[data-v-57bf973f] { color: var(--color-error, #e53935);
}
.cn-sidebar-tab__task-overdue-date[data-v-57bf973f] { color: var(--color-error, #e53935); font-weight: 500;
}


.cn-tasks-card__empty[data-v-69a3ed77] {
	text-align: center;
	padding: 16px 12px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-tasks-card__list[data-v-69a3ed77] {
	display: flex;
	flex-direction: column;
}
.cn-tasks-card__task[data-v-69a3ed77] {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	padding: 8px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-tasks-card__task[data-v-69a3ed77]:last-child {
	border-bottom: none;
}
.cn-tasks-card__status-icon[data-v-69a3ed77] {
	flex-shrink: 0;
	padding-top: 1px;
}
.cn-tasks-card__icon--completed[data-v-69a3ed77] {
	color: var(--color-success);
}
.cn-tasks-card__icon--active[data-v-69a3ed77] {
	color: var(--color-primary-element);
}
.cn-tasks-card__icon--terminated[data-v-69a3ed77] {
	color: var(--color-error);
}
.cn-tasks-card__icon--available[data-v-69a3ed77] {
	color: var(--color-text-maxcontrast);
}
.cn-tasks-card__content[data-v-69a3ed77] {
	flex: 1;
	min-width: 0;
}
.cn-tasks-card__title[data-v-69a3ed77] {
	display: block;
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-tasks-card__meta[data-v-69a3ed77] {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-top: 2px;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-tasks-card__assignee-name[data-v-69a3ed77] {
	color: var(--color-primary-element);
	font-weight: 500;
	cursor: pointer;
}
.cn-tasks-card__assignee-name[data-v-69a3ed77]:hover {
	text-decoration: underline;
}
.cn-tasks-card__assignee-name--self[data-v-69a3ed77] {
	color: var(--color-text-maxcontrast);
	cursor: default;
}
.cn-tasks-card__assignee-name--self[data-v-69a3ed77]:hover {
	text-decoration: none;
}
.cn-tasks-card__unassigned[data-v-69a3ed77] {
	font-style: italic;
	color: var(--color-text-maxcontrast);
}
.cn-tasks-card__due-date[data-v-69a3ed77] {
	white-space: nowrap;
}
.cn-tasks-card__due-date--overdue[data-v-69a3ed77] {
	color: var(--color-error);
	font-weight: 500;
}
.cn-tasks-card__show-all[data-v-69a3ed77] {
	background: none;
	border: none;
	color: var(--color-primary-element);
	font-size: 13px;
	font-weight: 500;
	cursor: pointer;
	padding: 0;
	width: 100%;
	text-align: center;
}
.cn-tasks-card__show-all[data-v-69a3ed77]:hover {
	text-decoration: underline;
}


.cn-time-tracker-card__empty[data-v-4ee344cc] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-time-tracker-card__headline[data-v-4ee344cc] {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-time-tracker-card__headline-line[data-v-4ee344cc] {
	font-size: 1.05em;
	color: var(--color-main-text);
}
.cn-time-tracker-card__total[data-v-4ee344cc] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: 0.95em;
	color: var(--color-main-text);
	font-weight: 600;
}
.cn-time-tracker-card__distribution[data-v-4ee344cc] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-time-tracker-card__distribution-row[data-v-4ee344cc] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-time-tracker-card__distribution-label[data-v-4ee344cc] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
}
.cn-time-tracker-card__distribution-dot[data-v-4ee344cc] {
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background: var(--color-background-dark);
}
.cn-time-tracker-card__distribution-dot--client[data-v-4ee344cc] {
	background: var(--color-primary-element, #21468B);
}
.cn-time-tracker-card__distribution-dot--task[data-v-4ee344cc] {
	background: var(--color-warning, #e9a40f);
}
.cn-time-tracker-card__distribution-dot--time[data-v-4ee344cc] {
	background: var(--color-success, #46ba61);
}
.cn-time-tracker-card__distribution-count[data-v-4ee344cc] {
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-time-tracker-card__headline-recent[data-v-4ee344cc] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-time-tracker-card__headline-recent a[data-v-4ee344cc] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-time-tracker-card__headline-recent a[data-v-4ee344cc]:hover {
	text-decoration: underline;
}
.cn-time-tracker-card__chip[data-v-4ee344cc] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-time-tracker-card__chip a[data-v-4ee344cc] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-time-tracker-card__chip a[data-v-4ee344cc]:hover {
	text-decoration: underline;
}
.cn-time-tracker-card__chip-pill[data-v-4ee344cc] {
	display: inline-block;
	padding: 1px 6px;
	font-size: 0.7em;
	font-weight: 600;
	border-radius: 8px;
	background: var(--color-background-dark);
	color: var(--color-main-text);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	white-space: nowrap;
}
.cn-time-tracker-card__chip-pill--client[data-v-4ee344cc] {
	background: var(--color-primary-element, #21468B);
	color: var(--color-main-background);
}
.cn-time-tracker-card__chip-pill--task[data-v-4ee344cc] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-time-tracker-card__chip-pill--time[data-v-4ee344cc] {
	background: var(--color-success, #46ba61);
	color: var(--color-main-background);
}
.cn-time-tracker-card__rows[data-v-4ee344cc] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-time-tracker-card__row[data-v-4ee344cc] {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 4px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	font-size: 0.85em;
}
.cn-time-tracker-card__row--highlight[data-v-4ee344cc] {
	border-color: var(--color-primary-element, #21468B);
	background: var(--color-primary-element-light, var(--color-background-darker));
	font-weight: 600;
}
.cn-time-tracker-card__title[data-v-4ee344cc] {
	flex: 1;
	color: var(--color-main-text);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
a.cn-time-tracker-card__title[data-v-4ee344cc]:hover {
	text-decoration: underline;
}
.cn-time-tracker-card__duration[data-v-4ee344cc] {
	font-weight: 600;
	color: var(--color-main-text);
	font-size: 0.85em;
}


.cn-time-tracker-create[data-v-56f9ecee] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-time-tracker-create__error[data-v-56f9ecee] {
	margin: 4px 0;
}


.cn-time-tracker-picker[data-v-8d32aca6] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-time-tracker-picker__error[data-v-8d32aca6] {
	margin: 4px 0;
}
.cn-time-tracker-picker__search[data-v-8d32aca6] {
	width: 100%;
}
.cn-time-tracker-picker__list[data-v-8d32aca6] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-time-tracker-picker__row[data-v-8d32aca6] {
	border-radius: var(--border-radius);
}
.cn-time-tracker-picker__row-button[data-v-8d32aca6] {
	display: flex;
	align-items: center;
	gap: 10px;
	width: 100%;
	padding: 8px 10px;
	background: var(--color-background-hover);
	border: 2px solid transparent;
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-time-tracker-picker__row-button[data-v-8d32aca6]:hover {
	background: var(--color-background-dark, var(--color-background-hover));
}
.cn-time-tracker-picker__row--selected .cn-time-tracker-picker__row-button[data-v-8d32aca6] {
	border-color: var(--color-primary-element);
}
.cn-time-tracker-picker__kind[data-v-8d32aca6] {
	flex-shrink: 0;
	display: inline-block;
	padding: 1px 6px;
	font-size: 0.7em;
	font-weight: 600;
	border-radius: 8px;
	background: var(--color-background-dark);
	color: var(--color-main-text);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	white-space: nowrap;
}
.cn-time-tracker-picker__kind--client[data-v-8d32aca6] {
	background: var(--color-primary-element, #21468B);
	color: var(--color-main-background);
}
.cn-time-tracker-picker__kind--task[data-v-8d32aca6] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-time-tracker-picker__kind--time[data-v-8d32aca6] {
	background: var(--color-success, #46ba61);
	color: var(--color-main-background);
}
.cn-time-tracker-picker__main[data-v-8d32aca6] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-time-tracker-picker__name[data-v-8d32aca6] {
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-time-tracker-picker__duration[data-v-8d32aca6] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
}


.cn-time-tracker-tab__actions[data-v-53500c09] {
	display: flex;
	gap: 8px;
	margin-bottom: 10px;
	flex-wrap: wrap;
}
.cn-time-tracker-tab__unlink[data-v-53500c09] {
	flex-shrink: 0;
}
.cn-time-tracker-tab__banner[data-v-53500c09] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-time-tracker-tab__error[data-v-53500c09] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-time-tracker-tab__empty[data-v-53500c09] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-time-tracker-tab__empty-icon[data-v-53500c09] {
	color: var(--color-text-maxcontrast);
}
.cn-time-tracker-tab__summary[data-v-53500c09] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	padding: 8px 12px;
	margin-bottom: 8px;
	border-radius: var(--border-radius-large, var(--border-radius));
	background: var(--color-background-hover);
}
.cn-time-tracker-tab__summary-label[data-v-53500c09] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-time-tracker-tab__summary-value[data-v-53500c09] {
	font-weight: 700;
	font-size: 1.15em;
	color: var(--color-main-text);
	font-variant-numeric: tabular-nums;
}
.cn-time-tracker-tab__list[data-v-53500c09] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-time-tracker-tab__row-icon[data-v-53500c09] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border-radius: 50%;
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}
.cn-time-tracker-tab__row-icon.cn-time-tracker-tab__row--client[data-v-53500c09] {
	background: var(--color-primary-element-light, var(--color-background-dark));
	color: var(--color-primary-element, #21468B);
}
.cn-time-tracker-tab__row-icon.cn-time-tracker-tab__row--task[data-v-53500c09] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-time-tracker-tab__row-icon.cn-time-tracker-tab__row--time[data-v-53500c09] {
	background: var(--color-success, #46ba61);
	color: var(--color-main-background);
}
.cn-time-tracker-tab__subline[data-v-53500c09] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	flex-wrap: wrap;
}
.cn-time-tracker-tab__date[data-v-53500c09],
.cn-time-tracker-tab__task-count[data-v-53500c09] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-time-tracker-tab__kind-chip[data-v-53500c09] {
	display: inline-block;
	padding: 1px 6px;
	font-size: 0.7em;
	font-weight: 600;
	border-radius: 8px;
	background: var(--color-background-dark);
	color: var(--color-main-text);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	white-space: nowrap;
}
.cn-time-tracker-tab__kind-chip--client[data-v-53500c09] {
	background: var(--color-primary-element, #21468B);
	color: var(--color-main-background);
}
.cn-time-tracker-tab__kind-chip--task[data-v-53500c09] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-time-tracker-tab__kind-chip--time[data-v-53500c09] {
	background: var(--color-success, #46ba61);
	color: var(--color-main-background);
}
.cn-time-tracker-tab__duration[data-v-53500c09] {
	font-weight: 700;
	font-size: 1.05em;
	color: var(--color-main-text);
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}
.cn-time-tracker-tab__billable[data-v-53500c09] {
	display: inline-flex;
	align-items: center;
	gap: 3px;
	padding: 1px 6px;
	border-radius: 8px;
	font-size: 0.72em;
	font-weight: 600;
	color: var(--color-main-background);
	background: var(--color-success, #46ba61);
	white-space: nowrap;
}


.cn-version-history__empty[data-v-22a9c1af] {
	color: var(--color-text-maxcontrast);
	text-align: center;
	padding: 12px 0;
}
.cn-version-history__rows[data-v-22a9c1af] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-version-history__row[data-v-22a9c1af] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-version-history__row[data-v-22a9c1af]:last-child {
	border-bottom: none;
}
.cn-version-history__row-main[data-v-22a9c1af] {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	align-items: baseline;
	flex: 1 1 auto;
	background: none;
	border: none;
	cursor: pointer;
	text-align: left;
	font: inherit;
	color: inherit;
	padding: 4px;
	border-radius: var(--border-radius);
}
.cn-version-history__row-main[data-v-22a9c1af]:hover {
	background-color: var(--color-background-hover);
}
.cn-version-history__version[data-v-22a9c1af] {
	font-weight: bold;
	color: var(--color-main-text);
}
.cn-version-history__action[data-v-22a9c1af] {
	color: var(--color-text-maxcontrast);
}
.cn-version-history__when[data-v-22a9c1af] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	white-space: nowrap;
}
.cn-version-history__user[data-v-22a9c1af] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-version-history__toolbar[data-v-22a9c1af] {
	display: flex;
	gap: 8px;
	margin-top: 8px;
	flex-wrap: wrap;
}
.cn-version-history__diff-toolbar[data-v-22a9c1af] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: 8px;
	margin-bottom: 8px;
	flex-wrap: wrap;
}
.cn-version-history__diff-table[data-v-22a9c1af] {
	width: 100%;
	border-collapse: collapse;
}
.cn-version-history__diff-table th[data-v-22a9c1af],
.cn-version-history__diff-table td[data-v-22a9c1af] {
	border-bottom: 1px solid var(--color-border);
	padding: 6px 8px;
	text-align: left;
	vertical-align: top;
}
.cn-version-history__diff-field[data-v-22a9c1af] {
	font-weight: 500;
	color: var(--color-main-text);
	white-space: nowrap;
}
.cn-version-history__diff-json[data-v-22a9c1af] {
	margin: 0;
	white-space: pre-wrap;
	overflow-wrap: anywhere;
	font-family: monospace;
	font-size: 12px;
}
.cn-version-history__diff-row--added .cn-version-history__diff-field[data-v-22a9c1af] {
	color: var(--color-success);
}
.cn-version-history__diff-row--removed .cn-version-history__diff-field[data-v-22a9c1af] {
	color: var(--color-error);
}
.cn-version-history__diff-row--changed .cn-version-history__diff-field[data-v-22a9c1af] {
	color: var(--color-warning);
}
.cn-version-history__diff-line--added[data-v-22a9c1af] {
	background-color: color-mix(in srgb, var(--color-success) 15%, transparent);
	color: var(--color-success);
}
.cn-version-history__diff-line--removed[data-v-22a9c1af] {
	background-color: color-mix(in srgb, var(--color-error) 15%, transparent);
	color: var(--color-error);
	text-decoration: line-through;
}
.cn-version-history__diff-line--changed[data-v-22a9c1af] {
	background-color: color-mix(in srgb, var(--color-warning) 15%, transparent);
	color: var(--color-warning);
}
.cn-version-history__diff-line--unchanged[data-v-22a9c1af] {
	color: var(--color-text-maxcontrast);
}
.cn-version-history__diff-empty[data-v-22a9c1af] {
	color: var(--color-text-maxcontrast);
	text-align: center;
	padding: 12px 0;
}


.cn-xwiki-card__empty[data-v-54e85fe3] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-xwiki-card__dashboard[data-v-54e85fe3] {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-xwiki-card__headline-row[data-v-54e85fe3] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
}
.cn-xwiki-card__count[data-v-54e85fe3] {
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-xwiki-card__count--muted[data-v-54e85fe3] {
	color: var(--color-text-maxcontrast);
	font-weight: normal;
}
.cn-xwiki-card__auth-badge[data-v-54e85fe3] {
	flex-shrink: 0;
	font-size: 0.75em;
	padding: 2px 8px;
	border-radius: 10px;
	white-space: nowrap;
}
.cn-xwiki-card__auth-badge--configured[data-v-54e85fe3] {
	background: var(--color-success, #46ba61);
	color: var(--color-main-background);
}
.cn-xwiki-card__auth-badge--missing[data-v-54e85fe3] {
	background: var(--color-background-hover);
	color: var(--color-main-text);
	border: 1px solid var(--color-border);
}
.cn-xwiki-card__auth-badge--unhealthy[data-v-54e85fe3] {
	background: var(--color-error, #e9322d);
	color: var(--color-main-background);
}
.cn-xwiki-card__recent[data-v-54e85fe3] {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-xwiki-card__recent a[data-v-54e85fe3] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-xwiki-card__recent a[data-v-54e85fe3]:hover {
	text-decoration: underline;
}
.cn-xwiki-card__recent-breadcrumb[data-v-54e85fe3] {
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-xwiki-card__banner[data-v-54e85fe3] {
	padding: 8px 10px;
	border-radius: var(--border-radius);
	font-size: 0.9em;
	margin-bottom: 8px;
}
.cn-xwiki-card__banner--unconfigured[data-v-54e85fe3] {
	background: var(--color-background-hover);
	color: var(--color-main-text);
	border-left: 3px solid var(--color-primary-element, #21468B);
}
.cn-xwiki-card__banner--auth[data-v-54e85fe3],
.cn-xwiki-card__banner--error[data-v-54e85fe3] {
	background: var(--color-error, #e9322d);
	color: var(--color-main-background);
}
.cn-xwiki-card__banner--upstream[data-v-54e85fe3] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-xwiki-card__list[data-v-54e85fe3] {
	list-style: none;
	margin: 0 0 8px;
	padding: 0;
}
.cn-xwiki-card__row[data-v-54e85fe3] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-xwiki-card__row[data-v-54e85fe3]:last-child {
	border-bottom: none;
}
.cn-xwiki-card__row-header[data-v-54e85fe3] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-xwiki-card__row-icon[data-v-54e85fe3] {
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-xwiki-card__title[data-v-54e85fe3] {
	flex: 1;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-xwiki-card__title[data-v-54e85fe3]:hover {
	text-decoration: underline;
}
.cn-xwiki-card__breadcrumb[data-v-54e85fe3] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	padding-left: 24px;
}
.cn-xwiki-card__preview[data-v-54e85fe3] {
	padding-top: 8px;
	border-top: 1px solid var(--color-border);
	font-size: 0.9em;
	color: var(--color-main-text);
}
.cn-xwiki-card__preview p[data-v-54e85fe3] {
	margin: 0 0 6px;
}
.cn-xwiki-card__open-link[data-v-54e85fe3] {
	color: var(--color-primary-element, #21468B);
	text-decoration: none;
	font-weight: 500;
}
.cn-xwiki-card__open-link[data-v-54e85fe3]:hover {
	text-decoration: underline;
}
.cn-xwiki-card__chip[data-v-54e85fe3] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-xwiki-card__chip a[data-v-54e85fe3] {
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-xwiki-card__chip a[data-v-54e85fe3]:hover {
	text-decoration: underline;
}
.cn-xwiki-card__chip-breadcrumb[data-v-54e85fe3] {
	color: var(--color-text-maxcontrast);
}
.cn-xwiki-card__chip--fallback[data-v-54e85fe3] {
	opacity: 0.85;
}


.cn-xwiki-page-create[data-v-322ae6be] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}
.cn-xwiki-page-create__error[data-v-322ae6be] {
	margin: 4px 0;
}
.cn-xwiki-page-create__unconfigured[data-v-322ae6be] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 24px 12px;
	text-align: center;
	color: var(--color-text-maxcontrast);
}
.cn-xwiki-page-create__unconfigured-icon[data-v-322ae6be] {
	color: var(--color-primary-element, #21468B);
}
.cn-xwiki-page-create__unconfigured p[data-v-322ae6be] {
	margin: 0;
}


.cn-xwiki-page-picker[data-v-c40d2d76] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
	min-height: 240px;
}
.cn-xwiki-page-picker__unconfigured[data-v-c40d2d76] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 24px 12px;
	text-align: center;
	color: var(--color-text-maxcontrast);
}
.cn-xwiki-page-picker__unconfigured-icon[data-v-c40d2d76] {
	color: var(--color-primary-element, #21468B);
}
.cn-xwiki-page-picker__unconfigured p[data-v-c40d2d76] {
	margin: 0;
}
.cn-xwiki-page-picker__error[data-v-c40d2d76] {
	margin: 4px 0;
}
.cn-xwiki-page-picker__search[data-v-c40d2d76] {
	width: 100%;
}
.cn-xwiki-page-picker__list[data-v-c40d2d76] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-xwiki-page-picker__row[data-v-c40d2d76] {
	border-radius: var(--border-radius);
}
.cn-xwiki-page-picker__row-button[data-v-c40d2d76] {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	width: 100%;
	padding: 8px 10px;
	background: var(--color-background-hover);
	border: 2px solid transparent;
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	cursor: pointer;
	text-align: left;
}
.cn-xwiki-page-picker__row-button[data-v-c40d2d76]:hover {
	background: var(--color-background-dark, var(--color-background-hover));
}
.cn-xwiki-page-picker__row--selected .cn-xwiki-page-picker__row-button[data-v-c40d2d76] {
	border-color: var(--color-primary-element);
}
.cn-xwiki-page-picker__icon[data-v-c40d2d76] {
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	display: flex;
	align-items: center;
	justify-content: center;
	color: var(--color-text-maxcontrast);
}
.cn-xwiki-page-picker__main[data-v-c40d2d76] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-xwiki-page-picker__title[data-v-c40d2d76] {
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-xwiki-page-picker__sub[data-v-c40d2d76] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}


.cn-xwiki-tab__actions[data-v-4b3fb212] {
	display: flex;
	gap: 8px;
	margin-bottom: 10px;
	flex-wrap: wrap;
}
.cn-xwiki-tab__unlink[data-v-4b3fb212] {
	flex-shrink: 0;
}
.cn-xwiki-tab__banner[data-v-4b3fb212] {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	padding: 10px 12px;
	margin-bottom: 12px;
	border-radius: var(--border-radius);
	font-size: 0.9em;
}
.cn-xwiki-tab__banner--unconfigured[data-v-4b3fb212] {
	background: var(--color-background-hover);
	color: var(--color-main-text);
	border-left: 3px solid var(--color-primary-element, #21468B);
}
.cn-xwiki-tab__banner--auth[data-v-4b3fb212],
.cn-xwiki-tab__banner--error[data-v-4b3fb212] {
	background: var(--color-error, #e9322d);
	color: var(--color-main-background);
}
.cn-xwiki-tab__banner--upstream[data-v-4b3fb212] {
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
}
.cn-xwiki-tab__banner-icon[data-v-4b3fb212] {
	flex-shrink: 0;
	margin-top: 2px;
}
.cn-xwiki-tab__banner-body[data-v-4b3fb212] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-xwiki-tab__banner-body p[data-v-4b3fb212] {
	margin: 0;
}
.cn-xwiki-tab__banner-cta[data-v-4b3fb212] {
	flex-shrink: 0;
}
.cn-xwiki-tab__empty[data-v-4b3fb212] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-xwiki-tab__empty-icon[data-v-4b3fb212] {
	color: var(--color-text-maxcontrast);
}
.cn-xwiki-tab__list[data-v-4b3fb212] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}

/* XWiki-style document tile: a tinted square holding the page glyph. */
.cn-xwiki-tab__row-icon[data-v-4b3fb212] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border-radius: var(--border-radius);
	background: var(--cn-xwiki-accent-soft, rgba(60, 162, 47, 0.12));
	color: var(--cn-xwiki-accent, #3CA22F);
}
.cn-xwiki-tab__subline[data-v-4b3fb212] {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	flex-wrap: wrap;
	min-width: 0;
}
.cn-xwiki-tab__breadcrumb[data-v-4b3fb212] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-xwiki-tab__date[data-v-4b3fb212] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	white-space: nowrap;
}
.cn-xwiki-tab__excerpt[data-v-4b3fb212] {
	display: block;
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	max-width: 100%;
}


.cn-form-dialog__form[data-v-c3eeb0a2] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-form-dialog__field[data-v-c3eeb0a2] {
	margin-bottom: 8px;
}

/* Two-column layout. The grid lives on a wrapper that only exists when
   `columns` is 2, so a single-column form keeps its plain block flow and
   cannot be reflowed by a rule meant for the other mode.

   `min-width: 0` on the items is what stops a long select or a wide input
   from pushing its column past its share: a grid item's default `auto`
   minimum is its content, so without it one long option label widens the
   whole column and the two stop being equal. */
.cn-form-dialog__form--two-column[data-v-c3eeb0a2] {
	display: grid;
	grid-template-columns: 1fr 1fr;
	column-gap: 16px;
	align-items: start;
}
.cn-form-dialog__form--two-column[data-v-c3eeb0a2] > * {
	min-width: 0;
}

/* Anything that is not a field (the form-level error note, the slots above
   and below the fields) spans the full width, so a note card never sits in
   a half-width column beside an input. */
.cn-form-dialog__form--two-column[data-v-c3eeb0a2] > :not(.cn-form-dialog__field),
.cn-form-dialog__form--two-column > .cn-form-dialog__field--wide[data-v-c3eeb0a2] {
	grid-column: 1 / -1;
}

/* A narrow viewport gets the single column back. Two columns of roughly
   150px each are worse than one readable one. */
@media (max-width: 700px) {
.cn-form-dialog__form--two-column[data-v-c3eeb0a2] {
		display: block;
}
}
.cn-form-dialog__textarea-wrapper[data-v-c3eeb0a2],
.cn-form-dialog__select-wrapper[data-v-c3eeb0a2],
.cn-form-dialog__json-wrapper[data-v-c3eeb0a2] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-form-dialog__label[data-v-c3eeb0a2] {
	font-weight: 600;
	font-size: 0.9em;
	color: var(--color-main-text);
}

/* Cross-app semantic reference (ADR-048) whose provider isn't installed —
   rendered disabled; the wrapper carries the mouse-over tooltip. */
.cn-form-dialog__semantic-unresolved[data-v-c3eeb0a2] {
	cursor: not-allowed;
}
.cn-form-dialog__textarea[data-v-c3eeb0a2] {
	width: 100%;
	min-height: 80px;
	padding: 8px;
	border: 2px solid var(--color-border-maxcontrast);
	border-radius: var(--border-radius-large);
	background-color: var(--color-main-background);
	color: var(--color-main-text);
	font-family: inherit;
	font-size: inherit;
	resize: vertical;
}
.cn-form-dialog__textarea[data-v-c3eeb0a2]:focus {
	border-color: var(--color-primary-element);
	outline: none;
}
.cn-form-dialog__textarea[data-v-c3eeb0a2]:disabled {
	opacity: 0.5;
	cursor: not-allowed;
}
.cn-form-dialog__helper[data-v-c3eeb0a2] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-form-dialog__helper--error[data-v-c3eeb0a2] {
	color: var(--color-error);
}
.cn-form-dialog__dynamic-loading[data-v-c3eeb0a2] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 0;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
}


.cn-widget-empty-state[data-v-a4513fa2] {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 6px;
	/* No fixed height: the state fits whatever the widget cell left over
	   (ADR-062 — the cell is the budget), and `min-height: 0` keeps it from
	   forcing a scrollbar on a short tile. */
	min-height: 0;
	padding: 16px 12px;
	text-align: center;
}
.cn-widget-empty-state__icon[data-v-a4513fa2] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 48px;
	height: 48px;
	border-radius: 50%;
	flex-shrink: 0;
}
.cn-widget-empty-state__icon[data-v-a4513fa2] svg {
	fill: currentcolor;
}
.cn-widget-empty-state__name[data-v-a4513fa2] {
	margin: 0;
	font-size: 14px;
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-widget-empty-state__description[data-v-a4513fa2] {
	margin: 0;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
	max-width: 32ch;
}
.cn-widget-empty-state__action[data-v-a4513fa2] {
	margin-top: 4px;
}

/* Compact: one muted row, icon inline — for tiles too short for the stack. */
.cn-widget-empty-state--compact[data-v-a4513fa2] {
	flex-direction: row;
	gap: 8px;
	padding: 8px 12px;
}
.cn-widget-empty-state--compact .cn-widget-empty-state__icon[data-v-a4513fa2] {
	width: 28px;
	height: 28px;
}
.cn-widget-empty-state--compact .cn-widget-empty-state__name[data-v-a4513fa2] {
	font-weight: 400;
	color: var(--color-text-maxcontrast);
}


.cn-row-action--destructive[data-v-5d9db5e2] {
	color: var(--color-error) !important;
}


/* The widget already lives inside CnWidgetWrapper's padded card chrome. The
   table is rendered `borderless` so CnDataTable drops its own border/shadow/
   background AND its bottom margin (the `.cn-table-container--borderless`
   modifier) — otherwise it reads as a card-in-a-card with dead space below.
   Horizontal overflow is owned by `.cn-table-container` (overflow-x: auto); a
   second scroll container here would produce a nested scrollbar, so this host
   stays plain. */
.cn-object-list-widget[data-v-da58f8e2] {
	width: 100%;
	height: 100%;
	display: flex;
	flex-direction: column;
	min-height: 0;
}

/* The overlay covers the widget while a file drag is over it. `position:
   relative` is set only in the dropping state so a widget without a drop zone
   keeps the containing block it had — an unconditional rule here would
   re-parent any absolutely-positioned descendant a host has placed. */
.cn-object-list-widget--dropping[data-v-da58f8e2] {
	position: relative;
}
.cn-object-list-widget__drop-overlay[data-v-da58f8e2] {
	position: absolute;
	inset: 0;
	z-index: 2;
	display: flex;
	align-items: center;
	justify-content: center;
	text-align: center;
	padding: var(--cn-spacing-m, 12px);
	border: 2px dashed var(--color-primary-element);
	border-radius: var(--border-radius-large, 12px);
	background-color: var(--color-primary-element-light);
	color: var(--color-main-text);
	/* The overlay is a painted state, not a target: letting it swallow the
	   pointer would fire dragleave the instant it appeared under the cursor,
	   and the drop would land on nothing. */
	pointer-events: none;
}
.cn-object-list-widget__table[data-v-da58f8e2] {
	flex: 1 1 auto;
	min-height: 0;
	overflow: hidden;
}

/* The empty state is CnWidgetEmptyState now — it brings its own layout, so
   all this rule still owns is letting it claim the cell's leftover height
   (ADR-062: it fits the cell, it never forces one). */
.cn-object-list-widget__empty[data-v-da58f8e2] {
	flex: 1 1 auto;
	min-height: 0;
}

/* The pager sits flush at the bottom of the card, above "View all". */
.cn-object-list-widget__pager[data-v-da58f8e2] {
	flex-shrink: 0;
}
.cn-object-list-widget__view-all[data-v-da58f8e2] {
	align-self: flex-start;
	background: none;
	border: none;
	color: var(--color-primary-element);
	cursor: pointer;
	font: inherit;
	margin-top: 4px;
	padding: 4px;
}
.cn-object-list-widget__view-all[data-v-da58f8e2]:hover,
.cn-object-list-widget__view-all[data-v-da58f8e2]:focus-visible {
	text-decoration: underline;
}
.cn-object-list-widget__more[data-v-da58f8e2] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	margin: 4px 0 0;
	padding: 4px;
}

/* Footer Add — same pattern as the integration leaves' footer action
   ("Open in Calendar"): full-width, centered, divider-topped, pinned to
   the card bottom. */
.cn-object-list-widget__add[data-v-da58f8e2] {
	align-self: stretch;
	background: none;
	border: none;
	border-top: 1px solid var(--color-border);
	color: var(--color-primary-element);
	cursor: pointer;
	font: inherit;
	font-weight: 600;
	/* Bleed through the host card's 16px content padding so the divider
	   spans edge-to-edge, exactly like the integration leaves' footer.
	   !important: Nextcloud server ships `#app-content button { margin:
	   3px … }` — an id-selector rule no scoped class can outrank. */
	margin: auto -16px -16px !important;
	padding: 12px 8px;
	text-align: center;
}
.cn-object-list-widget__add[data-v-da58f8e2]:hover,
.cn-object-list-widget__add[data-v-da58f8e2]:focus-visible {
	text-decoration: underline;
}
.cn-object-list-widget__error[data-v-da58f8e2] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	margin: 4px 0 0;
}
.cn-object-list-widget__prompt[data-v-da58f8e2] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
	padding: 16px 4px;
	margin: 0;
	text-align: center;
}
.cn-object-list-widget__facet[data-v-da58f8e2] {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 6px;
	padding: 0 4px 8px;
}
.cn-object-list-widget__facet-label[data-v-da58f8e2] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	font-weight: 600;
}
.cn-object-list-widget__facet-chip[data-v-da58f8e2] {
	background-color: var(--color-background-hover);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-pill, 16px);
	color: var(--color-main-text);
	cursor: pointer;
	font: inherit;
	font-size: 0.85em;
	padding: 2px 10px;
}
.cn-object-list-widget__facet-chip--active[data-v-da58f8e2] {
	background-color: var(--color-primary-element-light);
	border-color: var(--color-primary-element);
	color: var(--color-primary-element-text, var(--color-main-text));
}
.cn-object-list-widget__facet-clear[data-v-da58f8e2],
.cn-object-list-widget__bulk-clear[data-v-da58f8e2] {
	background: none;
	border: none;
	color: var(--color-primary-element);
	cursor: pointer;
	font: inherit;
	font-size: 0.85em;
	padding: 2px 4px;
}
.cn-object-list-widget__facet-clear[data-v-da58f8e2]:hover,
.cn-object-list-widget__bulk-clear[data-v-da58f8e2]:hover {
	text-decoration: underline;
}
.cn-object-list-widget__bulk-bar[data-v-da58f8e2] {
	align-items: center;
	background-color: var(--color-primary-element-light);
	border-radius: var(--border-radius, 8px);
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 0 0 8px;
	padding: 6px 10px;
}
.cn-object-list-widget__bulk-count[data-v-da58f8e2] {
	font-weight: 600;
}
.cn-object-list-widget__bulk-action[data-v-da58f8e2] {
	background-color: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius, 8px);
	cursor: pointer;
	font: inherit;
	padding: 4px 10px;
}
.cn-object-list-widget__bulk-action--destructive[data-v-da58f8e2] {
	border-color: var(--color-error);
	color: var(--color-error);
}
.cn-object-list-widget__groups[data-v-da58f8e2] {
	display: flex;
	flex-direction: column;
	gap: 16px;
	min-height: 0;
	overflow: auto;
}
.cn-object-list-widget__group-heading[data-v-da58f8e2] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	font-weight: 600;
	margin: 0 0 4px;
	text-transform: uppercase;
}
.cn-object-list-widget__upload[data-v-da58f8e2] {
	background-color: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius, 8px);
	cursor: pointer;
	font: inherit;
	margin: 8px 0 0;
	padding: 6px 12px;
}
.cn-object-list-widget__upload-input[data-v-da58f8e2] {
	display: none;
}


.cn-object-list-form[data-v-125c318f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-object-list-form__section[data-v-125c318f] {
	margin: 8px 0 0;
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--color-text-maxcontrast);
}
.cn-object-list-form__row2[data-v-125c318f] {
	display: flex;
	gap: 12px;
	align-items: flex-end;
}

/* Share the row on a single line: controls grow to fill and shrink to fit. */
.cn-object-list-form__row2[data-v-125c318f] > * {
	flex: 1 1 0;
	min-width: 0;
}

/* The row limit is just a small number — pin it narrow (never grow/shrink) so
   Sort by / Direction take the remaining width instead of an equal third. */
.cn-object-list-form__limit[data-v-125c318f] {
	flex: 0 0 80px;
	margin-block-end: 2px;
}

/* NcSelect defaults to min-width:260px, which would force the row to overflow
   (horizontal scroll) in narrow panels; let the pickers shrink to share it. */
.cn-object-list-form__row2[data-v-125c318f] .v-select.select {
	min-width: 0;
}
.cn-object-list-form__col-row[data-v-125c318f] .button-vue {
	flex: 0 0 auto;
	min-width: 0;
}
.cn-object-list-form__col-row__header[data-v-125c318f] {
	margin-block-end: 2px;
}


.cn-widget-wrapper[data-v-4dd77f59] {
	position: relative;
	height: 100%;
	display: flex;
	flex-direction: column;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	/* NC design system: every content card is rounded — same token as
	   CnDetailCard so detail pages read as ONE card family (ADR-062). */
	border-radius: var(--border-radius-large, 8px);
	overflow: hidden;
}

/* Headerless date chip — floated over the top-right of a flush card. */
.cn-widget-wrapper__floating-meta[data-v-4dd77f59] {
	position: absolute;
	top: 8px;
	inset-inline-end: 10px;
	z-index: 2;
}
.cn-widget-wrapper__content[data-v-4dd77f59] {
	flex: 1;
	overflow: auto;
	min-height: 0;
	padding: 16px;
}

/* A TABLE GOES EDGE TO EDGE. ALWAYS.
   A table drawn inside 16px of padding renders a border inside a border — two
   rectangles a few pixels apart, which reads as a mistake because it is one.
   The wrapper already has a `flush` prop that zeroes this padding, but a prop
   is something an app has to remember on every table it ever adds, and the
   apps did not: the padding was visible in pipelinq's table widgets.
   So it is structural instead. `:has()` keys on the table component's own root
   class, which means a table is flush by construction and no caller can
   reintroduce the gap by forgetting a prop. */
.cn-widget-wrapper__content[data-v-4dd77f59]:has(> .cn-table-container),
.cn-widget-wrapper__content[data-v-4dd77f59]:has(> .cn-widget-object-table) {
	padding: 0;
}

/* Keyboard focus ring for the now-focusable scrollable content region. */
.cn-widget-wrapper__content[data-v-4dd77f59]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: -2px;
}
.cn-widget-wrapper--borderless[data-v-4dd77f59] {
	border: none;
	background: transparent;
}
.cn-widget-wrapper--borderless .cn-widget-wrapper__content[data-v-4dd77f59] {
	padding: 0;
}
.cn-widget-wrapper--flush .cn-widget-wrapper__content[data-v-4dd77f59] {
	padding: 0;
}

/* `chromeless` — border and background are already gone through borderless,
   and the content padding through flush. What is left on the root is the
   corner radius, which still clips: with `overflow: hidden` above, a child
   that paints its own background (a table header) gets rounded corners inside
   a square panel, which is the last visible piece of a card that is supposed
   to be absent. `CnDetailCard.cn-detail-card--chromeless` zeroes the same
   thing for the same reason. */
.cn-widget-wrapper--chromeless[data-v-4dd77f59] {
	border-radius: 0;
}

/*
 * `chrome="nc-dashboard"` — reproduce the native Nextcloud Dashboard panel
 * (apps/dashboard) exactly, using the same design tokens so an un-customised
 * widget is pixel-identical to a core dashboard panel. `styleConfig` inline
 * overrides (wrapperStyles / headerStyles) still win over these class rules,
 * so users can override any token. Combined selector raises specificity above
 * the base `.cn-widget-wrapper` rules it supersedes.
 */
.cn-widget-wrapper__header[data-v-4dd77f59] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	/* The header is `space-between`, so without an explicit gap a right-hand
	   title-icon sits flush against whatever precedes it. The left-hand icon's
	   spacing comes from header-left's own gap. */
	gap: 8px;
	padding: 12px 16px;
	border-bottom: 1px solid var(--color-border);
	flex-shrink: 0;
}

/* Actions with no title beside them. `header-left` is not rendered at all in
   this mode, and the header is `space-between`, so a single child would sit
   flush LEFT where every other surface puts its actions on the right. */
.cn-widget-wrapper__header--actions-only[data-v-4dd77f59] {
	justify-content: flex-end;
}

/* `chromeless` — the surface around this widget already drew the card, so
   nothing here may draw a second one. Border, background and content padding
   are already gone (chromeless implies borderless + flush); what is left is
   the header, which still renders when there are controls to hold. Its bottom
   rule is the card's own divider and reads as a second card edge inside the
   panel, and its 16px side inset leaves those controls hanging off the grid
   that now starts at the panel's edge. Both go.

   Placed AFTER the rules it overrides, which is what stylelint's
   no-descending-specificity asks for. The cascade did not need it (this
   selector is more specific either way), a reader does: an override written
   above the thing it overrides has to be read twice. */
.cn-widget-wrapper--chromeless .cn-widget-wrapper__header[data-v-4dd77f59] {
	border-bottom: none;
	padding-inline: 0;
}
.cn-widget-wrapper__header-left[data-v-4dd77f59] {
	display: flex;
	align-items: center;
	gap: 8px;
	min-width: 0;
	/* Grow so the title hugs the (optional) title-icon on the left instead
	   of centering between icon and actions (header is space-between). */
	flex: 1 1 auto;
}
.cn-widget-wrapper__icon[data-v-4dd77f59] {
	width: 24px;
	height: 24px;
	flex-shrink: 0;
	color: var(--cn-widget-icon-color, var(--color-primary-element));
}
.cn-widget-wrapper__title[data-v-4dd77f59] {
	font-weight: 600;
	font-size: 14px;
	margin: 0;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-widget-wrapper.cn-widget-wrapper--nc-dashboard[data-v-4dd77f59] {
	background: var(--color-main-background-blur, var(--color-main-background));
	-webkit-backdrop-filter: var(--filter-background-blur, none);
	backdrop-filter: var(--filter-background-blur, none);
	border: none;
	border-radius: var(--border-radius-container-large, 16px);
}
.cn-widget-wrapper--nc-dashboard .cn-widget-wrapper__header[data-v-4dd77f59] {
	padding: 16px;
	border-bottom: none;
}
.cn-widget-wrapper--nc-dashboard .cn-widget-wrapper__header-left[data-v-4dd77f59] {
	gap: 16px;
}
.cn-widget-wrapper--nc-dashboard .cn-widget-wrapper__icon[data-v-4dd77f59] {
	width: 32px;
	height: 32px;
	background-size: 32px;
}
.cn-widget-wrapper--nc-dashboard .cn-widget-wrapper__title[data-v-4dd77f59] {
	font-size: 20px;
	font-weight: 700;
	line-height: 24px;
}
.cn-widget-wrapper--nc-dashboard .cn-widget-wrapper__content[data-v-4dd77f59] {
	padding: 0 16px 16px;
}
.cn-widget-wrapper__title-meta[data-v-4dd77f59] {
	display: flex;
	align-items: center;
	gap: 4px;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	flex-shrink: 0;
}
.cn-widget-wrapper__actions[data-v-4dd77f59] {
	display: flex;
	gap: 4px;
	flex-shrink: 0;
}

/* Every widget's header icon is coloured — `--cn-widget-icon-color` is set on
   the header from titleIconStyle, and defaults to the theme colour if a
   wrapper is ever rendered without it. Material-design-icon components paint
   with `fill: currentColor`, so this reaches them; the :deep rule below makes
   it reach a raw <svg> in the slot too. */
.cn-widget-wrapper__title-icon[data-v-4dd77f59] {
	display: flex;
	align-items: center;
	flex-shrink: 0;
	/* COLOURED BY DEFAULT. `--cn-widget-icon-color` is set on the header from
	   titleIconStyle; the theme colour is the fallback for a wrapper rendered
	   without it. Before this, the prop defaulted to null and the icon inherited
	   body text colour, which is why every widget header looked the same. */
	color: var(--cn-widget-icon-color, var(--color-primary-element));

	/* SPACE BETWEEN THE ICON AND THE TITLE.
	   This element is a sibling of `__header-left` inside a space-between
	   header, so it never received that element's `gap: 8px` — the icon sat
	   flush against the title text. Matching the header-left gap rather than
	   inventing a value keeps the two icon positions spaced identically. */
	margin-inline-end: 8px;
}

/* Right-positioned title icons sit AFTER the actions, so the margin belongs on
   the other side or it pushes the icon off the header's right edge. */
.cn-widget-wrapper__title-icon[data-v-4dd77f59]:last-child {
	margin-inline-end: 0;
	margin-inline-start: 8px;
}

/* Material-design-icon components paint with `fill: currentColor`, so the
   colour above reaches them; this makes it reach a raw <svg> in the slot too. */
.cn-widget-wrapper__title-icon[data-v-4dd77f59] svg {
	fill: currentcolor;
}
.cn-widget-wrapper__footer[data-v-4dd77f59] {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
	padding: 8px 16px;
	border-top: 1px solid var(--color-border);
	flex-shrink: 0;
}
.cn-widget-wrapper__footer-link[data-v-4dd77f59] {
	font-size: 13px;
	color: var(--color-primary-element);
	text-decoration: none;
}
.cn-widget-wrapper__footer-link[data-v-4dd77f59]:hover {
	text-decoration: underline;
}


.cn-related-objects-widget__group[data-v-44c2988f] {
	padding: calc(2 * var(--default-grid-baseline, 4px)) 0;
}
.cn-related-objects-widget__group + .cn-related-objects-widget__group[data-v-44c2988f] {
	border-top: 1px solid var(--color-border);
}
.cn-related-objects-widget__group-title[data-v-44c2988f] {
	display: flex;
	align-items: center;
	gap: 6px;
	margin: 0 0 4px;
	padding: 0 calc(2 * var(--default-grid-baseline, 4px));
	font-size: 0.8em;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	color: var(--color-text-maxcontrast);
}
.cn-related-objects-widget__tabs[data-v-44c2988f] {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
	padding: calc(1.5 * var(--default-grid-baseline, 4px)) calc(2 * var(--default-grid-baseline, 4px));
	border-bottom: 1px solid var(--color-border);
}
.cn-related-objects-widget__tab[data-v-44c2988f] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 10px;
	border: none;
	border-radius: var(--border-radius-pill, 16px);
	background: transparent;
	color: var(--color-main-text);
	cursor: pointer;
	font-size: 0.9em;
}
.cn-related-objects-widget__tab[data-v-44c2988f]:hover {
	background: var(--color-background-hover);
}
.cn-related-objects-widget__tab--active[data-v-44c2988f] {
	background: var(--color-primary-element-light, var(--color-background-dark));
	color: var(--color-primary-element-light-text, var(--color-main-text));
}
.cn-related-objects-widget__tab[data-v-44c2988f]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: -2px;
}
.cn-related-objects-widget__tab-icon[data-v-44c2988f] {
	flex: 0 0 auto;
}
.cn-related-objects-widget__panel-actions[data-v-44c2988f] {
	display: flex;
	justify-content: flex-end;
	padding: 4px calc(2 * var(--default-grid-baseline, 4px)) 0;
}
.cn-related-objects-widget__open-sidebar[data-v-44c2988f] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	padding: 2px 8px;
	border: none;
	background: transparent;
	color: var(--color-primary-element);
	cursor: pointer;
	font-size: 0.85em;
}
.cn-related-objects-widget__open-sidebar[data-v-44c2988f]:hover {
	text-decoration: underline;
}
.cn-related-objects-widget__count[data-v-44c2988f] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 18px;
	height: 18px;
	padding: 0 5px;
	border-radius: 9px;
	background: var(--color-background-dark);
	font-size: 0.9em;
	font-weight: 600;
}
.cn-related-objects-widget__list[data-v-44c2988f] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-related-objects-widget__row[data-v-44c2988f] {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 10px;
	padding: calc(1.5 * var(--default-grid-baseline, 4px)) calc(2 * var(--default-grid-baseline, 4px));
	cursor: pointer;
	border-radius: var(--border-radius);
}
.cn-related-objects-widget__detail[data-v-44c2988f] {
	flex-basis: 100%;
	margin: 4px 0 0 calc(20px + 10px);
	padding: 8px 10px;
	font-size: 0.9em;
	white-space: pre-wrap;
	overflow-wrap: anywhere;
	color: var(--color-main-text);
	background: var(--color-background-hover);
	border-radius: var(--border-radius);
}
.cn-related-objects-widget__row[data-v-44c2988f]:hover {
	background: var(--color-background-hover);
}
.cn-related-objects-widget__row[data-v-44c2988f]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: -2px;
}
.cn-related-objects-widget__icon[data-v-44c2988f] {
	flex: 0 0 auto;
	color: var(--color-text-maxcontrast);
}
.cn-related-objects-widget__label[data-v-44c2988f] {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
}
.cn-related-objects-widget__meta[data-v-44c2988f] {
	flex: 0 0 auto;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-related-objects-widget__chevron[data-v-44c2988f] {
	flex: 0 0 auto;
	color: var(--color-text-maxcontrast);
}
.cn-related-objects-widget__empty[data-v-44c2988f] {
	padding: calc(3 * var(--default-grid-baseline, 4px)) calc(2 * var(--default-grid-baseline, 4px));
	color: var(--color-text-maxcontrast);
	font-style: italic;
}
.cn-related-objects-widget__empty-state[data-v-44c2988f] {
	/* NcEmptyContent defaults to filling tall parents; inside a widget cell a
	   compact block reads better. */
	padding: calc(4 * var(--default-grid-baseline, 4px)) 0;
	margin: 0;
	color: var(--color-text-maxcontrast);
}
.cn-related-objects-widget__footer[data-v-44c2988f] {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline, 4px));
	padding: calc(2 * var(--default-grid-baseline, 4px));
}
.cn-related-objects-widget__add-error[data-v-44c2988f] {
	color: var(--color-error);
	font-size: 0.85em;
}
.cn-related-objects-widget__file-input[data-v-44c2988f] {
	display: none;
}


.cn-related-form[data-v-1e766e8f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-related-form__section[data-v-1e766e8f] {
	margin: 8px 0 0;
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--color-text-maxcontrast);
}
.cn-related-form__hint[data-v-1e766e8f] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}


.cn-transition-input[data-v-1529f8b6] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 4px 0;
}

/* =============================================
   CnTimelineStages — Timeline / progress stages
   ============================================= */

/* ---------- Root container ---------- */
.cn-timeline-stages {
	display: flex;
	align-items: flex-start;
	gap: 0;
	width: 100%;
}

/* Horizontal: left-to-right, scrollable overflow */
.cn-timeline-stages--horizontal {
	flex-direction: row;
	overflow-x: auto;
	padding-bottom: calc(var(--default-grid-baseline, 4px) * 1);
}

/* Vertical: top-to-bottom */
.cn-timeline-stages--vertical {
	flex-direction: column;
}

/* ---------- Stage node ---------- */
.cn-timeline-stages__stage {
	display: flex;
	flex-direction: column;
	align-items: center;
	position: relative;
	flex: 1 1 0;
	min-width: calc(var(--default-grid-baseline, 4px) * 20); /* 80px */
	text-align: center;
	padding: calc(var(--default-grid-baseline, 4px) * 1);
	border-radius: var(--border-radius-large, 10px);
	transition: background-color 0.15s ease;
}

/* Vertical stages: row layout, TOP aligned.
   It used to be `center`, which centred the indicator and the label against the
   tallest thing in the row. A stage carrying a reason is taller than one
   without, so the label of that one stage slid down out of line with every
   other label on the strip, and the indicator with it. Top alignment makes the
   indicator, the label and anything under it start on the same line whatever
   the row contains. The horizontal variant is unaffected: there the stage is a
   COLUMN, so its `align-items: center` centres the label under the indicator
   horizontally and has nothing to do with vertical drift. */
.cn-timeline-stages--vertical .cn-timeline-stages__stage {
	flex-direction: row;
	align-items: flex-start;
	text-align: left;
	min-width: 0;
	gap: calc(var(--default-grid-baseline, 4px) * 3);
}

/* ---------- Track line (horizontal) ---------- */
.cn-timeline-stages--horizontal .cn-timeline-stages__stage + .cn-timeline-stages__stage::before {
	content: '';
	position: absolute;
	/* Indicator sits below the stage's top padding (4px), so its vertical
	   center is at padding-top + indicator-radius = 4px + 16px = 20px.
	   Subtract 1px (half the line height) to center the 2px line on it. */
	top: calc(var(--default-grid-baseline, 4px) * 1 + 16px - 1px);
	right: calc(50% + 16px + 4px);
	left: calc(-50% + 16px + 4px);
	height: 2px;
	background-color: var(--color-border, #ededed);
	z-index: 0;
}

/* Completed + current track segments: filled */
.cn-timeline-stages--horizontal .cn-timeline-stages__stage--completed + .cn-timeline-stages__stage::before,
.cn-timeline-stages--horizontal .cn-timeline-stages__stage--completed + .cn-timeline-stages__stage--current::before {
	background-color: var(--color-success-text, var(--color-success, #46ba61));
}

/* ---------- Track line (vertical) ---------- */
/* THE LINE HAS TO STAY ON THE CIRCLES, and top alignment is what makes that
   possible rather than what breaks it.
   It used to hang off the FOLLOWING stage and reach upwards by a percentage of
   that stage's own height, which only found the previous circle when every row
   was exactly as tall as its neighbour. It was written that way because
   `align-items: center` put the circle at 50% of a row whose height nothing
   controlled, so there was no fixed number to aim at. One stage carrying a
   reason was enough to slide the line off the circles.
   Top aligned, the circle's centre is a CONSTANT: the row's top padding (4px)
   plus the indicator's radius (16px). So each stage draws the segment BELOW
   itself, from its own centre (20px down from its top edge) to the next stage's
   centre (20px past its bottom edge, where the next row begins, since the
   vertical container has no gap between stages). Both ends are exact numbers,
   the line runs down the middle of every circle whatever a row contains, and
   the last stage draws nothing because there is nothing under it to reach. */
.cn-timeline-stages--vertical .cn-timeline-stages__stage:not(:last-child)::before {
	content: '';
	position: absolute;
	left: calc(var(--default-grid-baseline, 4px) * 1 + 16px - 1px); /* center of 32px indicator, minus half line width */
	top: calc(var(--default-grid-baseline, 4px) * 1 + 16px); /* this indicator's center */
	bottom: calc((var(--default-grid-baseline, 4px) * 1 + 16px) * -1); /* the next indicator's center */
	width: 2px;
	background-color: var(--color-border, #ededed);
	z-index: 0;
}

/* Completed track segments: filled (vertical). The segment under a completed
   stage is the one the record has travelled, which is what it was before as
   well: the rule moved with the pseudo-element, from "the stage after a
   completed one" to "the completed stage itself". */
.cn-timeline-stages--vertical .cn-timeline-stages__stage--completed:not(:last-child)::before {
	background-color: var(--color-success-text, var(--color-success, #46ba61));
}

/* ---------- Indicator (circle) ---------- */
.cn-timeline-stages__indicator {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	flex-shrink: 0;
	position: relative;
	z-index: 1;
	border: 2px solid var(--color-border, #ededed);
	background-color: var(--color-main-background, #fff);
	transition: background-color 0.15s ease, border-color 0.15s ease;
}

/* Completed indicator: success green with white icon */
.cn-timeline-stages__stage--completed .cn-timeline-stages__indicator {
	background-color: var(--color-success-text, var(--color-success, #46ba61));
	border-color: var(--color-success-text, var(--color-success, #46ba61));
	color: #fff;
}

/* Current indicator: primary blue */
.cn-timeline-stages__stage--current .cn-timeline-stages__indicator {
	background-color: var(--color-primary-element, #0082c9);
	border-color: var(--color-primary-element, #0082c9);
	color: var(--color-primary-element-text, #fff);
}

/* ---------- Checkmark SVG ---------- */
.cn-timeline-stages__checkmark {
	width: 16px;
	height: 16px;
}

/* ---------- Current dot ---------- */
.cn-timeline-stages__dot {
	display: block;
	width: 10px;
	height: 10px;
	border-radius: 50%;
	background-color: currentColor;
}

/* ---------- Label ---------- */
.cn-timeline-stages__label {
	display: block;
	margin-top: calc(var(--default-grid-baseline, 4px) * 1);
	font-size: 0.9em;
	line-height: 1.3;
	color: var(--color-text-maxcontrast, #767676);
	overflow-wrap: anywhere;
}

/* Vertical: label aligns with indicator center */
.cn-timeline-stages--vertical .cn-timeline-stages__label {
	margin-top: 0;
}

/* Completed stage label */
.cn-timeline-stages__stage--completed .cn-timeline-stages__label {
	color: var(--color-main-text, #222);
}

/* Current stage label: bold and prominent */
.cn-timeline-stages__stage--current .cn-timeline-stages__label {
	color: var(--color-main-text, #222);
	font-weight: bold;
}

/* ---------- Subtitle ---------- */
.cn-timeline-stages__subtitle {
	display: block;
	font-size: 0.8em;
	line-height: 1.3;
	color: var(--color-text-maxcontrast, #767676);
	margin-top: 2px;
}

/* ---------- Small size variant ---------- */
.cn-timeline-stages--small .cn-timeline-stages__indicator {
	width: 20px;
	height: 20px;
}

.cn-timeline-stages--small .cn-timeline-stages__checkmark {
	width: 12px;
	height: 12px;
}

.cn-timeline-stages--small .cn-timeline-stages__dot {
	width: 6px;
	height: 6px;
}

.cn-timeline-stages--small .cn-timeline-stages__label {
	font-size: 0.85em;
}

.cn-timeline-stages--small .cn-timeline-stages__stage {
	min-width: calc(var(--default-grid-baseline, 4px) * 14); /* 56px */
}

/* Small horizontal track line offset */
.cn-timeline-stages--small.cn-timeline-stages--horizontal .cn-timeline-stages__stage + .cn-timeline-stages__stage::before {
	top: calc(var(--default-grid-baseline, 4px) * 1 + 10px - 1px); /* padding + indicator radius, minus half line height */
	right: calc(50% + 10px + 4px);
	left: calc(-50% + 10px + 4px);
}

/* Small vertical track line offset: the same three numbers with a 20px
   indicator, so its 10px radius replaces the 16px one. */
.cn-timeline-stages--small.cn-timeline-stages--vertical .cn-timeline-stages__stage:not(:last-child)::before {
	left: calc(var(--default-grid-baseline, 4px) * 1 + 10px - 1px); /* center of 20px indicator, minus half line width */
	top: calc(var(--default-grid-baseline, 4px) * 1 + 10px);
	bottom: calc((var(--default-grid-baseline, 4px) * 1 + 10px) * -1);
}

/* ---------- Clickable mode ---------- */
.cn-timeline-stages--clickable .cn-timeline-stages__stage {
	cursor: pointer;
}

.cn-timeline-stages--clickable .cn-timeline-stages__stage:hover {
	background-color: var(--color-background-dark, #ededed);
}

/* A stage that cannot be chosen keeps its focus stop but reads as inert.
   It must also LOOK different from a stage that is merely later in the
   process: dimmed, with a not-allowed cursor. Without the dimming the only
   difference a sighted person could perceive was the cursor, which nobody
   notices, so a blocked stage and an upcoming one were the same picture. */
.cn-timeline-stages--clickable .cn-timeline-stages__stage--disabled:not(.cn-timeline-stages__stage--blocked) {
	cursor: not-allowed;
	opacity: 0.55;
}

/* The dimming must not take the reason with it: an explanation nobody can read
   is the state this rule exists to fix. */
.cn-timeline-stages--clickable .cn-timeline-stages__stage--disabled .cn-stages-widget__reason {
	opacity: 1;
	color: var(--color-text-maxcontrast);
}

/* The stage the record is ON is not a move, and it is not blocked either. It
   carries no `aria-disabled` and no not-allowed cursor: both said "you may not
   go here" about the place the record already is. It simply offers nothing. */
.cn-timeline-stages--clickable .cn-timeline-stages__stage--current {
	cursor: default;
}

.cn-timeline-stages--clickable .cn-timeline-stages__stage--current:hover {
	background-color: transparent;
}

.cn-timeline-stages--clickable .cn-timeline-stages__stage--disabled:hover {
	background-color: transparent;
}

/* Dashed says "later in the process". A refused stage is not that, and takes
   the warning treatment below instead. */
.cn-timeline-stages--clickable .cn-timeline-stages__stage--upcoming.cn-timeline-stages__stage--disabled:not(.cn-timeline-stages__stage--blocked) .cn-timeline-stages__indicator {
	border-style: dashed;
}

/* ---------- Refused: a guard said no ---------- */
/* A STAGE A GUARD REFUSED IS NOT A STAGE THAT IS SIMPLY NEXT WEEK, and it must
   not look like one. On a real case page every stage the record could not reach
   rendered in the same grey, so the one the person was aiming at was the
   faintest thing on the strip and the whole timeline read as broken rather than
   as guarded.
   Dimming is right for "not your step yet" and wrong here, so a refused stage
   keeps full contrast and takes the warning colour. Only the stages a guard
   actually refused get it: if everything is orange, nothing reads as refused,
   which is why the merely-unreachable ones are deliberately left grey.
   There is no error-coloured variant, because `available-actions` answers one
   boolean, `blocked: true`, and no severity beside it. Splitting the colour
   into "refused" and "refused harder" would encode a distinction nobody sent. */
.cn-timeline-stages--clickable .cn-timeline-stages__stage--blocked {
	cursor: not-allowed;
}

.cn-timeline-stages--clickable .cn-timeline-stages__stage--blocked .cn-timeline-stages__indicator {
	border-color: var(--color-warning-text, var(--color-warning, #e9a300));
	color: var(--color-warning-text, var(--color-warning, #e9a300));
}

.cn-timeline-stages--clickable .cn-timeline-stages__stage--blocked .cn-timeline-stages__label {
	color: var(--color-warning-text, var(--color-warning, #e9a300));
}

/* The exclamation mark inside a refused indicator: the part of the signal that
   survives a reader who cannot tell orange from grey. */
.cn-timeline-stages__alert {
	width: 16px;
	height: 16px;
}

.cn-timeline-stages--small .cn-timeline-stages__alert {
	width: 12px;
	height: 12px;
}

/* Focus ring (keyboard only) */
.cn-timeline-stages--clickable .cn-timeline-stages__stage:focus-visible {
	outline: 2px solid var(--color-primary-element, #0082c9);
	outline-offset: 2px;
}

/* Remove default outline for mouse clicks */
.cn-timeline-stages--clickable .cn-timeline-stages__stage:focus:not(:focus-visible) {
	outline: none;
}


.cn-stages-widget[data-v-358fde0f] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	min-width: 0;
	width: 100%;
}
.cn-stages-widget__loading[data-v-358fde0f] {
	display: flex;
	justify-content: center;
	padding: 8px 0;
}
.cn-stages-widget__notice[data-v-358fde0f] {
	margin: 0;
	color: var(--color-text-maxcontrast);
}

/* What a reachable move says it will do, beside the stage it leads to. The
   REFUSALS no longer come through here: they are a tooltip, a note card and a
   screen-reader node, which is why there is no colour variant of this rule.
   The rules for the two coloured states are NcNoteCard's own. */
.cn-stages-widget__reason[data-v-358fde0f] {
	display: block;
	margin-top: 2px;
	font-size: 0.8em;
	line-height: 1.3;
	color: var(--color-text-maxcontrast);
}

/* Text for screen readers only. */
.cn-stages-widget__sr-only[data-v-358fde0f] {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}


.cn-stages-form[data-v-74c9560f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-stages-form__section[data-v-74c9560f] {
	margin: 8px 0 0;
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--color-text-maxcontrast);
}
.cn-stages-form__hint[data-v-74c9560f] {
	margin: 0;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-stages-form__row[data-v-74c9560f] {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	align-items: flex-end;
}
.cn-stages-form__row[data-v-74c9560f] > * {
	flex: 1 1 140px;
	min-width: 0;
}

/* ========================================
   @conduction/nextcloud-vue — The KPI card
   ======================================== */

/*
 * ONE canonical KPI look, for every app.
 *
 * There were two. `CnStatsBlock` (OpenCatalogi's KPIs) drew a grey card with a
 * circular tinted icon above a large coloured number; `CnStatWidget` (dossiq's)
 * drew a transparent row with the icon beside a smaller number. Two components
 * meant two designs, and the same dashboard read as two products.
 *
 * The visual contract now lives HERE, in one stylesheet, under one class
 * family, and both components render that markup. Neither owns the look any
 * more, so they cannot drift apart again: changing this file changes both.
 * Each component keeps its own legacy class names on the same elements for
 * backwards compatibility with app CSS that targets them.
 *
 * WHAT THE CANONICAL CARD LOOKS LIKE — changed 2026-08-30. It was OpenCatalogi's
 * grey box with the icon stacked ABOVE a centred number. It is now pipelinq's
 * "Gewonnen deals" tile: no fill of its own, and a large circular icon BESIDE
 * the number, both left-aligned.
 *
 * The reason is the box, not the taste. Every KPI already sits inside a
 * `CnWidgetWrapper`, which draws the white bordered card. A card that also
 * drew its own grey fill produced a box inside a box on every dashboard in the
 * fleet, and the one tile that looked right — the `delta` widget — looked right
 * only because it had never joined this stylesheet and hand-rolled the two
 * rules below. Making the odd one out the standard is what removes the nesting.
 *
 * So the base class is now flat and horizontal, and the OLD look is the opt-in:
 * `--filled` puts the grey box back, `--vertical` stacks the icon again. The
 * `--flat` and `--horizontal` modifiers are kept as no-ops so existing markup
 * and app CSS that names them keeps matching.
 *
 * Colours are Nextcloud tokens throughout — never literals. The nldesign app
 * re-themes by overriding those variables, so a hardcoded hex would opt the
 * card out of government theming (NL Design System).
 */

/* ----------------------------------------
   The KPI scale
   ----------------------------------------

   Every number that decides what a KPI LOOKS like is declared once, here, and
   read by `var()` everywhere else — in this sheet and in the scoped blocks of
   the components that render KPI-shaped content but are not themselves a card
   (CnKpiGrid's tracks, CnStatsPanel's sections, CnFederationStatus's summary
   row). A component that wants the canonical treatment consumes the token; it
   does not restate the value. That is the whole anti-drift mechanism: a
   restated value is a value that can be changed in one place and not the
   other, which is exactly how the library ended up with several KPI looks.

   They live on `:root` rather than on `.cn-kpi-card` so a component that is
   NOT a card can still read them. Every `var()` below also carries the
   literal as its fallback, so a consumer that somehow loads a component
   without this sheet still renders at the canonical size instead of at the
   browser default.

   An app may re-scale every KPI in one declaration by overriding these on
   `:root` — that is a supported use, and preferable to per-app overrides of
   the class names below. */
:root {
	/* Box */
	/* The default card draws no fill, so it needs only enough padding to keep
	   the icon off the wrapper's border. `--cn-kpi-padding` is what a `--filled`
	   card uses, where the padding has a visible box to sit inside. */
	--cn-kpi-padding-flat: 8px;
	--cn-kpi-padding: 16px;
	--cn-kpi-gap: 8px;
	--cn-kpi-gap-horizontal: 16px;
	--cn-kpi-radius: var(--border-radius-large, 10px);
	/* The gutter BETWEEN tiles — a CnKpiGrid's tracks, a CnStatsPanel stack,
	   the entries a CnStatsBlockWidget stacks inside one widget. One value, so
	   three surfaces that show the same tiles space them the same way. */
	--cn-kpi-grid-gap: 16px;
	--cn-kpi-stack-gap: 12px;

	/* Icon */
	--cn-kpi-icon-size: 44px;
	--cn-kpi-icon-size-sm: 36px;
	/* Share of the semantic colour mixed into the icon's circle. */
	--cn-kpi-icon-tint: 12%;

	/* Title — the name of the thing being counted. */
	--cn-kpi-title-size: 14px;
	--cn-kpi-title-weight: 600;

	/* Value — the number itself, the point of the tile.

	   The canonical card is horizontal, which spends ~60px of the tile's width
	   on the icon and its gap. At 2rem a six-figure currency value ("€224,070")
	   overflowed that remaining width and was CLIPPED by the card's
	   `overflow: hidden` — a KPI showing "€224,0" is worse than a smaller one,
	   because a truncated number still reads as a number. The stacked card gets
	   the full width back and keeps 2rem (see `--vertical`). */
	--cn-kpi-value-size: 1.75rem;
	--cn-kpi-value-size-stacked: 2rem;
	/* A KPI number rendered inline in a dense row (a summary strip, a list
	   header) rather than alone on a tile. Same family, same weight, same
	   colour rules — one step down in size so it does not out-shout the row
	   it sits in. */
	--cn-kpi-value-size-compact: 1.25rem;
	--cn-kpi-value-weight: 700;
	--cn-kpi-value-line: 1.1;

	/* Label — the unit or qualifier beside the number, and every piece of
	   secondary KPI text (captions, breakdowns, empty and loading lines). */
	--cn-kpi-label-size: 13px;
	--cn-kpi-label-color: var(--color-text-maxcontrast);

	/* Section heading above a group of KPIs. */
	--cn-kpi-section-title-size: 14px;

	/* The tile's semantic colour. The variant modifiers below re-point THIS,
	   and the icon and the value both read it — so a card can never say
	   "success" with its icon and "primary" with its number. */
	--cn-kpi-accent: var(--color-primary-element);
}

/* The canonical card: icon beside the number, left-aligned, no fill of its own.
   The surrounding CnWidgetWrapper is what draws the visible card. */
.cn-kpi-card {
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: flex-start;
	gap: var(--cn-kpi-gap-horizontal, 16px);
	width: 100%;
	height: 100%;
	min-width: 0;
	min-height: 64px;
	padding: var(--cn-kpi-padding-flat, 8px);
	box-sizing: border-box;
	overflow: hidden;
	text-align: left;
	text-decoration: none;
	color: inherit;
	background: transparent;
	border: 2px solid transparent;
	border-radius: var(--cn-kpi-radius, 10px);
	transition: border-color 0.15s ease, box-shadow 0.15s ease;
	/* The tile sizes its own number — see the container query below. */
	container-type: inline-size;
	container-name: cn-kpi;
}


/* The icon: a circle tinted from the card's own semantic colour. `color-mix`
   rather than a frozen rgba() so a re-themed palette re-tints it too. */
.cn-kpi-card__icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: var(--cn-kpi-icon-size, 44px);
	height: var(--cn-kpi-icon-size, 44px);
	border-radius: 50%;
	flex-shrink: 0;
	color: var(--cn-kpi-accent, var(--color-primary-element));
	background: color-mix(in srgb, var(--cn-kpi-accent, var(--color-primary-element)) var(--cn-kpi-icon-tint, 12%), transparent);
}

.cn-kpi-card__icon svg {
	fill: currentcolor;
}

.cn-kpi-card__title {
	margin: 0;
	font-size: var(--cn-kpi-title-size, 14px);
	font-weight: var(--cn-kpi-title-weight, 600);
	color: var(--color-main-text);
	/* One line, ellipsised. A two-line `-webkit-line-clamp` was tried and
	   removed: this element is ALSO the flex row that carries CnStatWidget's
	   range select, and `display: -webkit-box` cannot be both. The clamp lost
	   to the scoped `display: flex` and silently did nothing, which is worse
	   than not attempting it. Each component sets `title` on the element, so
	   the full name is still reachable on hover. */
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	max-width: 100%;
}

/* The stack between the icon and the card edge: title, value row, and
   whatever else the component puts inside (a breakdown, an empty line).
   Canonical rather than per-component, because a body that stacks one way in
   CnStatsBlock and another in CnStatWidget is two looks again — the spacing
   between a title and its number is part of the KPI's identity. */
.cn-kpi-card__body {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 2px;
	/* Takes whatever the icon leaves, and is allowed to shrink below its
	   content's intrinsic width — without `min-width: 0` a flex item refuses to
	   shrink past its longest word, which is what pushed the number out of the
	   card in the first place. */
	flex: 1 1 auto;
	min-width: 0;
	max-width: 100%;
}

.cn-kpi-card__value-row {
	display: flex;
	align-items: baseline;
	justify-content: flex-start;
	gap: 6px;
	max-width: 100%;
	min-width: 0;
}

/* The number is the point of the card, so it never shrinks and never wraps —
   the decoration around it is what gives way in a narrow tile. */
.cn-kpi-card__value {
	flex: 0 0 auto;
	font-size: var(--cn-kpi-value-size, 2rem);
	font-weight: var(--cn-kpi-value-weight, 700);
	line-height: var(--cn-kpi-value-line, 1.1);
	white-space: nowrap;
	color: var(--cn-kpi-accent, var(--color-primary-element));
}

/* A TEXT value is a different shape from a number and needs the opposite rule.
   `objectField` lets a tile headline a name ("Omgevingsvergunning kleine
   bouwactiviteit") instead of a count, and the no-wrap rule above pushed it
   straight out of the card. Text shrinks, wraps and clamps to two lines; a
   number still never does. */
.cn-kpi-card__value--text {
	flex: 0 1 auto;
	min-width: 0;
	font-size: var(--cn-kpi-value-text-size, 1.25rem);
	line-height: 1.2;
	white-space: normal;
	overflow-wrap: anywhere;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.cn-kpi-card__label {
	flex: 1 1 auto;
	min-width: 0;
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* Semantic variants. Each re-points the ONE accent token, so the icon tint
   and the number move together by construction — there is no second place to
   forget. The inline KPI below shares the same modifiers for the same reason:
   `success` must mean one colour across every KPI surface, not one per class
   family.

   THE `-text` TOKENS, NOT THE PLAIN ONES: the accent paints the NUMBER, not
   just the icon tint. Nextcloud's `--color-success` / `--color-warning` /
   `--color-error` are FILL colours meant to sit behind something; DefaultTheme
   ships `--color-success-text` and friends for foreground use. Using a fill as
   a text colour failed WCAG AA — axe measured `#d8f3da` on `#f5f5f5`, a
   contrast of 1.08 against the required 3:1, serious, on filinq's dashboard
   (gate-33, run 33261801989). Only `success` was on screen there; `warning`
   and `error` carried the same defect unrendered.

   Each keeps the plain token as a fallback, so a theme predating the `-text`
   tokens degrades to the old colour rather than to none. */
.cn-kpi-card--success,
.cn-kpi-inline--success { --cn-kpi-accent: var(--color-success-text, var(--color-success)); }

.cn-kpi-card--warning,
.cn-kpi-inline--warning { --cn-kpi-accent: var(--color-warning-text, var(--color-warning)); }

.cn-kpi-card--error,
.cn-kpi-inline--error { --cn-kpi-accent: var(--color-error-text, var(--color-error)); }

/* No semantic reading at all — a count that is neither good nor bad (an
   "unknown" bucket). Muted rather than coloured, so it cannot be mistaken for
   a status. */
.cn-kpi-inline--muted { --cn-kpi-accent: var(--color-text-maxcontrast); }

/* Clickable card (a `route`/`link` on the widget, or `clickable` on the block). */
.cn-kpi-card--clickable {
	cursor: pointer;
}

.cn-kpi-card--clickable:hover {
	border-color: var(--color-primary-element);
	box-shadow: 0 2px 8px var(--color-box-shadow);
}

.cn-kpi-card--clickable:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}

/* ── Card-fit tiles: the WRAPPER is the card, so the hover goes on the wrapper ──
   A stat / gauge / delta tile is rendered `flush` and then given its padding
   back by the card-fit rule (`padding: 8px 14px`, CnDashboardPage), so that a
   short KPI tile does not scroll. That leaves the KPI INSET inside the
   wrapper, and the wrapper is what draws the border, the radius and the
   background the user reads as "the card".

   The `--clickable:hover` border above therefore paints a SECOND rounded box
   8-14px inside the first, which reads as a card inside a card. Measured: a
   card-fit stat widget sits 9px from the wrapper's top and 15px from its left,
   while a non-card-fit stats block sits at 1px and so lands on the wrapper's
   own edge. That is the whole difference, and it is why only the card-fit
   variants show the effect.

   So: suppress the inner border, and give the affordance to the wrapper, which
   is the edge being hovered. `:has()` is Baseline since 2023 and is already
   used across this stylesheet set (table.css, dashboard.css, detail-page.css).
   Both card-fit hosts are covered: dashboard pages and detail pages. */
.cn-dashboard-page__card-fit .cn-kpi-card--clickable:hover,
.cn-detail-page__card-fit .cn-kpi-card--clickable:hover {
	border-color: transparent;
	box-shadow: none;
}

.cn-dashboard-page__card-fit:has(.cn-kpi-card--clickable:hover),
.cn-detail-page__card-fit:has(.cn-kpi-card--clickable:hover) {
	border-color: var(--color-primary-element);
	box-shadow: 0 2px 8px var(--color-box-shadow);
}

/* Vertical: the icon stacked ABOVE a centred number — the pre-2026-08-30
   canonical look, now opt-in via `content.layout: 'vertical'`. For a tile that
   is taller than it is wide, where a sideways row would leave the card empty
   down its middle. */
.cn-kpi-card--vertical {
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: var(--cn-kpi-gap, 8px);
	text-align: center;
}

.cn-kpi-card--vertical .cn-kpi-card__body {
	align-items: center;
	text-align: center;
}

.cn-kpi-card--vertical .cn-kpi-card__value-row {
	justify-content: center;
}

/* Stacked: the number gets the card's full width back, so it takes the larger
   size, and the title fits on one line again. */
.cn-kpi-card--vertical .cn-kpi-card__value {
	font-size: var(--cn-kpi-value-size-stacked, 2rem);
}

/* Filled: the card draws its own grey box, for a KPI that is NOT already
   inside a wrapper that draws one. Opt-in via `content.flat: false`. */
.cn-kpi-card--filled {
	padding: var(--cn-kpi-padding, 16px);
	background: var(--color-background-hover);
}

/* Compact: a smaller icon, for a tile too short to give a 44px circle room. */
.cn-kpi-card--compact .cn-kpi-card__icon {
	width: var(--cn-kpi-icon-size-sm, 36px);
	height: var(--cn-kpi-icon-size-sm, 36px);
}

/* `--horizontal` and `--flat` ARE the base card since 2026-08-30, so this
   sheet deliberately declares NO rule for either. Both names are still emitted
   onto the element by CnStatWidget and CnStatsBlock and are still matched by
   app CSS in the field — they just no longer need to carry anything.
   Do NOT "restore" them as rules that re-assert the base: `--flat` is emitted
   alongside `--vertical` on a flat vertical tile, so a `flex-direction: row`
   here would silently un-stack it. */

/* ----------------------------------------
   The inline KPI
   ----------------------------------------

   A number and its label rendered IN a row — a summary strip above a list, a
   status roll-up in a panel header — rather than alone on a tile. Not every
   KPI earns a card: a four-way "3 up / 1 degraded / 0 down" roll-up above a
   node list is one line of context, and boxing each count would out-weigh the
   list it introduces.

   So the box is dropped and nothing else is. The number keeps the card's
   weight, line-height and accent colour and steps down one size
   (`--cn-kpi-value-size-compact`); the label keeps the card's label size and
   colour; the variant modifiers are literally the card's own. It reads as the
   same design at a different density, which is the whole point — the
   alternative, a bespoke `0.85em` count with an inherited colour, is a second
   KPI look wearing a different class name. */
.cn-kpi-inline {
	display: inline-flex;
	align-items: baseline;
	gap: 6px;
	min-width: 0;
}

.cn-kpi-inline__value {
	flex: 0 0 auto;
	font-size: var(--cn-kpi-value-size-compact, 1.25rem);
	font-weight: var(--cn-kpi-value-weight, 700);
	line-height: var(--cn-kpi-value-line, 1.1);
	white-space: nowrap;
	color: var(--cn-kpi-accent, var(--color-primary-element));
}

.cn-kpi-inline__label {
	min-width: 0;
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* The `--flat` rule that used to live here is gone: dropping the box IS the
   base card now, so the modifier had nothing left to declare. See the note
   beside `--filled` above for why the class is still emitted. */

/* ----------------------------------------
   Narrow tiles
   ----------------------------------------

   THIS BLOCK MUST STAY LAST. A container query carries no extra specificity —
   `.cn-kpi-card__value` inside it and the base `.cn-kpi-card__value` above are
   equal, so whichever comes later wins. It was written directly beneath
   `.cn-kpi-card`, ABOVE the base rule, and therefore never applied: measured
   live on pipelinq, a 173px tile still rendered its value at 1.75rem and
   "€224,070" was clipped by the card's `overflow: hidden`. Appending the very
   same rule last took it to 1.25rem and the number fitted.

   The first verification missed it because it injected the rule with
   `!important`, which hides exactly this class of ordering bug. */
/* A narrow tile steps its number down rather than clipping it.
   A three-column KPI leaves roughly 130px beside the icon, which a six-figure
   currency value overruns at the full size; the card's `overflow: hidden` then
   cuts it mid-digit, and "€224,0" reads as a number rather than as damage.
   Keyed to the CARD, not the viewport: the same tile is narrow at 3 columns on
   a desktop and wide at 12 on a phone, so a media query would size it by the
   wrong box.

   The ICON deliberately does not shrink with it. A large circular icon beside
   the number is the identity of this card, and 44px of a 173px tile still
   leaves the value room once it steps down; shrinking both made the tile read
   as a different, smaller component. */
@container cn-kpi (max-width: 230px) {
	.cn-kpi-card__value {
		font-size: var(--cn-kpi-value-size-compact, 1.25rem);
	}
}


/*
 * The card's own look — box, body stack, icon circle, title, value, variants,
 * hover — is the CANONICAL KPI card in src/css/kpi-card.css, shared with
 * CnStatWidget. The rules that lived here duplicated it in different numbers
 * (a 1.2rem count row, a 40px icon, hardcoded rgba() tints that ignored a
 * re-themed palette), and that duplication IS how the two KPI looks drifted.
 * What is left below is this component's own extras: the breakdown block, the
 * loading line and the empty line.
 *
 * Those extras are secondary KPI text, so they read the shared
 * `--cn-kpi-label-*` scale rather than carrying sizes of their own — an empty
 * state that is a different size from the label it replaces is the same drift
 * in miniature.
 */
.cn-stats-block__header[data-v-722d9aef] {
	max-width: 100%;
	min-width: 0;
}
.cn-stats-block__loading[data-v-722d9aef] {
	display: flex;
	align-items: center;
	justify-content: flex-start;
	gap: 6px;
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
}
.cn-stats-block__empty[data-v-722d9aef] {
	text-align: start;
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	font-style: italic;
}
.cn-stats-block__breakdown[data-v-722d9aef] {
	margin-top: 4px;
	padding: 8px;
	font-size: var(--cn-kpi-label-size, 13px);
	background: var(--color-background-hover);
	border-radius: var(--border-radius);
	border: 1px solid var(--color-border);
	width: 100%;
	text-align: start;
}
.cn-stats-block__breakdown-item[data-v-722d9aef] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: 8px;
	margin-bottom: 4px;
}
.cn-stats-block__breakdown-item[data-v-722d9aef]:last-child {
	margin-bottom: 0;
}
.cn-stats-block__breakdown-label[data-v-722d9aef] {
	font-weight: 500;
	color: var(--color-main-text);
}

/* The value takes the card's accent, so a breakdown reads as part of the tile
   it sits in rather than as a table that happened to land there. It used to
   carry a `--color-background-hover` chip — on a `--color-background-hover`
   breakdown box, which is to say an invisible chip drawn at the cost of two
   extra declarations and a differently-shaped hit area. The per-key modifiers
   below still win: `invalid`, `deleted` and `published` mean something
   specific and outrank the tile's own colour. */
.cn-stats-block__breakdown-value[data-v-722d9aef] {
	font-weight: var(--cn-kpi-title-weight, 600);
	color: var(--cn-kpi-accent, var(--color-primary-element));
}
.cn-stats-block__breakdown-value--invalid[data-v-722d9aef] { color: var(--color-element-warning);
}
.cn-stats-block__breakdown-value--deleted[data-v-722d9aef] { color: var(--color-element-error);
}
.cn-stats-block__breakdown-value--published[data-v-722d9aef] { color: var(--color-element-success);
}


/*
 * This widget draws no KPI of its own — every tile it shows is a CnStatsBlock,
 * so the canonical card in src/css/kpi-card.css is already what a reader sees.
 * All that is left here is how N of those tiles stack inside one widget, and
 * that spacing comes from the shared `--cn-kpi-stack-gap` so a multi-entry
 * widget and a CnStatsPanel stack of the same tiles are spaced identically.
 */
/*
 * Fill the host cell rather than sizing to content.
 *
 * 🔴 WITHOUT THIS THE WIDGET COLLAPSES TO THE WIDTH OF ITS ICON, and the
 * number it exists to show is clipped to a sliver. Measured on a live
 * instance: a 282px `.cn-widget-wrapper__content` held a 20px widget, a 20px
 * `.cn-kpi-card` and a 0px `.cn-kpi-card__body`. 20px is the icon.
 *
 * The mechanism is a sizing cycle, which is why the KPI card's own CSS looks
 * correct in isolation and is. `.cn-widget-wrapper__content` is `display:
 * flex`, so this root is a flex ITEM and defaults to `flex: 0 1 auto` —
 * content-sized. Its content is `.cn-kpi-card { width: 100% }`, which resolves
 * against THIS element, which is resolving against its content. The card's
 * body carries `min-width: 0` (deliberately, so a long number can shrink
 * instead of overflowing), so the cycle settles with the body at zero and only
 * the icon's intrinsic width surviving.
 *
 * `flex: 1 1 auto` + `width: 100%` gives the card a definite width to resolve
 * against and breaks the cycle; `min-width: 0` keeps the shrink behaviour the
 * body's rule was written for.
 *
 * On the BASE class, not `--multi`: both the single-source and multi-entry
 * modes render this root, so both collapse. The bug was found on a
 * single-entry stats-block.
 */
.cn-stats-block-widget[data-v-4f8583ef] {
	flex: 1 1 auto;
	min-width: 0;
	width: 100%;
}
.cn-stats-block-widget--multi[data-v-4f8583ef] {
	display: flex;
	flex-direction: column;
	gap: var(--cn-kpi-stack-gap, 12px);
}


.cn-stats-block-form[data-v-20f3b26f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-stats-block-form__section[data-v-20f3b26f] {
	margin: 8px 0 0;
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--color-text-maxcontrast);
}
.cn-stats-block-form__row2[data-v-20f3b26f] {
	display: flex;
	gap: 12px;
	align-items: flex-end;
}
.cn-stats-block-form__row2[data-v-20f3b26f] > * {
	flex: 1;
	min-width: 0;
}


.cn-leaf-mount-host[data-v-167bbf41] {
	display: flex;
	flex-direction: column;
	min-height: 0;
	height: 100%;
}
.cn-leaf-mount-host__container[data-v-167bbf41] {
	flex: 1 1 auto;
	min-height: 0;
}
.cn-leaf-mount-host__error[data-v-167bbf41] {
	padding: 20px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}


.cn-translated-badge[data-v-115288d6] {
	display: inline-flex;
	align-items: center;
	gap: var(--default-grid-baseline, 4px);
	padding: calc(0.5 * var(--default-grid-baseline, 4px)) calc(2 * var(--default-grid-baseline, 4px));
	border-radius: var(--border-radius-pill, 999px);
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
	font-size: 0.75em;
	font-weight: 500;
	line-height: 1;
}
.cn-translated-badge__icon[data-v-115288d6] {
	font-size: 0.9em;
}


/* ===== Grid layout (default) ===== */
.cn-detail-grid--grid[data-v-55dce18f] {
	display: grid;
	gap: calc(4 * var(--default-grid-baseline, 4px));
}

/* ===== Horizontal layout ===== */
.cn-detail-grid--horizontal[data-v-55dce18f] {
	display: flex;
	flex-direction: column;
	gap: calc(3 * var(--default-grid-baseline, 4px));
}

/* ===== Item (card style) ===== */
.cn-detail-grid__item[data-v-55dce18f] {
	display: flex;
	flex-direction: column;
	gap: var(--default-grid-baseline, 4px);
	padding: calc(2 * var(--default-grid-baseline, 4px)) calc(3 * var(--default-grid-baseline, 4px));
	background: var(--color-background-hover);
	border-radius: 0 var(--border-radius) var(--border-radius) 0;
}

/* Accent border */
.cn-detail-grid--accent .cn-detail-grid__item[data-v-55dce18f] {
	border-left: 3px solid var(--color-primary-element);
}

/* Horizontal item: row direction */
.cn-detail-grid__item--horizontal[data-v-55dce18f] {
	flex-direction: row;
	align-items: center;
	gap: calc(4 * var(--default-grid-baseline, 4px));
	border-radius: var(--border-radius);
}

/* ===== Label ===== */
.cn-detail-grid__label[data-v-55dce18f] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	font-weight: 500;
}
.cn-detail-grid--horizontal .cn-detail-grid__label[data-v-55dce18f] {
	min-width: var(--cn-detail-grid-label-width, 150px);
	flex-shrink: 0;
}

/* ===== Link ===== */
.cn-detail-grid__link[data-v-55dce18f] {
	color: var(--color-primary-element);
	text-decoration: underline;
}
.cn-detail-grid__link[data-v-55dce18f]:hover,
.cn-detail-grid__link[data-v-55dce18f]:focus-visible {
	text-decoration: none;
}

/* ===== Value ===== */
.cn-detail-grid__value[data-v-55dce18f] {
	font-size: 1em;
	color: var(--color-main-text);
	overflow-wrap: anywhere;
	margin: 0.5rem;
}
.cn-detail-grid__value--empty[data-v-55dce18f] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
}
.cn-detail-grid--horizontal .cn-detail-grid__value[data-v-55dce18f] {
	flex: 1;
}

/* ===== Actions ===== */
.cn-detail-grid__actions[data-v-55dce18f] {
	flex-shrink: 0;
	display: flex;
	align-items: center;
}

/* ===== Translation header (cn-detail-translation-aware-surfacing) ===== */
.cn-detail-grid__translation-header[data-v-55dce18f] {
	grid-column: 1 / -1;
	margin-bottom: var(--default-grid-baseline, 4px);
}

/* ===== Empty state ===== */
.cn-detail-grid__empty[data-v-55dce18f] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
	padding: calc(2 * var(--default-grid-baseline, 4px));
}

/* ===== Responsive ===== */
@media (max-width: 600px) {
.cn-detail-grid--grid[data-v-55dce18f] {
		grid-template-columns: 1fr !important;
}
.cn-detail-grid__item--horizontal[data-v-55dce18f] {
		flex-direction: column;
		align-items: flex-start;
}
}


/* Group headings. Quiet enough that they organise without competing with the
   values they sit over — a category label is a signpost, not content. */
.cn-object-metadata__group + .cn-object-metadata__group[data-v-6814b222] {
	margin-top: calc(3 * var(--default-grid-baseline, 4px));
}
.cn-object-metadata__group-title[data-v-6814b222] {
	margin: 0 0 calc(0.5 * var(--default-grid-baseline, 4px));
	font-size: 0.8em;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--color-text-maxcontrast);
}

/* Override CnDetailGrid item styling for a compact table-like appearance */
[data-v-6814b222] .cn-detail-grid__item {
	background: none;
	border-radius: 0;
	border-bottom: 1px solid var(--color-border);
	padding: calc(1.5 * var(--default-grid-baseline, 4px)) 0;
}
[data-v-6814b222] .cn-detail-grid__item:last-child {
	border-bottom: none;
}
[data-v-6814b222] .cn-detail-grid--horizontal {
	gap: 0;
}
[data-v-6814b222] .cn-detail-grid__label {
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.02em;
}
[data-v-6814b222] .cn-detail-grid__value {
	font-size: 0.9em;
	word-break: break-all;
	margin: 0;
}


.cn-object-data-widget__image[data-v-3b44dfe2] {
	max-width: 100%;
	max-height: 160px;
	border-radius: 8px;
	object-fit: cover;
}

/* Shimmering placeholder while a relation's display name resolves. */
.cn-object-data-widget__skeleton[data-v-3b44dfe2] {
	display: inline-block;
	width: 90px;
	height: 1em;
	border-radius: 4px;
	background: linear-gradient(90deg, var(--color-background-dark) 25%, var(--color-background-hover) 50%, var(--color-background-dark) 75%);
	background-size: 200% 100%;
	animation: cn-odw-shimmer-3b44dfe2 1.2s ease-in-out infinite;
}
@keyframes cn-odw-shimmer-3b44dfe2 {
from { background-position: 200% 0;
}
to { background-position: -200% 0;
}
}
@media (prefers-reduced-motion: reduce) {
.cn-object-data-widget__skeleton[data-v-3b44dfe2] { animation: none;
}
}
.cn-object-data-widget__grid-wrap[data-v-3b44dfe2] {
	position: relative;
}
.cn-object-data-widget__grid[data-v-3b44dfe2] {
	display: grid;
	gap: calc(2 * var(--default-grid-baseline, 4px)) calc(4 * var(--default-grid-baseline, 4px));
}

/* Collapsed + overflowing: the grid is clipped at a whole-row boundary
   (max-height set inline in collapsedGridStyle). No inner scrollbar. */
.cn-object-data-widget__grid-wrap--clipped .cn-object-data-widget__grid[data-v-3b44dfe2] {
	overflow: hidden;
}

/* Bottom fade over the clipped boundary — signals more content. */
.cn-object-data-widget__fade[data-v-3b44dfe2] {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 28px;
	height: 28px;
	pointer-events: none;
	background: linear-gradient(to bottom, rgba(0, 0, 0, 0), var(--color-main-background));
}
.cn-object-data-widget__toggle[data-v-3b44dfe2] {
	display: block;
	width: 100%;
	margin-top: 4px;
	padding: 4px;
	background: none;
	border: none;
	color: var(--color-primary-element);
	cursor: pointer;
	font: inherit;
	font-weight: 600;
	text-align: center;
}
.cn-object-data-widget__toggle[data-v-3b44dfe2]:hover,
.cn-object-data-widget__toggle[data-v-3b44dfe2]:focus-visible {
	text-decoration: underline;
}

/* Expanded in place: the widget card lifts above its siblings and its content
   area stops clipping, so every field is legible even when the grid cell
   positions cards absolutely (ADR-062: expand as an anchored panel rather than
   an inner scrollbar). */
.cn-object-data-widget--expanded[data-v-3b44dfe2] {
	z-index: 20;
}
.cn-object-data-widget--expanded[data-v-3b44dfe2] .cn-widget-wrapper__content {
	overflow: visible;
}
.cn-object-data-widget__grid-wrap--expanded[data-v-3b44dfe2] {
	background: var(--color-main-background);
}
.cn-object-data-widget__cell[data-v-3b44dfe2] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding: calc(2 * var(--default-grid-baseline, 4px)) 0;
	border-bottom: 1px solid var(--color-border-dark);
	min-width: 0;
}
.cn-object-data-widget__label[data-v-3b44dfe2] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	font-weight: 500;
}
.cn-object-data-widget__value[data-v-3b44dfe2] {
	font-size: 1em;
	color: var(--color-main-text);
	overflow-wrap: anywhere;
	position: relative;
	padding-right: 20px;
}

/* The hover box bleeds 4px past the text on the top, bottom and start so the
   fill reads as a hit area rather than a highlight. Not on the end: the cell is
   the last column's full width, and 4px past it is 4px past the scroll region,
   which drew a horizontal scrollbar under every data widget in a tab (dossiq's
   case page, Data tab). The end padding drops by the same 4px so the text and
   the edit icon sit where they sat. */
.cn-object-data-widget__value--editable[data-v-3b44dfe2] {
	cursor: pointer;
	border-radius: var(--border-radius);
	padding: 4px 20px 4px 4px;
	margin: -4px 0 -4px -4px;
}
.cn-object-data-widget__value--editable[data-v-3b44dfe2]:hover {
	background: var(--color-background-dark);
}
.cn-object-data-widget__value--editable[data-v-3b44dfe2]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}
.cn-object-data-widget__value--empty[data-v-3b44dfe2] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
}
.cn-object-data-widget__edit-icon[data-v-3b44dfe2] {
	position: absolute;
	right: 4px;
	top: 50%;
	transform: translateY(-50%);
	color: var(--color-text-maxcontrast);
	opacity: 0;
	transition: opacity 0.15s ease;
}
.cn-object-data-widget__value--editable:hover .cn-object-data-widget__edit-icon[data-v-3b44dfe2],
.cn-object-data-widget__value--editable:focus-visible .cn-object-data-widget__edit-icon[data-v-3b44dfe2] {
	opacity: 1;
}
.cn-object-data-widget__editor[data-v-3b44dfe2] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-object-data-widget__editor-actions[data-v-3b44dfe2] {
	display: flex;
	gap: 2px;
	justify-content: flex-end;
}
.cn-object-data-widget__textarea[data-v-3b44dfe2] {
	width: 100%;
	min-height: 80px;
	padding: 8px;
	border: 2px solid var(--color-border-dark);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	font-family: inherit;
	font-size: inherit;
	resize: vertical;
}
.cn-object-data-widget__textarea[data-v-3b44dfe2]:focus {
	border-color: var(--color-primary-element);
	outline: none;
}
.cn-object-data-widget__empty[data-v-3b44dfe2] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
	padding: calc(2 * var(--default-grid-baseline, 4px));
}

/* Compact inline table for array-of-objects values. Dense + unstyled-simple;
   fits the card and participates in the whole-row overflow handling. */
.cn-object-data-widget__mini-table-wrap[data-v-3b44dfe2] {
	max-width: 100%;
}
.cn-object-data-widget__mini-table[data-v-3b44dfe2] {
	width: 100%;
	border-collapse: collapse;
	font-size: 0.9em;
}
.cn-object-data-widget__mini-table th[data-v-3b44dfe2],
.cn-object-data-widget__mini-table td[data-v-3b44dfe2] {
	text-align: start;
	padding: 2px 8px 2px 0;
	border-bottom: 1px solid var(--color-border);
	vertical-align: top;
	overflow-wrap: anywhere;
}
.cn-object-data-widget__mini-table th[data-v-3b44dfe2] {
	color: var(--color-text-maxcontrast);
	font-weight: 500;
}
.cn-object-data-widget__more[data-v-3b44dfe2] {
	margin-top: 2px;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}

/* Comma-less chip row for array-of-scalars values. */
.cn-object-data-widget__chips[data-v-3b44dfe2] {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
}
.cn-object-data-widget__chip[data-v-3b44dfe2] {
	padding: 1px 8px;
	border-radius: 12px;
	background: var(--color-background-dark);
	font-size: 0.9em;
}

/* Key: value definition list for a single plain-object value. */
.cn-object-data-widget__deflist[data-v-3b44dfe2] {
	display: grid;
	grid-template-columns: auto 1fr;
	gap: 2px 8px;
	margin: 0;
}
.cn-object-data-widget__deflist dt[data-v-3b44dfe2] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-object-data-widget__deflist dd[data-v-3b44dfe2] {
	margin: 0;
	overflow-wrap: anywhere;
}

/* Responsive: collapse to single column on narrow widths */
@media (max-width: 600px) {
.cn-object-data-widget__grid[data-v-3b44dfe2] {
		grid-template-columns: 1fr !important;
}
.cn-object-data-widget__cell[data-v-3b44dfe2] {
		grid-column: span 1 !important;
		grid-row: span 1 !important;
}
}


.cn-object-geo-widget[data-v-4604f267] {
	display: flex;
	flex-direction: column;
}

/* Address search sits above the map; the result list overlays it rather than
   pushing the map down, so the layout doesn't jump while typing. */
.cn-object-geo-widget__search[data-v-4604f267] {
	position: relative;
	display: flex;
	align-items: center;
	gap: 8px;
	padding: calc(2 * var(--default-grid-baseline, 4px));
}
.cn-object-geo-widget__results[data-v-4604f267] {
	position: absolute;
	top: 100%;
	left: calc(2 * var(--default-grid-baseline, 4px));
	right: calc(2 * var(--default-grid-baseline, 4px));
	z-index: 1000;
	max-height: 220px;
	overflow-y: auto;
	margin: 0;
	padding: 4px;
	list-style: none;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 8px);
	box-shadow: 0 2px 8px rgba(0, 0, 0, .15);
}
.cn-object-geo-widget__results button[data-v-4604f267] {
	display: block;
	width: 100%;
	padding: 8px;
	border: none;
	border-radius: var(--border-radius, 4px);
	background: transparent;
	color: var(--color-main-text);
	text-align: left;
	font-size: 0.9em;
	cursor: pointer;
}
.cn-object-geo-widget__results button[data-v-4604f267]:hover,
.cn-object-geo-widget__results button[data-v-4604f267]:focus-visible {
	background: var(--color-background-hover);
}
.cn-object-geo-widget__hint[data-v-4604f267] {
	margin: 0;
	padding: calc(2 * var(--default-grid-baseline, 4px));
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-object-geo-widget__error[data-v-4604f267] {
	margin: 0;
	padding: calc(2 * var(--default-grid-baseline, 4px));
	color: var(--color-error);
	font-size: 0.85em;
}
.cn-object-geo-widget__footer[data-v-4604f267] {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline, 4px));
	padding: calc(2 * var(--default-grid-baseline, 4px));
}
.cn-object-geo-widget__coords[data-v-4604f267] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	font-variant-numeric: tabular-nums;
}


.cn-banner-widget[data-v-3531692f] {
	width: 100%;
}
.cn-banner-widget__card[data-v-3531692f] {
	margin: 0;
}
.cn-banner-widget__text--clickable[data-v-3531692f] {
	cursor: pointer;
	text-decoration: underline;
	color: inherit;
}


.cn-divider-widget[data-v-621c1f75] {
	width: 100%;
	height: 100%;
}
.cn-divider-widget__line[data-v-621c1f75] {
	border-bottom: 1px solid var(--color-border);
}
.cn-divider-widget__heading-break[data-v-621c1f75] {
	display: flex;
	align-items: center;
	gap: 1rem;
	width: 100%;
}
.cn-divider-widget__heading-line[data-v-621c1f75] {
	border: 0;
	border-top: 1px solid var(--color-border);
}
.cn-divider-widget__heading-text[data-v-621c1f75] {
	margin: 0;
	font-size: 1rem;
	font-weight: 600;
	color: var(--color-main-text);
	white-space: nowrap;
}

/*
 * Dividers MUST remain visible when printed. We deliberately keep this
 * @media print block free of any `display: none` rules; the styles below
 * merely tighten contrast for paper output.
 */
@media print {
.cn-divider-widget[data-v-621c1f75],
	.cn-divider-widget__line[data-v-621c1f75],
	.cn-divider-widget__whitespace[data-v-621c1f75],
	.cn-divider-widget__heading-break[data-v-621c1f75] {
		display: flex;
}
.cn-divider-widget__line[data-v-621c1f75],
	.cn-divider-widget__heading-line[data-v-621c1f75] {
		border-color: #000;
}
}


.cn-header-widget[data-v-1b97430f] {
	width: 100%;
	height: 100%;
	min-height: 120px;
	border-radius: var(--border-radius-large, 8px);
	overflow: hidden;
}
.cn-header-widget__overlay[data-v-1b97430f] {
	position: absolute;
	inset: 0;
}
.cn-header-widget__content[data-v-1b97430f] {
	position: relative;
	z-index: 1;
}
.cn-header-widget__title[data-v-1b97430f] {
	font-size: 28px;
	font-weight: 700;
	line-height: 1.2;
	margin: 0;
}
.cn-header-widget__subtitle[data-v-1b97430f] {
	font-size: 16px;
	line-height: 1.4;
	margin: 0;
	opacity: 0.95;
}
.cn-header-widget__cta[data-v-1b97430f] {
	display: inline-block;
	margin-top: 8px;
	padding: 10px 18px;
	border-radius: var(--border-radius, 4px);
	font-size: 14px;
	font-weight: 600;
	text-decoration: none;
	cursor: pointer;
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.cn-header-widget__cta[data-v-1b97430f]:hover {
	transform: translateY(-1px);
	box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.cn-header-widget__cta--primary[data-v-1b97430f] {
	background-color: var(--color-primary, #0070c0);
	color: var(--color-primary-text, #ffffff);
	border: 1px solid var(--color-primary, #0070c0);
}
.cn-header-widget__cta--secondary[data-v-1b97430f] {
	background-color: var(--color-background-hover, rgba(255, 255, 255, 0.85));
	color: var(--color-main-text, #000000);
	border: 1px solid var(--color-border, #cccccc);
}
.cn-header-widget__cta--ghost[data-v-1b97430f] {
	background-color: transparent;
	color: inherit;
	border: 1px solid currentColor;
}
.cn-header-widget__probe[data-v-1b97430f] {
	position: absolute;
	width: 1px;
	height: 1px;
	opacity: 0;
	pointer-events: none;
	left: -9999px;
	top: -9999px;
}
@media print {
.cn-header-widget[data-v-1b97430f] {
		print-color-adjust: exact;
		-webkit-print-color-adjust: exact;
}
}


.cn-integration-widget[data-v-773b476b] {
	width: 100%;
	display: flex;
	flex-direction: column;
	min-height: 0;
}
.cn-integration-widget__tabbar[data-v-773b476b] {
	display: flex;
	align-items: flex-end;
	gap: 8px;
	border-bottom: 1px solid var(--color-border);
	margin-bottom: 12px;
}
.cn-integration-widget__tabs[data-v-773b476b] {
	display: flex;
	flex-wrap: wrap;
	gap: 2px;
	flex: 1;
	min-width: 0;
}
.cn-integration-widget__tab[data-v-773b476b] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 8px 12px;
	background: transparent;
	border: none;
	border-bottom: 2px solid transparent;
	border-radius: var(--border-radius) var(--border-radius) 0 0;
	color: var(--color-text-maxcontrast);
	font-size: 0.95em;
	cursor: pointer;
}
.cn-integration-widget__tab[data-v-773b476b]:hover {
	background: var(--color-background-hover);
	color: var(--color-main-text);
}
.cn-integration-widget__tab[data-v-773b476b]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: -2px;
}
.cn-integration-widget__tab--active[data-v-773b476b] {
	color: var(--color-main-text);
	font-weight: 600;
	border-bottom-color: var(--cn-iw-accent, var(--color-primary-element));
}
.cn-integration-widget__tab-icon[data-v-773b476b] {
	color: var(--cn-iw-accent, currentColor);
	flex-shrink: 0;
}
.cn-integration-widget__tab-label[data-v-773b476b] {
	white-space: nowrap;
}
.cn-integration-widget__header[data-v-773b476b] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 4px;
	margin-bottom: 8px;
	border-bottom: 2px solid var(--cn-iw-accent, var(--color-border));
}
.cn-integration-widget__header-icon[data-v-773b476b] {
	color: var(--cn-iw-accent, var(--color-main-text));
	flex-shrink: 0;
}
.cn-integration-widget__header-label[data-v-773b476b] {
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-integration-widget__header-actions[data-v-773b476b] {
	margin-inline-start: auto;
	flex-shrink: 0;
}
.cn-integration-widget__panel[data-v-773b476b] {
	flex: 1;
	min-height: 0;
}
.cn-integration-widget__panel[data-v-773b476b]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: -2px;
}


.cn-nav-card-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
	gap: calc(2 * var(--default-grid-baseline, 4px));
}
.cn-nav-card-grid__card {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding: 16px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 10px);
	color: var(--color-main-text);
	text-decoration: none;
	cursor: pointer;
	transition: box-shadow 0.2s ease, border-color 0.2s ease;
}
.cn-nav-card-grid__card:hover,
.cn-nav-card-grid__card:focus-visible {
	border-color: var(--color-primary-element);
	box-shadow: 0 2px 8px var(--color-box-shadow);
}
.cn-nav-card-grid__card--disabled {
	cursor: not-allowed;
	opacity: 0.5;
}
.cn-nav-card-grid__card--disabled:hover {
	border-color: var(--color-border);
	box-shadow: none;
}
.cn-nav-card-grid__icon {
	flex-shrink: 0;
	color: var(--color-primary-element);
}
.cn-nav-card-grid__body {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-nav-card-grid__label {
	font-size: 16px;
	font-weight: 600;
	line-height: 1.3;
}
.cn-nav-card-grid__description {
	font-size: 13px;
	color: var(--color-text-maxcontrast);
	line-height: 1.4;
}
.cn-nav-card-grid__count {
	flex-shrink: 0;
}


.cn-text-widget[data-v-48e3cbcf] {
	width: 100%;
	height: 100%;
}
.cn-text-widget__content[data-v-48e3cbcf],
.cn-text-widget__placeholder[data-v-48e3cbcf] {
	/* Safety net — ensures long URLs / words inside the sanitised HTML wrap
	   rather than overflowing horizontally. */
	overflow-wrap: break-word;
	max-width: 100%;
}

/* Restore inline-emphasis semantics inside rendered content. Nextcloud's
   server CSS styles bare <em> as muted (var(--color-text-maxcontrast)) and can
   drop the italic, so `_x_` / `**_x_**` looked greyed-out and non-italic. Force
   italic <em> / bold <strong> that inherit the widget's own text colour. */
.cn-text-widget[data-v-48e3cbcf] em,
.cn-text-widget[data-v-48e3cbcf] i {
	font-style: italic;
	color: inherit;
}
.cn-text-widget[data-v-48e3cbcf] strong,
.cn-text-widget[data-v-48e3cbcf] b {
	font-weight: bold;
	color: inherit;
}

/* Nextcloud's server CSS strips list markers/indent (`list-style: none`,
   no padding), so rendered `<ul>`/`<ol>` looked like plain text. Restore
   bullets/numbers and indentation, including nested levels. */
.cn-text-widget[data-v-48e3cbcf] ul,
.cn-text-widget[data-v-48e3cbcf] ol {
	margin: 4px 0;
	padding-left: 1.5em;
}
.cn-text-widget[data-v-48e3cbcf] ul {
	list-style: disc outside;
}
.cn-text-widget[data-v-48e3cbcf] ol {
	list-style: decimal outside;
}
.cn-text-widget[data-v-48e3cbcf] ul ul {
	list-style-type: circle;
}
.cn-text-widget[data-v-48e3cbcf] ul ul ul {
	list-style-type: square;
}
.cn-text-widget[data-v-48e3cbcf] li {
	display: list-item;
}

/* Nextcloud's server CSS flattens heading sizes (e.g. h1 → 100%, so it fell
   back to the ~14px body size while h2 stayed 1.8em), leaving them oddly
   scaled. Apply a consistent em-based scale that grows with the widget's own
   font size. */
.cn-text-widget[data-v-48e3cbcf] h1 {
	font-size: 2em;
}
.cn-text-widget[data-v-48e3cbcf] h2 {
	font-size: 1.5em;
}
.cn-text-widget[data-v-48e3cbcf] h3 {
	font-size: 1.25em;
}
.cn-text-widget[data-v-48e3cbcf] h4 {
	font-size: 1.1em;
}
.cn-text-widget[data-v-48e3cbcf] h5 {
	font-size: 1em;
}
.cn-text-widget[data-v-48e3cbcf] h6 {
	font-size: 0.85em;
}
.cn-text-widget__content--markdown[data-v-48e3cbcf] h1,
.cn-text-widget__content--markdown[data-v-48e3cbcf] h2,
.cn-text-widget__content--markdown[data-v-48e3cbcf] h3,
.cn-text-widget__content--markdown[data-v-48e3cbcf] h4,
.cn-text-widget__content--markdown[data-v-48e3cbcf] h5,
.cn-text-widget__content--markdown[data-v-48e3cbcf] h6 {
	margin: 8px 0 4px;
	font-weight: 600;
	line-height: 1.3;
}
.cn-text-widget__content--markdown[data-v-48e3cbcf] p,
.cn-text-widget__content--markdown[data-v-48e3cbcf] ul,
.cn-text-widget__content--markdown[data-v-48e3cbcf] ol,
.cn-text-widget__content--markdown[data-v-48e3cbcf] blockquote {
	margin: 4px 0;
}
.cn-text-widget__content--markdown[data-v-48e3cbcf] code {
	padding: 1px 4px;
	border-radius: 3px;
	background: var(--color-background-hover);
	font-family: var(--font-monospace, monospace);
	font-size: 0.95em;
}
.cn-text-widget__content--markdown[data-v-48e3cbcf] pre {
	padding: 8px;
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	overflow: auto;
}
.cn-text-widget__content--markdown[data-v-48e3cbcf] pre code {
	padding: 0;
	background: transparent;
}
.cn-text-widget__content--markdown[data-v-48e3cbcf] blockquote {
	padding-left: 8px;
	border-left: 3px solid var(--color-border);
	color: var(--color-text-maxcontrast);
}
.cn-text-widget__content--markdown[data-v-48e3cbcf] table {
	border-collapse: collapse;
	margin: 4px 0;
}
.cn-text-widget__content--markdown[data-v-48e3cbcf] th,
.cn-text-widget__content--markdown[data-v-48e3cbcf] td {
	padding: 4px 8px;
	border: 1px solid var(--color-border);
}
.cn-text-widget__table[data-v-48e3cbcf] {
	border-collapse: collapse;
	width: 100%;
}
.cn-text-widget__table th[data-v-48e3cbcf],
.cn-text-widget__table td[data-v-48e3cbcf] {
	overflow-wrap: break-word;
	vertical-align: top;
}
.cn-text-widget__cell-placeholder[data-v-48e3cbcf] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
}


.cn-object-card[data-v-6f672c8f] {
	display: flex;
	gap: 12px;
	padding: 16px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 10px);
	cursor: pointer;
	transition: box-shadow 0.2s ease, border-color 0.2s ease;
}
.cn-object-card[data-v-6f672c8f]:hover {
	border-color: var(--color-primary-element);
	box-shadow: 0 2px 8px var(--color-box-shadow);
}
.cn-object-card--selected[data-v-6f672c8f] {
	border-color: var(--color-primary-element);
	background: var(--color-primary-element-light);
}
.cn-object-card__checkbox[data-v-6f672c8f] {
	flex-shrink: 0;
	padding-top: 2px;
}
.cn-object-card__content[data-v-6f672c8f] {
	flex: 1;
	min-width: 0;
}
.cn-object-card__header[data-v-6f672c8f] {
	display: flex;
	gap: 12px;
	align-items: flex-start;
}
.cn-object-card__image[data-v-6f672c8f] {
	width: 48px;
	height: 48px;
	border-radius: var(--border-radius);
	object-fit: cover;
	flex-shrink: 0;
}
.cn-object-card__title-area[data-v-6f672c8f] {
	flex: 1;
	min-width: 0;
}
.cn-object-card__title[data-v-6f672c8f] {
	margin: 0;
	font-size: 16px;
	font-weight: 600;
	line-height: 1.3;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-object-card__description[data-v-6f672c8f] {
	margin: 4px 0 0;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
	line-height: 1.4;
}
.cn-object-card__badges[data-v-6f672c8f] {
	margin-top: 8px;
}
.cn-object-card__metadata[data-v-6f672c8f] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
	gap: 8px;
	margin-top: 12px;
	padding-top: 12px;
	border-top: 1px solid var(--color-border);
}
.cn-object-card__meta-item[data-v-6f672c8f] {
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-object-card__meta-label[data-v-6f672c8f] {
	font-size: 11px;
	font-weight: 500;
	color: var(--color-text-maxcontrast);
	text-transform: uppercase;
	letter-spacing: 0.3px;
}
.cn-object-card__actions[data-v-6f672c8f] {
	flex-shrink: 0;
}


.cn-widget-card-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
	gap: calc(2 * var(--default-grid-baseline, 4px));
}


.cn-file-field[data-v-3219c7b7] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-file-field__label[data-v-3219c7b7] {
	font-weight: bold;
}
.cn-file-field__input[data-v-3219c7b7] {
	display: none;
}
.cn-file-field__row[data-v-3219c7b7] {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
}
.cn-file-field__name[data-v-3219c7b7] {
	margin: 0;
	color: var(--color-text-maxcontrast);
	overflow-wrap: anywhere;
}
.cn-file-field__error[data-v-3219c7b7] {
	margin: 0;
	color: var(--color-error-text, var(--color-error));
}


.cn-form-page {
	display: flex;
	flex-direction: column;
	gap: 1rem;
	padding: 1rem;
	max-width: 720px;
	margin: 0 auto;
	color: var(--color-main-text);
}
.cn-form-page__form {
	display: flex;
	flex-direction: column;
	gap: 1rem;
}
.cn-form-page__steps-nav {
	width: 100%;
}
.cn-form-page__steps {
	display: flex;
	flex-wrap: wrap;
	gap: 1rem;
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-form-page__step {
	color: var(--color-text-maxcontrast);
	font-weight: normal;
}
.cn-form-page__step--current {
	color: var(--color-main-text);
	font-weight: bold;
}
.cn-form-page__step--done {
	color: var(--color-main-text);
}
.cn-form-page__step-check {
	color: var(--color-primary-element);
	margin-right: 0.25rem;
}
.cn-form-page__step-description {
	color: var(--color-text-maxcontrast);
	margin: 0;
}
.cn-form-page__field {
	display: flex;
	flex-direction: column;
	gap: 0.25rem;
}
.cn-form-page__field-help {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
}
.cn-form-page__field-error {
	color: var(--color-error);
	font-size: 0.85em;
	margin: 0;
}
.cn-form-page__error {
	color: var(--color-error);
	background: var(--color-error-hover, transparent);
	padding: 0.5rem 0.75rem;
	border-radius: var(--border-radius);
}
.cn-form-page__success {
	color: var(--color-success-text, var(--color-main-text));
	background: var(--color-success-hover, transparent);
	padding: 1rem;
	border-radius: var(--border-radius);
	text-align: center;
}
.cn-form-page__actions {
	display: flex;
	justify-content: flex-end;
	gap: 0.5rem;
}
.cn-form-page__submit {
	display: flex;
	justify-content: flex-start;
	gap: 0.5rem;
	margin-top: 0.5rem;
}


.cn-confirm__confirm[data-v-38241da0] {
	padding: 4px 0;
}


.cn-widget-object-table[data-v-f6accf5e] {
	width: 100%;
}
.cn-widget-object-table__footer[data-v-f6accf5e] {
	display: flex;
	gap: 4px;
	padding: 4px 8px;
	border-top: 1px solid var(--color-border);
}
.cn-widget-object-table__error[data-v-f6accf5e] {
	color: var(--color-error);
	font-size: 0.85em;
	margin: 4px 8px 0;
}


.cn-detail-widget-host[data-v-76c1b60f],
.cn-detail-widget-host[data-v-76c1b60f] > * {
	height: 100%;
}

/* A bare host is a tab panel's body: it fills the panel and lets the panel
   scroll, rather than growing a second scroll region of its own. */
.cn-detail-widget-host--bare[data-v-76c1b60f] {
	min-height: 0;
}


/* The bar owns the rule under the strip so a `#nav-end` surface sits ON the
   line rather than above a line that stops where the last tab does. With no
   nav-end content the nav is the bar's only child and the result is pixel
   identical to the rule living on the nav itself. */
.cn-tabs__bar[data-v-5c1a056f] {
	/* flex-START, not flex-end. The nav is a SIBLING that grows taller when its
	   tabs wrap, so bottom-aligning drops the `#nav-end` control down beside
	   the LAST row. Measured on a 9-tab dossiq case strip: Actions landed next
	   to the single wrapped tab and read as that one tab's own control rather
	   than the strip's. Top-aligning keeps it on the first row, where the
	   widget's title used to be. */
	align-items: flex-start;
	border-bottom: 1px solid var(--color-border);
	display: flex;
	gap: 8px;
}
.cn-tabs__nav[data-v-5c1a056f] {
	display: flex;
	flex: 1 1 auto;
	gap: 4px;
	min-width: 0;
	/* Wrap before scrolling. A horizontally scrolling strip hides tabs behind
	   an edge with nothing to say they are there, and beside a `#nav-end`
	   control the clipped tab reads as sitting UNDER the control. Wrapping
	   keeps every tab reachable without a gesture. */
	flex-wrap: wrap;
}
.cn-tabs__nav-end[data-v-5c1a056f] {
	align-items: center;
	display: flex;
	flex: 0 0 auto;
	gap: 4px;
	/* No min-height. This used to hard-code 38px to mirror the old nav item's
	   vertical box, but the folder-tab restyle changed that box to 33px, and
	   because the bar is `align-items: flex-start` the taller nav-end then drove
	   the BAR's height. The bar's bottom rule sank 6px below the tab row, so the
	   open tab no longer met the panel it is drawn as joined to. Letting the
	   control size to its own content keeps the rule on the tab row whatever the
	   nav item's box becomes, so the two cannot drift apart again. */
	min-height: 0;
}

/* Folder tabs, not underlined labels. An underline is the weakest possible
   affordance on a strip that already carries icons: with nine tabs on a dossiq
   case the row read as a sentence of links, and only the 2px rule said which
   one was open. Giving the inactive tabs their own darker surface makes the
   strip legible as a control at a glance, and the active tab, sharing the
   panel's background and punching a hole in the bar's rule, reads as the sheet
   in front. */
.cn-tabs__nav-item[data-v-5c1a056f] {
	background-color: var(--color-background-dark);
	/* `--color-border-dark`, not `--color-border`: the latter is the same
	   #ededed as `--color-background-dark` in the stock light theme, so a tab
	   drawn with it has no visible edge against its own fill. */
	border: 1px solid var(--color-border-dark);
	border-bottom: none;
	border-radius: var(--border-radius-large, 8px) var(--border-radius-large, 8px) 0 0;
	/* Full-contrast label, not `--color-text-maxcontrast`. On the old
	   transparent strip maxcontrast sat on white at 5.3:1; on this darker
	   surface the same pair measures 4.55:1, which clears WCAG AA by 0.05 and
	   would not survive a themed instance shifting either token. A real tab
	   strip carries its selection in the surface and the weight anyway, so
	   nothing is lost by giving every label the readable colour. */
	color: var(--color-main-text);
	cursor: pointer;
	font-weight: normal;
	/* Overlap the bar's 1px rule so the active tab's own bottom edge can cover
	   it. Harmless on a wrapped second row: the 4px nav gap absorbs it. */
	margin-bottom: -1px;
	/* See `.cn-tabs__nav .cn-tabs__nav-item` below for why this alone is not
	   enough inside a Nextcloud page. */
	padding: 8px 12px;
	white-space: nowrap;
	/* Match the `#nav-end` control's own height. The bar is a flex row, so
	   whichever side is taller sets the bar's height and therefore where its
	   bottom rule lands. When the control was the taller one the rule sat below
	   the tab row and showed as a line under the open tab, breaking the join to
	   the panel. Sizing both sides the same is what keeps the rule ON the tab
	   row; `inline-flex` centres the label inside the taller box. */
	align-items: center;
	box-sizing: border-box;
	display: inline-flex;
	min-height: var(--default-clickable-area, 34px);
}

/* Nextcloud's server stylesheet sets `margin-bottom: 3px` on every plain
   `button`, and its selector
   `button:not(.button-vue, [class^="vs__"]):not(.app-navigation-entry-button)`
   scores (0,2,1) against the (0,2,0) of the scoped rule above. So inside a real
   Nextcloud page the tabs sat 4px ABOVE the bar's rule and the open tab never
   met its panel: the join this whole treatment is built on was only ever
   visible outside the app.
   Measured on a running instance, not inferred: the e2e harness is a bare vite
   page that does not load Nextcloud's CSS, so it cannot see this conflict and
   reported the gap as 1px while the app showed 5px.
   Adding the parent class takes the selector to (0,3,0), which wins on
   specificity rather than on `!important` or source order. */
.cn-tabs__nav .cn-tabs__nav-item[data-v-5c1a056f] {
	margin-bottom: -1px;
}
.cn-tabs__nav--justified .cn-tabs__nav-item[data-v-5c1a056f] {
	flex: 1 1 0;
}
.cn-tabs__nav-item[data-v-5c1a056f]:hover,
.cn-tabs__nav-item[data-v-5c1a056f]:focus-visible {
	background-color: var(--color-background-hover);
	color: var(--color-main-text);
}
.cn-tabs__nav-item[disabled][data-v-5c1a056f] {
	cursor: default;
	opacity: 0.5;
}
.cn-tabs__nav-item[disabled][data-v-5c1a056f]:hover {
	background-color: var(--color-background-dark);
	color: var(--color-main-text);
}

/* The open tab: the panel's own background, and a bottom border painted in
   that same background so it erases the bar's rule underneath and the tab
   joins the sheet below it. The primary-coloured top edge is what carries the
   selection at a glance, and it survives forced-colours mode, which drops
   background colours but keeps borders. */
.cn-tabs__nav-item--active[data-v-5c1a056f] {
	background-color: var(--color-main-background);
	border-bottom: 1px solid var(--color-main-background);
	border-top: 2px solid var(--color-primary-element);
	color: var(--color-main-text);
	font-weight: bold;
	/* Keep the text baseline identical to an inactive tab despite the 1px
	   thicker top border, so the strip does not jog when the selection moves. */
	padding-top: 7px;
}
.cn-tabs__content[data-v-5c1a056f] {
	padding-top: 12px;
}
.cn-tabs--card .cn-tabs__content[data-v-5c1a056f] {
	border: 1px solid var(--color-border);
	border-top: none;
	padding: 12px;
}


/* The panel is the card; the strip is not inside it. There is no title bar
   above the tabs either: the open tab names the panel, so a title row would
   say the same thing twice and cost a row of height on a card that is mostly
   content.

   The card chrome used to wrap the strip as well, which drew a border and a
   pair of rounded corners ABOVE the tabs and boxed them in. Folder tabs are
   drawn as the edge of the sheet they open, so a second edge around them
   reads as a header the widget does not have. Border, radius and background
   now live on the panel below, and the strip sits bare on the page. */
/* The class is doubled on purpose, and the four properties below are RESET
   rather than simply omitted.

   Nextcloud serves every enabled app's assets on every page, each app bundles
   this library's compiled CSS, and the Vue scope id is derived from the file
   PATH, so `data-v-1dbd6122` is byte-identical across library versions. An app
   still on an older release therefore ships a rule with exactly this selector
   and the OLD declarations, and it lands on the pages of an app already on the
   new one. Measured on a dossiq case page: three stale copies of the pre-fix
   rule, one from hermiq's `companion.css` (its companion bundle loads on every
   page by design) and two inline from other apps' bundles. Same specificity,
   so source order decided, and the card border came back around the strip.

   Dropping a declaration cannot beat a rule that sets it, so `border` and the
   rest are explicitly zeroed. Doubling the class takes this selector to
   (0,3,0) against the stale (0,2,0), which wins on specificity rather than on
   `!important` or on load order this library does not control. The same
   technique, for the same reason, is used on `.cn-tabs__nav .cn-tabs__nav-item`
   in CnTabs to beat Nextcloud's own button margin. */
.cn-tabs-widget.cn-tabs-widget[data-v-1dbd6122] {
	background-color: transparent;
	border: 0;
	border-radius: 0;
	display: flex;
	flex-direction: column;
	height: 100%;
	min-height: 0;
	overflow: visible;
	padding: 0;
}

/* No inset, so the first tab starts at the panel's own left edge. The 8px
   here was there to clear the card's rounded top corner; that corner is gone
   from the strip now, and the inset it existed for left the first tab floating
   8px inside the sheet it opens.

   The bar's own bottom rule is switched off and redrawn as a pseudo-element
   that stops one corner radius short of the right edge. CnTabs draws its rule
   across the bar's whole width, which is the sheet's top edge everywhere
   except at the far right, where the panel's top-right corner curves away
   below it: the rule ran straight on to the widget's edge and read as a
   border sticking out past a rounded corner (Ruben, 2026-09-13). Ending it
   where the curve begins makes the rule and the curve one continuous edge. */
.cn-tabs-widget__tabs[data-v-1dbd6122] .cn-tabs__bar {
	border-bottom: none;
	padding: 0;
	position: relative;
}
.cn-tabs-widget__tabs[data-v-1dbd6122] .cn-tabs__bar::after {
	border-bottom: 1px solid var(--color-border);
	content: '';
	inset-block-end: 0;
	inset-inline: 0 var(--border-radius-large);
	pointer-events: none;
	position: absolute;
}

/* The open tab erases the slice of the rule directly above the panel with its
   own background-coloured bottom edge, which only works if it paints ABOVE the
   pseudo-element: a positioned pseudo-element otherwise paints over every
   in-flow sibling, rule included. */
.cn-tabs-widget__tabs[data-v-1dbd6122] .cn-tabs__nav-item--active {
	position: relative;
	z-index: 1;
}
.cn-tabs-widget__tabs[data-v-1dbd6122] {
	display: flex;
	flex-direction: column;
	/* Grow to the widget's height, so the panel fills the grid cell the
	   layout gave it. Without this the strip plus the open panel took only
	   the height of the panel's content, and a cell of nine rows ended in
	   130px of nothing under a sheet that stopped short of its own card. */
	flex: 1 1 auto;
	min-height: 0;
}

/* The panel area is the scroll region, so the strip stays put while a long
   child scrolls under it.

   `padding-top: 0` overrides CnTabs' own 12px: the open tab is drawn joined to
   the panel, and a gap under it breaks that join, leaving the tab floating
   above content it is supposed to be attached to. */
.cn-tabs-widget__tabs[data-v-1dbd6122] .cn-tabs__content {
	background-color: var(--color-main-background);
	/* Three sides only: the bar's rule (redrawn above, stopping at the corner)
	   is this sheet's top edge, and the open tab erases the slice of it
	   directly above the panel so the two read as one surface. A border-top
	   here would put a second line under that tab which the tab cannot paint
	   over. */
	border: 1px solid var(--color-border);
	border-top: none;
	/* Three rounded corners. The top-left stays square because the first tab
	   is drawn joined to the panel there, and a curve under it would curl the
	   sheet away from that tab. The top-right has no tab above it: the strip
	   ends where the last tab ends and the Actions menu floats free, so a
	   square corner there read as a sheet cut off, not as a tab's edge. */
	border-radius: 0 var(--border-radius-large) var(--border-radius-large) var(--border-radius-large);
	flex: 1 1 auto;
	min-height: 0;
	overflow: auto;
	padding: 0 12px 12px;
}
.cn-tabs-widget__tabs[data-v-1dbd6122] .cn-tab {
	height: 100%;
}
.cn-tabs-widget__title[data-v-1dbd6122] {
	align-items: center;
	display: inline-flex;
	gap: 6px;
}
.cn-tabs-widget__title-icon[data-v-1dbd6122] {
	flex: 0 0 auto;
}


.cn-tabs-form[data-v-15940aef] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-tabs-form__section[data-v-15940aef] {
	margin: 8px 0 0;
}
.cn-tabs-form__hint[data-v-15940aef] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	margin: 0;
}
.cn-tabs-form__row[data-v-15940aef] {
	display: flex;
	gap: 8px;
}


.cn-color-picker__swatch[data-v-307491dd] {
	--cn-color-picker-checker:
		linear-gradient(45deg, var(--color-background-dark) 25%, transparent 25%),
		linear-gradient(-45deg, var(--color-background-dark) 25%, transparent 25%),
		linear-gradient(45deg, transparent 75%, var(--color-background-dark) 75%),
		linear-gradient(-45deg, transparent 75%, var(--color-background-dark) 75%);
	display: inline-block;
	width: 32px;
	height: 32px;
	flex-shrink: 0;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background-image: var(--cn-color-picker-checker);
	background-size: 8px 8px;
	background-position: 0 0, 0 4px, 4px -4px, -4px 0;
	/* Explicit background-color and override Nextcloud server's default
	   `button:not(.button-vue, [class^="vs__"])` rules — those set a tinted
	   background-color that bleeds through the transparent halves of the
	   checker gradient and only "lifts" on :hover, making the checker
	   appear/disappear depending on hover state. */
	background-color: var(--color-main-background) !important;
	overflow: hidden;
	position: relative;
}
.cn-color-picker__swatch[data-v-307491dd]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}
.cn-color-picker__swatch--disabled[data-v-307491dd] {
	cursor: not-allowed !important;
	/* Override Nextcloud server's global `button:not(.button-vue, [class^="vs__"]):disabled`
	   rule which forces opacity: 0.5 — that distorts the previewed color. The cursor
	   change above is enough of a disabled affordance. */
	opacity: 1 !important;
}
.cn-color-picker[data-v-307491dd] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
}
.cn-color-picker__panel[data-v-307491dd] {
	display: flex;
	flex-direction: column;
	background: var(--color-main-background);
}

/* Inline "remove color" button — a compact icon button sitting next to the
   swatch, sized to align with the 32px swatch without overpowering it. */
.cn-color-picker__clear[data-v-307491dd] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 28px;
	height: 28px;
	flex-shrink: 0;
	padding: 0;
	border: none;
	border-radius: var(--border-radius);
	cursor: pointer;
	color: var(--color-text-maxcontrast);
	background-color: transparent;
}
.cn-color-picker__clear[data-v-307491dd]:hover {
	background-color: var(--color-background-hover);
	color: var(--color-main-text);
}
.cn-color-picker__clear[data-v-307491dd]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}

/* Strip Chrome's hardcoded light-mode palette so it adopts the active theme.
   The class lands on the picker's root via Vue's class merging, so target it
   directly — NOT as a descendant. */
.cn-color-picker__chrome[data-v-307491dd] {
	background: var(--color-main-background);
	background-color: var(--color-main-background);
	box-shadow: none;
	color: var(--color-main-text);
	font-family: var(--font-face);
	overflow: hidden;
}
.cn-color-picker__chrome[data-v-307491dd] .vc-chrome-body,
.cn-color-picker__chrome[data-v-307491dd] .vc-chrome-saturation-wrap,
.cn-color-picker__chrome[data-v-307491dd] .vc-chrome-color-wrap,
.cn-color-picker__chrome[data-v-307491dd] .vc-chrome-active-color {
	background-color: var(--color-main-background);
}
.cn-color-picker__chrome[data-v-307491dd] .vc-chrome-toggle-icon-highlight {
	background: var(--color-background-hover);
}
.cn-color-picker__chrome[data-v-307491dd] .vc-hue-picker,
.cn-color-picker__chrome[data-v-307491dd] .vc-alpha-picker {
	background-color: var(--color-main-background);
	box-shadow: 0 1px 4px 0 var(--color-box-shadow);
}
.cn-color-picker__chrome[data-v-307491dd] .vc-chrome-fields .vc-input__input {
	background-color: var(--color-main-background);
	color: var(--color-main-text);
	box-shadow: inset 0 0 0 1px var(--color-border);
}
.cn-color-picker__chrome[data-v-307491dd] .vc-chrome-fields .vc-input__label {
	color: var(--color-text-maxcontrast);
}
.cn-color-picker__chrome[data-v-307491dd] .vc-chrome-toggle-icon svg path {
	fill: var(--color-main-text);
}

/* When `mode` is set, lock the field-mode toggle so the user can't switch
   between hex/rgb/hsl. */
.cn-color-picker__chrome--locked-mode[data-v-307491dd] .vc-chrome-toggle-btn {
	display: none;
}


.cn-color-picker__popper .v-popper__inner,
.cn-color-picker__popper .v-popper__wrapper {
	background: var(--color-main-background);
	background-color: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-color-picker__popper .v-popper__arrow-inner,
.cn-color-picker__popper .v-popper__arrow-outer {
	border-color: var(--color-main-background);
}

/* Default NcPopover style sets `top: -9px` with specificity (0,4,1) using a
   hashed class name; bump with !important rather than depend on the hash. */
.cn-color-picker__popper .v-popper__arrow-container {
	top: -10px !important;
}


.cn-label-widget-form[data-v-5569bc73] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-label-widget-form__color-label[data-v-5569bc73] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	font-size: 14px;
}
.cn-label-widget-form__color[data-v-5569bc73] {
	width: 48px;
	height: 32px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background: transparent;
}


.cn-label-widget[data-v-4dc338aa] {
	width: 100%;
	height: 100%;
}
.cn-label-widget__text[data-v-4dc338aa] {
	/* Safety net — keeps long single words wrapping even if the inline
	   overflow-wrap style is overridden by host styles. */
	overflow-wrap: break-word;
	max-width: 100%;
}


.cn-markdown-editor[data-v-1d1cd5af] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	overflow: hidden;
}
.cn-markdown-editor__toolbar[data-v-1d1cd5af] {
	display: flex;
	gap: 4px;
	padding: 6px;
	border-bottom: 1px solid var(--color-border);
	background: var(--color-background-hover);
}
.cn-markdown-editor__tool[data-v-1d1cd5af] {
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 4px 8px;
	cursor: pointer;
	font-family: monospace;
	min-width: 28px;
}
.cn-markdown-editor__tool[data-v-1d1cd5af]:hover {
	background: var(--color-background-darker, var(--color-background-hover));
}
.cn-markdown-editor__spacer[data-v-1d1cd5af] {
	flex: 1 1 auto;
}
.cn-markdown-editor__panes[data-v-1d1cd5af] {
	display: grid;
	grid-template-columns: 1fr;
	min-height: 200px;
}
.cn-markdown-editor__panes[data-mode="split"][data-v-1d1cd5af] {
	grid-template-columns: 1fr 1fr;
}
.cn-markdown-editor__textarea[data-v-1d1cd5af] {
	border: none;
	outline: none;
	padding: 10px 12px;
	font-family: monospace;
	font-size: 0.95em;
	resize: vertical;
	width: 100%;
	background: var(--color-main-background);
	color: var(--color-main-text);
	/* Nested list indents are single tabs (see LIST_INDENT); render them
	   compactly rather than the 8-char browser default. */
	tab-size: 2;
	-moz-tab-size: 2;
}
.cn-markdown-editor__preview[data-v-1d1cd5af] {
	padding: 10px 14px;
	border-left: 1px solid var(--color-border);
	background: var(--color-main-background);
	overflow-y: auto;
	min-height: 200px;
}
.cn-markdown-editor__panes[data-mode="preview"] .cn-markdown-editor__preview[data-v-1d1cd5af] {
	border-left: none;
}
.cn-markdown-editor__hint[data-v-1d1cd5af] {
	color: var(--color-text-maxcontrast);
	padding: 0 10px 8px;
}

/* WYSIWYG (Toast UI) mode — themed with Nextcloud CSS variables. */
.cn-markdown-editor__wysiwyg[data-v-1d1cd5af] {
	width: 100%;
}
.cn-markdown-editor__wysiwyg[data-v-1d1cd5af] .toastui-editor-defaultUI {
	font-family: var(--font-face) !important;
	background-color: var(--color-main-background) !important;
	border: none !important;
}
.cn-markdown-editor__wysiwyg[data-v-1d1cd5af] .toastui-editor-toolbar {
	background-color: var(--color-background-hover) !important;
	border-bottom: 1px solid var(--color-border-dark) !important;
}
.cn-markdown-editor__wysiwyg[data-v-1d1cd5af] .toastui-editor-toolbar-icons button {
	color: var(--color-main-text) !important;
	background-color: transparent !important;
	border: none !important;
}
.cn-markdown-editor__wysiwyg[data-v-1d1cd5af] .toastui-editor-toolbar-icons button:hover {
	background-color: var(--color-background-dark) !important;
}
.cn-markdown-editor__wysiwyg[data-v-1d1cd5af] .toastui-editor-contents,
.cn-markdown-editor__wysiwyg[data-v-1d1cd5af] .ProseMirror {
	color: var(--color-main-text) !important;
	background-color: var(--color-main-background) !important;
	font-family: var(--font-face) !important;
}


.cn-text-table-editor[data-v-7e9db257] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-text-table-editor__toolbar[data-v-7e9db257] {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
	align-items: center;
}
.cn-text-table-editor__alignments[data-v-7e9db257] {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	align-items: center;
}
.cn-text-table-editor__hint[data-v-7e9db257] {
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-text-table-editor__inline[data-v-7e9db257] {
	display: inline-flex;
	gap: 4px;
	align-items: center;
	font-size: 13px;
}
.cn-text-table-editor__btn[data-v-7e9db257] {
	padding: 4px 8px;
	font-size: 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	cursor: pointer;
}
.cn-text-table-editor__btn[disabled][data-v-7e9db257] {
	opacity: 0.5;
	cursor: not-allowed;
}
.cn-text-table-editor__align-select[data-v-7e9db257] {
	font-size: 12px;
	padding: 2px 4px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
}
.cn-text-table-editor__error[data-v-7e9db257] {
	color: var(--color-error, #d32f2f);
	font-size: 12px;
	padding: 4px 8px;
	border: 1px solid var(--color-error, #d32f2f);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
}
.cn-text-table-editor__grid[data-v-7e9db257] {
	border-collapse: collapse;
	width: 100%;
}
.cn-text-table-editor__cell[data-v-7e9db257] {
	border: 1px solid var(--color-border);
	padding: 0;
	vertical-align: top;
}
.cn-text-table-editor__cell--header[data-v-7e9db257] {
	background: var(--color-background-hover);
	font-weight: bold;
}
.cn-text-table-editor__cell--anchor[data-v-7e9db257] {
	outline: 2px solid var(--color-primary, #006aa3);
	outline-offset: -2px;
}
.cn-text-table-editor__cell--selected[data-v-7e9db257] {
	background: var(--color-primary-light, #e8f1f8);
}
.cn-text-table-editor__input[data-v-7e9db257] {
	width: 100%;
	padding: 6px 8px;
	border: none;
	background: transparent;
	color: inherit;
	font: inherit;
	text-align: inherit;
	box-sizing: border-box;
}
.cn-text-table-editor__input[data-v-7e9db257]:focus {
	outline: none;
}


.cn-text-widget-form[data-v-61d976cf] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-text-widget-form__field[data-v-61d976cf] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-size: 14px;
}
.cn-text-widget-form__textarea[data-v-61d976cf] {
	width: 100%;
	min-height: 96px;
	padding: 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	font: inherit;
	resize: vertical;
}
.cn-text-widget-form__color-label[data-v-61d976cf] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	font-size: 14px;
}
.cn-text-widget-form__color[data-v-61d976cf] {
	width: 48px;
	height: 32px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background: transparent;
}
.cn-text-widget-form__mode[data-v-61d976cf] {
	width: 100%;
}


.cn-image-widget-form[data-v-098a15fe] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-image-widget-form__upload-row[data-v-098a15fe] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-image-widget-form__upload-label[data-v-098a15fe] {
	display: inline-flex;
	cursor: pointer;
}
.cn-image-widget-form__file-input[data-v-098a15fe] {
	display: none;
}
.cn-image-widget-form__upload-button[data-v-098a15fe] {
	padding: 8px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background-color: var(--color-background-hover);
	font-size: 14px;
	transition: background-color 0.2s;
}
.cn-image-widget-form__upload-label:hover .cn-image-widget-form__upload-button[data-v-098a15fe] {
	background-color: var(--color-background-dark);
}
.cn-image-widget-form__pending[data-v-098a15fe] {
	margin: 0;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-image-widget-form__error[data-v-098a15fe] {
	margin: 0;
	font-size: 12px;
	color: var(--color-error);
}
.cn-image-widget-form__preview-wrap[data-v-098a15fe] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-image-widget-form__preview[data-v-098a15fe] {
	max-width: 100%;
	max-height: 160px;
	object-fit: contain;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-dark);
}
.cn-image-widget-form__preview-error[data-v-098a15fe] {
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}


.cn-image-widget[data-v-6b7d1eb9] {
	width: 100%;
	height: 100%;
	overflow: hidden;
}
.cn-image-widget__img[data-v-6b7d1eb9] {
	display: block;
}
.cn-image-widget__placeholder[data-v-6b7d1eb9] {
	width: 100%;
	height: 100%;
}
.cn-image-widget__placeholder-label[data-v-6b7d1eb9] {
	font-size: 13px;
}


.cn-link-button-widget-form[data-v-7d0f70af] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-link-button-widget-form__color-label[data-v-7d0f70af] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	font-size: 14px;
}
.cn-link-button-widget-form__icon-field[data-v-7d0f70af] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-link-button-widget-form__icon-label[data-v-7d0f70af] {
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}
.cn-link-button-widget-form__color[data-v-7d0f70af] {
	width: 48px;
	height: 32px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background: transparent;
}
.cn-link-button-widget-form__list-editor[data-v-7d0f70af] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius, 6px);
	background: var(--color-background-hover);
}
.cn-link-button-widget-form__list-title[data-v-7d0f70af] {
	margin: 0;
	font-size: 14px;
	font-weight: 600;
}
.cn-link-button-widget-form__list-empty[data-v-7d0f70af],
.cn-link-button-widget-form__list-hint[data-v-7d0f70af] {
	margin: 0;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}
.cn-link-button-widget-form__link-list[data-v-7d0f70af] {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-link-button-widget-form__link-row[data-v-7d0f70af] {
	display: grid;
	grid-template-columns: auto auto 1fr auto;
	align-items: start;
	gap: 8px;
	padding: 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
}
.cn-link-button-widget-form__link-row--invalid[data-v-7d0f70af] {
	border-color: var(--color-error, #d33);
	box-shadow: 0 0 0 1px var(--color-error, #d33) inset;
}
.cn-link-button-widget-form__row-handle[data-v-7d0f70af] {
	width: 28px;
	height: 28px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	color: var(--color-main-text);
	cursor: pointer;
	font-size: 14px;
}
.cn-link-button-widget-form__row-handle[data-v-7d0f70af]:disabled {
	opacity: 0.4;
	cursor: not-allowed;
}
.cn-link-button-widget-form__row-fields[data-v-7d0f70af] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-link-button-widget-form__row-remove[data-v-7d0f70af] {
	padding: 6px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	color: var(--color-main-text);
	cursor: pointer;
	font-size: 13px;
}
.cn-link-button-widget-form__add-link[data-v-7d0f70af] {
	align-self: flex-start;
	padding: 6px 14px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-primary);
	color: var(--color-primary-text);
	cursor: pointer;
	font-size: 13px;
}
.cn-link-button-widget-form__add-link[data-v-7d0f70af]:disabled {
	opacity: 0.6;
	cursor: not-allowed;
}


.cn-link-button-widget[data-v-23af432f] {
	width: 100%;
	height: 100%;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 8px;
}
.cn-link-button-widget--list[data-v-23af432f] {
	align-items: stretch;
	justify-content: stretch;
}
.cn-link-button-widget__button[data-v-23af432f] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 8px;
	width: 100%;
	height: 100%;
	min-height: 96px;
	padding: 12px;
	border: none;
	border-radius: var(--border-radius-large, 8px);
	cursor: pointer;
	font-size: 14px;
	font-weight: 600;
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.cn-link-button-widget__button[data-v-23af432f]:disabled {
	opacity: 0.6;
	cursor: not-allowed;
}
.cn-link-button-widget__button[data-v-23af432f]:hover:not(:disabled) {
	transform: translateY(-2px);
	box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
}
.cn-link-button-widget__icon[data-v-23af432f] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 48px;
	height: 48px;
}
.cn-link-button-widget__label[data-v-23af432f] {
	display: block;
	overflow: hidden;
	text-overflow: ellipsis;
	max-width: 100%;
}
.cn-link-button-widget__list[data-v-23af432f] {
	width: 100%;
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
}
.cn-link-button-widget__list--vertical[data-v-23af432f] {
	flex-direction: column;
}
.cn-link-button-widget__list--horizontal[data-v-23af432f] {
	flex-direction: row;
	flex-wrap: wrap;
	align-items: flex-start;
}
.cn-link-button-widget__list-item-wrap[data-v-23af432f] {
	margin: 0;
	padding: 0;
	list-style: none;
}
.cn-link-button-widget__list-item[data-v-23af432f] {
	display: flex;
	align-items: center;
	gap: 8px;
	width: 100%;
	padding: 8px 12px;
	border: none;
	border-radius: var(--border-radius, 6px);
	cursor: pointer;
	font-size: 14px;
	font-weight: 500;
	text-align: left;
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.cn-link-button-widget__list-item--horizontal[data-v-23af432f] {
	width: auto;
}
.cn-link-button-widget__list-item[data-v-23af432f]:disabled {
	opacity: 0.6;
	cursor: not-allowed;
}
.cn-link-button-widget__list-item[data-v-23af432f]:hover:not(:disabled) {
	transform: translateY(-2px);
	box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
}
.cn-link-button-widget__list-icon[data-v-23af432f] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 24px;
	height: 24px;
	flex-shrink: 0;
}
.cn-link-button-widget__list-label[data-v-23af432f] {
	display: inline-block;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}


.cn-divider-widget-form[data-v-19cf9fbd] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-divider-widget-form__hint[data-v-19cf9fbd] {
	margin: 0;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}
.cn-divider-widget-form__color-label[data-v-19cf9fbd] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	font-size: 14px;
}
.cn-divider-widget-form__color[data-v-19cf9fbd] {
	width: 48px;
	height: 32px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background: transparent;
}


.cn-header-widget-form[data-v-3741270f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-header-widget-form__field[data-v-3741270f] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-size: 14px;
}
.cn-header-widget-form__label[data-v-3741270f] {
	font-weight: 500;
}
.cn-header-widget-form__color-label[data-v-3741270f] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	font-size: 14px;
}
.cn-header-widget-form__upload-row[data-v-3741270f] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-header-widget-form__upload-label[data-v-3741270f] {
	display: inline-flex;
	cursor: pointer;
}
.cn-header-widget-form__pending[data-v-3741270f] {
	margin: 0;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-header-widget-form__file-input[data-v-3741270f] {
	display: none;
}
.cn-header-widget-form__upload-button[data-v-3741270f] {
	padding: 8px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background-color: var(--color-background-hover);
	font-size: 14px;
}
.cn-header-widget-form__upload-label:hover .cn-header-widget-form__upload-button[data-v-3741270f] {
	background-color: var(--color-background-dark);
}
.cn-header-widget-form__error[data-v-3741270f] {
	margin: 0;
	font-size: 12px;
	color: var(--color-error);
}
.cn-header-widget-form__color[data-v-3741270f] {
	width: 48px;
	height: 32px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background: transparent;
}
.cn-header-widget-form__range[data-v-3741270f] {
	width: 100%;
}
.cn-header-widget-form__fieldset[data-v-3741270f] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 12px;
}
.cn-header-widget-form__legend[data-v-3741270f] {
	font-size: 13px;
	font-weight: 600;
	padding: 0 4px;
}


.cn-quicklinks-widget-form[data-v-b9c8e6a2] {
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.cn-quicklinks-widget-form__settings[data-v-b9c8e6a2] {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: 12px;
}
.cn-quicklinks-widget-form__checkbox-label[data-v-b9c8e6a2] {
	display: flex;
	align-items: center;
	gap: 8px;
	font-size: 14px;
}
.cn-quicklinks-widget-form__links[data-v-b9c8e6a2] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-quicklinks-widget-form__table[data-v-b9c8e6a2] {
	width: 100%;
	border-collapse: collapse;
}
.cn-quicklinks-widget-form__table th[data-v-b9c8e6a2],
.cn-quicklinks-widget-form__table td[data-v-b9c8e6a2] {
	padding: 4px;
	font-size: 13px;
	text-align: left;
	vertical-align: top;
}
.cn-quicklinks-widget-form__input[data-v-b9c8e6a2] {
	width: 100%;
	padding: 6px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	font-size: 13px;
	background: var(--color-main-background);
	color: var(--color-main-text);
	box-sizing: border-box;
}
.cn-quicklinks-widget-form__input--invalid[data-v-b9c8e6a2] {
	border-color: var(--color-error, #d32f2f);
}
.cn-quicklinks-widget-form__inline-error[data-v-b9c8e6a2] {
	display: block;
	color: var(--color-error, #d32f2f);
	font-size: 11px;
	margin-top: 2px;
}
.cn-quicklinks-widget-form__color[data-v-b9c8e6a2] {
	width: 32px;
	height: 24px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background: transparent;
}
.cn-quicklinks-widget-form__row-action[data-v-b9c8e6a2],
.cn-quicklinks-widget-form__add[data-v-b9c8e6a2],
.cn-quicklinks-widget-form__bulk-apply[data-v-b9c8e6a2] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	color: var(--color-main-text);
	cursor: pointer;
	padding: 4px 10px;
	font-size: 13px;
}
.cn-quicklinks-widget-form__bulk[data-v-b9c8e6a2] {
	border: 1px dashed var(--color-border);
	border-radius: var(--border-radius);
	padding: 8px;
}
.cn-quicklinks-widget-form__bulk-input[data-v-b9c8e6a2] {
	width: 100%;
	padding: 6px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	font-family: monospace;
	font-size: 12px;
	box-sizing: border-box;
	margin-bottom: 8px;
}


.cn-quicklinks-widget[data-v-48fb4f2f] {
	width: 100%;
	height: 100%;
	padding: 8px;
	box-sizing: border-box;
	overflow: auto;
}
.cn-quicklinks-widget__list[data-v-48fb4f2f] {
	gap: 12px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.cn-quicklinks-widget__item[data-v-48fb4f2f] {
	list-style: none;
	/* Without this, flex/grid give the item an automatic minimum size equal
	   to its unbreakable (nowrap) label text, overriding max-width below and
	   silently defeating the label's ellipsis truncation. */
	min-width: 0;
}
.cn-quicklinks-widget__link[data-v-48fb4f2f] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: flex-start;
	gap: 4px;
	padding: 6px;
	box-sizing: border-box;
	margin: 0 auto;
	max-width: calc(var(--cn-quicklinks-icon-size) * 2);
	color: var(--color-main-text);
	text-decoration: none;
	border-radius: var(--border-radius, 4px);
	transition: transform 0.2s ease, box-shadow 0.2s ease, opacity 0.15s ease,
		outline 0.1s ease;
	position: relative;
	cursor: pointer;
}
.cn-quicklinks-widget__link[data-v-48fb4f2f]:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.cn-quicklinks-widget__icon[data-v-48fb4f2f] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
}
.cn-quicklinks-widget__icon img[data-v-48fb4f2f] {
	max-width: 100%;
	max-height: 100%;
	display: block;
}
.cn-quicklinks-widget__label[data-v-48fb4f2f] {
	font-size: 12px;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
}
.cn-quicklinks-widget__label--below[data-v-48fb4f2f] {
	display: block;
	width: 100%;
	/* align-items: center on the tile above does not stretch children to its
	   width by default — without this the label still shrink-wraps to its
	   own content and never hits the overflow/ellipsis rules above. */
	align-self: stretch;
	min-width: 0;
	text-align: center;
}
.cn-quicklinks-widget__label--overlay[data-v-48fb4f2f] {
	display: none;
	position: absolute;
	bottom: 0;
	left: 0;
	right: 0;
	padding: 2px 4px;
	background-color: rgba(0, 0, 0, 0.6);
	color: #fff;
	text-align: center;
	border-radius: 0 0 var(--border-radius, 4px) var(--border-radius, 4px);
}
.cn-quicklinks-widget__link:hover .cn-quicklinks-widget__label--overlay[data-v-48fb4f2f],
.cn-quicklinks-widget__link:focus .cn-quicklinks-widget__label--overlay[data-v-48fb4f2f] {
	display: block;
}
.cn-quicklinks-widget--edit-mode .cn-quicklinks-widget__link[data-v-48fb4f2f] {
	cursor: not-allowed;
}
.cn-quicklinks-widget--hover-lift .cn-quicklinks-widget__link[data-v-48fb4f2f]:hover {
	transform: translateY(-3px);
	box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.cn-quicklinks-widget--hover-fade:hover .cn-quicklinks-widget__link[data-v-48fb4f2f] {
	opacity: 0.6;
}
.cn-quicklinks-widget--hover-fade .cn-quicklinks-widget__link[data-v-48fb4f2f]:hover {
	opacity: 1;
}
.cn-quicklinks-widget--hover-border .cn-quicklinks-widget__link[data-v-48fb4f2f]:hover {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.cn-quicklinks-widget--hover-none .cn-quicklinks-widget__link[data-v-48fb4f2f]:hover {
	cursor: pointer;
}
.cn-quicklinks-widget__empty[data-v-48fb4f2f] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 100%;
	gap: 8px;
	color: var(--color-text-maxcontrast);
	cursor: pointer;
	padding: 12px;
	box-sizing: border-box;
}
.cn-quicklinks-widget__empty-button[data-v-48fb4f2f] {
	background: transparent;
	border: none;
	cursor: pointer;
	color: inherit;
	padding: 4px;
	border-radius: var(--border-radius, 4px);
}
.cn-quicklinks-widget__empty-button[data-v-48fb4f2f]:hover {
	background: var(--color-background-hover);
}
.cn-quicklinks-widget__empty-text[data-v-48fb4f2f] {
	margin: 0;
	font-size: 13px;
	text-align: center;
	max-width: 24em;
}


.cn-video-form[data-v-4171597e] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-video-form__hint[data-v-4171597e] {
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-video-form__error[data-v-4171597e] {
	color: var(--color-error);
	font-size: 13px;
}


.cn-video-widget[data-v-292d2cf9] {
	width: 100%;
	height: 100%;
	overflow: hidden;
}
.cn-video-widget__media[data-v-292d2cf9] {
	position: relative;
}
.cn-video-widget__iframe[data-v-292d2cf9],
.cn-video-widget__video[data-v-292d2cf9] {
	width: 100%;
	height: 100%;
	border: 0;
	display: block;
	background: var(--color-background-dark);
}
.cn-video-widget__placeholder[data-v-292d2cf9] {
	width: 100%;
	height: 100%;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 8px;
	color: var(--color-text-maxcontrast);
	padding: 16px;
	text-align: center;
}
.cn-video-widget__placeholder-label[data-v-292d2cf9] {
	font-size: 13px;
}


.cn-news-form[data-v-1be4678f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-news-form__label[data-v-1be4678f] {
	font-size: 13px;
	font-weight: 600;
}
.cn-news-form__feed-row[data-v-1be4678f] {
	display: flex;
	align-items: flex-end;
	gap: 6px;
}
.cn-news-form__feed-remove[data-v-1be4678f] {
	width: 32px;
	height: 32px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	cursor: pointer;
	font-size: 18px;
	line-height: 1;
}
.cn-news-form__feed-add[data-v-1be4678f] {
	align-self: flex-start;
	padding: 6px 12px;
	border: 1px dashed var(--color-border);
	border-radius: var(--border-radius);
	background: transparent;
	color: var(--color-main-text);
	cursor: pointer;
	font-size: 13px;
}
.cn-news-form__metadata[data-v-1be4678f] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding-left: 16px;
	border-left: 2px solid var(--color-border);
}


.cn-news-widget[data-v-edfb0ce2] {
	position: relative;
	width: 100%;
	height: 100%;
	overflow: hidden;
	display: flex;
	flex-direction: column;
}
.cn-news-widget__badge[data-v-edfb0ce2] {
	position: absolute;
	top: 6px;
	right: 6px;
	padding: 2px 8px;
	font-size: 11px;
	background: var(--color-warning, #ffcc00);
	color: var(--color-main-text, #000);
	border-radius: 12px;
	z-index: 2;
}
.cn-news-widget__state[data-v-edfb0ce2] {
	flex: 1;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 16px;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-news-widget__list[data-v-edfb0ce2] {
	list-style: none;
	margin: 0;
	padding: 0;
	overflow: auto;
	flex: 1;
}
.cn-news-widget--list .cn-news-widget__list[data-v-edfb0ce2] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-news-widget--grid .cn-news-widget__list[data-v-edfb0ce2] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
	gap: 12px;
}
.cn-news-widget--carousel .cn-news-widget__list[data-v-edfb0ce2] {
	display: flex;
	flex-direction: row;
	gap: 12px;
	overflow-x: auto;
	overflow-y: hidden;
}
.cn-news-widget--carousel .cn-news-widget__item[data-v-edfb0ce2] {
	flex: 0 0 220px;
}
.cn-news-widget__item-link[data-v-edfb0ce2] {
	display: flex;
	gap: 8px;
	padding: 8px;
	color: inherit;
	text-decoration: none;
	border-radius: var(--border-radius, 4px);
	transition: background-color 0.15s ease;
}
.cn-news-widget__item-link[data-v-edfb0ce2]:hover {
	background-color: var(--color-background-hover);
}
.cn-news-widget__item-link--inert[data-v-edfb0ce2] {
	cursor: default;
}
.cn-news-widget--grid .cn-news-widget__item-link[data-v-edfb0ce2],
.cn-news-widget--carousel .cn-news-widget__item-link[data-v-edfb0ce2] {
	flex-direction: column;
}
.cn-news-widget__thumb[data-v-edfb0ce2] {
	width: 64px;
	height: 64px;
	object-fit: cover;
	border-radius: var(--border-radius, 4px);
	flex-shrink: 0;
}
.cn-news-widget--grid .cn-news-widget__thumb[data-v-edfb0ce2],
.cn-news-widget--carousel .cn-news-widget__thumb[data-v-edfb0ce2] {
	width: 100%;
	height: 96px;
}
.cn-news-widget__body[data-v-edfb0ce2] {
	flex: 1;
	min-width: 0;
}
.cn-news-widget__title[data-v-edfb0ce2] {
	margin: 0 0 4px 0;
	font-size: 14px;
	font-weight: 600;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-news-widget__summary[data-v-edfb0ce2] {
	margin: 0 0 4px 0;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
}
.cn-news-widget__meta[data-v-edfb0ce2] {
	display: flex;
	justify-content: space-between;
	gap: 8px;
	font-size: 11px;
	color: var(--color-text-maxcontrast);
}


.cn-dash-tile-form[data-v-304175a2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-dash-tile-form__color-row[data-v-304175a2] {
	display: flex;
	gap: 12px;
}
.cn-dash-tile-form__color-label[data-v-304175a2] {
	flex: 1;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	font-size: 14px;
}
.cn-dash-tile-form__color[data-v-304175a2] {
	width: 48px;
	height: 32px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background: transparent;
}


.cn-dash-tile-widget[data-v-c9b712a2] {
	width: 100%;
	height: 100%;
	overflow: hidden;
	border-radius: var(--border-radius, 6px);
	background-color: var(--tile-bg-color);
}
.cn-dash-tile-widget__link[data-v-c9b712a2] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	height: 100%;
	width: 100%;
	padding: 16px;
	gap: 12px;
	text-decoration: none;
	transition: transform 0.2s ease, opacity 0.2s ease;
	color: var(--tile-text-color);
}
.cn-dash-tile-widget__link[data-v-c9b712a2]:hover {
	transform: scale(1.02);
	opacity: 0.95;
}
.cn-dash-tile-widget__icon[data-v-c9b712a2] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: auto;
	min-width: 64px;
	max-width: 80%;
	height: 64px;
	flex-shrink: 0;
}
.cn-dash-tile-widget__svg[data-v-c9b712a2] {
	width: 100%;
	height: 100%;
}
.cn-dash-tile-widget__icon-class[data-v-c9b712a2] {
	display: inline-block;
	width: 64px;
	height: 64px;
	background-size: 64px;
	filter: brightness(0) invert(1);
}
.cn-dash-tile-widget__icon-img[data-v-c9b712a2] {
	width: auto;
	height: 100%;
	max-width: 100%;
	object-fit: contain;
}
.cn-dash-tile-widget__emoji[data-v-c9b712a2] {
	font-size: 56px;
	line-height: 1;
}
.cn-dash-tile-widget__title[data-v-c9b712a2] {
	font-size: 16px;
	font-weight: 600;
	text-align: center;
	overflow-wrap: anywhere;
	line-height: 1.3;
}


.cn-links-form[data-v-5421cd3d] {
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.cn-links-form__sections[data-v-5421cd3d] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-links-form__section[data-v-5421cd3d] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius, 4px);
	background-color: var(--color-background-hover);
}
.cn-links-form__section-header[data-v-5421cd3d] {
	display: flex;
	gap: 8px;
	align-items: center;
}
.cn-links-form__section-title[data-v-5421cd3d] {
	flex: 1;
	font-weight: 600;
	font-size: 14px;
	padding: 6px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background-color: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-links-form__section-actions[data-v-5421cd3d] {
	display: flex;
	gap: 4px;
}
.cn-links-form__links[data-v-5421cd3d] {
	display: flex;
	flex-direction: column;
	gap: 6px;
	padding-left: 8px;
}
.cn-links-form__link-row[data-v-5421cd3d] {
	display: flex;
	gap: 6px;
	align-items: center;
	flex-wrap: wrap;
}
.cn-links-form__input[data-v-5421cd3d] {
	flex: 1;
	min-width: 80px;
	padding: 6px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background-color: var(--color-main-background);
	color: var(--color-main-text);
	font-size: 13px;
}
.cn-links-form__link-row--invalid .cn-links-form__input[data-v-5421cd3d] {
	border-color: var(--color-error);
}
.cn-links-form__input--narrow[data-v-5421cd3d] {
	flex: 0 0 auto;
	width: 110px;
}
.cn-links-form__btn[data-v-5421cd3d] {
	padding: 4px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background-color: var(--color-main-background);
	color: var(--color-main-text);
	cursor: pointer;
	font-size: 13px;
}
.cn-links-form__btn--small[data-v-5421cd3d] {
	padding: 2px 6px;
	font-size: 12px;
}
.cn-links-form__btn--ghost[data-v-5421cd3d] {
	border-style: dashed;
	background-color: transparent;
	align-self: flex-start;
}
.cn-links-form__btn--danger[data-v-5421cd3d] {
	border-color: var(--color-error);
	color: var(--color-error);
}
.cn-links-form__btn[data-v-5421cd3d]:disabled {
	opacity: 0.4;
	cursor: not-allowed;
}
.cn-links-form__options[data-v-5421cd3d] {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
	gap: 12px;
	padding-top: 12px;
	border-top: 1px solid var(--color-border);
}
.cn-links-form__option[data-v-5421cd3d] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-size: 13px;
}
.cn-links-form__option--checkbox[data-v-5421cd3d] {
	flex-direction: row;
	align-items: center;
	gap: 6px;
}
.cn-links-form__error[data-v-5421cd3d] {
	margin: 0;
	color: var(--color-error);
	font-size: 13px;
}


.cn-links-widget[data-v-355ad3f5] {
	width: 100%;
	height: 100%;
	overflow: auto;
	padding: 12px;
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.cn-links-widget__empty[data-v-355ad3f5] {
	margin: auto;
	color: var(--color-text-maxcontrast);
	text-align: center;
	font-size: 14px;
}
.cn-links-widget__section[data-v-355ad3f5] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-links-widget__section-title[data-v-355ad3f5] {
	margin: 0;
	font-size: 14px;
	font-weight: 600;
	color: var(--color-text-light, var(--color-main-text));
}
.cn-links-widget__items[data-v-355ad3f5] {
	display: grid;
	grid-template-columns: repeat(var(--cn-links-widget-cols, 3), 1fr);
	gap: 8px;
}
.cn-links-widget--icon-only .cn-links-widget__items[data-v-355ad3f5] {
	grid-template-columns: repeat(var(--cn-links-widget-cols, 3), minmax(0, 1fr));
	gap: 12px;
	justify-items: center;
}
.cn-links-widget__link[data-v-355ad3f5] {
	display: flex;
	align-items: center;
	gap: 8px;
	color: var(--color-main-text);
	text-decoration: none;
	border-radius: var(--border-radius, 4px);
	padding: 6px 8px;
	transition: background-color 0.12s ease;
}
.cn-links-widget__link[data-v-355ad3f5]:hover,
.cn-links-widget__link[data-v-355ad3f5]:focus-visible {
	background-color: var(--color-background-hover);
	text-decoration: none;
}
.cn-links-widget__link--card[data-v-355ad3f5] {
	flex-direction: column;
	align-items: flex-start;
	padding: 12px;
	border: 1px solid var(--color-border);
	background-color: var(--color-main-background);
}
.cn-links-widget__link--icon-only[data-v-355ad3f5] {
	justify-content: center;
	padding: 8px;
}
.cn-links-widget__icon-wrap[data-v-355ad3f5] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
}
.cn-links-widget__label[data-v-355ad3f5] {
	font-size: 14px;
	font-weight: 500;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	max-width: 100%;
}
.cn-links-widget__link--card .cn-links-widget__label[data-v-355ad3f5] {
	white-space: normal;
}
.cn-links-widget__description[data-v-355ad3f5] {
	font-size: 12px;
	color: var(--color-text-maxcontrast);
	line-height: 1.4;
}
@media (max-width: 600px) {
.cn-links-widget__items[data-v-355ad3f5] {
		grid-template-columns: 1fr;
}
}


.cn-menu-item-editor[data-v-583d480f] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-menu-item-editor__row[data-v-583d480f] {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 4px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
}
.cn-menu-item-editor__depth[data-v-583d480f] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	min-width: 80px;
}
.cn-menu-item-editor__input[data-v-583d480f] {
	padding: 4px 6px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	font-size: 13px;
	flex: 1;
	min-width: 60px;
}
.cn-menu-item-editor__btn[data-v-583d480f] {
	padding: 4px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	color: var(--color-main-text);
	font-size: 12px;
	cursor: pointer;
}
.cn-menu-item-editor__btn--danger[data-v-583d480f] {
	color: var(--color-error, #c00);
}
.cn-menu-item-editor__children[data-v-583d480f] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}


.cn-menu-form[data-v-59dab10f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-menu-form__toggle[data-v-59dab10f] {
	display: flex;
	align-items: center;
	gap: 8px;
	font-size: 14px;
}
.cn-menu-form__items[data-v-59dab10f] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 8px;
}
.cn-menu-form__items-title[data-v-59dab10f] {
	margin: 0;
	font-size: 14px;
	font-weight: 600;
}
.cn-menu-form__add-top[data-v-59dab10f] {
	align-self: flex-start;
	padding: 6px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	color: var(--color-main-text);
	cursor: pointer;
	font-size: 13px;
}


.cn-menu-item-icon[data-v-29ebb837] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
}


.cn-menu-tree-node[data-v-218d7acb] {
	list-style: none;
}
.cn-menu-tree-node__row[data-v-218d7acb] {
	display: flex;
	align-items: center;
	gap: 4px;
	padding: 4px 6px;
	border-radius: var(--border-radius);
}
.cn-menu-tree-node__row[data-v-218d7acb]:hover {
	background: var(--color-background-hover);
}
.cn-menu-tree-node__caret[data-v-218d7acb],
.cn-menu-tree-node__caret-spacer[data-v-218d7acb] {
	width: 18px;
	height: 18px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	background: transparent;
	border: none;
	cursor: pointer;
	color: inherit;
	font-size: 12px;
	padding: 0;
}
.cn-menu-tree-node__caret-spacer[data-v-218d7acb] {
	cursor: default;
}
.cn-menu-tree-node__label-button[data-v-218d7acb] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	background: transparent;
	border: none;
	cursor: pointer;
	color: inherit;
	font-size: 14px;
	text-align: left;
	padding: 2px 4px;
	flex: 1;
}
.cn-menu-tree-node__label-button[data-v-218d7acb]:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.cn-menu-tree-node__icon[data-v-218d7acb] {
	display: inline-flex;
	width: 20px;
	height: 20px;
}
.cn-menu-tree-node__icon--hidden[data-v-218d7acb] {
	visibility: hidden;
}
.cn-menu-tree-node__children[data-v-218d7acb] {
	margin: 0;
	padding: 0;
	list-style: none;
}


.cn-menu-widget[data-v-b6a2c5e2] {
	width: 100%;
	height: 100%;
	padding: 4px;
	color: var(--color-main-text);
	font-size: 14px;
}
.cn-menu-widget__empty[data-v-b6a2c5e2] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 16px;
	color: var(--color-text-maxcontrast);
	font-style: italic;
	border: 1px dashed var(--color-border);
	border-radius: var(--border-radius);
}
.cn-menu-widget__empty--clickable[data-v-b6a2c5e2] {
	cursor: pointer;
}
.cn-menu-widget__empty-icon[data-v-b6a2c5e2] {
	font-size: 18px;
}
.cn-menu-widget__bar[data-v-b6a2c5e2] {
	display: flex;
	flex-direction: row;
	gap: 4px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.cn-menu-widget__bar--vertical[data-v-b6a2c5e2] {
	flex-direction: column;
}
.cn-menu-widget__bar-item[data-v-b6a2c5e2] {
	position: relative;
	list-style: none;
}
.cn-menu-widget__bar-button[data-v-b6a2c5e2],
.cn-menu-widget__dropdown-item[data-v-b6a2c5e2],
.cn-menu-widget__mega-group-title[data-v-b6a2c5e2],
.cn-menu-widget__mega-leaf[data-v-b6a2c5e2] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 6px 10px;
	background: transparent;
	border: none;
	border-radius: var(--border-radius);
	color: inherit;
	font-size: 14px;
	cursor: pointer;
	text-align: left;
	width: 100%;
}
.cn-menu-widget__mega-group-title[data-v-b6a2c5e2] {
	font-weight: 600;
}
.cn-menu-widget__bar-button[data-v-b6a2c5e2]:hover,
.cn-menu-widget__dropdown-item[data-v-b6a2c5e2]:hover,
.cn-menu-widget__mega-group-title[data-v-b6a2c5e2]:hover,
.cn-menu-widget__mega-leaf[data-v-b6a2c5e2]:hover {
	background: var(--color-background-hover);
}
.cn-menu-widget__bar-button[data-v-b6a2c5e2]:focus-visible,
.cn-menu-widget__dropdown-item[data-v-b6a2c5e2]:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.cn-menu-widget__icon[data-v-b6a2c5e2] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 20px;
	height: 20px;
}
.cn-menu-widget__icon--hidden[data-v-b6a2c5e2] {
	visibility: hidden;
}
.cn-menu-widget__caret[data-v-b6a2c5e2] {
	margin-left: auto;
	font-size: 10px;
}
.cn-menu-widget__dropdown[data-v-b6a2c5e2] {
	position: absolute;
	top: 100%;
	left: 0;
	z-index: 50;
	margin: 4px 0 0;
	padding: 4px;
	min-width: 180px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
	list-style: none;
}
.cn-menu-widget__dropdown-item-wrap[data-v-b6a2c5e2] {
	position: relative;
}
.cn-menu-widget__flyout[data-v-b6a2c5e2] {
	position: absolute;
	top: 0;
	left: 100%;
	margin-left: 2px;
	padding: 4px;
	min-width: 160px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
	list-style: none;
}
.cn-menu-widget__mega-panel[data-v-b6a2c5e2] {
	margin-top: 4px;
	padding: 12px;
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
	gap: 12px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
}
.cn-menu-widget__mega-leaves[data-v-b6a2c5e2] {
	margin: 4px 0 0;
	padding: 0;
	list-style: none;
}
.cn-menu-widget__tree[data-v-b6a2c5e2] {
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Active-item highlight variants. */
.cn-menu-widget--highlight-underline .cn-menu-widget__item--active[data-v-b6a2c5e2] {
	border-bottom: 3px solid var(--color-primary);
}
.cn-menu-widget--highlight-underline .cn-menu-widget__item--in-path[data-v-b6a2c5e2] {
	border-bottom: 2px solid var(--color-primary);
	opacity: 0.85;
}
.cn-menu-widget--highlight-background .cn-menu-widget__item--active[data-v-b6a2c5e2],
.cn-menu-widget--highlight-background .cn-menu-widget__item--in-path[data-v-b6a2c5e2] {
	background: var(--color-primary-element-light, rgba(0, 112, 192, 0.1));
	color: var(--color-primary);
}
.cn-menu-widget--highlight-left-bar .cn-menu-widget__item--active[data-v-b6a2c5e2] {
	border-left: 5px solid var(--color-primary);
	padding-left: 6px;
}
.cn-menu-widget--highlight-left-bar .cn-menu-widget__item--in-path[data-v-b6a2c5e2] {
	border-left: 4px solid var(--color-primary);
	padding-left: 7px;
	opacity: 0.85;
}


.cn-container-form[data-v-58dfcc4d] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-container-form__hint[data-v-58dfcc4d] {
	margin: 0;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}
.cn-container-form__color-label[data-v-58dfcc4d] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	font-size: 14px;
}
.cn-container-form__color[data-v-58dfcc4d] {
	width: 48px;
	height: 32px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background: transparent;
}


.cn-container-child[data-v-c3c26b2a] {
	width: 100%;
	height: 100%;
}
.cn-container-child--unknown[data-v-c3c26b2a] {
	display: flex;
	align-items: center;
	justify-content: center;
	color: var(--color-text-maxcontrast);
	font-style: italic;
}


.cn-container-widget[data-v-75755df6] {
	width: 100%;
	height: 100%;
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	gap: 4px;
	overflow: hidden;
}
.cn-container-widget__title[data-v-75755df6] {
	margin: 0;
	font-size: 14px;
	font-weight: 600;
	color: var(--color-text-maxcontrast, var(--color-main-text));
	pointer-events: auto;
}
.cn-container-widget__grid[data-v-75755df6] {
	flex: 1;
	min-height: 0;
}
.cn-container-widget__child[data-v-75755df6] {
	/* In view mode the container is pointer-events:none; child wrappers
	   re-enable pointer events so clicks reach the child's own handlers. */
	pointer-events: auto;
}

/*!
 * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */
.toastify.dialogs {
  min-width: 200px;
  background: none;
  background-color: var(--color-main-background);
  color: var(--color-main-text);
  box-shadow: 0 0 6px 0 var(--color-box-shadow);
  padding: 0 12px;
  margin-top: 45px;
  position: fixed;
  z-index: 10100;
  border-radius: var(--border-radius);
  display: flex;
  align-items: center;
  min-height: 50px;
}
.toastify.dialogs .toast-loader-container,
.toastify.dialogs .toast-undo-container {
  display: flex;
  align-items: center;
  width: 100%;
}
.toastify.dialogs .toast-undo-button,
.toastify.dialogs .toast-close {
  position: static;
  overflow: hidden;
  box-sizing: border-box;
  min-width: 44px;
  height: 100%;
  padding: 12px;
  white-space: nowrap;
  background-repeat: no-repeat;
  background-position: center;
  background-color: transparent;
  min-height: 0;
}
.toastify.dialogs .toast-undo-button.toast-close,
.toastify.dialogs .toast-close.toast-close {
  text-indent: 0;
  opacity: 0.4;
  border: none;
  min-height: 44px;
  margin-left: 10px;
  font-size: 0;
  /* dark theme overrides for Nextcloud 25 and later */
}
.toastify.dialogs .toast-undo-button.toast-close::before,
.toastify.dialogs .toast-close.toast-close::before {
  background-image: url("data:image/svg+xml,%3csvg%20viewBox='0%200%2016%2016'%20height='16'%20width='16'%20xmlns='http://www.w3.org/2000/svg'%20xml:space='preserve'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2'%3e%3cpath%20d='M6.4%2019%205%2017.6l5.6-5.6L5%206.4%206.4%205l5.6%205.6L17.6%205%2019%206.4%2013.4%2012l5.6%205.6-1.4%201.4-5.6-5.6L6.4%2019Z'%20style='fill-rule:nonzero'%20transform='matrix(.85714%200%200%20.85714%20-2.286%20-2.286)'/%3e%3c/svg%3e");
  content: " ";
  filter: var(--background-invert-if-dark);
  display: inline-block;
  width: 16px;
  height: 16px;
}
.toastify.dialogs .toast-undo-button.toast-undo-button,
.toastify.dialogs .toast-close.toast-undo-button {
  margin: 3px;
  height: calc(100% - 2 * 3px);
  margin-left: 12px;
}
.toastify.dialogs .toast-undo-button:hover, .toastify.dialogs .toast-undo-button:focus, .toastify.dialogs .toast-undo-button:active,
.toastify.dialogs .toast-close:hover,
.toastify.dialogs .toast-close:focus,
.toastify.dialogs .toast-close:active {
  cursor: pointer;
  opacity: 1;
}
.toastify.dialogs.toastify-top {
  right: 10px;
}
.toastify.dialogs.toast-with-click {
  cursor: pointer;
}
.toastify.dialogs.toast-error {
  border-left: 3px solid var(--color-element-error, var(--color-error));
}
.toastify.dialogs.toast-info {
  border-left: 3px solid var(--color-element-info, var(--color-primary));
}
.toastify.dialogs.toast-warning {
  border-left: 3px solid var(--color-element-warning, var(--color-warning));
}
.toastify.dialogs.toast-success {
  border-left: 3px solid var(--color-element-success, var(--color-success));
}
.toastify.dialogs.toast-undo {
  border-left: 3px solid var(--color-element-success, var(--color-success));
}
.toastify.dialogs.toast-loading {
  border-left: 3px solid var(--color-element-info, var(--color-primary));
}
.toastify.dialogs.toast-loading .toast-loader {
  display: inline-block;
  width: 20px;
  height: 20px;
  animation: rotate var(--animation-duration, 0.8s) linear infinite;
  margin-left: auto;
}

/* dark theme overrides for Nextcloud 24 and earlier */
.theme--dark .toastify.dialogs .toast-close {
  /* close icon style */
}
.theme--dark .toastify.dialogs .toast-close.toast-close::before {
  background-image: url("data:image/svg+xml,%3csvg%20viewBox='0%200%2016%2016'%20height='16'%20width='16'%20xmlns='http://www.w3.org/2000/svg'%20xml:space='preserve'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2'%3e%3cpath%20d='M6.4%2019%205%2017.6l5.6-5.6L5%206.4%206.4%205l5.6%205.6L17.6%205%2019%206.4%2013.4%2012l5.6%205.6-1.4%201.4-5.6-5.6L6.4%2019Z'%20style='fill:%23fff;fill-rule:nonzero'%20transform='matrix(.85714%200%200%20.85714%20-2.286%20-2.286)'/%3e%3c/svg%3e");
}
.nc-generic-dialog .dialog__actions {
	justify-content: space-between;
	min-width: calc(100% - 12px);
}
._pickerEntry_xk2pl_1:not(:last-of-type) {
  border-bottom: 1px solid var(--color-border);
}
._pickerEntryItem_xk2pl_5 {
  display: flex;
  align-items: center;
  height: 64px;
}
._pickerEntryIcon_xk2pl_11,
._pickerEntryPreview_xk2pl_12 {
  height: 64px;
  width: 64px;
  margin: 0 var(--secondary-margin);
  display: block;
  flex: 0 0 64px;
}
._pickerEntryIcon_xk2pl_11 {
  color: var(--color-text-maxcontrast);
}
._pickerEntryIcon_folder_xk2pl_24 {
  color: var(--color-primary-element);
}
._pickerEntryPreview_xk2pl_12 {
  overflow: hidden;
  border-radius: calc(var(--border-radius) * 2);
  object-fit: cover;
}
._pickerEntryDescription_xk2pl_34 {
  display: flex;
  flex-direction: column;
}
._pickerEntryDescription_xk2pl_34 span {
  white-space: nowrap;
}._picker_6q4ek_1 {
  --margin: 36px;
  --secondary-margin: 18px;
}
._pickerHeader_6q4ek_6 {
  position: sticky;
  z-index: 10;
  top: 0;
  padding: 0 var(--margin);
  padding-bottom: var(--secondary-margin);
  background-color: var(--color-main-background);
}
._pickerForm_6q4ek_15 {
  position: relative;
  overflow: auto;
  padding: 0 var(--margin);
  margin-top: calc(-1 * var(--secondary-margin));
}
._pickerActionSubmit_disabled_6q4ek_22 {
  opacity: 0.7;
  filter: saturate(50%);
}
._pickerSelectAll_6q4ek_27 {
  display: grid;
  width: 100%;
  margin-top: calc(var(--secondary-margin) * 1.5);
  padding-bottom: var(--secondary-margin);
  grid-template-columns: 1fr 1fr;
}
._pickerSelectAll_6q4ek_27 legend {
  display: flex;
  align-items: center;
  width: 100%;
  margin-bottom: calc(var(--secondary-margin) / 2);
}
._pickerSelectAll_6q4ek_27._conflict-picker__all_6q4ek_40 {
  position: sticky;
  top: 0;
  margin: 0;
  padding: var(--secondary-margin) 0;
  background-image: linear-gradient(to top, transparent, var(--color-main-background-blur) 10%, var(--color-main-background) 15%);
}
._pickerSelectAll_6q4ek_27._conflict-picker__all_6q4ek_40 + fieldset {
  margin-top: 0;
}
._pickerSelectAll_6q4ek_27._conflict-picker__all_6q4ek_40 label {
  font-weight: bold;
}/*!
 * SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */
/**
 * Icon styling of the file list row preview or fallback icon
 * (leading icon on the name row and header)
 */
._file-picker__file-icon_1aykw_9 {
  position: relative;
  width: 32px;
  height: 32px;
  min-width: 32px;
  min-height: 32px;
  background-repeat: no-repeat;
  background-size: contain;
  border-radius: var(--border-radius-small);
  display: flex;
  justify-content: center;
}

._file-picker__file-icon--primary_1aykw_22 {
  color: var(--color-primary-element);
}

._file-picker__file-icon-overlay_1aykw_26 {
  color: var(--color-primary-element-text);
  position: absolute;
  inset-block-start: 10px;
}/*!
 * SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */
tr.file-picker__row[data-v-7857e8bd] {
  height: var(--row-height, 50px);
}
tr.file-picker__row td[data-v-7857e8bd] {
  cursor: pointer;
  overflow: hidden;
  text-overflow: ellipsis;
  border-bottom: none;
}
tr.file-picker__row td.row-checkbox[data-v-7857e8bd] {
  padding: 0 2px;
}
tr.file-picker__row td[data-v-7857e8bd]:not(.row-checkbox) {
  padding-inline: 14px 0;
}
tr.file-picker__row td.row-size[data-v-7857e8bd] {
  text-align: end;
  padding-inline: 0 14px;
}
tr.file-picker__row td.row-name[data-v-7857e8bd] {
  padding-inline: 2px 0;
}
.file-picker__row[data-v-7857e8bd] * {
  cursor: pointer;
}
.file-picker__row--selected[data-v-7857e8bd] {
  background-color: var(--color-background-dark);
}
.file-picker__row--not-navigatable[data-v-7857e8bd] {
  filter: saturate(0.7);
  opacity: 0.7;
}
.file-picker__row--not-navigatable[data-v-7857e8bd] *, .file-picker__row--not-pickable[data-v-7857e8bd] * {
  cursor: default !important;
}
.file-picker__row[data-v-7857e8bd]:hover {
  background-color: var(--color-background-hover);
}
.file-picker__name-container[data-v-7857e8bd] {
  display: flex;
  justify-content: start;
  align-items: center;
  height: 100%;
}
.file-picker__file-name[data-v-7857e8bd] {
  padding-inline-start: 6px;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}
.file-picker__file-extension[data-v-7857e8bd] {
  color: var(--color-text-maxcontrast);
  min-width: fit-content;
}/*!
 * SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */
tr.file-picker__row[data-v-1f96131b] {
  height: var(--row-height, 50px);
}
tr.file-picker__row td[data-v-1f96131b] {
  cursor: pointer;
  overflow: hidden;
  text-overflow: ellipsis;
  border-bottom: none;
}
tr.file-picker__row td.row-checkbox[data-v-1f96131b] {
  padding: 0 2px;
}
tr.file-picker__row td[data-v-1f96131b]:not(.row-checkbox) {
  padding-inline: 14px 0;
}
tr.file-picker__row td.row-size[data-v-1f96131b] {
  text-align: end;
  padding-inline: 0 14px;
}
tr.file-picker__row td.row-name[data-v-1f96131b] {
  padding-inline: 2px 0;
}
@keyframes gradient-1f96131b {
0% {
    background-position: 0% 50%;
}
50% {
    background-position: 100% 50%;
}
100% {
    background-position: 0% 50%;
}
}
.loading-row .row-checkbox[data-v-1f96131b] {
  text-align: center !important;
}
.loading-row span[data-v-1f96131b] {
  display: inline-block;
  height: 24px;
  background: linear-gradient(to right, var(--color-background-darker), var(--color-text-maxcontrast), var(--color-background-darker));
  background-size: 600px 100%;
  border-radius: var(--border-radius);
  animation: gradient-1f96131b 12s ease infinite;
}
.loading-row .row-wrapper[data-v-1f96131b] {
  display: inline-flex;
  align-items: center;
}
.loading-row .row-checkbox span[data-v-1f96131b] {
  width: 24px;
}
.loading-row .row-name span[data-v-1f96131b]:last-of-type {
  margin-inline-start: 6px;
  width: 130px;
}
.loading-row .row-size span[data-v-1f96131b] {
  width: 80px;
}
.loading-row .row-modified span[data-v-1f96131b] {
  width: 90px;
}.file-picker__header-preview[data-v-412efd5c] {
  width: 22px;
  height: 32px;
  flex: 0 0 auto;
}
.file-picker__files[data-v-412efd5c] {
  margin: 2px;
  margin-inline-start: 12px;
  overflow: scroll auto;
}
.file-picker__files table[data-v-412efd5c] {
  width: 100%;
  max-height: 100%;
  table-layout: fixed;
}
.file-picker__files th[data-v-412efd5c] {
  position: sticky;
  z-index: 1;
  top: 0;
  background-color: var(--color-main-background);
  padding: 2px;
}
.file-picker__files th .header-wrapper[data-v-412efd5c] {
  display: flex;
}
.file-picker__files th.row-checkbox[data-v-412efd5c] {
  width: 44px;
}
.file-picker__files th.row-name[data-v-412efd5c] {
  width: 230px;
}
.file-picker__files th.row-size[data-v-412efd5c] {
  width: 100px;
}
.file-picker__files th.row-modified[data-v-412efd5c] {
  width: 120px;
}
.file-picker__files th[data-v-412efd5c]:not(.row-size) .button-vue__wrapper {
  justify-content: start;
  flex-direction: row-reverse;
}
.file-picker__files th[data-v-412efd5c]:not(.row-size) .button-vue {
  padding-inline: 16px 4px;
}
.file-picker__files th.row-size[data-v-412efd5c] .button-vue__wrapper {
  justify-content: end;
}
.file-picker__files th[data-v-412efd5c] .button-vue__wrapper {
  color: var(--color-text-maxcontrast);
}
.file-picker__files th[data-v-412efd5c] .button-vue__wrapper .button-vue__text {
  font-weight: normal;
}.file-picker__breadcrumbs[data-v-b448b141] {
  flex-grow: 0 !important;
}.file-picker__side[data-v-e1c54e23] {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 0.5rem;
  min-width: 200px;
  padding: 2px;
  margin-block-start: 7px;
  overflow: auto;
}
.file-picker__side[data-v-e1c54e23] .button-vue__wrapper {
  justify-content: start;
}
.file-picker__filter-input[data-v-e1c54e23] {
  margin-block: 7px;
  max-width: 260px;
}
@media (max-width: 736px) {
.file-picker__side[data-v-e1c54e23] {
    flex-direction: row;
    min-width: unset;
}
}
@media (max-width: 512px) {
.file-picker__side[data-v-e1c54e23] {
    flex-direction: row;
    min-width: unset;
}
.file-picker__filter-input[data-v-e1c54e23] {
    max-width: unset;
}
}/* Ensure focus outline is visible */
.file-picker__navigation {
  padding-inline: 8px 2px;
}
.file-picker__navigation, .file-picker__navigation * {
  box-sizing: border-box;
}
.file-picker__navigation .v-select.select {
  min-width: 220px;
}
@media (min-width: 513px) and (max-width: 736px) {
.file-picker__navigation {
    gap: 11px;
}
}
@media (max-width: 512px) {
.file-picker__navigation {
    flex-direction: column-reverse !important;
}
}.file-picker__view[data-v-39182aaf] {
  height: 50px;
  display: flex;
  justify-content: start;
  align-items: center;
}
.file-picker__view h3[data-v-39182aaf] {
  font-weight: bold;
  height: fit-content;
  margin: 0;
}
.file-picker__main[data-v-39182aaf] {
  box-sizing: border-box;
  width: 100%;
  display: flex;
  flex-direction: column;
  min-height: 0;
  flex: 1;
  padding-inline: 2px;
}
.file-picker__main[data-v-39182aaf] * {
  box-sizing: border-box;
}
[data-v-39182aaf] .file-picker {
  height: min(80vh, 800px) !important;
}
@media (max-width: 512px) {
[data-v-39182aaf] .file-picker {
    height: calc(100% - 16px - var(--default-clickable-area)) !important;
}
}
[data-v-39182aaf] .file-picker__content {
  display: flex;
  flex-direction: column;
  overflow: hidden;
}.public-auth-prompt__text[data-v-bd4b7f1b] {
  font-size: 1.25em;
  margin-block: 0 calc(3 * var(--default-grid-baseline));
}
.public-auth-prompt__header[data-v-bd4b7f1b] {
  margin-block: 0 calc(3 * var(--default-grid-baseline));
}
.public-auth-prompt__header[data-v-bd4b7f1b]:first-child {
  margin-top: 0;
}
.public-auth-prompt__input[data-v-bd4b7f1b] {
  margin-block: calc(4 * var(--default-grid-baseline)) calc(2 * var(--default-grid-baseline));
}

.cn-files-widget-form[data-v-35f4f38e] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-files-widget-form__toggle[data-v-35f4f38e] {
	display: flex;
	align-items: center;
	gap: 8px;
	font-size: 14px;
}
.cn-files-widget-form__folder[data-v-35f4f38e] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-files-widget-form__folder-label[data-v-35f4f38e] {
	font-size: 14px;
	font-weight: 600;
}
.cn-files-widget-form__folder-row[data-v-35f4f38e] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-files-widget-form__folder-path[data-v-35f4f38e] {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	padding: 8px 12px;
	border: 2px solid var(--color-border-maxcontrast);
	border-radius: var(--border-radius-large);
	background-color: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-files-widget-form__folder-path--disabled[data-v-35f4f38e] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
}
.cn-files-widget-form__folder-note[data-v-35f4f38e] {
	margin: 0;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}


.cn-files-widget-delete-dialog__message[data-v-498a9416] {
	padding: 4px 0 8px;
}


.cn-files-widget[data-v-cd260c1e] {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 8px;
	height: 100%;
	overflow: hidden;
}
.cn-files-widget--dragging[data-v-cd260c1e] {
	outline: 2px dashed var(--color-primary-element);
	outline-offset: -2px;
	border-radius: var(--border-radius);
}
.cn-files-widget__dropzone[data-v-cd260c1e] {
	position: absolute;
	inset: 0;
	z-index: 5;
	display: flex;
	align-items: center;
	justify-content: center;
	pointer-events: none;
	background: var(--color-primary-element-light, rgba(0, 130, 201, 0.1));
	color: var(--color-primary-element);
	font-weight: 600;
	border-radius: var(--border-radius);
}
.cn-files-widget__toolbar[data-v-cd260c1e] {
	display: flex;
	align-items: center;
	gap: 8px;
	flex-wrap: wrap;
}
.cn-files-widget__breadcrumb[data-v-cd260c1e] {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 4px;
	flex: 1 1 auto;
	min-width: 0;
}
.cn-files-widget__crumb[data-v-cd260c1e] {
	background: transparent;
	border: none;
	padding: 4px 6px;
	cursor: pointer;
	color: var(--color-primary-element);
	font: inherit;
}
.cn-files-widget__crumb[aria-current='page'][data-v-cd260c1e] {
	color: var(--color-main-text);
	cursor: default;
}
.cn-files-widget__separator[data-v-cd260c1e] {
	color: var(--color-text-maxcontrast);
}
.cn-files-widget__search[data-v-cd260c1e] {
	flex: 0 1 200px;
	padding: 4px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-files-widget__upload[data-v-cd260c1e] {
	padding: 4px 12px;
	border: 1px solid var(--color-primary-element);
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-files-widget__file-input[data-v-cd260c1e] {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip-path: inset(50%);
	border: 0;
}
.cn-files-widget__state[data-v-cd260c1e] {
	padding: 16px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}
.cn-files-widget__retry[data-v-cd260c1e] {
	display: block;
	margin: 8px auto 0;
	padding: 4px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	cursor: pointer;
}
.cn-files-widget__list[data-v-cd260c1e] {
	list-style: none;
	margin: 0;
	padding: 0;
	overflow: auto;
	flex: 1 1 auto;
}
.cn-files-widget__row[data-v-cd260c1e] {
	display: grid;
	grid-template-columns: 1fr 140px 80px auto;
	align-items: center;
	gap: 8px;
	padding: 4px 6px;
	border-bottom: 1px solid var(--color-border);
}
.cn-files-widget__row-name[data-v-cd260c1e] {
	display: flex;
	align-items: center;
	gap: 8px;
	background: transparent;
	border: none;
	padding: 0;
	cursor: pointer;
	text-align: left;
	color: var(--color-main-text);
	font: inherit;
	min-width: 0;
}
.cn-files-widget__row-icon[data-v-cd260c1e] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 24px;
	height: 24px;
}
.cn-files-widget__row-thumb[data-v-cd260c1e] {
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: var(--border-radius);
	background-color: var(--color-background-dark);
}
.cn-files-widget__row-label[data-v-cd260c1e] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-files-widget__row-modified[data-v-cd260c1e],
.cn-files-widget__row-size[data-v-cd260c1e] {
	color: var(--color-text-maxcontrast);
	font-size: 12px;
}
.cn-files-widget__row-delete[data-v-cd260c1e] {
	background: transparent;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 2px 8px;
	cursor: pointer;
	font-size: 12px;
	color: var(--color-error);
}

/* Grid view (content.viewMode === 'grid'): lay the rows out as tiles. */
.cn-files-widget__list--grid[data-v-cd260c1e] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
	gap: 8px;
	padding: 4px;
	align-content: start;
}
.cn-files-widget__list--grid .cn-files-widget__row[data-v-cd260c1e] {
	grid-template-columns: 1fr;
	justify-items: center;
	text-align: center;
	gap: 4px;
	padding: 10px 6px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
}
.cn-files-widget__list--grid .cn-files-widget__row-name[data-v-cd260c1e] {
	flex-direction: column;
	align-items: center;
	max-width: 100%;
}
.cn-files-widget__list--grid .cn-files-widget__row-label[data-v-cd260c1e] {
	max-width: 100%;
}
.cn-files-widget__list--grid .cn-files-widget__row-icon[data-v-cd260c1e] {
	font-size: 32px;
	width: 56px;
	height: 56px;
}

/* Keep tiles compact — the modified date is list-view detail. */
.cn-files-widget__list--grid .cn-files-widget__row-modified[data-v-cd260c1e] {
	display: none;
}
.cn-files-widget__pagination[data-v-cd260c1e] {
	text-align: center;
	padding: 8px 0;
}
.cn-files-widget__more[data-v-cd260c1e] {
	padding: 4px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	cursor: pointer;
}



.cn-people-widget[data-v-03494ecf] {
	display: flex;
	flex-direction: column;
	height: 100%;
	gap: 8px;
	padding: 8px;
	overflow: hidden;
}
.cn-people-widget__header[data-v-03494ecf] {
	display: flex;
	gap: 6px;
	align-items: center;
	flex: 0 0 auto;
}
.cn-people-widget__search[data-v-03494ecf] {
	flex: 1 1 auto;
	padding: 4px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-people-widget__refresh[data-v-03494ecf],
.cn-people-widget__retry[data-v-03494ecf],
.cn-people-widget__load-more[data-v-03494ecf] {
	border: 1px solid var(--color-border);
	background: var(--color-background-hover);
	border-radius: var(--border-radius);
	padding: 2px 8px;
	cursor: pointer;
	font-size: 14px;
	color: var(--color-main-text);
}
.cn-people-widget__items[data-v-03494ecf] {
	flex: 1 1 auto;
	overflow-y: auto;
	display: grid;
	gap: 8px;
}
.cn-people-widget--list .cn-people-widget__items[data-v-03494ecf] {
	display: flex;
	flex-direction: column;
}
.cn-people-widget__item[data-v-03494ecf] {
	display: flex;
	gap: 8px;
	align-items: center;
	padding: 6px;
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	text-decoration: none;
	border: 1px solid transparent;
}
.cn-people-widget--card .cn-people-widget__item[data-v-03494ecf],
.cn-people-widget--grid .cn-people-widget__item[data-v-03494ecf] {
	flex-direction: column;
	text-align: center;
}
.cn-people-widget--card .cn-people-widget__item[data-v-03494ecf] {
	border: 1px solid var(--color-border);
	background: var(--color-main-background);
	min-height: 200px;
}
.cn-people-widget__item[data-v-03494ecf]:hover {
	background: var(--color-background-hover);
	border-color: var(--color-border);
}
.cn-people-widget__avatar[data-v-03494ecf] {
	border-radius: 50%;
	object-fit: cover;
	background: var(--color-background-darker);
}
.cn-people-widget__meta[data-v-03494ecf] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}
.cn-people-widget__name[data-v-03494ecf] {
	font-weight: 600;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	max-width: 100%;
}
.cn-people-widget__sub[data-v-03494ecf] {
	font-size: 12px;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-people-widget__state[data-v-03494ecf] {
	flex: 1 1 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 8px;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
	padding: 16px;
	text-align: center;
}
.cn-people-widget__footer[data-v-03494ecf] {
	flex: 0 0 auto;
	display: flex;
	justify-content: center;
	padding-top: 4px;
}


.cn-calendar-widget[data-v-41197e6f] {
	display: flex;
	flex-direction: column;
	width: 100%;
	height: 100%;
	overflow: hidden;
	background: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-calendar-widget__header[data-v-41197e6f] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 8px 12px;
	border-bottom: 1px solid var(--color-border);
}
.cn-calendar-widget__title[data-v-41197e6f] {
	font-weight: 600;
}
.cn-calendar-widget__modes[data-v-41197e6f] {
	display: flex;
	gap: 4px;
}
.cn-calendar-widget__mode-btn[data-v-41197e6f] {
	border: 1px solid var(--color-border);
	background: transparent;
	color: var(--color-main-text);
	border-radius: var(--border-radius);
	padding: 2px 8px;
	font-size: 12px;
	cursor: pointer;
}
.cn-calendar-widget__mode-btn.is-active[data-v-41197e6f] {
	background: var(--color-primary-element-light, var(--color-primary-element));
	color: var(--color-primary-element-text);
}
.cn-calendar-widget__body[data-v-41197e6f] {
	flex: 1;
	overflow: auto;
	padding: 8px 12px;
}
.cn-calendar-widget__state[data-v-41197e6f] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 8px;
	padding: 16px;
	text-align: center;
	color: var(--color-text-maxcontrast);
}
.cn-calendar-widget__retry[data-v-41197e6f] {
	padding: 4px 12px;
	border: 1px solid var(--color-border);
	background: transparent;
	color: var(--color-main-text);
	cursor: pointer;
	border-radius: var(--border-radius);
}
.cn-calendar-widget__month[data-v-41197e6f] {
	display: grid;
	grid-template-columns: repeat(7, 1fr);
	gap: 2px;
}
.cn-calendar-widget__month-header[data-v-41197e6f] {
	font-size: 11px;
	font-weight: 600;
	text-align: center;
	padding: 4px 0;
	color: var(--color-text-maxcontrast);
}
.cn-calendar-widget__month-cell[data-v-41197e6f] {
	min-height: 60px;
	padding: 2px 4px;
	border: 1px solid var(--color-border);
	border-radius: 2px;
	background: var(--color-main-background);
}
.cn-calendar-widget__month-cell.is-today[data-v-41197e6f] {
	background: var(--color-background-hover);
}
.cn-calendar-widget__month-cell.is-other-month[data-v-41197e6f] {
	opacity: 0.45;
}
.cn-calendar-widget__month-day[data-v-41197e6f] {
	font-size: 11px;
	font-weight: 600;
}
.cn-calendar-widget__month-events[data-v-41197e6f] {
	list-style: none;
	margin: 2px 0 0;
	padding: 0;
}
.cn-calendar-widget__month-event[data-v-41197e6f] {
	font-size: 10px;
	padding: 1px 3px;
	margin-bottom: 1px;
	border-radius: 2px;
	background: var(--color-background-dark);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-calendar-widget__month-overflow[data-v-41197e6f] {
	font-size: 10px;
	color: var(--color-text-maxcontrast);
}
.cn-calendar-widget__week[data-v-41197e6f] {
	display: grid;
	grid-template-columns: repeat(7, 1fr);
	gap: 4px;
}
.cn-calendar-widget__week-col[data-v-41197e6f] {
	display: flex;
	flex-direction: column;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 4px;
}
.cn-calendar-widget__week-col.is-today[data-v-41197e6f] {
	background: var(--color-background-hover);
}
.cn-calendar-widget__week-day[data-v-41197e6f] {
	display: flex;
	flex-direction: column;
	align-items: center;
	border-bottom: 1px solid var(--color-border);
	padding-bottom: 2px;
	margin-bottom: 4px;
}
.cn-calendar-widget__week-name[data-v-41197e6f] {
	font-size: 10px;
	color: var(--color-text-maxcontrast);
}
.cn-calendar-widget__week-num[data-v-41197e6f] {
	font-size: 14px;
	font-weight: 600;
}
.cn-calendar-widget__week-events[data-v-41197e6f] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-calendar-widget__week-event[data-v-41197e6f] {
	font-size: 11px;
	padding: 2px 4px;
	margin-bottom: 2px;
	background: var(--color-background-dark);
	border-radius: 2px;
}
.cn-calendar-widget__week-time[data-v-41197e6f] {
	font-weight: 600;
	margin-right: 4px;
}
.cn-calendar-widget__week-empty[data-v-41197e6f] {
	font-size: 11px;
	text-align: center;
	color: var(--color-text-maxcontrast);
}
.cn-calendar-widget__agenda[data-v-41197e6f] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-calendar-widget__agenda-header[data-v-41197e6f] {
	font-size: 12px;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
	margin-top: 8px;
	margin-bottom: 4px;
}
.cn-calendar-widget__agenda-row[data-v-41197e6f] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 4px 6px;
	margin-bottom: 2px;
	background: var(--color-background-hover);
	border-radius: 2px;
}
.cn-calendar-widget__agenda-time[data-v-41197e6f] {
	font-weight: 600;
	font-variant-numeric: tabular-nums;
}
.cn-calendar-widget__agenda-title[data-v-41197e6f] {
	flex: 1;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-calendar-widget__agenda-cal[data-v-41197e6f] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
}


.cn-nc-widget-widget[data-v-2ff48062] {
	display: flex;
	flex-direction: column;
	width: 100%;
	height: 100%;
	overflow: hidden;
}

/*
 * Header + content match the native Nextcloud Dashboard panel (apps/dashboard)
 * exactly — this component's whole job is rendering NC dashboard widgets, so it
 * should look native by default: 16px header, 32px leading icon with a 16px
 * gap, a 20px/700 title, and the native panel content inset (16px sides +
 * bottom, flush to the header on top). Same design tokens as core; overridable
 * via the host's CnWidgetWrapper styleConfig / nldesign.
 */
.cn-nc-widget-widget__header[data-v-2ff48062] {
	display: flex;
	align-items: center;
	gap: 16px;
	padding: 16px;
	font-weight: 700;
}
.cn-nc-widget-widget__header-icon[data-v-2ff48062] {
	width: 32px;
	height: 32px;
	flex: 0 0 auto;
}
.cn-nc-widget-widget__header-title[data-v-2ff48062] {
	flex: 1;
	font-size: 20px;
	font-weight: 700;
	line-height: 24px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-nc-widget-widget__native[data-v-2ff48062] {
	flex: 1;
	overflow: auto;
	padding: 0 16px 16px;
}

/*
 * The native `OCA.Dashboard` callback paints its own markup we don't control
 * — for first-party widgets that's almost always `@nextcloud/vue`'s
 * `NcDashboardWidget` / `NcDashboardWidgetItem` (`.dashboard-widget` wrapping
 * a bare `<ul>`/`<li>` list, each item a `.item-list__entry`).
 *
 * Only the LIST CONTAINER is retiled into a grid here — `.item-list__entry`'s
 * own internal layout is left untouched. An earlier version of this override
 * also forced `.item-list__entry` from row to column, but its icon-overlay
 * badge (`.item-icon`, see @nextcloud/vue's NcDashboardWidgetItem CSS) is
 * positioned with negative margins calibrated for the row layout, so
 * flipping to column made items visually overlap. Tiling the `<li>`s into a
 * grid while each entry keeps its normal icon+text row reads as a grid of
 * card tiles without touching that internal math.
 *
 * Scoped from `.cn-nc-widget-widget--horizontal` on the ROOT element, not
 * `.cn-nc-widget-widget__native`: the callback mounts via `.$mount(el)`,
 * which replaces `nativeContainer` in the live DOM outright, so any class
 * placed directly on it never survives to be selectable.
 *
 * The 250px column floor matches `.item-list__entry`'s own natural minimum
 * width (avatar + padding + its un-truncatable-below-this content) — a grid
 * track narrower than that squeezes the entry below its real minimum and it
 * overflows into the neighbouring cell. `min-width: 0` on the `<li>` alone
 * isn't enough to shrink it further: the item's own internal flex layout
 * still claims that much room regardless of the grid track size, so the
 * track itself must not go below it.
 */
.cn-nc-widget-widget--horizontal[data-v-2ff48062] .dashboard-widget > ul {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-nc-widget-widget--horizontal[data-v-2ff48062] .dashboard-widget > ul > li {
	width: auto;
	min-width: 0;
}
.cn-nc-widget-widget--horizontal[data-v-2ff48062] .item-list__entry {
	height: 100%;
	margin: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
}
.cn-nc-widget-widget__body[data-v-2ff48062] {
	flex: 1;
	overflow: auto;
	padding: 0 16px 16px;
}
.cn-nc-widget-widget__body--vertical[data-v-2ff48062] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-nc-widget-widget__body--horizontal[data-v-2ff48062] {
	display: flex;
	flex-direction: row;
	flex-wrap: wrap;
	gap: 12px;
}
.cn-nc-widget-widget__state[data-v-2ff48062] {
	display: flex;
	align-items: center;
	justify-content: center;
	flex: 1;
	min-height: 64px;
	color: var(--color-text-maxcontrast);
	font-style: italic;
}
.cn-nc-widget-widget__item[data-v-2ff48062] {
	display: flex;
	text-decoration: none;
	color: var(--color-main-text);
	border-radius: var(--border-radius);
	padding: 4px;
}
.cn-nc-widget-widget__item[data-v-2ff48062]:hover {
	background-color: var(--color-background-hover);
}
.cn-nc-widget-widget__item--vertical[data-v-2ff48062] {
	flex-direction: row;
	align-items: center;
	gap: 8px;
}
.cn-nc-widget-widget__item--horizontal[data-v-2ff48062] {
	flex-direction: column;
	align-items: center;
	width: 120px;
	text-align: center;
}
.cn-nc-widget-widget__item-icon-wrap[data-v-2ff48062] {
	width: 32px;
	height: 32px;
	flex: 0 0 32px;
	position: relative;
}
.cn-nc-widget-widget__item-icon[data-v-2ff48062] {
	width: 32px;
	height: 32px;
	object-fit: cover;
	border-radius: 50%;
}
.cn-nc-widget-widget__item-overlay[data-v-2ff48062] {
	position: absolute;
	right: -2px;
	bottom: -2px;
	width: 14px;
	height: 14px;
}
.cn-nc-widget-widget__item-text[data-v-2ff48062] {
	display: flex;
	flex-direction: column;
	min-width: 0;
	flex: 1;
}
.cn-nc-widget-widget__item-title[data-v-2ff48062] {
	font-weight: 600;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-nc-widget-widget__item-subtitle[data-v-2ff48062] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}


.cn-spend-analytics-widget[data-v-9d12d4a2] {
	display: flex;
	flex-direction: column;
	height: 100%;
	gap: 8px;
	padding: 8px;
	overflow: hidden;
}
.cn-spend-analytics-widget__header[data-v-9d12d4a2] {
	display: flex;
	align-items: center;
	justify-content: space-between;
}
.cn-spend-analytics-widget__title[data-v-9d12d4a2] {
	font-weight: bold;
}
.cn-spend-analytics-widget__period[data-v-9d12d4a2] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	padding: 2px 6px;
}
.cn-spend-analytics-widget__body[data-v-9d12d4a2] {
	flex: 1;
	overflow: auto;
}
.cn-spend-analytics-widget__cards[data-v-9d12d4a2] {
	display: flex;
	gap: 12px;
}
.cn-spend-analytics-widget__card[data-v-9d12d4a2] {
	display: flex;
	flex-direction: column;
	padding: 8px 12px;
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	flex: 1;
}
.cn-spend-analytics-widget__card-label[data-v-9d12d4a2] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-spend-analytics-widget__card-value[data-v-9d12d4a2] {
	font-size: 1.4em;
	font-weight: bold;
}
.cn-spend-analytics-widget__panel-title[data-v-9d12d4a2] {
	font-size: 1em;
	margin: 8px 0 4px;
}
.cn-spend-analytics-widget__rows[data-v-9d12d4a2] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-spend-analytics-widget__row[data-v-9d12d4a2] {
	display: flex;
	justify-content: space-between;
	padding: 4px 8px;
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-spend-analytics-widget__row--static[data-v-9d12d4a2] {
	cursor: default;
}
.cn-spend-analytics-widget__row[data-v-9d12d4a2]:hover,
.cn-spend-analytics-widget__row[data-v-9d12d4a2]:focus {
	background: var(--color-background-hover);
	outline: none;
}
.cn-spend-analytics-widget__state[data-v-9d12d4a2] {
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 64px;
	color: var(--color-text-maxcontrast);
	padding: 12px;
	text-align: center;
}
.cn-spend-analytics-widget__inline-empty[data-v-9d12d4a2] {
	color: var(--color-text-maxcontrast);
	padding: 6px;
	text-align: left;
}
.cn-spend-analytics-widget__ai-text[data-v-9d12d4a2] {
	white-space: pre-wrap;
}
.cn-spend-analytics-widget__ai-btn[data-v-9d12d4a2] {
	border: 1px solid var(--color-border);
	background: var(--color-background-hover);
	border-radius: var(--border-radius);
	color: var(--color-main-text);
	padding: 4px 12px;
	cursor: pointer;
}


.cn-stat-widget-form[data-v-1a7afca2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-stat-widget-form__section[data-v-1a7afca2] {
	margin: 8px 0 0;
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--color-text-maxcontrast);
}
.cn-stat-widget-form__sublabel[data-v-1a7afca2] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-stat-widget-form__hint[data-v-1a7afca2] {
	margin: 0;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}

/* One colour-per-value or special-state row: inputs share the width, the
   remove button keeps its own. Wraps on a narrow modal. */
.cn-stat-widget-form__rule[data-v-1a7afca2] {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	align-items: flex-end;
}
.cn-stat-widget-form__rule[data-v-1a7afca2] > :not(button) {
	flex: 1 1 120px;
	min-width: 0;
}
.cn-stat-widget-form__row2[data-v-1a7afca2] {
	display: flex;
	gap: 12px;
	align-items: flex-end;
}
.cn-stat-widget-form__row2[data-v-1a7afca2] > * {
	flex: 1;
	min-width: 0;
}
.cn-stat-widget-form__color-label[data-v-1a7afca2] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	font-size: 14px;
}
.cn-stat-widget-form__color[data-v-1a7afca2] {
	width: 48px;
	height: 32px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background: transparent;
}

/* ========================================
   @conduction/nextcloud-vue — Status Badge
   ======================================== */

.cn-status-badge {
	display: inline-flex;
	align-items: center;
	gap: calc(0.5 * var(--default-grid-baseline));
	padding: calc(0.5 * var(--default-grid-baseline)) calc(2.5 * var(--default-grid-baseline));
	border-radius: var(--border-radius-pill);
	font-size: 0.85em;
	font-weight: 500;
	line-height: 1.4;
	white-space: nowrap;
}

/* Size variants */
.cn-status-badge--small {
	padding: calc(0.25 * var(--default-grid-baseline)) calc(2 * var(--default-grid-baseline));
	font-size: 0.75em;
}

/* Color variants */
.cn-status-badge--default {
	background-color: var(--color-background-dark);
	color: var(--color-main-text);
}

.cn-status-badge--primary {
	background-color: var(--color-primary-element-light);
	color: var(--color-primary-element);
}

.cn-status-badge--success {
	background-color: var(--color-success-light, rgba(70, 186, 97, 0.15));
	color: var(--color-success-text, var(--color-success));
}

.cn-status-badge--warning {
	background-color: var(--color-warning-light, rgba(232, 163, 39, 0.15));
	color: var(--color-warning-text, var(--color-warning));
}

.cn-status-badge--error {
	background-color: var(--color-error-light, rgba(224, 68, 68, 0.15));
	color: var(--color-error-text, var(--color-error));
}

.cn-status-badge--info {
	background-color: var(--color-info-light, rgba(0, 130, 201, 0.15));
	color: var(--color-info-text, var(--color-info, #0082c9));
}

/* Solid variants — solid background with white text for use on colored backgrounds */
.cn-status-badge--solid.cn-status-badge--default {
	background-color: var(--color-background-dark);
	color: var(--color-main-text);
}

.cn-status-badge--solid.cn-status-badge--primary {
	background-color: var(--color-primary-element);
	color: white;
}

.cn-status-badge--solid.cn-status-badge--success {
	background-color: var(--color-success);
	color: white;
}

.cn-status-badge--solid.cn-status-badge--warning {
	background-color: var(--color-warning);
	color: var(--color-primary-text);
}

.cn-status-badge--solid.cn-status-badge--error {
	background-color: var(--color-error);
	color: white;
}

.cn-status-badge--solid.cn-status-badge--info {
	background-color: var(--color-info, #0082c9);
	color: white;
}


/*
 * The card itself — its box, body stack, icon circle, title and value
 * typography — is the CANONICAL KPI card in src/css/kpi-card.css, shared with
 * CnStatsBlock. What remains here is only what is specific to THIS widget: the
 * range select, the "/ limit" denominator, the trend chip and the error glyph.
 *
 * Every size below is expressed against the shared `--cn-kpi-*` scale rather
 * than as its own number, so the widget's extras re-scale with the card they
 * sit in. Resist adding card styling back, and resist restating a value the
 * scale already holds; that is what split the two KPI looks apart in the first
 * place.
 */

/* The title row carries an optional range select beside the label, which the
   canonical `__title` (a plain truncating heading) does not account for. */
.cn-stat-widget__label[data-v-9c5d29a2] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	width: 100%;
}

/* Stacked tile: the label and its range select centre over the number rather
   than spreading to the card's edges. */
.cn-kpi-card--vertical .cn-stat-widget__label[data-v-9c5d29a2] {
	justify-content: center;
	width: auto;
}

/* Sized down to sit inside the label row without pushing the tile taller —
   the tile's height is fixed by its grid cell (ADR-062). */
.cn-stat-widget__range[data-v-9c5d29a2] {
	flex: 0 0 auto;
	max-width: 50%;
	padding: 0 4px;
	border: none;
	border-radius: var(--border-radius);
	background: transparent;
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	font-size: var(--cn-kpi-label-size, 13px);
	font-weight: normal;
	cursor: pointer;
}
.cn-stat-widget__range[data-v-9c5d29a2]:hover,
.cn-stat-widget__range[data-v-9c5d29a2]:focus-visible {
	background: var(--color-background-hover);
	color: var(--color-main-text);
}

/* Badge mode: the pill takes the value's place in the row. Sized to the
   card's label scale so it sits in the row without pushing the tile taller. */
.cn-stat-widget__badge[data-v-9c5d29a2] {
	flex: 0 1 auto;
	min-width: 0;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
	font-size: var(--cn-kpi-label-size, 13px);
}

/* The denominator of a "value / limit" pair. Deliberately quieter and smaller
   than the value: the tile's subject is what the number IS, not what it is
   allowed to reach. Shares the value's `nowrap` so the pair never breaks. */
.cn-stat-widget__limit[data-v-9c5d29a2] {
	flex: 0 0 auto;
	font-size: var(--cn-kpi-value-size-compact, 1.25rem);
	font-weight: var(--cn-kpi-title-weight, 600);
	line-height: var(--cn-kpi-value-line, 1.1);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	white-space: nowrap;
}
.cn-stat-widget__trend[data-v-9c5d29a2] {
	display: inline-flex;
	align-items: center;
	gap: 2px;
	font-size: var(--cn-kpi-label-size, 13px);
	font-weight: var(--cn-kpi-title-weight, 600);
}

/* The dash shown when the number could not be fetched. It stands where the
   value stands, so it takes the value's size and weight — CnStatsBlock's own
   error dash is literally a `cn-kpi-card__value`, and two components showing
   the same failure at two different sizes is the drift this consolidation
   exists to remove. Only the colour differs: a failure is not a number. */
.cn-stat-widget__error[data-v-9c5d29a2] {
	font-size: var(--cn-kpi-value-size, 2rem);
	font-weight: var(--cn-kpi-value-weight, 700);
	line-height: var(--cn-kpi-value-line, 1.1);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
}


.cn-delta-form[data-v-3e27020a] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-delta-form__section[data-v-3e27020a] {
	margin: 8px 0 0;
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--color-text-maxcontrast);
}
.cn-delta-form__row2[data-v-3e27020a] {
	display: flex;
	gap: 12px;
	align-items: flex-end;
}
.cn-delta-form__row2[data-v-3e27020a] > * {
	flex: 1;
	min-width: 0;
}


/*
 * The card itself — its box, body stack, icon circle, title and value
 * typography — is the CANONICAL KPI card in src/css/kpi-card.css, shared with
 * CnStatWidget and CnStatsBlock. This tile is the one the canonical look was
 * modelled on, and it used to draw that look from its OWN copy of the rules
 * here: a 44px circle, a 16px gap, a 1.8em value. That copy is exactly how a
 * "canonical" card ends up with a second definition, so it is gone. What is
 * left is only what belongs to THIS widget: the delta chip and the error glyph.
 */

/* The percentage-change chip beside the value. Tinted good/bad at runtime from
 * `goodDirection`, so the colour is an inline style, not a class. */
.cn-delta-widget__delta[data-v-1405ac33] {
	display: inline-flex;
	align-items: center;
	gap: 2px;
	font-size: var(--cn-kpi-label-size, 13px);
	font-weight: var(--cn-kpi-title-weight, 600);
}

/* The dash shown when the number could not be fetched. It stands where the
 * value stands, so it takes the value's size and weight — only the colour
 * differs, because a failure is not a number. */
.cn-delta-widget__error[data-v-1405ac33] {
	font-size: var(--cn-kpi-value-size, 2rem);
	font-weight: var(--cn-kpi-value-weight, 700);
	line-height: var(--cn-kpi-value-line, 1.1);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
}


.cn-gauge-form[data-v-3604c086] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-gauge-form__section[data-v-3604c086] {
	margin: 8px 0 0;
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--color-text-maxcontrast);
}
.cn-gauge-form__row2[data-v-3604c086] {
	display: flex;
	gap: 12px;
	align-items: flex-end;
}
.cn-gauge-form__row2[data-v-3604c086] > * {
	flex: 1;
	min-width: 0;
}


.cn-gauge-widget[data-v-bcf2f316] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 10px 4px;
}

/* Whole-tile click target when the widget declares a `route`/`link`. */
.cn-gauge-widget--linked[data-v-bcf2f316] {
	cursor: pointer;
	text-decoration: none;
	color: inherit;
	border-radius: var(--border-radius-large, 8px);
	transition: background-color 0.1s ease-in-out;
}
.cn-gauge-widget--linked[data-v-bcf2f316]:hover {
	background-color: var(--color-background-hover);
}
.cn-gauge-widget--linked[data-v-bcf2f316]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}
.cn-gauge-widget__head[data-v-bcf2f316] {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 8px;
}
.cn-gauge-widget__label[data-v-bcf2f316] {
	font-size: 0.95em;
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-gauge-widget__pct[data-v-bcf2f316] {
	font-size: 1.2em;
	font-weight: 700;
}
.cn-gauge-widget__track[data-v-bcf2f316] {
	width: 100%;
	height: 10px;
	border-radius: 5px;
	background: var(--color-background-dark);
	overflow: hidden;
}
.cn-gauge-widget__fill[data-v-bcf2f316] {
	height: 100%;
	border-radius: 5px;
	transition: width 0.3s ease;
}
.cn-gauge-widget__foot[data-v-bcf2f316] {
	display: flex;
	align-items: baseline;
	gap: 6px;
	font-size: 0.9em;
}
.cn-gauge-widget__value[data-v-bcf2f316] {
	font-weight: 700;
	color: var(--color-main-text);
}
.cn-gauge-widget__target[data-v-bcf2f316] {
	color: var(--color-text-maxcontrast);
}


.cn-flow-runs-form[data-v-5ea692ef] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-flow-runs-form__note[data-v-5ea692ef] {
	margin: 0;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-flow-runs-form__row2[data-v-5ea692ef] {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 12px;
}


.cn-flow-runs-widget[data-v-75628d22] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}
.cn-flow-runs-widget__loading[data-v-75628d22] {
	display: flex;
	justify-content: center;
	padding: 8px 0;
}
.cn-flow-runs-widget__empty[data-v-75628d22],
.cn-flow-runs-widget__error[data-v-75628d22],
.cn-flow-runs-widget__more[data-v-75628d22] {
	margin: 0;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-flow-runs-widget__more[data-v-75628d22] {
	padding-top: 4px;
}
.cn-flow-runs-widget__list[data-v-75628d22] {
	list-style: none;
	margin: 0;
	padding: 0;
	min-width: 0;
}
.cn-flow-runs-widget__row[data-v-75628d22] {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
	min-width: 0;
}
.cn-flow-runs-widget__row[data-v-75628d22]:last-child {
	border-bottom: none;
}
.cn-flow-runs-widget__row--linked[data-v-75628d22] {
	cursor: pointer;
}
.cn-flow-runs-widget__dot[data-v-75628d22] {
	flex: 0 0 auto;
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background: var(--color-text-maxcontrast);
}

/* Executing now — the primary colour, and the only row that animates. */
.cn-flow-runs-widget__dot--running[data-v-75628d22] {
	background: var(--color-primary-element, #0082c9);
	animation: cn-flow-runs-pulse-75628d22 1.6s ease-in-out infinite;
}
.cn-flow-runs-widget__dot--queued[data-v-75628d22] {
	background: var(--color-warning, #c28900);
}
.cn-flow-runs-widget__dot--suspended[data-v-75628d22] {
	background: var(--color-text-maxcontrast);
}

/* Terminal rows: the dot is a hollow RING, so live (filled) and finished
   (hollow) never differ by colour alone. The per-status colour still rides
   on the ring's border. */
.cn-flow-runs-widget__dot--terminal[data-v-75628d22] {
	width: 6px;
	height: 6px;
	background: transparent;
	border: 2px solid var(--color-text-maxcontrast);
}
.cn-flow-runs-widget__dot--terminal.cn-flow-runs-widget__dot--completed[data-v-75628d22] {
	border-color: var(--color-success, #2d7b41);
}
.cn-flow-runs-widget__dot--terminal.cn-flow-runs-widget__dot--failed[data-v-75628d22],
.cn-flow-runs-widget__dot--terminal.cn-flow-runs-widget__dot--dead_letter[data-v-75628d22] {
	border-color: var(--color-error, #d91f2d);
}
.cn-flow-runs-widget__body[data-v-75628d22] {
	display: flex;
	flex-direction: column;
	min-width: 0;
	flex: 1 1 auto;
}
.cn-flow-runs-widget__name[data-v-75628d22] {
	font-weight: 600;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* Finished runs read as history: regular weight, muted colour. The hollow
   dot and the section label carry the distinction for anyone who cannot
   rely on colour. */
.cn-flow-runs-widget__row--terminal .cn-flow-runs-widget__name[data-v-75628d22] {
	font-weight: 400;
	color: var(--color-text-maxcontrast);
}

/* Must sit AFTER the plain `__name` rule: the compound selector is more
   specific, and stylelint's no-descending-specificity flags the reverse
   order because the cascade then depends on specificity rather than
   source order — the shape that quietly stops working when someone adds
   a competing rule. */
.cn-flow-runs-widget__row--linked:hover .cn-flow-runs-widget__name[data-v-75628d22] {
	text-decoration: underline;
}
.cn-flow-runs-widget__meta[data-v-75628d22] {
	color: var(--color-text-maxcontrast);
	font-size: 12px;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-flow-runs-widget__age[data-v-75628d22] {
	flex: 0 0 auto;
	color: var(--color-text-maxcontrast);
	font-size: 12px;
	font-variant-numeric: tabular-nums;
}

/* The history section label. Small caps text, not a colour: the section
   boundary must survive monochrome. */
.cn-flow-runs-widget__history-title[data-v-75628d22] {
	margin: 0;
	padding-top: 8px;
	color: var(--color-text-maxcontrast);
	font-size: 12px;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
}
@keyframes cn-flow-runs-pulse-75628d22 {
0%, 100% { opacity: 1;
}
50% { opacity: 0.35;
}
}

/* Respect a reduced-motion preference: the pulse is decoration, and the dot
   colour already carries the status. */
@media (prefers-reduced-motion: reduce) {
.cn-flow-runs-widget__dot--running[data-v-75628d22] {
		animation: none;
}
}


.cn-tasks-form[data-v-2db7b827] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-tasks-form__note[data-v-2db7b827] {
	margin: 0;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-tasks-form__row2[data-v-2db7b827] {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 12px;
}


.cn-tasks-widget[data-v-ff399342] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}
.cn-tasks-widget__loading[data-v-ff399342] {
	display: flex;
	justify-content: center;
	padding: 8px 0;
}
.cn-tasks-widget__empty[data-v-ff399342],
.cn-tasks-widget__error[data-v-ff399342],
.cn-tasks-widget__more[data-v-ff399342] {
	margin: 0;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-tasks-widget__more[data-v-ff399342] {
	padding-top: 4px;
}
.cn-tasks-widget__count[data-v-ff399342] {
	margin: 0;
	color: var(--color-text-maxcontrast);
	font-size: 12px;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
}
.cn-tasks-widget__list[data-v-ff399342] {
	list-style: none;
	margin: 0;
	padding: 0;
	min-width: 0;
}
.cn-tasks-widget__row[data-v-ff399342] {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
	min-width: 0;
	cursor: pointer;
}
.cn-tasks-widget__row[data-v-ff399342]:last-child {
	border-bottom: none;
}
.cn-tasks-widget__body[data-v-ff399342] {
	display: flex;
	flex-direction: column;
	min-width: 0;
	flex: 1 1 auto;
}
.cn-tasks-widget__name[data-v-ff399342] {
	font-weight: 600;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-tasks-widget__row:hover .cn-tasks-widget__name[data-v-ff399342] {
	text-decoration: underline;
}
.cn-tasks-widget__meta[data-v-ff399342] {
	color: var(--color-text-maxcontrast);
	font-size: 12px;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-tasks-widget__due[data-v-ff399342] {
	flex: 0 0 auto;
	color: var(--color-text-maxcontrast);
	font-size: 12px;
	font-variant-numeric: tabular-nums;
}

/* Overdue: weight AND colour on top of the wording, which already says
   "Overdue by N days" — the signal survives monochrome. */
.cn-tasks-widget__due--overdue[data-v-ff399342] {
	color: var(--color-error, #d91f2d);
	font-weight: 600;
}
.cn-tasks-widget__actions[data-v-ff399342] {
	flex: 0 0 auto;
}


.cn-data-form[data-v-10b5a40f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-data-form__section[data-v-10b5a40f] {
	margin: 8px 0 0;
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--color-text-maxcontrast);
}
.cn-data-form__hint[data-v-10b5a40f] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-data-form__row2[data-v-10b5a40f] {
	display: flex;
	gap: 12px;
	align-items: flex-end;
}
.cn-data-form__row2[data-v-10b5a40f] > * {
	flex: 1;
	min-width: 0;
}
.cn-data-form__layout[data-v-10b5a40f] {
	display: flex;
	align-items: flex-end;
	gap: 12px;
	flex-wrap: wrap;
}
.cn-data-form__layout-label[data-v-10b5a40f] {
	align-self: center;
	font-weight: 600;
}
.cn-data-form__presets[data-v-10b5a40f] {
	display: inline-flex;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 8px);
	overflow: hidden;
}
.cn-data-form__preset[data-v-10b5a40f] {
	border: none;
	background: var(--color-main-background);
	color: var(--color-main-text);
	padding: 6px 12px;
	cursor: pointer;
	border-inline-start: 1px solid var(--color-border);
}
.cn-data-form__preset[data-v-10b5a40f]:first-child {
	border-inline-start: none;
}
.cn-data-form__preset--active[data-v-10b5a40f] {
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
	font-weight: 600;
}
.cn-data-form__columns[data-v-10b5a40f] {
	width: 90px;
	flex: 0 0 auto;
}
.cn-data-form__prop[data-v-10b5a40f] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 8px);
	padding: 8px 10px;
}
.cn-data-form__prop--hidden[data-v-10b5a40f] {
	opacity: 0.6;
}
.cn-data-form__prop--dragging[data-v-10b5a40f] {
	opacity: 0.4;
	border-style: dashed;
}
.cn-data-form__prop-head[data-v-10b5a40f] {
	display: flex;
	align-items: center;
	gap: 6px;
}
.cn-data-form__grip[data-v-10b5a40f] {
	cursor: grab;
	color: var(--color-text-maxcontrast);
	letter-spacing: -2px;
	user-select: none;
}
.cn-data-form__prop-name[data-v-10b5a40f] {
	font-weight: 600;
}
.cn-data-form__prop-body[data-v-10b5a40f] {
	display: grid;
	grid-template-columns: 2fr 1fr 1fr 1.5fr;
	gap: 10px;
	align-items: center;
	margin-top: 8px;
}


.cn-object-geo-form[data-v-42affc2f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-object-geo-form__section[data-v-42affc2f] {
	margin: 8px 0 0;
	font-size: 0.8em;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--color-text-maxcontrast);
}
.cn-object-geo-form__hint[data-v-42affc2f] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	margin: 0;
}


.cn-audit-trail-form[data-v-41073462] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-audit-trail-form__hint[data-v-41073462] {
	margin: 0;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}


.cn-kb-search-widget[data-v-e34f66e2] {
	display: flex;
	flex-direction: column;
	gap: 10px;
	width: 100%;
}
.cn-kb-search-widget__bound[data-v-e34f66e2],
.cn-kb-search-widget__status[data-v-e34f66e2],
.cn-kb-search-widget__empty[data-v-e34f66e2],
.cn-kb-search-widget__hint[data-v-e34f66e2] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	margin: 0;
}
.cn-kb-search-widget__bound[data-v-e34f66e2] {
	font-style: italic;
}
.cn-kb-search-widget__results[data-v-e34f66e2] {
	list-style: none;
	padding: 0;
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-kb-search-widget__result[data-v-e34f66e2] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 8px 10px;
	background: var(--color-main-background);
}
.cn-kb-search-widget__result-title[data-v-e34f66e2] {
	font-weight: 600;
	color: var(--color-main-text);
	text-decoration: none;
}
.cn-kb-search-widget__result-title[data-v-e34f66e2]:hover {
	color: var(--color-primary-element);
}
.cn-kb-search-widget__result-snippet[data-v-e34f66e2] {
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
	margin-top: 4px;
}

/* ========================================
   @conduction/nextcloud-vue — Form widgets
   ======================================== */

/*
 * The shared look of a form-shaped dashboard widget — the `CnFormWidgetBase`
 * primitive that CnInteractionFormWidget and every future form widget render.
 *
 * These rules are LIFTED VERBATIM from CnInteractionFormWidget's own scoped
 * block, value for value. That widget's rendering is the reference: it is
 * liked as it stands, and the extraction onto a shared base was required to
 * change nothing a user can see. Keeping the numbers identical is what makes
 * that true, and `e2e/interaction-form-widget.e2e.js` screenshots the widget
 * to prove it.
 *
 * Unscoped on purpose: the markup now lives in CnFormWidgetBase, so a scoped
 * block in the host widget would no longer match its own elements.
 */

.cn-form-widget {
	display: flex;
	flex-direction: column;
	gap: 12px;
	width: 100%;
}

.cn-form-widget__field {
	display: flex;
	flex-direction: column;
	gap: 4px;
	min-width: 0;
}

.cn-form-widget__label {
	font-weight: 500;
	font-size: 0.9em;
}

.cn-form-widget__textarea {
	width: 100%;
	min-height: 80px;
	padding: 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	font: inherit;
	resize: vertical;
}

.cn-form-widget__actions {
	display: flex;
	gap: 8px;
	justify-content: flex-end;
}

.cn-form-widget__error {
	color: var(--color-error);
	margin: 0;
}


.cn-banner-form[data-v-038574af] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-banner-form__hint[data-v-038574af] {
	margin: 0;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}


.cn-workspace-filter-widget[data-v-f0d5c1c6] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	width: 100%;
}
.cn-workspace-filter-widget__label[data-v-f0d5c1c6] {
	margin: 0;
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-workspace-filter-widget__status[data-v-f0d5c1c6] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-workspace-filter-widget__list[data-v-f0d5c1c6] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-workspace-filter-widget__count[data-v-f0d5c1c6] {
	margin-inline-start: 6px;
	padding: 0 6px;
	border-radius: 999px;
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
}


.cn-data-matrix[data-v-6e3e1a0f] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-data-matrix__title[data-v-6e3e1a0f] {
	margin: 0;
	font-size: 1.1em;
}
.cn-data-matrix__description[data-v-6e3e1a0f] {
	margin: 4px 0 0;
	color: var(--color-text-maxcontrast);
}
.cn-data-matrix__scroller[data-v-6e3e1a0f] {
	overflow-x: auto;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
}
.cn-data-matrix__table[data-v-6e3e1a0f] {
	width: 100%;
	border-collapse: collapse;
	font-size: 0.95em;
}
.cn-data-matrix__col-header[data-v-6e3e1a0f],
.cn-data-matrix__row-header-corner[data-v-6e3e1a0f],
.cn-data-matrix__total-header[data-v-6e3e1a0f] {
	background: var(--color-background-hover);
	text-align: left;
	padding: 8px 10px;
	font-weight: 600;
	border-bottom: 1px solid var(--color-border);
	border-right: 1px solid var(--color-border);
}
.cn-data-matrix__row-header[data-v-6e3e1a0f] {
	background: var(--color-background-hover);
	text-align: left;
	padding: 6px 10px;
	font-weight: 500;
	border-right: 1px solid var(--color-border);
	border-bottom: 1px solid var(--color-border);
	max-width: 200px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-data-matrix__cell[data-v-6e3e1a0f] {
	padding: 0;
	border-right: 1px solid var(--color-border);
	border-bottom: 1px solid var(--color-border);
	min-width: 80px;
}
.cn-data-matrix__cell--number[data-v-6e3e1a0f] {
	text-align: right;
}
.cn-data-matrix__cell-value[data-v-6e3e1a0f] {
	display: block;
	padding: 6px 10px;
	cursor: cell;
	min-height: 28px;
}
.cn-data-matrix__cell--read-only .cn-data-matrix__cell-value[data-v-6e3e1a0f] {
	cursor: default;
	background: var(--color-background-hover);
}
.cn-data-matrix__cell-input[data-v-6e3e1a0f] {
	width: 100%;
	padding: 5px 10px;
	border: 1px solid var(--color-primary-element);
	background: var(--color-main-background);
	outline: none;
	font: inherit;
}
.cn-data-matrix__totals-row .cn-data-matrix__total-cell[data-v-6e3e1a0f],
.cn-data-matrix__total-header[data-v-6e3e1a0f] {
	background: var(--color-background-darker, var(--color-background-hover));
	font-weight: 600;
	text-align: right;
	padding: 6px 10px;
}
.cn-data-matrix__totals-label[data-v-6e3e1a0f] {
	background: var(--color-background-darker, var(--color-background-hover));
	font-weight: 600;
	padding: 6px 10px;
	text-align: left;
}
.cn-data-matrix__grand-total[data-v-6e3e1a0f] {
	background: var(--color-primary-element-light);
}
.cn-data-matrix__empty[data-v-6e3e1a0f] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
	margin: 16px 0;
	text-align: center;
}


.cn-cron-field[data-v-2c4fddda] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-cron-field__parts[data-v-2c4fddda] {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}
.cn-cron-field__parts[data-v-2c4fddda] > * {
	flex: 1 1 140px;
}


.cn-settings-section__actions[data-v-036cb4ff] {
	display: flex;
	gap: 0.5rem;
	align-items: center;
	justify-content: flex-end;
	float: right;
	position: relative;
	z-index: 10;
}
.cn-settings-section__content[data-v-036cb4ff] {
	clear: both;
}
.cn-settings-section__description-text[data-v-036cb4ff] {
	color: var(--color-text-maxcontrast);
	margin-bottom: 16px;
}
.cn-settings-section__loading[data-v-036cb4ff] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	padding: 40px 20px;
	gap: 16px;
}
.cn-settings-section__loading p[data-v-036cb4ff] {
	color: var(--color-text-maxcontrast);
	font-size: 14px;
}
.cn-settings-section__error[data-v-036cb4ff] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	padding: 32px 20px;
	gap: 16px;
	background: var(--color-error-light);
	border: 1px solid var(--color-error);
	border-radius: var(--border-radius-large);
}
.cn-settings-section__error-message[data-v-036cb4ff] {
	color: var(--color-error);
	font-weight: 500;
	margin: 0;
}
.cn-settings-section__empty[data-v-036cb4ff] {
	padding: 40px 20px;
}
.cn-settings-section__empty-content[data-v-036cb4ff] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 16px;
	color: var(--color-text-maxcontrast);
}
.cn-settings-section__empty-content p[data-v-036cb4ff] {
	margin: 0;
	font-size: 14px;
}
.cn-settings-section__footer[data-v-036cb4ff] {
	margin-top: 24px;
	padding-top: 24px;
	border-top: 1px solid var(--color-border);
}
@media (max-width: 768px) {
.cn-settings-section__actions[data-v-036cb4ff] {
		position: static;
		margin-top: 0;
		margin-bottom: 1rem;
		float: none;
		flex-direction: column;
		align-items: stretch;
}
}


._passwordDialog_joix2_2 {
	display: flex;
	flex-direction: column;
	gap: 10px 0;
	margin-inline: 6px;
	margin-block-end: 6px;
}


.cn-leaf-dependency-settings__loading[data-v-627dd0a2],
.cn-leaf-dependency-settings__all-good[data-v-627dd0a2] {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0;
	color: var(--color-text-maxcontrast);
}
.cn-leaf-dependency-settings__all-good-icon[data-v-627dd0a2] {
	color: var(--color-success);
}
.cn-leaf-dependency-settings__list[data-v-627dd0a2] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-leaf-dependency-settings__row[data-v-627dd0a2] {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding: 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 8px);
	background: var(--color-main-background);
}
.cn-leaf-dependency-settings__icon[data-v-627dd0a2] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	border-radius: 50%;
	flex-shrink: 0;
}
.cn-leaf-dependency-settings__icon--required[data-v-627dd0a2] {
	color: var(--color-error);
	background: color-mix(in srgb, var(--color-error) 12%, transparent);
}
.cn-leaf-dependency-settings__icon--optional[data-v-627dd0a2] {
	color: var(--color-primary-element);
	background: color-mix(in srgb, var(--color-primary-element) 12%, transparent);
}
.cn-leaf-dependency-settings__body[data-v-627dd0a2] {
	flex: 1 1 auto;
	min-width: 0;
}
.cn-leaf-dependency-settings__name[data-v-627dd0a2] {
	margin: 0;
	display: flex;
	align-items: center;
	gap: 8px;
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-leaf-dependency-settings__tag[data-v-627dd0a2] {
	font-size: 11px;
	font-weight: 500;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	padding: 1px 6px;
	border-radius: 10px;
	color: var(--color-text-maxcontrast);
	background: var(--color-background-dark);
}
.cn-leaf-dependency-settings__state[data-v-627dd0a2] {
	margin: 2px 0 0;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}
.cn-leaf-dependency-settings__error[data-v-627dd0a2] {
	margin: 4px 0 0;
	font-size: 13px;
	color: var(--color-error);
}
.cn-leaf-dependency-settings__actions[data-v-627dd0a2] {
	flex-shrink: 0;
	display: flex;
	align-items: center;
}
.cn-leaf-dependency-settings__ask-admin[data-v-627dd0a2] {
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}


.cn-structured-doc-review[data-v-1943d979] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 16px;
	background: var(--color-main-background);
}
.cn-structured-doc-review__title-row[data-v-1943d979] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: 12px;
}
.cn-structured-doc-review__title[data-v-1943d979] {
	margin: 0;
	font-size: 1.2em;
}
.cn-structured-doc-review__description[data-v-1943d979] {
	margin: 0;
	color: var(--color-text-maxcontrast);
}
.cn-structured-doc-review__status[data-v-1943d979] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 2px 10px;
	border-radius: 9999px;
	font-size: 0.85em;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.05em;
}
.cn-structured-doc-review__status-dot[data-v-1943d979] {
	width: 8px;
	height: 8px;
	border-radius: 50%;
	display: inline-block;
	background: currentColor;
}
.cn-structured-doc-review__status--valid[data-v-1943d979],
.cn-structured-doc-review__status--approved[data-v-1943d979] {
	background: var(--color-success-hover, rgba(0, 150, 0, 0.1));
	color: var(--color-success);
}
.cn-structured-doc-review__status--invalid[data-v-1943d979],
.cn-structured-doc-review__status--rejected[data-v-1943d979] {
	background: var(--color-error-hover, rgba(180, 0, 0, 0.1));
	color: var(--color-error);
}
.cn-structured-doc-review__status--needs-review[data-v-1943d979],
.cn-structured-doc-review__status--pending[data-v-1943d979] {
	background: var(--color-warning-hover, rgba(200, 130, 0, 0.1));
	color: var(--color-warning);
}
.cn-structured-doc-review__status--unknown[data-v-1943d979] {
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
}
.cn-structured-doc-review__issues[data-v-1943d979] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 8px 12px;
	background: var(--color-background-hover);
}
.cn-structured-doc-review__issues-title[data-v-1943d979] {
	margin: 0 0 6px;
	font-size: 0.9em;
}
.cn-structured-doc-review__issues ul[data-v-1943d979] {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-structured-doc-review__issue[data-v-1943d979] {
	display: flex;
	gap: 8px;
	align-items: baseline;
	font-size: 0.9em;
}
.cn-structured-doc-review__issue-severity[data-v-1943d979] {
	text-transform: uppercase;
	font-weight: 600;
	font-size: 0.75em;
	min-width: 56px;
}
.cn-structured-doc-review__issue--error .cn-structured-doc-review__issue-severity[data-v-1943d979] {
	color: var(--color-error);
}
.cn-structured-doc-review__issue--warning .cn-structured-doc-review__issue-severity[data-v-1943d979] {
	color: var(--color-warning);
}
.cn-structured-doc-review__issue--info .cn-structured-doc-review__issue-severity[data-v-1943d979] {
	color: var(--color-primary-element);
}
.cn-structured-doc-review__issue-path[data-v-1943d979] {
	font-family: monospace;
	color: var(--color-text-maxcontrast);
}
.cn-structured-doc-review__body[data-v-1943d979] {
	max-height: 480px;
	overflow: auto;
}
.cn-structured-doc-review__decision[data-v-1943d979] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	border-top: 1px solid var(--color-border);
	padding-top: 12px;
}
.cn-structured-doc-review__textarea[data-v-1943d979] {
	width: 100%;
	padding: 6px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	resize: vertical;
}
.cn-structured-doc-review__decision-actions[data-v-1943d979] {
	display: flex;
	gap: 8px;
	justify-content: flex-end;
}
.cn-structured-doc-review__action[data-v-1943d979] {
	padding: 6px 14px;
	border-radius: var(--border-radius);
	border: 1px solid var(--color-border);
	cursor: pointer;
}
.cn-structured-doc-review__action--reject[data-v-1943d979] {
	background: var(--color-error-hover, transparent);
	color: var(--color-error);
}
.cn-structured-doc-review__action--approve[data-v-1943d979] {
	background: var(--color-primary-element);
	color: var(--color-primary-element-text, #fff);
	border-color: var(--color-primary-element);
}
.cn-structured-doc-review__action[data-v-1943d979]:disabled {
	opacity: 0.5;
	cursor: not-allowed;
}


.cn-config-card__status[data-v-51da0e47] {
	display: flex;
	gap: 8px;
	margin-bottom: 12px;
}
.cn-config-card__content[data-v-51da0e47] {
	margin-bottom: 8px;
}
.cn-config-card__footer[data-v-51da0e47] {
	padding-top: 12px;
	border-top: 1px solid var(--color-border);
}


.cn-version-info__card[data-v-3dc855b2] {
	background: var(--color-background-hover);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	padding: 20px;
	margin-bottom: 20px;
}
.cn-version-info__card h4[data-v-3dc855b2] {
	margin: 0 0 16px 0;
	font-size: 16px;
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-version-info__details[data-v-3dc855b2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-version-info__item[data-v-3dc855b2] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	padding: 8px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-version-info__item[data-v-3dc855b2]:last-child {
	border-bottom: none;
}
.cn-version-info__label[data-v-3dc855b2] {
	font-weight: 500;
	color: var(--color-text-maxcontrast);
	font-size: 14px;
}
.cn-version-info__value[data-v-3dc855b2] {
	font-family: 'Courier New', Courier, monospace;
	font-weight: 600;
	color: var(--color-main-text);
	font-size: 14px;
}

/* Status classes for values */
.cn-version-info__status--ok[data-v-3dc855b2] {
	color: var(--color-success);
	font-weight: 600;
}
.cn-version-info__status--warning[data-v-3dc855b2] {
	color: var(--color-warning);
	font-weight: 600;
}
.cn-version-info__status--error[data-v-3dc855b2] {
	color: var(--color-error);
	font-weight: 600;
}
@media (max-width: 768px) {
.cn-version-info__item[data-v-3dc855b2] {
		flex-direction: column;
		align-items: flex-start;
		gap: 4px;
}
.cn-version-info__label[data-v-3dc855b2] {
		font-weight: 600;
}
.cn-version-info__value[data-v-3dc855b2] {
		word-break: break-all;
}
}


.cn-credentials__intro[data-v-5de04c1a] {
	margin-bottom: 16px;
	color: var(--color-text-maxcontrast);
}
.cn-credentials__vault-link[data-v-5de04c1a],
.cn-credentials__howto-link[data-v-5de04c1a] {
	white-space: nowrap;
	color: var(--color-primary-element);
}
.cn-credentials__error[data-v-5de04c1a] {
	margin-bottom: 12px;
}
.cn-credentials__section[data-v-5de04c1a] {
	margin-bottom: 22px;
}
.cn-credentials__section-title[data-v-5de04c1a] {
	margin: 8px 0 8px;
	font-weight: bold;
}
.cn-credentials__muted[data-v-5de04c1a],
.muted[data-v-5de04c1a] {
	color: var(--color-text-maxcontrast);
}
.cn-credentials__requests[data-v-5de04c1a],
.cn-credentials__list[data-v-5de04c1a] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-credentials__request[data-v-5de04c1a] {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 6px 0;
}
.cn-credentials__request-body[data-v-5de04c1a] {
	display: flex;
	flex-direction: column;
}
.cn-credentials__request-provider[data-v-5de04c1a] {
	font-weight: bold;
}
.cn-credentials__request-reason[data-v-5de04c1a] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}

/* Provider tile dot: a coloured badge with the provider's initial. */
.cn-credentials__tile-dot[data-v-5de04c1a] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	width: 32px;
	height: 32px;
	border-radius: var(--border-radius-large, 8px);
	color: #fff;
	font-weight: bold;
	font-size: 0.95em;
	line-height: 1;
}
.cn-credentials__tile-dot--lg[data-v-5de04c1a] {
	width: 44px;
	height: 44px;
	font-size: 1.3em;
}
.cn-credentials__item[data-v-5de04c1a] {
	padding: 12px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-credentials__item-head[data-v-5de04c1a] {
	display: flex;
	align-items: center;
	gap: 10px;
}
.cn-credentials__item-meta[data-v-5de04c1a] {
	display: flex;
	flex-direction: column;
	flex-grow: 1;
	min-width: 0;
}
.cn-credentials__item-name[data-v-5de04c1a] {
	font-weight: bold;
}
.cn-credentials__item-provider[data-v-5de04c1a] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-credentials__item-actions[data-v-5de04c1a] {
	display: flex;
	align-items: center;
	gap: 4px;
	flex-shrink: 0;
}
.cn-credentials__item-toggle[data-v-5de04c1a] {
	margin: 8px 0 0 42px;
}
.cn-credentials__also[data-v-5de04c1a] {
	margin: 4px 0 0;
	font-size: 0.9em;
}
.cn-credentials__item-apps[data-v-5de04c1a] {
	margin-top: 8px;
	width: 100%;
}
.cn-credentials__grid[data-v-5de04c1a] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
	gap: 10px;
	margin-bottom: 12px;
}
.cn-credentials__grid-tile[data-v-5de04c1a] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 16px 8px;
	background: var(--color-background-hover);
	border: 2px solid var(--color-border);
	border-radius: var(--border-radius-large, 8px);
	cursor: pointer;
}
.cn-credentials__grid-tile[data-v-5de04c1a]:hover,
.cn-credentials__grid-tile[data-v-5de04c1a]:focus-visible {
	border-color: var(--color-primary-element);
	background: var(--color-background-dark);
}
.cn-credentials__grid-title[data-v-5de04c1a] {
	font-weight: bold;
	text-align: center;
}
.cn-credentials__wizard-head[data-v-5de04c1a] {
	display: flex;
	align-items: center;
	gap: 10px;
	margin-bottom: 12px;
}
.cn-credentials__wizard-title[data-v-5de04c1a] {
	font-weight: bold;
	font-size: 1.1em;
}
.cn-credentials__howto[data-v-5de04c1a] {
	margin-bottom: 12px;
}
.cn-credentials__form[data-v-5de04c1a] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-credentials__addnote[data-v-5de04c1a] {
	margin: 0;
	font-size: 0.9em;
}
.cn-credentials__form-actions[data-v-5de04c1a],
.cn-credentials__wizard-actions[data-v-5de04c1a] {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
}

.cn-card[data-v-0dd5dd2f] {
  padding: 16px;
  border: 1px solid var(--color-border);
  border-radius: var(--border-radius-large);
  background: var(--color-main-background);
  height: 100%;
  display: flex;
  flex-direction: column;
}

.cn-card--active[data-v-0dd5dd2f] {
  border: 2px solid var(--cn-card-active-border);
}

.cn-card--clickable[data-v-0dd5dd2f] {
  cursor: pointer;
  transition: box-shadow 0.2s ease, border-color 0.2s ease;
}
.cn-card--clickable[data-v-0dd5dd2f]:hover {
  border-color: var(--color-primary-element);
  box-shadow: 0 2px 8px var(--color-box-shadow);
}

.cn-card__header[data-v-0dd5dd2f] {
  display: grid;
  grid-template-columns: 1fr auto;
  grid-template-rows: auto auto;
  align-items: center;
  border-bottom: 1px solid var(--color-border);
  padding-block-end: 1rem;
  margin-block-end: 0.5rem;
}

.cn-card__title[data-v-0dd5dd2f] {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 16px;
  margin: 0;
  min-width: 0;
}

.cn-card__title-text[data-v-0dd5dd2f] {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cn-card__labels[data-v-0dd5dd2f] {
  grid-column: 1/-1;
  display: flex;
  gap: 4px;
  flex-wrap: wrap;
  margin-top: 6px;
}

.cn-card__actions[data-v-0dd5dd2f] {
  flex-shrink: 0;
  margin-inline-start: 0.25rem;
}

.cn-card__body[data-v-0dd5dd2f] {
  flex-grow: 1;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

.cn-card__description[data-v-0dd5dd2f] {
  color: var(--color-text-lighter);
  margin-bottom: 12px;
  overflow-wrap: break-word;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.cn-card__content[data-v-0dd5dd2f] {
  margin-bottom: 12px;
}

.cn-card__stats[data-v-0dd5dd2f] {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.cn-card__stat[data-v-0dd5dd2f] {
  display: flex;
  justify-content: space-between;
}

.cn-card__stat-label[data-v-0dd5dd2f] {
  color: var(--color-text-lighter);
  font-size: 12px;
}

.cn-card__stat-value[data-v-0dd5dd2f] {
  font-weight: 600;
  font-size: 12px;
}

.cn-card__footer[data-v-0dd5dd2f] {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  padding-top: 8px;
  margin-top: 8px;
  border-top: 1px solid var(--color-border);
}

.cn-card__footer-link[data-v-0dd5dd2f] {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 0.85em;
  color: var(--color-primary-element);
  text-decoration: none;
  transition: color 0.2s;
}
.cn-card__footer-link[data-v-0dd5dd2f]:hover {
  text-decoration: underline;
}
.cn-choice-cards[data-v-93473002] {
  border: none;
  padding: 0;
  margin: 0;
  min-inline-size: 0;
}

.cn-choice-cards__legend[data-v-93473002] {
  padding: 0;
  margin-block-end: 8px;
  font-weight: bold;
}

.cn-choice-cards__loading[data-v-93473002] {
  display: flex;
  justify-content: center;
  padding: 24px 0;
}

.cn-choice-cards__grid[data-v-93473002] {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 12px;
}

.cn-choice-cards__option[data-v-93473002] {
  position: relative;
  display: block;
  cursor: pointer;
}

.cn-choice-cards__input[data-v-93473002] {
  position: absolute;
  inset-block-start: 16px;
  inset-inline-end: 14px;
  z-index: 1;
  margin: 0;
  cursor: pointer;
}

/* Room for the input, so a long title never runs underneath it. */
.cn-choice-cards__option[data-v-93473002] .cn-card {
  padding-inline-end: 44px;
  transition: box-shadow 0.2s ease, border-color 0.2s ease;
}

.cn-choice-cards__option[data-v-93473002]:hover .cn-card {
  border-color: var(--color-primary-element);
}

/* The focus ring belongs on the card, not on the small input inside it. */
.cn-choice-cards__input[data-v-93473002]:focus-visible + .cn-card {
  outline: 2px solid var(--color-primary-element);
  outline-offset: 2px;
}

.cn-choice-cards__input[data-v-93473002]:disabled {
  cursor: default;
}

.cn-choice-cards__input[data-v-93473002]:disabled + .cn-card {
  opacity: 0.6;
}

.cn-wizard-dialog__progress[data-v-27d51a62] {
	display: flex;
	align-items: flex-start;
	justify-content: center;
	gap: 0;
	padding: 8px 0 4px;
	margin: 0 0 20px;
	list-style: none;
}
.cn-wizard-dialog__progress-item[data-v-27d51a62] {
	position: relative;
	flex: 1 1 0;
	min-width: 0;
	max-width: 180px;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 6px;
	text-align: center;
	color: var(--color-text-maxcontrast);
	font-size: 0.8125rem;
}
.cn-wizard-dialog__progress-item--clickable[data-v-27d51a62] {
	cursor: pointer;
}

/* Marker circle */
.cn-wizard-dialog__progress-dot[data-v-27d51a62] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 34px;
	border-radius: 50%;
	border: 2px solid var(--color-border-dark);
	background: var(--color-main-background);
	color: var(--color-text-maxcontrast);
	font-size: 14px;
	font-weight: 600;
	transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
	z-index: 1;
}
.cn-wizard-dialog__progress-check[data-v-27d51a62] {
	font-size: 16px;
	line-height: 1;
}
.cn-wizard-dialog__progress-label[data-v-27d51a62] {
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* Connector line between this marker and the next, centered on the marker. */
.cn-wizard-dialog__progress-connector[data-v-27d51a62] {
	position: absolute;
	top: 17px;
	left: calc(50% + 21px);
	right: calc(-50% + 21px);
	height: 2px;
	background: var(--color-border-dark);
}
.cn-wizard-dialog__progress-connector--done[data-v-27d51a62] {
	background: var(--color-primary-element);
}

/* States */
.cn-wizard-dialog__progress-item--active .cn-wizard-dialog__progress-dot[data-v-27d51a62] {
	border-color: var(--color-primary-element);
	background: var(--color-primary-element);
	color: var(--color-primary-element-text, #fff);
}
.cn-wizard-dialog__progress-item--active .cn-wizard-dialog__progress-label[data-v-27d51a62] {
	color: var(--color-main-text);
	font-weight: 600;
}
.cn-wizard-dialog__progress-item--done .cn-wizard-dialog__progress-dot[data-v-27d51a62] {
	border-color: var(--color-primary-element);
	background: var(--color-primary-element);
	color: var(--color-primary-element-text, #fff);
}
.cn-wizard-dialog__progress-item--done .cn-wizard-dialog__progress-label[data-v-27d51a62] {
	color: var(--color-main-text);
}
.cn-wizard-dialog__progress-item--clickable:hover .cn-wizard-dialog__progress-label[data-v-27d51a62] {
	color: var(--color-primary-element);
}
.cn-wizard-dialog__step-body[data-v-27d51a62] {
	min-height: 200px;
}
.cn-wizard-dialog__result[data-v-27d51a62] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}


.cn-setup-step[data-v-75b2078b] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-setup-step__nav[data-v-75b2078b] {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
	margin-top: 8px;
}
.cn-setup-step__running[data-v-75b2078b] {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	padding: 24px 0;
	color: var(--color-text-maxcontrast);
}
.cn-setup-field[data-v-75b2078b] {
	display: flex;
	flex-direction: column;
}
.cn-setup-summary[data-v-75b2078b] {
	list-style: none;
	padding: 0;
	margin: 0;
}
.cn-setup-summary__item[data-v-75b2078b] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 4px 0;
	color: var(--color-text-maxcontrast);
}
.cn-setup-summary__item--done[data-v-75b2078b] {
	color: var(--color-main-text);
}
.cn-setup-summary__mark[data-v-75b2078b] {
	font-weight: bold;
	color: var(--color-success);
}
.cn-setup-summary__label[data-v-75b2078b] {
	flex: 0 0 auto;
}
.cn-setup-summary__value[data-v-75b2078b] {
	margin-inline-start: auto;
	font-weight: 600;
	color: var(--color-main-text);
}


.cn-admin-settings-shell[data-v-260aa222] {
	max-width: 900px;
}
.cn-support-info[data-v-260aa222] {
	margin-top: 16px;
	padding-top: 16px;
	border-top: 1px solid var(--color-border);
}
.cn-support-info h4[data-v-260aa222] {
	margin: 0 0 8px 0;
	font-size: 14px;
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-support-info p[data-v-260aa222] {
	margin: 4px 0;
	color: var(--color-text-maxcontrast);
	font-size: 14px;
}
.cn-support-info a[data-v-260aa222] {
	color: var(--color-primary-element);
}


.cn-card-grid__grid[data-v-1d1f4122] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
	gap: 16px;
}

/* A card slot whose component renders nothing (e.g. a custom card that hides
   itself with `v-if` for a client-side filter) leaves an empty grid item that
   would still occupy a grid track and a row gap — pushing the visible cards
   down with a large blank gap above them. Collapse those empty cells so the
   remaining cards start at the top. A comment-only node (`v-if` false) still
   matches `:empty` per the CSS spec, so this catches the v-if-hidden case. */
.cn-card-grid__item[data-v-1d1f4122]:empty {
	display: none;
}
.cn-card-grid__loading[data-v-1d1f4122] {
	display: flex;
	justify-content: center;
	padding: 40px;
}
.cn-card-grid__empty[data-v-1d1f4122] {
	padding: 40px 20px;
	text-align: center;
}


.cn-object-row[data-v-25c9f9b1] {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 8px 12px;
	border-bottom: 1px solid var(--color-border);
	cursor: pointer;
}
.cn-object-row[data-v-25c9f9b1]:hover {
	background-color: var(--color-background-hover);
}
.cn-object-row--selected[data-v-25c9f9b1] {
	/* Inset accent — never border-left (would shift cell content). */
	box-shadow: inset 3px 0 0 0 var(--color-primary-element);
	background-color: var(--color-primary-element-light);
}
.cn-object-row__checkbox[data-v-25c9f9b1] {
	flex-shrink: 0;
}
.cn-object-row__icon[data-v-25c9f9b1] {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 24px;
	height: 24px;
	color: var(--color-text-maxcontrast);
}
.cn-object-row__image[data-v-25c9f9b1] {
	width: 24px;
	height: 24px;
	object-fit: contain;
	border-radius: var(--border-radius);
}
.cn-object-row__main[data-v-25c9f9b1] {
	display: flex;
	flex-direction: column;
	min-width: 0;
	flex: 1;
}
.cn-object-row__title[data-v-25c9f9b1] {
	font-weight: 600;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-object-row__subtitle[data-v-25c9f9b1] {
	font-size: 13px;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-object-row__badges[data-v-25c9f9b1] {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	gap: 6px;
}
.cn-object-row__actions[data-v-25c9f9b1] {
	flex-shrink: 0;
	display: flex;
	align-items: center;
}


.cn-object-list__rows[data-v-f55c7962] {
	display: flex;
	flex-direction: column;
	border-top: 1px solid var(--color-border);
}

/* A list-item slot whose component renders nothing (e.g. a v-if client-side
   filter) still matches :empty per the CSS spec — collapse it so it leaves no
   ghost row / divider. */
.cn-object-list__item[data-v-f55c7962]:empty {
	display: none;
}
.cn-object-list__loading[data-v-f55c7962] {
	display: flex;
	justify-content: center;
	padding: 40px;
}
.cn-object-list__empty[data-v-f55c7962] {
	padding: 40px 20px;
	text-align: center;
}


.cn-object-kanban__loading[data-v-3523a46f],
.cn-object-kanban__empty[data-v-3523a46f] {
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 40px;
}
.cn-object-kanban__board[data-v-3523a46f] {
	display: flex;
	gap: 16px;
	overflow-x: auto;
	padding-bottom: 8px;
}
.cn-object-kanban__column[data-v-3523a46f] {
	display: flex;
	flex-direction: column;
	flex: 0 0 280px;
	min-width: 280px;
	background: var(--color-background-dark);
	border-radius: var(--border-radius-large, 10px);
	padding: 8px;
}
.cn-object-kanban__column-header[data-v-3523a46f] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 8px;
	font-weight: 600;
}
.cn-object-kanban__column-count[data-v-3523a46f] {
	color: var(--color-text-maxcontrast);
	font-weight: 400;
}
.cn-object-kanban__column-cards[data-v-3523a46f] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	min-height: 40px;
}
.cn-object-kanban__card[data-v-3523a46f] {
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius, 8px);
	padding: 10px;
	cursor: grab;
	transition: opacity 0.15s ease;
}
.cn-object-kanban__card--pending[data-v-3523a46f] {
	opacity: 0.6;
}
.cn-object-kanban__card-title[data-v-3523a46f] {
	font-weight: 500;
	cursor: pointer;
}
.cn-object-kanban__card-fields[data-v-3523a46f] {
	margin-top: 6px;
	display: flex;
	flex-direction: column;
	gap: 2px;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}
.cn-object-kanban__load-more[data-v-3523a46f] {
	display: flex;
	justify-content: center;
	padding-top: 8px;
}


.cn-object-calendar__header[data-v-bea31862] {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	padding: 8px 0 16px;
}
.cn-object-calendar__title[data-v-bea31862] {
	min-width: 160px;
	text-align: center;
	font-weight: 600;
	font-size: 16px;
	text-transform: capitalize;
}
.cn-object-calendar__loading[data-v-bea31862] {
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 40px;
}
.cn-object-calendar__month[data-v-bea31862] {
	display: grid;
	grid-template-columns: repeat(7, 1fr);
	gap: 1px;
	background: var(--color-border);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius, 8px);
	overflow: hidden;
}
.cn-object-calendar__month-header[data-v-bea31862] {
	background: var(--color-background-dark);
	padding: 6px 8px;
	font-size: 12px;
	font-weight: 600;
	text-align: center;
	color: var(--color-text-maxcontrast);
}
.cn-object-calendar__month-cell[data-v-bea31862] {
	background: var(--color-main-background);
	min-height: 90px;
	padding: 4px;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-object-calendar__month-cell.is-other-month[data-v-bea31862] {
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
}
.cn-object-calendar__month-day[data-v-bea31862] {
	font-size: 12px;
	width: 20px;
	height: 20px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}
.cn-object-calendar__month-cell.is-today .cn-object-calendar__month-day[data-v-bea31862] {
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
	border-radius: 50%;
}
.cn-object-calendar__month-events[data-v-bea31862] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-object-calendar__event[data-v-bea31862] {
	font-size: 11px;
	padding: 1px 4px;
	border-radius: 4px;
	background: var(--color-primary-element-light);
	color: var(--color-main-text);
	cursor: pointer;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-object-calendar__overflow[data-v-bea31862] {
	font-size: 11px;
	color: var(--color-text-maxcontrast);
	padding: 0 4px;
}


.cn-folder-tree[data-v-5ba0e7af] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-folder-tree__children[data-v-5ba0e7af] {
	padding-inline-start: 16px;
}
.cn-folder-tree__item[data-v-5ba0e7af] {
	display: flex;
	align-items: center;
	gap: 8px;
	width: 100%;
	padding: 6px 8px;
	border: none;
	border-radius: var(--border-radius);
	background: transparent;
	color: var(--color-main-text);
	font-size: inherit;
	text-align: start;
	cursor: pointer;
}
.cn-folder-tree__item[data-v-5ba0e7af]:hover {
	background-color: var(--color-background-hover);
}
.cn-folder-tree__item--active[data-v-5ba0e7af] {
	background-color: var(--color-primary-element-light);
	font-weight: 600;
}
.cn-folder-tree__name[data-v-5ba0e7af] {
	flex: 1;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-folder-tree__count[data-v-5ba0e7af] {
	flex-shrink: 0;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}


.cn-folder-sidebar[data-v-0cc3d5d2] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-folder-sidebar__title[data-v-0cc3d5d2] {
	font-size: 12px;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.3px;
	color: var(--color-text-maxcontrast);
	padding: 4px 8px;
}
.cn-folder-sidebar__all[data-v-0cc3d5d2] {
	display: flex;
	align-items: center;
	gap: 8px;
	width: 100%;
	padding: 6px 8px;
	border: none;
	border-radius: var(--border-radius);
	background: transparent;
	color: var(--color-main-text);
	font-size: inherit;
	text-align: start;
	cursor: pointer;
}
.cn-folder-sidebar__all[data-v-0cc3d5d2]:hover {
	background-color: var(--color-background-hover);
}
.cn-folder-sidebar__all--active[data-v-0cc3d5d2] {
	background-color: var(--color-primary-element-light);
	font-weight: 600;
}
.cn-folder-sidebar__all-label[data-v-0cc3d5d2] {
	flex: 1;
	min-width: 0;
}
.cn-folder-sidebar__loading[data-v-0cc3d5d2] {
	display: flex;
	justify-content: center;
	padding: 12px;
}
.cn-folder-sidebar__new[data-v-0cc3d5d2] {
	margin-top: 8px;
}
.cn-folder-sidebar__partial[data-v-0cc3d5d2] {
	margin: 8px 4px 0;
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	line-height: 1.3;
}


.cn-facet-sidebar[data-v-202f66e2] {
	padding: 16px;
	border-right: 1px solid var(--color-border);
	min-width: 240px;
	max-width: 300px;
}
.cn-facet-sidebar__header[data-v-202f66e2] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	margin-bottom: 16px;
}
.cn-facet-sidebar__title[data-v-202f66e2] {
	margin: 0;
	font-size: 15px;
	font-weight: 600;
}
.cn-facet-sidebar__loading[data-v-202f66e2] {
	display: flex;
	justify-content: center;
	padding: 20px;
}
.cn-facet-sidebar__filters[data-v-202f66e2] {
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.cn-facet-sidebar__group[data-v-202f66e2] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-facet-sidebar__label[data-v-202f66e2] {
	font-size: 12px;
	font-weight: 500;
	color: var(--color-text-maxcontrast);
	text-transform: uppercase;
	letter-spacing: 0.3px;
}
.cn-facet-sidebar__select[data-v-202f66e2] {
	width: 100%;
}


/*
 * TWO densities on purpose, and only ONE of them is a KPI.
 *
 * The summary strip IS a KPI surface, so it uses the canonical inline KPI from
 * src/css/kpi-card.css — the card's number weight, its accent colours and its
 * label scale, one size down. Nothing about it is declared locally except the
 * dot.
 *
 * The per-node list is NOT, and forcing it into KPI cards would be a false
 * uniformity. A KPI tile answers "how many?" with one number a reader takes in
 * at a glance; a node row answers "which one, where, and when was it last
 * checked?" — a name, a URL, a message and a timestamp, four fields that only
 * make sense read line by line. Boxing each of those in a 2rem-number card
 * would show a directory of forty nodes as forty tiles with no number on them.
 * What the list DOES share is the vocabulary: the same status dot, in the same
 * accent colours, so the strip and the rows agree on what "degraded" looks
 * like.
 */
.cn-federation-status[data-v-6ac9b70f] {
	display: flex;
	flex-direction: column;
	gap: var(--cn-kpi-stack-gap, 12px);
	padding: var(--cn-kpi-padding, 16px);
	border: 1px solid var(--color-border);
	border-radius: var(--cn-kpi-radius, 10px);
	background: var(--color-main-background);
}
.cn-federation-status__title[data-v-6ac9b70f] {
	margin: 0;
	font-size: var(--cn-kpi-section-title-size, 14px);
	font-weight: var(--cn-kpi-title-weight, 600);
}
.cn-federation-status__description[data-v-6ac9b70f] {
	margin: 4px 0 0;
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
}
.cn-federation-status__summary[data-v-6ac9b70f] {
	display: flex;
	gap: var(--cn-kpi-grid-gap, 16px);
	flex-wrap: wrap;
	align-items: baseline;
}

/* Layout and typography come from `cn-kpi-inline`, which every summary item
   also carries. The only thing left to say here is that the dot sits on the
   text baseline rather than on the number's. */
.cn-federation-status__summary-item[data-v-6ac9b70f] {
	align-items: center;
}

/* One dot rule, four colours, no repetition: each status modifier re-points
   the SAME accent token the inline KPI's number reads, so a dot can never be
   amber next to a red number. */
.cn-federation-status__dot[data-v-6ac9b70f] {
	width: 10px;
	height: 10px;
	border-radius: 50%;
	display: inline-block;
	flex-shrink: 0;
	background: var(--cn-kpi-accent, var(--color-text-maxcontrast));
}
.cn-federation-status__dot--up[data-v-6ac9b70f] {
	--cn-kpi-accent: var(--color-success);
}
.cn-federation-status__dot--degraded[data-v-6ac9b70f] {
	--cn-kpi-accent: var(--color-warning);
}
.cn-federation-status__dot--down[data-v-6ac9b70f] {
	--cn-kpi-accent: var(--color-error);
}
.cn-federation-status__dot--unknown[data-v-6ac9b70f] {
	--cn-kpi-accent: var(--color-text-maxcontrast);
}
.cn-federation-status__empty[data-v-6ac9b70f] {
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	font-style: italic;
	text-align: center;
	margin: 16px 0;
}
.cn-federation-status__list[data-v-6ac9b70f] {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-federation-status__node[data-v-6ac9b70f] {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding: 8px 12px;
	border-radius: var(--border-radius);
	cursor: pointer;
	background: var(--color-background-hover);
}
.cn-federation-status__node[data-v-6ac9b70f]:hover {
	background: var(--color-background-darker, var(--color-background-hover));
}
.cn-federation-status__node-dot[data-v-6ac9b70f] {
	margin-top: 6px;
	flex-shrink: 0;
}
.cn-federation-status__node-body[data-v-6ac9b70f] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	flex: 1 1 auto;
	min-width: 0;
}
.cn-federation-status__node-name[data-v-6ac9b70f] {
	font-size: var(--cn-kpi-title-size, 14px);
	font-weight: var(--cn-kpi-title-weight, 600);
}
.cn-federation-status__node-url[data-v-6ac9b70f] {
	font-family: monospace;
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
}
.cn-federation-status__node-message[data-v-6ac9b70f] {
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
}
.cn-federation-status__node-checked[data-v-6ac9b70f] {
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
}
.cn-federation-status__node-label[data-v-6ac9b70f] {
	font-size: var(--cn-kpi-label-size, 13px);
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	margin-top: 6px;
}


/* Selector is deliberately two classes deep. `.cn-context-menu` lands on
   NcActions' root, which NcActions itself styles as `.action-item[data-v-…]
   { position: relative; display: inline-block }`. Scoped CSS appends the attr
   to the last compound only, so a bare `.cn-context-menu` tied that rule at
   specificity (0,2,0) and lost on injection order — the trigger stayed
   `position: relative`, so it kept its in-flow box (top/left just offset it
   visually) and showed up as a full-width ~34px-tall phantom row between the
   table and the pagination on CnIndexPage. Adding the parent class makes this
   (0,3,0) so it wins regardless of order. */
.cn-context-menu-root > .cn-context-menu[data-v-1bef81d7] {
	/* Hide the NcActions trigger button — menu opens only via right-click.
	   Off-screen rather than display:none / visibility:hidden so NcPopover's
	   a11y check (`tabbable(triggerContainer)[0]`) still finds the NcButton
	   and the "custom button as a <NcPopover> trigger" warning stays quiet.
	   Avoid `clip` / `clip-path` here — modern browsers' `Element.checkVisibility()`,
	   which tabbable calls into, treats those as invisible. Pure offscreen
	   positioning leaves the element fully "visible" to layout while being
	   off the user's screen. */
	position: absolute;
	top: -9999px;
	left: -9999px;
	opacity: 0;
	pointer-events: none;
}
.cn-context-menu__backdrop[data-v-1bef81d7] {
	position: fixed;
	inset: 0;
	z-index: 9998;
}
.cn-context-menu__panel[data-v-1bef81d7] {
	position: fixed;
	top: var(--cn-ctx-menu-y, 0);
	left: var(--cn-ctx-menu-x, 0);
	z-index: 9999;
	min-width: 220px;
	padding: 4px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 12px);
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2);
	outline: none;
}


.cn-add-widget-modal__type[data-v-5292e590] {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-add-widget-modal__type-label[data-v-5292e590] {
	font-size: 14px;
	font-weight: 500;
}
.cn-add-widget-modal__type-select[data-v-5292e590] {
	padding: 8px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	font-size: 14px;
}
.cn-add-widget-modal__form[data-v-5292e590] {
	overflow-y: auto;
	/* Prefer a roomy ~340px for the type-specific fields (data-driven widgets
	   carry tall forms — columns, thresholds, data source); still shrinks with
	   its own scroll on short viewports so the Appearance + actions stay visible. */
	flex: 1 1 340px;
	min-height: 0;
}
.cn-add-widget-modal__empty[data-v-5292e590] {
	padding: 16px;
	text-align: center;
	color: var(--color-text-maxcontrast);
}
.cn-add-widget-modal__chrome[data-v-5292e590] {
	display: flex;
	flex-direction: column;
	gap: 10px;
	border-top: 1px solid var(--color-border);
	padding-top: 12px;
}
.cn-add-widget-modal__chrome-title[data-v-5292e590] {
	margin: 0;
	font-size: 15px;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
}
.cn-add-widget-modal__chrome-row[data-v-5292e590] {
	display: flex;
	align-items: center;
	gap: 12px;
}
.cn-add-widget-modal__chrome-label[data-v-5292e590] {
	min-width: 96px;
	font-size: 14px;
}
.cn-add-widget-modal__chrome-value[data-v-5292e590] {
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}


.cn-edit-actions__list[data-v-13336802] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-edit-actions__row[data-v-13336802] {
	display: flex;
	gap: 8px;
	align-items: flex-end;
	padding-bottom: 12px;
	border-bottom: 1px solid var(--color-border);
}
.cn-edit-actions__fields[data-v-13336802] {
	display: flex;
	gap: 8px;
	flex: 1 1 auto;
	flex-wrap: wrap;
}
.cn-edit-actions__row-actions[data-v-13336802] {
	display: flex;
	gap: 2px;
}


/* Result phase container */
.cn-tabbed-form-dialog__result[data-v-b02baba2] {
	padding: 16px 0;
}

/* Form phase container */
.cn-tabbed-form-dialog__form[data-v-b02baba2] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}

/* Tabs wrapper */
.cn-tabbed-form-dialog__tabs[data-v-b02baba2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}

/* Tab content area — also uses .form-editor for compatibility */
.cn-tabbed-form-dialog__tab-content[data-v-b02baba2] {
	display: flex;
	flex-direction: column;
	gap: 16px;
	padding: 16px 0;
}

/* Create another checkbox — push to the left in actions area */
.cn-tabbed-form-dialog__create-another[data-v-b02baba2] {
	margin-right: auto;
}

/* Bootstrap-Vue tab container styling */
.tabContainer > * ul > li[data-v-b02baba2] {
	display: flex;
	flex: 1;
}
.tabContainer > * ul > li[data-v-b02baba2]:hover {
	background-color: var(--color-background-hover);
}
.tabContainer > * ul > li > a[data-v-b02baba2] {
	flex: 1;
	text-align: center;
}
.tabContainer > * ul > li > .active[data-v-b02baba2] {
	background: transparent !important;
	color: var(--color-main-text) !important;
	border-bottom: var(--default-grid-baseline) solid var(--color-primary-element) !important;
}
.tabContainer > * ul[role="tablist"][data-v-b02baba2] {
	display: flex;
	margin: 10px 8px 0 8px;
	justify-content: space-between;
	border-bottom: 1px solid var(--color-border);
}
.tabContainer > * ul[role="tablist"] > * a[role="tab"][data-v-b02baba2] {
	padding-inline-start: 10px;
	padding-inline-end: 10px;
	padding-block-start: 10px;
	padding-block-end: 10px;
}
.tabContainer > * div[role="tabpanel"][data-v-b02baba2] {
	margin-block-start: var(--OR-margin-10);
}
[data-v-b02baba2] .nav-tabs {
	border-bottom: 1px solid var(--color-border);
	margin-bottom: 15px;
	display: flex;
}
[data-v-b02baba2] .nav-tabs .nav-item {
	display: flex;
	flex: 1;
}
[data-v-b02baba2] .nav-tabs .nav-link {
	flex: 1;
	text-align: center;
	border: none;
	border-bottom: 2px solid transparent;
	color: var(--color-text-maxcontrast);
	padding: 8px 16px;
	display: flex;
	align-items: center;
	gap: 8px;
	justify-content: center;
}
[data-v-b02baba2] .nav-tabs .nav-link.active {
	color: var(--color-main-text);
	border-bottom: 2px solid var(--color-primary);
	background-color: transparent;
}
[data-v-b02baba2] .nav-tabs .nav-link:hover {
	border-bottom: 2px solid var(--color-border);
}
[data-v-b02baba2] .nav-tabs .nav-link.disabled {
	cursor: not-allowed;
	opacity: 0.5;
	color: var(--color-text-maxcontrast);
	pointer-events: auto;
}
[data-v-b02baba2] .nav-tabs .nav-link.disabled * {
    cursor: not-allowed;
}
[data-v-b02baba2] .nav-tabs .nav-link.disabled:hover {
	border-bottom: 2px solid transparent;
}
[data-v-b02baba2] .tab-content {
	padding: 16px;
	background-color: var(--color-main-background);
}

/* Hand-rolled tab nav — replaces the bootstrap-vue BTabs/BTab pair to
   eliminate the bootstrap-vue → bootstrap@4 → jquery missing-peer chain
   in consumer SBOM. Visual parity with the legacy .nav-tabs above. */
.cn-tabbed-form-dialog__tab-nav[data-v-b02baba2] {
	display: flex;
	gap: 0;
	list-style: none;
	padding: 0;
	margin: 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-tabbed-form-dialog__tab-nav-item[data-v-b02baba2] {
	flex: 1 1 0;
}
.cn-tabbed-form-dialog__tab-button[data-v-b02baba2] {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	width: 100%;
	padding: 10px 14px;
	background: transparent;
	border: 0;
	border-bottom: 2px solid transparent;
	color: var(--color-text-maxcontrast);
	font: inherit;
	cursor: pointer;
}
.cn-tabbed-form-dialog__tab-button[data-v-b02baba2]:hover:not(:disabled) {
	border-bottom-color: var(--color-border);
	color: var(--color-main-text);
}
.cn-tabbed-form-dialog__tab-button.is-active[data-v-b02baba2] {
	color: var(--color-main-text);
	border-bottom-color: var(--color-primary);
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-tabbed-form-dialog__tab-button[data-v-b02baba2]:disabled {
	opacity: 0.5;
	cursor: not-allowed;
}


.notecard[data-v-1c454822] {
  --note-card-icon-size: 20px;
  --note-card-padding: calc(2 * var(--default-grid-baseline));
  color: var(--color-main-text) !important;
  background-color: var(--note-background) !important;
  border-inline-start: var(--default-grid-baseline) solid var(--note-theme);
  border-radius: var(--border-radius-small);
  margin: 1rem 0;
  padding: var(--note-card-padding);
  display: flex;
  flex-direction: row;
  gap: var(--note-card-padding);
}
.notecard__heading[data-v-1c454822] {
  font-size: var(--note-card-icon-size); /* Same as icon */
  font-weight: 600;
}
.notecard__icon[data-v-1c454822] {
  color: var(--note-theme);
}
.notecard__icon--heading[data-v-1c454822] {
  font-size: var(--note-card-icon-size);
  /* Ensure icon is on the same height as the heading */
  margin-block: calc((1lh - 1em) / 2) auto;
}
.notecard--success[data-v-1c454822] {
    --note-background: var(--color-success);
    --note-theme: var(--color-success-text);
}
.notecard--info[data-v-1c454822] {
    --note-background: var(--color-info);
    --note-theme: var(--color-info-text);
}
.notecard--error[data-v-1c454822] {
    --note-background: var(--color-error);
    --note-theme: var(--color-error-text);
}
.notecard--warning[data-v-1c454822] {
    --note-background: var(--color-warning);
    --note-theme: var(--color-warning-text);
}


/* NcDialog supplies the padding and the heading (via `name`); this div keeps only
   the body's own column layout. */
.cn-edit-data[data-v-309e1a7e] {
	display: flex;
	flex-direction: column;
	gap: 16px;
	min-height: 280px;
}
.cn-edit-data__subtitle[data-v-309e1a7e] {
	margin: 0;
	font-size: 1em;
	font-weight: 600;
}
.cn-edit-data__loading[data-v-309e1a7e] {
	margin: 40px auto;
}
.cn-edit-data__error[data-v-309e1a7e] {
	color: var(--color-error);
	padding: 8px 12px;
	background-color: var(--color-background-hover);
	border-radius: var(--border-radius);
}
.cn-edit-data__confirm[data-v-309e1a7e] {
	padding: 12px;
	background-color: var(--color-background-hover);
	border-radius: var(--border-radius);
}
.cn-edit-data__confirm-lead[data-v-309e1a7e] {
	font-weight: bold;
	margin-bottom: 4px;
}

/* The breaking-change confirmation is a warning, not a destruction. */
.cn-edit-data__confirm--breaking[data-v-309e1a7e] {
	border-inline-start: 4px solid var(--color-warning, var(--color-primary));
}
.cn-edit-data__breaking-list[data-v-309e1a7e] {
	margin: 0 0 8px;
	padding-inline-start: 20px;
	list-style: disc;
}
.cn-edit-data__breaking-list li[data-v-309e1a7e] {
	color: var(--color-text-maxcontrast);
	font-family: var(--font-face-monospace, monospace);
	font-size: 90%;
}
.cn-edit-data__confirm-note[data-v-309e1a7e] {
	color: var(--color-text-maxcontrast);
	margin-bottom: 12px;
}
.cn-edit-data__confirm-actions[data-v-309e1a7e] {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
}
.cn-edit-data__empty[data-v-309e1a7e] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	align-items: flex-start;
}
.cn-edit-data__register[data-v-309e1a7e] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-edit-data__register-name[data-v-309e1a7e] {
	color: var(--color-text-maxcontrast);
}
.cn-edit-data__register-rename[data-v-309e1a7e] {
	max-width: 360px;
}
.cn-edit-data__schemas[data-v-309e1a7e] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-edit-data__schemas-head[data-v-309e1a7e] {
	display: flex;
	justify-content: space-between;
	align-items: center;
}
.cn-edit-data__hint[data-v-309e1a7e] {
	color: var(--color-text-maxcontrast);
	margin: 0;
}
.cn-edit-data__list[data-v-309e1a7e] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-edit-data__row[data-v-309e1a7e] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	padding: 8px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
}
.cn-edit-data__schema-name[data-v-309e1a7e] {
	display: flex;
	flex-direction: column;
}
.cn-edit-data__schema-meta[data-v-309e1a7e] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}
.cn-edit-data__row-actions[data-v-309e1a7e] {
	display: flex;
	gap: 4px;
}



.cn-menu-tree__row[data-v-3187ef1d] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 4px 6px;
	border-radius: var(--border-radius);
}
.cn-menu-tree__row[data-v-3187ef1d]:hover {
	background: var(--color-background-hover);
}
.cn-menu-tree__handle[data-v-3187ef1d] {
	display: inline-flex;
	align-items: center;
	cursor: grab;
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-menu-tree__icon-btn[data-v-3187ef1d] {
	background: none;
	border: none;
	padding: 0;
	cursor: pointer;
	flex-shrink: 0;
}
.cn-menu-tree__icon[data-v-3187ef1d] {
	display: inline-block;
	width: 20px;
	height: 20px;
	background-size: 16px;
	background-position: center;
	background-repeat: no-repeat;
	opacity: 0.7;
}
.cn-menu-tree__icon--generic[data-v-3187ef1d] {
	border-radius: 50%;
	background: var(--color-border-dark);
}
.cn-menu-tree__label[data-v-3187ef1d] {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-weight: 500;
}
.cn-menu-tree__label--btn[data-v-3187ef1d] {
	background: none;
	border: none;
	text-align: left;
	cursor: text;
	font: inherit;
	color: inherit;
	padding: 4px;
	border-radius: var(--border-radius);
}
.cn-menu-tree__label--btn[data-v-3187ef1d]:hover {
	background: var(--color-background-dark);
}
.cn-menu-tree__page[data-v-3187ef1d] {
	flex-shrink: 0;
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}
.cn-menu-tree__page--btn[data-v-3187ef1d] {
	background: none;
	border: none;
	cursor: pointer;
	padding: 4px 6px;
	border-radius: var(--border-radius);
}
.cn-menu-tree__page--btn[data-v-3187ef1d]:hover {
	background: var(--color-background-dark);
}
.cn-menu-tree__inline-field[data-v-3187ef1d] {
	flex: 1 1 auto;
}
.cn-menu-tree__inline-select[data-v-3187ef1d] {
	min-width: 160px;
	flex-shrink: 0;
}
.cn-menu-tree__config[data-v-3187ef1d] {
	display: flex;
	flex-direction: column;
	gap: 6px;
	padding: 10px;
	min-width: 180px;
}
.cn-menu-tree__icon-opt[data-v-3187ef1d] {
	display: inline-flex;
	align-items: center;
	gap: 8px;
}
.cn-menu-tree__icon-glyph[data-v-3187ef1d] {
	display: inline-block;
	width: 16px;
	height: 16px;
	background-size: 16px;
	background-position: center;
	background-repeat: no-repeat;
	opacity: 0.8;
}


.cn-menu-tree[data-v-426b854f] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-menu-tree__children[data-v-426b854f] {
	list-style: none;
	margin: 4px 0 0 28px;
	padding: 0 0 0 8px;
	border-left: 2px solid var(--color-border);
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-menu-tree__children--empty[data-v-426b854f] {
	min-height: 10px;
	margin-top: 0;
	border-left-color: transparent;
}
.cn-menu-tree__node[data-v-426b854f] {
	list-style: none;
}


.cn-page-tree__item[data-v-2e1c95c6] {
	display: flex;
	flex-direction: column;
}
.cn-page-tree__row[data-v-2e1c95c6] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 4px 6px;
	border-radius: var(--border-radius);
}
.cn-page-tree__row[data-v-2e1c95c6]:hover {
	background: var(--color-background-hover);
}
.cn-page-tree__handle[data-v-2e1c95c6] {
	display: inline-flex;
	align-items: center;
	cursor: grab;
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-page-tree__icon[data-v-2e1c95c6] {
	display: inline-flex;
	align-items: center;
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-page-tree__label[data-v-2e1c95c6] {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-weight: 500;
}
.cn-page-tree__label--btn[data-v-2e1c95c6] {
	background: none;
	border: none;
	text-align: left;
	cursor: text;
	font: inherit;
	color: inherit;
	padding: 4px;
	border-radius: var(--border-radius);
}
.cn-page-tree__label--btn[data-v-2e1c95c6]:hover {
	background: var(--color-background-dark);
}
.cn-page-tree__type[data-v-2e1c95c6] {
	flex-shrink: 0;
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}
.cn-page-tree__type--btn[data-v-2e1c95c6] {
	background: none;
	border: none;
	cursor: pointer;
	padding: 4px 6px;
	border-radius: var(--border-radius);
}
.cn-page-tree__type--btn[data-v-2e1c95c6]:hover {
	background: var(--color-background-dark);
}
.cn-page-tree__inline-field[data-v-2e1c95c6] {
	flex: 1 1 auto;
}
.cn-page-tree__inline-select[data-v-2e1c95c6] {
	min-width: 160px;
	flex-shrink: 0;
}
.cn-page-tree__panel[data-v-2e1c95c6] {
	display: flex;
	flex-direction: column;
	gap: 10px;
	margin: 4px 0 8px 34px;
	padding: 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 8px);
	background: var(--color-background-hover);
}
.cn-page-tree__panel-actions[data-v-2e1c95c6] {
	display: flex;
	justify-content: space-between;
	gap: 8px;
	border-top: 1px solid var(--color-border);
	padding-top: 8px;
}


.cn-page-tree[data-v-783a7f4f] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-page-tree__children[data-v-783a7f4f] {
	list-style: none;
	margin: 4px 0 0 28px;
	padding: 0 0 0 8px;
	border-left: 2px solid var(--color-border);
	display: flex;
	flex-direction: column;
	gap: 4px;
}

/* Keep an empty child list as a visible drop target for nesting. */
.cn-page-tree__children--empty[data-v-783a7f4f] {
	min-height: 10px;
	margin-top: 0;
	border-left-color: transparent;
}
.cn-page-tree__node[data-v-783a7f4f] {
	list-style: none;
}


.cn-edit-settings__hint[data-v-7cbf6b68] {
	color: var(--color-text-maxcontrast);
	margin: 0 0 12px;
}
.cn-edit-settings__group[data-v-7cbf6b68] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 12px;
	display: flex;
	flex-direction: column;
	gap: 12px;
	margin: 12px 0 0;
}
.cn-edit-settings__legend[data-v-7cbf6b68] {
	font-weight: 600;
	padding: 0 6px;
}


.cn-edit-setup[data-v-612d4d02] {
	padding: 20px;
}
.cn-edit-setup__intro[data-v-612d4d02],
.cn-edit-setup__empty[data-v-612d4d02] {
	color: var(--color-text-maxcontrast);
	margin-bottom: 12px;
}
.cn-edit-setup__list[data-v-612d4d02] {
	list-style: none;
	padding: 0;
	margin: 0;
}
.cn-edit-setup__step[data-v-612d4d02] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	padding: 12px;
	margin-bottom: 12px;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-edit-setup__row[data-v-612d4d02] {
	display: flex;
	align-items: flex-end;
	gap: 8px;
}
.cn-edit-setup__type[data-v-612d4d02] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}


.cn-edit-sidebar__subtitle[data-v-4ac4e083] {
	margin: 16px 0 8px;
}
.cn-edit-sidebar__tabs[data-v-4ac4e083] {
	display: flex;
	flex-direction: column;
	gap: 6px;
	list-style: none;
	padding: 0;
	margin: 0;
}
.cn-edit-sidebar__tab[data-v-4ac4e083] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	padding: 12px;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-edit-sidebar__tab-row[data-v-4ac4e083] {
	display: flex;
	align-items: flex-end;
	gap: 8px;
}
.cn-edit-sidebar__content[data-v-4ac4e083] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}


.cn-edit-support__intro[data-v-f2468520] {
	color: var(--color-text-maxcontrast);
	margin-bottom: 12px;
}
.cn-edit-support__section[data-v-f2468520] {
	margin-bottom: 8px;
}
.cn-edit-support__field[data-v-f2468520] {
	display: block;
	margin-bottom: 12px;
}
.cn-edit-support__list[data-v-f2468520] {
	list-style: none;
	padding: 0;
	margin: 0;
}
.cn-edit-support__button[data-v-f2468520] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	padding: 12px;
	margin-bottom: 12px;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-edit-support__button-name[data-v-f2468520] {
	margin: 0;
}
.cn-edit-support__avatar[data-v-f2468520] {
	display: flex;
	gap: 12px;
	align-items: flex-start;
	margin-bottom: 12px;
}
.cn-edit-support__avatar-preview[data-v-f2468520] {
	width: 48px;
	height: 48px;
	border-radius: 50%;
	object-fit: cover;
	flex: 0 0 auto;
}
.cn-edit-support__avatar-fields[data-v-f2468520] {
	flex: 1 1 auto;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-edit-support__avatar-actions[data-v-f2468520] {
	display: flex;
	gap: 8px;
	align-items: center;
}
.cn-edit-support__avatar-input[data-v-f2468520] {
	display: none;
}
.cn-edit-support__style[data-v-f2468520] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}


.cn-edit-walkthrough__intro[data-v-09d71a03],
.cn-edit-walkthrough__empty[data-v-09d71a03] {
	color: var(--color-text-maxcontrast);
	margin-bottom: 12px;
}
.cn-edit-walkthrough__field[data-v-09d71a03],
.cn-edit-walkthrough__trigger[data-v-09d71a03] {
	display: block;
	margin-bottom: 12px;
}
.cn-edit-walkthrough__trigger[data-v-09d71a03] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-edit-walkthrough__steps-title[data-v-09d71a03] {
	margin-bottom: 8px;
}
.cn-edit-walkthrough__list[data-v-09d71a03] {
	list-style: none;
	padding: 0;
	margin: 0;
}
.cn-edit-walkthrough__step[data-v-09d71a03] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	padding: 12px;
	margin-bottom: 12px;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-edit-walkthrough__row[data-v-09d71a03] {
	display: flex;
	align-items: flex-end;
	gap: 8px;
}


.cn-flow-edge-edit[data-v-15d14400] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding-block-end: 8px;
}
.cn-flow-edge-edit__endpoints[data-v-15d14400] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}


.cn-flow-node-edit[data-v-e107484a] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding-block-end: 8px;
}
.cn-flow-node-edit__description[data-v-e107484a] {
	color: var(--color-text-maxcontrast);
}
.cn-flow-node-edit__id[data-v-e107484a],
.cn-flow-node-edit__hint[data-v-e107484a] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-flow-node-edit__advanced summary[data-v-e107484a] {
	cursor: pointer;
	color: var(--color-text-maxcontrast);
	margin-block-end: 8px;
}


.cn-step-picker[data-v-73fbe066] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 8px 0;
	/* The dialog is tall; the grid scrolls, the controls do not. */
	max-block-size: 70vh;
}
.cn-step-picker__controls[data-v-73fbe066] {
	display: flex;
	gap: 12px;
	flex-wrap: wrap;
	align-items: end;
}
.cn-step-picker__hint[data-v-73fbe066] {
	color: var(--color-text-maxcontrast);
}

/* THE WHOLE POINT OF THE MODAL: a grid, so sixty-five entries can be compared
   rather than scrolled past one at a time. `auto-fill` rather than a fixed
   count, so the same markup works in a narrow window. */
.cn-step-picker__group[data-v-73fbe066] {
	margin-block-start: 16px;
}
.cn-step-picker__group-title[data-v-73fbe066] {
	margin: 0 0 8px;
	font-size: 1rem;
	font-weight: bold;
	display: flex;
	align-items: baseline;
	gap: 8px;
}
.cn-step-picker__group-count[data-v-73fbe066] {
	font-weight: normal;
	color: var(--color-text-maxcontrast);
}
.cn-step-picker__grid[data-v-73fbe066] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
	overflow-y: auto;
}
.cn-step-picker__item[data-v-73fbe066] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	padding: 10px 12px;
	border: 2px solid transparent;
	border-radius: var(--border-radius-large, 12px);
	background: var(--color-background-hover);
	cursor: pointer;
}
.cn-step-picker__item[data-v-73fbe066]:hover,
.cn-step-picker__item[data-v-73fbe066]:focus-visible {
	border-color: var(--color-primary-element);
}
.cn-step-picker__head[data-v-73fbe066] {
	display: flex;
	align-items: center;
	gap: 8px;
	justify-content: space-between;
}
.cn-step-picker__name[data-v-73fbe066] {
	font-weight: bold;
}
.cn-step-picker__role[data-v-73fbe066] {
	font-size: 0.8em;
	text-transform: uppercase;
	color: var(--color-text-maxcontrast);
	letter-spacing: 0.04em;
}
.cn-step-picker__role--trigger[data-v-73fbe066] { color: var(--color-primary-element);
}
.cn-step-picker__role--end[data-v-73fbe066] { color: var(--color-warning-text, var(--color-warning));
}
.cn-step-picker__description[data-v-73fbe066] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-step-picker__id[data-v-73fbe066] {
	font-family: monospace;
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}


/* `pointer-events` is OFF on the layer EdgeLabelRenderer creates, so that the
   layer does not swallow clicks meant for the canvas underneath. A control in
   it has to turn them back on for itself. */
.cn-flow-edge__layer[data-v-6367d89a] {
	position: absolute;
	display: flex;
	align-items: center;
	gap: 6px;
}
.cn-flow-edge__adornment[data-v-6367d89a] {
	pointer-events: all;
	display: flex;
	align-items: center;
	gap: 4px;
}
.cn-flow-edge__label[data-v-6367d89a] {
	pointer-events: all;
	display: inline-flex;
	align-items: center;
	gap: 4px;
	padding: 2px 10px;
	border: 1px solid var(--color-border, #d0d0d0);
	border-radius: 11px;
	background: var(--color-main-background, #fff);
	color: var(--color-main-text, #222);
	font-size: 11px;
	line-height: 18px;
	white-space: nowrap;
	cursor: grab;
}
.cn-flow-edge__label[data-v-6367d89a]:focus-visible {
	outline: 2px solid var(--color-primary-element, #0082c9);
	outline-offset: 1px;
}
.cn-flow-edge__label--dragging[data-v-6367d89a] {
	cursor: grabbing;
}

/* The travelling pulse. `stroke-dashoffset` walks from the dash period down to
   zero, which slides the pattern FORWARDS along the path — source to target,
   the same direction the arrowhead points. Running it the other way would give
   the canvas two direction cues that disagree.

   Deliberately slow and sparse: this sits behind whatever the user is actually
   doing, and a fast marching-ants line on every connection of a twenty-step
   flow is a distraction rather than information. */
.cn-flow-edge__pulse[data-v-6367d89a] {
	fill: none;
	stroke: var(--color-primary-element, #0082c9);
	stroke-width: 2.5;
	stroke-linecap: round;
	stroke-dasharray: 1 16;
	pointer-events: none;
	animation: cn-flow-edge-pulse-6367d89a 1.6s linear infinite;
}
@keyframes cn-flow-edge-pulse-6367d89a {
from {
		stroke-dashoffset: 17;
}
to {
		stroke-dashoffset: 0;
}
}

/* ⚠️ HIDDEN, NOT MERELY STOPPED. A paused animation leaves the dash pattern
   frozen wherever it stood, so a still line would keep a row of dots on it that
   look like a second, dotted connection. WCAG 2.2 AA 2.3.3 asks for the motion
   to go; leaving its residue behind would be the letter without the point. */
@media (prefers-reduced-motion: reduce) {
.cn-flow-edge__pulse[data-v-6367d89a] {
		display: none;
}
}


.cn-flow-node[data-v-4b186e5f] {
	position: relative;
	min-width: 140px;
	padding: 8px 12px;
	border: 2px solid var(--color-border, #d0d0d0);
	border-radius: var(--border-radius-large, 8px);
	background: var(--color-main-background, #fff);
	color: var(--color-main-text, #222);
}
.cn-flow-node[data-v-4b186e5f]:focus-visible {
	outline: 2px solid var(--color-primary-element, #0082c9);
	outline-offset: 2px;
}
.cn-flow-node--selected[data-v-4b186e5f] {
	border-color: var(--color-primary-element, #0082c9);
}
.cn-flow-node__label[data-v-4b186e5f] {
	font-weight: 600;
}
.cn-flow-node__handle[data-v-4b186e5f] {
	/* 14px, not 10: a port now carries a direction arrow, and there is no room
	   to draw one legibly in 10. Sized against the 22px arrowhead an edge ends
	   in (see `useFlowStore.canvasEdges`) — the marker still has to clear the
	   handle it lands on. */
	width: 14px;
	height: 14px;
	background: var(--color-primary-element, #0082c9);
}

/* AN ARROW IN THE PORT, because a dot cannot say which way it faces.

   A canvas with four ports on a node is only readable if each one states
   whether it takes a line in or lets one out, and the port is the only place
   that can say it — a user reading the node has not yet followed the line.
   Every arrow points WITH the flow: an entry on the left and an exit on the
   right both point right, an entry on top and an exit on the bottom both point
   down. So the whole node reads as one direction rather than as four separate
   claims.

   Drawn with borders rather than an icon component: a port is 14px, it is
   rendered once per handle per node, and a triangle at that size is crisper
   from a border than from a scaled glyph. */
.cn-flow-node__handle[data-v-4b186e5f]::after {
	content: '';
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	inline-size: 0;
	block-size: 0;
	border: 3px solid transparent;
	pointer-events: none;
}
.cn-flow-node__handle--dir-right[data-v-4b186e5f]::after {
	border-inline-start-color: var(--color-primary-element-text, #fff);
	transform: translate(-30%, -50%);
}
.cn-flow-node__handle--dir-down[data-v-4b186e5f]::after {
	border-block-start-color: var(--color-primary-element-text, #fff);
	transform: translate(-50%, -30%);
}

/* The armed port is RINGED, not merely coloured: colour alone is not an
   accessible state indicator, and this is the cue that tells a keyboard user
   which branch the next `c` will connect. */
.cn-flow-node__handle--armed[data-v-4b186e5f] {
	outline: 3px solid var(--color-warning, #c28900);
	outline-offset: 2px;
}

/* A PORT NOTHING IS CONNECTED TO IS A BROKEN FLOW, SHOWN WHERE IT BREAKS.

   An entry with no line into it can never be reached; an exit with no line out
   of it stops the run. Both are things the engine will report at run time, and
   the port is where the author can act on it — the Check button's verdict is a
   list of node ids in a card somewhere else on the screen.

   ⚠️ NOT COLOUR ALONE. The ring changes the port's SHAPE as well as its fill,
   and every warning port carries a `title` naming the consequence plus an
   `aria-label` that says the same thing — see `orphanEntryHint`. A state a
   sighted user reads from a colour and nobody else can read at all is not a
   state, it is decoration. */
.cn-flow-node__handle--orphan[data-v-4b186e5f] {
	background: var(--color-warning, #c28900);
	box-shadow: 0 0 0 2px var(--color-main-background, #fff), 0 0 0 4px var(--color-warning, #c28900);
}
.cn-flow-node__handle--orphan[data-v-4b186e5f]::after {
	border-inline-start-color: var(--color-main-text, #222);
	border-block-start-color: transparent;
}
.cn-flow-node__handle--orphan.cn-flow-node__handle--dir-down[data-v-4b186e5f]::after {
	border-inline-start-color: transparent;
	border-block-start-color: var(--color-main-text, #222);
}


/* Vue Flow's own stylesheet, themed through Nextcloud variables. Imported
   un-scoped because it styles elements Vue Flow renders outside this
   component's scope. */
.vue-flow {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  z-index: 0;
  direction: ltr;
}

.vue-flow__container {
  position: absolute;
  height: 100%;
  width: 100%;
  left: 0;
  top: 0;
}

.vue-flow__pane {
  z-index: 1;
}

.vue-flow__pane.draggable {
    cursor: grab;
  }

.vue-flow__pane.selection {
    cursor: pointer;
  }

.vue-flow__pane.dragging {
    cursor: grabbing;
  }

.vue-flow__transformationpane {
  transform-origin: 0 0;
  z-index: 2;
  pointer-events: none;
}

.vue-flow__viewport {
  z-index: 4;
  overflow: clip;
}

.vue-flow__selection {
  z-index: 6;
}

.vue-flow__edge-labels {
  position: absolute;
  width: 100%;
  height: 100%;
  pointer-events: none;
  -webkit-user-select: none;
     -moz-user-select: none;
          user-select: none;
}

.vue-flow__nodesselection-rect:focus,
.vue-flow__nodesselection-rect:focus-visible {
  outline: none;
}

.vue-flow .vue-flow__edges {
  pointer-events: none;
  overflow: visible;
}

.vue-flow__edge-path,
.vue-flow__connection-path {
  stroke: #b1b1b7;
  stroke-width: 1;
  fill: none;
}

.vue-flow__edge {
  pointer-events: visibleStroke;
  cursor: pointer;
}

.vue-flow__edge.animated path {
    stroke-dasharray: 5;
    animation: dashdraw 0.5s linear infinite;
  }

.vue-flow__edge.animated path.vue-flow__edge-interaction {
    stroke-dasharray: none;
    animation: none;
  }

.vue-flow__edge.inactive {
    pointer-events: none;
  }

.vue-flow__edge.selected,
  .vue-flow__edge:focus,
  .vue-flow__edge:focus-visible {
    outline: none;
  }

.vue-flow__edge.selected .vue-flow__edge-path,
  .vue-flow__edge:focus .vue-flow__edge-path,
  .vue-flow__edge:focus-visible .vue-flow__edge-path {
    stroke: #555;
  }

.vue-flow__edge-textwrapper {
    pointer-events: all;
  }

.vue-flow__edge-textbg {
    fill: white;
  }

.vue-flow__edge-text {
    pointer-events: none;
    -webkit-user-select: none;
       -moz-user-select: none;
            user-select: none;
  }

.vue-flow__connection {
  pointer-events: none;
}

.vue-flow__connection .animated {
    stroke-dasharray: 5;
    animation: dashdraw 0.5s linear infinite;
  }

.vue-flow__connectionline {
  z-index: 1001;
}

.vue-flow__nodes {
  pointer-events: none;
  transform-origin: 0 0;
}

.vue-flow__node {
  position: absolute;
  -webkit-user-select: none;
     -moz-user-select: none;
          user-select: none;
  pointer-events: all;
  transform-origin: 0 0;
  box-sizing: border-box;
  cursor: default;
}

.vue-flow__node.draggable {
    cursor: grab;
    pointer-events: all;
  }

.vue-flow__node.draggable.dragging {
      cursor: grabbing;
    }

.vue-flow__nodesselection {
  z-index: 3;
  transform-origin: left top;
  pointer-events: none;
}

.vue-flow__nodesselection-rect {
    position: absolute;
    pointer-events: all;
    cursor: grab;
  }

.vue-flow__nodesselection-rect.dragging {
      cursor: grabbing;
    }

.vue-flow__handle {
  position: absolute;
  pointer-events: none;
  min-width: 5px;
  min-height: 5px;
}

.vue-flow__handle.connectable {
    pointer-events: all;
    cursor: crosshair;
  }

.vue-flow__handle-bottom {
    left: 50%;
    bottom: 0;
    transform: translate(-50%, 50%);
  }

.vue-flow__handle-top {
    left: 50%;
    top: 0;
    transform: translate(-50%, -50%);
  }

.vue-flow__handle-left {
    top: 50%;
    left: 0;
    transform: translate(-50%, -50%);
  }

.vue-flow__handle-right {
    top: 50%;
    right: 0;
    transform: translate(50%, -50%);
  }

.vue-flow__edgeupdater {
  cursor: move;
  pointer-events: all;
}

.vue-flow__panel {
  position: absolute;
  z-index: 5;
  margin: 15px;
}

.vue-flow__panel.top {
    top: 0;
  }

.vue-flow__panel.bottom {
    bottom: 0;
  }

.vue-flow__panel.left {
    left: 0;
  }

.vue-flow__panel.right {
    right: 0;
  }

.vue-flow__panel.center {
    left: 50%;
    transform: translateX(-50%);
  }

@keyframes dashdraw {
  from {
    stroke-dashoffset: 10;
  }
}
:root {
  --vf-node-bg: #fff;
  --vf-node-text: #222;
  --vf-connection-path: #b1b1b7;
  --vf-handle: #555;
}

.vue-flow__edge.updating .vue-flow__edge-path {
      stroke: #777;
    }

.vue-flow__edge-text {
  font-size: 10px;
}

.vue-flow__edge-textbg {
  fill: #fff;
}

.vue-flow__connection-path {
  stroke: var(--vf-connection-path);
}

.vue-flow__node {
  cursor: grab;
}

.vue-flow__node.selectable:focus,
  .vue-flow__node.selectable:focus-visible {
    outline: none;
  }

.vue-flow__node-default,
.vue-flow__node-input,
.vue-flow__node-output {
  padding: 10px;
  border-radius: 3px;
  width: 150px;
  font-size: 12px;
  text-align: center;
  border-width: 1px;
  border-style: solid;
  color: var(--vf-node-text);
  background-color: var(--vf-node-bg);
  border-color: var(--vf-node-color);
}

.vue-flow__node-default.selected,
  .vue-flow__node-default.selected:hover,
  .vue-flow__node-input.selected,
  .vue-flow__node-input.selected:hover,
  .vue-flow__node-output.selected,
  .vue-flow__node-output.selected:hover {
    box-shadow: 0 0 0 0.5px var(--vf-box-shadow);
  }

.vue-flow__node-default.selected,
  .vue-flow__node-default:focus,
  .vue-flow__node-default:focus-visible,
  .vue-flow__node-input.selected,
  .vue-flow__node-input:focus,
  .vue-flow__node-input:focus-visible,
  .vue-flow__node-output.selected,
  .vue-flow__node-output:focus,
  .vue-flow__node-output:focus-visible {
    outline: none;
    border: 1px solid #555;
  }

.vue-flow__node-default .vue-flow__handle, .vue-flow__node-input .vue-flow__handle, .vue-flow__node-output .vue-flow__handle {
    background: var(--vf-handle);
  }

.vue-flow__node-default.selectable:hover, .vue-flow__node-input.selectable:hover, .vue-flow__node-output.selectable:hover {
    box-shadow: 0 1px 4px 1px rgba(0, 0, 0, 0.08);
  }

.vue-flow__node-input {
  --vf-node-color: var(--vf-node-color, #0041d0);
  --vf-handle: var(--vf-node-color, #0041d0);
  --vf-box-shadow: var(--vf-node-color, #0041d0);

  background: var(--vf-node-bg);
  border-color: var(--vf-node-color, #0041d0);
}

.vue-flow__node-input.selected,
  .vue-flow__node-input:focus,
  .vue-flow__node-input:focus-visible {
    outline: none;
    border: 1px solid var(--vf-node-color, #0041d0);
  }

.vue-flow__node-default {
  --vf-handle: var(--vf-node-color, #1a192b);
  --vf-box-shadow: var(--vf-node-color, #1a192b);

  background: var(--vf-node-bg);
  border-color: var(--vf-node-color, #1a192b);
}

.vue-flow__node-default.selected,
  .vue-flow__node-default:focus,
  .vue-flow__node-default:focus-visible {
    outline: none;
    border: 1px solid var(--vf-node-color, #1a192b);
  }

.vue-flow__node-output {
  --vf-handle: var(--vf-node-color, #ff0072);
  --vf-box-shadow: var(--vf-node-color, #ff0072);

  background: var(--vf-node-bg);
  border-color: var(--vf-node-color, #ff0072);
}

.vue-flow__node-output.selected,
  .vue-flow__node-output:focus,
  .vue-flow__node-output:focus-visible {
    outline: none;
    border: 1px solid var(--vf-node-color, #ff0072);
  }

.vue-flow__nodesselection-rect,
.vue-flow__selection {
  background: rgba(0, 89, 220, 0.08);
  border: 1px dotted rgba(0, 89, 220, 0.8);
}

.vue-flow__nodesselection-rect:focus,
  .vue-flow__nodesselection-rect:focus-visible,
  .vue-flow__selection:focus,
  .vue-flow__selection:focus-visible {
    outline: none;
  }

.vue-flow__handle {
  width: 6px;
  height: 6px;
  background: var(--vf-handle);
  border: 1px solid #fff;
  border-radius: 100%;
}

/* ⚠️ EVERY VUE FLOW PLUGIN SHIPS ITS OWN STYLESHEET, AND ONLY CORE'S WAS HERE.

   `@vue-flow/node-resizer` was the one that mattered: its stylesheet is what
   gives a resize control `position: absolute` and a 5px handle. Without it the
   handles CnFlowNode renders have no size and no position, so a node that is
   resizable looks exactly like a node that is not — the component was mounted
   and the affordance was invisible.

   The minimap's own sheet is small (a background colour and the grab cursors);
   its geometry comes from `.vue-flow__panel` in core, which was already here.
   Imported for the cursors, and before our own rules so the theme below still
   wins. */
.vue-flow__resize-control {
  position: absolute;
}

.vue-flow__resize-control.left,
.vue-flow__resize-control.right {
  cursor: ew-resize;
}

.vue-flow__resize-control.top,
.vue-flow__resize-control.bottom {
  cursor: ns-resize;
}

.vue-flow__resize-control.top.left,
.vue-flow__resize-control.bottom.right {
  cursor: nwse-resize;
}

.vue-flow__resize-control.bottom.left,
.vue-flow__resize-control.top.right {
  cursor: nesw-resize;
}

/* handle styles */
.vue-flow__resize-control.handle {
  width: 5px;
  height: 5px;
  border: 1px solid #fff;
  border-radius: 1px;
  background-color: #3367d9;
  transform: translate(-50%, -50%);
}

.vue-flow__resize-control.handle.left {
  left: 0;
  top: 50%;
}
.vue-flow__resize-control.handle.right {
  left: 100%;
  top: 50%;
}
.vue-flow__resize-control.handle.top {
  left: 50%;
  top: 0;
}
.vue-flow__resize-control.handle.bottom {
  left: 50%;
  top: 100%;
}
.vue-flow__resize-control.handle.top.left {
  left: 0;
}
.vue-flow__resize-control.handle.bottom.left {
  left: 0;
}
.vue-flow__resize-control.handle.top.right {
  left: 100%;
}
.vue-flow__resize-control.handle.bottom.right {
  left: 100%;
}

/* line styles */
.vue-flow__resize-control.line {
  border-color: #3367d9;
  border-width: 0;
  border-style: solid;
}

.vue-flow__resize-control.line.left,
.vue-flow__resize-control.line.right {
  width: 1px;
  transform: translate(-50%, 0);
  top: 0;
  height: 100%;
}

.vue-flow__resize-control.line.left {
  left: 0;
  border-left-width: 1px;
}
.vue-flow__resize-control.line.right {
  left: 100%;
  border-right-width: 1px;
}

.vue-flow__resize-control.line.top,
.vue-flow__resize-control.line.bottom {
  height: 1px;
  transform: translate(0, -50%);
  left: 0;
  width: 100%;
}

.vue-flow__resize-control.line.top {
  top: 0;
  border-top-width: 1px;
}
.vue-flow__resize-control.line.bottom {
  border-bottom-width: 1px;
  top: 100%;
}
.vue-flow__minimap {
  background-color: #fff;
}

.vue-flow__minimap.pannable {
  cursor: grab;
}

.vue-flow__minimap.dragging {
  cursor: grabbing;
}

.vue-flow__minimap-mask.pannable {
  cursor: grab;
}
.cn-graph-canvas {
	position: relative;
	width: 100%;
	height: 100%;
	min-height: 320px;
}

/* ⚠️ VUE FLOW'S DEFAULT NODE DRAWS A BOX WE NEVER ASKED FOR.

   Every node this canvas renders goes through the `#node-default` slot, so
   Vue Flow wraps our CnFlowNode in `.vue-flow__node-default` — and
   `theme-default.css` gives that wrapper a 1px border, a white background and
   10px of padding. The result was a box around our box: the wrapper's border,
   then `.cn-flow-node`'s own. Nothing failed and nothing warned; a node just
   quietly had one more outline than it was designed to have.

   Stripped, not restyled: `.cn-flow-node` is the node's chrome, and it is the
   ONLY border a node draws. `width` stays 150px because Vue Flow measures the
   wrapper to route edges and place handles — dropping it would move every
   node's footprint, which is a layout change, not a fix for a stray border. */
.cn-graph-canvas .vue-flow__node-default {
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;

	/* The handle colour reaches `.cn-flow-node__handle` through this variable.
	   Vue Flow's own `.vue-flow__node-default .vue-flow__handle` rule outranks
	   our single-class one, so a themed handle lost to a hard-coded #1a192b on
	   every node — setting the variable themes it at the source instead of
	   fighting the specificity. */
	--vf-handle: var(--color-primary-element, #0082c9);
}

/* The selected/focus/hover states re-assert the border and shadow the rule
   above just removed, so they have to be stripped too — otherwise clicking a
   node brought the extra box back. Selection is shown by `.cn-flow-node--selected`,
   and focus by `.cn-flow-node:focus-visible`, both on the node itself. */
.cn-graph-canvas .vue-flow__node-default.selected,
.cn-graph-canvas .vue-flow__node-default.selected:hover,
.cn-graph-canvas .vue-flow__node-default.selectable:hover,
.cn-graph-canvas .vue-flow__node-default:focus,
.cn-graph-canvas .vue-flow__node-default:focus-visible {
	border: 0;
	box-shadow: none;
}

/* THEME, NOT OVERRIDE. Every colour comes from a Nextcloud variable with a
   fallback, so the canvas follows the user's theme — including dark — instead
   of being the one component that ignores it. */
.cn-graph-canvas .vue-flow__background {
	background: var(--color-main-background, #fff);
}
.cn-graph-canvas .vue-flow__edge-path {
	stroke: var(--color-border-dark, #888);
}
.cn-graph-canvas .vue-flow__edge.selected .vue-flow__edge-path {
	stroke: var(--color-primary-element, #0082c9);
}

/* An edge says which way the data flows, and it can only say it with an
   arrowhead — the direction is the one thing a line cannot express on its own.

   ⚠️ `!important` IS LOAD-BEARING HERE, not laziness. Vue Flow writes the
   arrowhead's colour as an INLINE style on the polyline it generates, and an
   inline style beats any class selector. The alternative is passing a colour
   through the marker definition in JS, which would hard-code a hex and take
   the arrowhead out of the theme — it would stay dark grey in dark mode while
   the line it terminates went light. Themed here, it follows the user.

   `markerUnits` defaults to `strokeWidth`, so the size set alongside this in
   `useFlowStore.canvasEdges` is what keeps the arrow clear of the target
   node's port handle. */
.cn-graph-canvas .vue-flow__arrowhead polyline,
.cn-graph-canvas .vue-flow__arrowhead path {
	fill: var(--color-text-maxcontrast, #6b6b6b) !important;
	stroke: var(--color-text-maxcontrast, #6b6b6b) !important;
}
.cn-graph-canvas__controls {
	position: absolute;
	bottom: 12px;
	left: 12px;
	display: flex;
	flex-direction: column;
	z-index: 5;
}
.cn-graph-canvas__control {
	width: 28px;
	height: 28px;
	border: 1px solid var(--color-border, #d0d0d0);
	background: var(--color-main-background, #fff);
	color: var(--color-main-text, #222);
	cursor: pointer;
}
.cn-graph-canvas__control:focus-visible {
	outline: 2px solid var(--color-primary-element, #0082c9);
	outline-offset: 1px;
}
.cn-graph-canvas .vue-flow__minimap {
	background: var(--color-background-dark, #ededed);
}


/*
	Pinned under the editor toolbar, on the same edge.

	The toolbar sits top inline-end and the canvas zoom controls sit bottom
	inline-start, so this edge is free. It also puts the messages beside the
	controls that cause most of them (Save / Run / Check) and directly under the
	sidebar header that carries Publish, so the three read as one band rather
	than as three unrelated panels.
*/
.cn-flow-canvas-messages[data-v-3fce24fc] {
	position: absolute;
	inset-block-start: 64px;
	inset-inline-end: 12px;
	z-index: 10;
	display: flex;
	flex-direction: column;
	gap: 8px;
	max-inline-size: 380px;
	/* 🔴 THE GAPS BELONG TO THE GRAPH. Without this the container's whole box
	   eats pan, node selection and drag-to-connect in a rectangle the user
	   cannot see, and nothing errors while it happens. */
	pointer-events: none;
}

/* Visually hidden, still in the accessibility tree. `display: none` and
   `visibility: hidden` both remove the node from that tree, which would make
   these regions announce nothing at all. */
.cn-flow-canvas-messages__live[data-v-3fce24fc] {
	position: absolute;
	inline-size: 1px;
	block-size: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}
.cn-flow-canvas-messages__list[data-v-3fce24fc] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.cn-flow-canvas-messages__item[data-v-3fce24fc] {
	/* The half of the pointer contract that gives it back. */
	pointer-events: auto;
	display: flex;
	flex-direction: row;
	align-items: flex-start;
	gap: 8px;
	padding: calc(2 * var(--default-grid-baseline, 4px));
	/* NcNoteCard's own severity tokens, so a canvas message and a sidebar note
	   card are plainly the same object, and both follow the theme.

	   🔑 THE TINT IS MIXED HERE RATHER THAN TAKEN AS-IS. NcNoteCard paints
	   `background-color: var(--color-warning)` and assumes that token is a pale
	   background — true on Nextcloud 30 and later, and NOT true of the token
	   sets several installed themes still ship, where `--color-warning` is a
	   saturated gold. Taking it literally put `--color-main-text` on #A37200 and
	   axe reported a SERIOUS color-contrast violation in both light and dark
	   (caught by `flow-ports-and-lines.e2e.js`, not by any unit test). Mixing a
	   little of the severity colour into the main background derives a pale tint
	   from any token set, in either theme, and keeps the body text legible. */
	border-inline-start: var(--default-grid-baseline, 4px) solid var(--note-theme);
	border-radius: var(--border-radius-small, 4px);
	background-color: var(--color-main-background);
	background-color: color-mix(in srgb, var(--note-theme) 12%, var(--color-main-background));
	color: var(--color-main-text);
	box-shadow: 0 2px 8px var(--color-box-shadow);
	animation: cn-flow-canvas-messages-in-3fce24fc 150ms ease-out;
}

/* An animation is a nice-to-have; motion sickness is not. */
@media (prefers-reduced-motion: reduce) {
.cn-flow-canvas-messages__item[data-v-3fce24fc] {
		animation: none;
}
}
@keyframes cn-flow-canvas-messages-in-3fce24fc {
from {
		opacity: 0;
		transform: translateY(-4px);
}
to {
		opacity: 1;
		transform: none;
}
}
.cn-flow-canvas-messages__item--error[data-v-3fce24fc] {
	--note-theme: var(--color-error-text);
}
.cn-flow-canvas-messages__item--warning[data-v-3fce24fc] {
	--note-theme: var(--color-warning-text);
}
.cn-flow-canvas-messages__item--info[data-v-3fce24fc] {
	--note-theme: var(--color-info-text);
}
.cn-flow-canvas-messages__item--success[data-v-3fce24fc] {
	--note-theme: var(--color-success-text);
}
.cn-flow-canvas-messages__icon[data-v-3fce24fc] {
	flex: 0 0 auto;
	color: var(--note-theme);
}
.cn-flow-canvas-messages__body[data-v-3fce24fc] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	min-inline-size: 0;
}
.cn-flow-canvas-messages__text[data-v-3fce24fc] {
	margin: 0;
	/* A node id or a cron line has no spaces and would otherwise push the card
	   wider than the canvas. */
	overflow-wrap: anywhere;
}

/* The severity word: read aloud, never drawn. The icon and the tint are what a
   sighted reader gets, and repeating the word beside them would be noise. */
.cn-flow-canvas-messages__severity[data-v-3fce24fc] {
	position: absolute;
	inline-size: 1px;
	block-size: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}
.cn-flow-canvas-messages__items[data-v-3fce24fc] {
	margin: 0;
	padding-inline-start: 20px;
	list-style: disc;
	font-size: 0.9em;
}
.cn-flow-canvas-messages__overflow[data-v-3fce24fc] {
	pointer-events: auto;
	align-self: flex-end;
	margin: 0;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}


.cn-flow-detail[data-v-65800ae2] {
	position: relative;
	block-size: 100%;
	inline-size: 100%;
	/* The dotted grid every flow tool draws: it says "canvas", and it makes
	   drag alignment visible without a snapping feature. */
	background-image: radial-gradient(var(--color-border) 1px, transparent 1px);
	background-size: 20px 20px;
}

/* The canvas paints an opaque main-background of its own, which sat exactly
   on top of the grid above. Cleared here, for flow editors only — other
   CnGraphCanvas consumers keep their solid ground. */
.cn-flow-detail[data-v-65800ae2] .cn-graph-canvas {
	background: transparent;
}
.cn-flow-detail__toolbar[data-v-65800ae2] {
	position: absolute;
	inset-block-start: 12px;
	inset-inline-end: 12px;
	z-index: 10;
	display: flex;
	gap: 4px;
	align-items: center;
	padding: 4px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	background: var(--color-main-background);
	box-shadow: 0 1px 4px var(--color-box-shadow);
}

/* The toolbar while a run is being opened: the spinner and its sentence sit
   where the editor's buttons were, so the strip keeps its height and the zoom
   controls do not jump sideways when the run arrives. */
.cn-flow-detail__toolbar-status[data-v-65800ae2] {
	display: flex;
	gap: 6px;
	align-items: center;
	padding-inline: 8px;
	color: var(--color-text-maxcontrast);
}
.cn-flow-detail__toolbar-group[data-v-65800ae2] {
	display: flex;
	align-items: center;
	margin-inline-start: 4px;
	padding-inline-start: 8px;
	border-inline-start: 1px solid var(--color-border);
}

/* ONE container, not a card in a card: the canvas wrapper draws the box —
   border, radius, background, selection — and this card only fills it. Its
   earlier own border/background rendered as a visible nested box.

   ⚠️ THE NO-BOX IS DECLARED, NOT LEFT OUT, AND IT IS SCOPED THROUGH THE PARENT
   ON PURPOSE. Removing the border by simply deleting the declaration looked
   like it worked here and did not work in a browser: several installed apps
   still bundle an OLDER build of this component, Vue's scoped hash for it is
   the same in both (`data-v-…` hashes the file, not its contents), and their
   stale `.cn-flow-detail__node` rule therefore lands in the same page. Nothing
   in the current build declared `border` at all, so the old declaration was
   the only one in the cascade and simply won — the nested box came back on a
   page whose own copy of the library was already fixed.

   So the rule states the absence, and `.cn-flow-detail` in front of it raises
   the specificity above any same-name copy, which makes this independent of
   which bundle a page happens to inject last. */
.cn-flow-detail .cn-flow-detail__node[data-v-65800ae2] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	justify-content: center;
	block-size: 100%;
	/* No padding at all: `.cn-flow-node` already pads the box, and the role
	   accent moved OFF this element onto the node's own border below — the 8px
	   left inset that used to clear it was the second half of the nested-box
	   effect, holding the body away from an edge it no longer meets. */
	padding: 0;
	border: 0;
	border-radius: inherit;
	background: none;
	overflow: hidden;

	/* ⚠️ THE ACCENT'S ABSENCE HAS TO BE DECLARED, NOT MERELY LEFT OUT — AND A
	   LIVE INSTANCE IS THE ONLY PLACE THAT SHOWS WHY.

	   Moving the role accent onto `.cn-flow-node` below meant deleting the
	   `box-shadow` from the three `--role-*` rules that used to sit on THIS
	   element. That is enough in this repository's own harness, where exactly
	   one build of this component exists.

	   It is not enough in a Nextcloud page. Measured on a live instance
	   (dossiq, /apps/dossiq/flows/…): THREE stale copies of
	   `.cn-flow-detail__node--role-trigger[data-v-65800ae2]` were injected by
	   other apps' bundles alongside the current one, all carrying the old inset
	   shadow. Vue's scoped hash is identical in every copy because it hashes the
	   FILE PATH, not the contents — so an older build's rule lands in the same
	   cascade under the same attribute, and with nothing in the current build
	   declaring `box-shadow` for this element the stale rule simply won. The
	   accent painted on the wrapper AND on the body, and the card-in-card came
	   back on a page whose own copy of the library was already fixed.

	   The e2e cannot catch this: its harness has one build, so
	   `getComputedStyle(body).boxShadow === 'none'` passes there either way.
	   Only this declaration holds it, and only because
	   `.cn-flow-detail .cn-flow-detail__node` (0,3,0) outranks the stale
	   `.cn-flow-detail__node--role-trigger` (0,2,0).

	   The `border: 0` above is the same defence, written for the same reason
	   when the nested BORDER came back the same way. */
	box-shadow: none;
}

/* Unknown step -> error border on the NODE WRAPPER, so the whole node reads as
   wrong rather than just its body.

   This targeted `.cn-graph-canvas__node` until the Vue Flow migration renamed
   the wrapper to `.cn-flow-node`, and nothing caught it: a CSS rule whose
   selector stops matching does not warn, it just silently stops painting. The
   class kept appearing in the shipped stylesheet and source maps, so it read
   as present while unknown nodes quietly lost their error border. */
.cn-flow-detail[data-v-65800ae2] .cn-flow-node:has(.cn-flow-detail__node--unknown) {
	border-color: var(--color-error);
}

/* Role accents, keyed on the CATALOGUE's role — never on graph position,
   which once painted unconnected steps green.

   ⚠️ ON THE NODE'S OWN BORDER, NOT ON THE BODY INSIDE IT. The accent used to be
   an inset shadow on `.cn-flow-detail__node`, which sits inside
   `.cn-flow-node`'s 2px border and 12px of padding — so the bar drew a second
   vertical edge a few pixels in from the first, and a node read as a card
   inside a card. Nothing had a border it should not have; the accent was simply
   painted on the wrong box.

   Still an inset box-shadow, per this repository's rule 8: `border-inline-start`
   would widen the node's left edge from 2px to 4px and shove every node's body
   sideways, which is a layout change rather than a fix for one. `:has()` is how
   a rule on the body reaches the wrapper — the same mechanism the unknown-step
   border below already uses. */
.cn-flow-detail[data-v-65800ae2] .cn-flow-node:has(.cn-flow-detail__node--role-trigger) {
	box-shadow: inset 4px 0 0 0 var(--color-success);
}
.cn-flow-detail[data-v-65800ae2] .cn-flow-node:has(.cn-flow-detail__node--role-step) {
	box-shadow: inset 4px 0 0 0 var(--color-primary-element);
}
.cn-flow-detail[data-v-65800ae2] .cn-flow-node:has(.cn-flow-detail__node--role-end) {
	box-shadow: inset 4px 0 0 0 var(--color-error);
}
.cn-flow-detail__node-type[data-v-65800ae2] {
	font-weight: 600;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-flow-detail__node-label[data-v-65800ae2],
.cn-flow-detail__node-warning[data-v-65800ae2] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-flow-detail__node-warning[data-v-65800ae2] {
	color: var(--color-error-text);
}
.cn-flow-detail__empty[data-v-65800ae2] {
	position: absolute;
	inset: 0;
	pointer-events: none;
}

/* ---- Run state on the nodes ------------------------------------------- */

/* The FlowMock visual grammar in Nextcloud tokens: `--color-success` for the
   halo/trace/done (FlowMock's mint), `--color-error` for failed (its
   vermillion), `--color-warning` for the hold. No `--c-*` marketing tokens —
   semantic variables are what keep nldesign theming working.

   ON THE NODE'S OUTLINE, NOT ITS BOX-SHADOW. The role accents above already
   own `box-shadow` on the same `.cn-flow-node:has(...)` element, and a second
   rule setting it would silently erase whichever loses the cascade. `outline`
   is a separate channel: run state and role accent paint together. It also
   costs no layout — an outline never moves the node's body. */
.cn-flow-detail[data-v-65800ae2] .cn-flow-node:has(.cn-flow-detail__node--run-done) {
	outline: 2px solid var(--color-success);
	outline-offset: 1px;
}
.cn-flow-detail[data-v-65800ae2] .cn-flow-node:has(.cn-flow-detail__node--run-active) {
	outline: 3px solid var(--color-success);
	outline-offset: 1px;
	animation: cn-flow-detail-run-halo-65800ae2 1.1s ease-in-out infinite;
}
.cn-flow-detail[data-v-65800ae2] .cn-flow-node:has(.cn-flow-detail__node--run-failed) {
	outline: 3px solid var(--color-error);
	outline-offset: 1px;
}

/* Visibly WAITING: dashed (a different shape from executing and from failed,
   so the states differ by more than hue) and pulsing slowly. */
.cn-flow-detail[data-v-65800ae2] .cn-flow-node:has(.cn-flow-detail__node--run-hold) {
	outline: 3px dashed var(--color-warning);
	outline-offset: 1px;
	animation: cn-flow-detail-run-hold-65800ae2 2.4s ease-in-out infinite;
}

/* The halo: the outline breathes outwards and fades — a pulse with no layout
   cost, on the wrapper the role accents already reach through `:has()`. */
@keyframes cn-flow-detail-run-halo-65800ae2 {
0%,
	100% {
		outline-offset: 1px;
		outline-color: var(--color-success);
}
50% {
		outline-offset: 7px;
		outline-color: transparent;
}
}
@keyframes cn-flow-detail-run-hold-65800ae2 {
0%,
	100% {
		outline-color: var(--color-warning);
}
50% {
		outline-color: transparent;
}
}

/* The state in words — never colour alone (WCAG 1.4.1). */
.cn-flow-detail__node-run[data-v-65800ae2] {
	font-size: 0.75em;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	color: var(--color-success-text, var(--color-success));
}
.cn-flow-detail__node-run--failed[data-v-65800ae2] {
	color: var(--color-error-text, var(--color-error));
}
.cn-flow-detail__node-run--hold[data-v-65800ae2] {
	color: var(--color-warning-text, var(--color-warning));
}

/* ---- Run state on the edges ------------------------------------------- */

/* Lines already walked keep a quiet success stroke for the rest of the run. */
.cn-flow-detail[data-v-65800ae2] .vue-flow__edge.cn-flow-detail__edge--run-traced .vue-flow__edge-path,
.cn-flow-detail[data-v-65800ae2] .vue-flow__edge.cn-flow-detail__edge--run-tracing .vue-flow__edge-path {
	stroke: var(--color-success);
}

/* The trace: a success-coloured segment travelling the edge just executed,
   source to target — `stroke-dashoffset` walking a dash pattern forwards,
   FlowMock's own technique.

   IT RIDES THE EDGE'S SECOND PATH, NOT THE LINE ITSELF. CnFlowEdge already
   draws a direction pulse as a separate path over the same routed geometry,
   exactly so the base line can stay solid (a dashed connection means
   something else in every diagram convention). The trace re-styles that path
   for the hop being animated: denser, thicker, faster, and in the success
   colour. When the hop ends the class leaves and the pulse returns to its
   quiet self. */
.cn-flow-detail[data-v-65800ae2] .vue-flow__edge.cn-flow-detail__edge--run-tracing .cn-flow-edge__pulse {
	stroke: var(--color-success);
	stroke-width: 4;
	stroke-dasharray: 10 22;
	animation: cn-flow-detail-run-trace-65800ae2 0.4s linear infinite;
}
@keyframes cn-flow-detail-run-trace-65800ae2 {
from {
		stroke-dashoffset: 32;
}
to {
		stroke-dashoffset: 0;
}
}

/* Reduced motion: the state COLOURS stay — done, failed, hold and current
   remain distinguishable — but nothing travels and nothing pulses. The
   sequential hop reveal is also skipped on the JS side (`runHopMs`), and
   CnFlowEdge already hides its pulse path entirely under this query, which
   takes the trace's travel with it. */
@media (prefers-reduced-motion: reduce) {
.cn-flow-detail[data-v-65800ae2] .cn-flow-node:has(.cn-flow-detail__node--run-active),
	.cn-flow-detail[data-v-65800ae2] .cn-flow-node:has(.cn-flow-detail__node--run-hold) {
		animation: none;
}
}


.cn-flow-publish[data-v-5288cd9e] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 8px 0;
}
.cn-flow-publish__headline[data-v-5288cd9e] {
	margin: 0;
	font-weight: bold;
}
.cn-flow-publish__verdict[data-v-5288cd9e] {
	margin: 0;
}
.cn-flow-publish__verdict--major[data-v-5288cd9e] {
	color: var(--color-warning-text, var(--color-warning));
}
.cn-flow-publish__removals[data-v-5288cd9e] {
	margin: 0;
	padding-left: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-flow-publish__removal-kind[data-v-5288cd9e] {
	display: inline-block;
	min-width: 90px;
	color: var(--color-text-maxcontrast);
}
.cn-flow-publish__removal-name[data-v-5288cd9e] {
	font-family: var(--font-face-monospace, monospace);
}
.cn-flow-publish__note[data-v-5288cd9e] {
	margin: 0;
	color: var(--color-text-maxcontrast);
}
.cn-flow-publish__refusal[data-v-5288cd9e] {
	margin: 0;
	color: var(--color-error-text, var(--color-error));
}


.cn-flow-settings[data-v-33c9f678] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 8px 0;
}
.cn-flow-settings__note[data-v-33c9f678] {
	margin: 0;
	color: var(--color-text-maxcontrast);
}


.cn-flow-health[data-v-d8c13102] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	inline-size: 1.1em;
	block-size: 1.1em;
	flex: 0 0 auto;
	font-size: 0.9em;
	line-height: 1;
}
.cn-flow-health--disabled[data-v-d8c13102] { color: var(--color-text-maxcontrast);
}
.cn-flow-health--error[data-v-d8c13102] { color: var(--color-error);
}
.cn-flow-health--warning[data-v-d8c13102] { color: var(--color-warning);
}
.cn-flow-health--success[data-v-d8c13102] { color: var(--color-success);
}
.cn-flow-health--info[data-v-d8c13102] { color: var(--color-primary-element);
}


.cn-flow-lifecycle[data-v-7452e6f2] {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	margin: 0;
	font-size: 1.25em;
}

/* The name may be long and the pills must stay with it rather than wrap alone,
   so the name is the only part allowed to shrink. */
.cn-flow-lifecycle__name[data-v-7452e6f2] {
	min-inline-size: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-flow-lifecycle__pill[data-v-7452e6f2] {
	border-radius: var(--border-radius-pill, 100px);
	padding: 2px 10px;
	font-size: 0.85em;
	/* Tokens, never literals: a pill has to stay legible in the dark theme and
	   under the high-contrast accessibility setting, and a hardcoded pair
	   fails both. */
	background-color: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
}
.cn-flow-lifecycle__pill--version[data-v-7452e6f2] {
	font-weight: bold;
	color: var(--color-main-text);
	/* Tabular figures so v9 and v10 do not shift the badge beside them. */
	font-variant-numeric: tabular-nums;
}
.cn-flow-lifecycle__pill--published[data-v-7452e6f2] {
	background-color: var(--color-success, var(--color-primary-element));
	color: var(--color-primary-element-text, var(--color-main-background));
}
.cn-flow-lifecycle__pill--deprecated[data-v-7452e6f2] {
	background-color: var(--color-warning, var(--color-background-dark));
	color: var(--color-main-text);
}


.cn-run-sidebar[data-v-48e781f0] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 12px;
}
.cn-run-sidebar__head[data-v-48e781f0] {
	display: flex;
}
.cn-run-sidebar__title[data-v-48e781f0] {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0;
}
.cn-run-sidebar__when[data-v-48e781f0] {
	color: var(--color-text-maxcontrast);
	font-weight: normal;
	font-size: 0.9em;
	font-variant-numeric: tabular-nums;
}
.cn-run-sidebar__error[data-v-48e781f0] {
	color: var(--color-error-text, var(--color-error));
}
.cn-run-sidebar__hint[data-v-48e781f0] {
	color: var(--color-text-maxcontrast);
}
.cn-run-sidebar__group[data-v-48e781f0] {
	margin: 8px 0 0;
	color: var(--color-text-maxcontrast);
	font-weight: bold;
}
.cn-run-sidebar__tabs[data-v-48e781f0] {
	display: flex;
	gap: 4px;
	border-block-end: 1px solid var(--color-border);
}
.cn-run-sidebar__tab[data-v-48e781f0] {
	border: none;
	background: none;
	padding: 8px 12px;
	cursor: pointer;
	color: var(--color-main-text);
	border-block-end: 2px solid transparent;
}
.cn-run-sidebar__tab--active[data-v-48e781f0] {
	border-block-end-color: var(--color-primary-element);
	font-weight: bold;
}
.cn-run-sidebar__list[data-v-48e781f0],
.cn-run-sidebar__touched[data-v-48e781f0],
.cn-run-sidebar__steps[data-v-48e781f0] {
	margin: 0;
	padding-inline-start: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-run-sidebar__steps[data-v-48e781f0] {
	list-style: decimal;
	padding-inline-start: 20px;
}
.cn-run-sidebar__row[data-v-48e781f0] {
	display: flex;
	gap: 8px;
	align-items: center;
	color: inherit;
	padding: 6px 8px;
	border-radius: var(--border-radius-large, 12px);
	background: var(--color-background-hover);
}
.cn-run-sidebar__touched-uuid[data-v-48e781f0] {
	font-family: monospace;
	font-size: 0.9em;
}

/* A uuid is long and the sidebar is narrow, so a row wraps rather than
   pushing the panel wider. The gap keeps the parts apart on the line the
   separators already keep apart in the text. */
.cn-run-sidebar__touched li[data-v-48e781f0] {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0 4px;
}


.cn-flow-sidebar--embedded[data-v-3f15f48e] {
	display: flex;
	flex-direction: column;
	gap: 20px;
	padding: 8px 12px;
}
.cn-flow-sidebar__hint[data-v-3f15f48e] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	margin: 0 0 8px;
}
.cn-flow-sidebar__section[data-v-3f15f48e] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 8px 0;
}

/* Version, status and Publish, in the header rather than in a tab. Below the
   flow's name in NcAppSidebar's `description` slot, and above the tab strip in
   the embedded variant, so both hosts read the same way. */
.cn-flow-sidebar__header[data-v-3f15f48e] {
	padding-block-end: 8px;
}
.cn-flow-sidebar__tabs[data-v-3f15f48e] {
	display: flex;
	gap: 4px;
	border-block-end: 1px solid var(--color-border);
}
.cn-flow-sidebar__tab[data-v-3f15f48e] {
	flex: 1 1 0;
	padding: 8px 4px;
	border: none;
	border-block-end: 2px solid transparent;
	background: none;
	color: var(--color-text-maxcontrast);
	font-weight: 600;
	cursor: pointer;
}
.cn-flow-sidebar__tab[data-v-3f15f48e]:hover {
	background: var(--color-background-hover);
}
.cn-flow-sidebar__tab--active[data-v-3f15f48e] {
	color: var(--color-main-text);
	border-block-end-color: var(--color-primary-element);
}
.cn-flow-sidebar__palette[data-v-3f15f48e] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-flow-sidebar__palette-item[data-v-3f15f48e] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding: 6px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: grab;
}
.cn-flow-sidebar__palette-item[data-v-3f15f48e]:hover {
	background: var(--color-background-hover);
}
.cn-flow-sidebar__palette-head[data-v-3f15f48e] {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 8px;
}
.cn-flow-sidebar__palette-name[data-v-3f15f48e] {
	font-weight: 600;
}
.cn-flow-sidebar__palette-role[data-v-3f15f48e] {
	font-size: 0.75em;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--color-text-maxcontrast);
}
.cn-flow-sidebar__palette-role--trigger[data-v-3f15f48e] {
	color: var(--color-success-text);
}
.cn-flow-sidebar__palette-role--end[data-v-3f15f48e] {
	color: var(--color-error-text);
}
.cn-flow-sidebar__palette-description[data-v-3f15f48e] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}
.cn-flow-sidebar__palette-id[data-v-3f15f48e],
.cn-flow-sidebar__hint[data-v-3f15f48e] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-flow-sidebar__error[data-v-3f15f48e] {
	color: var(--color-error-text);
}

/* THE RUNS LIST IS A STACK OF CARDS. */
.cn-flow-sidebar__runs[data-v-3f15f48e] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
}

/* A CARD, NOT A ROW. A run is a thing with a verdict, a time and sometimes a
   reason it failed, and a single flex row could only ever show the first two
   before the third pushed the date off the edge. The card gives the error its
   own line and the run a hit area big enough to be a target, not a text link. */
.cn-flow-sidebar__run[data-v-3f15f48e] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	inline-size: 100%;
	padding: 10px 12px;
	border: 2px solid transparent;
	border-radius: var(--border-radius-large, 12px);
	background: var(--color-background-hover);
	text-align: start;
	cursor: pointer;
	color: inherit;
}
.cn-flow-sidebar__run-top[data-v-3f15f48e] {
	display: flex;
	align-items: center;
	gap: 8px;
	justify-content: space-between;
}
.cn-flow-sidebar__run-when[data-v-3f15f48e] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	font-variant-numeric: tabular-nums;
}

/* The failure's own words, clamped: a stack trace in a sidebar card pushes
   every other run off the screen, and the card is an index, not the log. */
.cn-flow-sidebar__run-error[data-v-3f15f48e] {
	color: var(--color-error-text, var(--color-error));
	font-size: 0.9em;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

/* WHICH RUN IS OPEN, stated by more than a background: a border survives
   forced-colors mode, where a background tint does not. */
.cn-flow-sidebar__run--open[data-v-3f15f48e] {
	border-color: var(--color-primary-element);
}
.cn-flow-sidebar__run[data-v-3f15f48e]:hover {
	background: var(--color-background-hover);
}
.cn-flow-sidebar__status--failed[data-v-3f15f48e] {
	color: var(--color-error-text);
}
.cn-flow-sidebar__status--completed[data-v-3f15f48e] {
	color: var(--color-success-text);
}

/* The objects a step touched, indented under it. Muted and monospaced: this is
   reference detail somebody scans for one uuid, not prose. */
.cn-flow-sidebar__touched[data-v-3f15f48e] {
	margin: 2px 0 6px 0;
	padding-inline-start: 14px;
	list-style: none;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-flow-sidebar__touched li[data-v-3f15f48e] {
	display: flex;
	gap: 6px;
	align-items: baseline;
}
.cn-flow-sidebar__touched-action[data-v-3f15f48e] {
	flex: 0 0 auto;
	color: var(--color-main-text);
}

/* Breaks anywhere: a uuid has no spaces and would otherwise push the sidebar
   wider than its column. */
.cn-flow-sidebar__touched-uuid[data-v-3f15f48e] {
	font-family: var(--font-face-monospace, monospace);
	overflow-wrap: anywhere;
}
.cn-flow-sidebar__touched-extra[data-v-3f15f48e] {
	margin-block-start: 8px;
}


.cn-flow-modal[data-v-72417086] {
	display: flex;
	gap: 0;
	block-size: 100%;
	min-block-size: 60vh;
}
.cn-flow-modal__canvas[data-v-72417086] {
	flex: 1 1 auto;
	min-inline-size: 0;
}
.cn-flow-modal__side[data-v-72417086] {
	flex: 0 0 340px;
	max-inline-size: 340px;
	overflow-y: auto;
	border-inline-start: 1px solid var(--color-border);
}
@media (max-width: 900px) {
.cn-flow-modal[data-v-72417086] {
		flex-direction: column;
}
.cn-flow-modal__side[data-v-72417086] {
		flex: 1 1 auto;
		max-inline-size: none;
		border-inline-start: none;
		border-block-start: 1px solid var(--color-border);
}
}


.cn-buildiq-edit[data-v-2dbff71f] {
	display: inline-flex;
}

/* Conduction-orange accent on the trigger (ADR-041 brand exception). Targets the
   NcActions trigger button — `.button-vue` in current @nextcloud/vue (icon-only
   mode renders no `.action-item__menutoggle`), with the legacy class kept too.
   `!important` beats the `button-vue--tertiary` transparent default. */
.cn-buildiq-edit__actions[data-v-2dbff71f] .button-vue,
.cn-buildiq-edit__actions[data-v-2dbff71f] .action-item__menutoggle {
	background-color: var(--c-orange-knvb, #f36c21) !important;
	color: #fff !important;
	border-radius: var(--border-radius-element, var(--border-radius-large, 8px));
}

/* Center the glyph in the icon-only trigger (button-vue__icon is display:block
   by default, which left-aligns the 20×20 svg). */
.cn-buildiq-edit__actions[data-v-2dbff71f] .button-vue__wrapper {
	justify-content: center;
}
.cn-buildiq-edit__actions[data-v-2dbff71f] .button-vue__icon {
	display: flex !important;
	align-items: center;
	justify-content: center;
	color: #fff;
}
.cn-buildiq-edit__glyph[data-v-2dbff71f] {
	color: #fff;
	display: block;
	margin: auto;
}


.cn-advanced-form-dialog__json-editor[data-v-733de04c] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-advanced-form-dialog__codemirror-container[data-v-733de04c] {
	margin-top: 6px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	position: relative;
}
.cn-advanced-form-dialog__codemirror-container[data-v-733de04c] .cm-editor {
	height: 100%;
	outline: none !important;
}
.cn-advanced-form-dialog__codemirror-container[data-v-733de04c] .cm-scroller {
	overflow: auto;
}
.cn-advanced-form-dialog__codemirror-container[data-v-733de04c] .cm-content {
	border-radius: 0 !important;
	border: none !important;
}
.cn-advanced-form-dialog__codemirror-container--light > .vue-codemirror[data-v-733de04c] {
	border: 1px dotted silver;
}
.cn-advanced-form-dialog__codemirror-container--dark > .vue-codemirror[data-v-733de04c] {
	border: 1px dotted grey;
}

/* value text color */
/* string */
.cn-advanced-form-dialog__codemirror-container--light[data-v-733de04c] .ͼe {
	color: #448c27;
}
.cn-advanced-form-dialog__codemirror-container--dark[data-v-733de04c] .ͼe {
	color: #88c379;
}

/* boolean */
.cn-advanced-form-dialog__codemirror-container--light[data-v-733de04c] .ͼc {
	color: #221199;
}
.cn-advanced-form-dialog__codemirror-container--dark[data-v-733de04c] .ͼc {
	color: #8d64f7;
}

/* null */
.cn-advanced-form-dialog__codemirror-container--light[data-v-733de04c] .ͼb {
	color: #770088;
}
.cn-advanced-form-dialog__codemirror-container--dark[data-v-733de04c] .ͼb {
	color: #be55cd;
}

/* number */
.cn-advanced-form-dialog__codemirror-container--light[data-v-733de04c] .ͼd {
	color: #d19a66;
}
.cn-advanced-form-dialog__codemirror-container--dark[data-v-733de04c] .ͼd {
	color: #9d6c3a;
}

/* text cursor */
.cn-advanced-form-dialog__codemirror-container[data-v-733de04c] .cm-content * {
	cursor: text !important;
}

/* selection color */
.cn-advanced-form-dialog__codemirror-container--light[data-v-733de04c] .cm-line::selection,
.cn-advanced-form-dialog__codemirror-container--light[data-v-733de04c] .cm-line ::selection {
	background-color: #d7eaff !important;
	color: black;
}
.cn-advanced-form-dialog__codemirror-container--dark[data-v-733de04c] .cm-line::selection,
.cn-advanced-form-dialog__codemirror-container--dark[data-v-733de04c] .cm-line ::selection {
	background-color: #8fb3e6 !important;
	color: black;
}

/* string selection */
.cn-advanced-form-dialog__codemirror-container--light[data-v-733de04c] .cm-line .ͼe::selection {
	color: #2d770f;
}
.cn-advanced-form-dialog__codemirror-container--dark[data-v-733de04c] .cm-line .ͼe::selection {
	color: #104e0c;
}

/* boolean selection */
.cn-advanced-form-dialog__codemirror-container--light[data-v-733de04c] .cm-line .ͼc::selection {
	color: #221199;
}
.cn-advanced-form-dialog__codemirror-container--dark[data-v-733de04c] .cm-line .ͼc::selection {
	color: #4026af;
}

/* null selection */
.cn-advanced-form-dialog__codemirror-container--light[data-v-733de04c] .cm-line .ͼb::selection {
	color: #770088;
}
.cn-advanced-form-dialog__codemirror-container--dark[data-v-733de04c] .cm-line .ͼb::selection {
	color: #770088;
}

/* number selection */
.cn-advanced-form-dialog__codemirror-container--light[data-v-733de04c] .cm-line .ͼd::selection {
	color: #8c5c2c;
}
.cn-advanced-form-dialog__codemirror-container--dark[data-v-733de04c] .cm-line .ͼd::selection {
	color: #623907;
}
.cn-advanced-form-dialog__format-btn[data-v-733de04c] {
	margin-top: 8px;
}
.cn-advanced-form-dialog__json-error[data-v-733de04c] {
	color: var(--color-error);
	font-size: 14px;
}


.cn-advanced-form-dialog__table-container[data-v-fcc3fd96] {
	background: var(--color-main-background);
	border-radius: var(--border-radius);
	overflow: hidden;
	box-shadow: 0 2px 4px var(--color-box-shadow);
	border: 1px solid var(--color-border);
	margin-bottom: calc(5 * var(--default-grid-baseline));
}
.cn-advanced-form-dialog__table[data-v-fcc3fd96] {
	width: 100%;
	border-collapse: collapse;
	background-color: var(--color-main-background);
}
.cn-advanced-form-dialog__table th[data-v-fcc3fd96],
.cn-advanced-form-dialog__table td[data-v-fcc3fd96] {
	padding: calc(3 * var(--default-grid-baseline));
	text-align: left;
	border-bottom: 1px solid var(--color-border);
	vertical-align: middle;
}
.cn-advanced-form-dialog__table th[data-v-fcc3fd96] {
	background: var(--color-background-dark);
	font-weight: 500;
	color: var(--color-text-maxcontrast);
}
.cn-advanced-form-dialog__table-row[data-v-fcc3fd96] {
	cursor: default;
	background-color: var(--color-main-background);
}
.cn-advanced-form-dialog__table-col-constrained[data-v-fcc3fd96] {
	width: 150px;
	max-width: 150px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-advanced-form-dialog__table-col-expanded[data-v-fcc3fd96] {
	width: auto;
	min-width: 200px;
}


.cn-advanced-form-dialog__value-input-container[data-v-1884662d] {
	width: 100%;
	min-width: 0;
}
.cn-advanced-form-dialog__value-input-container[data-v-1884662d] .text-field {
	margin: 0;
	padding: 0;
}
.cn-advanced-form-dialog__boolean-input-row[data-v-1884662d] {
	display: flex;
	align-items: center;
	gap: 6px;
}
.cn-advanced-form-dialog__array-input-row[data-v-1884662d] {
	display: flex;
	align-items: center;
	gap: 6px;
}
.cn-advanced-form-dialog__array-input-row[data-v-1884662d] > :first-child {
	flex: 1;
}

/* patch extreme size in field */
.cn-advanced-form-dialog__boolean-input-row__input > span[data-v-1884662d] {
	padding-left: 0;
	padding-block: 0;
}
.cn-advanced-form-dialog__boolean-input-row__input > input[data-v-1884662d] {
	margin: 0;
}
.cn-advanced-form-dialog__info-icon[data-v-1884662d] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
	cursor: help;
}
.cn-advanced-form-dialog__json-value[data-v-1884662d] {
	max-height: 200px;
	overflow-y: auto;
	white-space: pre-wrap;
	font-family: monospace;
	font-size: 12px;
	background: var(--color-background-dark);
	padding: 8px;
	border-radius: 4px;
	margin: 0;
}

/* Textarea: keep it inside the table cell instead of overflowing.
   NcTextArea's wrapper has a fixed height (`calc(var(--default-clickable-area) * 2)`)
   that ignores the `rows` attribute, which causes the textarea to render with a
   too-small viewport. Let the wrapper grow with its content instead. */
.cn-advanced-form-dialog__textarea[data-v-1884662d] {
	width: 100%;
	box-sizing: border-box;
}
.cn-advanced-form-dialog__textarea[data-v-1884662d] .textarea__main-wrapper {
	height: auto;
	min-height: var(--default-clickable-area);
}
.cn-advanced-form-dialog__textarea[data-v-1884662d] textarea {
	width: 100%;
	max-width: 100%;
	box-sizing: border-box;
	resize: vertical;
	min-height: 80px;
	max-height: 240px;
	display: block;
}

/* Color widget: clickable swatch (native picker) + visible text input */
.cn-advanced-form-dialog__color-input-row[data-v-1884662d] {
	display: flex;
	align-items: center;
	gap: 8px;
	width: 100%;
}
.cn-advanced-form-dialog__color-input-row[data-v-1884662d] > :last-child {
	flex: 1;
	min-width: 0;
}
.cn-advanced-form-dialog__color-swatch[data-v-1884662d] {
	--cn-color-swatch-checker:
		linear-gradient(45deg, var(--color-background-dark) 25%, transparent 25%),
		linear-gradient(-45deg, var(--color-background-dark) 25%, transparent 25%),
		linear-gradient(45deg, transparent 75%, var(--color-background-dark) 75%),
		linear-gradient(-45deg, transparent 75%, var(--color-background-dark) 75%);
	display: inline-block;
	width: 32px;
	height: 32px;
	flex-shrink: 0;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background-image: var(--cn-color-swatch-checker);
	background-size: 8px 8px;
	background-position: 0 0, 0 4px, 4px -4px, -4px 0;
	overflow: hidden;
	position: relative;
}
.cn-advanced-form-dialog__color-swatch[data-v-1884662d]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}
.cn-advanced-form-dialog__color-swatch--readonly[data-v-1884662d] {
	cursor: default;
	width: 20px;
	height: 20px;
	vertical-align: middle;
	margin-inline-end: 6px;
}
.cn-advanced-form-dialog__color-display[data-v-1884662d] {
	display: inline-flex;
	align-items: center;
}

/* Help text & inline validation under the input */
.cn-advanced-form-dialog__field-help[data-v-1884662d] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	margin-top: 4px;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-advanced-form-dialog__field-example[data-v-1884662d] {
	font-style: italic;
}
.cn-advanced-form-dialog__field-error[data-v-1884662d] {
	margin-top: 4px;
	font-size: 0.85em;
	color: var(--color-error-text);
}
.cn-advanced-form-dialog__value-cell-wrapper[data-v-1884662d] {
	display: flex;
	flex-direction: column;
	width: 100%;
}

/* Object-array widget: chip list + add button */
.cn-advanced-form-dialog__object-array[data-v-1884662d] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	width: 100%;
}
.cn-advanced-form-dialog__object-array-chips[data-v-1884662d] {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
}
.cn-advanced-form-dialog__object-array-chip[data-v-1884662d] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	padding: 2px 4px 2px 10px;
	background: var(--color-background-dark);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-pill, 14px);
	color: var(--color-main-text);
	cursor: pointer;
	font: inherit;
	max-width: 240px;
}
.cn-advanced-form-dialog__object-array-chip[data-v-1884662d]:hover {
	background: var(--color-background-hover);
}
.cn-advanced-form-dialog__object-array-chip-label[data-v-1884662d] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-advanced-form-dialog__object-array-chip-remove[data-v-1884662d] {
	flex-shrink: 0;
}
.cn-advanced-form-dialog__object-array-add[data-v-1884662d] {
	align-self: flex-start;
}


.cn-advanced-form-dialog__table-container[data-v-1e6f50f1] {
	background: var(--color-main-background);
	border-radius: var(--border-radius);
	box-shadow: 0 2px 4px var(--color-box-shadow);
	border: 1px solid var(--color-border);
	margin-bottom: calc(5 * var(--default-grid-baseline));
}
.cn-advanced-form-dialog__table[data-v-1e6f50f1] {
	width: 100%;
	border-collapse: collapse;
	background-color: var(--color-main-background);
}
.cn-advanced-form-dialog__table th[data-v-1e6f50f1],
.cn-advanced-form-dialog__table td[data-v-1e6f50f1] {
	padding: calc(3 * var(--default-grid-baseline));
	text-align: left;
	border-bottom: 1px solid var(--color-border);
	vertical-align: middle;
}

/* Selected (editing) row: align the constrained label cell to the top of the
   value cell so tall inputs (textarea, JSON editor) do not visually overflow
   into the next row. */
.cn-advanced-form-dialog__table-row--selected td[data-v-1e6f50f1] {
	vertical-align: top;
}
.cn-advanced-form-dialog__table th[data-v-1e6f50f1] {
	background: var(--color-background-dark);
	font-weight: 500;
	color: var(--color-text-maxcontrast);
}
.cn-advanced-form-dialog__table-row[data-v-1e6f50f1] {
	cursor: pointer;
	transition: background-color 0.2s ease;
	background-color: var(--color-main-background);
}
.cn-advanced-form-dialog__table-row[data-v-1e6f50f1]:hover {
	background-color: var(--color-background-hover);
}

/* Active/selected row: light blue; ensure it wins over validation state classes */
.cn-advanced-form-dialog__table-row.cn-advanced-form-dialog__table-row--selected[data-v-1e6f50f1],
.cn-advanced-form-dialog__table-row--selected[data-v-1e6f50f1]:hover {
	background-color: var(--color-primary-light);
	box-shadow: inset 3px 0 0 0 var(--color-primary);
}
.cn-advanced-form-dialog__table-row--non-editable[data-v-1e6f50f1] {
	background-color: var(--color-background-dark);
	cursor: not-allowed;
	opacity: 0.7;
}
.cn-advanced-form-dialog__table-row--non-editable[data-v-1e6f50f1] * {
	cursor: not-allowed !important;
}
.cn-advanced-form-dialog__table-row--invalid[data-v-1e6f50f1] {
	background-color: var(--color-error-light);
}
.cn-advanced-form-dialog__table-row--warning[data-v-1e6f50f1] {
	background-color: var(--color-warning-light);
}
.cn-advanced-form-dialog__table-col-constrained[data-v-1e6f50f1] {
	width: 150px;
	max-width: 150px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-advanced-form-dialog__table-col-expanded[data-v-1e6f50f1] {
	width: auto;
	min-width: 200px;
}
.cn-advanced-form-dialog__table-col-actions[data-v-1e6f50f1] {
	width: 56px;
	text-align: right;
	white-space: nowrap;
}
.cn-advanced-form-dialog__prop-cell[data-v-1e6f50f1] {
	width: 30%;
	font-weight: 600;
}
.cn-advanced-form-dialog__value-cell[data-v-1e6f50f1] {
	width: 70%;
	overflow-wrap: anywhere;
	border-radius: 4px;
}
.cn-advanced-form-dialog__value-cell[data-v-1e6f50f1] > * {
	max-width: 100%;
}
.cn-advanced-form-dialog__prop-cell-content[data-v-1e6f50f1] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-advanced-form-dialog__validation-icon[data-v-1e6f50f1] {
	flex-shrink: 0;
}
.cn-advanced-form-dialog__validation-icon--error[data-v-1e6f50f1] {
	color: var(--color-error);
}
.cn-advanced-form-dialog__validation-icon--edited[data-v-1e6f50f1] {
	color: var(--color-primary-element);
}
.cn-advanced-form-dialog__validation-icon--warning[data-v-1e6f50f1] {
	color: var(--color-warning);
}
.cn-advanced-form-dialog__validation-icon--lock[data-v-1e6f50f1] {
	color: var(--color-text-lighter);
}
.cn-advanced-form-dialog__validation-icon--new[data-v-1e6f50f1] {
	color: var(--color-new);
}
.cn-advanced-form-dialog__required-indicator[data-v-1e6f50f1] {
	color: var(--color-error-text);
	font-weight: bold;
	cursor: help;
}
.cn-advanced-form-dialog__immutable-badge[data-v-1e6f50f1] {
	display: inline-block;
	padding: 1px 6px;
	border-radius: 10px;
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
	font-size: 0.75em;
	font-weight: 500;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	cursor: help;
	white-space: nowrap;
}
.cn-advanced-form-dialog__unsaved-note[data-v-1e6f50f1] {
	margin-bottom: calc(3 * var(--default-grid-baseline));
}


.cn-advanced-form-dialog__form[data-v-aef2a622] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-advanced-form-dialog__tabs[data-v-aef2a622] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}

/* Bootstrap-Vue tab styling to match ViewObject */
.tabContainer[data-v-aef2a622] {
	margin-top: 20px;
}
.tabContainer > * ul > li[data-v-aef2a622] {
  display: flex;
  flex: 1;
}
.tabContainer > * ul > li[data-v-aef2a622]:hover {
  background-color: var(--color-background-hover);
}
.tabContainer > * ul > li > a[data-v-aef2a622] {
  flex: 1;
  text-align: center;
}
.tabContainer > * ul > li > .active[data-v-aef2a622] {
  background: transparent !important;
  color: var(--color-main-text) !important;
  border-bottom: var(--default-grid-baseline) solid var(--color-primary-element) !important;
}
.tabContainer > * ul[role="tablist"][data-v-aef2a622] {
  display: flex;
  margin: 10px 8px 0 8px;
  justify-content: space-between;
  border-bottom: 1px solid var(--color-border);
}
.tabContainer > * ul[role="tablist"] > * a[role="tab"][data-v-aef2a622] {
  padding-inline-start: 10px;
  padding-inline-end: 10px;
  padding-block-start: 10px;
  padding-block-end: 10px;
}
.tabContainer > * div[role="tabpanel"][data-v-aef2a622] {
  margin-block-start: var(--OR-margin-10);
}
[data-v-aef2a622] .nav-tabs {
	border-bottom: 1px solid var(--color-border);
	margin-bottom: 15px;
	display: flex;
}
[data-v-aef2a622] .nav-tabs .nav-item {
	display: flex;
	flex: 1;
}
[data-v-aef2a622] .nav-tabs .nav-link {
	flex: 1;
	text-align: center;
	border: none;
	border-bottom: 2px solid transparent;
	color: var(--color-text-maxcontrast);
	padding: 8px 16px;
}
[data-v-aef2a622] .nav-tabs .nav-link.active {
	color: var(--color-main-text);
	border-bottom: 2px solid var(--color-primary);
	background-color: transparent;
}
[data-v-aef2a622] .nav-tabs .nav-link:hover {
	border-bottom: 2px solid var(--color-border);
}
[data-v-aef2a622] .tab-content {
	padding: 16px;
	background-color: var(--color-main-background);
}

/* Hand-rolled tab nav — replaces bootstrap-vue's BTabs/BTab. */
.cn-advanced-form-dialog__tab-nav[data-v-aef2a622] {
	display: flex;
	gap: 0;
	list-style: none;
	padding: 0;
	margin: 0 0 16px;
	border-bottom: 1px solid var(--color-border);
}
.cn-advanced-form-dialog__tab-nav-item[data-v-aef2a622] {
	flex: 1 1 0;
}
.cn-advanced-form-dialog__tab-button[data-v-aef2a622] {
	width: 100%;
	padding: 10px 14px;
	background: transparent;
	border: 0;
	border-bottom: 2px solid transparent;
	color: var(--color-text-maxcontrast);
	font: inherit;
	cursor: pointer;
}
.cn-advanced-form-dialog__tab-button[data-v-aef2a622]:hover:not(:disabled) {
	border-bottom-color: var(--color-border);
	color: var(--color-main-text);
}
.cn-advanced-form-dialog__tab-button.is-active[data-v-aef2a622] {
	color: var(--color-main-text);
	border-bottom-color: var(--color-primary);
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-advanced-form-dialog__tab-button[data-v-aef2a622]:disabled {
	opacity: 0.5;
	cursor: not-allowed;
}
.cn-advanced-form-dialog__tab-content[data-v-aef2a622] {
	padding: 16px 0;
}


.cn-copy__pattern[data-v-00f97162] {
	margin-bottom: 16px;
}
.cn-copy__pattern label[data-v-00f97162] {
	display: block;
	font-weight: 600;
	margin-bottom: 4px;
}
.cn-copy__preview[data-v-00f97162] {
	margin-top: 12px;
}
.cn-copy__preview-row[data-v-00f97162] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 12px;
	background-color: var(--color-background-hover);
	border-radius: var(--border-radius);
}
.cn-copy__preview-original[data-v-00f97162] {
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-copy__preview-arrow[data-v-00f97162] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
}
.cn-copy__preview-new[data-v-00f97162] {
	font-weight: 500;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}


.cn-delete__confirm[data-v-306eeacf] {
	padding: 4px 0;
}


.cn-mass-copy__pattern[data-v-35e54e4f] {
	margin-bottom: 16px;
}
.cn-mass-copy__pattern label[data-v-35e54e4f] {
	display: block;
	font-weight: 600;
	margin-bottom: 4px;
}
.cn-mass-copy__list[data-v-35e54e4f] {
	max-height: 300px;
	overflow-y: auto;
}
.cn-mass-copy__item[data-v-35e54e4f] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 8px 12px;
	border-bottom: 1px solid var(--color-border);
}
.cn-mass-copy__item[data-v-35e54e4f]:last-child {
	border-bottom: none;
}
.cn-mass-copy__item-names[data-v-35e54e4f] {
	display: flex;
	align-items: center;
	gap: 8px;
	overflow: hidden;
	flex: 1;
}
.cn-mass-copy__item-original[data-v-35e54e4f] {
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-mass-copy__item-arrow[data-v-35e54e4f] {
	flex-shrink: 0;
	color: var(--color-text-maxcontrast);
}
.cn-mass-copy__item-new[data-v-35e54e4f] {
	font-weight: 500;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-mass-copy__empty[data-v-35e54e4f] {
	text-align: center;
	color: var(--color-text-maxcontrast);
	font-style: italic;
	padding: 20px;
}


.cn-mass-delete__list[data-v-bac41c62] {
	max-height: 300px;
	overflow-y: auto;
	margin-top: 12px;
}
.cn-mass-delete__item[data-v-bac41c62] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 8px 12px;
	border-bottom: 1px solid var(--color-border);
}
.cn-mass-delete__item[data-v-bac41c62]:last-child {
	border-bottom: none;
}
.cn-mass-delete__item-name[data-v-bac41c62] {
	font-weight: 500;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-mass-delete__empty[data-v-bac41c62] {
	text-align: center;
	color: var(--color-text-maxcontrast);
	font-style: italic;
	padding: 20px;
}


.cn-mass-export__description[data-v-6858f9a2] {
	margin-bottom: 16px;
	color: var(--color-text-maxcontrast);
}
.cn-mass-export__field[data-v-6858f9a2] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-mass-export__field label[data-v-6858f9a2] {
	font-weight: 600;
}


.cn-mass-import__form[data-v-70b2fb8f] {
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.cn-mass-import__file-row[data-v-70b2fb8f] {
	display: flex;
	align-items: center;
	gap: 12px;
}
.cn-mass-import__file-info[data-v-70b2fb8f] {
	display: flex;
	align-items: center;
	gap: 6px;
}
.cn-mass-import__file-name[data-v-70b2fb8f] {
	font-weight: 500;
}
.cn-mass-import__file-size[data-v-70b2fb8f] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-mass-import__help[data-v-70b2fb8f] {
	padding: 12px;
	background: var(--color-background-hover);
	border-radius: var(--border-radius);
}
.cn-mass-import__help p[data-v-70b2fb8f] {
	margin: 0 0 8px;
}
.cn-mass-import__help ul[data-v-70b2fb8f] {
	margin: 0;
	padding-left: 20px;
}
.cn-mass-import__options[data-v-70b2fb8f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}

/* Summary table */
.cn-mass-import__results h3[data-v-70b2fb8f] {
	margin: 0 0 12px;
	font-size: 1.1rem;
}
.cn-mass-import__summary-table[data-v-70b2fb8f] {
	width: 100%;
	border-collapse: collapse;
	border-radius: var(--border-radius);
	overflow: hidden;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.cn-mass-import__summary-table th[data-v-70b2fb8f],
.cn-mass-import__summary-table td[data-v-70b2fb8f] {
	padding: 8px 12px;
	text-align: left;
	border-bottom: 1px solid var(--color-border);
}
.cn-mass-import__summary-table th[data-v-70b2fb8f] {
	background: var(--color-background-dark);
	font-weight: 600;
	font-size: 0.85rem;
	text-transform: uppercase;
}
.cn-mass-import__sheet-name[data-v-70b2fb8f] {
	font-weight: 600;
}
.cn-mass-import__stat[data-v-70b2fb8f] {
	text-align: center;
	font-weight: 600;
}
.cn-mass-import__stat--found[data-v-70b2fb8f] { color: var(--color-primary-element);
}
.cn-mass-import__stat--created[data-v-70b2fb8f] { color: var(--color-success);
}
.cn-mass-import__stat--updated[data-v-70b2fb8f] { color: var(--color-warning);
}
.cn-mass-import__stat--unchanged[data-v-70b2fb8f] { color: var(--color-text-maxcontrast);
}
.cn-mass-import__stat--errors[data-v-70b2fb8f] { color: var(--color-error);
}
.cn-mass-import__expand[data-v-70b2fb8f] {
	background: none;
	border: none;
	cursor: pointer;
	padding: 2px;
	border-radius: var(--border-radius-small, 4px);
	color: var(--color-error);
	transition: transform 0.2s ease;
	vertical-align: middle;
	margin-left: 4px;
}
.cn-mass-import__expand[data-v-70b2fb8f]:hover {
	background: var(--color-background-hover);
}
.cn-mass-import__expand--open[data-v-70b2fb8f] {
	transform: rotate(180deg);
}

/* Error details */
.cn-mass-import__error-row td[data-v-70b2fb8f] {
	padding: 8px 12px;
	background: var(--color-background-hover);
}
.cn-mass-import__error-table[data-v-70b2fb8f] {
	width: 100%;
	border-collapse: collapse;
	font-size: 0.9em;
}
.cn-mass-import__error-table th[data-v-70b2fb8f],
.cn-mass-import__error-table td[data-v-70b2fb8f] {
	padding: 6px 10px;
	text-align: left;
	border-bottom: 1px solid var(--color-border);
}
.cn-mass-import__error-table th[data-v-70b2fb8f] {
	background: var(--color-background-dark);
	font-weight: 600;
	font-size: 0.85rem;
}


.cn-quick-filter-bar[data-v-8e121822] {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	padding: 8px 12px;
	border-bottom: 1px solid var(--color-border);
	background: var(--color-main-background);
}

/* Inline variant — bare strip for embedding inside another bar (e.g. the
   CnActionsBar #filters slot), so it reads as a control beside the view toggle
   rather than a separate bordered row. */
.cn-quick-filter-bar--inline[data-v-8e121822] {
	padding: 0;
	border-bottom: none;
	background: transparent;
}

/* Dropdown variant — give the NcSelect a sensible minimum so multi-select
   chips have room without stretching the whole bar. */
.cn-quick-filter-bar--dropdown[data-v-8e121822] {
	align-items: center;
}
.cn-quick-filter-bar__select[data-v-8e121822] {
	min-width: 220px;
}
.cn-quick-filter-bar__tab[data-v-8e121822] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-pill, 999px);
	background: transparent;
	color: var(--color-main-text);
	font-size: 13px;
	font-weight: 500;
	cursor: pointer;
	transition: background-color 120ms, color 120ms, border-color 120ms;
}
.cn-quick-filter-bar__tab[data-v-8e121822]:hover,
.cn-quick-filter-bar__tab[data-v-8e121822]:focus-visible {
	background: var(--color-background-hover);
	outline: none;
}
.cn-quick-filter-bar__tab--active[data-v-8e121822] {
	background: var(--color-primary-element, var(--color-primary, #4376fc));
	color: var(--color-primary-element-text, #fff);
	border-color: var(--color-primary-element, var(--color-primary, #4376fc));
}
.cn-quick-filter-bar__icon[data-v-8e121822] {
	display: inline-flex;
}
.cn-quick-filter-bar__label[data-v-8e121822] {
	line-height: 1;
}


.cn-save-view[data-v-e9be4122] {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding-block: 8px;
}


.cn-form-builder[data-v-33e3f229] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-form-builder__title[data-v-33e3f229] {
	margin: 0;
	font-size: 1.1em;
}
.cn-form-builder__description[data-v-33e3f229] {
	margin: 4px 0 0;
	color: var(--color-text-maxcontrast);
}
.cn-form-builder__body[data-v-33e3f229] {
	display: grid;
	grid-template-columns: 180px 1fr 1fr;
	gap: 12px;
	min-height: 320px;
}
.cn-form-builder__palette[data-v-33e3f229],
.cn-form-builder__fields[data-v-33e3f229],
.cn-form-builder__editor[data-v-33e3f229] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 8px;
	background: var(--color-main-background);
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-form-builder__palette-title[data-v-33e3f229],
.cn-form-builder__fields-title[data-v-33e3f229],
.cn-form-builder__editor-title[data-v-33e3f229] {
	margin: 0;
	font-size: 0.95em;
	border-bottom: 1px solid var(--color-border);
	padding-bottom: 4px;
}
.cn-form-builder__palette-list[data-v-33e3f229] {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-form-builder__palette-item[data-v-33e3f229] {
	padding: 6px 8px;
	border: 1px dashed var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	display: flex;
	align-items: center;
	gap: 8px;
	font-size: 0.9em;
}
.cn-form-builder__palette-item[data-v-33e3f229]:hover {
	background: var(--color-background-hover);
	border-color: var(--color-primary-element);
}
.cn-form-builder__palette-icon[data-v-33e3f229] {
	font-family: monospace;
	font-weight: 600;
	color: var(--color-primary-element);
}
.cn-form-builder__empty[data-v-33e3f229] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
	margin: 8px 0;
}
.cn-form-builder__fields-list[data-v-33e3f229] {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-form-builder__field-row[data-v-33e3f229] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: 8px;
	padding: 6px 8px;
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	cursor: pointer;
}
.cn-form-builder__field-row[data-v-33e3f229]:hover {
	background: var(--color-background-darker, var(--color-background-hover));
}
.cn-form-builder__field-row--selected[data-v-33e3f229] {
	background: var(--color-primary-element-light);
}
.cn-form-builder__field-meta[data-v-33e3f229] {
	display: flex;
	flex-direction: column;
	min-width: 0;
}
.cn-form-builder__field-key[data-v-33e3f229] {
	font-weight: 500;
	font-family: monospace;
}
.cn-form-builder__field-type[data-v-33e3f229] {
	color: var(--color-text-maxcontrast);
}
.cn-form-builder__field-actions[data-v-33e3f229] {
	display: flex;
	gap: 2px;
}
.cn-form-builder__action[data-v-33e3f229] {
	background: none;
	border: 1px solid var(--color-border);
	padding: 2px 6px;
	border-radius: var(--border-radius);
	cursor: pointer;
	font-size: 0.85em;
}
.cn-form-builder__action--delete[data-v-33e3f229] {
	color: var(--color-error);
}
.cn-form-builder__action[data-v-33e3f229]:disabled {
	opacity: 0.4;
	cursor: not-allowed;
}
.cn-form-builder__editor-row[data-v-33e3f229] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-size: 0.9em;
}
.cn-form-builder__editor-row--inline[data-v-33e3f229] {
	flex-direction: row;
	align-items: center;
	gap: 8px;
}
.cn-form-builder__editor-row input[type="text"][data-v-33e3f229],
.cn-form-builder__editor-row select[data-v-33e3f229],
.cn-form-builder__editor-row textarea[data-v-33e3f229] {
	padding: 4px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	font-size: 1em;
}
.cn-form-builder__preview[data-v-33e3f229] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 8px;
	background: var(--color-background-hover);
}
.cn-form-builder__preview summary[data-v-33e3f229] {
	cursor: pointer;
	font-weight: 500;
}
.cn-form-builder__preview-json[data-v-33e3f229] {
	margin: 8px 0 0;
	font-size: 0.85em;
	max-height: 240px;
	overflow: auto;
}


/*
 * Layout only — this component draws no KPI of its own; the tiles inside it do
 * (src/css/kpi-card.css). What it DOES owe the canonical look is the rhythm
 * around those tiles, so the gutter is the card's own `--cn-kpi-grid-gap`
 * rather than a number picked here. A grid whose gutter disagrees with the
 * card's padding reads as a different design even when every tile is
 * identical.
 */
.cn-kpi-grid[data-v-e31696e2] {
	display: grid;
	gap: var(--cn-kpi-grid-gap, 16px);
	margin-bottom: 24px;
}

/*
 * `minmax(0, 1fr)`, not `1fr`. A grid track's default minimum is `auto`, which
 * refuses to shrink below its content — and the canonical KPI value is
 * deliberately `white-space: nowrap`, so a long number (a formatted currency
 * amount, a six-figure count) pushes its track wider than its share and the
 * whole row overflows the page. With a 0 minimum the track holds its share and
 * the card's own `overflow: hidden` clips instead.
 */
.cn-kpi-grid--cols-2[data-v-e31696e2] {
	grid-template-columns: repeat(2, minmax(0, 1fr));
}
.cn-kpi-grid--cols-3[data-v-e31696e2] {
	grid-template-columns: repeat(3, minmax(0, 1fr));
}
.cn-kpi-grid--cols-4[data-v-e31696e2] {
	grid-template-columns: repeat(4, minmax(0, 1fr));
}

/* Responsive breakpoints */
@media (max-width: 1200px) {
.cn-kpi-grid--cols-4[data-v-e31696e2] {
		grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 900px) {
.cn-kpi-grid--cols-3[data-v-e31696e2] {
		grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 600px) {
.cn-kpi-grid--cols-2[data-v-e31696e2],
	.cn-kpi-grid--cols-3[data-v-e31696e2],
	.cn-kpi-grid--cols-4[data-v-e31696e2] {
		grid-template-columns: minmax(0, 1fr);
}
}


.cn-export-wizard__description[data-v-59983562] {
	color: var(--color-text-maxcontrast);
	margin-bottom: 12px;
}
.cn-export-wizard__field[data-v-59983562] {
	display: flex;
	flex-direction: column;
	gap: 6px;
	margin-bottom: 12px;
}
.cn-export-wizard__field--row[data-v-59983562] {
	flex-direction: row;
	gap: 12px;
}
.cn-export-wizard__field--row > div[data-v-59983562] {
	flex: 1 1 50%;
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-export-wizard__input[data-v-59983562],
.cn-export-wizard__date[data-v-59983562] {
	width: 100%;
	padding: 6px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
}
.cn-export-wizard__input--inline[data-v-59983562] {
	margin-top: 8px;
}
.cn-export-wizard__result[data-v-59983562] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}


.cn-walkthrough[data-v-5691d49a] {
	position: fixed;
	inset: 0;
	pointer-events: none;
}
.cn-walkthrough__live[data-v-5691d49a] {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip-path: inset(50%);
}
.cn-walkthrough__dim[data-v-5691d49a] {
	position: fixed;
	background: var(--color-modal-background, rgba(0, 0, 0, 0.5));
	pointer-events: auto;
}
.cn-walkthrough__dim--full[data-v-5691d49a] {
	inset: 0;
}
.cn-walkthrough__ring[data-v-5691d49a] {
	position: fixed;
	border-radius: var(--border-radius-large, 8px);
	box-shadow: 0 0 0 2px var(--color-primary-element, #0082c9);
	pointer-events: none;
}
.cn-walkthrough__card[data-v-5691d49a] {
	position: fixed;
	width: 320px;
	max-width: calc(100vw - 24px);
	background: var(--color-main-background);
	color: var(--color-main-text);
	border-radius: var(--border-radius-large, 8px);
	box-shadow: 0 2px 12px var(--color-box-shadow, rgba(0, 0, 0, 0.3));
	padding: 16px;
	pointer-events: auto;
}
.cn-walkthrough__close[data-v-5691d49a] {
	/* !important beats NcButton's own `position: relative`, which would otherwise
	   leave the close button in-flow at the card's top-left. */
	position: absolute !important;
	top: 8px;
	inset-inline-end: 8px;
	inset-inline-start: auto;
	z-index: 1;
}
.cn-walkthrough__counter[data-v-5691d49a] {
	font-size: 0.8125rem;
	color: var(--color-text-maxcontrast);
	margin-bottom: 4px;
	/* Keep the counter/title clear of the absolutely-positioned close button. */
	padding-inline-end: 32px;
}
.cn-walkthrough__title[data-v-5691d49a] {
	margin: 0 0 6px;
	font-size: 1.1rem;
}
.cn-walkthrough__body[data-v-5691d49a] {
	margin: 0 0 8px;
}
.cn-walkthrough__task[data-v-5691d49a] {
	margin: 0 0 8px;
	padding: 8px;
	background: var(--color-primary-element-light, var(--color-background-hover));
	border-radius: var(--border-radius, 4px);
	font-weight: 600;
}
.cn-walkthrough__task-icon[data-v-5691d49a] {
	margin-inline-end: 4px;
}
.cn-walkthrough__actions[data-v-5691d49a] {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-top: 8px;
}
.cn-walkthrough__spacer[data-v-5691d49a] {
	flex: 1 1 auto;
}


.cn-rich-submit__description[data-v-7928f0a2] {
	color: var(--color-text-maxcontrast);
	margin-bottom: 12px;
}
.cn-rich-submit__field[data-v-7928f0a2] {
	display: flex;
	flex-direction: column;
	gap: 6px;
	margin-bottom: 14px;
}
.cn-rich-submit__label[data-v-7928f0a2] {
	font-weight: 600;
}
.cn-rich-submit__required[data-v-7928f0a2] {
	color: var(--color-error);
	margin-left: 2px;
}
.cn-rich-submit__reason-list[data-v-7928f0a2] {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-rich-submit__reason-option[data-v-7928f0a2] {
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding: 8px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-rich-submit__reason-option--active[data-v-7928f0a2] {
	border-color: var(--color-primary-element);
	background: var(--color-primary-element-light);
}
.cn-rich-submit__reason-label[data-v-7928f0a2] {
	font-weight: 500;
}
.cn-rich-submit__reason-description[data-v-7928f0a2] {
	color: var(--color-text-maxcontrast);
}
.cn-rich-submit__textarea[data-v-7928f0a2] {
	width: 100%;
	padding: 8px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	resize: vertical;
}
.cn-rich-submit__file[data-v-7928f0a2] {
	padding: 6px 0;
}
.cn-rich-submit__hint[data-v-7928f0a2] {
	color: var(--color-text-maxcontrast);
}
.cn-rich-submit__file-list[data-v-7928f0a2] {
	margin: 6px 0 0;
	padding-left: 20px;
}


.cn-signature-capture[data-v-b6056322] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-signature-capture__mode-picker[data-v-b6056322] {
	display: flex;
	gap: 12px;
}
.cn-signature-capture__mode-option[data-v-b6056322] {
	display: flex;
	align-items: center;
	gap: 6px;
	cursor: pointer;
}
.cn-signature-capture__mode-option--active[data-v-b6056322] {
	font-weight: 600;
}
.cn-signature-capture__typed-input[data-v-b6056322] {
	width: 100%;
	padding: 8px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
}
.cn-signature-capture__typed-preview[data-v-b6056322] {
	min-height: 60px;
	padding: 8px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	font-size: 28px;
	color: var(--color-main-text);
	display: flex;
	align-items: center;
	justify-content: center;
}
.cn-signature-capture__canvas[data-v-b6056322] {
	border: 1px dashed var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	width: 100%;
	max-width: 100%;
	touch-action: none;
	cursor: crosshair;
}
.cn-signature-capture__hint[data-v-b6056322] {
	color: var(--color-text-maxcontrast);
}
.cn-signature-capture__affirmation[data-v-b6056322] {
	display: flex;
	gap: 8px;
	align-items: flex-start;
}
.cn-signature-capture__actions[data-v-b6056322] {
	display: flex;
	justify-content: flex-end;
}
.cn-signature-capture__clear[data-v-b6056322] {
	background: none;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 6px 12px;
	cursor: pointer;
}
.cn-signature-capture__clear[data-v-b6056322]:disabled {
	opacity: 0.4;
	cursor: not-allowed;
}


.cn-register-mapping__group[data-v-13882291] {
	margin-bottom: 24px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	padding: 20px;
	background: var(--color-background-hover);
}
.cn-register-mapping__group[data-v-13882291]:last-child {
	margin-bottom: 0;
}
.cn-register-mapping__group-header[data-v-13882291] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	margin-bottom: 12px;
}
.cn-register-mapping__group-title[data-v-13882291] {
	font-size: 16px;
	font-weight: 600;
	margin: 0;
	color: var(--color-main-text);
}
.cn-register-mapping__group-status[data-v-13882291] {
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}
.cn-register-mapping__group-description[data-v-13882291] {
	color: var(--color-text-maxcontrast);
	font-size: 13px;
	margin: 0 0 12px 0;
}
.cn-register-mapping__label[data-v-13882291] {
	display: block;
	font-weight: 500;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
	margin-bottom: 4px;
}
.cn-register-mapping__register-select[data-v-13882291] {
	margin-bottom: 16px;
	max-width: 400px;
}
.cn-register-mapping__type-list[data-v-13882291] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	overflow: hidden;
	background: var(--color-main-background);
}
.cn-register-mapping__type-list-header[data-v-13882291] {
	display: grid;
	grid-template-columns: 1fr 1fr 40px 32px;
	align-items: center;
	padding: 8px 16px;
	font-size: 12px;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
	text-transform: uppercase;
	letter-spacing: 0.5px;
	border-bottom: 1px solid var(--color-border);
	background: var(--color-background-hover);
}
.cn-register-mapping__type-row[data-v-13882291] {
	display: grid;
	grid-template-columns: 1fr 1fr 40px 32px;
	align-items: center;
	padding: 10px 16px;
	border-bottom: 1px solid var(--color-border);
	cursor: pointer;
	transition: background-color 0.15s ease;
}
.cn-register-mapping__type-row[data-v-13882291]:hover {
	background: var(--color-background-hover);
}
.cn-register-mapping__type-row--expanded[data-v-13882291] {
	background: var(--color-background-hover);
}
.cn-register-mapping__type-name[data-v-13882291] {
	font-weight: 500;
	color: var(--color-main-text);
}
.cn-register-mapping__type-schema[data-v-13882291] {
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-register-mapping__type-status[data-v-13882291] {
	display: flex;
	justify-content: center;
}
.cn-register-mapping__type-chevron[data-v-13882291] {
	display: flex;
	justify-content: center;
	color: var(--color-text-maxcontrast);
}
.cn-register-mapping__status-dot[data-v-13882291] {
	display: inline-block;
	width: 10px;
	height: 10px;
	border-radius: 50%;
}
.cn-register-mapping__status-dot--configured[data-v-13882291] {
	background-color: var(--color-success);
}
.cn-register-mapping__status-dot--unconfigured[data-v-13882291] {
	background-color: var(--color-warning);
}
.cn-register-mapping__type-detail[data-v-13882291] {
	padding: 12px 16px 16px;
	border-bottom: 1px solid var(--color-border);
	background: var(--color-main-background);
}
.cn-register-mapping__type-description[data-v-13882291] {
	color: var(--color-text-maxcontrast);
	font-size: 13px;
	margin: 0 0 8px 0;
}

/* Slide transition */
.slide-enter-active[data-v-13882291],
.slide-leave-active[data-v-13882291] {
	transition: all 0.2s ease;
	max-height: 200px;
	overflow: hidden;
}
.slide-enter[data-v-13882291],
.slide-leave-to[data-v-13882291] {
	max-height: 0;
	padding-top: 0;
	padding-bottom: 0;
	opacity: 0;
}

/* Last row in list should not have bottom border */
.cn-register-mapping__type-list[data-v-13882291] > :last-child {
	border-bottom: none;
}
@media (max-width: 768px) {
.cn-register-mapping__type-list-header[data-v-13882291] {
		display: none;
}
.cn-register-mapping__type-row[data-v-13882291] {
		grid-template-columns: 1fr auto 32px;
}
.cn-register-mapping__type-schema[data-v-13882291] {
		display: none;
}
.cn-register-mapping__register-select[data-v-13882291] {
		max-width: none;
}
}


.cn-theme-preview[data-v-3d531562] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-theme-preview__controls[data-v-3d531562] {
	display: flex;
	gap: 16px;
	flex-wrap: wrap;
}
.cn-theme-preview__picker[data-v-3d531562] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-theme-preview__picker-label[data-v-3d531562] {
	font-weight: 500;
	font-size: 0.85em;
}
.cn-theme-preview__picker-text[data-v-3d531562] {
	width: 90px;
	padding: 4px 6px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	font-family: monospace;
}
.cn-theme-preview__preview[data-v-3d531562] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 16px;
	background: var(--background, #fff);
	color: var(--text, #1b1b1b);
	min-height: 200px;
}
.cn-theme-preview__sample[data-v-3d531562] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-theme-preview__sample-header[data-v-3d531562] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	padding-bottom: 8px;
	border-bottom: 1px solid var(--text, #1b1b1b);
}
.cn-theme-preview__sample-title[data-v-3d531562] {
	font-size: 1.4em;
	font-weight: 700;
	color: var(--primary, #21468B);
}
.cn-theme-preview__sample-button[data-v-3d531562] {
	background: var(--primary, #21468B);
	color: var(--background, #fff);
	border: none;
	padding: 6px 14px;
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-theme-preview__sample-body p[data-v-3d531562] {
	margin: 0 0 8px;
}
.cn-theme-preview__sample-list[data-v-3d531562] {
	margin: 0 0 8px;
	padding-left: 18px;
}
.cn-theme-preview__sample-list-active[data-v-3d531562] {
	color: var(--primary, #21468B);
	font-weight: 600;
}
.cn-theme-preview__sample-link[data-v-3d531562] {
	color: var(--primary, #21468B);
	text-decoration: underline;
}
.cn-theme-preview__actions[data-v-3d531562] {
	display: flex;
	justify-content: flex-end;
}
.cn-theme-preview__reset[data-v-3d531562] {
	background: none;
	border: 1px solid var(--color-border);
	padding: 6px 12px;
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-theme-preview__reset[data-v-3d531562]:disabled {
	opacity: 0.4;
	cursor: not-allowed;
}


.cn-relationship-graph[data-v-2e9abfe7] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-relationship-graph__title[data-v-2e9abfe7] {
	margin: 0;
	font-size: 1.1em;
}
.cn-relationship-graph__description[data-v-2e9abfe7] {
	margin: 4px 0 0;
	color: var(--color-text-maxcontrast);
}
.cn-relationship-graph__svg[data-v-2e9abfe7] {
	width: 100%;
	max-width: 100%;
	height: auto;
	font-family: var(--font-face, sans-serif);
}
.cn-relationship-graph__node[data-v-2e9abfe7] {
	cursor: pointer;
}
.cn-relationship-graph__node:hover circle[data-v-2e9abfe7] {
	stroke-width: 3;
}
.cn-relationship-graph__node-label[data-v-2e9abfe7] {
	fill: var(--color-main-text);
	font-size: 12px;
	pointer-events: none;
}
.cn-relationship-graph__edge-label[data-v-2e9abfe7] {
	fill: var(--color-text-maxcontrast);
	font-size: 10px;
	pointer-events: none;
}
.cn-relationship-graph__legend[data-v-2e9abfe7] {
	display: flex;
	gap: 12px;
	flex-wrap: wrap;
	margin: 0;
	padding: 0;
	list-style: none;
	font-size: 0.85em;
}
.cn-relationship-graph__legend-entry[data-v-2e9abfe7] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
}
.cn-relationship-graph__legend-dot[data-v-2e9abfe7] {
	width: 12px;
	height: 12px;
	border-radius: 50%;
	display: inline-block;
}


.cn-flow-index__bar[data-v-5b9d56b3] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	margin-block-end: 12px;
}
.cn-flow-index__table[data-v-5b9d56b3] {
	inline-size: 100%;
	border-collapse: collapse;
}
.cn-flow-index__table th[data-v-5b9d56b3],
.cn-flow-index__table td[data-v-5b9d56b3] {
	padding: 8px;
	text-align: start;
	border-block-end: 1px solid var(--color-border);
}
.cn-flow-index__row[data-v-5b9d56b3] {
	cursor: pointer;
}
.cn-flow-index__row[data-v-5b9d56b3]:hover {
	background: var(--color-background-hover);
}
.cn-flow-index__muted[data-v-5b9d56b3] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-flow-index__warn[data-v-5b9d56b3] {
	color: var(--color-warning-text, var(--color-error-text));
}
.cn-flow-index__ok[data-v-5b9d56b3] {
	color: var(--color-success-text);
}


.cn-run-node-dialog__form[data-v-3eb7c55d] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-run-node-dialog__hint[data-v-3eb7c55d] {
	color: var(--color-text-maxcontrast);
}


.cn-action-buttons[data-v-df015e5e] {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	flex-wrap: wrap;
}

/* In menu mode the only children are dialogs, so the wrapper must not be a
   box: an empty inline-flex child still eats one of the header's flex gaps
   and pushes the Actions menu away from the Edit button beside it. */
.cn-action-buttons--menu[data-v-df015e5e] {
	display: contents;
}


.cn-relation-link[data-v-02b07c82] {
	padding: 20px;
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-relation-link__error[data-v-02b07c82] {
	color: var(--color-error);
	font-size: 0.85em;
	margin: 0;
}


/* NcDialog owns the padding and the heading (via `name`), so the wrapper and
   title rules the NcModal markup needed are gone. */
.cn-widget-style-editor__section[data-v-a7722c4a] {
	margin-bottom: 24px;
	padding-bottom: 24px;
	border-bottom: 1px solid var(--color-border);
}
.cn-widget-style-editor__section[data-v-a7722c4a]:last-of-type {
	border-bottom: none;
}
.cn-widget-style-editor__section-title[data-v-a7722c4a] {
	font-size: 14px;
	font-weight: 600;
	margin: 0 0 16px;
	color: var(--color-text-maxcontrast);
	text-transform: uppercase;
}
.cn-widget-style-editor__row[data-v-a7722c4a] {
	display: flex;
	align-items: center;
	gap: 12px;
	margin-bottom: 12px;
}
.cn-widget-style-editor__label[data-v-a7722c4a] {
	width: 80px;
	flex-shrink: 0;
}
.cn-widget-style-editor__color-preview[data-v-a7722c4a] {
	width: 20px;
	height: 20px;
	border-radius: 4px;
	border: 1px solid var(--color-border);
}

/* The actions row itself is NcDialog's `#actions` slot now; only the right-hand
   button cluster inside it still needs its own layout. */
.cn-widget-style-editor__actions-right[data-v-a7722c4a] {
	display: flex;
	gap: 12px;
}
.cn-widget-style-editor__icon-option[data-v-a7722c4a] {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 4px 0;
}
.cn-widget-style-editor__icon-preview[data-v-a7722c4a] {
	width: 24px;
	height: 24px;
	display: block;
	flex-shrink: 0;
	fill: currentColor;
	object-fit: contain;
}
.cn-widget-style-editor__icon-label[data-v-a7722c4a] {
	flex: 1;
}


.cn-body-sections[data-v-41c005a2] {
	display: flex;
	flex-direction: column;
	gap: 16px;
	width: 100%;
}
.cn-body-sections--grid[data-v-41c005a2] {
	display: grid;
	grid-template-columns: repeat(12, 1fr);
	gap: 16px;
}
.cn-body-sections__section[data-v-41c005a2] {
	min-width: 0;
}
.cn-body-sections__title[data-v-41c005a2] {
	margin: 0 0 8px;
	font-size: 16px;
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-body-sections__error[data-v-41c005a2] {
	padding: 12px 16px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 12px);
	background-color: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
	font-size: 14px;
}


.cn-dashboard-grid[data-v-9f6b1a22] {
	width: 100%;
	min-height: 200px;
}
.grid-stack[data-v-9f6b1a22] {
	background: transparent;
}

/* Screen-reader-only text: the keyboard key map and the live region. Kept in
   the layout (not `display: none`) so assistive tech still reads it. */
.cn-dashboard-grid__sr-only[data-v-9f6b1a22] {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/* Grid items become tab stops in edit mode — give them a visible focus ring
   that satisfies WCAG 2.1 SC 2.4.7 without relying on the widget's own
   styling. `outline-offset` keeps the ring outside the rounded card. */
.grid-stack-item[data-v-9f6b1a22]:focus-visible {
	outline: 2px solid var(--color-primary-element, #0082c9);
	outline-offset: 2px;
	border-radius: var(--border-radius-container-large, 16px);
}
[data-v-9f6b1a22] .grid-stack-item-content {
	background: var(--color-main-background);
	border: none;
	box-shadow: none;
	overflow: hidden;
}
[data-v-9f6b1a22] .grid-stack-item-content:has(.cn-widget-wrapper--borderless) {
	background: transparent;
}
[data-v-9f6b1a22] .grid-stack-placeholder > .placeholder-content {
	background: var(--color-primary-element-light);
	border: 2px dashed var(--color-primary-element);
	border-radius: var(--border-radius-large);
}


.cn-lifecycle-actions[data-v-a62ad362] {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	margin: 0 0 8px;
}
.cn-lifecycle-actions__error[data-v-a62ad362] {
	color: var(--color-error);
	font-size: 0.85em;
	margin: 0;
	flex-basis: 100%;
}


.cn-locked-banner[data-v-5339346f] {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding: 12px 16px;
	border-radius: var(--border-radius-large, 8px);
	margin-bottom: 16px;
}
.cn-locked-banner__icon[data-v-5339346f] {
	flex-shrink: 0;
	margin-top: 2px;
}

/*
 * Somebody else's lock. Error tone, not warning: for the viewer this is not a
 * caution about something that might go wrong, it is a refusal that already
 * applies — the record cannot be edited from this page at all.
 */
.cn-locked-banner--other[data-v-5339346f] {
	background-color: var(--color-error-hover, rgba(219, 80, 80, 0.15));
	border: 1px solid var(--color-error, #db5050);
}
.cn-locked-banner--other .cn-locked-banner__icon[data-v-5339346f] {
	color: var(--color-error, #db5050);
}

/*
 * The viewer's own lock. Nothing is wrong, so nothing shouts: a bordered
 * neutral card that carries the Unlock button.
 */
.cn-locked-banner--mine[data-v-5339346f] {
	background-color: var(--color-background-hover, #f5f5f5);
	border: 1px solid var(--color-border, #ededed);
}
.cn-locked-banner--mine .cn-locked-banner__icon[data-v-5339346f] {
	color: var(--color-text-maxcontrast, #767676);
}
.cn-locked-banner__body[data-v-5339346f] {
	flex: 1;
	min-width: 0;
}
.cn-locked-banner__message[data-v-5339346f] {
	margin: 0;
	font-weight: 600;
	color: var(--color-main-text, #222);
}
.cn-locked-banner__sub[data-v-5339346f] {
	margin: 4px 0 0;
	font-size: 13px;
	color: var(--color-text-maxcontrast, #767676);
}
.cn-locked-banner__action[data-v-5339346f] {
	flex-shrink: 0;
	align-self: center;
}


.cn-related-collections[data-v-095b9b22] {
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.cn-related-collections__header[data-v-095b9b22] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	margin-bottom: 8px;
}
.cn-related-collections__title[data-v-095b9b22] {
	margin: 0;
	font-size: 1.1em;
	font-weight: 600;
}


.cn-summary-aggregates[data-v-09d813af] {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin: 0 0 4px;
}
.cn-summary-aggregates__chip[data-v-09d813af] {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	padding: 6px 12px;
	border-radius: var(--border-radius-large, 12px);
	background: var(--color-background-hover);
	min-width: 72px;
}
.cn-summary-aggregates__value[data-v-09d813af] {
	font-size: 1.25em;
	font-weight: 600;
	line-height: 1.2;
	color: var(--color-main-text);
}
.cn-summary-aggregates__label[data-v-09d813af] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}


.cn-date-range-picker[data-v-2257a5f5] {
	display: flex;
	align-items: center;
	gap: 8px;
	flex-wrap: wrap;
}
.cn-date-range-picker__preset[data-v-2257a5f5] {
	min-width: 180px;
}
.cn-date-range-picker__from[data-v-2257a5f5],
.cn-date-range-picker__to[data-v-2257a5f5] {
	min-width: 160px;
}
.cn-date-range-picker__separator[data-v-2257a5f5] {
	color: var(--color-text-maxcontrast);
	font-size: 14px;
}


.cn-tile-widget[data-v-03800522] {
	height: 100%;
	width: 100%;
	position: absolute;
	top: 0;
	left: 0;
	overflow: hidden;
	background-color: var(--cn-tile-bg);
}
.cn-tile-widget__link[data-v-03800522] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	height: 100%;
	width: 100%;
	text-decoration: none;
	padding: 20px;
	gap: 12px;
	transition: transform 0.2s ease, opacity 0.2s ease;
	background-color: var(--cn-tile-bg);
	color: var(--cn-tile-text);
}
.cn-tile-widget__link[data-v-03800522]:hover {
	transform: scale(1.02);
	opacity: 0.95;
}
.cn-tile-widget__icon[data-v-03800522] {
	font-size: 48px;
	width: 48px;
	height: 48px;
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
}
.cn-tile-widget__icon--svg[data-v-03800522] {
	width: 48px;
	height: 48px;
}
.cn-tile-widget__icon span.icon[data-v-03800522] {
	display: inline-block;
	width: 48px;
	height: 48px;
	background-size: 48px;
	filter: brightness(0) invert(1);
}
.cn-tile-widget__icon img[data-v-03800522] {
	width: 100%;
	height: 100%;
	object-fit: contain;
}
.cn-tile-widget__emoji[data-v-03800522] {
	font-size: 48px;
}
.cn-tile-widget__title[data-v-03800522] {
	font-size: 16px;
	font-weight: 700;
	text-align: center;
	overflow-wrap: anywhere;
	line-height: 1.3;
	color: var(--cn-tile-text);
}


.cn-widget-ref-item[data-v-72404c82] {
	width: 100%;
}
.cn-widget-ref-item__loading[data-v-72404c82] {
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 120px;
}
.cn-widget-ref-item__error[data-v-72404c82] {
	min-height: 120px;
}


.cn-widget-renderer[data-v-c73ecde2] {
	height: 100%;
	padding: 8px;
}
.cn-widget-renderer__loading[data-v-c73ecde2] {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 100%;
}


.cn-dashboard-page[data-v-824052fe] {
	padding: 20px;
	max-width: 1800px;
	/* Centre the leftover space once the cap engages, so a wide screen shows
	   an even gutter instead of one dead column on the right. Matches
	   .cn-detail-page. */
	margin-inline: auto;
	/* Scroll the dashboard itself when its widgets are taller than the host
	   region (height:100% is a no-op when the host height is content-sized, so
	   this only kicks in when an ancestor constrains the height). */
	height: 100%;
	overflow-y: auto;
	box-sizing: border-box;
}
.cn-dashboard-page__header[data-v-824052fe] {
	display: flex;
	justify-content: space-between;
	align-items: flex-start;
	margin-bottom: 20px;
	flex-wrap: wrap;
	gap: 12px;
	/* Clear the Nextcloud navigation toggle button (44px wide, absolutely
	   positioned at the left edge of .app-content) plus 12px breathing
	   room. Only the HEADER shifts right — body widgets keep full width. */
	padding-inline-start: 56px;
}
.cn-dashboard-page__header-left[data-v-824052fe] {
	min-width: 0;
}
.cn-dashboard-page__title[data-v-824052fe] {
	margin: 0;
	font-size: 20px;
	font-weight: 700;
}
.cn-dashboard-page__description[data-v-824052fe] {
	margin: 4px 0 0;
	font-size: 14px;
	color: var(--color-text-maxcontrast);
}

/* NOTE: the date-range chip's trigger/chip/preset-spacer rules live in the
   UNSCOPED \3c style> block below, anchored on the trigger's `data-testid`, not
   here. Consumers (pipelinq, …) split the library across webpack chunks with
   no shared runtime chunk, so a rendered CnDashboardPage instance can carry a
   different `data-v-*` scope id than the one baked into this scoped CSS — the
   scoped chip rules then silently don't match and the chip collapses into
   NcActions' ~30px icon slot (text wraps to "Last / 30 / days"). The
   data-testid is stable across chunks, so those rules match regardless. */
.cn-dashboard-page__header-actions[data-v-824052fe] {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
	flex-shrink: 0;
	/* Keeps the actions hard right even when a wide action set (pipelinq's six
	   buttons) wraps onto its own line. The header's `justify-content:
	   space-between` only distributes items WITHIN a line, so once the actions
	   wrap they become the sole item on line 2 and would otherwise sit flush
	   left, under the title. No-op while title and actions share a line. */
	margin-left: auto;
}

/* Date-range header band. Kept compact so it doesn't open a tall gap
   above the grid; the pills variant is a single tidy toggle row. */
.cn-dashboard-page__date-range[data-v-824052fe] {
	margin-bottom: 12px;
}
.cn-dashboard-page__date-range--pills[data-v-824052fe] {
	margin-bottom: 8px;
}
.cn-dashboard-page__date-pills[data-v-824052fe] {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 6px;
}
.cn-dashboard-page__date-pill[data-v-824052fe] {
	display: inline-flex;
	align-items: center;
	padding: 5px 14px;
	border: 1px solid var(--color-border);
	border-radius: 999px;
	background: var(--color-main-background);
	color: var(--color-main-text);
	font-size: 13px;
	font-weight: 500;
	line-height: 1.2;
	white-space: nowrap;
	cursor: pointer;
	transition: background-color 100ms ease, border-color 100ms ease, color 100ms ease;
}
.cn-dashboard-page__date-pill[data-v-824052fe]:hover {
	background: var(--color-background-hover);
}
.cn-dashboard-page__date-pill[data-v-824052fe]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}
.cn-dashboard-page__date-pill--active[data-v-824052fe] {
	background: var(--color-primary-element);
	border-color: var(--color-primary-element);
	color: var(--color-primary-element-text);
}
.cn-dashboard-page__date-pill--active[data-v-824052fe]:hover {
	background: var(--color-primary-element-hover, var(--color-primary-element));
}

/* The custom-range pill is de-emphasised — dashed outline, muted text —
   so it reads as an escape hatch rather than a primary option. */
.cn-dashboard-page__date-pill--custom[data-v-824052fe] {
	border-style: dashed;
	color: var(--color-text-maxcontrast);
}
.cn-dashboard-page__date-pill-custom[data-v-824052fe] .action-item__menutoggle {
	min-width: 0;
	min-height: 0;
	padding: 0;
	background: transparent;
	border: none;
}
.cn-dashboard-page__date-pill-custom[data-v-824052fe] .button-vue,
.cn-dashboard-page__date-pill-custom[data-v-824052fe] .button-vue__wrapper,
.cn-dashboard-page__date-pill-custom[data-v-824052fe] .button-vue__icon {
	width: auto !important;
	min-width: 0 !important;
	overflow: visible !important;
}
.cn-dashboard-page__empty[data-v-824052fe] {
	padding: 60px 20px;
}
.cn-dashboard-page__page-filters[data-v-824052fe] {
	display: flex;
	flex-wrap: wrap;
	gap: 16px;
	align-items: flex-end;
	margin-bottom: 12px;
}
.cn-dashboard-page__page-filter[data-v-824052fe] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	min-width: 200px;
}
.cn-dashboard-page__page-filter-label[data-v-824052fe] {
	font-size: 0.85em;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
}
.cn-dashboard-page__widget-edit[data-v-824052fe] {
	position: absolute;
	top: 4px;
	inset-inline-end: 4px;
	z-index: 5;
	background: var(--color-main-background);
	border-radius: var(--border-radius);
	box-shadow: 0 1px 4px var(--color-box-shadow, rgba(0, 0, 0, 0.2));
}

/* Card-fit registry widgets (stat / gauge / delta): the tile content is a
   self-contained card that should size to the tile and centre vertically,
   never scroll. CnWidgetWrapper's content area defaults to overflow:auto +
   16px padding, which produced stray scrollbars on short KPI / gauge tiles
   and a horizontal scrollbar when a long currency value met the icon. Here
   we drop the inner scroll, add comfortable padding back (flush removed it),
   and centre the card. */
.cn-dashboard-page__card-fit[data-v-824052fe] .cn-widget-wrapper__content,
.cn-dashboard-page__card-fit.cn-widget-wrapper--flush[data-v-824052fe] .cn-widget-wrapper__content {
	overflow: hidden;
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding: 8px 14px;
}

/* Chart tiles whose graph FITS the tile (see isChartFitted — a percentage
   height, which getChartProps supplies unless the author pinned pixels), so
   the wrapper's default `overflow: auto` content area has nothing to scroll —
   and leaving it on means any rounding difference between the box and the SVG
   shows up as a scrollbar the user has to drag to see the whole graph. Same
   shape as the card-fit rule above, minus the padding: chart tiles render
   `flush`, and apexcharts already draws its own margins. */
.cn-dashboard-page__chart-fit[data-v-824052fe] .cn-widget-wrapper__content {
	overflow: hidden;
	display: flex;
	flex-direction: column;
	min-height: 0;
}

/* Card content (stat / gauge / delta) must fit the tile width: let the
   widget shrink and its value/label truncate instead of pushing past the
   tile edge (the horizontal clip on long currency values). */
.cn-dashboard-page__card-fit[data-v-824052fe] .cn-stat-widget,
.cn-dashboard-page__card-fit[data-v-824052fe] .cn-gauge-widget,
.cn-dashboard-page__card-fit[data-v-824052fe] .cn-delta-widget {
	min-width: 0;
	max-width: 100%;
}
.cn-dashboard-page__unknown[data-v-824052fe] {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 100%;
	color: var(--color-text-maxcontrast);
	font-size: 14px;
	padding: 16px;
}

/* widget-ref content items */
.cn-dashboard-page__content[data-v-824052fe] {
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.cn-dashboard-page__content-item[data-v-824052fe] {
	width: 100%;
}


/* Trigger: strip NcActions' default button chrome down to just the chip span. */
[data-testid^="cn-dashboard-page-date-chip-"].cn-dashboard-page__date-chip-trigger {
	display: inline-flex;
}

/* The toggle is a chrome-less carrier for the pill — the pill IS the control.
   NcButton paints its own background, ~30px box and `--border-radius-element`
   corners on hover / focus / :active / aria-expanded; left alone that draws a
   rounded SQUARE behind (and around) the wider, fully-rounded pill. Every
   state is neutralised with `!important` because NcButton's own state rules
   are more specific than a plain class selector. */
[data-testid^="cn-dashboard-page-date-chip-"] .action-item__menutoggle,
[data-testid^="cn-dashboard-page-date-chip-"] .action-item__menutoggle:hover,
[data-testid^="cn-dashboard-page-date-chip-"] .action-item__menutoggle:focus,
[data-testid^="cn-dashboard-page-date-chip-"] .action-item__menutoggle:focus-visible,
[data-testid^="cn-dashboard-page-date-chip-"] .action-item__menutoggle:active,
[data-testid^="cn-dashboard-page-date-chip-"] .action-item__menutoggle[aria-expanded="true"] {
	min-width: 0 !important;
	min-height: 0 !important;
	height: auto !important;
	padding: 0 !important;
	background: transparent !important;
	background-color: transparent !important;
	border: none !important;
	box-shadow: none !important;
	border-radius: 999px;
}

/* The chip text lives in NcActions' icon slot, whose default toggle is sized
   for a single icon and clips/wraps wider content. Let the toggle + its icon
   wrapper grow to the chip's natural width so "Last 30 days" reads on one
   line — and keep them shrink-wrapped so the pill isn't offset inside a wider
   box (which is what pushed the chip outside its own trigger). */
[data-testid^="cn-dashboard-page-date-chip-"] .button-vue,
[data-testid^="cn-dashboard-page-date-chip-"] .button-vue__wrapper,
[data-testid^="cn-dashboard-page-date-chip-"] .button-vue__icon {
	width: auto !important;
	min-width: 0 !important;
	height: auto !important;
	min-height: 0 !important;
	overflow: visible !important;
}

/* The width above is NOT enough on its own, and this rule is what actually
   frees the pill. NcButton pins an icon-only button to a square clickable area
   with an `!important` of its own:

     .button-vue[data-v-…]:has(.button-vue__text:empty):not(.button-vue--wide) {
       width: var(--button-size) !important;   // --default-clickable-area, 34px
     }

   NcActions fills the trigger's text slot from its `menuName` prop, which the
   chip does not use (its label is markup, not a string), so `.button-vue__text`
   renders empty and that rule always matches here. Two `!important`
   declarations are settled by SPECIFICITY, and theirs is (0,5,0) against the
   (0,2,0) of the plain descendant selector above — so the button stayed 34px
   wide while its icon wrapper grew to the pill's ~106px. Combined with the
   `overflow: visible` above, the pill then rendered centred on a 34px box and
   spilled ~36px out each side, over the widget title.

   This selector re-states their `:has()` predicate — so it applies exactly
   where theirs does, and drops out with it on a browser without `:has()` — and
   adds the trigger's own three hooks, reaching (0,7,0). Keep it ahead of
   whatever NcButton declares: tests/components/CnDashboardPageDateChip.spec.js
   reads both selectors out of the installed NcButton stylesheet and fails when
   this margin disappears. */
[data-testid^="cn-dashboard-page-date-chip-"].cn-dashboard-page__date-chip-trigger.action-item
	.button-vue.action-item__menutoggle:has(.button-vue__text:empty) {
	width: auto !important;
	min-width: 0 !important;
}
.cn-dashboard-page__date-chip {
	display: inline-flex;
	align-items: center;
	/* Breathing room from the widget title / header edge — the chip sits in
	   CnWidgetWrapper's `#title-meta` slot, flush against its neighbours. */
	margin-inline: 4px;
	padding: 2px 10px;
	border-radius: 999px;
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
	font-size: 12px;
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
	cursor: pointer;
	transition: background 100ms ease, color 100ms ease;
}
[data-testid^="cn-dashboard-page-date-chip-"]:hover .cn-dashboard-page__date-chip,
[data-testid^="cn-dashboard-page-date-chip-"]:focus-within .cn-dashboard-page__date-chip {
	background: var(--color-primary-element-light, var(--color-background-darker));
	color: var(--color-main-text);
}

/* Open state: the pill itself goes primary. The active affordance is the
   pill's own colour — never a separate box painted behind it. */
[data-testid^="cn-dashboard-page-date-chip-"] .action-item__menutoggle[aria-expanded="true"] .cn-dashboard-page__date-chip {
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
}

/* Keyboard focus needs a visible ring now that the button chrome is gone. */
[data-testid^="cn-dashboard-page-date-chip-"] .action-item__menutoggle:focus-visible .cn-dashboard-page__date-chip {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}

/* Empty span keeping preset NcActionButtons' labels aligned with the row that
   shows the current-selection CalendarRange icon (NcActionButton icon slot is
   ~20px). Lives in the teleported popper, so it's unscoped too. */
.cn-dashboard-page__date-chip-preset-spacer {
	display: inline-block;
	width: 16px;
	height: 16px;
}
.action-item__popper[data-testid^="cn-dashboard-page-date-chip-"] .v-popper__inner,
[data-testid^="cn-dashboard-page-date-chip-"].v-popper__popper .v-popper__inner {
	overflow: visible;
}
[data-testid^="cn-dashboard-page-date-chip-"] .action-input__form,
[data-testid^="cn-dashboard-page-date-chip-"] .action-input {
	min-width: 240px;
}


/* White rounded button matching the widget chrome — a persistent surface (not
   the default transparent tertiary) so the cog reads on any widget background.
   The trigger element is NcActions' menu toggle. */
.cn-widget-edit-cog[data-v-1b45aa55] .action-item__menutoggle,
.cn-widget-edit-cog[data-v-1b45aa55] .button-vue {
	background-color: var(--color-main-background) !important;
	border: 1px solid var(--color-border) !important;
	border-radius: var(--border-radius, 8px) !important;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
	color: var(--color-main-text) !important;
}
.cn-widget-edit-cog[data-v-1b45aa55] .action-item__menutoggle:hover,
.cn-widget-edit-cog[data-v-1b45aa55] .button-vue:hover {
	background-color: var(--color-background-hover) !important;
}


/* Match vue-material-design-icons: inline path icons inherit text colour. */
.cn-dashboard-icon__path[data-v-4811d535] {
	fill: currentColor;
}


.cn-icon-picker[data-v-a84ce0e2] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}

/* Compact (popover) mode for inline / table use. */
.cn-icon-picker--compact[data-v-a84ce0e2] {
	display: inline-block;
	position: relative;
}
.cn-icon-picker--compact > .cn-icon-picker__trigger[data-v-a84ce0e2] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	cursor: pointer;
	list-style: none;
}
.cn-icon-picker--compact > .cn-icon-picker__trigger[data-v-a84ce0e2]::-webkit-details-marker {
	display: none;
}
.cn-icon-picker--compact .cn-icon-picker__panel[data-v-a84ce0e2] {
	position: absolute;
	z-index: 50;
	top: calc(100% + 4px);
	inset-inline-start: 0;
	min-width: 240px;
	padding: 8px;
	display: flex;
	flex-direction: column;
	gap: 8px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	box-shadow: 0 2px 8px var(--color-box-shadow, rgba(0, 0, 0, 0.2));
}
.cn-icon-picker__preview[data-v-a84ce0e2] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border: 1px solid var(--color-border);
	border-radius: 4px;
	background-color: var(--color-background-hover);
}
.cn-icon-picker__sources[data-v-a84ce0e2] {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
}
.cn-icon-picker__source[data-v-a84ce0e2] {
	padding: 4px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	cursor: pointer;
	font-size: 13px;
}
.cn-icon-picker__source--active[data-v-a84ce0e2] {
	border-color: var(--color-primary-element);
	background: var(--color-primary-element-light, var(--color-background-hover));
}
.cn-icon-picker__search[data-v-a84ce0e2] {
	width: 100%;
	padding: 6px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-icon-picker__grid[data-v-a84ce0e2] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(40px, 1fr));
	gap: 6px;
	max-height: 200px;
	overflow-y: auto;
	padding: 4px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius, 4px);
}
.cn-icon-picker__icon[data-v-a84ce0e2] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	padding: 0;
	border: 2px solid transparent;
	border-radius: var(--border-radius, 4px);
	background: transparent;
	cursor: pointer;
	color: var(--color-main-text);
}
.cn-icon-picker__icon[data-v-a84ce0e2]:hover {
	background: var(--color-background-hover);
}
.cn-icon-picker__icon--selected[data-v-a84ce0e2] {
	border-color: var(--color-primary-element);
	background: var(--color-primary-element-light, var(--color-background-hover));
}
.cn-icon-picker__svg[data-v-a84ce0e2] {
	width: 20px;
	height: 20px;
}
.cn-icon-picker__hint[data-v-a84ce0e2] {
	margin: 0;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
	font-style: italic;
}
.cn-icon-picker__placement[data-v-a84ce0e2] {
	display: flex;
	align-items: center;
	gap: 6px;
	flex-wrap: wrap;
}
.cn-icon-picker__placement-label[data-v-a84ce0e2] {
	font-size: 13px;
	font-weight: bold;
	color: var(--color-text);
}
.cn-icon-picker__custom[data-v-a84ce0e2] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-icon-picker__format[data-v-a84ce0e2] {
	align-self: flex-start;
	padding: 4px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	color: var(--color-main-text);
	cursor: pointer;
	font-size: 13px;
}
.cn-icon-picker__upload-label[data-v-a84ce0e2] {
	position: relative;
	display: inline-flex;
	align-items: center;
	gap: 8px;
	cursor: pointer;
}
.cn-icon-picker__file-input[data-v-a84ce0e2] {
	display: none;
}
.cn-icon-picker__upload-button[data-v-a84ce0e2] {
	padding: 6px 12px;
	border: 1px solid var(--color-border);
	border-radius: 4px;
	background-color: var(--color-background-hover);
	font-size: 14px;
	transition: background-color 0.2s;
}
.cn-icon-picker__upload-label:hover .cn-icon-picker__upload-button[data-v-a84ce0e2] {
	background-color: var(--color-background-dark);
}
.cn-icon-picker__error[data-v-a84ce0e2] {
	margin: 0;
	padding: 4px 8px;
	font-size: 12px;
	color: var(--color-error);
	background-color: var(--color-background-hover);
	border-radius: 2px;
}


.cn-icon-color-picker[data-v-f15b3baa] {
	display: flex;
	flex-direction: column;
	gap: calc(3 * var(--default-grid-baseline, 4px));
}
.cn-icon-color-picker__preview[data-v-f15b3baa] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 52px;
	height: 52px;
	border-radius: 50%;
	background-color: var(--color-background-hover);
	align-self: center;
}
.cn-icon-color-picker__section[data-v-f15b3baa] {
	display: flex;
	flex-direction: column;
	gap: calc(1.5 * var(--default-grid-baseline, 4px));
}
.cn-icon-color-picker__label[data-v-f15b3baa] {
	font-size: 0.8125rem;
	color: var(--color-text-maxcontrast);
}

/* Edge-to-edge swatch row (Proton): the circles distribute across the
   full dialog width and wrap on narrow hosts. */
.cn-icon-color-picker__swatches[data-v-f15b3baa] {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: calc(1.5 * var(--default-grid-baseline, 4px));
}
.cn-icon-color-picker__swatch[data-v-f15b3baa] {
	width: 34px;
	height: 34px;
	/* Nextcloud's global button styling sets a 34px min-height, which
	   stretched smaller swatches into OVALS — pin every dimension so the
	   circle stays a circle whatever the host's button reset does. */
	min-height: 34px;
	min-width: 34px;
	flex: 0 0 34px;
	padding: 0;
	border: 2px solid transparent;
	border-radius: 50%;
	cursor: pointer;
}

/* Same affordance as the icon cells: never rely on the UA default focus
   outline alone — a host-app global `outline: none` reset would leave the
   swatches keyboard-invisible. The ring matches the --selected state. */
.cn-icon-color-picker__swatch[data-v-f15b3baa]:hover,
.cn-icon-color-picker__swatch[data-v-f15b3baa]:focus-visible {
	border-color: var(--color-primary-element);
}
.cn-icon-color-picker__swatch--default[data-v-f15b3baa] {
	background:
		linear-gradient(
			to top right,
			transparent calc(50% - 1px),
			var(--color-error) calc(50% - 1px),
			var(--color-error) calc(50% + 1px),
			transparent calc(50% + 1px)
		);
	border-color: var(--color-border-dark);
}

/* Selection ring drawn INSIDE the circle (primary border + an inset gap
   in the surface color): an outer box-shadow ring gets clipped when a
   cell sits flush against the container edge — the full-bleed rows put
   the first and last cells exactly there. */
.cn-icon-color-picker__swatch--selected[data-v-f15b3baa] {
	border-color: var(--color-primary-element);
	box-shadow: inset 0 0 0 2px var(--color-main-background);
}

/* Full-width grid with NO internal scrolling: the host dialog grows with
   the catalog instead of hiding part of it behind a scrollbar. Cells
   distribute edge to edge; the buttons inside stay fixed-size circles. */
.cn-icon-color-picker__icons[data-v-f15b3baa] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(44px, 1fr));
	justify-items: center;
	gap: calc(1.5 * var(--default-grid-baseline, 4px));
}

/* Proton-style cells: every icon sits on its own quiet circle. Dimensions
   pinned for the same oval-proofing reason as the swatches. */
.cn-icon-color-picker__icon[data-v-f15b3baa] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	min-height: 40px;
	min-width: 40px;
	padding: 0;
	border: 2px solid transparent;
	border-radius: 50%;
	background-color: var(--color-background-hover);
	cursor: pointer;
}
.cn-icon-color-picker__icon[data-v-f15b3baa]:hover,
.cn-icon-color-picker__icon[data-v-f15b3baa]:focus-visible {
	background-color: var(--color-background-dark, var(--color-background-hover));
}

/* Same inside-the-circle ring as the swatches, for the same clipping
   reason. */
.cn-icon-color-picker__icon--selected[data-v-f15b3baa] {
	border-color: var(--color-primary-element);
	box-shadow: inset 0 0 0 2px var(--color-main-background);
}


.cn-timeline-view[data-v-13e54322] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-timeline-view__title[data-v-13e54322] {
	margin: 0;
	font-size: 1.1em;
}
.cn-timeline-view__description[data-v-13e54322] {
	margin: 4px 0 0;
	color: var(--color-text-maxcontrast);
}
.cn-timeline-view__empty[data-v-13e54322] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
	margin: 16px 0;
	text-align: center;
}
.cn-timeline-view__groups[data-v-13e54322] {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.cn-timeline-view__group-header[data-v-13e54322] {
	display: flex;
	gap: 8px;
	align-items: baseline;
	padding-bottom: 6px;
	border-bottom: 1px solid var(--color-border);
}
.cn-timeline-view__group-label[data-v-13e54322] {
	font-weight: 600;
}
.cn-timeline-view__group-count[data-v-13e54322] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-timeline-view__group-events[data-v-13e54322] {
	margin: 0;
	padding: 8px 0 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-timeline-view__event[data-v-13e54322] {
	display: grid;
	grid-template-columns: 110px 1fr;
	gap: 12px;
	padding: 8px 12px;
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	cursor: pointer;
	align-items: center;
}
.cn-timeline-view__event[data-v-13e54322]:hover {
	background: var(--color-background-darker, var(--color-background-hover));
}
.cn-timeline-view__event-time[data-v-13e54322] {
	font-family: monospace;
	font-weight: 600;
	color: var(--color-primary-element);
}
.cn-timeline-view__event-title[data-v-13e54322] {
	font-weight: 500;
}
.cn-timeline-view__event-location[data-v-13e54322],
.cn-timeline-view__event-description[data-v-13e54322] {
	color: var(--color-text-maxcontrast);
	display: block;
}
.cn-timeline-view__event--break[data-v-13e54322] {
	opacity: 0.65;
}
.cn-timeline-view__event--holiday[data-v-13e54322] {
	background: var(--color-warning-hover, var(--color-background-hover));
}


.cn-item-card[data-v-99212562] {
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 10px);
	padding: 12px;
	margin-bottom: 12px;
}
.cn-item-card[data-v-99212562]:last-child {
	margin-bottom: 0;
}
.cn-item-card__header[data-v-99212562] {
	display: flex;
	align-items: center;
	justify-content: space-between;
}
.cn-item-card__title-row[data-v-99212562] {
	display: flex;
	align-items: center;
	gap: 8px;
	min-width: 0;
	flex: 1;
}
.cn-item-card__title-content[data-v-99212562] {
	display: flex;
	flex-direction: column;
	min-width: 0;
}
.cn-item-card__title[data-v-99212562] {
	margin: 0;
	font-size: 1em;
	font-weight: 600;
	color: var(--color-main-text);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-item-card__subtitle[data-v-99212562] {
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-item-card__actions[data-v-99212562] {
	flex-shrink: 0;
}
.cn-item-card__content[data-v-99212562] {
	margin-top: 8px;
}


.cn-search-page[data-v-bb8c94e2] {
	display: flex;
	flex-direction: column;
	gap: 16px;
	padding: 16px;
}

/* Reserve room for NcAppNavigationToggle (matches CnPageRenderer / CnPageHeader). */
.cn-search-page__header[data-v-bb8c94e2] {
	padding-inline-start: 56px;
}
.cn-search-page__title[data-v-bb8c94e2] {
	margin: 0 0 8px;
	font-size: 1.4em;
}
.cn-search-page__query[data-v-bb8c94e2] {
	display: flex;
	gap: 8px;
}
.cn-search-page__input[data-v-bb8c94e2] {
	flex: 1 1 auto;
	padding: 8px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	font-size: 1em;
}
.cn-search-page__submit[data-v-bb8c94e2] {
	background: var(--color-primary-element);
	color: var(--color-primary-element-text, #fff);
	border: none;
	padding: 8px 16px;
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-search-page__body[data-v-bb8c94e2] {
	display: grid;
	grid-template-columns: 240px 1fr;
	gap: 16px;
}
.cn-search-page__body[data-v-bb8c94e2]:has(:not(.cn-search-page__facets)) {
	grid-template-columns: 1fr;
}
.cn-search-page__facets[data-v-bb8c94e2] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 12px;
	display: flex;
	flex-direction: column;
	gap: 12px;
	background: var(--color-background-hover);
}
.cn-search-page__facets-title[data-v-bb8c94e2] {
	margin: 0;
	font-size: 1em;
}
.cn-search-page__facet-title[data-v-bb8c94e2] {
	margin: 0 0 4px;
	font-size: 0.9em;
}
.cn-search-page__facet-options[data-v-bb8c94e2] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-search-page__facet-option[data-v-bb8c94e2] {
	display: flex;
	gap: 4px;
}
.cn-search-page__facet-option label[data-v-bb8c94e2] {
	display: flex;
	gap: 6px;
	align-items: center;
	cursor: pointer;
	font-size: 0.9em;
}
.cn-search-page__facet-count[data-v-bb8c94e2] {
	color: var(--color-text-maxcontrast);
}
.cn-search-page__clear-facets[data-v-bb8c94e2] {
	background: none;
	border: 1px solid var(--color-border);
	padding: 4px 8px;
	border-radius: var(--border-radius);
	cursor: pointer;
	font-size: 0.85em;
	align-self: flex-start;
}
.cn-search-page__list[data-v-bb8c94e2] {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-search-page__result[data-v-bb8c94e2] {
	padding: 10px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	cursor: pointer;
	background: var(--color-main-background);
}
.cn-search-page__result[data-v-bb8c94e2]:hover {
	background: var(--color-background-hover);
}
.cn-search-page__result-head[data-v-bb8c94e2] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: 8px;
}
.cn-search-page__result-title[data-v-bb8c94e2] {
	font-weight: 600;
}
.cn-search-page__result-badge[data-v-bb8c94e2] {
	font-size: 0.75em;
	padding: 1px 8px;
	border-radius: 9999px;
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
	text-transform: uppercase;
	letter-spacing: 0.05em;
}
.cn-search-page__result-snippet[data-v-bb8c94e2] {
	margin: 4px 0 0;
	color: var(--color-text-maxcontrast);
}
.cn-search-page__result-subtitle[data-v-bb8c94e2] {
	color: var(--color-text-maxcontrast);
}
.cn-search-page__empty[data-v-bb8c94e2],
.cn-search-page__idle[data-v-bb8c94e2],
.cn-search-page__loading[data-v-bb8c94e2] {
	color: var(--color-text-maxcontrast);
	margin: 24px 0;
	text-align: center;
	font-style: italic;
}
.cn-search-page__more[data-v-bb8c94e2] {
	margin-top: 12px;
	color: var(--color-text-maxcontrast);
	text-align: center;
}


.cn-command-palette[data-v-d6bda7a2] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	min-height: 0;
}
.cn-command-palette__input-row[data-v-d6bda7a2] {
	display: flex;
}
.cn-command-palette__input[data-v-d6bda7a2] {
	flex: 1 1 auto;
	padding: 10px 14px;
	font-size: 1.1em;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-command-palette__input[data-v-d6bda7a2]:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}

/* Visually hidden but announced — the live result count. */
.cn-command-palette__status[data-v-d6bda7a2] {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	margin: -1px;
}
.cn-command-palette__list[data-v-d6bda7a2] {
	list-style: none;
	margin: 0;
	padding: 0;
	max-height: 50vh;
	overflow-y: auto;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-command-palette__section-label[data-v-d6bda7a2] {
	padding: 8px 10px 2px;
	font-size: 0.75em;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--color-text-maxcontrast);
}
.cn-command-palette__option[data-v-d6bda7a2] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-command-palette__option--active[data-v-d6bda7a2],
.cn-command-palette__option[data-v-d6bda7a2]:hover {
	background: var(--color-background-hover);
}
.cn-command-palette__option-icon[data-v-d6bda7a2] {
	flex: 0 0 auto;
	color: var(--color-text-maxcontrast);
}
.cn-command-palette__option-title[data-v-d6bda7a2] {
	flex: 1 1 auto;
	color: var(--color-main-text);
}
.cn-command-palette__option-subtitle[data-v-d6bda7a2] {
	flex: 0 0 auto;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}
.cn-command-palette__empty[data-v-d6bda7a2] {
	padding: 24px 12px;
	text-align: center;
	color: var(--color-text-maxcontrast);
	font-style: italic;
	margin: 0;
}


.cn-tree-node[data-v-7302062c] {
	list-style: none;
}
.cn-tree-node__row[data-v-7302062c] {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 4px 6px;
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-tree-node__row[data-v-7302062c]:hover {
	background: var(--color-background-hover);
}
.cn-tree-node--selected > .cn-tree-node__row[data-v-7302062c] {
	background: var(--color-primary-element-light);
	color: var(--color-main-text);
}
.cn-tree-node__toggle[data-v-7302062c] {
	background: none;
	border: none;
	cursor: pointer;
	padding: 0;
	width: 18px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}
.cn-tree-node__toggle--leaf[data-v-7302062c] {
	cursor: default;
}
.cn-tree-node__caret[data-v-7302062c] {
	display: inline-block;
	transition: transform 0.15s ease;
	font-size: 0.9em;
	color: var(--color-text-maxcontrast);
}
.cn-tree-node__caret--open[data-v-7302062c] {
	transform: rotate(90deg);
	color: var(--color-main-text);
}
.cn-tree-node__icon[data-v-7302062c] {
	font-size: 0.9em;
}
.cn-tree-node__label[data-v-7302062c] {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-tree-node__badge[data-v-7302062c] {
	font-size: 0.8em;
	padding: 1px 6px;
	border-radius: 9999px;
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
}
.cn-tree-node__children[data-v-7302062c] {
	margin: 0;
	padding: 0;
	list-style: none;
}


.cn-tree-view[data-v-7758894f] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-tree-view__title[data-v-7758894f] {
	margin: 0;
	font-size: 1.1em;
}
.cn-tree-view__description[data-v-7758894f] {
	margin: 4px 0 0;
	color: var(--color-text-maxcontrast);
}
.cn-tree-view__empty[data-v-7758894f] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
	margin: 16px 0;
	text-align: center;
}
.cn-tree-view__root[data-v-7758894f] {
	margin: 0;
	padding: 0;
	list-style: none;
}


.cn-file-manager[data-v-34e5835d] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-file-manager__title[data-v-34e5835d] {
	margin: 0;
	font-size: 1.1em;
}
.cn-file-manager__description[data-v-34e5835d] {
	margin: 4px 0 0;
	color: var(--color-text-maxcontrast);
}
.cn-file-manager__dropzone[data-v-34e5835d] {
	border: 2px dashed var(--color-border);
	border-radius: var(--border-radius);
	padding: 24px;
	text-align: center;
	background: var(--color-background-hover);
	cursor: pointer;
	transition: background 0.15s ease, border-color 0.15s ease;
}
.cn-file-manager__dropzone[data-v-34e5835d]:hover,
.cn-file-manager__dropzone--active[data-v-34e5835d] {
	background: var(--color-primary-element-light);
	border-color: var(--color-primary-element);
}
.cn-file-manager__dropzone p[data-v-34e5835d] {
	margin: 0;
}
.cn-file-manager__dropzone small[data-v-34e5835d] {
	display: block;
	margin-top: 4px;
	color: var(--color-text-maxcontrast);
}
.cn-file-manager__file-input[data-v-34e5835d] {
	display: none;
}
.cn-file-manager__empty[data-v-34e5835d] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
	margin: 16px 0;
	text-align: center;
}
.cn-file-manager__list[data-v-34e5835d] {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-file-manager__item[data-v-34e5835d] {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 8px 12px;
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
	cursor: pointer;
}
.cn-file-manager__item[data-v-34e5835d]:hover {
	background: var(--color-background-darker, var(--color-background-hover));
}
.cn-file-manager__item-icon[data-v-34e5835d] {
	font-size: 1.4em;
}
.cn-file-manager__item-meta[data-v-34e5835d] {
	flex: 1 1 auto;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-file-manager__item-name[data-v-34e5835d] {
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-file-manager__item-sub[data-v-34e5835d] {
	color: var(--color-text-maxcontrast);
}
.cn-file-manager__item-actions[data-v-34e5835d] {
	display: flex;
	gap: 4px;
}
.cn-file-manager__action[data-v-34e5835d] {
	background: none;
	border: 1px solid var(--color-border);
	padding: 4px 8px;
	border-radius: var(--border-radius);
	cursor: pointer;
	font-size: 0.85em;
}
.cn-file-manager__action[data-v-34e5835d]:hover {
	background: var(--color-main-background);
}
.cn-file-manager__action--delete[data-v-34e5835d] {
	color: var(--color-error);
}
.cn-file-manager__action[data-v-34e5835d]:disabled {
	opacity: 0.4;
	cursor: not-allowed;
}


.cn-related-files[data-v-614521af] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-related-files__title[data-v-614521af] {
	margin: 0;
	font-size: 1.1em;
}
.cn-related-files__description[data-v-614521af] {
	margin: 4px 0 0;
	color: var(--color-text-maxcontrast);
}
.cn-related-files__add[data-v-614521af] {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
}
.cn-related-files__add-button[data-v-614521af] {
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
	border: none;
	padding: 6px 14px;
	border-radius: var(--border-radius);
	cursor: pointer;
	font-size: 0.9em;
}
.cn-related-files__add-button[data-v-614521af]:hover {
	background: var(--color-primary-element-hover);
}
.cn-related-files__path-add[data-v-614521af] {
	display: flex;
	align-items: center;
	gap: 4px;
	flex: 1 1 auto;
	min-width: 0;
}
.cn-related-files__path-field[data-v-614521af] {
	flex: 1 1 auto;
	min-width: 0;
	padding: 5px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
}
.cn-related-files__path-button[data-v-614521af] {
	background: none;
	border: 1px solid var(--color-border);
	padding: 5px 10px;
	border-radius: var(--border-radius);
	cursor: pointer;
	font-size: 0.85em;
}
.cn-related-files__path-button[data-v-614521af]:hover {
	background: var(--color-background-hover);
}
.cn-related-files__path-button[data-v-614521af]:disabled {
	opacity: 0.4;
	cursor: not-allowed;
}
.cn-related-files__empty[data-v-614521af] {
	color: var(--color-text-maxcontrast);
	font-style: italic;
	margin: 16px 0;
	text-align: center;
}
.cn-related-files__list[data-v-614521af] {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-related-files__item[data-v-614521af] {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 8px 12px;
	border-radius: var(--border-radius);
	background: var(--color-background-hover);
}
.cn-related-files__item[data-v-614521af]:hover {
	background: var(--color-background-darker, var(--color-background-hover));
}
.cn-related-files__item-icon[data-v-614521af] {
	font-size: 1.4em;
}
.cn-related-files__item-meta[data-v-614521af] {
	flex: 1 1 auto;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-related-files__item-name[data-v-614521af] {
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-related-files__item-path[data-v-614521af],
.cn-related-files__item-description[data-v-614521af] {
	color: var(--color-text-maxcontrast);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-related-files__item-actions[data-v-614521af] {
	display: flex;
	gap: 4px;
}
.cn-related-files__action[data-v-614521af] {
	background: none;
	border: 1px solid var(--color-border);
	padding: 4px 8px;
	border-radius: var(--border-radius);
	cursor: pointer;
	font-size: 0.85em;
}
.cn-related-files__action[data-v-614521af]:hover {
	background: var(--color-main-background);
}
.cn-related-files__action--remove[data-v-614521af] {
	color: var(--color-error);
}


.cn-integration-tab__banner[data-v-7fc86c4f] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	margin-bottom: 10px;
	border-radius: var(--border-radius);
	background: var(--color-warning, #e9a40f);
	color: var(--color-main-background);
	font-size: 0.9em;
}
.cn-integration-tab__error[data-v-7fc86c4f] {
	color: var(--color-error);
	font-size: 0.9em;
	margin: 4px 0 8px;
}
.cn-integration-tab__list[data-v-7fc86c4f] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-integration-tab__row[data-v-7fc86c4f] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-integration-tab__row[data-v-7fc86c4f]:last-child {
	border-bottom: none;
}
.cn-integration-tab__icon[data-v-7fc86c4f] {
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-integration-tab__row-main[data-v-7fc86c4f] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
}
.cn-integration-tab__title[data-v-7fc86c4f] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-integration-tab__title[data-v-7fc86c4f]:hover {
	text-decoration: underline;
}
.cn-integration-tab__subtitle[data-v-7fc86c4f] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}


.cn-object-access-tab[data-v-0b814c9f] {
	display: flex;
	flex-direction: column;
	gap: 1.25rem;
}
.cn-object-access-tab__section[data-v-0b814c9f] {
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
}
.cn-object-access-tab__heading[data-v-0b814c9f] {
	margin: 0;
	font-weight: 600;
	color: var(--color-main-text);
}
.cn-object-access-tab__hint[data-v-0b814c9f],
.cn-object-access-tab__meta[data-v-0b814c9f] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85rem;
	margin: 0;
}
.cn-object-access-tab__list[data-v-0b814c9f] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-object-access-tab__row[data-v-0b814c9f] {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	padding: 0.25rem 0;
}
.cn-object-access-tab__row-main[data-v-0b814c9f] {
	display: flex;
	flex-direction: column;
	min-width: 0;
	flex: 1;
}
.cn-object-access-tab__principal[data-v-0b814c9f] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-object-access-tab__banner[data-v-0b814c9f],
.cn-object-access-tab__error[data-v-0b814c9f] {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	color: var(--color-error);
}
.cn-object-access-tab__link code[data-v-0b814c9f] {
	word-break: break-all;
}


.cn-integration-card__empty[data-v-f7e9bbfa] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
	padding: 8px 0;
}
.cn-integration-card__chip[data-v-f7e9bbfa] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 8px;
	border-radius: 12px;
	background: var(--color-background-hover);
	font-size: 0.9em;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-integration-card__chip-sub[data-v-f7e9bbfa] {
	color: var(--color-text-maxcontrast);
}
.cn-integration-card__list[data-v-f7e9bbfa] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-integration-card__row[data-v-f7e9bbfa] {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-integration-card__row[data-v-f7e9bbfa]:last-child {
	border-bottom: none;
}
.cn-integration-card__icon[data-v-f7e9bbfa] {
	color: var(--color-text-maxcontrast);
	flex-shrink: 0;
}
.cn-integration-card__row-main[data-v-f7e9bbfa] {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
}
.cn-integration-card__title[data-v-f7e9bbfa] {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-main-text);
	text-decoration: none;
}
a.cn-integration-card__title[data-v-f7e9bbfa]:hover {
	text-decoration: underline;
}
.cn-integration-card__subtitle[data-v-f7e9bbfa] {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}


.cn-integration-widget-grid[data-v-5f190a37] {
	width: 100%;
}
.cn-integration-widget-grid__grid[data-v-5f190a37] {
	display: grid;
	grid-template-columns: repeat(var(--cn-iwg-columns, 3), minmax(0, 1fr));
	gap: calc(3 * var(--default-grid-baseline, 4px));
}
@media (max-width: 1199px) {
.cn-integration-widget-grid__grid[data-v-5f190a37] {
		grid-template-columns: repeat(2, minmax(0, 1fr));
}
.cn-integration-widget-grid__cell[data-v-5f190a37] {
		grid-column: span 1 !important;
}
}
@media (max-width: 767px) {
.cn-integration-widget-grid__grid[data-v-5f190a37] {
		grid-template-columns: 1fr;
}
.cn-integration-widget-grid__cell[data-v-5f190a37] {
		grid-column: 1 !important;
}
}
.cn-integration-widget-grid__cell[data-v-5f190a37] {
	min-height: var(--cn-iwg-min-height, auto);
	display: flex;
	flex-direction: column;
}
.cn-integration-widget-grid__cell[data-v-5f190a37] > * {
	flex: 1;
	min-height: 0;
}
.cn-integration-widget-grid__empty[data-v-5f190a37] {
	padding: 24px;
	text-align: center;
	color: var(--color-text-maxcontrast);
	font-size: 14px;
}


.cn-progress-bar__items[data-v-b15e7472] {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-progress-bar__item[data-v-b15e7472] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-progress-bar__label[data-v-b15e7472] {
	display: flex;
	justify-content: space-between;
	align-items: center;
	font-size: 0.9rem;
}
.cn-progress-bar__name[data-v-b15e7472] {
	color: var(--color-main-text);
}
.cn-progress-bar__name--tooltip[data-v-b15e7472] {
	cursor: help;
	text-decoration: underline;
	text-decoration-style: dotted;
	text-underline-offset: 2px;
}
.cn-progress-bar__name--tooltip[data-v-b15e7472]:hover {
	text-decoration-style: solid;
}
.cn-progress-bar__value[data-v-b15e7472] {
	color: var(--color-text-maxcontrast);
	font-variant-numeric: tabular-nums;
}
.cn-progress-bar__track[data-v-b15e7472] {
	background: var(--color-background-dark, var(--color-background-darker));
	overflow: hidden;
}
.cn-progress-bar__track--rounded[data-v-b15e7472] {
	border-radius: 4px;
}
.cn-progress-bar__fill[data-v-b15e7472] {
	height: 100%;
	transition: width 0.3s ease;
}
.cn-progress-bar__fill--rounded[data-v-b15e7472] {
	border-radius: 4px;
}

/* Variant colors */
.cn-progress-bar__fill--default[data-v-b15e7472] {
	background: var(--color-main-text);
}
.cn-progress-bar__fill--primary[data-v-b15e7472] {
	background: var(--color-primary-element);
}
.cn-progress-bar__fill--success[data-v-b15e7472] {
	background: var(--color-success);
}
.cn-progress-bar__fill--warning[data-v-b15e7472] {
	background: var(--color-warning);
}
.cn-progress-bar__fill--error[data-v-b15e7472] {
	background: var(--color-error);
}
.cn-progress-bar__fill--info[data-v-b15e7472] {
	background: var(--color-info, #0082c9);
}


/*
 * The panel draws no KPI of its own — every stat it shows is a CnStatsBlock,
 * so the tiles are already the canonical card (src/css/kpi-card.css). What
 * this file owns is the chrome AROUND them: the section heading, the stack
 * gutter, and the panel-level loading and empty lines.
 *
 * Those all read the shared `--cn-kpi-*` scale. A panel whose "No data
 * available" line is a different size from the tile's own empty line, or whose
 * stack gutter disagrees with the grid's, is a second KPI look assembled out
 * of canonical parts — which is how the library got several to begin with.
 */
.cn-stats-panel__section[data-v-2ed2c44f] {
	padding: 12px 0;
	border-bottom: 1px solid var(--color-border);
}
.remove-margin[data-v-2ed2c44f] {
	margin: 0;
}
.cn-stats-panel__section[data-v-2ed2c44f]:last-child {
	border-bottom: none;
}
.cn-stats-panel__section-title[data-v-2ed2c44f] {
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	font-size: var(--cn-kpi-section-title-size, 14px);
	font-weight: bold;
	padding: 0 16px;
	margin: 0 0 12px 0;
}
.cn-stats-panel__stack[data-v-2ed2c44f] {
	display: flex;
	flex-direction: column;
	gap: var(--cn-kpi-stack-gap, 12px);
}
.cn-stats-panel__loading[data-v-2ed2c44f] {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 0 16px;
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
}
.cn-stats-panel__empty[data-v-2ed2c44f] {
	padding: 0 16px;
	font-size: var(--cn-kpi-label-size, 13px);
	color: var(--cn-kpi-label-color, var(--color-text-maxcontrast));
	font-style: italic;
}
.cn-stats-panel__header[data-v-2ed2c44f] {
	padding-bottom: 12px;
	border-bottom: 1px solid var(--color-border);
}
.cn-stats-panel__footer[data-v-2ed2c44f] {
	padding-top: 12px;
}
.cn-stats-panel__list[data-v-2ed2c44f] {
	margin-top: 4px;
}


.cn-people-widget-form[data-v-1a9583cf] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-people-widget-form__field[data-v-1a9583cf] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-size: 14px;
}
.cn-people-widget-form__field--inline[data-v-1a9583cf] {
	flex-direction: row;
	align-items: center;
	gap: 8px;
}
.cn-people-widget-form__input[data-v-1a9583cf] {
	padding: 6px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	font: inherit;
}
.cn-people-widget-form__error[data-v-1a9583cf] {
	color: var(--color-error, #c00);
	font-size: 12px;
}


.cn-calendar-widget-form[data-v-96672822] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-calendar-widget-form__field[data-v-96672822] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-size: 14px;
}
.cn-calendar-widget-form__label[data-v-96672822] {
	font-weight: 500;
}
.cn-calendar-widget-form__textarea[data-v-96672822] {
	width: 100%;
	padding: 6px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	font-family: inherit;
	font-size: 13px;
	resize: vertical;
}


.cn-spend-analytics-widget-form[data-v-1eb1f32f] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-spend-analytics-widget-form__toggle[data-v-1eb1f32f] {
	display: flex;
	align-items: center;
	gap: 8px;
	cursor: pointer;
}


.cn-nc-widget-grid-picker__grid[data-v-f0d8cb62] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
	gap: 12px;
}
.cn-nc-widget-grid-picker__card[data-v-f0d8cb62] {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 12px 8px;
	border: 2px solid var(--color-border);
	border-radius: var(--border-radius-large, var(--border-radius));
	background: var(--color-main-background);
	color: var(--color-main-text);
	cursor: pointer;
	min-height: 96px;
	transition: border-color 0.12s ease-in-out, background-color 0.12s ease-in-out;
}
.cn-nc-widget-grid-picker__card[data-v-f0d8cb62]:hover {
	background: var(--color-background-hover);
}
.cn-nc-widget-grid-picker__card[data-v-f0d8cb62]:focus {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}
.cn-nc-widget-grid-picker__card--selected[data-v-f0d8cb62] {
	border-color: var(--color-primary-element);
}
.cn-nc-widget-grid-picker__icon-wrap[data-v-f0d8cb62] {
	position: relative;
	width: 40px;
	height: 40px;
	display: flex;
	align-items: center;
	justify-content: center;
}
.cn-nc-widget-grid-picker__icon[data-v-f0d8cb62] {
	width: 40px;
	height: 40px;
	object-fit: contain;
	display: block;
}
.cn-nc-widget-grid-picker__icon--placeholder[data-v-f0d8cb62] {
	border-radius: 50%;
	background: var(--color-background-dark);
	color: var(--color-main-text);
	font-size: 14px;
	font-weight: 600;
	display: flex;
	align-items: center;
	justify-content: center;
}
.cn-nc-widget-grid-picker__check[data-v-f0d8cb62] {
	position: absolute;
	bottom: -4px;
	right: -4px;
	width: 20px;
	height: 20px;
	border-radius: 50%;
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
	display: flex;
	align-items: center;
	justify-content: center;
	box-shadow: 0 0 0 2px var(--color-main-background);
}
.cn-nc-widget-grid-picker__title[data-v-f0d8cb62] {
	width: 100%;
	font-size: 13px;
	text-align: center;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cn-nc-widget-grid-picker__empty[data-v-f0d8cb62] {
	padding: 16px;
	text-align: center;
	color: var(--color-text-maxcontrast);
	font-style: italic;
}


.cn-nc-dashboard-widget-form[data-v-952b6a6e] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-nc-dashboard-widget-form__field[data-v-952b6a6e] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-nc-dashboard-widget-form__label[data-v-952b6a6e] {
	font-size: 14px;
	font-weight: 500;
}
.cn-nc-dashboard-widget-form__search[data-v-952b6a6e] {
	width: 100%;
	padding: 6px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
}

/* Cap the picker height so the long widget catalog scrolls within the modal
   instead of making it thousands of pixels tall. */
.cn-nc-dashboard-widget-form__picker[data-v-952b6a6e] {
	max-height: 320px;
	overflow-y: auto;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	padding: 4px;
}
.cn-nc-dashboard-widget-form__empty[data-v-952b6a6e] {
	margin: 8px;
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}
.cn-nc-dashboard-widget-form__select[data-v-952b6a6e] {
	width: 100%;
	padding: 6px 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
}


/* NcAppSidebar lays every tab out as an equal share of the sidebar width
 * (`flex: 1 1`) with an ellipsis caption, so an object with many tabs — e.g. a
 * lead's 5+ tabs — shrinks them until the labels truncate. Keep the tabs
 * equal-width (uniform) but stop them shrinking below a readable minimum, and
 * let the strip scroll horizontally once they no longer fit. `flex-basis: 0`
 * + equal grow keeps every tab the same width whether the row fits or scrolls.
 * Apps with longer labels can widen the floor via --cn-sidebar-tab-min-width. */
[data-v-b89adf96] .app-sidebar-tabs__nav {
	overflow-x: auto;
}
[data-v-b89adf96] .app-sidebar-tabs__nav .app-sidebar-tabs__tab {
	flex-grow: 1;
	flex-shrink: 0;
	flex-basis: 0;
	/* !important to beat NcAppSidebar's own min-width on the button variant. */
	min-width: var(--cn-sidebar-tab-min-width, 7rem) !important;
}


.cn-info-widget[data-v-32858522] {
	display: grid;
	gap: 12px 24px;
}
.cn-info-widget__field[data-v-32858522] {
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.cn-info-widget__label[data-v-32858522] {
	font-size: 12px;
	font-weight: 600;
	color: var(--color-text-maxcontrast);
	text-transform: uppercase;
	letter-spacing: 0.5px;
	margin: 0;
}
.cn-info-widget__value[data-v-32858522] {
	font-size: 14px;
	color: var(--color-main-text);
	margin: 0;
	overflow-wrap: anywhere;
}

/* Responsive: single column on small screens */
@media (max-width: 600px) {
.cn-info-widget[data-v-32858522] {
		grid-template-columns: 1fr !important;
}
}


/* Padding matches CnIndexPage / CnDetailPage (see css/index-page.css and
   css/detail-page.css) — a logs page had none at all, so its table ran flush
   into both edges of the app content area. Gaps are expressed in the same
   grid-baseline unit as the rest of the fleet rather than raw pixels. */
.cn-logs-page[data-v-18d3ce6f] {
	display: flex;
	flex-direction: column;
	gap: calc(4 * var(--default-grid-baseline));
	padding: calc(5 * var(--default-grid-baseline));
	box-sizing: border-box;
}
.cn-logs-page__actions[data-v-18d3ce6f] {
	display: flex;
	justify-content: flex-end;
	gap: calc(2 * var(--default-grid-baseline));
}
.cn-logs-page__loading[data-v-18d3ce6f],
.cn-logs-page__empty[data-v-18d3ce6f],
.cn-logs-page__error[data-v-18d3ce6f] {
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 200px;
}
.cn-logs-page__pagination[data-v-18d3ce6f] {
	margin-top: calc(3 * var(--default-grid-baseline));
}
.cn-logs-page__detail[data-v-18d3ce6f] {
	display: flex;
	flex-direction: column;
	gap: calc(2 * var(--default-grid-baseline));
	padding: 0 calc(3 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline));
}
.cn-logs-page__detail-heading[data-v-18d3ce6f] {
	margin: calc(3 * var(--default-grid-baseline)) 0 0;
	font-weight: bold;
}
.cn-logs-page__detail-json[data-v-18d3ce6f] {
	margin: 0;
	padding: calc(2 * var(--default-grid-baseline));
	overflow-x: auto;
	border-radius: var(--border-radius);
	background-color: var(--color-background-dark);
	font-family: monospace;
	white-space: pre;
}

/* Same breakpoint + step-down as CnDetailPage, so the three page types stay in
   sync on narrow viewports. */
@media (max-width: 768px) {
.cn-logs-page[data-v-18d3ce6f] {
		padding: calc(3 * var(--default-grid-baseline));
}
}


.cn-settings-page[data-v-e98da622] {
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.cn-settings-page__actions[data-v-e98da622] {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
}

/*
 * Tab strip for the orchestration shape (manifest-settings-
 * orchestration REQ-MSO-5). Uses Nextcloud CSS variables only — no
 * hex literals, no rgba overrides on the elements themselves.
 */
.cn-settings-page__tabs[data-v-e98da622] {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
	border-bottom: 1px solid var(--color-border);
	padding-bottom: 0;
	margin-bottom: 8px;
}
.cn-settings-page__tab[data-v-e98da622] {
	background: transparent;
	border: 0;
	border-bottom: 3px solid transparent;
	padding: 8px 16px;
	margin: 0;
	cursor: pointer;
	color: var(--color-text-maxcontrast);
	font-weight: normal;
	border-radius: var(--border-radius-large) var(--border-radius-large) 0 0;
	transition: background-color 0.1s ease-in-out, color 0.1s ease-in-out, border-color 0.1s ease-in-out;
}
.cn-settings-page__tab[data-v-e98da622]:hover,
.cn-settings-page__tab[data-v-e98da622]:focus-visible {
	background-color: var(--color-background-hover);
	color: var(--color-main-text);
	outline: none;
}
.cn-settings-page__tab--active[data-v-e98da622] {
	color: var(--color-primary-element);
	border-bottom-color: var(--color-primary-element);
	font-weight: bold;
}
@media (max-width: 768px) {
.cn-settings-page__tabs[data-v-e98da622] {
		flex-direction: column;
		gap: 0;
		border-bottom: 0;
}
.cn-settings-page__tab[data-v-e98da622] {
		border-bottom: 1px solid var(--color-border);
		border-radius: 0;
		text-align: left;
}
.cn-settings-page__tab--active[data-v-e98da622] {
		border-bottom-width: 1px;
		background-color: var(--color-background-hover);
}
}
.cn-settings-page__fields[data-v-e98da622] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-settings-page__field[data-v-e98da622] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-settings-page__field-help[data-v-e98da622] {
	color: var(--color-text-maxcontrast);
}
.cn-settings-page__save-bar[data-v-e98da622] {
	display: flex;
	gap: 8px;
	margin-top: 16px;
}
.cn-settings-page__error[data-v-e98da622] {
	color: var(--color-error);
	background: var(--color-error-light, var(--color-background-hover));
	padding: 8px 12px;
	border-radius: var(--border-radius);
}


.cn-chat-page[data-v-22f50a62] {
	display: flex;
	flex-direction: column;
	gap: 16px;
	height: 100%;
	min-height: 480px;
}
.cn-chat-page__actions[data-v-22f50a62] {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
}
.cn-chat-page__iframe[data-v-22f50a62] {
	flex: 1 1 auto;
	width: 100%;
	min-height: 480px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	background: var(--color-main-background);
}
.cn-chat-page__placeholder[data-v-22f50a62] {
	flex: 1 1 auto;
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 240px;
}


.cn-files-page[data-v-1c4cfd47] {
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.cn-files-page__actions[data-v-1c4cfd47] {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
}
.cn-files-page__loading[data-v-1c4cfd47],
.cn-files-page__empty[data-v-1c4cfd47],
.cn-files-page__error[data-v-1c4cfd47] {
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 240px;
}


.cn-map-page[data-v-3df70f5e] {
	display: flex;
	flex-direction: column;
	height: 100%;
}
.cn-map-page__filters[data-v-3df70f5e] {
	padding: 16px;
	border-bottom: 1px solid var(--color-border);
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	align-items: center;
}
.cn-map-page__body[data-v-3df70f5e] {
	flex: 1;
	position: relative;
	min-height: 400px;
}


.cn-wiki-tree-node[data-v-698d9900] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-wiki-tree-node__button[data-v-698d9900] {
	display: block;
	width: 100%;
	text-align: left;
	background: transparent;
	border: 0;
	color: var(--color-main-text);
	padding: 6px 8px;
	border-radius: var(--border-radius);
	cursor: pointer;
}
.cn-wiki-tree-node__button[data-v-698d9900]:hover,
.cn-wiki-tree-node__button[data-v-698d9900]:focus-visible {
	background: var(--color-background-hover);
	outline: none;
}
.cn-wiki-tree-node__children[data-v-698d9900] {
	list-style: none;
	margin: 0;
	padding-left: 16px;
}


.cn-wiki-page[data-v-25a3d3cf] {
	display: flex;
	gap: 24px;
	padding: 20px;
	max-width: 1200px;
	margin: 0 auto;
}
.cn-wiki-page__sidebar[data-v-25a3d3cf] {
	flex: 0 0 240px;
	border-right: 1px solid var(--color-border);
	padding-right: 16px;
}
.cn-wiki-page__tree[data-v-25a3d3cf] {
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-wiki-page__main[data-v-25a3d3cf] {
	flex: 1 1 auto;
	min-width: 0;
}
.cn-wiki-page__header[data-v-25a3d3cf] {
	margin-bottom: 16px;
}
.cn-wiki-page__title[data-v-25a3d3cf] {
	font-size: 1.6em;
	margin: 0;
	color: var(--color-main-text);
}
.cn-wiki-page__body[data-v-25a3d3cf] {
	line-height: 1.7;
	color: var(--color-main-text);
}
.cn-wiki-page__body[data-v-25a3d3cf] h1,
.cn-wiki-page__body[data-v-25a3d3cf] h2,
.cn-wiki-page__body[data-v-25a3d3cf] h3 {
	color: var(--color-main-text);
	margin-top: 1.4em;
	margin-bottom: 0.5em;
}
.cn-wiki-page__body[data-v-25a3d3cf] p {
	margin: 0 0 1em;
}
.cn-wiki-page__body[data-v-25a3d3cf] code {
	background: var(--color-background-dark);
	padding: 2px 6px;
	border-radius: var(--border-radius);
	font-family: var(--font-face-monospace, monospace);
	font-size: 0.9em;
}
.cn-wiki-page__body[data-v-25a3d3cf] pre {
	background: var(--color-background-dark);
	padding: 12px;
	border-radius: var(--border-radius);
	overflow-x: auto;
}
.cn-wiki-page__body[data-v-25a3d3cf] pre code {
	background: transparent;
	padding: 0;
}
.cn-wiki-page__body[data-v-25a3d3cf] blockquote {
	border-left: 3px solid var(--color-border);
	padding-left: 12px;
	color: var(--color-text-lighter);
	margin: 0 0 1em;
}
.cn-wiki-page__body[data-v-25a3d3cf] table {
	border-collapse: collapse;
	margin: 0 0 1em;
}
.cn-wiki-page__body[data-v-25a3d3cf] th,
.cn-wiki-page__body[data-v-25a3d3cf] td {
	border: 1px solid var(--color-border);
	padding: 6px 10px;
}
.cn-wiki-page--has-sidebar .cn-wiki-page__main[data-v-25a3d3cf] {
	padding-left: 8px;
}


.cn-reports-page[data-v-41525752] {
	padding: 16px;
}
.cn-reports-page__title[data-v-41525752] {
	margin: 0 0 4px;
}
.cn-reports-page__description[data-v-41525752] {
	margin: 0 0 16px;
	color: var(--color-text-maxcontrast);
}
.cn-reports-page__filter[data-v-41525752] {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-bottom: 16px;
}
.cn-reports-page__filter-select[data-v-41525752] {
	min-width: 220px;
}
.cn-reports-page__grid[data-v-41525752] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: 12px;
	list-style: none;
	margin: 0;
	padding: 0;
}
.cn-reports-page__card[data-v-41525752] {
	display: flex;
	flex-direction: column;
	gap: 4px;
	height: 100%;
	padding: 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	color: inherit;
	text-decoration: none;
}
.cn-reports-page__card[data-v-41525752]:hover,
.cn-reports-page__card[data-v-41525752]:focus {
	background-color: var(--color-background-hover);
}
.cn-reports-page__card-title[data-v-41525752] {
	font-weight: bold;
}
.cn-reports-page__card-description[data-v-41525752],
.cn-reports-page__card-category[data-v-41525752] {
	color: var(--color-text-maxcontrast);
	font-size: 0.9em;
}
.cn-reports-page__empty[data-v-41525752] {
	color: var(--color-text-maxcontrast);
}


.cn-store-page[data-v-25c8171b] {
	padding: 16px;
	max-width: 1200px;
}
.cn-store-page__title[data-v-25c8171b] {
	margin: 0 0 4px;
}
.cn-store-page__intro[data-v-25c8171b] {
	color: var(--color-text-maxcontrast);
	margin: 0 0 16px;
}
.cn-store-page__controls[data-v-25c8171b] {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	align-items: flex-end;
	margin-bottom: 16px;
}
.cn-store-page__kinds[data-v-25c8171b] {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}
.cn-store-page__loading[data-v-25c8171b] {
	margin: 32px auto;
}
.cn-store-page__grid[data-v-25c8171b] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
	gap: 16px;
	list-style: none;
	padding: 0;
	margin: 16px 0 0;
}
.cn-store-page__card[data-v-25c8171b] {
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	background-color: var(--color-main-background);
	padding: 16px;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-store-page__card-title[data-v-25c8171b] {
	margin: 0;
	font-size: 1rem;
}
.cn-store-page__card-kind[data-v-25c8171b] {
	margin: 0;
	color: var(--color-text-maxcontrast);
	font-size: 0.85rem;
}
.cn-store-page__card-description[data-v-25c8171b] {
	margin: 0;
	flex: 1;
}
.cn-store-page__card-footer[data-v-25c8171b] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
}
.cn-store-page__card-version[data-v-25c8171b] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85rem;
}

/* Who published a configuration set matters more than its version does, since
   installing one applies somebody else's schemas and flows to this instance. */
.cn-store-page__card-publisher[data-v-25c8171b] {
	color: var(--color-text-maxcontrast);
	font-size: 0.85rem;
	margin-inline-end: auto;
}
.cn-store-page__builtin-title[data-v-25c8171b] {
	margin: 24px 0 0;
}


/* NcDialog supplies the padding and the heading (via `name`); this div keeps only
   the body's own column layout. */
.cn-page-config[data-v-9e9a9cf8] {
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-page-config__subtitle[data-v-9e9a9cf8] {
	margin: 0;
	font-size: 1em;
	font-weight: 600;
}
.cn-page-config__tabs[data-v-9e9a9cf8] {
	display: flex;
	gap: 4px;
	flex-wrap: wrap;
	border-bottom: 1px solid var(--color-border);
	padding-bottom: 8px;
}
.cn-page-config__section[data-v-9e9a9cf8] {
	display: flex;
	flex-direction: column;
	gap: 20px;
	min-height: 220px;
	max-height: 55vh;
	overflow-y: auto;
	/* room so the scrollbar + each field's floating notch-label don't clip */
	padding: 4px 4px 0;
}

/* One control + its description. The column layout keeps the hint directly under
   the input and the 20px section gap above keeps a following field's floating
   notch-label from overlapping the previous control. */
.cn-field[data-v-9e9a9cf8] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-field--section[data-v-9e9a9cf8] {
	gap: 2px;
}
.cn-field__label[data-v-9e9a9cf8] {
	font-weight: 500;
}
.cn-field__hint[data-v-9e9a9cf8] {
	margin: 0;
	font-size: 0.8em;
	line-height: 1.3;
	color: var(--color-text-maxcontrast);
}
.cn-page-config__row[data-v-9e9a9cf8] {
	display: flex;
	gap: 16px;
	align-items: flex-start;
}
.cn-page-config__row[data-v-9e9a9cf8] > * {
	flex: 1;
	min-width: 0;
}
.cn-page-config__field[data-v-9e9a9cf8] {
	min-width: 200px;
}
.cn-page-config__col-transform[data-v-9e9a9cf8] {
	display: grid;
	grid-template-columns: 120px 1fr 1fr;
	gap: 8px;
	align-items: center;
}
.cn-page-config__col-name[data-v-9e9a9cf8] {
	font-weight: 600;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.cn-page-config__hint[data-v-9e9a9cf8] {
	color: var(--color-text-maxcontrast);
}
.cn-page-config__json[data-v-9e9a9cf8] {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.cn-page-config__json-label[data-v-9e9a9cf8] {
	font-weight: 600;
}
.cn-page-config__json-input[data-v-9e9a9cf8] {
	width: 100%;
	font-family: monospace;
	font-size: 0.85em;
	border-radius: var(--border-radius);
	border: 2px solid var(--color-border-dark);
	background-color: var(--color-main-background);
	color: var(--color-main-text);
	padding: 6px 8px;
}
.cn-page-config__json-input--error[data-v-9e9a9cf8] {
	border-color: var(--color-error);
}
.cn-page-config__json-error[data-v-9e9a9cf8] {
	color: var(--color-error);
	font-size: 0.85em;
}

/* The footer row is NcDialog's `#actions` slot now. The page id still sits in it,
   pushed away from the Done button. */
.cn-page-config__id[data-v-9e9a9cf8] {
	margin-inline-end: auto;
	font-size: 0.85em;
	color: var(--color-text-maxcontrast);
}


.cn-dependency-missing {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: 100%;
	background: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-dependency-missing__inner {
	max-width: 600px;
	padding: calc(4 * var(--default-grid-baseline));
}
.cn-dependency-missing__heading {
	margin: 0 0 calc(2 * var(--default-grid-baseline));
	font-size: 1.5em;
}
.cn-dependency-missing__intro {
	margin: 0 0 calc(3 * var(--default-grid-baseline));
	color: var(--color-text-maxcontrast);
}
.cn-dependency-missing__list {
	margin: 0;
	padding: 0;
	list-style: none;
}
.cn-dependency-missing__item {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: calc(2 * var(--default-grid-baseline)) 0;
	border-bottom: 1px solid var(--color-border);
}
.cn-dependency-missing__item:last-child {
	border-bottom: 0;
}
.cn-dependency-missing__item-name {
	font-weight: bold;
}
.cn-dependency-missing__item-link {
	color: var(--color-primary-element);
	text-decoration: underline;
}
.cn-dependency-missing__item-action {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
	flex-wrap: wrap;
	justify-content: flex-end;
}
.cn-dependency-missing__item-error {
	color: var(--color-error);
}
.cn-dependency-missing__item-ask-admin {
	color: var(--color-text-maxcontrast);
	text-align: right;
}


.cn-unknown-widget[data-v-240cf479] {
	display: flex;
	align-items: center;
	gap: 8px;
	min-height: 48px;
	padding: 12px;
	border: 1px dashed var(--color-border-dark);
	border-radius: var(--border-radius-large, 12px);
	background: var(--color-background-hover);
	color: var(--color-text-maxcontrast);
}
.cn-unknown-widget__icon[data-v-240cf479] {
	flex: 0 0 auto;
	color: var(--color-warning, var(--color-text-maxcontrast));
}
.cn-unknown-widget__text[data-v-240cf479] {
	display: flex;
	flex-direction: column;
	min-width: 0;
}
.cn-unknown-widget__title[data-v-240cf479] {
	font-weight: 600;
}
.cn-unknown-widget__key[data-v-240cf479] {
	font-family: monospace;
	font-size: 0.85em;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}


.cn-widget-grid {
	width: 100%;
}
.cn-widget-grid--editing {
	min-height: 120px;
}
.cn-widget-grid--editing .grid-stack {
	background: transparent;
}
.cn-widget-grid--editing .grid-stack-item-content {
	overflow: hidden;
	background: var(--color-main-background);
}
.cn-widget-grid--editing .grid-stack-placeholder > .placeholder-content {
	background: var(--color-primary-element-light);
	border: 2px dashed var(--color-primary-element);
	border-radius: var(--border-radius-large);
}


.cn-page-renderer {
	display: contents;
}

/*
 * Toggle-clearance padding lives PER-COMPONENT on each page's HEADER
 * element (CnPageHeader, CnDashboardPage, CnDetailPage,
 * CnFeaturesAndRoadmapView, etc.). Earlier attempts at an abstract
 * fix here — first via `.cn-page-renderer > *` (PR #355, lost to
 * scoped-style specificity + shorthand overrides), then via a
 * `.cn-page-renderer__viewport` wrapper (PR #359, narrowed body
 * content unintentionally) — were rejected in favour of per-header
 * rules so body content keeps its full width.
 *
 * Custom pages MUST add `padding-inline-start: 56px` to their HEADER
 * element to clear the navigation toggle. See `docs/getting-started.md`.
 */

/*
 * Hook class applied when the current page's manifest entry has
 * `sidebar.show: false`. The library does not ship visual rules
 * here — consumer apps with style-driven sidebar layouts (e.g. CSS
 * grid where the host shell sibling sidebar is a grid track) can
 * target this class to collapse / hide the sibling element.
 *
 * The programmatic counterpart is the `cnPageSidebarVisible`
 * inject — `CnAppRoot` reads it to gate `<slot name="sidebar" />`.
 */
.cn-page-renderer--no-sidebar {
	/* intentionally empty — consumer-styled */
}

/* Builder empty-state: keep the edit button top-right (mirrors a page
   header's actions area) above a centred empty prompt. */
.cn-page-renderer__empty {
	padding-inline-start: 56px;
}
.cn-page-renderer__empty-actions {
	display: flex;
	justify-content: flex-end;
	padding: 8px 8px 0;
}


/*
 * The legacy `icon-*` classes in Nextcloud render a background-image
 * with a hardcoded dark fill, so they stay grey when an entry becomes
 * active (text turns white against the primary-element background).
 * Force the icon to white in the active state to match the label.
 * Only applies when the icon is provided via the `icon` prop (CSS
 * class) — items using a `<template #icon>` MDI component already
 * inherit `currentColor`.
 */
.app-navigation-entry.active .app-navigation-entry-icon[class*="icon-"] {
	filter: brightness(0) invert(1);
}

/*
 * Footer-section items (section: "footer") render in NcAppNavigation's
 * #footer slot, outside the scroll container, so they stay visible above
 * the settings foldout regardless of menu length. (The interim
 * `pinned`-prop approach kept them inside the scrollable list, where
 * `margin-top: auto` only bottom-pins while the list does not overflow —
 * long menus showed Documentation / Features & roadmap mid-scroll.)
 * The <ul> only resets list chrome and aligns with the 16px icon inset
 * of the main list; NC's own footer layout does the rest.
 *
 * As a direct `> ul` child of `.app-navigation__content`, NC's scoped rule
 * makes it a shrinkable, scrollable flex item (`overflow: hidden auto;
 * flex: 0 1 auto`). With a couple of footer entries that let the list be
 * squeezed a few pixels below its content and grow an unwanted scrollbar,
 * even on a short menu with plenty of room. Footer entries are few and must
 * always show in full, so opt out of shrinking and scrolling here.
 */
.cn-app-nav__footer-list {
	list-style: none;
	margin: 0;
	padding: 0;
	flex-shrink: 0 !important;
	overflow: visible !important;
}

/*
 * Align the settings foldout's items with the main/footer list items,
 * whose icons sit at a 16px inset. The foldout's items live in a bare
 * <ul> inside NcAppNavigationSettings' panel (`#app-settings`, padding
 * 3px), so without this they start ~5px further left and the icon
 * column looks ragged. (The native settings-toggle button sits ~1px
 * left of the 16px baseline, but NC owns that with an !important
 * shorthand — a sub-pixel difference we leave to the native component.)
 */
.cn-app-nav__settings-list {
	list-style: none;
	margin: 0;
	padding-inline-start: 5px;
}


.cn-app-loading {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: 100%;
	background: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-app-loading__inner {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
}
.cn-app-loading__logo {
	max-width: 96px;
	max-height: 96px;
}
.cn-app-loading__message {
	margin: 0;
	color: var(--color-text-maxcontrast);
	font-size: var(--default-font-size);
}


.cn-ai-history-list {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.cn-ai-history-list__search {
	padding: 0 16px;
}
.cn-ai-history-list__loading {
	display: flex;
	flex-direction: column;
	gap: 12px;
	align-items: center;
	justify-content: center;
	padding: 32px;
}
.cn-ai-history-list__items {
	display: flex;
	flex-direction: column;
	margin: 0;
	padding: 0;
	list-style: none;
}
.cn-ai-history-list__item {
	display: flex;
	align-items: stretch;
	border-bottom: 1px solid var(--color-border);
}
.cn-ai-history-list__item:last-child {
	border-bottom: none;
}
.cn-ai-history-list__item--active .cn-ai-history-list__item-button {
	background: var(--color-primary-element-light, rgba(var(--color-primary-rgb), 0.1));
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-ai-history-list__item-button {
	display: flex;
	flex: 1;
	flex-direction: column;
	gap: 2px;
	align-items: flex-start;
	min-width: 0;
	padding: 10px 16px;
	border: none;
	background: transparent;
	color: var(--color-main-text);
	text-align: left;
	cursor: pointer;
}
.cn-ai-history-list__item-button:hover,
.cn-ai-history-list__item-button:focus-visible {
	background: var(--color-background-hover);
	outline: 2px solid var(--color-primary-element);
	outline-offset: -2px;
}
.cn-ai-history-list__item-title {
	overflow: hidden;
	width: 100%;
	font-weight: 500;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.cn-ai-history-list__item-desc {
	overflow: hidden;
	width: 100%;
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.cn-ai-history-list__item-time {
	font-size: 0.8em;
	color: var(--color-text-maxcontrast);
}
.cn-ai-history-list__item-edit-btn {
	display: flex;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
	width: 36px;
	border: none;
	background: transparent;
	color: var(--color-text-maxcontrast);
	cursor: pointer;
}
.cn-ai-history-list__item-edit-btn:hover,
.cn-ai-history-list__item-edit-btn:focus-visible {
	color: var(--color-main-text);
	background: var(--color-background-hover);
}
.cn-ai-history-list__edit {
	display: flex;
	flex: 1;
	flex-direction: column;
	gap: 8px;
	padding: 10px 16px;
}
.cn-ai-history-list__edit-actions {
	display: flex;
	gap: 8px;
}


.cn-ai-input {
	display: flex;
	flex-direction: column;
	gap: 6px;
	padding: 8px 12px;
	border-top: 1px solid var(--color-border);
}
.cn-ai-input__error {
	margin: 0;
}
.cn-ai-input__chips {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.cn-ai-input__chip {
	display: flex;
	align-items: center;
	gap: 4px;
	max-width: 220px;
	padding: 4px 8px;
	border-radius: var(--border-radius-pill, 16px);
	background: var(--color-background-hover);
	font-size: 13px;
}
.cn-ai-input__chip-icon {
	flex-shrink: 0;
	opacity: 0.7;
}
.cn-ai-input__chip-name {
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.cn-ai-input__chip-remove {
	display: flex;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
	padding: 0;
	border: none;
	background: transparent;
	color: inherit;
	cursor: pointer;
	opacity: 0.7;
}

/* `:focus-visible` and `:disabled` are declared BEFORE the compound
   `:hover:not(:disabled)` rule: stylelint's no-descending-specificity wants
   lower-specificity selectors first, and `:hover:not(:disabled)` outranks
   both. Ordering only — the cascade result is unchanged. */
.cn-ai-input__chip-remove:focus-visible {
	opacity: 1;
}
.cn-ai-input__chip-remove:disabled {
	cursor: not-allowed;
}
.cn-ai-input__chip-remove:hover:not(:disabled) {
	opacity: 1;
}
.cn-ai-input__row {
	display: flex;
	gap: 8px;
	align-items: flex-end;
}
.cn-ai-input__file-input {
	display: none;
}

/* Mic matches the paperclip exactly — they are peers in the row, and any
   difference in size or weight would read as one being the primary action. */
.cn-ai-input__mic-button {
	display: flex;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	cursor: pointer;
}

/* Declared BEFORE the hover rule below, which is more specific
   (`:hover:not(:disabled)`). Source order has to follow specificity here or the
   cascade's outcome depends on which rule happens to be written last — the
   thing `no-descending-specificity` exists to stop. */
.cn-ai-input__mic-button:disabled {
	opacity: .5;
	cursor: default;
}
.cn-ai-input__mic-button:hover:not(:disabled) {
	background: var(--color-background-hover);
}

/* Recording is a STATE, not a hover: it stays visible while the user speaks and
   looks away from the button. Error colour because it is the "something is
   live" signal, and the icon fills in beside it — it does NOT swap to a
   struck-through mic, which is what this comment used to describe and what made
   a listening composer look muted. */
.cn-ai-input__mic-button--recording {
	border-color: var(--color-error);
	background: var(--color-error);
	color: var(--color-primary-text, #fff);
}

/* 🔴 THE BLOCKED LOOK THE COMMENT ABOVE THE BUTTON ALREADY PROMISED.
   `cn-ai-input__mic-button--blocked` was bound in the template and styled
   NOWHERE, so a microphone that cannot run — an agent pinned to the private
   engine while the speech service is down, or a browser with no recognition —
   looked exactly like a working one until you hovered it for the tooltip. A
   class set and never read is a comment, not a state.

   ⚠️ Muted rather than `disabled`, and NOT `pointer-events: none`. The button
   deliberately keeps a live click handler: a natively disabled control
   suppresses hover, so its `title` can never appear and it refuses without ever
   saying why. It must stay clickable in order to explain itself. */
.cn-ai-input__mic-button--blocked {
	opacity: .5;
	cursor: not-allowed;
}

/* The conversation control sits beside the mic and matches it in weight —
   neither is the primary action, and a bigger one would suggest the hands-free
   mode is the normal way to use the composer rather than a deliberate choice. */
.cn-ai-input__converse-button {
	display: flex;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	cursor: pointer;
}
.cn-ai-input__converse-button:disabled {
	opacity: .5;
	cursor: default;
}
.cn-ai-input__converse-button:hover:not(:disabled) {
	background: var(--color-background-hover);
}

/* Primary rather than error colour: a live conversation is a mode the user is
   in, not a recording warning — the microphone beside it carries that. */
.cn-ai-input__converse-button--active {
	border-color: var(--color-primary-element);
	background: var(--color-primary-element);
	color: var(--color-primary-element-text, #fff);
}
.cn-ai-input__attach-button {
	display: flex;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	padding: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	cursor: pointer;
}
.cn-ai-input__attach-button:hover:not(:disabled) {
	background: var(--color-background-hover);
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-ai-input__attach-button:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-ai-input__attach-button:disabled {
	opacity: 0.6;
	cursor: not-allowed;
}
.cn-ai-input__textarea {
	flex: 1;
	min-height: 36px;
	max-height: calc(6 * 1.5em + 24px);
	padding: 8px;
	resize: none;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	font-family: inherit;
	font-size: inherit;
	line-height: 1.5;
	overflow-y: auto;
}
.cn-ai-input__textarea:focus {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 0;
	border-color: var(--color-primary-element);
}
.cn-ai-input__textarea:disabled {
	opacity: 0.6;
	cursor: not-allowed;
}
.cn-ai-input__send-button {
	display: flex;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	padding: 0;
	border: none;
	border-radius: var(--border-radius);
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
	cursor: pointer;
}
.cn-ai-input__send-button:hover:not(:disabled) {
	background: var(--color-primary-element-hover, var(--color-primary-element));
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-ai-input__send-button:focus-visible {
	outline: 2px solid var(--color-primary-element);
	outline-offset: 2px;
}

/* stylelint-disable-next-line no-descending-specificity */
.cn-ai-input__send-button:disabled {
	opacity: 0.6;
	cursor: not-allowed;
}


.cn-ai-message-list {
	display: flex;
	flex: 1;
	flex-direction: column;
	gap: 8px;
	padding: 12px;
	overflow-y: auto;
}
.cn-ai-message-list__empty {
	display: flex;
	flex: 1;
	align-items: center;
	justify-content: center;
}

/* Message item layout */
.cn-ai-message-list__item {
	display: flex;
}
.cn-ai-message-list__item--user {
	justify-content: flex-end;
}
.cn-ai-message-list__item--assistant {
	justify-content: flex-start;
}
.cn-ai-message-list__item--system {
	justify-content: center;
}

/* Bubbles */
.cn-ai-message-list__bubble {
	max-width: 80%;
	padding: 8px 12px;
	border-radius: var(--border-radius-large, 12px);
	overflow-wrap: anywhere;
}
.cn-ai-message-list__bubble--user {
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
}
.cn-ai-message-list__bubble--assistant {
	background: var(--color-background-hover);
	color: var(--color-main-text);
}
.cn-ai-message-list__user-text {
	white-space: pre-wrap;
}
.cn-ai-message-list__system-text {
	padding: 4px 8px;
	border-radius: var(--border-radius);
	background: var(--color-background-dark);
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
}

/* Tool call entries */
.cn-ai-message-list__tool {
	margin-top: 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	overflow: hidden;
}
.cn-ai-message-list__tool--error {
	border-color: var(--color-error);
}
.cn-ai-message-list__tool-summary {
	display: flex;
	align-items: center;
	gap: 4px;
	width: 100%;
	padding: 4px 8px;
	border: none;
	background: var(--color-background-hover);
	color: var(--color-main-text);
	font-size: 0.85em;
	text-align: left;
	cursor: pointer;
}
.cn-ai-message-list__tool--error .cn-ai-message-list__tool-summary {
	background: var(--color-error-rgb, rgba(220, 53, 69, 0.1));
	color: var(--color-error);
}
.cn-ai-message-list__tool-chevron {
	transition: transform 0.15s ease;
}
.cn-ai-message-list__tool-chevron--open {
	transform: rotate(180deg);
}
@media (prefers-reduced-motion: reduce) {
.cn-ai-message-list__tool-chevron {
		transition: none;
}
}
.cn-ai-message-list__tool-detail {
	padding: 8px;
	background: var(--color-main-background);
}
.cn-ai-message-list__tool-json {
	margin: 0;
	font-size: 0.8em;
	white-space: pre-wrap;
	word-break: break-all;
}

/* Thinking placeholder — animated dots */
.cn-ai-message-list__bubble--thinking {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	color: var(--color-text-maxcontrast);
	font-style: italic;
}
.cn-ai-message-list__thinking-text {
	user-select: none;
}
.cn-ai-message-list__thinking-dots {
	display: inline-flex;
	gap: 2px;
	margin-left: 2px;
}
.cn-ai-message-list__thinking-dot {
	display: inline-block;
	width: 5px;
	height: 5px;
	border-radius: 50%;
	background: currentColor;
	opacity: 0.3;
	animation: cn-ai-thinking-bounce 1.2s ease-in-out infinite;
}
.cn-ai-message-list__thinking-dot:nth-child(2) {
	animation-delay: 0.15s;
}
.cn-ai-message-list__thinking-dot:nth-child(3) {
	animation-delay: 0.30s;
}
@keyframes cn-ai-thinking-bounce {
0%, 80%, 100% {
		opacity: 0.3;
		transform: translateY(0);
}
40% {
		opacity: 1;
		transform: translateY(-3px);
}
}
@media (prefers-reduced-motion: reduce) {
.cn-ai-message-list__thinking-dot {
		animation: cn-ai-thinking-fade 1.4s ease-in-out infinite;
		transform: none;
}
@keyframes cn-ai-thinking-fade {
0%, 100% { opacity: 0.3;
}
50%      { opacity: 1;
}
}
}


/* The window itself. Fixed, anchored to the same corner as the launcher hex,
   and sized to sit comfortably on a laptop viewport without covering the
   host application it is a guest on.

   `!important` is deliberate and matches CnAiFloatingButton's reasoning: this
   markup lands inside third-party apps whose stylesheets we do not control. */
.cn-ai-chat-window {
	position: fixed !important;
	z-index: 9001 !important; /* above the launcher hex (9000) */
	display: flex !important;
	flex-direction: column !important;
	width: 380px;
	max-width: calc(100vw - 32px);
	height: 600px;
	max-height: calc(100vh - 160px);
	/* NOT `overflow: hidden` — the pointer below is drawn outside this box and
	   would be clipped away. The rounded corners are held by the titlebar and
	   input rows clipping their own ends instead. */
	border: 1px solid var(--color-border, #d0d0d0);
	border-radius: 12px;
	background: var(--color-background-hover, #f5f5f5);
	box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);

	/* ⚠️ THE POINTER IS AIMED AT THE HEX, and this number is the only thing
	   keeping it there. The hex is 36px wide at a 56px inset, so its centre is
	   56 + 18 = 74px from the viewport edge. The window sits at a 44px inset, so
	   the pointer's centre must be 74 - 44 = 30px in from the window's edge; the
	   triangle is 22px wide, so its leading edge is 30 - 11 = 19px.

	   Change the hex size, the hex inset, or the window inset and this is wrong
	   — the arrow points at empty space beside the button, which reads as a
	   rendering bug rather than a measurement one. */
	--cn-ai-pointer-offset: 19px;
}

/* Anchored ABOVE the hex and inboard of it.
 *
 * The hex sits at a 56px inset (see CnAiFloatingButton) to clear the host
 * application's own bottom-right chrome — an office editor puts a zoom control
 * and a status bar exactly there. The window clears the hex itself: 56px inset
 * + 30px tall + 14px for the pointer + breathing room = 108px.
 *
 * The pointer offset these lean on is declared with the rest of the window's
 * own properties above, not repeated here — a second `.cn-ai-chat-window` block
 * is a duplicate selector, and the two halves drift the moment someone edits the
 * one they happen to find first. */
.cn-ai-chat-window--bottom-right {
	right: 44px;
	bottom: 108px;
}
.cn-ai-chat-window--bottom-left {
	left: 44px;
	bottom: 108px;
}
.cn-ai-chat-window--top-right {
	top: 108px;
	right: 44px;
}
.cn-ai-chat-window--top-left {
	top: 108px;
	left: 44px;
}

/* The pointer: a white triangle under the window, aimed at the hex, so the
   window reads as speech FROM the launcher rather than as an unrelated panel
   that happened to appear. Built from two stacked triangles — the lower one is
   the border colour and sits 1px further down, which is what gives the visible
   1px edge along the two diagonals. `overflow: hidden` on the window would clip
   these, which is why the window does not use it. */
.cn-ai-chat-window--bottom-right::after,
.cn-ai-chat-window--bottom-left::after,
.cn-ai-chat-window--bottom-right::before,
.cn-ai-chat-window--bottom-left::before {
	position: absolute;
	top: 100%;
	width: 0;
	height: 0;
	content: '';
	border-right: 11px solid transparent;
	border-left: 11px solid transparent;
}

/* Border layer, 1px lower and 1px wider than the fill. */
.cn-ai-chat-window--bottom-right::before,
.cn-ai-chat-window--bottom-left::before {
	border-top: 12px solid var(--color-border, #d0d0d0);
}

/* Fill layer, in the titlebar's white so the pointer belongs to the chrome. */
.cn-ai-chat-window--bottom-right::after,
.cn-ai-chat-window--bottom-left::after {
	margin-top: -1px;
	border-top: 12px solid var(--color-main-background, #ffffff);
}
.cn-ai-chat-window--bottom-right::before,
.cn-ai-chat-window--bottom-right::after {
	right: var(--cn-ai-pointer-offset);
}
.cn-ai-chat-window--bottom-left::before,
.cn-ai-chat-window--bottom-left::after {
	left: var(--cn-ai-pointer-offset);
}

/* White titlebar over the light-grey body — the one contrast that tells a
   guest window's chrome apart from its content. */
.cn-ai-chat-window__titlebar {
	display: flex;
	flex: 0 0 auto;
	align-items: center;
	gap: 8px;
	padding: 4px 8px;
	border-bottom: 1px solid var(--color-border, #d0d0d0);
	/* Clips its own top corners, since the window can no longer use
	   `overflow: hidden` (it would eat the pointer). */
	border-radius: 11px 11px 0 0;
	background: var(--color-main-background, #ffffff);
}
.cn-ai-chat-window__controls {
	display: flex;
	flex: 0 0 auto;
	align-items: center;
	gap: 2px;
}

/* The agent's identity, after the controls. `min-width: 0` + ellipsis so a
   long agent name shortens instead of pushing the controls off the edge. */
.cn-ai-chat-window__identity {
	display: flex;
	flex: 1 1 auto;
	gap: 6px;
	align-items: center;
	min-width: 0;
}
.cn-ai-chat-window__identity-icon {
	flex: 0 0 auto;
	color: var(--color-primary-element, #21468b);
}
.cn-ai-chat-window__identity-name {
	overflow: hidden;
	font-weight: 600;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.cn-ai-chat-window__body {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	min-height: 0; /* allow flex children to shrink past their content size */
}
.cn-ai-chat-window__body--history {
	overflow-y: auto;
	padding: 8px;
}
.cn-ai-chat-window__messages {
	flex: 1 1 auto;
	min-height: 0;
	overflow-y: auto;
	padding: 8px;
}

/* Approvals sit between the transcript and the composer: the last thing read
   before the box you would otherwise type into, which is where a blocked
   agent's request belongs. */
.cn-ai-chat-window__approvals {
	display: flex;
	flex-direction: column;
	gap: 8px;
	margin: 0;
	padding: 8px 12px 0;
	list-style: none;
}
.cn-ai-approval {
	padding: 10px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 12px);
	background: var(--color-main-background);
}
.cn-ai-approval__head {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-ai-approval__title {
	flex: 1;
	font-weight: 600;
	overflow-wrap: anywhere;
}

/* The reach is the fact the decision rests on, so it reads as a label rather
   than as part of the agent's prose. */
.cn-ai-approval__reach {
	flex-shrink: 0;
	padding: 1px 8px;
	border-radius: 12px;
	background: var(--color-background-dark);
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: .04em;
}
.cn-ai-approval__reason {
	margin: 6px 0 0;
	color: var(--color-text-maxcontrast);
	font-size: 13px;
}
.cn-ai-approval__actions {
	display: flex;
	gap: 8px;
	margin-top: 10px;
}
.cn-ai-chat-window__input {
	flex: 0 0 auto;
	padding: 8px;
	border-top: 1px solid var(--color-border, #d0d0d0);
	/* Mirrors the titlebar: clips its own bottom corners. */
	border-radius: 0 0 11px 11px;
	background: var(--color-main-background, #ffffff);
}

/* ── The pop animation ──────────────────────────────────────────────────────
 *
 * Scale + fade, with `transform-origin` at the corner the hex sits under, so the
 * window converges on the launcher. 0.14 rather than 0 as the start scale: a
 * true zero briefly renders a 0x0 box that some engines treat as invisible for
 * hit-testing, and the tiny non-zero keeps the transition interruptible if the
 * user toggles the hex twice quickly.
 *
 * Leave is faster than enter (140ms vs 180ms) — dismissal should feel immediate,
 * while appearance can afford to be seen. */
.cn-ai-chat-window-pop-bottom-right-enter-active,
.cn-ai-chat-window-pop-bottom-left-enter-active,
.cn-ai-chat-window-pop-top-right-enter-active,
.cn-ai-chat-window-pop-top-left-enter-active {
	transition: transform 0.18s cubic-bezier(0.2, 0.9, 0.3, 1.2), opacity 0.14s ease-out;
}
.cn-ai-chat-window-pop-bottom-right-leave-active,
.cn-ai-chat-window-pop-bottom-left-leave-active,
.cn-ai-chat-window-pop-top-right-leave-active,
.cn-ai-chat-window-pop-top-left-leave-active {
	transition: transform 0.14s ease-in, opacity 0.12s ease-in;
}
.cn-ai-chat-window-pop-bottom-right-enter,
.cn-ai-chat-window-pop-bottom-right-enter-from,
.cn-ai-chat-window-pop-bottom-right-leave-to {
	transform: scale(0.14);
	transform-origin: calc(100% - var(--cn-ai-pointer-offset) - 11px) 100%;
	opacity: 0;
}
.cn-ai-chat-window-pop-bottom-left-enter,
.cn-ai-chat-window-pop-bottom-left-enter-from,
.cn-ai-chat-window-pop-bottom-left-leave-to {
	transform: scale(0.14);
	transform-origin: calc(var(--cn-ai-pointer-offset) + 11px) 100%;
	opacity: 0;
}
.cn-ai-chat-window-pop-top-right-enter,
.cn-ai-chat-window-pop-top-right-enter-from,
.cn-ai-chat-window-pop-top-right-leave-to {
	transform: scale(0.14);
	transform-origin: calc(100% - var(--cn-ai-pointer-offset) - 11px) 0%;
	opacity: 0;
}
.cn-ai-chat-window-pop-top-left-enter,
.cn-ai-chat-window-pop-top-left-enter-from,
.cn-ai-chat-window-pop-top-left-leave-to {
	transform: scale(0.14);
	transform-origin: calc(var(--cn-ai-pointer-offset) + 11px) 0%;
	opacity: 0;
}

/* Someone who asked not to be moved gets the window without the flight. */
@media (prefers-reduced-motion: reduce) {
.cn-ai-chat-window-pop-bottom-right-enter-active,
	.cn-ai-chat-window-pop-bottom-left-enter-active,
	.cn-ai-chat-window-pop-top-right-enter-active,
	.cn-ai-chat-window-pop-top-left-enter-active,
	.cn-ai-chat-window-pop-bottom-right-leave-active,
	.cn-ai-chat-window-pop-bottom-left-leave-active,
	.cn-ai-chat-window-pop-top-right-leave-active,
	.cn-ai-chat-window-pop-top-left-leave-active {
		transition: opacity 0.1s linear;
}
.cn-ai-chat-window-pop-bottom-right-enter,
	.cn-ai-chat-window-pop-bottom-left-enter,
	.cn-ai-chat-window-pop-top-right-enter,
	.cn-ai-chat-window-pop-top-left-enter,
	.cn-ai-chat-window-pop-bottom-right-leave-to,
	.cn-ai-chat-window-pop-bottom-left-leave-to,
	.cn-ai-chat-window-pop-top-right-leave-to,
	.cn-ai-chat-window-pop-top-left-leave-to {
		transform: none;
}
}

/* Empty state: just the agent's name and the prompt. The agent picker and the
   recent-sessions list used to live here and now live in the titlebar menus —
   on a 380px window they filled the first screen before any message did. */
.cn-ai-chat-window__start {
	display: flex;
	flex-direction: column;
	align-self: stretch;
	gap: 16px;
	width: 100%;
	margin: 0 auto;
	padding: 0 12px;
}


/* ⚠️ THE SELECTOR IS DOUBLED ON PURPOSE — `.x.x` is not a typo.
 *
 * `!important` is not enough here, and this was measured. Every app that bundles
 * this library also ships its CSS entry, which contains its own
 * `.cn-ai-floating-button { … !important }` block. On a Nextcloud page the
 * companion shares the DOM with those apps: on the Euro-Office editor the page
 * carried stylesheets injected by decidesk, openconnector, openregister and
 * spreed as well as hermiq. Between two rules of EQUAL specificity that are both
 * `!important`, the LAST one injected wins — and load order across four
 * independent apps is not something this component can control.
 *
 * Measured symptom: the hex rendered 52x60 (the old size) with the new 26x30
 * rule present and losing, because another app's copy of the library CSS was
 * injected later.
 *
 * Doubling the class raises specificity (0,2,0 vs 0,1,0) so this rule wins on
 * merit rather than on ordering, whichever app's stylesheet lands last. */
.cn-ai-floating-button.cn-ai-floating-button {
	/* !important blocks defeat NC's default button styles + the older
	   bundled CSS rule that webpack ships alongside this one. */
	position: fixed !important;
	z-index: 9000 !important;
	display: flex !important;
	align-items: center !important;
	justify-content: center !important;
	/* 52:60 ≈ √3:2 — the exact ratio that makes every side of the pointy-top
	   hexagon polygon below equal length. The RATIO is the part that must not
	   drift: change both numbers together or the hexagon stops being
	   equilateral while still rendering, which is the failure nobody notices.

	   ⚠️ THE SIZE IS LOAD-BEARING FOR THE WINDOW'S POINTER. CnAiChatPanel aims
	   its triangle at this hex by arithmetic (see the inset block below and
	   `--cn-ai-pointer-offset` there). Resize here without redoing that and the
	   arrow points at empty space. */
	width: 52px !important;
	height: 60px !important;
	/* ⚠️ min-height/min-width MUST be cleared, or `height` is a suggestion.
	   Nextcloud's own button styling sets `min-height: 34px`, which silently
	   won against an explicit `height` — measured: the hex rendered 26x34, the
	   right width and the wrong height, which is exactly the shape that breaks
	   the √3:2 hexagon while looking almost correct. */
	min-width: 0 !important;
	min-height: 0 !important;
	padding: 0 !important;
	margin: 0 !important;
	border: none !important;
	border-radius: 0 !important;
	background: transparent !important;
	box-shadow: none !important;
	color: #ffffff;
	cursor: pointer;
	transition: transform 0.15s ease, filter 0.15s ease;
}

/* The hex shape itself — equilateral pointy-top per Conduction brand rules.
   All six sides equal length only when the parent's width:height is √3:2 (set above).
   Doubled selector for the same reason as the block above: another consumer's
   copy of this library's CSS is `!important` too, and may be injected later. */
.cn-ai-floating-button__hex.cn-ai-floating-button__hex {
	display: flex !important;
	align-items: center !important;
	justify-content: center !important;
	width: 100% !important;
	height: 100% !important;
	background: #21468B !important; /* Conduction Cobalt — identity.conduction.nl/colors */
	clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%) !important;
	border-radius: 0 !important;
	filter: drop-shadow(0 4px 10px rgba(0, 0, 0, 0.25));
	transition: background 0.15s ease;
}
.cn-ai-floating-button__icon {
	color: #ffffff;
	line-height: 1;
}
.cn-ai-floating-button:hover .cn-ai-floating-button__hex,
.cn-ai-floating-button:focus-visible .cn-ai-floating-button__hex {
	background: #1a3670; /* Conduction Cobalt, darkened for hover */
}
.cn-ai-floating-button:hover,
.cn-ai-floating-button:focus-visible {
	transform: scale(1.08);
}
.cn-ai-floating-button:focus-visible {
	outline: none;
}
.cn-ai-floating-button:focus-visible .cn-ai-floating-button__hex {
	filter:
		drop-shadow(0 4px 10px rgba(0, 0, 0, 0.25))
		drop-shadow(0 0 0 3px rgba(67, 118, 252, 0.5));
}

/* Position variants — the insets are DERIVED, not chosen.
 *
 * The hex's point must touch the tip of the window's pointer, so the two are
 * solved together:
 *
 *   vertical   window sits 108px up; its triangle hangs 12px below it, so the
 *              tip is at 108 - 12 = 96px. The hex is 60px tall, so its bottom
 *              must be at 96 - 60 = 36px for its point to meet that tip.
 *   horizontal the triangle's centre is 74px in (window inset 44 + pointer
 *              offset 19 + half of its 22px width). The hex is 52px wide, so its
 *              inset must be 74 - 26 = 48px for the two centres to line up.
 *
 * ⚠️ Change the hex size, the window inset, or `--cn-ai-pointer-offset` in
 * CnAiChatPanel, and all of these numbers move together. They are one geometry
 * expressed in two files.
 *
 * Selectors doubled for the same reason as the base rule above — a consumer's
 * bundled copy of this library's CSS carries the old 24px insets and may be
 * injected later. Measured: the hex sat at 24px with these rules present and
 * losing. */
.cn-ai-floating-button--bottom-right.cn-ai-floating-button--bottom-right {
	right: 48px !important;
	bottom: 36px !important;
}
.cn-ai-floating-button--bottom-left.cn-ai-floating-button--bottom-left {
	bottom: 36px !important;
	left: 48px !important;
}
.cn-ai-floating-button--top-right.cn-ai-floating-button--top-right {
	top: 36px !important;
	right: 48px !important;
}
.cn-ai-floating-button--top-left.cn-ai-floating-button--top-left {
	top: 36px !important;
	left: 48px !important;
}

/* Respect reduced-motion preference */
@media (prefers-reduced-motion: reduce) {
.cn-ai-floating-button,
	.cn-ai-floating-button__hex {
		transition: none;
}
.cn-ai-floating-button:hover,
	.cn-ai-floating-button:focus-visible {
		transform: none;
}
}


.cn-ai-companion {
	/*
	 * display: contents removes this wrapper from the layout tree so the
	 * embedded NcAppSidebar inherits NcContent as its flex parent — required
	 * for the sidebar to slide in from the RIGHT edge. The FAB is itself
	 * position:fixed so it positions independently of the wrapper's box.
	 *
	 * !important is intentional: webpack pulls in BOTH the old (position:
	 * fixed) and new (display: contents) rules from the package's CJS and
	 * ESM builds; without !important the old rule wins the cascade and the
	 * sidebar renders at the left.
	 */
	display: contents !important;
	position: static !important;
}


.cn-notif-prefs__intro[data-v-72cc0056] {
	margin-bottom: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-notif-prefs__group[data-v-72cc0056] {
	margin-bottom: 20px;
}
.cn-notif-prefs__group-title[data-v-72cc0056] {
	margin: 8px 0 8px;
	font-weight: bold;
}
.cn-notif-prefs__grid[data-v-72cc0056] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: 8px;
}
.cn-notif-prefs__card[data-v-72cc0056] {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 4px;
	padding: 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large);
	background-color: var(--color-background-hover);
}


.cn-support-dialog__body[data-v-04246fe9] {
	/* Bottom padding restores the breathing room the NcDialog actions slot
	   used to provide — the CTAs now live in the body, so without it the
	   bottom row sits flush against the dialog edge. */
	padding: 0 4px 12px;
}
.cn-support-dialog__paragraph[data-v-04246fe9] {
	margin: 0 0 8px 0;
	line-height: 1.45;
	color: var(--color-main-text);
}
.cn-support-dialog__link[data-v-04246fe9] {
	color: var(--color-primary-element);
	text-decoration: underline;
}
.cn-support-dialog__signature[data-v-04246fe9] {
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: 12px;
	margin-top: 4px;
}
.cn-support-dialog__avatar-link[data-v-04246fe9] {
	flex: 0 0 auto;
	display: inline-flex;
	border-radius: 50%;
}
.cn-support-dialog__avatar[data-v-04246fe9] {
	width: 48px;
	height: 48px;
	border-radius: 50%;
	object-fit: cover;
	display: block;
}
.cn-support-dialog__signature-text[data-v-04246fe9] {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 2px;
}
.cn-support-dialog__signature-name[data-v-04246fe9] {
	font-family: 'Caveat', 'Brush Script MT', 'Lucida Handwriting', cursive;
	font-size: 26px;
	line-height: 1;
	color: var(--color-main-text);
}
.cn-support-dialog__signature-title[data-v-04246fe9] {
	font-size: 13px;
	color: var(--color-text-maxcontrast);
}
.cn-support-dialog__actions[data-v-04246fe9] {
	display: grid;
	grid-template-columns: 1fr 1fr;
	column-gap: 8px;
	row-gap: 8px;
	align-items: stretch;
	margin-top: 10px;
}

/* Normalise per-button margins so the grid gap is the only spacing —
   NcButton ships its own margins that otherwise make the rows look uneven. */
.cn-support-dialog__actions[data-v-04246fe9] > * {
	margin: 0;
	width: 100%;
}
@media (max-width: 480px) {
.cn-support-dialog__actions[data-v-04246fe9] {
		grid-template-columns: 1fr;
}
}


.cn-tenant-badge[data-v-9e59eb26] {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 2px 8px;
	border-radius: 12px;
	background: var(--color-background-hover, rgba(127, 127, 127, 0.12));
	color: var(--color-main-text, inherit);
	font-size: 12px;
	line-height: 1.25;
	max-width: 220px;
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	cursor: default;
}
.cn-tenant-badge--md[data-v-9e59eb26] {
	font-size: 14px;
	padding: 4px 12px;
}
.cn-tenant-badge__icon[data-v-9e59eb26] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 18px;
	height: 18px;
	border-radius: 50%;
	color: #fff;
	font-size: 11px;
	font-weight: 600;
	flex: 0 0 auto;
}
.cn-tenant-badge--md .cn-tenant-badge__icon[data-v-9e59eb26] {
	width: 22px;
	height: 22px;
	font-size: 12px;
}
.cn-tenant-badge__name[data-v-9e59eb26] {
	overflow: hidden;
	text-overflow: ellipsis;
}


.cn-app-root__capabilities-loading {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: 100vh;
	background: var(--color-main-background);
}
.cn-app-root__or-missing {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: 100vh;
	background: var(--color-main-background);
	color: var(--color-main-text);
}
.cn-app-root__or-missing-action {
	display: inline-block;
	padding: calc(1.5 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline));
	border-radius: var(--border-radius);
	background: var(--color-primary-element);
	color: var(--color-primary-element-text);
	text-decoration: none;
}
.cn-app-root__or-missing-action:hover,
.cn-app-root__or-missing-action:focus {
	background: var(--color-primary-element-hover);
	text-decoration: underline;
}
.cn-app-root__walkthrough-hint {
	margin-bottom: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-app-root__integrations-hint {
	margin-bottom: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-app-root__integrations {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: calc(0.5 * var(--default-grid-baseline));
	margin: 0;
	padding: 0;
	list-style: none;
}
.cn-app-root__or-missing-error {
	margin: calc(2 * var(--default-grid-baseline)) 0 calc(1 * var(--default-grid-baseline));
	color: var(--color-error);
}
.cn-app-root__or-missing-ask-admin {
	color: var(--color-text-maxcontrast);
}
.cn-app-root__soft-dep {
	margin: calc(2 * var(--default-grid-baseline));
}
.cn-app-root__soft-dep-body {
	display: flex;
	flex-direction: column;
	gap: var(--default-grid-baseline);
}
.cn-app-root__soft-dep-actions {
	display: flex;
	align-items: center;
	gap: calc(2 * var(--default-grid-baseline));
	flex-wrap: wrap;
}
.cn-app-root__soft-dep-ask-admin {
	color: var(--color-text-maxcontrast);
}
.cn-app-root__soft-dep-error {
	margin: 0;
	color: var(--color-error);
}


.cn-features-and-roadmap-sidebar[data-v-377904ef] {
	background: var(--color-main-background);
	border-left: 1px solid var(--color-border);
	height: 100%;
	overflow-y: auto;
}
.cn-features-and-roadmap-sidebar__header[data-v-377904ef] {
	padding: 16px;
	border-bottom: 1px solid var(--color-border);
	background: var(--color-background-hover);
}
.cn-features-and-roadmap-sidebar__name[data-v-377904ef] {
	margin: 0;
	font-size: 1.1em;
	color: var(--color-main-text);
}
.cn-features-and-roadmap-sidebar__subname[data-v-377904ef] {
	margin: 4px 0 0 0;
	font-size: 0.85em;
	color: var(--color-text-light);
}
.cn-features-and-roadmap-sidebar__section[data-v-377904ef] {
	padding: 16px;
	border-bottom: 1px solid var(--color-border);
}
.cn-features-and-roadmap-sidebar__section[data-v-377904ef]:last-child {
	border-bottom: 0;
}
.cn-features-and-roadmap-sidebar__section-title[data-v-377904ef] {
	margin: 0 0 8px 0;
	font-size: 1em;
	color: var(--color-main-text);
}
.cn-features-and-roadmap-sidebar__section-body[data-v-377904ef] {
	margin: 0 0 12px 0;
	font-size: 0.95em;
	line-height: 1.5;
	color: var(--color-text-light);
}
.cn-features-and-roadmap-sidebar__link[data-v-377904ef] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	color: var(--color-primary-element);
	text-decoration: none;
	font-size: 0.95em;
	background: transparent;
	border: 0;
	padding: 0;
	cursor: pointer;
	font-family: inherit;
}
.cn-features-and-roadmap-sidebar__link[data-v-377904ef]:hover {
	text-decoration: underline;
}


.cn-features-tab__grid[data-v-3737d32b] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
	gap: 16px;
}
.cn-features-tab__card[data-v-3737d32b] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 16px;
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 12px);
	transition: border-color 120ms ease, box-shadow 120ms ease;
}
.cn-features-tab__card[data-v-3737d32b]:hover {
	border-color: var(--color-primary-element);
	box-shadow: 0 2px 8px var(--color-box-shadow, rgba(0, 0, 0, 0.08));
}
.cn-features-tab__title[data-v-3737d32b] {
	margin: 0;
	font-size: 1.05em;
	color: var(--color-main-text);
}
.cn-features-tab__summary[data-v-3737d32b] {
	margin: 0;
	color: var(--color-text-light);
	font-size: 0.95em;
	line-height: 1.4;
	flex: 1;
}
.cn-features-tab__link[data-v-3737d32b] {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	color: var(--color-primary-element);
	text-decoration: none;
	font-size: 0.9em;
	margin-top: auto;
}
.cn-features-tab__link[data-v-3737d32b]:hover {
	text-decoration: underline;
}


.cn-roadmap-item[data-v-601f9299] {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 16px;
	/* Position anchor for the ::after overlay that expands the title link's
	   click area to the whole card. Inner anchors stay above the overlay
	   via z-index: 2 so the body's inline links still work. */
	position: relative;
}
.cn-roadmap-item__title-link[data-v-601f9299]::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	border-radius: inherit;
}
.cn-roadmap-item__body[data-v-601f9299] a,
.cn-roadmap-item__labels[data-v-601f9299] {
	position: relative;
	z-index: 2;
}
.cn-roadmap-item__header[data-v-601f9299] {
	display: flex;
	align-items: center;
	gap: 12px;
	margin-bottom: 8px;
}
.cn-roadmap-item__avatar[data-v-601f9299] {
	width: 24px;
	height: 24px;
	border-radius: 50%;
	flex-shrink: 0;
	object-fit: cover;
	background: var(--color-background-darker);
}
.cn-roadmap-item__meta[data-v-601f9299] {
	flex: 1;
}
.cn-roadmap-item__title-link[data-v-601f9299] {
	display: block;
	color: var(--color-main-text);
	font-weight: 600;
	text-decoration: none;
}
.cn-roadmap-item__title-link[data-v-601f9299]:hover {
	color: var(--color-primary-element);
	text-decoration: underline;
}
.cn-roadmap-item__submitter[data-v-601f9299] {
	font-size: 0.85em;
	color: var(--color-text-light);
}
.cn-roadmap-item__separator[data-v-601f9299] {
	margin: 0 4px;
}
.cn-roadmap-item__reactions[data-v-601f9299] {
	display: flex;
	align-items: center;
	gap: 4px;
	color: var(--color-text-light);
}
.cn-roadmap-item__body[data-v-601f9299] {
	color: var(--color-main-text);
	font-size: 0.95em;
	line-height: 1.4;
	/* Cap the rendered markdown so cards stay roughly feature-card-sized.
	   Full body is reachable via the title link to the GitHub issue. */
	max-height: 8.4em;
	overflow: hidden;
	position: relative;
	mask-image: linear-gradient(to bottom, black 70%, transparent);
	-webkit-mask-image: linear-gradient(to bottom, black 70%, transparent);
}
.cn-roadmap-item__body[data-v-601f9299] p { margin: 4px 0;
}
.cn-roadmap-item__body[data-v-601f9299] h1,
.cn-roadmap-item__body[data-v-601f9299] h2,
.cn-roadmap-item__body[data-v-601f9299] h3 {
	font-size: 1em;
	margin: 4px 0;
	font-weight: 600;
}
.cn-roadmap-item__body[data-v-601f9299] pre { background: var(--color-background-hover); padding: 8px; border-radius: 4px; overflow-x: auto;
}
.cn-roadmap-item__body[data-v-601f9299] code { background: var(--color-background-hover); padding: 2px 4px; border-radius: 3px;
}
.cn-roadmap-item__labels[data-v-601f9299] {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
	margin-top: 8px;
}
.cn-roadmap-item__label-chip[data-v-601f9299] {
	padding: 2px 8px;
	border-radius: 10px;
	font-size: 0.8em;
}


.cn-roadmap-tab__grid[data-v-b4d3b662] {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
	gap: 16px;
}
.cn-roadmap-tab__card[data-v-b4d3b662] {
	background: var(--color-main-background);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-large, 12px);
	transition: border-color 120ms ease, box-shadow 120ms ease;
}
.cn-roadmap-tab__card[data-v-b4d3b662]:hover {
	border-color: var(--color-primary-element);
	box-shadow: 0 2px 8px var(--color-box-shadow, rgba(0, 0, 0, 0.08));
}
.cn-roadmap-tab__loading[data-v-b4d3b662] {
	display: flex;
	justify-content: center;
	padding: 32px;
}


.cn-features-and-roadmap-view[data-v-7c44400f] {
	max-width: 1200px;
	margin: 0 auto;
	padding: 24px 16px;
}
.cn-features-and-roadmap-view__header[data-v-7c44400f] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	margin-bottom: 24px;
	flex-wrap: wrap;
	/* Clear the Nextcloud navigation toggle button (44px wide, absolutely
	   positioned at the left edge of .app-content) plus 12px breathing
	   room. Only the HEADER shifts right — the panel below keeps full width. */
	padding-inline-start: 56px;
}
.cn-features-and-roadmap-view__title[data-v-7c44400f] {
	font-size: 1.4em;
	margin: 0;
	color: var(--color-main-text);
}
.cn-features-and-roadmap-view__actions[data-v-7c44400f] {
	display: flex;
	gap: 8px;
	align-items: center;
	flex-wrap: wrap;
}
.cn-features-and-roadmap-view__panel[data-v-7c44400f] {
	min-height: 320px;
}

/* Underline the inline docs URL so it reads as a link inside the note
   body — NcNoteCard's default link styling drops the underline by
   inheriting from the host theme. */
.cn-features-and-roadmap-view__docs-note[data-v-7c44400f] a {
	color: var(--color-primary-element);
	text-decoration: underline;
}
.cn-features-and-roadmap-view__docs-note[data-v-7c44400f] a:hover {
	text-decoration: underline;
	opacity: 0.85;
}


.cn-visibility-rules__hint[data-v-dcb6ed98] {
	color: var(--color-text-maxcontrast);
	margin: 0 0 8px;
}
.cn-visibility-rules__list[data-v-dcb6ed98] {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.cn-visibility-rules__rule[data-v-dcb6ed98] {
	padding: 12px;
	background: var(--color-background-dark);
	border-radius: var(--border-radius);
}
.cn-visibility-rules__rule-header[data-v-dcb6ed98] {
	display: flex;
	align-items: center;
	justify-content: space-between;
	margin-bottom: 8px;
}
.cn-visibility-rules__conditions[data-v-dcb6ed98] {
	list-style: none;
	margin: 0 0 8px;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.cn-visibility-rules__condition[data-v-dcb6ed98] {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cn-visibility-rules__condition-kind[data-v-dcb6ed98] {
	font-weight: 500;
}
.cn-visibility-rules__condition-summary[data-v-dcb6ed98] {
	flex: 1;
	font-size: 12px;
	color: var(--color-text-maxcontrast);
}
.cn-visibility-rules__condition-empty[data-v-dcb6ed98] {
	color: var(--color-text-maxcontrast);
	font-size: 12px;
}
.cn-visibility-rules__empty[data-v-dcb6ed98] {
	color: var(--color-text-maxcontrast);
	margin: 0;
}
.cn-visibility-rules__form[data-v-dcb6ed98] {
	border-top: 1px solid var(--color-border);
	padding-top: 12px;
}
.cn-visibility-rules__form h3[data-v-dcb6ed98] {
	margin: 0 0 12px;
}
.cn-visibility-rules__field[data-v-dcb6ed98] {
	margin-bottom: 12px;
}
.cn-visibility-rules__actions[data-v-dcb6ed98] {
	display: flex;
	justify-content: flex-end;
}


.cn-ai-agent-picker {
	width: 100%;
}
.cn-ai-agent-picker__error {
	margin: 0;
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
}


.cn-ai-recent-sessions {
	display: flex;
	flex-direction: column;
	gap: 8px;
	width: 100%;
}
.cn-ai-recent-sessions__title {
	margin: 0;
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	font-weight: bold;
}
.cn-ai-recent-sessions__list {
	display: flex;
	flex-direction: column;
	gap: 4px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.cn-ai-recent-sessions__card {
	display: flex;
	flex-direction: column;
	gap: 2px;
	width: 100%;
	padding: 8px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius);
	background: var(--color-main-background);
	color: var(--color-main-text);
	text-align: left;
	cursor: pointer;
}
.cn-ai-recent-sessions__card:hover,
.cn-ai-recent-sessions__card:focus-visible {
	background: var(--color-background-hover);
	outline: 2px solid var(--color-primary-element);
	outline-offset: -2px;
}
.cn-ai-recent-sessions__card--active {
	background: var(--color-primary-element-light, rgba(var(--color-primary-rgb), 0.1));
}
.cn-ai-recent-sessions__card-title {
	overflow: hidden;
	font-weight: 500;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.cn-ai-recent-sessions__card-desc {
	overflow: hidden;
	color: var(--color-text-maxcontrast);
	font-size: 0.85em;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.cn-ai-recent-sessions__view-all {
	padding: 4px 0;
	border: none;
	background: transparent;
	color: var(--color-primary-element);
	text-align: left;
	cursor: pointer;
}
.cn-ai-recent-sessions__view-all:hover,
.cn-ai-recent-sessions__view-all:focus-visible {
	text-decoration: underline;
}


.cn-ai-history-dialog__loading {
	display: flex;
	flex-direction: column;
	gap: 12px;
	align-items: center;
	justify-content: center;
	padding: 32px;
}
