@fullstackunicorn/create-root 1.0.23 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/root.fullstackunicorn.dev/assets/index.def.js +32 -4
- package/assets/root.fullstackunicorn.dev/assets/modules/sync.js +164 -302
- package/assets/root.fullstackunicorn.dev/assets/modules/sync.tools.js +39 -6
- package/assets/root.fullstackunicorn.dev/assets/package.md +9 -2
- package/assets/root.fullstackunicorn.dev/assets/webapp.runner.js +42 -1
- package/assets/root.fullstackunicorn.dev/frontend/base/account/AccountCard.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/base/cookies/@use.js +5 -93
- package/assets/root.fullstackunicorn.dev/frontend/base/cookies/CookiesCard.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/base/language/@use.js +4 -69
- package/assets/root.fullstackunicorn.dev/frontend/base/language/LanguageCard.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/base/layout/Layout.pod.js +2 -2
- package/assets/root.fullstackunicorn.dev/frontend/base/legals/LegalCard.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/base/legals/LegalsCard.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/base/resources/@use.js +15 -0
- package/assets/root.fullstackunicorn.dev/frontend/base/router/@use.js +2 -1
- package/assets/root.fullstackunicorn.dev/frontend/base/theme/ThemeCard.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/config.style.js +21 -9
- package/assets/root.fullstackunicorn.dev/frontend/features/legal/Legal.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/imports/animated/Root.js +4 -8
- package/assets/root.fullstackunicorn.dev/frontend/imports/core/Scrollable.js +7 -2
- package/assets/root.fullstackunicorn.dev/frontend/imports/core/Viewport.js +29 -0
- package/assets/root.fullstackunicorn.dev/frontend/imports/head/Head.js +16 -26
- package/assets/root.fullstackunicorn.dev/frontend/modals/cookies/cookies.api.js +25 -0
- package/assets/root.fullstackunicorn.dev/frontend/modals/cookies/cookies.js +88 -0
- package/assets/root.fullstackunicorn.dev/frontend/modals/countries/countries.api.js +22 -0
- package/assets/root.fullstackunicorn.dev/frontend/modals/countries/countries.js +58 -37
- package/assets/root.fullstackunicorn.dev/frontend/modals/languages/languages.api.js +23 -0
- package/assets/root.fullstackunicorn.dev/frontend/modals/languages/languages.js +81 -0
- package/assets/root.fullstackunicorn.dev/frontend/modules/base/Bottom.js +10 -0
- package/assets/root.fullstackunicorn.dev/frontend/{panels/layout → modules/base}/Bottom.pod.js +1 -4
- package/assets/root.fullstackunicorn.dev/frontend/modules/base/ComingSoon.js +7 -0
- package/assets/root.fullstackunicorn.dev/frontend/modules/base/ComingSoon.pod.js +17 -0
- package/assets/root.fullstackunicorn.dev/frontend/{panels/error → modules/base}/ErrorPage.js +4 -4
- package/assets/root.fullstackunicorn.dev/frontend/{panels/error → modules/base}/ErrorPage.pod.js +7 -7
- package/assets/root.fullstackunicorn.dev/frontend/{panels/layout → modules/base}/PageTitle.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/{panels/layout → modules/base}/PageTitle.pod.js +4 -6
- package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/cards/Account.js +9 -8
- package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/cards/Account.pod.js +28 -18
- package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/cards/Launcher.js +4 -4
- package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/cards/Launcher.pod.js +10 -11
- package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/cards/Linker.js +4 -4
- package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/cards/Linker.pod.js +11 -12
- package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/cards/Slider.js +8 -7
- package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/cards/Slider.pod.js +14 -14
- package/assets/root.fullstackunicorn.dev/frontend/{panels/wrapper/fixed → modules/layout}/Wrapper.js +2 -2
- package/assets/root.fullstackunicorn.dev/frontend/{panels/wrapper/fixed → modules/layout}/Wrapper.pod.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/{panels/selectors/actions → modules/modals/select}/Actions.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/{panels/selectors → modules/modals}/select/SelectPage.js +2 -2
- package/assets/root.fullstackunicorn.dev/frontend/{panels/sliders → modules/modals}/slider/SliderPage.js +2 -2
- package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/page/PageScrollable.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/modules/page/PageScrollable.pod.js +23 -0
- package/assets/root.fullstackunicorn.dev/frontend/modules/prose/@runs.js +52 -0
- package/assets/root.fullstackunicorn.dev/frontend/modules/prose/Prose.js +56 -0
- package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/prose/Prose.pod.js +2 -14
- package/assets/root.fullstackunicorn.dev/frontend/pages/@use.js +26 -11
- package/assets/root.fullstackunicorn.dev/frontend/pages/root/Callout.api.js +9 -25
- package/assets/root.fullstackunicorn.dev/frontend/pages/root/Callout.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/pages/root/Legal.api.js +16 -24
- package/assets/root.fullstackunicorn.dev/frontend/pages/root/Legal.js +2 -2
- package/assets/root.fullstackunicorn.dev/frontend/pages/root/Legals.api.js +14 -8
- package/assets/root.fullstackunicorn.dev/frontend/pages/root/Legals.js +5 -5
- package/assets/root.fullstackunicorn.dev/frontend/pages/root/User.api.js +8 -11
- package/assets/root.fullstackunicorn.dev/frontend/pages/root/User.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/pages/{app → scope}/Checkout.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/pages/scope/Home.abs.js +18 -0
- package/assets/root.fullstackunicorn.dev/frontend/pages/scope/Home.api.js +15 -0
- package/assets/root.fullstackunicorn.dev/frontend/pages/scope/Home.js +24 -0
- package/assets/root.fullstackunicorn.dev/frontend/panels/{slider/Slider.js → slideshows/Slideshow.js} +34 -20
- package/assets/root.fullstackunicorn.dev/frontend/panels/slideshows/Slideshow.map.js +27 -0
- package/assets/root.fullstackunicorn.dev/frontend/panels/slideshows/Slideshow.md +90 -0
- package/assets/root.fullstackunicorn.dev/frontend/panels/{slider/Slider.pod.js → slideshows/Slideshow.pod.js} +14 -28
- package/assets/root.fullstackunicorn.dev/frontend/preloader/@use.js +4 -5
- package/assets/root.fullstackunicorn.dev/frontend/root/errors.root.js +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/root/modals.root.js +8 -8
- package/assets/root.fullstackunicorn.dev/frontend/root/pages.scope.js +2 -2
- package/assets/root.fullstackunicorn.dev/frontend/root/preload.scope.js +1 -1
- package/assets/root.fullstackunicorn.dev/package.json +1 -1
- package/assets/root.fullstackunicorn.dev/workspace/config/tabulars_data_content/config/import.json +4 -26
- package/assets/root.fullstackunicorn.dev/workspace/config/tabulars_data_content/objs/A01.metadata.meta.json +72 -79
- package/assets/root.fullstackunicorn.dev/workspace/config/tabulars_data_content/objs/C01.home.data.json +25 -5
- package/assets/root.fullstackunicorn.dev/workspace/volume/data/lookups/cookies/en-US.json +3 -19
- package/assets/root.fullstackunicorn.dev/workspace/volume/data/lookups/cookies/it-IT.json +6 -22
- package/assets/root.fullstackunicorn.dev/workspace/volume/data/root/user/en-US.json +4 -6
- package/assets/root.fullstackunicorn.dev/workspace/volume/data/root/user/it-IT.json +5 -19
- package/package.json +1 -1
- package/assets/root.fullstackunicorn.dev/frontend/pages/app/Home.abs.js +0 -11
- package/assets/root.fullstackunicorn.dev/frontend/pages/app/Home.api.js +0 -18
- package/assets/root.fullstackunicorn.dev/frontend/pages/app/Home.js +0 -23
- package/assets/root.fullstackunicorn.dev/frontend/panels/card/book/BookCard.js +0 -58
- package/assets/root.fullstackunicorn.dev/frontend/panels/card/book/BookCard.pod.js +0 -37
- package/assets/root.fullstackunicorn.dev/frontend/panels/card/book/BookProse.js +0 -22
- package/assets/root.fullstackunicorn.dev/frontend/panels/grid/book/Grid.js +0 -115
- package/assets/root.fullstackunicorn.dev/frontend/panels/grid/book/Grid.pod.js +0 -65
- package/assets/root.fullstackunicorn.dev/frontend/panels/grid/book/Item.js +0 -3
- package/assets/root.fullstackunicorn.dev/frontend/panels/grid/book/Item.pod.js +0 -50
- package/assets/root.fullstackunicorn.dev/frontend/panels/layout/Bottom.js +0 -12
- package/assets/root.fullstackunicorn.dev/frontend/panels/page/PageScrollable.pod.js +0 -85
- package/assets/root.fullstackunicorn.dev/frontend/panels/prose/@use.js +0 -21
- package/assets/root.fullstackunicorn.dev/frontend/panels/prose/Prose.js +0 -84
- package/assets/root.fullstackunicorn.dev/frontend/panels/selectors/popup/PopupModal.js +0 -54
- package/assets/root.fullstackunicorn.dev/frontend/panels/selectors/select/SelectModal.js +0 -52
- package/assets/root.fullstackunicorn.dev/frontend/panels/shopper/bookstore/Buy.js +0 -19
- package/assets/root.fullstackunicorn.dev/frontend/panels/shopper/bookstore/Buy.pod.js +0 -17
- package/assets/root.fullstackunicorn.dev/frontend/panels/shopper/bookstore/Shopper.js +0 -39
- package/assets/root.fullstackunicorn.dev/frontend/panels/shopper/bookstore/Shopper.pod.js +0 -187
- package/assets/root.fullstackunicorn.dev/frontend/panels/sliders/slider/SliderModal.js +0 -39
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/selectors/actions → modules/modals/select}/Actions.pod.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/selectors → modules/modals}/select/SelectItem.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/selectors → modules/modals}/select/SelectItem.pod.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/selectors → modules/modals}/select/SelectPage.pod.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/selectors/actions → modules/modals/select}/SelectPicked.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/selectors/actions → modules/modals/select}/SelectPicked.pod.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/sliders/actions → modules/modals/slider}/Actions.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/sliders/actions → modules/modals/slider}/Actions.pod.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/sliders → modules/modals}/slider/SliderItem.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/sliders → modules/modals}/slider/SliderItem.pod.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels/sliders → modules/modals}/slider/SliderPage.pod.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/prose/@formatter.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/prose/Basic.js +0 -0
- /package/assets/root.fullstackunicorn.dev/frontend/{panels → modules}/prose/Basic.pod.js +0 -0
|
@@ -1,24 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@lang": "en-US",
|
|
3
3
|
"@meta": {
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
"description": "Manage your cookie preferences on ROOT. Learn about necessary, functionality, analytics, experience, and marketing cookies, and customize your choices for privacy and usability."
|
|
7
|
-
},
|
|
8
|
-
"opengraph": {
|
|
9
|
-
"type": "website",
|
|
10
|
-
"title": "Cookies | ROOT",
|
|
11
|
-
"description": "Understand and manage ROOT’s use of cookies, including essential, functionality, analytics, experience, and marketing cookies. Adjust your preferences anytime."
|
|
12
|
-
},
|
|
13
|
-
"twitter": {
|
|
14
|
-
"title": "Cookies | ROOT",
|
|
15
|
-
"description": "Manage your cookie preferences on ROOT. Control necessary, functionality, analytics, experience, and marketing cookies."
|
|
16
|
-
},
|
|
17
|
-
"schema": {
|
|
18
|
-
"description": "ROOT’s cookies settings page explains the use of necessary, functionality, analytics, experience, and marketing cookies, allowing users to customize their preferences.",
|
|
19
|
-
"applicationSubCategory": "Privacy & Cookies",
|
|
20
|
-
"keywords": "ROOT cookies, manage cookies, cookie preferences, analytics cookies, marketing cookies, privacy settings"
|
|
21
|
-
}
|
|
4
|
+
"title": "Cookies | ROOT",
|
|
5
|
+
"description": "Manage your cookie preferences on ROOT. Learn about necessary, functionality, analytics, experience, and marketing cookies, and customize your choices for privacy and usability."
|
|
22
6
|
},
|
|
23
7
|
"@data": {
|
|
24
8
|
"modal": {
|
|
@@ -59,4 +43,4 @@
|
|
|
59
43
|
}
|
|
60
44
|
}
|
|
61
45
|
}
|
|
62
|
-
}
|
|
46
|
+
}
|
|
@@ -1,24 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@lang": "it-IT",
|
|
3
3
|
"@meta": {
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
"description": "Gestisci le tue preferenze sui cookie in ROOT. Scopri i cookie necessari, di funzionalità, analitici, di esperienza e di marketing, e personalizza le tue scelte per privacy e usabilità."
|
|
7
|
-
},
|
|
8
|
-
"opengraph": {
|
|
9
|
-
"type": "website",
|
|
10
|
-
"title": "Cookie | ROOT",
|
|
11
|
-
"description": "Comprendi e gestisci l’uso dei cookie di ROOT, inclusi cookie essenziali, di funzionalità, analitici, di esperienza e di marketing. Modifica le tue preferenze in qualsiasi momento."
|
|
12
|
-
},
|
|
13
|
-
"twitter": {
|
|
14
|
-
"title": "Cookie | ROOT",
|
|
15
|
-
"description": "Gestisci le tue preferenze sui cookie in ROOT. Controlla cookie necessari, di funzionalità, analitici, di esperienza e di marketing."
|
|
16
|
-
},
|
|
17
|
-
"schema": {
|
|
18
|
-
"description": "La pagina delle impostazioni dei cookie di ROOT spiega l’uso di cookie necessari, di funzionalità, analitici, di esperienza e di marketing, permettendo agli utenti di personalizzare le proprie preferenze.",
|
|
19
|
-
"applicationSubCategory": "Privacy e Cookie",
|
|
20
|
-
"keywords": "ROOT cookie, gestione cookie, preferenze cookie, cookie analitici, cookie marketing, impostazioni privacy"
|
|
21
|
-
}
|
|
4
|
+
"title": "Cookie | ROOT",
|
|
5
|
+
"description": "Gestisci le tue preferenze sui cookie in ROOT. Scopri i cookie necessari, di funzionalità, analitici, di esperienza e di marketing, e personalizza le tue scelte per privacy e usabilità."
|
|
22
6
|
},
|
|
23
7
|
"@data": {
|
|
24
8
|
"modal": {
|
|
@@ -34,7 +18,7 @@
|
|
|
34
18
|
"data": {
|
|
35
19
|
"cookie-necessary": {
|
|
36
20
|
"title": "Necessari",
|
|
37
|
-
"description": "I cookie necessari sono strettamente indispensabili per fornirti i servizi disponibili attraverso il nostro sito web e per utilizzare alcune delle sue funzionalità, come l
|
|
21
|
+
"description": "I cookie necessari sono strettamente indispensabili per fornirti i servizi disponibili attraverso il nostro sito web e per utilizzare alcune delle sue funzionalità, come l'accesso alle aree riservate. Poiché questi cookie sono essenziali per il funzionamento del sito, non possono essere disabilitati.",
|
|
38
22
|
"label": "Necessari"
|
|
39
23
|
},
|
|
40
24
|
"cookie-functionality": {
|
|
@@ -44,7 +28,7 @@
|
|
|
44
28
|
},
|
|
45
29
|
"cookie-analytics": {
|
|
46
30
|
"title": "Analitici",
|
|
47
|
-
"description": "I cookie analitici ci aiutano a capire come i visitatori interagiscono con il nostro sito web raccogliendo e riportando informazioni in forma anonima. Questi dati ci permettono di migliorare le prestazioni e l
|
|
31
|
+
"description": "I cookie analitici ci aiutano a capire come i visitatori interagiscono con il nostro sito web raccogliendo e riportando informazioni in forma anonima. Questi dati ci permettono di migliorare le prestazioni e l'usabilità della nostra piattaforma.",
|
|
48
32
|
"label": "Analitici"
|
|
49
33
|
},
|
|
50
34
|
"cookie-experience": {
|
|
@@ -54,9 +38,9 @@
|
|
|
54
38
|
},
|
|
55
39
|
"cookie-marketing": {
|
|
56
40
|
"title": "Marketing",
|
|
57
|
-
"description": "I cookie di marketing ci permettono, insieme ai nostri partner, di mostrarti annunci personalizzati in base ai tuoi interessi e di misurarne l
|
|
41
|
+
"description": "I cookie di marketing ci permettono, insieme ai nostri partner, di mostrarti annunci personalizzati in base ai tuoi interessi e di misurarne l'efficacia. Possono anche tracciare la tua navigazione su diversi siti web per creare un profilo dei tuoi interessi e proporti annunci pertinenti. Se disabilitati, vedrai comunque annunci, ma meno rilevanti.",
|
|
58
42
|
"label": "Marketing"
|
|
59
43
|
}
|
|
60
44
|
}
|
|
61
45
|
}
|
|
62
|
-
}
|
|
46
|
+
}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@lang": "en-US",
|
|
3
3
|
"@meta": {
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
"cover": "get/media/covers/user-cover.jpg"
|
|
8
|
-
}
|
|
4
|
+
"title": "Account, Preferences, and Legal Settings | ROOT",
|
|
5
|
+
"description": "Manage your account, language, theme, cookies, and legal policies in ROOT. Easily log in, switch between dark and light mode, and configure your preferences for a personalized experience.",
|
|
6
|
+
"cover": "get/media/covers/user-cover.jpg"
|
|
9
7
|
},
|
|
10
8
|
"@head": {
|
|
11
9
|
"heading": "User Settings"
|
|
@@ -46,4 +44,4 @@
|
|
|
46
44
|
"label": "View Legal & Policies"
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
|
-
}
|
|
47
|
+
}
|
|
@@ -1,23 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@lang": "it-IT",
|
|
3
3
|
"@meta": {
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
},
|
|
8
|
-
"opengraph": {
|
|
9
|
-
"title": "Account e Preferenze ROOT",
|
|
10
|
-
"description": "Controlla account, lingua, tema, cookie e impostazioni legali in ROOT. Goditi un’esperienza sicura e personalizzabile su tutte le piattaforme."
|
|
11
|
-
},
|
|
12
|
-
"twitter": {
|
|
13
|
-
"title": "Gestisci Account e Preferenze su ROOT",
|
|
14
|
-
"description": "Accedi, passa tra modalità scura/chiara e regola lingua, cookie e impostazioni legali per un’esperienza ROOT personalizzata."
|
|
15
|
-
},
|
|
16
|
-
"schema": {
|
|
17
|
-
"description": "ROOT consente agli utenti di gestire account, lingua, tema, cookie e impostazioni legali per un’esperienza sicura e personalizzabile.",
|
|
18
|
-
"applicationSubCategory": "Impostazioni account e utente",
|
|
19
|
-
"keywords": "ROOT, impostazioni account, accesso, modalità scura, modalità chiara, cambio lingua, preferenze cookie, documenti legali"
|
|
20
|
-
}
|
|
4
|
+
"title": "Account, Preferenze e Impostazioni Legali | ROOT",
|
|
5
|
+
"description": "Gestisci account, lingua, tema, cookie e politiche legali in ROOT. Accedi facilmente, passa dalla modalità scura a quella chiara e personalizza la tua esperienza.",
|
|
6
|
+
"cover": "get/media/covers/user-cover.jpg"
|
|
21
7
|
},
|
|
22
8
|
"@data": {
|
|
23
9
|
"account": {
|
|
@@ -36,7 +22,7 @@
|
|
|
36
22
|
},
|
|
37
23
|
"language": {
|
|
38
24
|
"title": "Lingua",
|
|
39
|
-
"description": "Scegli una lingua per l
|
|
25
|
+
"description": "Scegli una lingua per l'interfaccia grafica"
|
|
40
26
|
},
|
|
41
27
|
"theme": {
|
|
42
28
|
"title": "Tema",
|
|
@@ -55,4 +41,4 @@
|
|
|
55
41
|
"label": "Visualizza Legale & Politiche"
|
|
56
42
|
}
|
|
57
43
|
}
|
|
58
|
-
}
|
|
44
|
+
}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.0.
|
|
2
|
+
"version": "1.0.25",
|
|
3
3
|
"name": "@fullstackunicorn/create-root",
|
|
4
4
|
"author": "lucanigido (https://fullstackunicorn.dev/author/lucanigido)",
|
|
5
5
|
"description": "create-root: bootstrapper that writes config assets and installs @fullstackunicorn/root",
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { uri } from '#@/App.uri.js'
|
|
2
|
-
import { api } from '#@/client/@api.js'
|
|
3
|
-
import { useApi } from '#@/pages/@use.js'
|
|
4
|
-
|
|
5
|
-
const dataFetch = async params => {
|
|
6
|
-
|
|
7
|
-
const verbal = await api.statics.get(uri.data.content.verbal, params)
|
|
8
|
-
// const logic = await api.statics.get(uri.data.content.logic, params)
|
|
9
|
-
|
|
10
|
-
const meta = verbal['@meta']
|
|
11
|
-
const data = {}
|
|
12
|
-
data.heading = verbal['@head'].heading
|
|
13
|
-
data.data = verbal['@data']
|
|
14
|
-
|
|
15
|
-
return { data, meta }
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export const useApiHome = () => useApi(dataFetch)
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { PageTitle } from '#@/panels/layout/PageTitle'
|
|
2
|
-
import { Slider } from '#@/panels/slider/Slider.js'
|
|
3
|
-
import { Bottom } from '#@/panels/layout/Bottom.js'
|
|
4
|
-
import { useApiHome } from '#@/pages/app/Home.api.js'
|
|
5
|
-
import { abs } from '#@/pages/app/Home.abs.js'
|
|
6
|
-
|
|
7
|
-
export const Home = () => {
|
|
8
|
-
|
|
9
|
-
const api = useApiHome()
|
|
10
|
-
|
|
11
|
-
if (!api) return null
|
|
12
|
-
return (
|
|
13
|
-
<>
|
|
14
|
-
<Slider
|
|
15
|
-
keys={{ picture: 'picture' }}
|
|
16
|
-
list={Object.values(api.data.slideshow)}
|
|
17
|
-
settings={abs.settings.slideshow}
|
|
18
|
-
/>
|
|
19
|
-
<PageTitle title={api.data.body.intro.paragraph}/>
|
|
20
|
-
<Bottom />
|
|
21
|
-
</>
|
|
22
|
-
)
|
|
23
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { Shopper } from '#@/panels/shopper/bookstore/Shopper.js'
|
|
2
|
-
import { BookProse } from '#@/panels/card/book/BookProse.js'
|
|
3
|
-
import { BookCardPod } from '#@/panels/card/book/BookCard.pod.js'
|
|
4
|
-
|
|
5
|
-
export const BookCard = ({ item = {}, keys = {}, settings = {}, prose={}, onPressQuantity, onPressLanguage }) => {
|
|
6
|
-
|
|
7
|
-
const data = {}
|
|
8
|
-
data.picture = item[keys.picture]
|
|
9
|
-
data.title = item[keys.title]
|
|
10
|
-
data.subtitle = item[keys.subtitle]
|
|
11
|
-
data.description = item[keys.description]
|
|
12
|
-
data.price = item[keys.price]
|
|
13
|
-
data.quantity = item[keys.quantity] || '1'
|
|
14
|
-
data.language = item[keys.language] || 'English'
|
|
15
|
-
data.shippingTitle = item[keys.shippingTitle] || 'Free Shipping'
|
|
16
|
-
data.shippingDescription = item[keys.shippingDescription] || 'Currently eligible for free shipping.'
|
|
17
|
-
data.stockTitle = item[keys.stockTitle] || 'In Stock'
|
|
18
|
-
data.stockDescription = item[keys.stockDescription] || 'Ships within 24 hours'
|
|
19
|
-
|
|
20
|
-
const labels = {}
|
|
21
|
-
labels.quantity = settings.quantityLabel || 'Quantity'
|
|
22
|
-
labels.language = settings.languageLabel || 'Language'
|
|
23
|
-
labels.button = settings.buttonLabel || 'BUY NOW'
|
|
24
|
-
|
|
25
|
-
const product = {}
|
|
26
|
-
product.code = item[keys.code]
|
|
27
|
-
product.name = item[keys.title]
|
|
28
|
-
product.description = item[keys.description]
|
|
29
|
-
product.image = item[keys.image] || item[keys.picture]?.src || ''
|
|
30
|
-
product.price = item[keys.priceRaw] ?? item[keys.priceMinor] ?? item[keys.amount] ?? 0
|
|
31
|
-
product.currency = (settings.currency || 'DKK')
|
|
32
|
-
product.quantity = Number(item[keys.quantity] || 1)
|
|
33
|
-
|
|
34
|
-
const seller = {}
|
|
35
|
-
seller.code = item[keys.sellerCode] || ''
|
|
36
|
-
seller.name = item[keys.sellerName] || ''
|
|
37
|
-
|
|
38
|
-
return (
|
|
39
|
-
<BookCardPod
|
|
40
|
-
settings={settings}
|
|
41
|
-
data={data}
|
|
42
|
-
shopper={(
|
|
43
|
-
<Shopper
|
|
44
|
-
data={data}
|
|
45
|
-
labels={labels}
|
|
46
|
-
settings={settings}
|
|
47
|
-
product={product}
|
|
48
|
-
seller={seller}
|
|
49
|
-
onPressQuantity={onPressQuantity}
|
|
50
|
-
onPressLanguage={onPressLanguage}
|
|
51
|
-
/>
|
|
52
|
-
)}
|
|
53
|
-
>
|
|
54
|
-
<BookProse item={prose.main}/>
|
|
55
|
-
<BookProse item={prose.about}/>
|
|
56
|
-
</BookCardPod>
|
|
57
|
-
)
|
|
58
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { useStyle } from '#@/style/@use.js'
|
|
2
|
-
import { View } from '#@/imports/core/View.js'
|
|
3
|
-
import { Text } from '#@/imports/core/Text.js'
|
|
4
|
-
|
|
5
|
-
const BookTitleBlockPod = ({ title, subtitle }) => {
|
|
6
|
-
|
|
7
|
-
const { s, c, f, F, S } = useStyle()
|
|
8
|
-
|
|
9
|
-
F.title = [s.fs32, s.lh50, s.fw700]
|
|
10
|
-
F.subtitle = [s.fs20, s.lh32, s.fw400]
|
|
11
|
-
|
|
12
|
-
S.box = [s.col_cXcY, s.X, s.marginT16, c.item_NN_B600]
|
|
13
|
-
S.title = [...F.title, s.textC, s.Xc, c.item_NN_B400]
|
|
14
|
-
S.subtitle = [...F.subtitle, s.textC, s.Xc, c.item_NN_B400]
|
|
15
|
-
|
|
16
|
-
return (
|
|
17
|
-
<View classes={S.box}>
|
|
18
|
-
<Text classes={S.title} font={f.f1} text={title} />
|
|
19
|
-
<Text classes={S.subtitle} font={f.f1} text={subtitle} />
|
|
20
|
-
</View>
|
|
21
|
-
)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export const BookCardPod = ({ settings = {}, data = {}, shopper, children }) => {
|
|
25
|
-
|
|
26
|
-
const { s, S } = useStyle()
|
|
27
|
-
|
|
28
|
-
S.root = [s.col_cX, s.X, s.gap16]
|
|
29
|
-
|
|
30
|
-
return (
|
|
31
|
-
<View classes={S.root}>
|
|
32
|
-
<BookTitleBlockPod title={data.title} subtitle={data.subtitle} />
|
|
33
|
-
{shopper}
|
|
34
|
-
{children}
|
|
35
|
-
</View>
|
|
36
|
-
)
|
|
37
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Prose } from '#@/panels/prose/Prose.js'
|
|
2
|
-
|
|
3
|
-
export const BookProse = ({ item={} }) => {
|
|
4
|
-
|
|
5
|
-
return Object.entries(item).map(([key, node]) => {
|
|
6
|
-
|
|
7
|
-
if (node?.type !== 'prose') return null
|
|
8
|
-
|
|
9
|
-
return (
|
|
10
|
-
<Prose
|
|
11
|
-
key={key}
|
|
12
|
-
lang={{
|
|
13
|
-
value: node.value,
|
|
14
|
-
style: node.attributes?.style || {},
|
|
15
|
-
spans: node.attributes?.spans || [],
|
|
16
|
-
}}
|
|
17
|
-
/>
|
|
18
|
-
)
|
|
19
|
-
})
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { Fragment, useMemo } from 'react'
|
|
2
|
-
import { useContainerSize } from '#@/imports/use.js'
|
|
3
|
-
import { GridPod, GridRowPod, XGapPod, YGapPod } from '#@/panels/grid/book/Grid.pod.js'
|
|
4
|
-
import { Item } from '#@/panels/grid/book/Item.js'
|
|
5
|
-
|
|
6
|
-
const chunkRows = (list = [], columns = 1) => {
|
|
7
|
-
const safeColumns = Math.max(1, columns)
|
|
8
|
-
const rows = []
|
|
9
|
-
|
|
10
|
-
for (let i = 0; i < list.length; i += safeColumns) {
|
|
11
|
-
rows.push(list.slice(i, i + safeColumns))
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
return rows
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const getColumns = (containerWidth, settings = {}) => {
|
|
18
|
-
const minWidth = settings.cardMinWidth || 220
|
|
19
|
-
const gapX = settings.cardGapX ?? settings.cardGap ?? 16
|
|
20
|
-
|
|
21
|
-
if (!containerWidth || containerWidth <= 0) return 1
|
|
22
|
-
|
|
23
|
-
let columns = Math.floor((containerWidth + gapX) / (minWidth + gapX))
|
|
24
|
-
if (columns < 1) columns = 1
|
|
25
|
-
|
|
26
|
-
let cardWidth = Math.floor((containerWidth - ((columns - 1) * gapX)) / columns)
|
|
27
|
-
|
|
28
|
-
while (columns > 1 && settings.cardMinWidth && cardWidth < settings.cardMinWidth) {
|
|
29
|
-
columns -= 1
|
|
30
|
-
cardWidth = Math.floor((containerWidth - ((columns - 1) * gapX)) / columns)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
while (columns < 12 && settings.cardMaxWidth && cardWidth > settings.cardMaxWidth) {
|
|
34
|
-
columns += 1
|
|
35
|
-
cardWidth = Math.floor((containerWidth - ((columns - 1) * gapX)) / columns)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (columns < 1) columns = 1
|
|
39
|
-
|
|
40
|
-
return columns
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const getCardWidth = (containerWidth, columns, settings = {}) => {
|
|
44
|
-
if (!containerWidth || containerWidth <= 0) return 0
|
|
45
|
-
|
|
46
|
-
const gapX = columns > 1 ? (settings.cardGapX ?? settings.cardGap ?? 16) : 0
|
|
47
|
-
const totalGap = (columns - 1) * gapX
|
|
48
|
-
const width = Math.floor((containerWidth - totalGap) / columns)
|
|
49
|
-
|
|
50
|
-
return width > 0 ? width : 0
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export const Grid = ({ list = [], data = {}, keys = {}, settings = {}, top, bottom, trigger }) => {
|
|
54
|
-
const { viewRef, width: containerWidth } = useContainerSize()
|
|
55
|
-
|
|
56
|
-
const columns = useMemo(() => {
|
|
57
|
-
return getColumns(containerWidth, settings)
|
|
58
|
-
}, [containerWidth, settings])
|
|
59
|
-
|
|
60
|
-
const cardWidth = useMemo(() => {
|
|
61
|
-
return getCardWidth(containerWidth, columns, settings)
|
|
62
|
-
}, [containerWidth, columns, settings])
|
|
63
|
-
|
|
64
|
-
const rows = useMemo(() => {
|
|
65
|
-
return chunkRows(list, columns)
|
|
66
|
-
}, [list, columns])
|
|
67
|
-
|
|
68
|
-
const gapX = columns > 1 ? (settings.cardGapX ?? settings.cardGap ?? 16) : 0
|
|
69
|
-
const gapY = settings.cardGapY ?? settings.rowGap ?? settings.cardGap ?? 16
|
|
70
|
-
|
|
71
|
-
const cardInline = cardWidth > 0 ? {
|
|
72
|
-
width: `${cardWidth}px`,
|
|
73
|
-
minWidth: `${cardWidth}px`,
|
|
74
|
-
maxWidth: `${cardWidth}px`,
|
|
75
|
-
} : {}
|
|
76
|
-
|
|
77
|
-
return (
|
|
78
|
-
<>
|
|
79
|
-
{top}
|
|
80
|
-
|
|
81
|
-
<GridPod viewRef={viewRef}>
|
|
82
|
-
{containerWidth > 0 && rows.map((row, rowIndex) => (
|
|
83
|
-
<Fragment key={`row-${rowIndex}`}>
|
|
84
|
-
<GridRowPod>
|
|
85
|
-
{row.map((key, columnIndex) => {
|
|
86
|
-
const item = data[key]
|
|
87
|
-
if (!item) return null
|
|
88
|
-
|
|
89
|
-
const isLast = columnIndex === row.length - 1
|
|
90
|
-
|
|
91
|
-
return (
|
|
92
|
-
<Fragment key={key || `${rowIndex}-${columnIndex}`}>
|
|
93
|
-
<Item
|
|
94
|
-
type={settings.cardType}
|
|
95
|
-
inline={cardInline}
|
|
96
|
-
picture={item[keys.picture]}
|
|
97
|
-
title={item[keys.title]}
|
|
98
|
-
price={item[keys.text]}
|
|
99
|
-
linkTo={item[keys.link] || `/${key}`}
|
|
100
|
-
/>
|
|
101
|
-
{!isLast && <XGapPod size={gapX} />}
|
|
102
|
-
</Fragment>
|
|
103
|
-
)
|
|
104
|
-
})}
|
|
105
|
-
</GridRowPod>
|
|
106
|
-
|
|
107
|
-
{rowIndex < rows.length - 1 && <YGapPod size={gapY} />}
|
|
108
|
-
</Fragment>
|
|
109
|
-
))}
|
|
110
|
-
</GridPod>
|
|
111
|
-
|
|
112
|
-
{bottom}
|
|
113
|
-
</>
|
|
114
|
-
)
|
|
115
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { useStyle } from '#@/style/@use.js'
|
|
2
|
-
import { View } from '#@/imports/core/View.js'
|
|
3
|
-
|
|
4
|
-
export const XGapPod = ({ size = 16 }) => {
|
|
5
|
-
const { S, I } = useStyle()
|
|
6
|
-
|
|
7
|
-
S.gap = []
|
|
8
|
-
I.gap = {
|
|
9
|
-
width: `${size}px`,
|
|
10
|
-
minWidth: `${size}px`,
|
|
11
|
-
maxWidth: `${size}px`,
|
|
12
|
-
flexShrink: 0,
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
return <View classes={S.gap} inline={I.gap} />
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export const YGapPod = ({ size = 16 }) => {
|
|
19
|
-
const { S, I } = useStyle()
|
|
20
|
-
|
|
21
|
-
S.gap = []
|
|
22
|
-
I.gap = {
|
|
23
|
-
height: `${size}px`,
|
|
24
|
-
minHeight: `${size}px`,
|
|
25
|
-
maxHeight: `${size}px`,
|
|
26
|
-
width: '100%',
|
|
27
|
-
flexShrink: 0,
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return <View classes={S.gap} inline={I.gap} />
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export const GridRowPod = ({ children }) => {
|
|
34
|
-
const { s, S, I } = useStyle()
|
|
35
|
-
|
|
36
|
-
S.row = [s.row, s.Xx, s.Yc]
|
|
37
|
-
I.row = {
|
|
38
|
-
// width: '100%',
|
|
39
|
-
// height:'100%',
|
|
40
|
-
// alignItems: 'stretch',
|
|
41
|
-
// justifyContent: 'flex-start',
|
|
42
|
-
flexWrap: 'nowrap',
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return (
|
|
46
|
-
<View classes={S.row} inline={I.row}>
|
|
47
|
-
{children}
|
|
48
|
-
</View>
|
|
49
|
-
)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export const GridPod = ({ children, viewRef }) => {
|
|
53
|
-
const { s, S, I } = useStyle()
|
|
54
|
-
|
|
55
|
-
S.grid = [s.col]
|
|
56
|
-
I.grid = {
|
|
57
|
-
width: '100%',
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return (
|
|
61
|
-
<View classes={S.grid} inline={I.grid} viewRef={viewRef}>
|
|
62
|
-
{children}
|
|
63
|
-
</View>
|
|
64
|
-
)
|
|
65
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { useStyle } from '#@/style/@use.js'
|
|
2
|
-
import { HoverCard } from '#@/imports/animated/HoverCard.js'
|
|
3
|
-
import { View } from '#@/imports/core/View.js'
|
|
4
|
-
import { Img } from '#@/imports/core/Img.js'
|
|
5
|
-
import { Text } from '#@/imports/core/Text.js'
|
|
6
|
-
import { Link } from '#@/modules/core/Link.js'
|
|
7
|
-
|
|
8
|
-
export const ItemPod = ({ picture, title, price, linkTo, inline = {}, type }) => {
|
|
9
|
-
|
|
10
|
-
const { s, c, f, t, F, B, S, I, H } = useStyle()
|
|
11
|
-
|
|
12
|
-
B.card = t.cards?.[type] || t.cards.portrait
|
|
13
|
-
|
|
14
|
-
F.title = [s.fs17, s.fw600, s.lh24, c.item_NN_B600]
|
|
15
|
-
F.price = [s.fs16, s.fw500, c.item_NN_B400]
|
|
16
|
-
|
|
17
|
-
S.box = [s.col, s.Yr]
|
|
18
|
-
S.link = B.card.link
|
|
19
|
-
S.card = B.card.box
|
|
20
|
-
S.pictureWrap = B.card.pictureWrap
|
|
21
|
-
S.pictureBox = B.card.pictureBox
|
|
22
|
-
S.picture = B.card.picture
|
|
23
|
-
S.content = B.card.content
|
|
24
|
-
S.title = [...F.title, ...B.card.title]
|
|
25
|
-
S.spacer = [s.Yc]
|
|
26
|
-
S.price = [...F.price, ...B.card.price]
|
|
27
|
-
|
|
28
|
-
I.box = inline
|
|
29
|
-
I.link = { display: 'block', width: '100%' }
|
|
30
|
-
I.pictureBox = { ratio: picture.ratio}
|
|
31
|
-
|
|
32
|
-
return (
|
|
33
|
-
<View classes={S.box} inline={I.box}>
|
|
34
|
-
<Link linkTo={linkTo} classes={S.link} inline={I.link}>
|
|
35
|
-
<HoverCard classes={S.card}>
|
|
36
|
-
<View classes={S.pictureWrap}>
|
|
37
|
-
<View classes={S.pictureBox} inline={I.pictureBok}>
|
|
38
|
-
<Img classes={S.picture} picture={picture} />
|
|
39
|
-
</View>
|
|
40
|
-
</View>
|
|
41
|
-
<View classes={S.content}>
|
|
42
|
-
<Text classes={S.title} text={title} />
|
|
43
|
-
<View classes={S.spacer} />
|
|
44
|
-
<Text classes={S.price} text={price} />
|
|
45
|
-
</View>
|
|
46
|
-
</HoverCard>
|
|
47
|
-
</Link>
|
|
48
|
-
</View>
|
|
49
|
-
)
|
|
50
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { BottomPod } from './Bottom.pod.js'
|
|
2
|
-
|
|
3
|
-
export const Bottom = () => {
|
|
4
|
-
|
|
5
|
-
const year = new Date().getFullYear()
|
|
6
|
-
const minderable = { href:"https://websites.minderable.com", text:'Powered by Minderable' }
|
|
7
|
-
const text = `Copyright © ${year}`
|
|
8
|
-
|
|
9
|
-
return (
|
|
10
|
-
<BottomPod text={text} minderable={minderable}/>
|
|
11
|
-
)
|
|
12
|
-
}
|