@@ -6,6 +6,7 @@ import NeedsExample from '@src/components/NeedsExample.astro';
66export interface CodeExample {
77 description? : string ;
88 luaCode: string ;
9+ side: string ;
910}
1011
1112export interface Props {
@@ -18,18 +19,126 @@ const { codeExamples } = Astro.props;
1819<div class =" examples-section" >
1920 <h4 >Code Examples</h4 >
2021
21- { codeExamples .length > 0 ? (
22- codeExamples .map ((example ) => (
23- <div class = " code-example" >
24- { example .description && (
25- <Fragment set :html = { marked (example .description )} />
26- )}
27- <Code code = { example .luaCode } lang = " lua" />
28- </div >
29- ))
30- ) : (
22+ { codeExamples .length === 0 ? (
3123 <NeedsExample />
24+ ) : (
25+ <div class = " examples-tabs-box" >
26+ { codeExamples .length > 1 && (
27+ <div class = " tab-buttons" id = " code-tabs" >
28+ { codeExamples .map ((example , index ) => (
29+ <button
30+ class = { ` tab-btn ${index === 0 ? ' active' : ' ' } side-${example .side } ` }
31+ data-tab = { index }
32+ type = " button"
33+ >
34+ Example { index + 1 }
35+ </button >
36+ ))}
37+ </div >
38+ )}
39+
40+ { codeExamples .map ((example , index ) => (
41+ <div class = " tab-content" data-tab = { index } style = { { display: index === 0 ? ' block' : ' none' }} >
42+ { example .description && <Fragment set :html = { marked (example .description )} />}
43+ <div class = " code-example" >
44+ <Code code = { example .luaCode } lang = " lua" />
45+ </div >
46+ </div >
47+ ))}
48+ </div >
3249 )}
3350</div >
3451
52+ <style >
53+ .tab-buttons {
54+ display: flex;
55+ gap: 1rem;
56+ overflow-x: auto;
57+ white-space: nowrap;
58+ }
59+
60+ .tab-buttons.has-scrollbar {
61+ padding-bottom: 1rem;
62+ }
63+
64+ .tab-btn {
65+ padding: 0.4rem 0.8rem;
66+ margin: 0;
67+ border: 1px solid var(--sl-color-gray-4);
68+ background: none;
69+ border-radius: 10px;
70+ cursor: pointer;
71+ color: var(--sl-color-text);
72+ transition: background-color 0.2s ease;
73+ }
74+
75+ .tab-btn.active {
76+ color: white;
77+ font-weight: bold;
78+ }
79+
80+ .side-client {
81+ background-color: var(--color-type-client-background);
82+ border-color: var(--color-type-client);
83+ }
84+
85+ .side-client.active {
86+ background-color: var(--color-type-client-background-high);
87+ }
88+
89+ .side-server {
90+ background-color: var(--color-type-server-background);
91+ border-color: var(--color-type-server);
92+ }
93+
94+ .side-server.active {
95+ background-color: var(--color-type-server-background-high);
96+ }
97+
98+ .side-shared {
99+ background-color: var(--color-type-shared-background);
100+ border-color: var(--color-type-shared);
101+ }
102+
103+ .side-shared.active {
104+ background-color: var(--color-type-shared-background-high);
105+ }
106+
107+ .tab-content {
108+ background-color: var(--sl-color-bg-nav);
109+ padding: 1rem;
110+ box-shadow: var(--ec-frm-frameBoxShdCssVal);
111+ }
112+ </style >
113+
114+ <script >
115+ document.addEventListener('DOMContentLoaded', () => {
116+ const buttons = document.querySelectorAll('.tab-btn');
117+ const tabs = document.querySelectorAll('.tab-content');
118+
119+ buttons.forEach((btn) => {
120+ btn.addEventListener('click', () => {
121+ const tab = btn.dataset.tab;
122+
123+ buttons.forEach((b) => b.classList.toggle('active', b.dataset.tab === tab));
124+ tabs.forEach((t) => (t.style.display = t.dataset.tab === tab ? 'block' : 'none'));
125+ });
126+ });
127+
128+ function checkOverflow() {
129+ const tabButtons = document.querySelector('.tab-buttons');
130+ if (!tabButtons) return;
131+
132+ if (tabButtons.scrollWidth > tabButtons.clientWidth) {
133+ tabButtons.classList.add('has-scrollbar');
134+ } else {
135+ tabButtons.classList.remove('has-scrollbar');
136+ }
137+ }
138+
139+ checkOverflow();
140+ window.addEventListener('resize', checkOverflow);
141+ });
142+ </script >
143+
35144<script type =" module" src =" /mta-keyword_linker.js" ></script >
0 commit comments