/**
* SyntaxHighlighterComponent CSS
* CSS สำหรับการแสดงผลโค้ดแบบมีสีสันตามไวยากรณ์
*/
/* พื้นฐานของ wrapper */
.highlighted-code {
position: relative;
border: 1px solid #e0e0e0;
border-radius: 6px;
margin: 1.5em 0;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 14px;
line-height: 1.5;
overflow: hidden;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
background-color: #f8f8f8;
color: #333;
}
/* ส่วนหัวของโค้ด */
.highlighted-code .code-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 12px;
background-color: #f0f0f0;
border-bottom: 1px solid #e0e0e0;
}
/* ป้ายภาษา */
.highlighted-code .language-label {
background-color: #e0e0e0;
color: #555;
font-size: 12px;
padding: 2px 8px;
border-radius: 3px;
font-weight: 500;
text-transform: uppercase;
}
/* ปุ่มคัดลอกโค้ด */
.highlighted-code .copy-button {
background: none;
border: 1px solid #ccc;
border-radius: 4px;
padding: 4px 10px;
font-size: 12px;
display: flex;
align-items: center;
gap: 5px;
cursor: pointer;
transition: all 0.2s ease;
color: #555;
outline: none;
}
.highlighted-code .copy-button:hover {
background-color: #e9e9e9;
border-color: #bbb;
}
.highlighted-code .copy-button:active {
background-color: #d9d9d9;
transform: translateY(1px);
}
.highlighted-code .copy-button svg {
width: 14px;
height: 14px;
fill: currentColor;
}
/* เนื้อหาโค้ด */
.highlighted-code .code-content {
display: flex;
overflow: auto;
max-height: 500px;
}
/* ส่วนเลขบรรทัด */
.highlighted-code .line-numbers {
display: flex;
flex-direction: column;
padding: 12px 0;
background-color: #f0f0f0;
border-right: 1px solid #e0e0e0;
min-width: 40px;
height: 100%;
text-align: right;
user-select: none;
}
.highlighted-code .line-number {
padding: 0 10px;
color: #999;
font-size: 12px;
cursor: pointer;
transition: all 0.2s ease;
}
.highlighted-code .line-number:hover {
color: #555;
background-color: rgba(0, 0, 0, 0.05);
}
/* เนื้อหาของโค้ด */
.highlighted-code .code-body {
flex: 1;
padding: 12px;
tab-size: 2;
-moz-tab-size: 2;
}
/* แต่ละบรรทัดของโค้ด */
.highlighted-code .line {
position: relative;
white-space: pre;
padding: 0 2px;
}
.highlighted-code .line,
.highlighted-code .line-number {
min-height: 1.5rem;
line-height: 1.5rem;
}
.highlighted-code .line:hover {
background-color: rgba(0, 0, 0, 0.02);
}
/* การเน้นบรรทัด */
.highlighted-code .line.highlighted {
background-color: rgba(100, 150, 255, 0.1);
border-left: 3px solid #4d90fe;
padding-left: 5px;
}
.highlighted-code .line-number.highlighted {
background-color: rgba(100, 150, 255, 0.2);
color: #4d90fe;
font-weight: bold;
}
/* ตัวบ่งชี้การพับโค้ด */
.highlighted-code .fold-marker {
display: inline-block;
width: 15px;
text-align: center;
cursor: pointer;
user-select: none;
color: #999;
padding: 0 3px;
margin-right: 3px;
font-weight: bold;
transition: all 0.2s ease;
}
.highlighted-code .fold-marker:hover {
color: #555;
}
/* ตัวบ่งชี้ส่วนที่พับ */
.highlighted-code .fold-indicator {
padding: 4px 15px;
background-color: rgba(100, 100, 100, 0.08);
color: #999;
font-style: italic;
cursor: pointer;
text-align: center;
transition: all 0.2s ease;
border-radius: 3px;
margin: 2px 0;
}
.highlighted-code .fold-indicator:hover {
background-color: rgba(100, 100, 100, 0.15);
color: #555;
}
/* ซ่อนบรรทัดที่พับ */
.highlighted-code .line.folded,
.highlighted-code .line-number.folded {
display: none;
}
/* สไตล์สำหรับข้อความผิดพลาด */
.syntax-error {
color: #e74c3c;
background-color: #fef2f0;
padding: 12px 15px;
border: 1px solid #f5d0c9;
border-radius: 4px;
margin: 10px 0;
font-family: system-ui, -apple-system, sans-serif;
}
/* สไตล์ของ token ต่างๆ - ธีม Light */
.highlighted-code .token.keyword {
color: #0000ff;
}
.highlighted-code .token.string {
color: #a31515;
}
.highlighted-code .token.comment {
color: #008000;
}
.highlighted-code .token.function {
color: #795e26;
}
.highlighted-code .token.number {
color: #098658;
}
.highlighted-code .token.operator {
color: #000000;
}
.highlighted-code .token.variable {
color: #001080;
}
.highlighted-code .token.property {
color: #001080;
}
.highlighted-code .token.tag {
color: #800000;
}
.highlighted-code .token.attribute {
color: #ff0000;
}
.highlighted-code .token.builtin {
color: #267f99;
}
.highlighted-code .token.punctuation {
color: #000000;
}
.highlighted-code .token.boolean {
color: #0000ff;
}
.highlighted-code .token.entity {
color: #704214;
}
.highlighted-code .token.selector {
color: #800000;
}
.highlighted-code .token.value {
color: #098658;
}
.highlighted-code .token.unit {
color: #098658;
}
.highlighted-code .token.color {
color: #0451a5;
}
.highlighted-code .token.constant {
color: #0070c1;
}
.highlighted-code .token.parameter {
color: #001080;
}
.highlighted-code .token.command {
color: #0070c1;
}
.highlighted-code .token.path {
color: #a31515;
}
.highlighted-code .token.phpTag {
color: #800080;
}
/* สไตล์สำหรับธีม Dark */
[data-theme="dark"] .highlighted-code {
background-color: #1e1e1e;
color: #d4d4d4;
border-color: #3e3e3e;
}
[data-theme="dark"] .highlighted-code .code-header {
background-color: #252526;
border-bottom-color: #3e3e3e;
}
[data-theme="dark"] .highlighted-code .language-label {
background-color: #333333;
color: #cccccc;
}
[data-theme="dark"] .highlighted-code .copy-button {
color: #cccccc;
border-color: #555555;
}
[data-theme="dark"] .highlighted-code .copy-button:hover {
background-color: #2c2c2c;
border-color: #666666;
}
[data-theme="dark"] .highlighted-code .copy-button:active {
background-color: #3e3e3e;
}
[data-theme="dark"] .highlighted-code .line-numbers {
background-color: #252526;
border-right-color: #3e3e3e;
}
[data-theme="dark"] .highlighted-code .line-number {
color: #858585;
}
[data-theme="dark"] .highlighted-code .line-number:hover {
color: #cccccc;
background-color: rgba(255, 255, 255, 0.05);
}
[data-theme="dark"] .highlighted-code .line:hover {
background-color: rgba(255, 255, 255, 0.05);
}
[data-theme="dark"] .highlighted-code .line.highlighted {
background-color: rgba(100, 150, 255, 0.15);
border-left-color: #569cd6;
}
[data-theme="dark"] .highlighted-code .line-number.highlighted {
background-color: rgba(100, 150, 255, 0.3);
color: #569cd6;
}
[data-theme="dark"] .highlighted-code .fold-indicator {
background-color: rgba(200, 200, 200, 0.1);
color: #858585;
}
[data-theme="dark"] .highlighted-code .fold-indicator:hover {
background-color: rgba(200, 200, 200, 0.15);
color: #cccccc;
}
[data-theme="dark"] .highlighted-code .fold-marker {
color: #858585;
}
[data-theme="dark"] .highlighted-code .fold-marker:hover {
color: #cccccc;
}
/* สไตล์ของ token ต่างๆ - ธีม Dark */
[data-theme="dark"] .highlighted-code .token.keyword {
color: #569cd6;
}
[data-theme="dark"] .highlighted-code .token.string {
color: #ce9178;
}
[data-theme="dark"] .highlighted-code .token.comment {
color: #6a9955;
}
[data-theme="dark"] .highlighted-code .token.function {
color: #dcdcaa;
}
[data-theme="dark"] .highlighted-code .token.number {
color: #b5cea8;
}
[data-theme="dark"] .highlighted-code .token.operator {
color: #d4d4d4;
}
[data-theme="dark"] .highlighted-code .token.variable {
color: #9cdcfe;
}
[data-theme="dark"] .highlighted-code .token.property {
color: #9cdcfe;
}
[data-theme="dark"] .highlighted-code .token.tag {
color: #569cd6;
}
[data-theme="dark"] .highlighted-code .token.attribute {
color: #9cdcfe;
}
[data-theme="dark"] .highlighted-code .token.builtin {
color: #4ec9b0;
}
[data-theme="dark"] .highlighted-code .token.punctuation {
color: #d4d4d4;
}
[data-theme="dark"] .highlighted-code .token.boolean {
color: #569cd6;
}
[data-theme="dark"] .highlighted-code .token.entity {
color: #d7ba7d;
}
[data-theme="dark"] .highlighted-code .token.selector {
color: #d7ba7d;
}
[data-theme="dark"] .highlighted-code .token.value {
color: #ce9178;
}
[data-theme="dark"] .highlighted-code .token.unit {
color: #b5cea8;
}
[data-theme="dark"] .highlighted-code .token.color {
color: #4ec9b0;
}
[data-theme="dark"] .highlighted-code .token.constant {
color: #4fc1ff;
}
[data-theme="dark"] .highlighted-code .token.parameter {
color: #9cdcfe;
}
[data-theme="dark"] .highlighted-code .token.command {
color: #4fc1ff;
}
[data-theme="dark"] .highlighted-code .token.path {
color: #ce9178;
}
[data-theme="dark"] .highlighted-code .token.phpTag {
color: #c586c0;
}
/* รองรับการแสดงผลบนมือถือ */
@media (max-width: 768px) {
.highlighted-code {
font-size: 13px;
}
.highlighted-code .code-header {
padding: 6px 10px;
}
.highlighted-code .copy-button span {
display: none;
/* ซ่อนข้อความในปุ่มคัดลอกบนมือถือ แสดงเฉพาะไอคอน */
}
.highlighted-code .code-body {
padding: 10px 8px;
}
.highlighted-code .line-numbers {
min-width: 32px;
padding: 10px 0;
}
.highlighted-code .line-number {
padding: 0 6px;
font-size: 11px;
}
}
/* การรองรับโหมด Print */
@media print {
.highlighted-code {
border: 1px solid #ddd !important;
box-shadow: none !important;
break-inside: avoid;
}
.highlighted-code .code-header {
background-color: #f5f5f5 !important;
color: #333 !important;
}
.highlighted-code .copy-button {
display: none !important;
}
.highlighted-code .line-numbers {
color: #999 !important;
background-color: #f5f5f5 !important;
}
.highlighted-code .code-body {
color: #000 !important;
background-color: #fff !important;
}
.highlighted-code .fold-marker,
.highlighted-code .fold-indicator {
display: none !important;
}
.highlighted-code .line.folded,
.highlighted-code .line-number.folded {
display: block !important;
/* แสดงส่วนที่พับไว้เมื่อพิมพ์ */
}
}
/* รองรับ Animation */
@keyframes highlight-flash {
0% {
background-color: rgba(100, 150, 255, 0.3);
}
100% {
background-color: rgba(100, 150, 255, 0.1);
}
}
.highlighted-code .line.flash {
animation: highlight-flash 1s ease-out;
}
/* สำหรับการรองรับ DarkMode ของเบราว์เซอร์ */
@media (prefers-color-scheme: dark) {
.highlighted-code:not(.light) {
background-color: #1e1e1e;
color: #d4d4d4;
border-color: #3e3e3e;
}
.highlighted-code:not(.light) .code-header {
background-color: #252526;
border-bottom-color: #3e3e3e;
}
.highlighted-code:not(.light) .language-label {
background-color: #333333;
color: #cccccc;
}
.highlighted-code:not(.light) .copy-button {
color: #cccccc;
border-color: #555555;
}
.highlighted-code:not(.light) .line-numbers {
background-color: #252526;
border-right-color: #3e3e3e;
}
.highlighted-code:not(.light) .token.keyword {
color: #569cd6;
}
.highlighted-code:not(.light) .token.string {
color: #ce9178;
}
.highlighted-code:not(.light) .token.comment {
color: #6a9955;
}
.highlighted-code:not(.light) .token.function {
color: #dcdcaa;
}
.highlighted-code:not(.light) .token.number {
color: #b5cea8;
}
}
/* สำหรับสไตล์ตัวยกเว้นที่อาจต้องการเพิ่มเติม */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
/* สำหรับการจัดวางโค้ดใน RTL (Right-to-Left) languages */
[dir="rtl"] .highlighted-code .line-numbers {
border-right: none;
border-left: 1px solid #e0e0e0;
}
[dir="rtl"] .highlighted-code .line.highlighted {
border-left: none;
border-right: 3px solid #4d90fe;
padding-left: 2px;
padding-right: 5px;
}
/* เพิ่มเติมสำหรับการแสดงผลกับ Syntax ของภาษาเฉพาะ */
.highlighted-code .token.php-delimiter {
color: #800080;
}
.highlighted-code .token.css-property {
color: #005cc5;
}
.highlighted-code .token.css-selector {
color: #800000;
}
.highlighted-code .token.html-doctype {
color: #800080;
}
.highlighted-code .token.regex {
color: #e90;
}
.highlighted-code .token.json-property {
color: #0451a5;
}
.highlighted-code .token.markdown-heading {
color: #0000ff;
font-weight: bold;
}
.highlighted-code .token.markdown-list {
color: #0451a5;
}
.highlighted-code .token.markdown-bold {
font-weight: bold;
}
.highlighted-code .token.markdown-italic {
font-style: italic;
}
[data-theme="dark"] .highlighted-code .token.php-delimiter {
color: #c586c0;
}
[data-theme="dark"] .highlighted-code .token.css-property {
color: #9cdcfe;
}
[data-theme="dark"] .highlighted-code .token.css-selector {
color: #d7ba7d;
}
[data-theme="dark"] .highlighted-code .token.html-doctype {
color: #c586c0;
}
[data-theme="dark"] .highlighted-code .token.regex {
color: #d7ba7d;
}
[data-theme="dark"] .highlighted-code .token.json-property {
color: #9cdcfe;
}
[data-theme="dark"] .highlighted-code .token.markdown-heading {
color: #569cd6;
font-weight: bold;
}
[data-theme="dark"] .highlighted-code .token.markdown-list {
color: #ce9178;
}
[data-theme="dark"] .highlighted-code .token.markdown-bold {
font-weight: bold;
}
[data-theme="dark"] .highlighted-code .token.markdown-italic {
font-style: italic;
}