Categories
Quasar

Developing Vue Apps with the Quasar Library — Tooltip

Quasar is a popular Vue UI library for developing good looking Vue apps.

In this article, we’ll take a look at how to create Vue apps with the Quasar UI library.

Tooltip

We can add a tooltip into our Vue app with Quasar’s q-tooltip component.

For instance, we can write:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-btn label="Hover me" color="primary">
            <q-tooltip>
              Some text as content of Tooltip
            </q-tooltip>
          </q-btn>

          <div
            class="inline bg-amber rounded-borders cursor-pointer"
            style="max-width: 300px;"
          >
            <div
              class="fit flex flex-center text-center non-selectable q-pa-md"
            >
              hover me
            </div>

            <q-tooltip>
              tooltip
            </q-tooltip>
          </div>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {}
      });
    </script>
  </body>
</html>

We can put the q-tooltip component inside the component or element that we want to show when we hover over them.

Also, we can control the tooltip open or closed state with the v-model directive:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <div class="q-gutter-sm">
            <q-btn color="primary" @click="showing = true" label="Show"></q-btn>
            <q-btn
              color="primary"
              @click="showing = false"
              label="Hide"
            ></q-btn>
          </div>

          <div
            style="width: 200px; height: 70px;"
            class="bg-purple text-white rounded-borders row flex-center q-mt-md"
          >
            Hover here or click buttons
            <q-tooltip v-model="showing">Tooltip text</q-tooltip>
          </div>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          showing: false
        }
      });
    </script>
  </body>
</html>

We set the showing state when we click on the Show or Hide buttons.

We can set the offset prop to position the tooltip our way:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-btn color="primary">
            Hover
            <q-tooltip content-class="bg-indigo" :offset="[10, 10]">
              tooltip
            </q-tooltip>
          </q-btn>

          <q-btn color="primary">
            Over
            <q-tooltip content-class="bg-red" :offset="[10, 10]">
              tooltip
            </q-tooltip>
          </q-btn>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {}
      });
    </script>
  </body>
</html>

Tooltip Delay

We can set the tooltip delay with the delay prop:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <div
            style="width: 200px; height: 70px;"
            class="bg-secondary text-white rounded-borders non-selectable row flex-center"
          >
            One second delay
            <q-tooltip :delay="1000" :offset="[0, 10]">tooltip</q-tooltip>
          </div>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {}
      });
    </script>
  </body>
</html>

The delay is in milliseconds.

Conclusion

We can add a tooltip into our Vue app with Quasar’a q-tooltip component.

Categories
Quasar

Developing Vue Apps with the Quasar Library — Timeline Options

Quasar is a popular Vue UI library for developing good looking Vue apps.

In this article, we’ll take a look at how to create Vue apps with the Quasar UI library.

Dark Timeline

We can add the dark prop to display the timeline in a dark background.

For instance, we can write:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md bg-grey-10 text-white">
          <q-timeline color="secondary" dark>
            <q-timeline-entry
              heading
              body="Timeline heading"
            ></q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 22, 2000"
              avatar="https://cdn.quasar.dev/img/avatar3.jpg"
              :body="body"
            >
            </q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 21, 2000"
              icon="delete"
              :body="body"
            >
            </q-timeline-entry>

            <q-timeline-entry heading body="November, 2017"></q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 22, 2000"
              :body="body"
            >
            </q-timeline-entry>
          </q-timeline>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          body: "Lorem ipsum dolor sit amet"
        }
      });
    </script>
  </body>
</html>

We add the bg-grey-10 background to make the background dark.

And text-white makes the text white.

Timeline Layout and Side

We can add the timeline layout and side with the layout and side props:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-timeline color="secondary" layout="dense" side="left">
            <q-timeline-entry
              heading
              body="Timeline heading"
            ></q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 22, 2000"
              avatar="https://cdn.quasar.dev/img/avatar3.jpg"
              :body="body"
            >
            </q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 21, 2000"
              icon="delete"
              :body="body"
            >
            </q-timeline-entry>

            <q-timeline-entry heading body="November, 2017"></q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 22, 2000"
              :body="body"
            >
            </q-timeline-entry>
          </q-timeline>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          body: "Lorem ipsum dolor sit amet"
        }
      });
    </script>
  </body>
</html>

layout can be set to dense , comfortable or loose .

And side can be left or right .

Responsive Timeline

We can add a responsive timeline by setting the layout prop dynamically:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-timeline color="secondary" :layout="layout">
            <q-timeline-entry
              heading
              body="Timeline heading"
            ></q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 22, 2000"
              avatar="https://cdn.quasar.dev/img/avatar3.jpg"
              :body="body"
            >
            </q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 21, 2000"
              icon="delete"
              :body="body"
            >
            </q-timeline-entry>

            <q-timeline-entry heading body="November, 2017"></q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 22, 2000"
              :body="body"
            >
            </q-timeline-entry>
          </q-timeline>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          body: "Lorem ipsum dolor sit amet"
        },
        computed: {
          layout() {
            return this.$q.screen.lt.sm
              ? "dense"
              : this.$q.screen.lt.md
              ? "comfortable"
              : "loose";
          }
        }
      });
    </script>
  </body>
</html>

We add the layout computed property, which returns the value of layout by checking the screen size and returning the corresponding value.

Conclusion

We can add timelines with various options with Quasar’s timeline component.

Categories
Quasar

Developing Vue Apps with the Quasar Library — Swipeable Tabs and Timeline

Quasar is a popular Vue UI library for developing good looking Vue apps.

In this article, we’ll take a look at how to create Vue apps with the Quasar UI library.

Swipeable Tabs

We can make tabs swipeable with the animated , swipeable and infinite props together:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-tab-panels v-model="panel" animated swipeable infinite>
            <q-tab-panel name="mails">
              <div class="text-h6">Mails</div>
              Lorem ipsum
            </q-tab-panel>

            <q-tab-panel name="alarms">
              <div class="text-h6">Alarms</div>
              Lorem ipsum
            </q-tab-panel>

            <q-tab-panel name="movies">
              <div class="text-h6">Movies</div>
              Lorem ipsum
            </q-tab-panel>
          </q-tab-panels>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          panel: "mails"
        }
      });
    </script>
  </body>
</html>

Timeline

Quasar comes with a timeline component.

To add it, we write:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-timeline color="secondary">
            <q-timeline-entry heading>
              Timeline heading
            </q-timeline-entry>

            <q-timeline-entry title="Event Title" subtitle="February 22, 2000">
              <div>
                Lorem ipsum dolor sit amet
              </div>
            </q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 21, 2000"
              icon="delete"
            >
              <div>
                Lorem ipsum dolor sit amet
              </div>
            </q-timeline-entry>

            <q-timeline-entry heading>
              November, 2017
            </q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 22, 2000"
              avatar="https://cdn.quasar.dev/img/avatar2.jpg"
            >
              <div>
                Lorem ipsum dolor sit amet
              </div>
            </q-timeline-entry>

            <q-timeline-entry title="Event Title" subtitle="February 22, 2000">
              <div>
                Lorem ipsum dolor sit amet
              </div>
            </q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 22, 2000"
              color="orange"
              icon="done_all"
            >
              <div>
                Lorem ipsum dolor sit amet
              </div>
            </q-timeline-entry>

            <q-timeline-entry title="Event Title" subtitle="February 22, 2000">
              <div>
                Lorem ipsum dolor sit amet
              </div>
            </q-timeline-entry>

            <q-timeline-entry title="Event Title" subtitle="February 22, 2000">
              <div>
                Lorem ipsum dolor sit amet
              </div>
            </q-timeline-entry>
          </q-timeline>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          panel: "mails"
        }
      });
    </script>
  </body>
</html>

We add the q-timeline component to add the timeline.

And we add the entries inside the timeline with the q-timeline-entry component.

The heading prop renders the entry as a heading.

We can add a q-timeline-entry without populating the default slot:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-timeline color="secondary">
            <q-timeline-entry
              heading
              body="Timeline heading"
            ></q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 22, 2000"
              avatar="https://cdn.quasar.dev/img/avatar3.jpg"
              :body="body"
            >
            </q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 21, 2000"
              icon="delete"
              :body="body"
            >
            </q-timeline-entry>

            <q-timeline-entry heading body="November, 2017"></q-timeline-entry>

            <q-timeline-entry
              title="Event Title"
              subtitle="February 22, 2000"
              :body="body"
            >
            </q-timeline-entry>
          </q-timeline>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          body: "Lorem ipsum dolor sit amet"
        }
      });
    </script>
  </body>
</html>

We put the content in the body prop.

Conclusion

We can add swipeable tabs and add a timeline with Quasar.

Categories
Quasar

Developing Vue Apps with the Quasar Library — Tab Panel Options

Quasar is a popular Vue UI library for developing good looking Vue apps.

In this article, we’ll take a look at how to create Vue apps with the Quasar UI library.

Tab Panels

We can add tab panels with the q-tab-panel component.

For instance, we can write:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-option-group
            v-model="panel"
            inline
            :options="[
              { label: 'Mails', value: 'mails' },
              { label: 'Alarms', value: 'alarms' },
              { label: 'Movies', value: 'movies' }
            ]"
          >
          </q-option-group>

          <q-tab-panels
            v-model="panel"
            animated
            class="shadow-2 rounded-borders"
          >
            <q-tab-panel name="mails">
              <div class="text-h6">Mails</div>
              Lorem ipsum
            </q-tab-panel>

            <q-tab-panel name="alarms">
              <div class="text-h6">Alarms</div>
              Lorem ipsum
            </q-tab-panel>

            <q-tab-panel name="movies">
              <div class="text-h6">Movies</div>
              Lorem ipsum
            </q-tab-panel>
          </q-tab-panels>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          panel: "mails"
        }
      });
    </script>
  </body>
</html>

We can add q-tab-panels components with q-tab-panel inside.

The v-model binds to the name value of the q-tab-panel , which is set with the q-option-group .

We can change the color with the class prop of the q-tab-panels component:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-option-group
            v-model="panel"
            inline
            :options="[
              { label: 'Mails', value: 'mails' },
              { label: 'Alarms', value: 'alarms' },
              { label: 'Movies', value: 'movies' }
            ]"
          >
          </q-option-group>

          <q-tab-panels v-model="panel" animated class="bg-primary text-white">
            <q-tab-panel name="mails">
              <div class="text-h6">Mails</div>
              Lorem ipsum
            </q-tab-panel>

            <q-tab-panel name="alarms">
              <div class="text-h6">Alarms</div>
              Lorem ipsum
            </q-tab-panel>

            <q-tab-panel name="movies">
              <div class="text-h6">Movies</div>
              Lorem ipsum
            </q-tab-panel>
          </q-tab-panels>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          panel: "mails"
        }
      });
    </script>
  </body>
</html>

Tab Panel Transitions

We can change the tab panel’s transitions with the animated and transition-prev and transition-next props:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-option-group
            v-model="panel"
            inline
            :options="[
              { label: 'Mails', value: 'mails' },
              { label: 'Alarms', value: 'alarms' },
              { label: 'Movies', value: 'movies' }
            ]"
          >
          </q-option-group>

          <q-tab-panels
            v-model="panel"
            animated
            transition-prev="scale"
            transition-next="scale"
          >
            <q-tab-panel name="mails">
              <div class="text-h6">Mails</div>
              Lorem ipsum
            </q-tab-panel>

            <q-tab-panel name="alarms">
              <div class="text-h6">Alarms</div>
              Lorem ipsum
            </q-tab-panel>

            <q-tab-panel name="movies">
              <div class="text-h6">Movies</div>
              Lorem ipsum
            </q-tab-panel>
          </q-tab-panels>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          panel: "mails"
        }
      });
    </script>
  </body>
</html>

transition-prev is applied when we leave a tab panel.

And transition-next is applied when we enter a tab panel.

Conclusion

We can add tab panels into our Vue app with the Quasar library.

Categories
Quasar

Developing Vue Apps with the Quasar Library — Tabs with Dropdown and Tab Panels

Quasar is a popular Vue UI library for developing good looking Vue apps.

In this article, we’ll take a look at how to create Vue apps with the Quasar UI library.

Tabs with Dropdown

We can add tabs with a dropdown item.

For instance, we can write:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-tabs v-model="tab" inline-label class="bg-yellow shadow-2">
            <q-tab name="mails" label="Mails" icon="mail"></q-tab>
            <q-tab name="alarms" label="Alarms" icon="alarm"></q-tab>
            <q-btn-dropdown auto-close stretch flat icon="more" label="More...">
              <q-list>
                <q-item clickable @click="tab = 'movies'">
                  <q-item-section>Movies</q-item-section>
                </q-item>

                <q-item clickable @click="tab = 'photos'">
                  <q-item-section>Photos</q-item-section>
                </q-item>
              </q-list>
            </q-btn-dropdown>
          </q-tabs>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          tab: undefined
        }
      });
    </script>
  </body>
</html>

We add the q-btn-dropdown inside the q-tabs component to add a dropdown button.

And the q-list is displayed as the dropdown list.

Tab Toolbar

We can use q-tabs in a q-toolbar .

For instance, we can write:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-toolbar class="bg-purple text-white shadow-2 rounded-borders">
            <q-btn flat label="Homepage"></q-btn>
            <q-space> </q-space>
            <q-tabs v-model="tab" shrink stretch>
              <q-tab name="tab1" label="Tab 1"></q-tab>
              <q-tab name="tab2" label="Tab 2"></q-tab>
              <q-tab name="tab3" label="Tab 3"></q-tab>
            </q-tabs>
          </q-toolbar>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          tab: undefined
        }
      });
    </script>
  </body>
</html>

We add the shrink and strech props to fill the available space while avoiding filling the whole toolbar.

Dynamic Tabs

We can display tabs dynamically with v-for :

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-tabs v-model="tab" inline-label shrink stretch>
            <q-tab v-for="tab in tabs" :key="tab.name" v-bind="tab" />
          </q-tabs>
        </div>
      </q-layout>
    </div>
    <script>
      const tabs = [
        { name: "mails", icon: "mail", label: "Mails" },
        { name: "alarms", icon: "alarm", label: "Alarms" },
        { name: "movies", icon: "movie", label: "Movies" }
      ];

      new Vue({
        el: "#q-app",
        data: {
          tab: undefined,
          tabs
        }
      });
    </script>
  </body>
</html>

Tab Panel

We can display tab panels when we click on a tab.

To add them, we write:

<!DOCTYPE html>
<html>
  <head>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
      rel="stylesheet"
      type="text/css"
    />
  </head>
  <body class="body--dark">
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
    <div id="q-app">
      <q-layout view="lHh Lpr lFf" container style="height: 100vh;">
        <div class="q-pa-md">
          <q-card>
            <q-tabs
              v-model="tab"
              dense
              class="text-grey"
              active-color="primary"
              indicator-color="primary"
              align="justify"
              narrow-indicator
            >
              <q-tab name="mails" label="Mails"></q-tab>
              <q-tab name="alarms" label="Alarms"></q-tab>
              <q-tab name="movies" label="Movies"></q-tab>
            </q-tabs>

            <q-separator></q-separator>

            <q-tab-panels v-model="tab" animated>
              <q-tab-panel name="mails">
                <div class="text-h6">Mails</div>
                Lorem ipsum
              </q-tab-panel>

              <q-tab-panel name="alarms">
                <div class="text-h6">Alarms</div>
                Lorem ipsum
              </q-tab-panel>

              <q-tab-panel name="movies">
                <div class="text-h6">Movies</div>
                Lorem ipsum
              </q-tab-panel>
            </q-tab-panels>
          </q-card>
        </div>
      </q-layout>
    </div>
    <script>
      new Vue({
        el: "#q-app",
        data: {
          tab: "mails"
        }
      });
    </script>
  </body>
</html>

We set the name prop of the q-tab and q-tab-panel to match so that we click on it, then the tab panel we want will be displayed.

Conclusion

We can add tabs with dropdowns and add tab panels with Quasar’s tab components.