DEV Community

Cover image for How Svelte-Native Works?
Deotyma
Deotyma

Posted on

3 1

How Svelte-Native Works?

I would like to know how Svelte-Native works so I will create a little application with this framework this time.

Svelte-Native works on top of NativeSctipt so to start to create an application I need to install NativeScript globally:

 npm install -g nativescript

Enter fullscreen mode Exit fullscreen mode

In my case, I needed to use sudo to install it correctly.
To verify if NativeScript is installed I run a command ns
in my terminal and I have lots of information:

ns informations

This is a native application so I need a device to run it. Here there are links for NativeScript Playground for different platforms:
apple and Android

Is a time to create a little application:

ns create stoicQuotes --svelte
Enter fullscreen mode Exit fullscreen mode

And project is installed:

installed project 1

installed project 2

I had a little problem configuring the environment of my app and I found a solution here and I published an answer on StackOverfolw here
I needed

# link and alias the installed python3
# version to be available to XCode as python
sudo ln -s $(which python3) /usr/local/bin/python
python3 -m pip install --upgrade pip
python3 -m pip install six
Enter fullscreen mode Exit fullscreen mode

and after I needed to install the ios platform

tns platform add ios
Enter fullscreen mode Exit fullscreen mode

And now I can run an app:

ns run ios
Enter fullscreen mode Exit fullscreen mode

Working app

Now I go to Home.svelte and I change some code to see how It works:
Home.svelte

<page>
    <actionBar title="quote of the day" /> //here I change titlle from "Home" to "quote of the day"
    <gridLayout class="home"> //her I add a class home
        <label class="info">
            <formattedString>
                <span class="fas" text="&#xf135;" />
                <span text=" {message}" />
            </formattedString>
        </label>
    </gridLayout>
</page>

<script lang="ts">
    let message: string = "My new page is here"
</script>

<style>
    .info .fas {
        color: #893aff; // here I change a color of icone
    }
    .home{
        background: #3aff96; //here I add background color
    }
    .info {
        font-size: 20;
        horizontal-align: center;
        vertical-align: center;
    }
</style>
Enter fullscreen mode Exit fullscreen mode

changed home

I continue to change the Home.svelte. For correctly showing my quote I need which displays text in many lines. I need also a working button to search for a new quote. To display all these elements I need in my app also a new tag: :
Home.svelte

<page class="page">
    <actionBar title="quote of the day" class="action-bar">
    </actionBar>
    <stackLayout class="home">
        <textView text={message} class="quote"/>
        <button text="Next quote" on:tap="{ onTap }" class="button" />
    </stackLayout>
</page>

<script>
    import { alert } from '@nativescript/core/ui/dialogs'

    let message = "This is a long text to see if text view works correctly "
    const onTap = () => alert('Tne button works good!');
</script>

<style>
    .home{
        background-color: #3aff96;
    }
    .quote{
        color: blue;
        font-size: 20rem;
        font-weight: 600;
    }
</style>

Enter fullscreen mode Exit fullscreen mode

working tags

All seems to work correctly.

I would like to have some images in my app so I import the component . This is a nativeScript element so it is written with the first letter in low case. At the same time, I would like to choose an image randomly. For this, I created a folder of images in the app folder and I downloaded some images of flowers from pixabay
So Home.svelte is like this (without style):

<page class="page">
    <actionBar title="quote of the day" class="action-bar">
    </actionBar>
    <stackLayout class="home">
        <image  src = "~/images/img{imgNumber}.png"/> <!--here I put image with variable wit will change dynamicly-->
        <textView text={message} class="quote"/>
        <button text="Next quote" on:tap="{ onTap }" class="button" />
    </stackLayout>
</page>

<script>
    //import { alert } from '@nativescript/core/ui/dialogs'

    let message = "This is a long text to see if text view works correctly "
    let min = 1
    let max = 10
    let imgNumber = 1

    function randomImage() {
    imgNumber = Math.floor(Math.random() * (max - min)) + min; // Here this function choose a random image
    }

   $: imgNumber ? 1 : randomImage(); // this is a reactf variable

    const onTap = () => randomImage();
</script>
Enter fullscreen mode Exit fullscreen mode

changing images1
changing images2

Now is the time to implement a different quota of stoic philosophers. For this, I create a little file quotes.js in the folder app with variable quotes with quotes, authors, and ids.
Home.svelte

<page class="page">
    <actionBar title="quote of the day" class="action-bar">
    </actionBar>
    <stackLayout class="home">
        <image  src = "~/images/img{imgNumber}.png"/>
        <textView text={quote} class="quote"/>
        <textView text={author} class="quote"/>
        <button text="Next quote" on:tap="{ onTap }" class="button" />
    </stackLayout>
</page>

<script>
    //import { alert } from '@nativescript/core/ui/dialogs'
    import { quotes } from '../quotes.js'

    let min = 1
    let max = 10
    let imgNumber
    let quote
    let author 

    function randomImage() {
    imgNumber = Math.floor(Math.random() * (max - min)) + min; 
    }

    function randomQuote(){
        let i = Math.floor(Math.random() * quotes.length)
        quote = quotes[i].quote
        author = quotes[i].author
        return quote, author
    }
    randomQuote()

    function randomItems(){
        randomImage();
        randomQuote();
    }

   $: imgNumber ? 1 : randomImage();


    const onTap = () => randomItems() ;
</script>
Enter fullscreen mode Exit fullscreen mode

random items 1

random items 2

This is a time to take care of CSS a little bit.

<page class="page">
    <actionBar title="quote of the day" class="action-bar">
    </actionBar>
    <stackLayout class="home">
        <image class="img"  src = "~/images/img{imgNumber}.png"/>
        <textView text={quote} class="quote"/>
        <label class="info">
            <formattedString>
                <span text=" {author}" class="author"/>
            </formattedString>
        </label>
        <button text="Next quote" on:tap="{ onTap }" class="button" />
    </stackLayout>
</page>

<script>
    import { quotes } from '../quotes.js'

    let min = 1
    let max = 10
    let imgNumber
    let quote
    let author 

    function randomImage() {
    imgNumber = Math.floor(Math.random() * (max - min)) + min; 
    }

    function randomQuote(){
        let i = Math.floor(Math.random() * quotes.length)
        quote = quotes[i].quote
        author = quotes[i].author
        return quote, author
    }
    randomQuote()

    function randomItems(){
        randomImage();
        randomQuote();
    }

   $: imgNumber ? 1 : randomImage();


    const onTap = () => randomItems() ;
</script>

<style>
    .home{
        background: rgb(105,134,14);
        background: linear-gradient(90deg, rgba(105,134,14,1) 0%, rgba(121,161,91,1) 100%);
    }
    .quote{
        color: #24261c;
        text-align: center;
        font-size: 30rem;
        font-weight: 600;
        margin-top: 10px;
        margin-bottom: 10px;
    }
    .author{
        color: #24261c;
        text-align: center;
        font-size: 20rem;
        font-weight: 400;
        margin-top: 10px;
        margin-bottom: 10px;
    }
    .info{
        text-align: center;

    }
    .button{
        background: rgb(220,162,219);
        background: linear-gradient(90deg, rgba(220,162,219,1) 0%, rgba(75,83,174,1) 100%);
        color: #24261c;
        font-size: 20rem;
        border-radius: 0 20px

    }
    .img{
        border-radius: 0 50px;
        margin: 20px;
        border: solid 5px #24261c;
    }
</style>
Enter fullscreen mode Exit fullscreen mode

random item 3

If you want to see the code you can find it here
Have a nice weekend.

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay