Spaces:
Running
Running
Upload 14 files
Browse files- modules/compare_stock_prices.py +5 -5
- modules/portfolio_rebalancing.py +23 -23
- modules/retirement_planning.py +9 -9
- style.css +85 -117
modules/compare_stock_prices.py
CHANGED
@@ -66,17 +66,17 @@ def compare_stock_prices(stock_codes, days):
|
|
66 |
plt.close() # ๋ฆฌ์์ค ์ ๋ฆฌ
|
67 |
|
68 |
# ์ฃผ์ ๊ฐ๊ฒฉ ๋ฐ์ดํฐ๋ฅผ HTML ํ
์ด๋ธ๋ก ๋ณํ
|
69 |
-
html_table = "<h3>Stock Prices Data</h3><div class='table-container'><table
|
70 |
-
html_table += "<thead><tr><th
|
71 |
for stock_code in stock_prices.keys():
|
72 |
-
html_table += f"<th
|
73 |
html_table += "</tr></thead><tbody>"
|
74 |
|
75 |
dates = stock_prices[list(stock_prices.keys())[0]].index
|
76 |
for date in dates:
|
77 |
-
html_table += f"<tr><td
|
78 |
for stock_code in stock_prices.keys():
|
79 |
-
html_table += f"<td
|
80 |
html_table += "</tr>"
|
81 |
|
82 |
html_table += "</tbody></table></div>"
|
|
|
66 |
plt.close() # ๋ฆฌ์์ค ์ ๋ฆฌ
|
67 |
|
68 |
# ์ฃผ์ ๊ฐ๊ฒฉ ๋ฐ์ดํฐ๋ฅผ HTML ํ
์ด๋ธ๋ก ๋ณํ
|
69 |
+
html_table = "<h3>Stock Prices Data</h3><div class='table-container'><table>"
|
70 |
+
html_table += "<thead><tr><th>Date</th>"
|
71 |
for stock_code in stock_prices.keys():
|
72 |
+
html_table += f"<th>{stock_code.upper()}</th>"
|
73 |
html_table += "</tr></thead><tbody>"
|
74 |
|
75 |
dates = stock_prices[list(stock_prices.keys())[0]].index
|
76 |
for date in dates:
|
77 |
+
html_table += f"<tr><td>{date.strftime('%Y-%m-%d')}</td>"
|
78 |
for stock_code in stock_prices.keys():
|
79 |
+
html_table += f"<td>{stock_prices[stock_code][date]:,.2f}</td>"
|
80 |
html_table += "</tr>"
|
81 |
|
82 |
html_table += "</tbody></table></div>"
|
modules/portfolio_rebalancing.py
CHANGED
@@ -110,14 +110,14 @@ def get_portfolio_rebalancing_info(portfolio, target_weights, main_currency_cash
|
|
110 |
sorted_stocks = sorted(current_weights.items(), key=lambda x: x[1], reverse=True)
|
111 |
|
112 |
# ํ์ฌ ๋ณด์ ๋ ๋ฐ ๊ฐ์น ์น์
ํ์
|
113 |
-
current_info_html = "<h3>Your Portfolio Holdings</h3><div class='table-container'><table
|
114 |
-
current_info_html += "<thead><tr><th
|
115 |
for stock_code, weight in sorted_stocks:
|
116 |
current_info_html += (
|
117 |
f"<tr>"
|
118 |
-
f"<td
|
119 |
-
f"<td
|
120 |
-
f"<td
|
121 |
f"</tr>"
|
122 |
)
|
123 |
current_info_html += "</tbody></table></div><br>"
|
@@ -165,23 +165,23 @@ def get_portfolio_rebalancing_info(portfolio, target_weights, main_currency_cash
|
|
165 |
sorted_currencies = sorted(currency_totals.items(), key=lambda x: x[1]['weight'], reverse=True)
|
166 |
|
167 |
# ํตํ๋ณ ์์ฝ ํ
์ด๋ธ ์์ฑ
|
168 |
-
currency_table = "<h3>Your Portfolio by Currency</h3><div class='table-container wrap-text'><table
|
169 |
-
currency_table += "<thead><tr><th
|
170 |
|
171 |
for currency, data in sorted_currencies:
|
172 |
currency_table += (
|
173 |
f"<tr>"
|
174 |
-
f"<td
|
175 |
-
f"<td
|
176 |
-
f"<td
|
177 |
f"</tr>"
|
178 |
)
|
179 |
|
180 |
currency_table += "</tbody></table></div><br>"
|
181 |
|
182 |
# ์ฌ์กฐ์ ๋ถ์ ํ
์ด๋ธ ์์ฑ
|
183 |
-
result_message = portfolio_info + current_info_html + currency_table + "<h3>Re-Balancing Analysis</h3><div class='table-container wrap-text'><table
|
184 |
-
result_message += "<thead><tr><th
|
185 |
|
186 |
for adj in adjustments:
|
187 |
difference, current_value, target_value, current_value_pct, trade_quantity, stock_code, price, new_value, trade_value, old_quantity, new_quantity, target_ratio, new_value_pct, target_weight, currency = adj
|
@@ -208,17 +208,17 @@ def get_portfolio_rebalancing_info(portfolio, target_weights, main_currency_cash
|
|
208 |
|
209 |
result_message += (
|
210 |
f"<tr>"
|
211 |
-
f"<td
|
212 |
-
f"<td
|
213 |
-
f"<td
|
214 |
-
f"<td
|
215 |
-
f"<td
|
216 |
-
f"<td
|
217 |
-
f"<td
|
218 |
-
f"<td
|
219 |
-
f"<td
|
220 |
-
f"<td
|
221 |
-
f"<td
|
222 |
f"</tr>"
|
223 |
)
|
224 |
|
|
|
110 |
sorted_stocks = sorted(current_weights.items(), key=lambda x: x[1], reverse=True)
|
111 |
|
112 |
# ํ์ฌ ๋ณด์ ๋ ๋ฐ ๊ฐ์น ์น์
ํ์
|
113 |
+
current_info_html = "<h3>Your Portfolio Holdings</h3><div class='table-container'><table>"
|
114 |
+
current_info_html += "<thead><tr><th>Stock Code</th><th>Current Weight (%)</th><th>Current Value</th></tr></thead><tbody>"
|
115 |
for stock_code, weight in sorted_stocks:
|
116 |
current_info_html += (
|
117 |
f"<tr>"
|
118 |
+
f"<td>{stock_code.upper()}</td>"
|
119 |
+
f"<td>{weight:.1f}%</td>"
|
120 |
+
f"<td>{currency_symbol}{current_values[stock_code]:,.0f}</td>"
|
121 |
f"</tr>"
|
122 |
)
|
123 |
current_info_html += "</tbody></table></div><br>"
|
|
|
165 |
sorted_currencies = sorted(currency_totals.items(), key=lambda x: x[1]['weight'], reverse=True)
|
166 |
|
167 |
# ํตํ๋ณ ์์ฝ ํ
์ด๋ธ ์์ฑ
|
168 |
+
currency_table = "<h3>Your Portfolio by Currency</h3><div class='table-container wrap-text'><table>"
|
169 |
+
currency_table += "<thead><tr><th>Currency</th><th>Total Weight (%)</th><th>Total Value</th></tr></thead><tbody>"
|
170 |
|
171 |
for currency, data in sorted_currencies:
|
172 |
currency_table += (
|
173 |
f"<tr>"
|
174 |
+
f"<td>{currency.upper()}</td>"
|
175 |
+
f"<td>{data['weight'] * 100:.1f}%</td>"
|
176 |
+
f"<td>{currency_symbol}{data['amount']:,}</td>"
|
177 |
f"</tr>"
|
178 |
)
|
179 |
|
180 |
currency_table += "</tbody></table></div><br>"
|
181 |
|
182 |
# ์ฌ์กฐ์ ๋ถ์ ํ
์ด๋ธ ์์ฑ
|
183 |
+
result_message = portfolio_info + current_info_html + currency_table + "<h3>Re-Balancing Analysis</h3><div class='table-container wrap-text'><table>"
|
184 |
+
result_message += "<thead><tr><th>Stock Code</th><th>Current Weight (%)</th><th>Target Weight</th><th>Target Ratio (%)</th><th>Buy or Sell?</th><th>Trade Amount</th><th>Current Price per Share</th><th>Estimated # of<br> Shares to Buy or Sell</th><th>Quantity of Units</th><th>Market Value</th><th>% Asset Allocation</th></tr></thead><tbody>"
|
185 |
|
186 |
for adj in adjustments:
|
187 |
difference, current_value, target_value, current_value_pct, trade_quantity, stock_code, price, new_value, trade_value, old_quantity, new_quantity, target_ratio, new_value_pct, target_weight, currency = adj
|
|
|
208 |
|
209 |
result_message += (
|
210 |
f"<tr>"
|
211 |
+
f"<td>{stock_code.upper()}</td>"
|
212 |
+
f"<td>{current_value_pct_str}</td>"
|
213 |
+
f"<td>{target_weight_str}</td>"
|
214 |
+
f"<td>{target_ratio_str}</td>"
|
215 |
+
f"<td>{Buy_or_Sell}</td>"
|
216 |
+
f"<td>{trade_value_str}</td>"
|
217 |
+
f"<td>{price_str}</td>"
|
218 |
+
f"<td>{trade_quantity_str}</td>"
|
219 |
+
f"<td>{old_quantity_str}</td>"
|
220 |
+
f"<td>{new_value_str}</td>"
|
221 |
+
f"<td>{new_value_pct_str}</td>"
|
222 |
f"</tr>"
|
223 |
)
|
224 |
|
modules/retirement_planning.py
CHANGED
@@ -62,7 +62,7 @@ def retirement_planning(current_age=None, retirement_age=None, current_investmen
|
|
62 |
<div>
|
63 |
<div style="margin-bottom: 1.5rem;">
|
64 |
<!-- ์ํด ์์ ์ ์ด ํฌ์์ก ํ์ -->
|
65 |
-
<div style="font-size: 1.5rem; margin-top: 1.5rem; margin-bottom: 1.5rem;">Total
|
66 |
<div style="font-size: 1.5rem; font-weight: bold; color: #1c75bc;">
|
67 |
<span style='color: #1678fb'>{investment_at_retirement:,.0f}</span>
|
68 |
</div>
|
@@ -87,10 +87,10 @@ def retirement_planning(current_age=None, retirement_age=None, current_investmen
|
|
87 |
<table style='border-collapse: collapse; width: 100%;'>
|
88 |
<thead>
|
89 |
<tr>
|
90 |
-
<th
|
91 |
-
<th
|
92 |
-
<th
|
93 |
-
<th
|
94 |
</tr>
|
95 |
</thead>
|
96 |
<tbody>
|
@@ -100,10 +100,10 @@ def retirement_planning(current_age=None, retirement_age=None, current_investmen
|
|
100 |
for age, investment, annual_dividend_income, monthly_dividend_income in post_retirement_investments:
|
101 |
result_html += f"""
|
102 |
<tr>
|
103 |
-
<td
|
104 |
-
<td
|
105 |
-
<td
|
106 |
-
<td
|
107 |
</tr>
|
108 |
"""
|
109 |
|
|
|
62 |
<div>
|
63 |
<div style="margin-bottom: 1.5rem;">
|
64 |
<!-- ์ํด ์์ ์ ์ด ํฌ์์ก ํ์ -->
|
65 |
+
<div style="font-size: 1.5rem; margin-top: 1.5rem; margin-bottom: 1.5rem;">Total value at retirement</div>
|
66 |
<div style="font-size: 1.5rem; font-weight: bold; color: #1c75bc;">
|
67 |
<span style='color: #1678fb'>{investment_at_retirement:,.0f}</span>
|
68 |
</div>
|
|
|
87 |
<table style='border-collapse: collapse; width: 100%;'>
|
88 |
<thead>
|
89 |
<tr>
|
90 |
+
<th>Age</th>
|
91 |
+
<th>Total</th>
|
92 |
+
<th>Annual</th>
|
93 |
+
<th>Monthly</th>
|
94 |
</tr>
|
95 |
</thead>
|
96 |
<tbody>
|
|
|
100 |
for age, investment, annual_dividend_income, monthly_dividend_income in post_retirement_investments:
|
101 |
result_html += f"""
|
102 |
<tr>
|
103 |
+
<td>{age}</td>
|
104 |
+
<td>{investment:,.0f}</td>
|
105 |
+
<td>{annual_dividend_income:,.0f}</td>
|
106 |
+
<td>{monthly_dividend_income:,.0f}</td>
|
107 |
</tr>
|
108 |
"""
|
109 |
|
style.css
CHANGED
@@ -1,10 +1,21 @@
|
|
1 |
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;700&display=swap');
|
2 |
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;700&display=swap');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
#col-container {
|
5 |
margin: 0 auto;
|
6 |
max-width: 100%;
|
7 |
-
font-family: '
|
8 |
}
|
9 |
|
10 |
.code {
|
@@ -12,10 +23,11 @@
|
|
12 |
}
|
13 |
|
14 |
.wrap-text {
|
15 |
-
word-wrap: break-word; /* ์ค๋๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด */
|
16 |
-
overflow-wrap: break-word; /* ๊ธด ๋จ์ด๋ ์ ์ ํ ๋์ด์ ์ค๋ฐ๊ฟ */
|
17 |
-
white-space: normal; /* ํ
์คํธ ๊ณต๊ฐ์ ๋ง๊ฒ ์ค๋ฐ๊ฟ */
|
18 |
}
|
|
|
19 |
:root {
|
20 |
--background-color-light: #ffffff;
|
21 |
--background-color-dark: #121212;
|
@@ -45,14 +57,6 @@ white-space: normal; /* ํ
์คํธ ๊ณต๊ฐ์ ๋ง๊ฒ ์ค๋ฐ๊ฟ */
|
|
45 |
--total-value-color-dark: #ffeb3b;
|
46 |
}
|
47 |
|
48 |
-
body {
|
49 |
-
font-family: 'Roboto', sans-serif;
|
50 |
-
line-height: 1.6;
|
51 |
-
color: var(--text-color-light);
|
52 |
-
background-color: var(--background-color-light);
|
53 |
-
padding: 20px;
|
54 |
-
}
|
55 |
-
|
56 |
.buy-sell {
|
57 |
padding: 5px 10px;
|
58 |
border-radius: 5px;
|
@@ -67,21 +71,11 @@ body {
|
|
67 |
color: white !important;
|
68 |
}
|
69 |
|
70 |
-
.dashboard {
|
71 |
-
/* background-color: #f6fcfe; */
|
72 |
-
/* border: 1px solid #89c9e6; */
|
73 |
-
text-align: left;
|
74 |
-
padding: 10px;
|
75 |
-
font-size: 1rem;
|
76 |
-
border-radius: 18px;
|
77 |
-
box-shadow: 2px 4px 12px #00000014;
|
78 |
-
transition: all .3s cubic-bezier(0,0,.5,1);
|
79 |
-
}
|
80 |
-
|
81 |
.sell {
|
82 |
background-color: var(--sell-color);
|
83 |
color: white !important;
|
84 |
}
|
|
|
85 |
.highlight-edit {
|
86 |
background-color: var(--highlight-edit-bg-color-light);
|
87 |
color: var(--highlight-edit-text-color-light) !important;
|
@@ -91,6 +85,7 @@ body {
|
|
91 |
display: inline-block;
|
92 |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
93 |
}
|
|
|
94 |
.highlight-black {
|
95 |
background-color: var(--highlight-black-light);
|
96 |
color: var(--text-color-dark) !important;
|
@@ -121,7 +116,7 @@ body {
|
|
121 |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
122 |
}
|
123 |
|
124 |
-
.container {
|
125 |
font-size: 1.2rem;
|
126 |
margin-bottom: 15px;
|
127 |
padding: 20px;
|
@@ -129,89 +124,15 @@ body {
|
|
129 |
border-radius: 5px;
|
130 |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
131 |
background-color: var(--highlight-color-light);
|
132 |
-
}
|
133 |
-
|
134 |
-
.header {
|
135 |
-
font-size: 1.2rem;
|
136 |
-
font-weight: bold;
|
137 |
-
color: var(--header-color-light);
|
138 |
-
margin-top: 10px;
|
139 |
-
text-align: center;
|
140 |
-
}
|
141 |
-
|
142 |
-
.total-value {
|
143 |
-
color: var(--total-value-color-light);
|
144 |
-
font-size: 3rem;
|
145 |
-
}
|
146 |
-
|
147 |
-
.summary {
|
148 |
-
font-size: 1.2rem;
|
149 |
-
color: var(--text-color-light);
|
150 |
-
margin-top: 10px;
|
151 |
-
text-align: center;
|
152 |
-
}
|
153 |
-
|
154 |
-
.table-container {
|
155 |
-
width: 100%;
|
156 |
-
overflow: auto;
|
157 |
-
margin-bottom: 20px;
|
158 |
-
position: relative;
|
159 |
-
max-height: 600px;
|
160 |
-
border: 1px hidden #ddd;
|
161 |
-
overflow-y: auto; /* ๋ณ๊ฒฝ๋ ๋ถ๋ถ: ์ธ๋ก ์คํฌ๋กค ํ์ฉ */
|
162 |
-
}
|
163 |
-
|
164 |
-
.table-container table {
|
165 |
-
width: 100%;
|
166 |
-
border-collapse: collapse;
|
167 |
-
}
|
168 |
-
|
169 |
-
.table-container th, .table-container td {
|
170 |
-
border: 1px hidden #ddd;
|
171 |
-
padding: 8px;
|
172 |
-
text-align: left;
|
173 |
-
background-color: var(--background-color-light);
|
174 |
-
}
|
175 |
-
|
176 |
-
.table-container th {
|
177 |
-
background-color: var(--highlight-color-light);
|
178 |
-
position: sticky;
|
179 |
-
top: 0;
|
180 |
-
z-index: 2;
|
181 |
-
}
|
182 |
|
183 |
-
.table-container td:first-child, .table-container th:first-child {
|
184 |
-
position: sticky;
|
185 |
-
left: 0;
|
186 |
-
z-index: 1;
|
187 |
-
}
|
188 |
-
|
189 |
-
.table-container th:first-child {
|
190 |
-
z-index: 3;
|
191 |
-
}
|
192 |
|
|
|
193 |
@media (prefers-color-scheme: dark) {
|
194 |
-
|
195 |
-
color: var(--text-color-dark);
|
196 |
-
background-color: var(--background-color-dark);
|
197 |
-
}
|
198 |
-
|
199 |
-
.container {
|
200 |
background-color: var(--highlight-color-dark);
|
201 |
}
|
202 |
-
|
203 |
-
.header {
|
204 |
-
color: var(--header-color-dark);
|
205 |
-
}
|
206 |
-
|
207 |
-
.total-value {
|
208 |
-
color: var(--total-value-color-dark);
|
209 |
-
}
|
210 |
-
|
211 |
-
.table-container th, .table-container td {
|
212 |
-
background-color: var(--background-color-dark);
|
213 |
-
color: var(--text-color-dark);
|
214 |
-
}
|
215 |
|
216 |
.highlight-yellow {
|
217 |
background-color: var(--highlight-yellow-bg-color-dark);
|
@@ -227,27 +148,74 @@ body {
|
|
227 |
background-color: var(--highlight-sky-bg-color-dark);
|
228 |
color: var(--highlight-sky-text-color-dark) !important;
|
229 |
}
|
|
|
230 |
.highlight-edit {
|
231 |
background-color: var(--highlight-edit-bg-color-dark);
|
232 |
color: var(--highlight-edit-text-color-dark) !important;
|
233 |
}
|
234 |
|
235 |
-
.table-container th {
|
236 |
-
background-color: var(--highlight-color-dark);
|
237 |
-
}
|
238 |
-
|
239 |
.buy-sell, .highlight-black, .highlight-yellow, .highlight-sky, .highlight-edit {
|
240 |
box-shadow: 0 2px 4px rgba(255, 255, 255, 0.1);
|
241 |
}
|
242 |
-
|
243 |
-
background-color: #2b2b2b; /* ์ด๋์ด ๋ฐฐ๊ฒฝ์ */
|
244 |
-
border: 1px solid #555555; /* ์ด๋์ด ํ
๋๋ฆฌ ์์ */
|
245 |
-
color: #e0e0e0; /* ๋ฐ์ ๊ธ์ ์์ */
|
246 |
-
text-align: left;
|
247 |
-
padding: 10px;
|
248 |
-
font-size: 1rem;
|
249 |
-
border-radius: 18px;
|
250 |
-
box-shadow: 2px 4px 12px #00000050; /* ๋คํฌ๋ชจ๋์ ์ด์ธ๋ฆฌ๋ ๊ทธ๋ฆผ์ ์์ */
|
251 |
-
transition: all .3s cubic-bezier(0,0,.5,1);
|
252 |
-
}
|
253 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;700&display=swap');
|
2 |
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;700&display=swap');
|
3 |
+
@import url('https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;700&display=swap');
|
4 |
+
@import url('https://fonts.googleapis.com/css2?family=Raleway:wght@400;700&display=swap');
|
5 |
+
@import url('https://fonts.googleapis.com/css2?family=Cabin:wght@400;700&display=swap');
|
6 |
+
@import url('https://fonts.googleapis.com/css2?family=Titillium+Web:wght@400;700&display=swap');
|
7 |
+
@import url('https://fonts.googleapis.com/css2?family=Shadows+Into+Light&display=swap');
|
8 |
+
@import url('https://fonts.googleapis.com/css2?family=Amatic+SC:wght@400;700&display=swap');
|
9 |
+
@import url('https://fonts.googleapis.com/css2?family=Patrick+Hand&display=swap');
|
10 |
+
@import url('https://fonts.googleapis.com/css2?family=Baloo+Bhai+2:wght@400;700&display=swap');
|
11 |
+
|
12 |
+
/* Comic Sans MS */
|
13 |
+
|
14 |
|
15 |
#col-container {
|
16 |
margin: 0 auto;
|
17 |
max-width: 100%;
|
18 |
+
font-family: 'Patrick Hand', 'ui-sans-serif', 'system-ui', 'sans-serif';
|
19 |
}
|
20 |
|
21 |
.code {
|
|
|
23 |
}
|
24 |
|
25 |
.wrap-text {
|
26 |
+
word-wrap: break-word; /* ์ค๋๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด */
|
27 |
+
overflow-wrap: break-word; /* ๊ธด ๋จ์ด๋ ์ ์ ํ ๋์ด์ ์ค๋ฐ๊ฟ */
|
28 |
+
white-space: normal; /* ํ
์คํธ ๊ณต๊ฐ์ ๋ง๊ฒ ์ค๋ฐ๊ฟ */
|
29 |
}
|
30 |
+
|
31 |
:root {
|
32 |
--background-color-light: #ffffff;
|
33 |
--background-color-dark: #121212;
|
|
|
57 |
--total-value-color-dark: #ffeb3b;
|
58 |
}
|
59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
.buy-sell {
|
61 |
padding: 5px 10px;
|
62 |
border-radius: 5px;
|
|
|
71 |
color: white !important;
|
72 |
}
|
73 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
.sell {
|
75 |
background-color: var(--sell-color);
|
76 |
color: white !important;
|
77 |
}
|
78 |
+
|
79 |
.highlight-edit {
|
80 |
background-color: var(--highlight-edit-bg-color-light);
|
81 |
color: var(--highlight-edit-text-color-light) !important;
|
|
|
85 |
display: inline-block;
|
86 |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
87 |
}
|
88 |
+
|
89 |
.highlight-black {
|
90 |
background-color: var(--highlight-black-light);
|
91 |
color: var(--text-color-dark) !important;
|
|
|
116 |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
117 |
}
|
118 |
|
119 |
+
/* .container {
|
120 |
font-size: 1.2rem;
|
121 |
margin-bottom: 15px;
|
122 |
padding: 20px;
|
|
|
124 |
border-radius: 5px;
|
125 |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
126 |
background-color: var(--highlight-color-light);
|
127 |
+
} */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
129 |
|
130 |
+
/* ๋คํฌ๋ชจ๋ ์คํ์ผ */
|
131 |
@media (prefers-color-scheme: dark) {
|
132 |
+
/* .container {
|
|
|
|
|
|
|
|
|
|
|
133 |
background-color: var(--highlight-color-dark);
|
134 |
}
|
135 |
+
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
136 |
|
137 |
.highlight-yellow {
|
138 |
background-color: var(--highlight-yellow-bg-color-dark);
|
|
|
148 |
background-color: var(--highlight-sky-bg-color-dark);
|
149 |
color: var(--highlight-sky-text-color-dark) !important;
|
150 |
}
|
151 |
+
|
152 |
.highlight-edit {
|
153 |
background-color: var(--highlight-edit-bg-color-dark);
|
154 |
color: var(--highlight-edit-text-color-dark) !important;
|
155 |
}
|
156 |
|
|
|
|
|
|
|
|
|
157 |
.buy-sell, .highlight-black, .highlight-yellow, .highlight-sky, .highlight-edit {
|
158 |
box-shadow: 0 2px 4px rgba(255, 255, 255, 0.1);
|
159 |
}
|
160 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
}
|
162 |
+
|
163 |
+
/* ๊ธฐ๋ณธ ํ
์ด๋ธ ์คํ์ผ */
|
164 |
+
.table-container {
|
165 |
+
max-width: 100%;
|
166 |
+
overflow-x: auto;
|
167 |
+
border: 1px solid #ddd;
|
168 |
+
}
|
169 |
+
|
170 |
+
.table-container table {
|
171 |
+
width: 100%;
|
172 |
+
border-collapse: collapse;
|
173 |
+
table-layout: auto;
|
174 |
+
}
|
175 |
+
|
176 |
+
.table-container th,
|
177 |
+
.table-container td {
|
178 |
+
padding: 8px 16px;
|
179 |
+
border: 1px solid #ddd;
|
180 |
+
background: #fff;
|
181 |
+
/* white-space: nowrap; */
|
182 |
+
text-align: left;
|
183 |
+
text-transform: uppercase;
|
184 |
+
}
|
185 |
+
|
186 |
+
.table-container thead {
|
187 |
+
background: #f9f9f9;
|
188 |
+
}
|
189 |
+
|
190 |
+
|
191 |
+
.table-container th:first-child,
|
192 |
+
.table-container td:first-child {
|
193 |
+
position: sticky;
|
194 |
+
left: 0;
|
195 |
+
background: #f9f9f9;
|
196 |
+
z-index: 2;
|
197 |
+
}
|
198 |
+
|
199 |
+
/* ๋คํฌ ๋ชจ๋ */
|
200 |
+
@media (prefers-color-scheme: dark) {
|
201 |
+
.table-container {
|
202 |
+
border: 1px solid #444;
|
203 |
+
}
|
204 |
+
|
205 |
+
.table-container th,
|
206 |
+
.table-container td {
|
207 |
+
border: 1px solid #444;
|
208 |
+
background: #333;
|
209 |
+
color: #ccc;
|
210 |
+
}
|
211 |
+
|
212 |
+
.table-container thead {
|
213 |
+
background: #444;
|
214 |
+
}
|
215 |
+
|
216 |
+
.table-container th:first-child,
|
217 |
+
.table-container td:first-child {
|
218 |
+
background: #444;
|
219 |
+
}
|
220 |
+
}
|
221 |
+
|