Compare commits
3 commits
218af8bcf1
...
7487c327cd
| Author | SHA1 | Date | |
|---|---|---|---|
| 7487c327cd | |||
| 42c3565902 | |||
|
|
a4039fd7ba |
27 changed files with 41 additions and 6785 deletions
8
.cz.toml
8
.cz.toml
|
|
@ -1,8 +0,0 @@
|
||||||
[tool.commitizen]
|
|
||||||
name = "cz_conventional_commits"
|
|
||||||
tag_format = "$version"
|
|
||||||
version_scheme = "semver"
|
|
||||||
version_provider = "npm"
|
|
||||||
update_changelog_on_bump = true
|
|
||||||
major_version_zero = true
|
|
||||||
changelog_incremental = true
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
module.exports = {
|
|
||||||
env: {
|
|
||||||
browser: true,
|
|
||||||
es2021: true,
|
|
||||||
},
|
|
||||||
extends: [
|
|
||||||
'standard-with-typescript',
|
|
||||||
'plugin:react/recommended',
|
|
||||||
'plugin:cypress/recommended',
|
|
||||||
'prettier',
|
|
||||||
],
|
|
||||||
overrides: [
|
|
||||||
{
|
|
||||||
env: {
|
|
||||||
node: true,
|
|
||||||
},
|
|
||||||
files: ['.eslintrc.{js,cjs}'],
|
|
||||||
parserOptions: {
|
|
||||||
sourceType: 'script',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
parserOptions: {
|
|
||||||
ecmaVersion: 'latest',
|
|
||||||
sourceType: 'module',
|
|
||||||
project: ['./tsconfig.json'],
|
|
||||||
},
|
|
||||||
plugins: ['react', 'cypress'],
|
|
||||||
rules: {},
|
|
||||||
};
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
module.exports = {
|
|
||||||
tabWidth: 2,
|
|
||||||
singleQuote: true,
|
|
||||||
endOfLine: 'auto',
|
|
||||||
'eol-last': 2,
|
|
||||||
trailingComma: 'all',
|
|
||||||
plugins: [require.resolve("prettier-plugin-astro")],
|
|
||||||
overrides: [
|
|
||||||
{
|
|
||||||
files: "*.astro",
|
|
||||||
options: {
|
|
||||||
parser: "astro",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
[tools]
|
|
||||||
node = "20"
|
|
||||||
4
.vscode/extensions.json
vendored
4
.vscode/extensions.json
vendored
|
|
@ -1,4 +0,0 @@
|
||||||
{
|
|
||||||
"recommendations": ["astro-build.astro-vscode"],
|
|
||||||
"unwantedRecommendations": []
|
|
||||||
}
|
|
||||||
11
.vscode/launch.json
vendored
11
.vscode/launch.json
vendored
|
|
@ -1,11 +0,0 @@
|
||||||
{
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"command": "./node_modules/.bin/astro dev",
|
|
||||||
"name": "Development server",
|
|
||||||
"request": "launch",
|
|
||||||
"type": "node-terminal"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
when:
|
|
||||||
- branch: main
|
|
||||||
|
|
||||||
steps:
|
|
||||||
build-and-publish:
|
|
||||||
when:
|
|
||||||
branch: main
|
|
||||||
image: node:20-alpine
|
|
||||||
secrets:
|
|
||||||
- codeberg_ssh_key
|
|
||||||
commands:
|
|
||||||
- apk add git openssh-client
|
|
||||||
- git config --global user.email "woodpecker@bot.net"
|
|
||||||
- git config --global user.name "woodpecker-bot"
|
|
||||||
- git remote add codeberg-ssh git@codeberg.org:aleidk/personal-page.git
|
|
||||||
- mkdir -p $HOME/.ssh
|
|
||||||
- ssh-keyscan -t rsa codeberg.org >> $HOME/.ssh/known_hosts
|
|
||||||
- echo "$CODEBERG_SSH_KEY" > $HOME/.ssh/id_rsa
|
|
||||||
- chmod 0600 $HOME/.ssh/id_rsa
|
|
||||||
- corepack enable
|
|
||||||
- corepack prepare pnpm@latest --activate
|
|
||||||
- pnpm install
|
|
||||||
- pnpm build
|
|
||||||
- |
|
|
||||||
cat >dist/.domains <<EOL
|
|
||||||
blog.panconpalta.win
|
|
||||||
personal-page.aleidk.codeberg.page
|
|
||||||
pages.personal-page.aleidk.codeberg.page
|
|
||||||
EOL
|
|
||||||
- pnpm exec gh-pages --dist dist --branch pages --dotfiles --remote codeberg-ssh
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
/** @type {import('astro-i18next').AstroI18nextConfig} */
|
|
||||||
export default {
|
|
||||||
defaultLocale: 'en',
|
|
||||||
locales: ['en', 'es'],
|
|
||||||
};
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
import { defineConfig } from 'astro/config';
|
|
||||||
|
|
||||||
import react from '@astrojs/react';
|
|
||||||
import astroI18next from 'astro-i18next';
|
|
||||||
|
|
||||||
// https://astro.build/config
|
|
||||||
export default defineConfig({
|
|
||||||
prefetch: true,
|
|
||||||
integrations: [react(), astroI18next()],
|
|
||||||
experimental: {},
|
|
||||||
redirects: {
|
|
||||||
'/projects': '/projects/1',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
24
cog.toml
Normal file
24
cog.toml
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
from_latest_tag = true
|
||||||
|
ignore_merge_commits = false
|
||||||
|
disable_changelog = false
|
||||||
|
disable_bump_commit = false
|
||||||
|
generate_mono_repository_global_tag = true
|
||||||
|
branch_whitelist = []
|
||||||
|
skip_ci = "[skip ci]"
|
||||||
|
skip_untracked = false
|
||||||
|
pre_bump_hooks = []
|
||||||
|
post_bump_hooks = []
|
||||||
|
pre_package_bump_hooks = []
|
||||||
|
post_package_bump_hooks = []
|
||||||
|
|
||||||
|
[git_hooks]
|
||||||
|
|
||||||
|
[commit_types]
|
||||||
|
|
||||||
|
[changelog]
|
||||||
|
path = "CHANGELOG.md"
|
||||||
|
authors = []
|
||||||
|
|
||||||
|
[bump_profiles]
|
||||||
|
|
||||||
|
[packages]
|
||||||
16
config.toml
Normal file
16
config.toml
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
# The URL the site will be built for
|
||||||
|
base_url = "https://alecodes.page"
|
||||||
|
|
||||||
|
# Whether to automatically compile all Sass files in the sass directory
|
||||||
|
compile_sass = true
|
||||||
|
|
||||||
|
# Whether to build a search index to be used later on by a JavaScript library
|
||||||
|
build_search_index = true
|
||||||
|
|
||||||
|
[markdown]
|
||||||
|
# Whether to do syntax highlighting
|
||||||
|
# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
|
||||||
|
highlight_code = true
|
||||||
|
|
||||||
|
[extra]
|
||||||
|
# Put all your custom variables here
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
import { defineConfig } from 'cypress';
|
|
||||||
|
|
||||||
export default defineConfig({
|
|
||||||
e2e: {
|
|
||||||
baseUrl: 'http://localhost:3000',
|
|
||||||
setupNodeEvents(on, config) {
|
|
||||||
// implement node event listeners here
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
describe('The Home Page', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.visit('/');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Successfully load', () => {
|
|
||||||
cy.get('h1')
|
|
||||||
.should('have.length', 1)
|
|
||||||
.should('have.text', 'Alexander Navarro');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Card components have content', () => {
|
|
||||||
cy.get('.card')
|
|
||||||
.should('have.length', 3)
|
|
||||||
.each(($card) => {
|
|
||||||
cy.wrap($card)
|
|
||||||
.find('li')
|
|
||||||
.should(($li) => expect($li).to.have.lengthOf.at.most(3))
|
|
||||||
.find('a')
|
|
||||||
.should('have.attr', 'href');
|
|
||||||
|
|
||||||
cy.wrap($card).contains('See more...');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"name": "Using fixtures to represent data",
|
|
||||||
"email": "hello@cypress.io",
|
|
||||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
|
||||||
}
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
/// <reference types="cypress" />
|
|
||||||
// ***********************************************
|
|
||||||
// This example commands.ts shows you how to
|
|
||||||
// create various custom commands and overwrite
|
|
||||||
// existing commands.
|
|
||||||
//
|
|
||||||
// For more comprehensive examples of custom
|
|
||||||
// commands please read more here:
|
|
||||||
// https://on.cypress.io/custom-commands
|
|
||||||
// ***********************************************
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This is a parent command --
|
|
||||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This is a child command --
|
|
||||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This is a dual command --
|
|
||||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This will overwrite an existing command --
|
|
||||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
|
||||||
//
|
|
||||||
// declare global {
|
|
||||||
// namespace Cypress {
|
|
||||||
// interface Chainable {
|
|
||||||
// login(email: string, password: string): Chainable<void>
|
|
||||||
// drag(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
|
|
||||||
// dismiss(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
|
|
||||||
// visit(originalFn: CommandOriginalFn, url: string, options: Partial<VisitOptions>): Chainable<Element>
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
// ***********************************************************
|
|
||||||
// This example support/e2e.ts is processed and
|
|
||||||
// loaded automatically before your test files.
|
|
||||||
//
|
|
||||||
// This is a great place to put global configuration and
|
|
||||||
// behavior that modifies Cypress.
|
|
||||||
//
|
|
||||||
// You can change the location of this file or turn off
|
|
||||||
// automatically serving support files with the
|
|
||||||
// 'supportFile' configuration option.
|
|
||||||
//
|
|
||||||
// You can read more here:
|
|
||||||
// https://on.cypress.io/configuration
|
|
||||||
// ***********************************************************
|
|
||||||
|
|
||||||
// Import commands.js using ES2015 syntax:
|
|
||||||
import './commands'
|
|
||||||
|
|
||||||
// Alternatively you can use CommonJS syntax:
|
|
||||||
// require('./commands')
|
|
||||||
12
deploy.sh
12
deploy.sh
|
|
@ -1,12 +0,0 @@
|
||||||
#!/bin/env bash
|
|
||||||
|
|
||||||
pnpm run build
|
|
||||||
|
|
||||||
## Add domain to codeberg pages
|
|
||||||
cat >dist/.domains <<EOL
|
|
||||||
blog.panconpalta.win
|
|
||||||
personal-page.aleidk.codeberg.page
|
|
||||||
pages.personal-page.aleidk.codeberg.page
|
|
||||||
EOL
|
|
||||||
|
|
||||||
pnpm exec gh-pages --dist dist --branch pages --dotfiles
|
|
||||||
34
package.json
34
package.json
|
|
@ -2,42 +2,10 @@
|
||||||
"name": "personal-page",
|
"name": "personal-page",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"scripts": {
|
"scripts": { },
|
||||||
"dev": "astro dev --port 3000",
|
|
||||||
"start": "astro dev",
|
|
||||||
"build": "astro build",
|
|
||||||
"preview": "astro preview",
|
|
||||||
"astro": "astro",
|
|
||||||
"localize": "astro-i18next generate"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/react": "^3.0.7",
|
|
||||||
"@astrojs/ts-plugin": "^1.3.1",
|
|
||||||
"@types/react": "^18.0.21",
|
|
||||||
"@types/react-dom": "^18.0.6",
|
|
||||||
"astro": "^4.0.6",
|
|
||||||
"astro-i18next": "1.0.0-beta.21",
|
|
||||||
"i18next": "^22.5.1",
|
|
||||||
"i18next-fs-backend": "^2.3.1",
|
|
||||||
"react": "^18.0.0",
|
|
||||||
"react-dom": "^18.0.0",
|
|
||||||
"sass": "^1.71.1",
|
|
||||||
"sharp": "^0.32.6"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
||||||
"cypress": "^13.6.1",
|
|
||||||
"eslint": "^8.53.0",
|
|
||||||
"eslint-config-prettier": "^8.10.0",
|
|
||||||
"eslint-config-standard-with-typescript": "^35.0.0",
|
|
||||||
"eslint-plugin-cypress": "^2.15.1",
|
|
||||||
"eslint-plugin-import": "^2.29.0",
|
|
||||||
"eslint-plugin-n": "^15.7.0",
|
|
||||||
"eslint-plugin-promise": "^6.1.1",
|
|
||||||
"eslint-plugin-react": "^7.33.2",
|
|
||||||
"gh-pages": "^5.0.0",
|
|
||||||
"prettier": "^2.8.8",
|
|
||||||
"prettier-plugin-astro": "^0.10.0",
|
|
||||||
"typescript": "^5.2.2"
|
"typescript": "^5.2.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
6406
pnpm-lock.yaml
generated
6406
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,9 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
|
|
||||||
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
|
|
||||||
<style>
|
|
||||||
path { fill: #000; }
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
path { fill: #FFF; }
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 749 B |
Binary file not shown.
|
Before Width: | Height: | Size: 86 KiB |
|
|
@ -1,32 +0,0 @@
|
||||||
Curious and self-taught by nature, my history with computing began in the late
|
|
||||||
2000s, tinkering with the family PC (sometimes with disastrous results). This
|
|
||||||
led me to always try to answer the "how does it work...?", "how can I do...?",
|
|
||||||
or "how can I fix...?", leading me to self-investigation and
|
|
||||||
exploration in various mediums that provide me with the knowledge to
|
|
||||||
**fix**, **create**, and **build** projects.
|
|
||||||
|
|
||||||
The area I like the most is **web programming** as a **fullstack
|
|
||||||
developer**, but it is not the only thing I can do, as I'm also good in creating
|
|
||||||
**terminal applications** and **scripts**. I can work to solve any problem in a
|
|
||||||
conventional way or invent new solutions.
|
|
||||||
|
|
||||||
My love for video games has played an important role in my life, not only in
|
|
||||||
enjoying playing them, but going beyond to understand how they work
|
|
||||||
under the hood in their different areas: game mechanics, narratives, level
|
|
||||||
design, music, art, among others. I find it fascinating to see how developers
|
|
||||||
overcome difficulties and invent innovative solutions to provide the best
|
|
||||||
experience for the players.
|
|
||||||
|
|
||||||
My philosophy is based on **always trying to improve**, though studies,
|
|
||||||
research and updates that have provided me with knowledge of various
|
|
||||||
technologies, such as: Javascript, Python, Rust, Lua, React, SASS, Bootstrap,
|
|
||||||
Flask, ExpressJS, SQL, NoSQL, among others. Because of this, I am always in an
|
|
||||||
infinite cycle of improvement and learning.
|
|
||||||
|
|
||||||
My love for computer science has led me to explore and investigate other areas
|
|
||||||
and interests, of which I can mention:
|
|
||||||
|
|
||||||
- Being an enthusiast of **Linux** operating systems, using it both on my personal computers and on servers.
|
|
||||||
- Special interest in maintaining my development environment **personalized and updated**, allowing me to develop in a comfortable, ergonomic and effective way.
|
|
||||||
- Being part of the **selfhost** community, managing a variety of applications for personal use on **small personal servers**.
|
|
||||||
- Being **passionate about video games**.
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
|
|
||||||
I'm a software developer from Chile.
|
|
||||||
<br />
|
|
||||||
I like to code, tinker and build things!
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
{
|
|
||||||
"titles": {
|
|
||||||
"featuredWork": "Featured Work",
|
|
||||||
"whatIveBeenUpTo": "What I've been up to...",
|
|
||||||
"whoAmI": "Who am I?",
|
|
||||||
"contact": "Contact"
|
|
||||||
},
|
|
||||||
"home": {
|
|
||||||
"moreProjects": "View more projects",
|
|
||||||
"viewCurriculum": "View full curriculum"
|
|
||||||
},
|
|
||||||
"misc": {
|
|
||||||
"seeMore": "See more..."
|
|
||||||
},
|
|
||||||
"blog": "blog",
|
|
||||||
"games": "games"
|
|
||||||
}
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
Curioso y autodidacta por naturaleza, mi historia con la computación parte a
|
|
||||||
finales de los 2000, jugueteando con la PC familiar (a veces con resultados
|
|
||||||
desastrosos). Esto me llevó a siempre tratar de responder el _"¿cómo
|
|
||||||
funciona…?"_, _"¿cómo puedo hacer…?"_, o _¿cómo puedo solucionar…?_, llevándome
|
|
||||||
a la auto-investigación y exploración en diversos medios que me entreguen el
|
|
||||||
conocimiento para poder **resolver**, **crear** y **construir** proyectos.
|
|
||||||
|
|
||||||
Lo que más me apasiona es la **programación web** como un **desarrollador
|
|
||||||
fullstack**, pero no es lo único que puedo realizar, ya que también me
|
|
||||||
desenvuelvo bien en la creación de **aplicaciones de terminal** y **scripts**.
|
|
||||||
Puedo trabajar buscando resolver cualquier problema de forma convencional o
|
|
||||||
inventar soluciones nuevas.
|
|
||||||
|
|
||||||
Mi amor por los videojuegos ha jugado un rol importante en mi, lo cuál no se
|
|
||||||
refiere tan solo disfrutar jugarlos, sino ir más allá, para lograr ver como
|
|
||||||
funcionan por dentro en sus distintas disciplinas: mecánicas de juego,
|
|
||||||
narrativas, diseño de niveles, música, arte, entre otros. Encuentro fascinate
|
|
||||||
ver como los desarrolladores logran sortear dificultades he inventar soluciones
|
|
||||||
innovadoras para lograr dar la mejor experiencia al jugador.
|
|
||||||
|
|
||||||
Mi filosofía se basa en **siempre intentar mejorar**, realizando
|
|
||||||
estudios, investigaciones y actualizaciones que me han proporcionado el
|
|
||||||
conocimiento de diversas tecnologías, tales como: Javascript, Python, Rust,
|
|
||||||
Lua, React, SASS, Bootstrap, Flask, ExpressJS, SQL, NoSQL, entre
|
|
||||||
otros. Debido a esto siempre estoy en un infinito ciclo de mejora y
|
|
||||||
aprendizaje.
|
|
||||||
|
|
||||||
Mi amor por la informática me ha llevado a extender he investigar otras areas e
|
|
||||||
intereses, de los cuales puedo nombrar:
|
|
||||||
|
|
||||||
- Ser un entusiasta de los sistemas operativos **linux**, usándolo tanto en mis computadores personales como en servidores.
|
|
||||||
- Interés especial en mantener mi **ambiente de desarrollo personalizado y actualizado**, permitiendome desarrollar de una manera cómoda, ergonómica y eficaz.
|
|
||||||
- Ser parte de la comunidad **selfhost**, administrando varias aplicaciones para uso personal en **pequeños servidores propios**.
|
|
||||||
- Ser **apasionado de los videojuegos**.
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
|
|
||||||
Soy un desarrollador de software de Chile.
|
|
||||||
<br />
|
|
||||||
Me gusta codear, probar y construír cosas!
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
{
|
|
||||||
"titles": {
|
|
||||||
"featuredWork": "Trabajo Destacado",
|
|
||||||
"whatIveBeenUpTo": "Que he estado haciendo...",
|
|
||||||
"whoAmI": "¿Quién soy?",
|
|
||||||
"contact": "Contacto"
|
|
||||||
},
|
|
||||||
"home": {
|
|
||||||
"moreProjects": "Ver más proyectos",
|
|
||||||
"viewCurriculum": "Ver curriculum completo"
|
|
||||||
},
|
|
||||||
"misc": {
|
|
||||||
"seeMore": "Ver más..."
|
|
||||||
},
|
|
||||||
"blog": "blog",
|
|
||||||
"games": "juegos"
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue