cryman38 commited on
Commit
306f43c
ยท
verified ยท
1 Parent(s): 4d52c82

Upload 14 files

Browse files
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 style='border-collapse: collapse; width: 100%;'>"
70
- html_table += "<thead><tr><th style='border: 1px solid #ddd; padding: 0.5rem;'>Date</th>"
71
  for stock_code in stock_prices.keys():
72
- html_table += f"<th style='border: 1px solid #ddd; padding: 0.5rem;'>{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 style='border: 1px solid #ddd; padding: 0.5rem;'>{date.strftime('%Y-%m-%d')}</td>"
78
  for stock_code in stock_prices.keys():
79
- html_table += f"<td style='border: 1px solid #ddd; padding: 0.5rem;'>{stock_prices[stock_code][date]:,.2f}</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 style='border-collapse: collapse;'>"
114
- current_info_html += "<thead><tr><th style='border: 1px solid #ddd; text-align: center;'>Stock Code</th><th style='border: 1px solid #ddd; text-align: center;'>Current Weight (%)</th><th style='border: 1px solid #ddd; text-align: center;'>Current Value</th></tr></thead><tbody>"
115
  for stock_code, weight in sorted_stocks:
116
  current_info_html += (
117
  f"<tr>"
118
- f"<td style='border: 1px solid #ddd; text-align: center;'>{stock_code.upper()}</td>"
119
- f"<td style='border: 1px solid #ddd; text-align: center;'>{weight:.1f}%</td>"
120
- f"<td style='border: 1px solid #ddd; text-align: center;'>{currency_symbol}{current_values[stock_code]:,.0f}</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 style='border-collapse: collapse;'>"
169
- currency_table += "<thead><tr><th style='border: 1px solid #ddd; text-align: center;'>Currency</th><th style='border: 1px solid #ddd; text-align: center;'>Total Weight (%)</th><th style='border: 1px solid #ddd; text-align: center;'>Total Value</th></tr></thead><tbody>"
170
 
171
  for currency, data in sorted_currencies:
172
  currency_table += (
173
  f"<tr>"
174
- f"<td style='border: 1px solid #ddd; text-align: center;'>{currency.upper()}</td>"
175
- f"<td style='border: 1px solid #ddd; text-align: center;'>{data['weight'] * 100:.1f}%</td>"
176
- f"<td style='border: 1px solid #ddd; text-align: center;'>{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 style='border-collapse: collapse;'>"
184
- result_message += "<thead><tr><th style='border: 1px solid #ddd; text-align: center;'>Stock Code</th><th style='border: 1px solid #ddd; text-align: center;'>Current Weight (%)</th><th style='border: 1px solid #ddd; text-align: center;'>Target Weight</th><th style='border: 1px solid #ddd; text-align: center;'>Target Ratio (%)</th><th style='border: 1px solid #ddd; text-align: center;'>Buy or Sell?</th><th style='border: 1px solid #ddd; text-align: center;'>Trade Amount</th><th style='border: 1px solid #ddd; text-align: center;'>Current Price per Share</th><th style='border: 1px solid #ddd; text-align: center;'>Estimated # of<br> Shares to Buy or Sell</th><th style='border: 1px solid #ddd; text-align: center;'>Quantity of Units</th><th style='border: 1px solid #ddd; text-align: center;'>Market Value</th><th style='border: 1px solid #ddd; text-align: center;'>% 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,17 +208,17 @@ def get_portfolio_rebalancing_info(portfolio, target_weights, main_currency_cash
208
 
209
  result_message += (
210
  f"<tr>"
211
- f"<td style='border: 1px solid #ddd; text-align: center;'>{stock_code.upper()}</td>"
212
- f"<td style='border: 1px solid #ddd; text-align: center;'>{current_value_pct_str}</td>"
213
- f"<td style='border: 1px solid #ddd; text-align: center;'>{target_weight_str}</td>"
214
- f"<td style='border: 1px solid #ddd; text-align: center;'>{target_ratio_str}</td>"
215
- f"<td style='border: 1px solid #ddd; text-align: center;'>{Buy_or_Sell}</td>"
216
- f"<td style='border: 1px solid #ddd; text-align: center;'>{trade_value_str}</td>"
217
- f"<td style='border: 1px solid #ddd; text-align: center;'>{price_str}</td>"
218
- f"<td style='border: 1px solid #ddd; text-align: center;'>{trade_quantity_str}</td>"
219
- f"<td style='border: 1px solid #ddd; text-align: center;'>{old_quantity_str}</td>"
220
- f"<td style='border: 1px solid #ddd; text-align: center;'>{new_value_str}</td>"
221
- f"<td style='border: 1px solid #ddd; text-align: center;'>{new_value_pct_str}</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 investment 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,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 style='border: 1px solid #ddd; padding: 0.5rem;'>Age</th>
91
- <th style='border: 1px solid #ddd; padding: 0.5rem;'>Total</th>
92
- <th style='border: 1px solid #ddd; padding: 0.5rem;'>Annual</th>
93
- <th style='border: 1px solid #ddd; padding: 0.5rem;'>Monthly</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 style='border: 1px solid #ddd; padding: 0.5rem;'>{age}</td>
104
- <td style='border: 1px solid #ddd; padding: 0.5rem;'>{investment:,.0f}</td>
105
- <td style='border: 1px solid #ddd; padding: 0.5rem;'>{annual_dividend_income:,.0f}</td>
106
- <td style='border: 1px solid #ddd; padding: 0.5rem;'>{monthly_dividend_income:,.0f}</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: 'Montserrat', 'ui-sans-serif', 'system-ui', 'sans-serif';
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
- body {
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
- .dashboard {
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
+