@charset "UTF-8";

/* =========================================================================
 * sortabletable.css  v2.0.0  (2026)
 *
 * 色はすべて CSS 変数にしてあります。
 * スキン側で上書きしたい場合は .st-wrap { --st-accent: #xxxxxx; } のように
 * 変数だけ差し替えてください。ダークモードは自動で切り替わります。
 * ========================================================================= */

/* 変数は :root に置く。
   候補パネルは <body> 直下に作られるため、.st-wrap に定義すると
   パネル側で変数が解決できず背景が透明になる。 */
:root {
	--st-accent:      #2f6fb5;
	--st-accent-weak: rgba(47, 111, 181, .12);
	--st-border:      rgba(0, 0, 0, .16);
	--st-border-soft: rgba(0, 0, 0, .08);
	--st-surface:     #ffffff;
	--st-surface-2:   rgba(0, 0, 0, .035);
	--st-text:        #1a1a1a;
	--st-muted:       rgba(0, 0, 0, .55);
	--st-radius:      6px;
	--st-shadow:      0 6px 24px rgba(0, 0, 0, .18);
}

.st-wrap { margin: 1em 0; }

@media (prefers-color-scheme: dark) {
	:root {
		--st-accent:      #7db3ec;
		--st-accent-weak: rgba(125, 179, 236, .16);
		--st-border:      rgba(255, 255, 255, .22);
		--st-border-soft: rgba(255, 255, 255, .12);
		--st-surface:     #1e2126;
		--st-surface-2:   rgba(255, 255, 255, .05);
		--st-text:        #e8e8e8;
		--st-muted:       rgba(255, 255, 255, .62);
		--st-shadow:      0 6px 24px rgba(0, 0, 0, .55);
	}
}

/* スキン側でクラスによるダークモード切り替えをしている場合 */
html.dark,
body.dark,
html[data-theme="dark"],
body[data-theme="dark"] {
	--st-accent:      #7db3ec;
	--st-accent-weak: rgba(125, 179, 236, .16);
	--st-border:      rgba(255, 255, 255, .22);
	--st-border-soft: rgba(255, 255, 255, .12);
	--st-surface:     #1e2126;
	--st-surface-2:   rgba(255, 255, 255, .05);
	--st-text:        #e8e8e8;
	--st-muted:       rgba(255, 255, 255, .62);
	--st-shadow:      0 6px 24px rgba(0, 0, 0, .55);
}

/* -------------------------------------------------------------------------
 * 上部のバー
 * ---------------------------------------------------------------------- */

.st-bar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	margin: 0 0 8px;
}

.st-searchbox {
	flex: 1 1 220px;
	min-width: 0;
}

.st-searchbox__input {
	width: 100%;
	box-sizing: border-box;
	padding: 8px 10px;
	font-size: 16px;            /* iOS で拡大されないように 16px 以上 */
	line-height: 1.3;
	color: inherit;
	background: var(--st-surface);
	border: 1px solid var(--st-border);
	border-radius: var(--st-radius);
	-webkit-appearance: none;
	appearance: none;
}

.st-searchbox__input:focus {
	outline: 2px solid var(--st-accent);
	outline-offset: 1px;
	border-color: var(--st-accent);
}

.st-btn {
	flex: 0 0 auto;
	padding: 8px 12px;
	font-size: 14px;
	line-height: 1.2;
	color: inherit;
	background: var(--st-surface);
	border: 1px solid var(--st-border);
	border-radius: var(--st-radius);
	cursor: pointer;
}

.st-btn:hover { background: var(--st-surface-2); }

.st-btn:focus-visible {
	outline: 2px solid var(--st-accent);
	outline-offset: 1px;
}

.st-btn--cols[aria-pressed="true"] {
	background: var(--st-accent-weak);
	border-color: var(--st-accent);
	color: var(--st-accent);
	font-weight: 700;
}

.st-count {
	flex: 0 0 auto;
	font-size: 13px;
	color: var(--st-muted);
	white-space: nowrap;
}

.st-count--on {
	color: var(--st-accent);
	font-weight: 700;
}

/* -------------------------------------------------------------------------
 * 表まわり
 * ---------------------------------------------------------------------- */

.st-scroll {
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
	overscroll-behavior-x: contain;
}

.st-hidden { display: none !important; }

.st-emptyrow__cell {
	padding: 16px !important;
	text-align: center !important;
	color: var(--st-muted);
	font-size: 14px;
}

/* 並べ替えできる見出し */
.st-table .st-th {
	cursor: pointer;
	position: relative;
	padding-right: 1.4em;
	-webkit-user-select: none;
	user-select: none;
}

.st-table .st-th:hover { background-image: linear-gradient(var(--st-accent-weak), var(--st-accent-weak)); }

.st-table .st-th:focus-visible {
	outline: 2px solid var(--st-accent);
	outline-offset: -2px;
}

.st-table .st-th::after {
	content: "";
	position: absolute;
	right: .45em;
	top: 50%;
	width: 0;
	height: 0;
	margin-top: -1px;
	border-left: 4px solid transparent;
	border-right: 4px solid transparent;
	border-top: 5px solid currentColor;
	opacity: .25;
	transform: translateY(-50%);
}

.st-table .st-th[aria-sort="ascending"]::after {
	border-top: 0;
	border-bottom: 5px solid currentColor;
	opacity: 1;
	color: var(--st-accent);
}

.st-table .st-th[aria-sort="descending"]::after {
	opacity: 1;
	color: var(--st-accent);
}

/* &sortkey(); で作った並べ替え専用の値は表示に影響させない */
.st-key { display: inline; }

/* 縦結合をほどいたときに複製されたセル。
   引き継いだ値だと分かるようにしたい場合は、スキン側で次のように書けます。
     .st-expanded { opacity: .7; font-style: italic; }
   既定では元のセルと同じ見た目にしています。 */
.st-expanded { }

/* 見出し固定（第2引数に sticky を指定したとき） */
.st-wrap--sticky .st-scroll { max-height: 75vh; overflow-y: auto; }
.st-wrap--sticky .st-table thead th,
.st-wrap--sticky .st-table thead td {
	position: sticky;
	top: 0;
	z-index: 2;
	background-clip: padding-box;
}

/* -------------------------------------------------------------------------
 * 列ごとの絞り込みボタン
 * ---------------------------------------------------------------------- */

.st-filterrow__cell {
	padding: 3px !important;
	background: var(--st-surface-2) !important;
}

.st-colbtn {
	display: block;
	width: 100%;
	padding: 5px 6px;
	font-size: 12px;
	line-height: 1.2;
	font-weight: 400;
	color: var(--st-muted);
	background: var(--st-surface);
	border: 1px solid var(--st-border-soft);
	border-radius: 4px;
	cursor: pointer;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

.st-colbtn:hover { border-color: var(--st-accent); }

.st-colbtn--on {
	color: var(--st-accent);
	border-color: var(--st-accent);
	background: var(--st-accent-weak);
	font-weight: 700;
}

/* -------------------------------------------------------------------------
 * 候補パネル
 * ---------------------------------------------------------------------- */

/* クリックを受け止めるだけの層。画面を暗くするのはスマホのシート表示のときだけ。 */
.st-picker__backdrop {
	position: fixed;
	inset: 0;
	background: transparent;
	z-index: 9998;
}

.st-picker__backdrop--dim {
	background: rgba(0, 0, 0, .35);
}

.st-picker {
	position: absolute;
	z-index: 9999;
	width: 280px;
	max-width: calc(100vw - 16px);
	padding: 10px;
	box-sizing: border-box;
	/* 変数が読めない環境でも必ず不透明になるよう、素の色を先に指定する */
	color: #1a1a1a;
	background-color: #ffffff;
	color: var(--st-text, #1a1a1a);
	background-color: var(--st-surface, #ffffff);
	border: 1px solid var(--st-border, rgba(0, 0, 0, .16));
	border-radius: var(--st-radius, 6px);
	box-shadow: var(--st-shadow, 0 6px 24px rgba(0, 0, 0, .18));
}

.st-picker__head {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-bottom: 8px;
}

.st-picker__title {
	flex: 1 1 auto;
	font-weight: 700;
	font-size: 14px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.st-picker__close {
	flex: 0 0 auto;
	width: 32px;
	height: 32px;
	font-size: 20px;
	line-height: 1;
	color: inherit;
	background: none;
	border: 0;
	border-radius: 4px;
	cursor: pointer;
}

.st-picker__close:hover { background: var(--st-surface-2); }

.st-picker__search {
	width: 100%;
	box-sizing: border-box;
	padding: 7px 9px;
	font-size: 16px;
	color: var(--st-text, #1a1a1a);
	background-color: var(--st-surface, #ffffff);
	border: 1px solid var(--st-border, rgba(0, 0, 0, .16));
	border-radius: 4px;
	-webkit-appearance: none;
	appearance: none;
}

.st-picker__tools {
	display: flex;
	gap: 6px;
	margin: 8px 0;
}

.st-picker__tool {
	flex: 1 1 0;
	padding: 6px;
	font-size: 12px;
	color: var(--st-accent);
	background: none;
	border: 1px solid var(--st-border-soft);
	border-radius: 4px;
	cursor: pointer;
}

.st-picker__tool:hover { background: var(--st-accent-weak); }

.st-picker__list {
	max-height: 46vh;
	overflow-y: auto;
	-webkit-overflow-scrolling: touch;
	border-top: 1px solid var(--st-border-soft);
}

.st-picker__item {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 9px 4px;
	font-size: 14px;
	line-height: 1.3;
	border-bottom: 1px solid var(--st-border-soft);
	cursor: pointer;
}

.st-picker__item:hover { background: var(--st-surface-2); }

.st-picker__item input {
	flex: 0 0 auto;
	width: 18px;
	height: 18px;
	margin: 0;
	accent-color: var(--st-accent);
}

.st-picker__label {
	flex: 1 1 auto;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.st-picker__n {
	flex: 0 0 auto;
	font-size: 12px;
	color: var(--st-muted);
	font-variant-numeric: tabular-nums;
}

/* スマートフォンでは画面下部からせり上がる形にする */
.st-picker--sheet {
	position: fixed;
	left: 0;
	right: 0;
	bottom: 0;
	top: auto;
	width: auto;
	max-width: none;
	border-radius: 14px 14px 0 0;
	padding: 12px 14px calc(12px + env(safe-area-inset-bottom));
	animation: st-slide-up .18s ease-out;
}

.st-picker--sheet .st-picker__list { max-height: 44vh; }

@keyframes st-slide-up {
	from { transform: translateY(14px); opacity: 0; }
	to   { transform: translateY(0);    opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
	.st-picker--sheet { animation: none; }
}


/* -------------------------------------------------------------------------
 * 正規表現の切り替えとエラー表示
 * ---------------------------------------------------------------------- */

.st-btn--re {
	font-family: ui-monospace, "SFMono-Regular", Consolas, monospace;
	font-weight: 700;
	letter-spacing: .02em;
	min-width: 42px;
}

.st-btn--re[aria-pressed="true"] {
	background: var(--st-accent-weak);
	border-color: var(--st-accent);
	color: var(--st-accent);
}

.st-input--bad {
	border-color: #c0392b !important;
	background-color: rgba(192, 57, 43, .06) !important;
}

.st-msg {
	margin: -4px 0 8px;
	padding: 6px 10px;
	font-size: 13px;
	line-height: 1.5;
	color: #a3312a;
	background: rgba(163, 49, 42, .08);
	border-left: 3px solid #a3312a;
	border-radius: 3px;
}

@media (prefers-color-scheme: dark) {
	.st-msg { color: #ff9f96; background: rgba(255, 120, 110, .12); border-left-color: #ff8a7e; }
}

html.dark .st-msg,
body.dark .st-msg,
[data-theme="dark"] .st-msg {
	color: #ff9f96;
	background: rgba(255, 120, 110, .12);
	border-left-color: #ff8a7e;
}

/* 候補パネルの「この列で絞り込む」欄 */

.st-picker__rowbox {
	display: flex;
	align-items: center;
	gap: 6px;
	margin-bottom: 6px;
}

.st-picker__rowfilter {
	flex: 1 1 auto;
	min-width: 0;
	box-sizing: border-box;
	padding: 7px 9px;
	font-size: 16px;
	color: var(--st-text, #1a1a1a);
	background-color: var(--st-surface, #ffffff);
	border: 1px solid var(--st-accent, #2f6fb5);
	border-radius: 4px;
	-webkit-appearance: none;
	appearance: none;
}

.st-picker__re {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	gap: 4px;
	font-size: 12px;
	color: var(--st-muted, rgba(0, 0, 0, .55));
	white-space: nowrap;
	cursor: pointer;
}

.st-picker__re input {
	width: 16px;
	height: 16px;
	margin: 0;
	accent-color: var(--st-accent);
}

.st-picker__msg {
	margin: 0 0 8px;
	padding: 5px 8px;
	font-size: 12px;
	line-height: 1.45;
	color: #a3312a;
	background: rgba(163, 49, 42, .08);
	border-radius: 3px;
}

@media (prefers-color-scheme: dark) {
	.st-picker__msg { color: #ff9f96; background: rgba(255, 120, 110, .12); }
}

/* -------------------------------------------------------------------------
 * エラー表示
 * ---------------------------------------------------------------------- */

.st-error {
	margin: 1em 0;
	padding: 8px 12px;
	font-size: 14px;
	color: #a3312a;
	background: rgba(163, 49, 42, .08);
	border-left: 4px solid #a3312a;
	border-radius: 3px;
}

/* -------------------------------------------------------------------------
 * 狭い画面
 * ---------------------------------------------------------------------- */

@media (max-width: 640px) {
	.st-bar { gap: 6px; }
	.st-searchbox { flex: 1 1 100%; }
	.st-btn { padding: 8px 10px; font-size: 13px; }
	.st-count { flex: 1 1 auto; text-align: right; }
	.st-wrap--sticky .st-scroll { max-height: 68vh; }
}

/* 印刷時は操作UIを消す */
@media print {
	.st-bar,
	.st-filterrow,
	.st-picker,
	.st-picker__backdrop { display: none !important; }
	.st-scroll { overflow: visible !important; max-height: none !important; }
}
