Spaces:
Running
Running
Upload 18 files
Browse files- interface/retirement_planning_interface.py +16 -16
- modules/rebalancing.py +6 -6
- modules/retirement_planning.py +24 -24
- style.css +97 -133
interface/retirement_planning_interface.py
CHANGED
@@ -3,34 +3,34 @@ from modules.retirement_planning import retirement_planning
|
|
3 |
|
4 |
# Define examples for retirement planning
|
5 |
examples = [
|
6 |
-
[38, 55, 85, 2000000, 3.0, 10000000,
|
7 |
]
|
8 |
|
9 |
# Define the input components
|
10 |
-
title = gr.Markdown("<h2 style='margin: 5px'>Retirement Planning</h2>")
|
11 |
-
|
12 |
current_age = gr.Slider(label="Current Age (15-60 Years)", value=38, minimum=15, maximum=60, step=1)
|
13 |
retirement_age = gr.Slider(label="Retirement Age (Upto 70 Years)", value=55, minimum=15, maximum=70, step=1)
|
14 |
life_expectancy = gr.Slider(label="Life Expectancy (Upto 100 Years)", value=80, minimum=30, maximum=100, step=1)
|
15 |
-
|
16 |
-
monthly_income_required = gr.Number(label="Monthly
|
17 |
inflation_rate = gr.Number(label="Inflation Rate (%)", value=3)
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
reinvest_dividends = gr.Checkbox(label="Reinvest Dividends", value=True)
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
pre_retirement_dividend_yield = gr.Number(label="Dividend Yield (Pre-retirement) (%)", value=3.3)
|
26 |
post_retirement_dividend_yield = gr.Number(label="Dividend Yield (Post-retirement) (%)", value=3.3)
|
27 |
|
28 |
-
input = [current_age, retirement_age, life_expectancy, monthly_income_required, inflation_rate,
|
29 |
output = gr.HTML()
|
30 |
-
component_rows = [
|
31 |
-
[current_age, retirement_age, life_expectancy],[monthly_income_required, inflation_rate],
|
32 |
-
[
|
33 |
-
[
|
34 |
]
|
35 |
|
36 |
# Define the update function
|
|
|
3 |
|
4 |
# Define examples for retirement planning
|
5 |
examples = [
|
6 |
+
[38, 55, 85, 2000000, 3.0, 10000000, 1500000, 0, True, 8, 8, 3.3, 3.3]
|
7 |
]
|
8 |
|
9 |
# Define the input components
|
10 |
+
title = gr.Markdown("<h2 style='margin: 5px'>Dividend-Based Retirement Planning Calculator</h2>")
|
11 |
+
title_1 = gr.Markdown("<h3 class='h3_title'>Profile</h3>")
|
12 |
current_age = gr.Slider(label="Current Age (15-60 Years)", value=38, minimum=15, maximum=60, step=1)
|
13 |
retirement_age = gr.Slider(label="Retirement Age (Upto 70 Years)", value=55, minimum=15, maximum=70, step=1)
|
14 |
life_expectancy = gr.Slider(label="Life Expectancy (Upto 100 Years)", value=80, minimum=30, maximum=100, step=1)
|
15 |
+
title_2 = gr.Markdown("<h3 class='h3_title'>Contribution</h3>")
|
16 |
+
monthly_income_required = gr.Number(label="Current Monthly Expense", value=2000000)
|
17 |
inflation_rate = gr.Number(label="Inflation Rate (%)", value=3)
|
18 |
+
initial_investment = gr.Number(label="Initial Investment", value=10000000)
|
19 |
+
monthly_contribution = gr.Number(label="Monthly Contribution", value=1000000)
|
20 |
+
annual_increase_in_monthly_contribution = gr.Number(label="Annual Increase in Monthly Contribution", value=0) # ์ถ๊ฐ๋ ์
๋ ฅ
|
21 |
reinvest_dividends = gr.Checkbox(label="Reinvest Dividends", value=True)
|
22 |
+
title_3 = gr.Markdown("<h3 class='h3_title'>Performance</h3>")
|
23 |
+
pre_retirement_dividend_growth = gr.Number(label="Dividend Growth (Pre-retirement) (%)", value=8)
|
24 |
+
post_retirement_dividend_growth = gr.Number(label="Dividend Growth (Post-retirement) (%)", value=8)
|
25 |
pre_retirement_dividend_yield = gr.Number(label="Dividend Yield (Pre-retirement) (%)", value=3.3)
|
26 |
post_retirement_dividend_yield = gr.Number(label="Dividend Yield (Post-retirement) (%)", value=3.3)
|
27 |
|
28 |
+
input = [current_age, retirement_age, life_expectancy, monthly_income_required, inflation_rate, initial_investment, monthly_contribution, annual_increase_in_monthly_contribution, reinvest_dividends, pre_retirement_dividend_growth, post_retirement_dividend_growth, pre_retirement_dividend_yield, post_retirement_dividend_yield]
|
29 |
output = gr.HTML()
|
30 |
+
component_rows = [title,
|
31 |
+
title_1, [current_age, retirement_age, life_expectancy],[monthly_income_required, inflation_rate],
|
32 |
+
title_2, [initial_investment, monthly_contribution, annual_increase_in_monthly_contribution], [reinvest_dividends],
|
33 |
+
title_3, [pre_retirement_dividend_growth, post_retirement_dividend_growth], [pre_retirement_dividend_yield, post_retirement_dividend_yield]
|
34 |
]
|
35 |
|
36 |
# Define the update function
|
modules/rebalancing.py
CHANGED
@@ -199,22 +199,22 @@ def generate_rebalancing_analysis(portfolio, target_ratios, total_value, main_cu
|
|
199 |
<thead>
|
200 |
<tr>
|
201 |
<th colspan="1"></th>
|
202 |
-
<th colspan="2" class="header-bg-before">Your Current Portfolio (Before Trades)</th>
|
203 |
<th colspan="1"></th>
|
204 |
<th colspan="4" style='text-align: center'>Trades to Re-Balance Your Portfolio</th>
|
205 |
-
<th colspan="2" class="header-bg-after">Your Adjusted Portfolio (After Trades)</th>
|
206 |
</tr>
|
207 |
<tr>
|
208 |
<th>Stock Code</th>
|
209 |
-
<th class="header-bg-before">Total Value - {main_currency} {currency_symbol}</th>
|
210 |
-
<th class="header-bg-before">% Asset Allocation</th>
|
211 |
<th style='text-align: center !important;'>Your Target Asset Allocation %</th>
|
212 |
<th>Buy or Sell?</th>
|
213 |
<th>Trade Amount - {main_currency} {currency_symbol}</th>
|
214 |
<th>Current Price per Share - {main_currency} {currency_symbol}</th>
|
215 |
<th>Estimated # of Shares to Buy or Sell</th>
|
216 |
-
<th class="header-bg-after">Total Value - {main_currency} {currency_symbol}</th>
|
217 |
-
<th class="header-bg-after">% Asset Allocation</th>
|
218 |
</tr>
|
219 |
<tr style="font-weight: bold;">
|
220 |
<td>Total</td>
|
|
|
199 |
<thead>
|
200 |
<tr>
|
201 |
<th colspan="1"></th>
|
202 |
+
<th colspan="2" class="table-header-bg-before">Your Current Portfolio (Before Trades)</th>
|
203 |
<th colspan="1"></th>
|
204 |
<th colspan="4" style='text-align: center'>Trades to Re-Balance Your Portfolio</th>
|
205 |
+
<th colspan="2" class="table-header-bg-after">Your Adjusted Portfolio (After Trades)</th>
|
206 |
</tr>
|
207 |
<tr>
|
208 |
<th>Stock Code</th>
|
209 |
+
<th class="table-header-bg-before">Total Value - {main_currency} {currency_symbol}</th>
|
210 |
+
<th class="table-header-bg-before">% Asset Allocation</th>
|
211 |
<th style='text-align: center !important;'>Your Target Asset Allocation %</th>
|
212 |
<th>Buy or Sell?</th>
|
213 |
<th>Trade Amount - {main_currency} {currency_symbol}</th>
|
214 |
<th>Current Price per Share - {main_currency} {currency_symbol}</th>
|
215 |
<th>Estimated # of Shares to Buy or Sell</th>
|
216 |
+
<th class="table-header-bg-after">Total Value - {main_currency} {currency_symbol}</th>
|
217 |
+
<th class="table-header-bg-after">% Asset Allocation</th>
|
218 |
</tr>
|
219 |
<tr style="font-weight: bold;">
|
220 |
<td>Total</td>
|
modules/retirement_planning.py
CHANGED
@@ -69,17 +69,17 @@ def create_retirement_table(post_retirement_investments, monthly_income_required
|
|
69 |
<tr>
|
70 |
<th colspan="1"></th>
|
71 |
<th colspan="1"></th>
|
72 |
-
<th colspan="2" class="header-bg-required">Income Required</th>
|
73 |
-
<th colspan="2" class="header-bg-
|
74 |
<th colspan="1">Shortfall</th>
|
75 |
</tr>
|
76 |
<tr>
|
77 |
<th>Age</th>
|
78 |
-
<th>Investment</th>
|
79 |
-
<th class="header-bg-required">Annual</th>
|
80 |
-
<th class="header-bg-required">Monthly <br>(
|
81 |
-
<th class="header-bg-
|
82 |
-
<th class="header-bg-
|
83 |
<th>{format_value(additional_cash_total)}</th>
|
84 |
</tr>
|
85 |
</thead>
|
@@ -98,7 +98,7 @@ def create_csv_file(post_retirement_investments, monthly_income_required):
|
|
98 |
'Age',
|
99 |
'Investment',
|
100 |
'Annual Income Required',
|
101 |
-
f'Monthly Income Required (
|
102 |
'Annual Dividend Income',
|
103 |
'Monthly Dividend Income',
|
104 |
'Shortfall'
|
@@ -125,23 +125,23 @@ def retirement_planning(
|
|
125 |
life_expectancy=None,
|
126 |
monthly_income_required=None,
|
127 |
inflation_rate=None,
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
reinvest_dividends=None,
|
132 |
-
|
133 |
-
|
134 |
pre_retirement_dividend_yield=None,
|
135 |
post_retirement_dividend_yield=None
|
136 |
):
|
137 |
# NoneType์ผ ๋ 0์ผ๋ก ์ฒ๋ฆฌ
|
138 |
current_age = current_age if current_age is not None else 0
|
139 |
retirement_age = retirement_age if retirement_age is not None else 0
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
pre_retirement_dividend_yield = pre_retirement_dividend_yield if pre_retirement_dividend_yield is not None else 0
|
146 |
post_retirement_dividend_yield = post_retirement_dividend_yield if post_retirement_dividend_yield is not None else 0
|
147 |
life_expectancy = life_expectancy if life_expectancy is not None else 0
|
@@ -159,21 +159,21 @@ def retirement_planning(
|
|
159 |
post_retirement_years = life_expectancy - retirement_age
|
160 |
|
161 |
# ํ์ฌ ํฌ์์ก์ผ๋ก ์ด๊ธฐ ํฌ์ ์ค์
|
162 |
-
total_investment =
|
163 |
|
164 |
# ์ํด ์ ์๊ฐ ์ด์์จ ๊ณ์ฐ
|
165 |
-
monthly_return_pre = (1 +
|
166 |
|
167 |
# ์ํด ์์ ์ ํฌ์ ๊ณ์ฐ
|
168 |
for year in range(years_to_retirement):
|
169 |
for month in range(12):
|
170 |
# ์๊ฐ ํฌ์์ก๊ณผ ์ด์์จ์ ์ ์ฉํ์ฌ ์ด ํฌ์์ก ๊ฐฑ์
|
171 |
-
total_investment = (total_investment +
|
172 |
# ๋ฐฐ๋น๊ธ์ ์ฌํฌ์ํ ๊ฒฝ์ฐ ๋ฐฐ๋น๊ธ ์ถ๊ฐ
|
173 |
if reinvest_dividends:
|
174 |
total_investment += total_investment * (pre_retirement_dividend_yield / 100 / 12)
|
175 |
# ์ฐ๊ฐ ์ฆ๊ฐ์ก์ ์ ํฌ์์ก์ ์ถ๊ฐ
|
176 |
-
|
177 |
|
178 |
# ์ํด ์์ ์์ ์ ์ด ํฌ์์ก๊ณผ ์ฐ๊ฐ ๋ฐฐ๋น ์์ต ์ ์ฅ
|
179 |
investment_at_retirement = total_investment
|
@@ -181,7 +181,7 @@ def retirement_planning(
|
|
181 |
monthly_dividend_at_retirement = annual_dividend_at_retirement / 12
|
182 |
|
183 |
# ์ํด ํ ์๊ฐ ์ด์์จ ๊ณ์ฐ
|
184 |
-
monthly_return_post = (1 +
|
185 |
|
186 |
# ์ฐ๊ฐ ๋ฌผ๊ฐ์์น๋ฅ ์ ๋ฐ์ํ ์ ์ํ๋น ๊ณ์ฐ
|
187 |
monthly_income_required_inflated = monthly_income_required
|
@@ -200,7 +200,7 @@ def retirement_planning(
|
|
200 |
# ์ํด ํ ๊ฐ ๋
๋์ ํฌ์ ๋ฐ ๋ฐฐ๋น ์์ต ๊ณ์ฐ
|
201 |
for year in range(1, post_retirement_years + 1):
|
202 |
# ์ํด ํ ์์ต๋ฅ ์ ์ ์ฉํ์ฌ ์ด ํฌ์์ก ๊ฐฑ์
|
203 |
-
total_investment *= (1 +
|
204 |
# ์ฐ๊ฐ ๋ฐฐ๋น ์์ต ๊ณ์ฐ
|
205 |
annual_dividend_income = total_investment * (post_retirement_dividend_yield / 100)
|
206 |
# ์๊ฐ ๋ฐฐ๋น ์์ต ๊ณ์ฐ
|
|
|
69 |
<tr>
|
70 |
<th colspan="1"></th>
|
71 |
<th colspan="1"></th>
|
72 |
+
<th colspan="2" class="table-header-bg-required">Income Required</th>
|
73 |
+
<th colspan="2" class="table-header-bg-dividend">Dividend Income</th>
|
74 |
<th colspan="1">Shortfall</th>
|
75 |
</tr>
|
76 |
<tr>
|
77 |
<th>Age</th>
|
78 |
+
<th>Investment Returns</th>
|
79 |
+
<th class="table-header-bg-required">Annual</th>
|
80 |
+
<th class="table-header-bg-required">Monthly <br>(Current {monthly_income_required:,.0f})</th>
|
81 |
+
<th class="table-header-bg-dividend">Annual</th>
|
82 |
+
<th class="table-header-bg-dividend">Monthly</th>
|
83 |
<th>{format_value(additional_cash_total)}</th>
|
84 |
</tr>
|
85 |
</thead>
|
|
|
98 |
'Age',
|
99 |
'Investment',
|
100 |
'Annual Income Required',
|
101 |
+
f'Monthly Income Required (Current {monthly_income_required:,.0f})',
|
102 |
'Annual Dividend Income',
|
103 |
'Monthly Dividend Income',
|
104 |
'Shortfall'
|
|
|
125 |
life_expectancy=None,
|
126 |
monthly_income_required=None,
|
127 |
inflation_rate=None,
|
128 |
+
initial_investment=None,
|
129 |
+
monthly_contribution=None,
|
130 |
+
annual_increase_in_monthly_contribution=None,
|
131 |
reinvest_dividends=None,
|
132 |
+
pre_retirement_dividend_growth=None,
|
133 |
+
post_retirement_dividend_growth=None,
|
134 |
pre_retirement_dividend_yield=None,
|
135 |
post_retirement_dividend_yield=None
|
136 |
):
|
137 |
# NoneType์ผ ๋ 0์ผ๋ก ์ฒ๋ฆฌ
|
138 |
current_age = current_age if current_age is not None else 0
|
139 |
retirement_age = retirement_age if retirement_age is not None else 0
|
140 |
+
initial_investment = initial_investment if initial_investment is not None else 0
|
141 |
+
monthly_contribution = monthly_contribution if monthly_contribution is not None else 0
|
142 |
+
annual_increase_in_monthly_contribution = annual_increase_in_monthly_contribution if annual_increase_in_monthly_contribution is not None else 0
|
143 |
+
pre_retirement_dividend_growth = pre_retirement_dividend_growth if pre_retirement_dividend_growth is not None else 0
|
144 |
+
post_retirement_dividend_growth = post_retirement_dividend_growth if post_retirement_dividend_growth is not None else 0
|
145 |
pre_retirement_dividend_yield = pre_retirement_dividend_yield if pre_retirement_dividend_yield is not None else 0
|
146 |
post_retirement_dividend_yield = post_retirement_dividend_yield if post_retirement_dividend_yield is not None else 0
|
147 |
life_expectancy = life_expectancy if life_expectancy is not None else 0
|
|
|
159 |
post_retirement_years = life_expectancy - retirement_age
|
160 |
|
161 |
# ํ์ฌ ํฌ์์ก์ผ๋ก ์ด๊ธฐ ํฌ์ ์ค์
|
162 |
+
total_investment = initial_investment
|
163 |
|
164 |
# ์ํด ์ ์๊ฐ ์ด์์จ ๊ณ์ฐ
|
165 |
+
monthly_return_pre = (1 + pre_retirement_dividend_growth / 100) ** (1 / 12) - 1
|
166 |
|
167 |
# ์ํด ์์ ์ ํฌ์ ๊ณ์ฐ
|
168 |
for year in range(years_to_retirement):
|
169 |
for month in range(12):
|
170 |
# ์๊ฐ ํฌ์์ก๊ณผ ์ด์์จ์ ์ ์ฉํ์ฌ ์ด ํฌ์์ก ๊ฐฑ์
|
171 |
+
total_investment = (total_investment + monthly_contribution) * (1 + monthly_return_pre)
|
172 |
# ๋ฐฐ๋น๊ธ์ ์ฌํฌ์ํ ๊ฒฝ์ฐ ๋ฐฐ๋น๊ธ ์ถ๊ฐ
|
173 |
if reinvest_dividends:
|
174 |
total_investment += total_investment * (pre_retirement_dividend_yield / 100 / 12)
|
175 |
# ์ฐ๊ฐ ์ฆ๊ฐ์ก์ ์ ํฌ์์ก์ ์ถ๊ฐ
|
176 |
+
monthly_contribution += annual_increase_in_monthly_contribution
|
177 |
|
178 |
# ์ํด ์์ ์์ ์ ์ด ํฌ์์ก๊ณผ ์ฐ๊ฐ ๋ฐฐ๋น ์์ต ์ ์ฅ
|
179 |
investment_at_retirement = total_investment
|
|
|
181 |
monthly_dividend_at_retirement = annual_dividend_at_retirement / 12
|
182 |
|
183 |
# ์ํด ํ ์๊ฐ ์ด์์จ ๊ณ์ฐ
|
184 |
+
monthly_return_post = (1 + post_retirement_dividend_growth / 100) ** (1 / 12) - 1
|
185 |
|
186 |
# ์ฐ๊ฐ ๋ฌผ๊ฐ์์น๋ฅ ์ ๋ฐ์ํ ์ ์ํ๋น ๊ณ์ฐ
|
187 |
monthly_income_required_inflated = monthly_income_required
|
|
|
200 |
# ์ํด ํ ๊ฐ ๋
๋์ ํฌ์ ๋ฐ ๋ฐฐ๋น ์์ต ๊ณ์ฐ
|
201 |
for year in range(1, post_retirement_years + 1):
|
202 |
# ์ํด ํ ์์ต๋ฅ ์ ์ ์ฉํ์ฌ ์ด ํฌ์์ก ๊ฐฑ์
|
203 |
+
total_investment *= (1 + post_retirement_dividend_growth / 100)
|
204 |
# ์ฐ๊ฐ ๋ฐฐ๋น ์์ต ๊ณ์ฐ
|
205 |
annual_dividend_income = total_investment * (post_retirement_dividend_yield / 100)
|
206 |
# ์๊ฐ ๋ฐฐ๋น ์์ต ๊ณ์ฐ
|
style.css
CHANGED
@@ -19,47 +19,6 @@
|
|
19 |
@import url('https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;700&display=swap');
|
20 |
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap');
|
21 |
@import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap');
|
22 |
-
@import url('https://fonts.googleapis.com/css2?family=Paperlogy&display=swap');
|
23 |
-
|
24 |
-
|
25 |
-
#col-container {
|
26 |
-
margin: 0 auto;
|
27 |
-
max-width: 100%;
|
28 |
-
/* font-family: 'Paperlogy', 'ui-sans-serif', 'system-ui', 'sans-serif'; */
|
29 |
-
/* text-transform: uppercase; */
|
30 |
-
|
31 |
-
}
|
32 |
-
|
33 |
-
.h3_title {
|
34 |
-
padding: .75rem;
|
35 |
-
font-weight: 700;
|
36 |
-
border-bottom: 1px solid rgb(229, 231, 235);
|
37 |
-
/* box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); */
|
38 |
-
}
|
39 |
-
|
40 |
-
.content {
|
41 |
-
-webkit-text-size-adjust: 100%;
|
42 |
-
tab-size: 4;
|
43 |
-
font-size: 1.125rem;
|
44 |
-
line-height: 1.75rem;
|
45 |
-
box-sizing: border-box;
|
46 |
-
border-width: 0;
|
47 |
-
border-style: solid;
|
48 |
-
border-color: #e5e7eb;
|
49 |
-
margin: 0;
|
50 |
-
margin-top: 1.25em;
|
51 |
-
margin-bottom: 1.25em;
|
52 |
-
}
|
53 |
-
|
54 |
-
.code {
|
55 |
-
font-family: 'IBM Plex Mono', 'ui-monospace', 'Consolas', 'monospace';
|
56 |
-
}
|
57 |
-
|
58 |
-
.wrap-text {
|
59 |
-
word-wrap: break-word;
|
60 |
-
overflow-wrap: break-word;
|
61 |
-
white-space: normal;
|
62 |
-
}
|
63 |
|
64 |
:root {
|
65 |
--background-color-light: #ffffff;
|
@@ -90,32 +49,52 @@
|
|
90 |
--total-value-color-dark: #ffeb3b;
|
91 |
}
|
92 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
93 |
.buy-sell {
|
94 |
-
/* padding: 5px 10px;
|
95 |
-
border-radius: 5px; */
|
96 |
font-weight: bold;
|
97 |
-
/* display: inline-block;
|
98 |
-
margin: 2px;
|
99 |
-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); */
|
100 |
}
|
101 |
|
102 |
.buy {
|
103 |
-
/* background-color: var(--buy-color);
|
104 |
-
color: white !important; */
|
105 |
color: var(--buy-color);
|
106 |
-
|
107 |
}
|
108 |
|
109 |
.sell {
|
110 |
-
/* background-color: var(--sell-color);
|
111 |
-
color: white !important; */
|
112 |
color: var(--sell-color);
|
113 |
-
|
114 |
}
|
115 |
|
116 |
.highlight-edit {
|
117 |
background-color: var(--highlight-edit-bg-color-light);
|
118 |
-
color: var(--highlight-edit-text-color-light)
|
119 |
padding: 5px 10px;
|
120 |
font-weight: bold;
|
121 |
border-radius: 5px;
|
@@ -125,7 +104,7 @@
|
|
125 |
|
126 |
.highlight-black {
|
127 |
background-color: var(--highlight-black-light);
|
128 |
-
color: var(--text-color-dark)
|
129 |
padding: 5px 10px;
|
130 |
font-weight: bold;
|
131 |
border-radius: 5px;
|
@@ -135,7 +114,7 @@
|
|
135 |
|
136 |
.highlight-yellow {
|
137 |
background-color: var(--highlight-yellow-bg-color-light);
|
138 |
-
color: var(--highlight-yellow-text-color-light)
|
139 |
padding: 5px 10px;
|
140 |
font-weight: bold;
|
141 |
border-radius: 5px;
|
@@ -145,7 +124,7 @@
|
|
145 |
|
146 |
.highlight-sky {
|
147 |
background-color: var(--highlight-sky-bg-color-light);
|
148 |
-
color: var(--highlight-sky-text-color-light)
|
149 |
padding: 5px 10px;
|
150 |
font-weight: bold;
|
151 |
border-radius: 5px;
|
@@ -153,60 +132,32 @@
|
|
153 |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
154 |
}
|
155 |
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
}
|
161 |
-
|
162 |
-
.highlight-black {
|
163 |
-
background-color: var(--highlight-black-dark);
|
164 |
-
color: var(--text-color-light) !important;
|
165 |
-
}
|
166 |
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
}
|
181 |
|
182 |
-
/* ๊ธฐ๋ณธ ํ
์ด๋ธ ์คํ์ผ */
|
183 |
.table-container {
|
184 |
width: 100%;
|
185 |
overflow: auto;
|
186 |
margin-bottom: 20px;
|
187 |
position: relative;
|
188 |
max-height: 100%;
|
189 |
-
/* box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); */
|
190 |
-
}
|
191 |
-
|
192 |
-
.header-bg-before {
|
193 |
-
background-color: #e7f9ef !important; /* ์ํ๋ ์์์ผ๋ก ๋ณ๊ฒฝ */
|
194 |
-
color: #000; /* ํ
์คํธ ์์ */
|
195 |
-
}
|
196 |
-
|
197 |
-
.header-bg-divdend {
|
198 |
-
background-color: #89c9e6 !important;
|
199 |
-
color: #000; /* ํ
์คํธ ์์ */
|
200 |
-
}
|
201 |
-
|
202 |
-
.header-bg-required {
|
203 |
-
background-color: #ffca28 !important;
|
204 |
-
color: #000; /* ํ
์คํธ ์์ */
|
205 |
-
}
|
206 |
-
|
207 |
-
.header-bg-after {
|
208 |
-
background-color: #d9d2e9 !important;/* ์ํ๋ ์์์ผ๋ก ๋ณ๊ฒฝ */
|
209 |
-
color: #000; /* ํ
์คํธ ์์ */
|
210 |
}
|
211 |
|
212 |
.table-container table {
|
@@ -214,14 +165,6 @@
|
|
214 |
border-collapse: collapse;
|
215 |
}
|
216 |
|
217 |
-
.table-container td {
|
218 |
-
text-align: right;
|
219 |
-
}
|
220 |
-
|
221 |
-
.table-container td:first-child {
|
222 |
-
text-align: left;
|
223 |
-
}
|
224 |
-
|
225 |
.table-container th, .table-container td {
|
226 |
border: 1px solid #ddd;
|
227 |
padding: 8px;
|
@@ -230,7 +173,7 @@
|
|
230 |
|
231 |
.table-container th {
|
232 |
background-color: var(--highlight-color-light);
|
233 |
-
color: var(--header-color-light);
|
234 |
position: sticky;
|
235 |
top: 0;
|
236 |
z-index: 2;
|
@@ -240,44 +183,49 @@
|
|
240 |
position: sticky;
|
241 |
left: 0;
|
242 |
z-index: 1;
|
243 |
-
/* background-color: var(--highlight-color-light); */
|
244 |
}
|
245 |
|
246 |
.table-container th:first-child {
|
247 |
position: sticky;
|
248 |
left: 0;
|
249 |
-
z-index: 1;
|
250 |
-
background-color: var(--highlight-color-light);
|
251 |
-
}
|
252 |
-
|
253 |
-
.table-container th:first-child {
|
254 |
z-index: 3;
|
|
|
255 |
}
|
256 |
|
257 |
-
/* ๋ง์ฐ์ค์ค๋ฒ ํจ๊ณผ */
|
258 |
.table-container tr:hover td {
|
259 |
background: #e7f9ef;
|
260 |
color: #000;
|
261 |
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
|
262 |
-
cursor: pointer;
|
263 |
-
|
264 |
-
transform: scale(1.02);*/
|
265 |
-
transition: all 0.3s ease;
|
266 |
}
|
267 |
|
268 |
-
/* ์ด๋์ด ํ
๋ง ์ ์ฉ */
|
269 |
@media (prefers-color-scheme: dark) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
270 |
.table-container {
|
271 |
border: 1px solid #444;
|
272 |
}
|
273 |
-
|
274 |
-
.
|
275 |
-
.header-bg-divdend,
|
276 |
-
.header-bg-required {
|
277 |
-
color: #000 !important;
|
278 |
-
}
|
279 |
-
.table-container th,
|
280 |
-
.table-container td {
|
281 |
border: 1px solid #444;
|
282 |
background: #333;
|
283 |
color: #ccc;
|
@@ -287,16 +235,32 @@
|
|
287 |
background: #444;
|
288 |
}
|
289 |
|
290 |
-
.table-container th:first-child,
|
291 |
-
.table-container td:first-child {
|
292 |
background: #444;
|
293 |
}
|
294 |
|
295 |
.table-container tr:hover td {
|
296 |
background: #e7f9ef;
|
297 |
color: #000;
|
298 |
-
|
299 |
-
|
300 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
301 |
}
|
302 |
}
|
|
|
19 |
@import url('https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;700&display=swap');
|
20 |
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap');
|
21 |
@import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
:root {
|
24 |
--background-color-light: #ffffff;
|
|
|
49 |
--total-value-color-dark: #ffeb3b;
|
50 |
}
|
51 |
|
52 |
+
#col-container {
|
53 |
+
margin: 0 auto;
|
54 |
+
max-width: 100%;
|
55 |
+
/* font-family: 'Quicksand', 'ui-sans-serif', 'system-ui', 'sans-serif'; */
|
56 |
+
}
|
57 |
+
|
58 |
+
.h3_title {
|
59 |
+
padding: .75rem;
|
60 |
+
font-weight: 700;
|
61 |
+
border-bottom: 1px solid rgb(229, 231, 235);
|
62 |
+
}
|
63 |
+
|
64 |
+
.content {
|
65 |
+
-webkit-text-size-adjust: 100%;
|
66 |
+
tab-size: 4;
|
67 |
+
font-size: 1.125rem;
|
68 |
+
line-height: 1.75rem;
|
69 |
+
margin: 1.25em 0;
|
70 |
+
border: 0 solid #e5e7eb;
|
71 |
+
}
|
72 |
+
|
73 |
+
.code {
|
74 |
+
font-family: 'IBM Plex Mono', monospace;
|
75 |
+
}
|
76 |
+
|
77 |
+
.wrap-text {
|
78 |
+
word-wrap: break-word;
|
79 |
+
overflow-wrap: break-word;
|
80 |
+
white-space: normal;
|
81 |
+
}
|
82 |
+
|
83 |
.buy-sell {
|
|
|
|
|
84 |
font-weight: bold;
|
|
|
|
|
|
|
85 |
}
|
86 |
|
87 |
.buy {
|
|
|
|
|
88 |
color: var(--buy-color);
|
|
|
89 |
}
|
90 |
|
91 |
.sell {
|
|
|
|
|
92 |
color: var(--sell-color);
|
|
|
93 |
}
|
94 |
|
95 |
.highlight-edit {
|
96 |
background-color: var(--highlight-edit-bg-color-light);
|
97 |
+
color: var(--highlight-edit-text-color-light);
|
98 |
padding: 5px 10px;
|
99 |
font-weight: bold;
|
100 |
border-radius: 5px;
|
|
|
104 |
|
105 |
.highlight-black {
|
106 |
background-color: var(--highlight-black-light);
|
107 |
+
color: var(--text-color-dark);
|
108 |
padding: 5px 10px;
|
109 |
font-weight: bold;
|
110 |
border-radius: 5px;
|
|
|
114 |
|
115 |
.highlight-yellow {
|
116 |
background-color: var(--highlight-yellow-bg-color-light);
|
117 |
+
color: var(--highlight-yellow-text-color-light);
|
118 |
padding: 5px 10px;
|
119 |
font-weight: bold;
|
120 |
border-radius: 5px;
|
|
|
124 |
|
125 |
.highlight-sky {
|
126 |
background-color: var(--highlight-sky-bg-color-light);
|
127 |
+
color: var(--highlight-sky-text-color-light);
|
128 |
padding: 5px 10px;
|
129 |
font-weight: bold;
|
130 |
border-radius: 5px;
|
|
|
132 |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
133 |
}
|
134 |
|
135 |
+
.table-header-bg-before {
|
136 |
+
background-color: #e7f9ef !important;
|
137 |
+
color: #000;
|
138 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
|
140 |
+
.table-header-bg-dividend {
|
141 |
+
background-color: #89c9e6 !important;
|
142 |
+
color: #000;
|
143 |
+
}
|
144 |
|
145 |
+
.table-header-bg-required {
|
146 |
+
background-color: #ffca28 !important;
|
147 |
+
color: #000;
|
148 |
+
}
|
149 |
|
150 |
+
.table-header-bg-after {
|
151 |
+
background-color: #d9d2e9 !important;
|
152 |
+
color: #000;
|
153 |
}
|
154 |
|
|
|
155 |
.table-container {
|
156 |
width: 100%;
|
157 |
overflow: auto;
|
158 |
margin-bottom: 20px;
|
159 |
position: relative;
|
160 |
max-height: 100%;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
}
|
162 |
|
163 |
.table-container table {
|
|
|
165 |
border-collapse: collapse;
|
166 |
}
|
167 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
168 |
.table-container th, .table-container td {
|
169 |
border: 1px solid #ddd;
|
170 |
padding: 8px;
|
|
|
173 |
|
174 |
.table-container th {
|
175 |
background-color: var(--highlight-color-light);
|
176 |
+
color: var(--header-color-light);
|
177 |
position: sticky;
|
178 |
top: 0;
|
179 |
z-index: 2;
|
|
|
183 |
position: sticky;
|
184 |
left: 0;
|
185 |
z-index: 1;
|
|
|
186 |
}
|
187 |
|
188 |
.table-container th:first-child {
|
189 |
position: sticky;
|
190 |
left: 0;
|
|
|
|
|
|
|
|
|
|
|
191 |
z-index: 3;
|
192 |
+
background-color: var(--highlight-color-light);
|
193 |
}
|
194 |
|
|
|
195 |
.table-container tr:hover td {
|
196 |
background: #e7f9ef;
|
197 |
color: #000;
|
198 |
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
|
199 |
+
cursor: pointer;
|
200 |
+
transition: all 0.3s ease;
|
|
|
|
|
201 |
}
|
202 |
|
|
|
203 |
@media (prefers-color-scheme: dark) {
|
204 |
+
.highlight-yellow {
|
205 |
+
background-color: var(--highlight-yellow-bg-color-dark);
|
206 |
+
color: var(--highlight-yellow-text-color-dark);
|
207 |
+
}
|
208 |
+
|
209 |
+
.highlight-black {
|
210 |
+
background-color: var(--highlight-black-dark);
|
211 |
+
color: var(--text-color-light);
|
212 |
+
}
|
213 |
+
|
214 |
+
.highlight-sky {
|
215 |
+
background-color: var(--highlight-sky-bg-color-dark);
|
216 |
+
color: var(--highlight-sky-text-color-dark);
|
217 |
+
}
|
218 |
+
|
219 |
+
.highlight-edit {
|
220 |
+
background-color: var(--highlight-edit-bg-color-dark);
|
221 |
+
color: var(--highlight-edit-text-color-dark);
|
222 |
+
}
|
223 |
+
|
224 |
.table-container {
|
225 |
border: 1px solid #444;
|
226 |
}
|
227 |
+
|
228 |
+
.table-container th, .table-container td {
|
|
|
|
|
|
|
|
|
|
|
|
|
229 |
border: 1px solid #444;
|
230 |
background: #333;
|
231 |
color: #ccc;
|
|
|
235 |
background: #444;
|
236 |
}
|
237 |
|
238 |
+
.table-container th:first-child, .table-container td:first-child {
|
|
|
239 |
background: #444;
|
240 |
}
|
241 |
|
242 |
.table-container tr:hover td {
|
243 |
background: #e7f9ef;
|
244 |
color: #000;
|
245 |
+
}
|
246 |
+
|
247 |
+
.table-header-bg-before {
|
248 |
+
background-color: hsl(120, 60%, 80%) !important;
|
249 |
+
color: #000;
|
250 |
+
}
|
251 |
+
|
252 |
+
.table-header-bg-dividend {
|
253 |
+
background-color: hsl(200, 60%, 70%) !important;
|
254 |
+
color: #000;
|
255 |
+
}
|
256 |
+
|
257 |
+
.table-header-bg-required {
|
258 |
+
background-color: hsl(45, 100%, 70%) !important;
|
259 |
+
color: #000;
|
260 |
+
}
|
261 |
+
|
262 |
+
.table-header-bg-after {
|
263 |
+
background-color: hsl(270, 30%, 80%) !important;
|
264 |
+
color: #000;
|
265 |
}
|
266 |
}
|