This commit is contained in:
louiscklaw
2025-01-31 21:42:36 +08:00
parent 1121b8461c
commit de3685756f
45 changed files with 1795 additions and 0 deletions

BIN
sesaman/BBoney/doc/app_tree_diagram.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/cover_image.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,253 @@
# digest
## Name of the App:
BBoney
1. Problem
2. Solution
## 1. Problem
According to the research done by the Investor and Financial Education Council (IFEC) in 2019,
adult respondents claimed that:
| title | percentage |
| -------------------------------- | :--------: |
| overspending | 38% |
| lack of budget plan | 14% |
| respondents lack financial goals | 47% |
overspending (38%),
lack of budget plan (14%)
were their biggest financial regrets, and
nearly 47% of respondents lack financial goals,
these results may lead to the following issues.
Problem can be classified to **Short term** and **Long term**.
### Short term:
#### 1. Instability in your finances:
It might be challenging to manage your income and expenses without a budgeting plan. You might discover that you are having trouble paying for necessities, getting behind on your obligations, or piling up debt.
> Financial instability and stress may result from this.
#### 2. A lack of emergency savings and funds:
A financial plan often has provisions for emergency savings and finances.
Without a budgeting plan, you risk forgetting to save money for unforeseen costs like medical bills, auto repairs, or lost wages.
> This may make you vulnerable in times of need and compel you to turn to credit or loans.
### Long run:
#### 1. Inadequate retirement planning:
Making objectives for retirement and laying out plans to reach them are common components of a financial plan.
Without a strategy, you might not be investing wisely or saving enough money for retirement.
This may make it challenging to continue your preferred way of life during your retirement years.
Currently, there are a multitude of budgeting applications in the market, and you can find that it is easy to download them online. And there are pros and cons for those budgeting applications available now.
#### Pros:
##### 1. Clear consumption records:
You may track your spending by categorizing it in these budgeting applications, such as meals, transportation, or entertainment. For the user to see which categories they have spent the most money on, some of them may build a pie chart.
##### 2. Personalized design:
It is possible for users to design their own application interface. Users are now able to create their own interfaces based on personal preferences or aesthetics. Users will be more inclined to keep track of their own consumption if they create it themselves.
#### Cons:
##### Lack of suggestions:
The budgeting applications on the market are not able to provide a suggestion for the user base on their expenditure record.
This makes consumers unable to effectively make improvements even though they know that they have exceeded their consumption in certain aspects.
According to the data above, 47% of respondents don't have any financial objectives.
They only require the advice provided by the other, thus the budgeting application should include this feature that enables them to efficiently limit associated costs based on the counsel provided, leading to improved financial management.
## 2. Solution
### A application that help user for their financial management
- BBoney
### The feature of the app includes:
1. to customize the saving plan based on their personal preference.
1. prevent the possibility of password theft to increase the security protection.
The app will customize the saving plan based on their personal preference. Registered users need to fill in the personal information into the personal profile page. Like the:
- full name,
- nick name,
- agenda,
- phone number,
- address,
- interest,
- personal preference.
After, users can click the button of monthly salaries and input the actual income and estimated expense into the block. The system will use the information to allocate the proportion of expenses.
For example, the system provides the suggestion of daily expenses for each meal. It will show the percentage of pie charts users can estimate by themselves if they spend more in that month.
Then, the app provides different categories for users, such as food, houseware, clothes, cosmetics, exchange, medical, education, electric bill, transportation, contact fee. If the user wants to have a meal, they can click the food button.
The app links to the partnership company **Open Rise app**. The data of the suggested daily expense and the personal preference will automatically input to the Open Rise app. Users have no need to input the data into the Open Rice app again.
In addition, if users are over the daily expense which includes all categories, the app will list the lower price choice at the first filter item to coordinate the expenses for the whole month.
Apart from the catering expense, there are also transport expenses. The system provides the suggestion of transportation. Users can select the button of transportation; it connects to the **city mapper** app which is a transportation app in Hong Kong. It gives various transport options for users to save time and help users to make the decision.
To prevent the possibility of password theft to increase the security protection. The app will not share the data to the other company or partnership such as **Openrise**, **Zalora**. we will save the data into our own database system. We use it to customize the personal savings plan only. When people want to enter the app and look at the previous financial record, they need to login with the password which contains a number, letter, and character. The lower limit with the amount of password is 8 and limited the time of freezing the screen to reduce the risk even users forgot to close the app. It will obviously increase the privacy level. In the long-term, the number of mobile users will increase rapidly, so it is necessary to focus on the security problem. it builds up the faithfulness that leads to boosting the willingness of users to input the
## Appendix / Apps Tour:
## User InterFace(wireframe)
![](./wireframe/login.png)
### 1. Login Page,
![](./login-tree.png)
#### 1.1 login:
Users can easily access their accounts by entering their email and password.
#### 1.2 Keep signed in
Additionally, we offer a convenient "Keep Me Logged In" feature to eliminate the need for repeated login credentials.
#### 1.3 Forget password
If users forget their password, they can click "Forgot Password" to reset it on a separate page.
#### 1.4 sign in
New users can effortlessly sign up by clicking "Sign In" and following the straightforward account setup process.
Our Login Page prioritizes user convenience and security, ensuring a seamless login experience for all users.
### 2. Password and email recovery
![](./wireframe/register_01.png)
![](./wireframe/register_02.png)
![](./wireframe/register_03.png)
We have implemented a user-friendly password reset process for users who have forgotten passwords.
Upon clicking "Forgot Password" in the Login page, users will be redirected to a dedicated page where they can initiate the reset process.
Users will be prompted to enter their email address to verify their identity, and a 4-digit verification code will be sent to their email.
Once the user inputs the correct code, they can create a new password.
To ensure accuracy, we require users to enter the new password twice.
This streamlined and secure password reset flow aims to provide a seamless experience for users who need to regain access to their accounts.
![](./wireframe/signup.png)
### Sign Up page
Where users can create a new account by entering their username, email, and password.
To ensure accuracy, users need to enter the password twice.
For security, the password entered by the users will become "\*\*\*\*", so there is an eye button next to it.
When pressed, the entered password will be exposed for easy input.
Then, users are required to tick the "Terms of Services & Privacy Notice" for the privacy policy of their personal data.
If users already own an account but they come to the Sign Up page, they can click “Sign in” and redirect back to the Sign Up page.
![](./wireframe/home_01.png)
![](./wireframe/home_02.png)
![](./wireframe/home_03.png)
If users complete the above information, they can click "Sign Up" to start building their unique profile to customize the personal savings plan.
First, users can choose one or more destinations they always go to. If the users dont want to perform this action at that moment, they can click "Skip" to skip this page.
After users click "Next" or "Skip", users can choose one or more activities they like. Finally, users can type their actual income and estimated expenses.
![](./wireframe/calendar_01.png)
Upon successful sign-in or sign-up, users will be directed to the home page to access an overview of their financial activity.
This includes a summary of their "Income," "Expense," and "Balance" for the selected month, with the default being the current month. Users can also view detailed information about their transactions, allowing them to track their payments and earnings.
Additionally, a calendar feature provides a monthly overview, highlighting the user's assets and expenses for each month. This comprehensive view of financial data empowers users to manage their finances effectively and make informed decisions.
![](./wireframe/chart_01.png)
The proposed feature aims to enhance user experience by introducing a dedicated “Week” page within the app.
This page will provide users with a comprehensive view of their financial activity on a weekly basis.
Users will be able to easily access detailed breakdowns of their assets and expenses for each week, allowing them to gain insights into their spending habits. The page will prominently display the balance for the selected week, enabling users to quickly assess whether their income exceeds their expenses or vice versa.
Additionally, a visually appealing pie chart will be included, using red to represent expenses and green to represent income. This graphical representation will offer users a quick overview of their financial status, facilitating easy analysis and understanding of their weekly financial data.
By incorporating this feature, users will have the ability to effectively track their financial progress and develop a comprehensive understanding of their weekly financial situation.
![](./wireframe/transaction.png)
The "Day" page offers users a detailed breakdown of their gains and expenses for a specific day.
The page displays the current date by default, providing users with real-time information. However, users also have the flexibility to select any other date they wish to explore.
This allows them to review their financial activities on a specific day and gain a more granular understanding of their income and expenditures. The "Day" page ensures users can access specific and accurate financial data to make informed decisions and manage their finances effectively.
![](./wireframe/balance.png)
### The "Assets" page
will provide users with a comprehensive summary of their financial holdings. It will be divided into "Bank Account" and "Assets."
In the Bank Account section, our app will compare their cash assets with their payment records to determine whether their cash flow status is favorable or not.
The Assets section will display all other non-cash assets recorded in the app.
This design aims to provide users with a clear overview of their financial situation and facilitate effective management of their assets.
![](./wireframe/upgrade.png)
### Settings page
The proposed "**Settings**" page allows users to personalize their app experience according to their preferences.
This comprehensive page allows users to customize various aspects of the app, including language selection, color schemes, and general preferences. Additionally, it introduces a unique feature called the **"Pro Version"**, which grants users access to enhanced functionalities such as tailored solutions for restaurants or frequently purchased goods not available in the basic plan.
Furthermore, users can manage their income and expense categories and utilize a backup feature to safeguard their data.
![](./wireframe/suggestion.png)
The provided text is an explanation of a suggestion which intends to cater to individual customer preferences based on their budget constraints.
It considers factors like distance, pricing, and personal taste in order to customize the experience according to their requirements.
Furthermore, it mentions that the platform has features such as bookmarking, sharing, and alarms (discounts) for enhancing user convenience.
For instance, if a customer wants to save money, the system would arrange options with low prices at the top of the list.
![](./wireframe/map.png)
On this page, when the customer clicks on a specific item from the suggestions list, they will find various features to help them navigate and learn more about the chosen restaurant.
A small map is displayed, highlighting the location of the restaurant for convenience.
In addition to the map, the page also includes buttons for opening a bookmark (which may be pre-loaded or created by the user) and adding a new bookmark for easy access later on. This functionality allows customers to save their favorite restaurants in one place for quick reference.
Below the map is an OpenRice link that enables users to effortlessly switch over to the OpenRice app, which can be used for further exploration of restaurants and even booking reservations.
The remaining buttons below the OpenRice link contain concise information about the suggested restaurant, such as its location, average price range, operating hours, customer ratings, and the accepted payment methods. This enables customers to make informed decisions before deciding whether to dine at that particular establishment.
## Application/Page map
![](./app_tree_diagram.png)
## Reference list
- [Investment Council survey shows that more than half of Hong Kong adults regret their financial management - the Chin family. (n.d.).](https://www.ifec.org.hk/web/tc/about-ifec/press-release/)
- Open Rise
- city mapper
- Openrise
- Zalora

BIN
sesaman/BBoney/doc/login-tree.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,867 @@
{
"name": "p233",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "p233",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"pug": "^3.0.2"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
"integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz",
"integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==",
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/types": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz",
"integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==",
"dependencies": {
"@babel/helper-string-parser": "^7.22.5",
"@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
},
"node_modules/assert-never": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz",
"integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw=="
},
"node_modules/babel-walk": {
"version": "3.0.0-canary-5",
"resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
"integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==",
"dependencies": {
"@babel/types": "^7.9.6"
},
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/call-bind": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
"integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
"dependencies": {
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.1",
"set-function-length": "^1.1.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/character-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
"integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==",
"dependencies": {
"is-regex": "^1.0.3"
}
},
"node_modules/constantinople": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
"integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==",
"dependencies": {
"@babel/parser": "^7.6.0",
"@babel/types": "^7.6.1"
}
},
"node_modules/define-data-property": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
"integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
"dependencies": {
"get-intrinsic": "^1.2.1",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/doctypes": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
"integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ=="
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-intrinsic": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
"integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
"dependencies": {
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dependencies": {
"get-intrinsic": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-property-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
"integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
"dependencies": {
"get-intrinsic": "^1.2.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dependencies": {
"has-symbols": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
"integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/is-core-module": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
"integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
"dependencies": {
"hasown": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-expression": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz",
"integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==",
"dependencies": {
"acorn": "^7.1.1",
"object-assign": "^4.1.1"
}
},
"node_modules/is-promise": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
},
"node_modules/is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/js-stringify": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
"integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g=="
},
"node_modules/jstransformer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
"integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==",
"dependencies": {
"is-promise": "^2.0.0",
"promise": "^7.0.1"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"node_modules/promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"dependencies": {
"asap": "~2.0.3"
}
},
"node_modules/pug": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz",
"integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==",
"dependencies": {
"pug-code-gen": "^3.0.2",
"pug-filters": "^4.0.0",
"pug-lexer": "^5.0.1",
"pug-linker": "^4.0.0",
"pug-load": "^3.0.0",
"pug-parser": "^6.0.0",
"pug-runtime": "^3.0.1",
"pug-strip-comments": "^2.0.0"
}
},
"node_modules/pug-attrs": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz",
"integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==",
"dependencies": {
"constantinople": "^4.0.1",
"js-stringify": "^1.0.2",
"pug-runtime": "^3.0.0"
}
},
"node_modules/pug-code-gen": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz",
"integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==",
"dependencies": {
"constantinople": "^4.0.1",
"doctypes": "^1.1.0",
"js-stringify": "^1.0.2",
"pug-attrs": "^3.0.0",
"pug-error": "^2.0.0",
"pug-runtime": "^3.0.0",
"void-elements": "^3.1.0",
"with": "^7.0.0"
}
},
"node_modules/pug-error": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz",
"integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ=="
},
"node_modules/pug-filters": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz",
"integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==",
"dependencies": {
"constantinople": "^4.0.1",
"jstransformer": "1.0.0",
"pug-error": "^2.0.0",
"pug-walk": "^2.0.0",
"resolve": "^1.15.1"
}
},
"node_modules/pug-lexer": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz",
"integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==",
"dependencies": {
"character-parser": "^2.2.0",
"is-expression": "^4.0.0",
"pug-error": "^2.0.0"
}
},
"node_modules/pug-linker": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz",
"integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==",
"dependencies": {
"pug-error": "^2.0.0",
"pug-walk": "^2.0.0"
}
},
"node_modules/pug-load": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz",
"integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==",
"dependencies": {
"object-assign": "^4.1.1",
"pug-walk": "^2.0.0"
}
},
"node_modules/pug-parser": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz",
"integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==",
"dependencies": {
"pug-error": "^2.0.0",
"token-stream": "1.0.0"
}
},
"node_modules/pug-runtime": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz",
"integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg=="
},
"node_modules/pug-strip-comments": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz",
"integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==",
"dependencies": {
"pug-error": "^2.0.0"
}
},
"node_modules/pug-walk": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz",
"integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ=="
},
"node_modules/resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
"integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
"dependencies": {
"is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/set-function-length": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
"integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
"dependencies": {
"define-data-property": "^1.1.1",
"get-intrinsic": "^1.2.1",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
"engines": {
"node": ">=4"
}
},
"node_modules/token-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz",
"integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg=="
},
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
"integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/with": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
"integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==",
"dependencies": {
"@babel/parser": "^7.9.6",
"@babel/types": "^7.9.6",
"assert-never": "^1.2.1",
"babel-walk": "3.0.0-canary-5"
},
"engines": {
"node": ">= 10.0.0"
}
}
},
"dependencies": {
"@babel/helper-string-parser": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
"integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw=="
},
"@babel/helper-validator-identifier": {
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A=="
},
"@babel/parser": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz",
"integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw=="
},
"@babel/types": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz",
"integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==",
"requires": {
"@babel/helper-string-parser": "^7.22.5",
"@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
}
},
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
},
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
},
"assert-never": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz",
"integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw=="
},
"babel-walk": {
"version": "3.0.0-canary-5",
"resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
"integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==",
"requires": {
"@babel/types": "^7.9.6"
}
},
"call-bind": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
"integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
"requires": {
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.1",
"set-function-length": "^1.1.1"
}
},
"character-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
"integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==",
"requires": {
"is-regex": "^1.0.3"
}
},
"constantinople": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
"integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==",
"requires": {
"@babel/parser": "^7.6.0",
"@babel/types": "^7.6.1"
}
},
"define-data-property": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
"integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
"requires": {
"get-intrinsic": "^1.2.1",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.0"
}
},
"doctypes": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
"integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ=="
},
"function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
},
"get-intrinsic": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
"integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
"requires": {
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
}
},
"gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"requires": {
"get-intrinsic": "^1.1.3"
}
},
"has-property-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
"integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
"requires": {
"get-intrinsic": "^1.2.2"
}
},
"has-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="
},
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
},
"has-tostringtag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"requires": {
"has-symbols": "^1.0.2"
}
},
"hasown": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
"integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
"requires": {
"function-bind": "^1.1.2"
}
},
"is-core-module": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
"integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
"requires": {
"hasown": "^2.0.0"
}
},
"is-expression": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz",
"integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==",
"requires": {
"acorn": "^7.1.1",
"object-assign": "^4.1.1"
}
},
"is-promise": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
},
"is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"requires": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
}
},
"js-stringify": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
"integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g=="
},
"jstransformer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
"integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==",
"requires": {
"is-promise": "^2.0.0",
"promise": "^7.0.1"
}
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
},
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"requires": {
"asap": "~2.0.3"
}
},
"pug": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz",
"integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==",
"requires": {
"pug-code-gen": "^3.0.2",
"pug-filters": "^4.0.0",
"pug-lexer": "^5.0.1",
"pug-linker": "^4.0.0",
"pug-load": "^3.0.0",
"pug-parser": "^6.0.0",
"pug-runtime": "^3.0.1",
"pug-strip-comments": "^2.0.0"
}
},
"pug-attrs": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz",
"integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==",
"requires": {
"constantinople": "^4.0.1",
"js-stringify": "^1.0.2",
"pug-runtime": "^3.0.0"
}
},
"pug-code-gen": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz",
"integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==",
"requires": {
"constantinople": "^4.0.1",
"doctypes": "^1.1.0",
"js-stringify": "^1.0.2",
"pug-attrs": "^3.0.0",
"pug-error": "^2.0.0",
"pug-runtime": "^3.0.0",
"void-elements": "^3.1.0",
"with": "^7.0.0"
}
},
"pug-error": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz",
"integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ=="
},
"pug-filters": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz",
"integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==",
"requires": {
"constantinople": "^4.0.1",
"jstransformer": "1.0.0",
"pug-error": "^2.0.0",
"pug-walk": "^2.0.0",
"resolve": "^1.15.1"
}
},
"pug-lexer": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz",
"integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==",
"requires": {
"character-parser": "^2.2.0",
"is-expression": "^4.0.0",
"pug-error": "^2.0.0"
}
},
"pug-linker": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz",
"integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==",
"requires": {
"pug-error": "^2.0.0",
"pug-walk": "^2.0.0"
}
},
"pug-load": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz",
"integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==",
"requires": {
"object-assign": "^4.1.1",
"pug-walk": "^2.0.0"
}
},
"pug-parser": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz",
"integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==",
"requires": {
"pug-error": "^2.0.0",
"token-stream": "1.0.0"
}
},
"pug-runtime": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz",
"integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg=="
},
"pug-strip-comments": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz",
"integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==",
"requires": {
"pug-error": "^2.0.0"
}
},
"pug-walk": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz",
"integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ=="
},
"resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
"integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
"requires": {
"is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
}
},
"set-function-length": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
"integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
"requires": {
"define-data-property": "^1.1.1",
"get-intrinsic": "^1.2.1",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.0"
}
},
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
},
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
},
"token-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz",
"integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg=="
},
"void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
"integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="
},
"with": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
"integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==",
"requires": {
"@babel/parser": "^7.9.6",
"@babel/types": "^7.9.6",
"assert-never": "^1.2.1",
"babel-walk": "3.0.0-canary-5"
}
}
}
}

View File

@@ -0,0 +1,17 @@
{
"name": "p233",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"render:html":"nodemon --ext \"pug\" ./render.js",
"render:scss":"sass --watch style.scss ./public/style.css"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"pug": "^3.0.2"
}
}

View File

@@ -0,0 +1 @@
<link rel="stylesheet" type="text/css" href="/style.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&amp;display=swap"/><div class="container"><div id="wrapper"><span class="label"><div class="label_text">Calendar</div></span></div></div>

View File

@@ -0,0 +1 @@
<link rel="stylesheet" type="text/css" href="/style.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&amp;display=swap"/><div class="container"><div id="wrapper"><span class="label">App</span><div class="branch lv1"><div class="entry"><link rel="stylesheet" type="text/css" href="/style.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&amp;display=swap"/><div class="container"><div id="wrapper"><span class="label"><div class="label_text">Login/登入</div></span><div class="branch lv2"><div class="entry"><span class="label">Forget Password</span></div><div class="entry"><span class="label">Verify Email</span></div><div class="entry"><span class="label">Create New Password</span></div></div></div></div></div><div class="entry"><link rel="stylesheet" type="text/css" href="/style.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&amp;display=swap"/><div class="container"><div id="wrapper"><span class="label"><div class="label_text">Sign up</div></span><div class="branch lv2"><div class="entry"><span class="label">Destinations</span></div><div class="entry"><span class="label">Activities</span></div><div class="entry"><span class="label">Income / Expenses</span></div></div></div></div></div><div class="entry"><link rel="stylesheet" type="text/css" href="/style.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&amp;display=swap"/><div class="container"><div id="wrapper"><span class="label"><div class="label_text">Calendar</div></span></div></div></div><div class="entry"><link rel="stylesheet" type="text/css" href="/style.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&amp;display=swap"/><div class="container"><div id="wrapper"><span class="label"><div class="label_text">Map</div></span></div></div></div><div class="entry"><link rel="stylesheet" type="text/css" href="/style.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&amp;display=swap"/><div class="container"><div id="wrapper"><span class="label"><div class="label_text">Logout/登出</div></span></div></div></div><div class="entry"><link rel="stylesheet" type="text/css" href="/style.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&amp;display=swap"/><div class="container"><div id="wrapper"><span class="label"><div class="label_text">Example</div></span><div class="branch lv2"><div class="entry"><span class="label">Entry-3-1</span></div><div class="entry"><span class="label">Entry-3-2</span></div><div class="entry"><span class="label">Entry-3-3</span><div class="branch lv3"><div class="entry"><span class="label">Entry-3-3-1</span></div><div class="entry"><span class="label">Entry-3-3-2</span><div class="branch lv4"><div class="entry"><span class="label">Entry-3-3-2-1</span></div><div class="entry"><span class="label">Entry-3-3-2-2</span></div></div></div><div class="entry"><span class="label">Entry-3-3-3</span></div></div></div><div class="entry"><span class="label">Entry-3-4</span></div></div></div></div></div><div class="entry"><span class="label">Entry-3</span><div class="branch lv2"><div class="entry"><span class="label">Entry-3-1</span></div><div class="entry"><span class="label">Entry-3-2</span></div><div class="entry"><span class="label">Entry-3-3</span><div class="branch lv3"><div class="entry"><span class="label">Entry-3-3-1</span></div><div class="entry"><span class="label">Entry-3-3-2</span><div class="branch lv4"><div class="entry"><span class="label">Entry-3-3-2-1</span></div><div class="entry"><span class="label">Entry-3-3-2-2</span></div></div></div><div class="entry"><span class="label">Entry-3-3-3</span></div></div></div><div class="entry"><span class="label">Entry-3-4</span></div></div></div></div></div></div>

View File

@@ -0,0 +1 @@
<link rel="stylesheet" type="text/css" href="/style.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&amp;display=swap"/><div class="container"><div id="wrapper"><span class="label"><div class="label_text">Login/登入</div></span><div class="branch lv2"><div class="entry"><span class="label">Forget Password</span></div><div class="entry"><span class="label">Verify Email</span></div><div class="entry"><span class="label">Create New Password</span></div></div></div></div>

View File

@@ -0,0 +1 @@
<link rel="stylesheet" type="text/css" href="/style.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&amp;display=swap"/><div class="container"><div id="wrapper"><span class="label"><div class="label_text">Sign up</div></span><div class="branch lv2"><div class="entry"><span class="label">Destinations</span></div><div class="entry"><span class="label">Activities</span></div><div class="entry"><span class="label">Income / Expenses</span></div></div></div></div>

View File

@@ -0,0 +1,119 @@
.hidden {
display: none;
}
.highlight {
color: rgb(245, 245, 245);
background-color: rgb(249, 148, 23);
}
*, *:before, *:after {
font-family: "Noto Sans TC", sans-serif;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
body {
min-width: 1200px;
margin: 0;
padding: 50px;
color: rgb(245, 245, 245);
font: 16px Verdana, sans-serif;
background: rgb(54, 48, 98);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.container {
padding: 1rem;
}
#wrapper {
position: relative;
}
.branch {
position: relative;
margin-left: 250px;
}
.branch:before {
content: "";
width: 50px;
border-top: 2px solid rgb(245, 245, 245);
position: absolute;
left: -100px;
top: 50%;
margin-top: 1px;
}
.entry {
position: relative;
min-height: 80px;
}
.entry:before {
content: "";
height: 100%;
border-left: 2px solid rgb(245, 245, 245);
position: absolute;
left: -50px;
}
.entry:after {
content: "";
width: 50px;
border-top: 2px solid rgb(245, 245, 245);
position: absolute;
left: -50px;
top: 50%;
margin-top: 1px;
}
.entry:first-child:before {
width: 10px;
height: 50%;
top: 50%;
margin-top: 2px;
border-radius: 10px 0 0 0;
}
.entry:first-child:after {
height: 10px;
border-radius: 10px 0 0 0;
}
.entry:last-child:before {
width: 10px;
height: 50%;
border-radius: 0 0 0 10px;
}
.entry:last-child:after {
height: 10px;
border-top: none;
border-bottom: 2px solid rgb(245, 245, 245);
border-radius: 0 0 0 10px;
margin-top: -9px;
}
.entry.sole:before {
display: none;
}
.entry.sole:after {
width: 50px;
height: 0;
margin-top: 1px;
border-radius: 0;
}
.label {
display: block;
min-width: 150px;
padding: 5px 10px;
line-height: 40px;
text-align: center;
border: 2px solid rgb(245, 245, 245);
border-radius: 5px;
position: absolute;
left: 0;
top: 50%;
margin-top: -25px;
}
/*# sourceMappingURL=style.css.map */

View File

@@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["../style.scss"],"names":[],"mappings":"AAuBA;EACE;;;AAGF;EACE,OARY;EASZ,kBAVa;;;AAiBf;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA,OA5CM;EA6CN;EACA,YAhCa;EAiCb;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;EACA,YAvEiB;;AAwEjB;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;EACE,OA5FU;EA6FV;EACA;EACA;EACA;;AAEF;EACE,QAnGU;EAoGV;;AAIF;EACE,OAzGU;EA0GV;EACA;;AAEF;EACE,QA9GU;EA+GV;EACA;EACA;EACA;;AAIF;EACE;;AAEF;EACE;EACA;EACA;EACA;;;AAKN;EACE;EACA,WAhIY;EAiIZ;EACA;EACA;EACA;EACA,eAjIoB;EAkIpB;EACA;EACA;EACA","file":"style.css"}

View File

@@ -0,0 +1,7 @@
link(rel='stylesheet', type='text/css', href='/style.css')
link(rel='stylesheet', href='https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&display=swap')
.container
#wrapper
span.label
div.label_text Calendar

View File

@@ -0,0 +1,28 @@
link(rel='stylesheet', type='text/css', href='/style.css')
link(rel='stylesheet', href='https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&display=swap')
.container
#wrapper
span.label
div.label_text Example
.branch.lv2
.entry
span.label Entry-3-1
.entry
span.label Entry-3-2
.entry
span.label Entry-3-3
.branch.lv3
.entry
span.label Entry-3-3-1
.entry
span.label Entry-3-3-2
.branch.lv4
.entry
span.label Entry-3-3-2-1
.entry
span.label Entry-3-3-2-2
.entry
span.label Entry-3-3-3
.entry
span.label Entry-3-4

View File

@@ -0,0 +1,49 @@
link(rel='stylesheet', type='text/css', href='/style.css')
link(rel='stylesheet', href='https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&display=swap')
.container
#wrapper
span.label App
.branch.lv1
.entry
include ./login.pug
.entry
include ./sign_up.pug
.entry
include ./calendar.pug
.entry
include ./map.pug
.entry
include ./logout.pug
.entry
include ./example.pug
.entry
span.label Entry-3
.branch.lv2
.entry
span.label Entry-3-1
.entry
span.label Entry-3-2
.entry
span.label Entry-3-3
.branch.lv3
.entry
span.label Entry-3-3-1
.entry
span.label Entry-3-3-2
.branch.lv4
.entry
span.label Entry-3-3-2-1
.entry
span.label Entry-3-3-2-2
.entry
span.label Entry-3-3-3
.entry
span.label Entry-3-4

View File

@@ -0,0 +1,14 @@
link(rel='stylesheet', type='text/css', href='/style.css')
link(rel='stylesheet', href='https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&display=swap')
.container
#wrapper
span.label
div.label_text Login/登入
.branch.lv2
.entry
span.label Forget Password
.entry
span.label Verify Email
.entry
span.label Create New Password

View File

@@ -0,0 +1,7 @@
link(rel='stylesheet', type='text/css', href='/style.css')
link(rel='stylesheet', href='https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&display=swap')
.container
#wrapper
span.label
div.label_text Logout/登出

View File

@@ -0,0 +1,7 @@
link(rel='stylesheet', type='text/css', href='/style.css')
link(rel='stylesheet', href='https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&display=swap')
.container
#wrapper
span.label
div.label_text Map

View File

@@ -0,0 +1,14 @@
link(rel='stylesheet', type='text/css', href='/style.css')
link(rel='stylesheet', href='https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;200;300;400;500;700;900&display=swap')
.container
#wrapper
span.label
div.label_text Sign up
.branch.lv2
.entry
span.label Destinations
.entry
span.label Activities
.entry
span.label Income / Expenses

View File

@@ -0,0 +1,21 @@
const pug = require('pug');
const fs = require('fs');
// Compile the source code
// const compiledFunction = pug.compileFile('index.pug');
fs.writeFile('./public/index.html', pug.compileFile('./pug/index.pug')({ }), {encoding:'utf-8'},(err) =>{
if (err) console.log(err);
});
fs.writeFile('./public/login.html', pug.compileFile('./pug/login.pug')({ }), {encoding:'utf-8'},(err) =>{
if (err) console.log(err);
});
fs.writeFile('./public/sign_up.html', pug.compileFile('./pug/sign_up.pug')({ }), {encoding:'utf-8'},(err) =>{
if (err) console.log(err);
});
fs.writeFile('./public/calendar.html', pug.compileFile('./pug/calendar.pug')({ }), {encoding:'utf-8'},(err) =>{
if (err) console.log(err);
});

View File

@@ -0,0 +1,119 @@
.hidden {
display: none;
}
.highlight {
color: rgb(245, 245, 245);
background-color: rgb(249, 148, 23);
}
*, *:before, *:after {
font-family: "Noto Sans TC", sans-serif;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
body {
min-width: 1200px;
margin: 0;
padding: 50px;
color: rgb(245, 245, 245);
font: 16px Verdana, sans-serif;
background: rgb(54, 48, 98);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.container {
padding: 1rem;
}
#wrapper {
position: relative;
}
.branch {
position: relative;
margin-left: 250px;
}
.branch:before {
content: "";
width: 50px;
border-top: 2px solid rgb(245, 245, 245);
position: absolute;
left: -100px;
top: 50%;
margin-top: 1px;
}
.entry {
position: relative;
min-height: 80px;
}
.entry:before {
content: "";
height: 100%;
border-left: 2px solid rgb(245, 245, 245);
position: absolute;
left: -50px;
}
.entry:after {
content: "";
width: 50px;
border-top: 2px solid rgb(245, 245, 245);
position: absolute;
left: -50px;
top: 50%;
margin-top: 1px;
}
.entry:first-child:before {
width: 10px;
height: 50%;
top: 50%;
margin-top: 2px;
border-radius: 10px 0 0 0;
}
.entry:first-child:after {
height: 10px;
border-radius: 10px 0 0 0;
}
.entry:last-child:before {
width: 10px;
height: 50%;
border-radius: 0 0 0 10px;
}
.entry:last-child:after {
height: 10px;
border-top: none;
border-bottom: 2px solid rgb(245, 245, 245);
border-radius: 0 0 0 10px;
margin-top: -9px;
}
.entry.sole:before {
display: none;
}
.entry.sole:after {
width: 50px;
height: 0;
margin-top: 1px;
border-radius: 0;
}
.label {
display: block;
min-width: 150px;
padding: 5px 10px;
line-height: 40px;
text-align: center;
border: 2px solid rgb(245, 245, 245);
border-radius: 5px;
position: absolute;
left: 0;
top: 50%;
margin-top: -25px;
}
/*# sourceMappingURL=style.css.map */

View File

@@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["style.scss"],"names":[],"mappings":"AAuBA;EACE;;;AAGF;EACE,OARY;EASZ,kBAVa;;;AAiBf;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA,OA5CM;EA6CN;EACA,YAhCa;EAiCb;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;EACA,YAvEiB;;AAwEjB;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;EACE,OA5FU;EA6FV;EACA;EACA;EACA;;AAEF;EACE,QAnGU;EAoGV;;AAIF;EACE,OAzGU;EA0GV;EACA;;AAEF;EACE,QA9GU;EA+GV;EACA;EACA;EACA;;AAIF;EACE;;AAEF;EACE;EACA;EACA;EACA;;;AAKN;EACE;EACA,WAhIY;EAiIZ;EACA;EACA;EACA;EACA,eAjIoB;EAkIpB;EACA;EACA;EACA","file":"style.css"}

View File

@@ -0,0 +1,151 @@
//------- {{ Variables }} -------//
$white: rgb(245, 245, 245);
$bg: rgb(77, 76, 125);
$horizontal-gutter: 100px;
$border-radius: 10px;
$entry-min-height: 80px;
$label-width: 150px;
$label-height: 50px;
$label-padding-y: 5px;
$label-padding-x: 10px;
$label-border-radius: 5px;
$color-navy-1: rgb(54, 48, 98);
$color-navy-2: rgb(77, 76, 125);
$color-orange: rgb(249, 148, 23);
$color-white: rgb(245, 245, 245);
//------- {{ Styles }} -------//
.hidden {
display: none;
}
.highlight {
color: $color-white;
background-color: $color-orange
}
.label_text {
}
*, *:before, *:after {
font-family: 'Noto Sans TC', sans-serif;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
body {
min-width: 1200px;
margin: 0;
padding: 50px;
color: $white;
font: 16px Verdana, sans-serif;
background: $color-navy-1;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.container {
padding: 1rem;
}
#wrapper {
position: relative;
}
.branch {
position: relative;
margin-left: $horizontal-gutter + $label-width;
&:before {
content: "";
width: calc($horizontal-gutter / 2);
border-top: 2px solid $white;
position: absolute;
left: -$horizontal-gutter;
top: 50%;
margin-top: 1px;
}
}
.entry {
position: relative;
min-height: $entry-min-height;
&:before {
content: "";
height: 100%;
border-left: 2px solid $white;
position: absolute;
left: -(calc( $horizontal-gutter / 2 ));
}
&:after {
content: "";
width: calc( $horizontal-gutter / 2 );
border-top: 2px solid $white;
position: absolute;
left: -(calc( $horizontal-gutter / 2 ));
top: 50%;
margin-top: 1px;
}
&:first-child {
&:before {
width: $border-radius;
height: 50%;
top: 50%;
margin-top: 2px;
border-radius: $border-radius 0 0 0;
}
&:after {
height: $border-radius;
border-radius: $border-radius 0 0 0;
}
}
&:last-child {
&:before {
width: $border-radius;
height: 50%;
border-radius: 0 0 0 $border-radius;
}
&:after {
height: $border-radius;
border-top: none;
border-bottom: 2px solid $white;
border-radius: 0 0 0 $border-radius;
margin-top: -$border-radius + 1px;
}
}
&.sole {
&:before {
display: none;
}
&:after {
width: calc($horizontal-gutter / 2);
height: 0;
margin-top: 1px;
border-radius: 0;
}
}
}
.label {
display: block;
min-width: $label-width;
padding: $label-padding-y $label-padding-x;
line-height: $label-height - $label-padding-y * 2;
text-align: center;
border: 2px solid $white;
border-radius: $label-border-radius;
position: absolute;
left: 0;
top: 50%;
margin-top: -(calc( $label-height / 2 ));
}

BIN
sesaman/BBoney/doc/wireframe/balance.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/calendar_01.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/chart_01.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/home_01.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/home_02.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/home_03.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/login.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/map.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/register_01.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/register_02.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/register_03.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/signup.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/suggestion.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/transaction.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sesaman/BBoney/doc/wireframe/upgrade.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div style="
width: 800px;
height: 800px;
background-size: contain;
background-image: url('./phone-frame.png');
background-position: center;
background-repeat: no-repeat;
">
</div>
</body>
</html>

BIN
sesaman/BBoney/preview/login/phone-frame.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,5 @@
* {
padding: 0px;
margin: 0px;
box-sizing: border-box;
}

7
sesaman/gitUpdate.bat Normal file
View File

@@ -0,0 +1,7 @@
git status .
@pause
git add .
git commit -m"update sesaman,"
start git push

11
sesaman/meta.md Normal file
View File

@@ -0,0 +1,11 @@
---
tags: [polite, pending, tree-diagram]
---
# BBoney
[[BBoney/doc/digest]]
[//begin]: # "Autogenerated link references for markdown compatibility"
[BBoney/doc/digest]: BBoney/doc/digest.md "Name of the App:"
[//end]: # "Autogenerated link references"

16
sesaman/package.json Normal file
View File

@@ -0,0 +1,16 @@
{
"name": "sesaman",
"version": "1.0.0",
"description": "",
"main": "index.js",
"directories": {
"doc": "doc"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"gitUpdate":"git add . && git commit -m\"update,\""
},
"keywords": [],
"author": "",
"license": "ISC"
}