-
-
diff --git a/packages/ui/components/footer/getFooterLinks.js b/packages/ui/components/footer/getFooterLinks.js
deleted file mode 100644
index 08c50273..00000000
--- a/packages/ui/components/footer/getFooterLinks.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { urls } from '../../constants'
-import getI18nStringFromSectionItem from './getI18nStringFromSectionItem'
-
-export default function getFooterLinks(sections) {
- return Object.entries(sections).map(([sectionName, sectionItems]) => ({
- title: sectionName,
- links: sectionItems.map((sectionItem) => ({
- url: urls[sectionItem],
- text: getI18nStringFromSectionItem(sectionName, sectionItem),
- })),
- }))
-}
diff --git a/packages/ui/components/footer/getI18nStringFromSectionItem.js b/packages/ui/components/footer/getI18nStringFromSectionItem.js
deleted file mode 100644
index 7efd3aae..00000000
--- a/packages/ui/components/footer/getI18nStringFromSectionItem.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import snakeCase from 'lodash.snakecase'
-
-export default function getI18nStringFromSectionItem(sectionName, sectionItem) {
- return `footer.links.${sectionName}.${snakeCase(sectionItem)}`
-}
diff --git a/packages/ui/components/placeholders/DetailsSkeleton.vue b/packages/ui/components/placeholders/DetailsSkeleton.vue
new file mode 100644
index 00000000..b8f77909
--- /dev/null
+++ b/packages/ui/components/placeholders/DetailsSkeleton.vue
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/packages/ui/components/placeholders/FeedSkeleton.vue b/packages/ui/components/placeholders/FeedSkeleton.vue
new file mode 100644
index 00000000..48c7011c
--- /dev/null
+++ b/packages/ui/components/placeholders/FeedSkeleton.vue
@@ -0,0 +1,54 @@
+
+
+
diff --git a/packages/ui/constants.ts b/packages/ui/constants.ts
index 3c65cd05..3f0e75d6 100644
--- a/packages/ui/constants.ts
+++ b/packages/ui/constants.ts
@@ -3,18 +3,18 @@ import { localeCodes, type LanguageDictionary, type ChartRange } from './types'
export const LANGUAGE_LOCALES: LanguageDictionary = {
[localeCodes.en]: {
- code: 'en-US',
- iso: 'en-US',
+ code: 'en',
+ iso: 'en',
name: 'English',
- file: 'en-US.json',
- fnsLocale: enGB,
+ file: 'en.json',
+ fnsLocaleCode: enGB.code,
},
[localeCodes.es]: {
- code: 'es-ES',
- iso: 'es-ES',
+ code: 'es',
+ iso: 'es',
name: 'Español',
- file: 'es-ES.json',
- fnsLocale: es,
+ file: 'es.json',
+ fnsLocaleCode: es.code,
},
}
@@ -58,13 +58,13 @@ export const languages = [
{
name: 'English',
code: 'en',
- iso: 'en-US',
+ iso: 'en',
isCatchallLocale: true,
},
{
name: 'Español',
code: 'es',
- iso: 'es-ES',
+ iso: 'es',
},
]
diff --git a/packages/ui/crowdin.yml b/packages/ui/crowdin.yml
index f18edf33..e5718cb5 100644
--- a/packages/ui/crowdin.yml
+++ b/packages/ui/crowdin.yml
@@ -1,5 +1,5 @@
files:
- - source: /locales/en-US.json
+ - source: /locales/en.json
translation: /locales/%two_letters_code%.json
- - source: /content/en-US/*.md
+ - source: /content/en/*.md
translation: /content/%two_letters_code%/%original_file_name%
diff --git a/packages/ui/eslint.config.js b/packages/ui/eslint.config.js
new file mode 100644
index 00000000..628b3a0b
--- /dev/null
+++ b/packages/ui/eslint.config.js
@@ -0,0 +1,63 @@
+import globals from 'globals/index.js'
+import pluginJs from '@eslint/js'
+import tseslint from 'typescript-eslint'
+import eslintConfigPrettier from 'eslint-config-prettier'
+import { createBasicNuxtConfig } from 'nuxt-module-eslint-config/config'
+
+export default [
+ pluginJs.configs.recommended,
+ eslintConfigPrettier,
+ ...createBasicNuxtConfig({
+ features: {
+ setup: true,
+ },
+ dirs: {
+ pages: ['pages'],
+ composables: ['composables', 'utils'],
+ components: [],
+ layouts: ['layouts'],
+ plugins: ['plugins'],
+ middleware: ['middleware'],
+ modules: ['modules'],
+ layers: [''],
+ servers: [],
+ src: './',
+ },
+ }),
+ {
+ files: ['pages/*.vue', '**/*.vue'],
+ rules: {
+ 'vue/multi-word-component-names': 0,
+ 'vue/html-self-closing': [
+ 'error',
+ {
+ html: {
+ void: 'always',
+ normal: 'always',
+ component: 'always',
+ },
+ svg: 'always',
+ math: 'always',
+ },
+ ],
+ ...eslintConfigPrettier.rules,
+ },
+ },
+ {
+ files: ['**/*.vue', '**/*.ts', '**/*.js'],
+ languageOptions: {
+ globals: {
+ ...globals.browser,
+ ...globals.node,
+ },
+ parserOptions: {
+ parser: {
+ espree: true,
+ ts: tseslint.parser,
+ },
+ ecmaVersion: 2022,
+ sourceType: 'module',
+ },
+ },
+ },
+]
diff --git a/packages/ui/locales/en-US.json b/packages/ui/i18n/locales/en.json
similarity index 85%
rename from packages/ui/locales/en-US.json
rename to packages/ui/i18n/locales/en.json
index e2a5fcf2..e608aff1 100644
--- a/packages/ui/locales/en-US.json
+++ b/packages/ui/i18n/locales/en.json
@@ -1,4 +1,15 @@
{
+ "documentation": "Documentation",
+ "landing": {
+ "title": "Welcome to Wit/Feeds",
+ "description": "Unlock the power of trustless data with Witnet Data Feeds — your gateway to real-time, tamper-proof price and real-world information on-chain. Seamlessly integrate decentralized oracles into your dApps with plug-and-play smart contract interfaces."
+ },
+ "routed_pricefeed": "Routed feed",
+ "search": "Search for a feed",
+ "sources": "Sources",
+ "include_testnets": "Include testnets",
+ "network_empty_state": "No available feed found for this network!",
+ "ecosystem_empty_state": "No available feeds found for this ecosystem!",
"data_feed_details": {
"contract_address": "Integration details",
"trigger_parameters": "Triggering conditions",
@@ -11,6 +22,7 @@
"underlying_feed_contract": "Underlying feed contract address",
"erc2362_asset_id": "ERC2362 asset ID",
"integration_details_description": "Witnet price feeds can be integrated into your own {0} contracts in two different ways:",
+ "feed_sources": "The data was retrieved from {0} key sources:",
"feed_description": "This is a Witnet powered {name} data feed available on {network}. Last reported value is {value} (updated on {date}). This data feed is updated every {heartbeat}, or every time the price changes by more than {deviation}%.",
"feed_description_routed": "This is a Witnet powered {name} data feed available on {network}. Last reported value is {value} (updated on {date}). This data feed is updated as soon as any of the related data feeds update.",
"feed_description_routed_cached": "This is a Witnet powered {name} data feed available on {network}. Last reported value is {value} (updated on {date}). This data feed is updated every {heartbeat}, or every time any of the related data feeds update."
@@ -90,18 +102,6 @@
"license": "Creative Commons License"
}
},
- "landing": {
- "supported_chains": {
- "title": "Supported chains",
- "subtitle": "Blockchains in which the Witnet oracle is currently available"
- },
- "upcoming_chains": {
- "title": "Chains with upcoming support"
- },
- "partners": {
- "title": "Users and Partners"
- }
- },
"empty_feeds": "There are no active feeds in {0}. Request a new price feed!",
"feeds": "feeds",
"data_feeds": "Data feeds",
diff --git a/packages/ui/locales/es-ES.json b/packages/ui/i18n/locales/es.json
similarity index 85%
rename from packages/ui/locales/es-ES.json
rename to packages/ui/i18n/locales/es.json
index 3d8ce956..bef7e166 100644
--- a/packages/ui/locales/es-ES.json
+++ b/packages/ui/i18n/locales/es.json
@@ -1,4 +1,15 @@
{
+ "documentation": "Documentación",
+ "landing": {
+ "title": "Explorador de Wit/Feeds",
+ "description": "Desbloquea el poder de los datos confiables con Witnet Data Feeds — tu puerta de entrada a información y precios en tiempo real e inalterables en la cadena. Integra oráculos descentralizados en tus dApps fácilmente con interfaces de contratos inteligentes plug-and-play."
+ },
+ "routed_pricefeed": "Routed feed",
+ "search": "Buscar un feed",
+ "sources": "Fuentes",
+ "include_testnets": "Incluir testnets",
+ "network_empty_state": "¡No se encontró ningún feed disponible para esta red!",
+ "ecosystem_empty_state": "¡No se encontraron feeds disponibles para este ecosistema!",
"data_feed_details": {
"contract_address": "Detalles de integración",
"trigger_parameters": "Triggering conditions",
@@ -11,6 +22,7 @@
"underlying_feed_contract": "Underlying feed contract address",
"erc2362_asset_id": "Identificador ERC2362",
"integration_details_description": "Los data feed de Witnet pueden ser integrados en tu propio contrato de {0} de dos formas diferentes:",
+ "feed_sources": "Los datos de este data feed han sido recogidos de {0} fuentes diferentes:",
"feed_description": "Esto es un data feed de Witnet para {name}, disponible en {network}. El último resultado disponible es {value} (actualizado el {date}). Este data feed se actualiza cada {heartbeat}, o cada vez que su valor varÃa más de un {deviation}%.",
"feed_description_routed": "Esto es un price feed de Witnet para {name}, disponible en {network}. El último resultado disponible es {value} (actualizado el {date}). Este price feed se actualizará en el momento en el que se actualize alguno de los price feeds relacionados.",
"feed_description_routed_cached": "Esto es un price feed de Witnet para {name}, disponible en {network}. El último resultado disponible es {value} (actualizado el {date}). Este price feed se actualizará cada {heartbeat} o cada vez que se actualize alguno de los price feeds relacionados."
@@ -90,18 +102,6 @@
"license": "Creative Commons License"
}
},
- "landing": {
- "supported_chains": {
- "title": "Supported chains",
- "subtitle": "Blockchains in which the Witnet oracle is currently available"
- },
- "upcoming_chains": {
- "title": "Chains with upcoming support"
- },
- "partners": {
- "title": "Users and Partners"
- }
- },
"empty_feeds": "No hay feeds activos en {0}. ¡Solicita un nuevo data feed!",
"feeds": "feeds",
"data_feeds": "Data feeds",
diff --git a/packages/ui/layouts/default.vue b/packages/ui/layouts/default.vue
index 10f74e8e..4dacc3e0 100644
--- a/packages/ui/layouts/default.vue
+++ b/packages/ui/layouts/default.vue
@@ -1,60 +1,85 @@
-
diff --git a/packages/ui/pages/index.vue b/packages/ui/pages/index.vue
index 8465c5bf..fe502f3f 100644
--- a/packages/ui/pages/index.vue
+++ b/packages/ui/pages/index.vue
@@ -1,5 +1,8 @@
-
+
+
+
+