diff --git a/dist/library.cjs b/dist/library.cjs
new file mode 100644
index 0000000..eab8df2
--- /dev/null
+++ b/dist/library.cjs
@@ -0,0 +1,571 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var vue = require('vue');
+var pinia = require('pinia');
+
+var script$d = {
+ name: "Button",
+
+ methods: {
+ click() {
+ this.$emit('click');
+ }
+ }
+};
+
+const _hoisted_1$c = {
+ href: "#",
+ class: "truncate text-black dark:text-white hover:bg-zinc-100 dark:bg-base-700 dark:hover:bg-base-600 dark:text-white rounded-lg px-4 py-2"
+};
+
+function render$d(_ctx, _cache, $props, $setup, $data, $options) {
+ return (vue.openBlock(), vue.createElementBlock("a", _hoisted_1$c, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$d.render = render$d;
+script$d.__file = "src/components/Button.vue";
+
+var script$c = {
+ name: "Card"
+};
+
+const _hoisted_1$b = { class: "bg-white text-black dark:bg-base-700 dark:text-white rounded shadow mb-8" };
+
+function render$c(_ctx, _cache, $props, $setup, $data, $options) {
+ return (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$b, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$c.render = render$c;
+script$c.__file = "src/components/Card.vue";
+
+var script$b = {
+ name: "CardBody"
+};
+
+const _hoisted_1$a = { class: "p-8 rounded-b" };
+
+function render$b(_ctx, _cache, $props, $setup, $data, $options) {
+ return (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$a, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$b.render = render$b;
+script$b.__file = "src/components/CardBody.vue";
+
+var script$a = {
+ name: "CardHeader"
+};
+
+const _hoisted_1$9 = { class: "py-4 px-8 border-b dark:border-base-800 rounded-t" };
+const _hoisted_2$4 = { class: "text-xl font-medium" };
+
+function render$a(_ctx, _cache, $props, $setup, $data, $options) {
+ return (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$9, [
+ vue.createElementVNode("div", _hoisted_2$4, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ])
+ ]))
+}
+
+script$a.render = render$a;
+script$a.__file = "src/components/CardHeader.vue";
+
+var script$9 = {
+ name: "Container"
+};
+
+const _hoisted_1$8 = { class: "container mx-auto px-4 lg:px-16 py-8 space-y-8" };
+
+function render$9(_ctx, _cache, $props, $setup, $data, $options) {
+ return (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$8, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$9.render = render$9;
+script$9.__file = "src/components/Container.vue";
+
+var script$8 = {
+ name: "FirstLevelLink",
+ props: {
+ icon: {
+ type: String,
+ default: 'fa-arrow-up-right-from-square'
+ }
+ }
+};
+
+const _hoisted_1$7 = {
+ class: "hover:bg-primary-500 rounded-lg text-center text-xs py-4 flex flex-col space-y-2",
+ href: "#"
+};
+
+function render$8(_ctx, _cache, $props, $setup, $data, $options) {
+ return (vue.openBlock(), vue.createElementBlock("a", _hoisted_1$7, [
+ vue.createElementVNode("i", {
+ class: vue.normalizeClass(['fal text-xl', $props.icon])
+ }, null, 2 /* CLASS */),
+ vue.createElementVNode("span", null, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ])
+ ]))
+}
+
+script$8.render = render$8;
+script$8.__file = "src/components/FirstLevelLink.vue";
+
+var script$7 = {
+ name: "FirstLevelMenu",
+ data() {
+ return {
+ primaryMenu: [
+ {name: 'Home', icon: 'fal fa-home', to: '/', exact: true},
+ {name: 'Buckets', icon: 'fal fa-bucket', to: '/buckets', exact: false},
+ {name: 'Domains', icon: 'fal fa-globe', to: '/domains', exact: false},
+ {name: 'Spaces', icon: 'fal fa-meteor', to: '/spaces', exact: false},
+ {name: 'Zones', icon: 'fal fa-list-ul', to: '/zones', exact: false},
+ ],
+ secondaryMenu: [
+ {name: 'Logout', icon: 'fal fa-sign-out', to: '/logout'},
+ ],
+ };
+ },
+ methods: {
+ toggleMenu() {
+ this.$refs.overlay.classList.toggle('hidden');
+ this.$refs.sidebar.classList.toggle('-translate-x-full');
+ },
+ closeMenu() {
+ this.$refs.overlay.classList.add('hidden');
+ this.$refs.sidebar.classList.add('-translate-x-full');
+ },
+ toggleDarkMode() {
+ document.body.classList.toggle('dark');
+ }
+ },
+};
+
+const _withScopeId = n => (vue.pushScopeId("data-v-42eb52e3"),n=n(),vue.popScopeId(),n);
+const _hoisted_1$6 = { class: "bg-gray-100 dark:bg-base min-h-screen flex flex-col relative" };
+const _hoisted_2$3 = {
+ ref: "overlay",
+ class: "sm:hidden hidden bg-gray-800 opacity-50 w-full min-h-screen absolute z-10"
+};
+const _hoisted_3$3 = { class: "bg-white relative shadow sm:hidden z-10" };
+const _hoisted_4$2 = { class: "container flex justify-between items-center py-4" };
+const _hoisted_5$1 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/vue.createElementVNode("img", {
+ src: "/img/icon-light.svg",
+ class: "h-4",
+ alt: "bitinflow"
+}, null, -1 /* HOISTED */));
+const _hoisted_6$1 = { class: "flex items-center space-x-4" };
+const _hoisted_7$1 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/vue.createElementVNode("img", {
+ class: "h-8 w-8 rounded-full",
+ alt: "profile",
+ src: "/img/avatar.jpg"
+}, null, -1 /* HOISTED */));
+const _hoisted_8$1 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/vue.createElementVNode("svg", {
+ xmlns: "http://www.w3.org/2000/svg",
+ class: "h-6 w-6",
+ fill: "none",
+ viewBox: "0 0 24 24",
+ stroke: "currentColor"
+}, [
+ /*#__PURE__*/vue.createElementVNode("path", {
+ "stroke-linecap": "round",
+ "stroke-linejoin": "round",
+ "stroke-width": "2",
+ d: "M4 6h16M4 12h16M4 18h16"
+ })
+], -1 /* HOISTED */));
+const _hoisted_9$1 = [
+ _hoisted_8$1
+];
+const _hoisted_10 = { class: "flex flex-grow" };
+const _hoisted_11 = {
+ ref: "sidebar",
+ class: "flex h-screen flex-col w-36 bg-base-800 dark:border-r dark:border-base text-gray-100 shadow sm:relative absolute inset-y-0 transform -translate-x-full sm:translate-x-0 transition transition-transform z-20"
+};
+const _hoisted_12 = { class: "flex-none bg-primary-500 h-16 sm:h-20 py-3 sm:py-6 text-white flex flex-initial justify-center" };
+const _hoisted_13 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/vue.createElementVNode("img", {
+ src: "/img/icon-light.svg",
+ class: "h-8 w-auto",
+ alt: "Logo"
+}, null, -1 /* HOISTED */));
+const _hoisted_14 = [
+ _hoisted_13
+];
+const _hoisted_15 = { class: "flex-auto flex flex-col overflow-y-auto py-6 space-y-6" };
+const _hoisted_16 = { class: "primary flex flex-grow flex-col space-y-4 px-6" };
+const _hoisted_17 = { class: "flex flex-initial flex-col space-y-4 px-6" };
+const _hoisted_18 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/vue.createElementVNode("div", { class: "flex-none" }, null, -1 /* HOISTED */));
+const _hoisted_19 = { class: "flex flex-1" };
+
+function render$7(_ctx, _cache, $props, $setup, $data, $options) {
+ const _component_nuxt_link = vue.resolveComponent("nuxt-link");
+
+ return (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$6, [
+ vue.createCommentVNode(" Overlay "),
+ vue.createElementVNode("div", _hoisted_2$3, null, 512 /* NEED_PATCH */),
+ vue.createCommentVNode(" Header "),
+ vue.createElementVNode("header", _hoisted_3$3, [
+ vue.createElementVNode("div", _hoisted_4$2, [
+ _hoisted_5$1,
+ vue.createElementVNode("div", _hoisted_6$1, [
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList($data.secondaryMenu, (link) => {
+ return (vue.openBlock(), vue.createBlock(_component_nuxt_link, {
+ key: link.name,
+ to: link.to
+ }, {
+ default: vue.withCtx(() => [
+ vue.createElementVNode("i", {
+ class: vue.normalizeClass([link.icon, "icon"])
+ }, null, 2 /* CLASS */),
+ vue.createTextVNode(" " + vue.toDisplayString(link.name), 1 /* TEXT */)
+ ]),
+ _: 2 /* DYNAMIC */
+ }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["to"]))
+ }), 128 /* KEYED_FRAGMENT */)),
+ vue.createVNode(_component_nuxt_link, {
+ class: "inline-block flex",
+ to: "/"
+ }, {
+ default: vue.withCtx(() => [
+ _hoisted_7$1
+ ]),
+ _: 1 /* STABLE */
+ }),
+ vue.createElementVNode("button", {
+ onClick: _cache[0] || (_cache[0] = (...args) => ($options.toggleMenu && $options.toggleMenu(...args))),
+ class: "focus-within:outline-none pl-4"
+ }, _hoisted_9$1)
+ ])
+ ])
+ ]),
+ vue.createCommentVNode(" Sidenav with Content "),
+ vue.createElementVNode("div", _hoisted_10, [
+ vue.createCommentVNode(" Sidenav "),
+ vue.createElementVNode("nav", _hoisted_11, [
+ vue.createCommentVNode(" logo "),
+ vue.createElementVNode("div", _hoisted_12, [
+ vue.createElementVNode("button", {
+ onClick: _cache[1] || (_cache[1] = (...args) => ($options.toggleDarkMode && $options.toggleDarkMode(...args)))
+ }, _hoisted_14)
+ ]),
+ vue.createElementVNode("div", _hoisted_15, [
+ vue.createCommentVNode(" nav "),
+ vue.createElementVNode("nav", _hoisted_16, [
+ vue.renderSlot(_ctx.$slots, "top")
+ ]),
+ vue.createElementVNode("nav", _hoisted_17, [
+ vue.renderSlot(_ctx.$slots, "bottom")
+ ])
+ ]),
+ _hoisted_18
+ ], 512 /* NEED_PATCH */),
+ vue.createCommentVNode(" Content "),
+ vue.createElementVNode("main", _hoisted_19, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ])
+ ])
+ ]))
+}
+
+script$7.render = render$7;
+script$7.__scopeId = "data-v-42eb52e3";
+script$7.__file = "src/components/FirstLevelMenu.vue";
+
+var script$6 = {
+ name: "Flex"
+};
+
+const _hoisted_1$5 = { class: "flex-auto" };
+
+function render$6(_ctx, _cache, $props, $setup, $data, $options) {
+ return (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$5, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$6.render = render$6;
+script$6.__file = "src/components/FlexAuto.vue";
+
+var script$5 = {
+ name: "FloatingBanner"
+};
+
+const _hoisted_1$4 = { class: "fixed inset-x-0 bottom-0 pb-2 sm:pb-5 z-[100]" };
+const _hoisted_2$2 = /*#__PURE__*/vue.createStaticVNode("
We announced a new product!Big news! We're excited to announce a brand new product.
", 1);
+const _hoisted_3$2 = [
+ _hoisted_2$2
+];
+
+function render$5(_ctx, _cache, $props, $setup, $data, $options) {
+ return (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$4, _hoisted_3$2))
+}
+
+script$5.render = render$5;
+script$5.__file = "src/components/FloatingBanner.vue";
+
+var script$4 = {
+ name: "HeroCard"
+};
+
+const _hoisted_1$3 = { class: "bg-gradient-to-tr from-primary-600 to-primary-400 text-white rounded shadow p-8" };
+
+function render$4(_ctx, _cache, $props, $setup, $data, $options) {
+ return (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$3, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$4.render = render$4;
+script$4.__file = "src/components/HeroCard.vue";
+
+var script$3 = {
+ name: "ScreenScrollContainer"
+};
+
+const _hoisted_1$2 = { class: "overflow-y-auto h-screen" };
+
+function render$3(_ctx, _cache, $props, $setup, $data, $options) {
+ return (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$2, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$3.render = render$3;
+script$3.__file = "src/components/ScreenScrollContainer.vue";
+
+var script$2 = {
+ name: "SecondLevelLink",
+ components: {Button: script$d},
+ props: {
+ icon: {
+ type: String,
+ default: 'fa-arrow-up-right-from-square'
+ }
+ }
+};
+
+function render$2(_ctx, _cache, $props, $setup, $data, $options) {
+ const _component_Button = vue.resolveComponent("Button");
+
+ return (vue.openBlock(), vue.createBlock(_component_Button, { class: "flex items-center gap-2" }, {
+ default: vue.withCtx(() => [
+ vue.createElementVNode("i", {
+ class: vue.normalizeClass(['fal', $props.icon])
+ }, null, 2 /* CLASS */),
+ vue.createTextVNode(),
+ vue.renderSlot(_ctx.$slots, "default")
+ ]),
+ _: 3 /* FORWARDED */
+ }))
+}
+
+script$2.render = render$2;
+script$2.__file = "src/components/SecondLevelLink.vue";
+
+var script$1 = {
+ name: "SecondLevelMenu",
+ components: {SecondLevelLink: script$2},
+ props: {
+ items: {
+ type: Array,
+ default: [
+ {name: 'Test', href: 'Test'}
+ ]
+ }
+ }
+};
+
+const _hoisted_1$1 = { class: "w-64 bg-white text-black shadow dark:bg-base-700 dark:text-white dark:border-base-900 dark:border-l flex flex-col overflow-y-auto h-screen absolute sm:relative transform -translate-x-full sm:translate-x-0 pt-10 pb-4 px-4 space-y-2" };
+const _hoisted_2$1 = { class: "font-semibold px-4" };
+const _hoisted_3$1 = { class: "flex flex-col gap-2 justify-between flex-1" };
+const _hoisted_4$1 = { class: "flex flex-col gap-2" };
+
+function render$1(_ctx, _cache, $props, $setup, $data, $options) {
+ const _component_SecondLevelLink = vue.resolveComponent("SecondLevelLink");
+
+ return (vue.openBlock(), vue.createElementBlock("nav", _hoisted_1$1, [
+ vue.createElementVNode("span", _hoisted_2$1, [
+ vue.renderSlot(_ctx.$slots, "title")
+ ]),
+ vue.createElementVNode("div", _hoisted_3$1, [
+ vue.createElementVNode("div", _hoisted_4$1, [
+ vue.renderSlot(_ctx.$slots, "default")
+ ]),
+ vue.createElementVNode("div", null, [
+ vue.createVNode(_component_SecondLevelLink, {
+ class: "bg-zinc-100 hover:bg-zinc-200 dark:bg-base-500 dark:hover:bg-base-600",
+ icon: "fa-plus"
+ }, {
+ default: vue.withCtx(() => [
+ vue.createTextVNode(" Create Resource ")
+ ]),
+ _: 1 /* STABLE */
+ })
+ ])
+ ])
+ ]))
+}
+
+script$1.render = render$1;
+script$1.__scopeId = "data-v-05ca9b6f";
+script$1.__file = "src/components/SecondLevelMenu.vue";
+
+const useMenuStore = pinia.defineStore('menu', {
+ state: () => {
+ return {
+ thirdLevelLinks: []
+ }
+ },
+ actions: {
+ updateThirdLevelLinks(links) {
+ this.thirdLevelLinks = links;
+ },
+ },
+});
+
+var script = {
+ name: "ThirdLevelMenu",
+ components: {Button: script$d},
+ data() {
+ return {
+ link: ''
+ }
+ },
+ computed: {
+ ...pinia.mapState(useMenuStore, ['thirdLevelLinks'])
+ },
+ methods: {
+ onChange(event) {
+ this.link = event.target.value;
+ this.$router.push(event.target.value);
+ }
+ }
+};
+
+const _hoisted_1 = { class: "flex-1 dark:border-l dark:border-base shadow text-black dark:text-white" };
+const _hoisted_2 = { class: "bg-white border-b dark:bg-base-600 dark:border-base" };
+const _hoisted_3 = { class: "container mx-auto px-4 lg:px-16 py-10" };
+const _hoisted_4 = { class: "text-3xl font-semibold" };
+const _hoisted_5 = { class: "bg-white dark:bg-base-700 py-4" };
+const _hoisted_6 = { class: "container mx-auto px-4 lg:px-16" };
+const _hoisted_7 = { class: "hidden xl:block space-x-4" };
+const _hoisted_8 = { class: "flex flex-col xl:hidden" };
+const _hoisted_9 = ["to", "value"];
+
+function render(_ctx, _cache, $props, $setup, $data, $options) {
+ const _component_Button = vue.resolveComponent("Button");
+
+ return (vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
+ vue.createElementVNode("div", _hoisted_2, [
+ vue.createElementVNode("div", _hoisted_3, [
+ vue.createElementVNode("div", _hoisted_4, [
+ vue.renderSlot(_ctx.$slots, "title")
+ ])
+ ])
+ ]),
+ vue.createElementVNode("nav", _hoisted_5, [
+ vue.createElementVNode("div", _hoisted_6, [
+ vue.createElementVNode("div", _hoisted_7, [
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.thirdLevelLinks, (link) => {
+ return (vue.openBlock(), vue.createBlock(_component_Button, null, {
+ default: vue.withCtx(() => [
+ vue.createElementVNode("i", {
+ class: vue.normalizeClass([link.icon, "icon"])
+ }, null, 2 /* CLASS */),
+ vue.createTextVNode(" " + vue.toDisplayString(link.name), 1 /* TEXT */)
+ ]),
+ _: 2 /* DYNAMIC */
+ }, 1024 /* DYNAMIC_SLOTS */))
+ }), 256 /* UNKEYED_FRAGMENT */))
+ ]),
+ vue.createElementVNode("div", _hoisted_8, [
+ vue.withDirectives(vue.createElementVNode("select", {
+ onChange: _cache[0] || (_cache[0] = (...args) => ($options.onChange && $options.onChange(...args))),
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => (($data.link) = $event)),
+ class: "bg-white"
+ }, [
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.thirdLevelLinks, (link) => {
+ return (vue.openBlock(), vue.createElementBlock("option", {
+ key: link.name,
+ to: link.to,
+ value: link.to
+ }, vue.toDisplayString(link.name), 9 /* TEXT, PROPS */, _hoisted_9))
+ }), 128 /* KEYED_FRAGMENT */))
+ ], 544 /* HYDRATE_EVENTS, NEED_PATCH */), [
+ [vue.vModelSelect, $data.link]
+ ])
+ ])
+ ])
+ ])
+ ]))
+}
+
+script.render = render;
+script.__scopeId = "data-v-4c63018c";
+script.__file = "src/components/ThirdLevelMenu.vue";
+
+var components = {
+ Button: script$d,
+ Card: script$c,
+ CardBody: script$b,
+ CardHeader: script$a,
+ Container: script$9,
+ FirstLevelLink: script$8,
+ FirstLevelMenu: script$7,
+ FlexAuto: script$6,
+ FloatingBanner: script$5,
+ HeroCard: script$4,
+ ScreenScrollContainer: script$3,
+ SecondLevelLink: script$2,
+ SecondLevelMenu: script$1,
+ ThirdLevelMenu: script,
+};
+
+const colors = {
+ primary: {
+ DEFAULT: '#00BFA5',
+ '50': '#A6FFF3',
+ '100': '#8CFFEF',
+ '200': '#59FFE8',
+ '300': '#26FFE1',
+ '400': '#00F2D1',
+ '500': '#00BFA5',
+ '600': '#00917D',
+ '700': '#006356',
+ '800': '#00352E',
+ '900': '#000706'
+ },
+ base: {
+ DEFAULT: '#070709',
+ '500': '#3a3a3d',
+ '600': '#26262c',
+ '700': '#1f1f23',
+ '800': '#18181b',
+ '900': '#0e0e10'
+ },
+};
+
+const plugin = {
+ install (Vue) {
+ for (const prop in components) {
+ if (components.hasOwnProperty(prop)) {
+ const component = components[prop];
+ Vue.component(component.name, component);
+ }
+ }
+ }
+};
+
+exports.colors = colors;
+exports.default = plugin;
diff --git a/dist/library.mjs b/dist/library.mjs
new file mode 100644
index 0000000..2152fd7
--- /dev/null
+++ b/dist/library.mjs
@@ -0,0 +1,566 @@
+import { openBlock, createElementBlock, renderSlot, createElementVNode, normalizeClass, resolveComponent, createCommentVNode, Fragment, renderList, createBlock, withCtx, createTextVNode, toDisplayString, createVNode, pushScopeId, popScopeId, createStaticVNode, withDirectives, vModelSelect } from 'vue';
+import { defineStore, mapState } from 'pinia';
+
+var script$d = {
+ name: "Button",
+
+ methods: {
+ click() {
+ this.$emit('click');
+ }
+ }
+};
+
+const _hoisted_1$c = {
+ href: "#",
+ class: "truncate text-black dark:text-white hover:bg-zinc-100 dark:bg-base-700 dark:hover:bg-base-600 dark:text-white rounded-lg px-4 py-2"
+};
+
+function render$d(_ctx, _cache, $props, $setup, $data, $options) {
+ return (openBlock(), createElementBlock("a", _hoisted_1$c, [
+ renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$d.render = render$d;
+script$d.__file = "src/components/Button.vue";
+
+var script$c = {
+ name: "Card"
+};
+
+const _hoisted_1$b = { class: "bg-white text-black dark:bg-base-700 dark:text-white rounded shadow mb-8" };
+
+function render$c(_ctx, _cache, $props, $setup, $data, $options) {
+ return (openBlock(), createElementBlock("div", _hoisted_1$b, [
+ renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$c.render = render$c;
+script$c.__file = "src/components/Card.vue";
+
+var script$b = {
+ name: "CardBody"
+};
+
+const _hoisted_1$a = { class: "p-8 rounded-b" };
+
+function render$b(_ctx, _cache, $props, $setup, $data, $options) {
+ return (openBlock(), createElementBlock("div", _hoisted_1$a, [
+ renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$b.render = render$b;
+script$b.__file = "src/components/CardBody.vue";
+
+var script$a = {
+ name: "CardHeader"
+};
+
+const _hoisted_1$9 = { class: "py-4 px-8 border-b dark:border-base-800 rounded-t" };
+const _hoisted_2$4 = { class: "text-xl font-medium" };
+
+function render$a(_ctx, _cache, $props, $setup, $data, $options) {
+ return (openBlock(), createElementBlock("div", _hoisted_1$9, [
+ createElementVNode("div", _hoisted_2$4, [
+ renderSlot(_ctx.$slots, "default")
+ ])
+ ]))
+}
+
+script$a.render = render$a;
+script$a.__file = "src/components/CardHeader.vue";
+
+var script$9 = {
+ name: "Container"
+};
+
+const _hoisted_1$8 = { class: "container mx-auto px-4 lg:px-16 py-8 space-y-8" };
+
+function render$9(_ctx, _cache, $props, $setup, $data, $options) {
+ return (openBlock(), createElementBlock("div", _hoisted_1$8, [
+ renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$9.render = render$9;
+script$9.__file = "src/components/Container.vue";
+
+var script$8 = {
+ name: "FirstLevelLink",
+ props: {
+ icon: {
+ type: String,
+ default: 'fa-arrow-up-right-from-square'
+ }
+ }
+};
+
+const _hoisted_1$7 = {
+ class: "hover:bg-primary-500 rounded-lg text-center text-xs py-4 flex flex-col space-y-2",
+ href: "#"
+};
+
+function render$8(_ctx, _cache, $props, $setup, $data, $options) {
+ return (openBlock(), createElementBlock("a", _hoisted_1$7, [
+ createElementVNode("i", {
+ class: normalizeClass(['fal text-xl', $props.icon])
+ }, null, 2 /* CLASS */),
+ createElementVNode("span", null, [
+ renderSlot(_ctx.$slots, "default")
+ ])
+ ]))
+}
+
+script$8.render = render$8;
+script$8.__file = "src/components/FirstLevelLink.vue";
+
+var script$7 = {
+ name: "FirstLevelMenu",
+ data() {
+ return {
+ primaryMenu: [
+ {name: 'Home', icon: 'fal fa-home', to: '/', exact: true},
+ {name: 'Buckets', icon: 'fal fa-bucket', to: '/buckets', exact: false},
+ {name: 'Domains', icon: 'fal fa-globe', to: '/domains', exact: false},
+ {name: 'Spaces', icon: 'fal fa-meteor', to: '/spaces', exact: false},
+ {name: 'Zones', icon: 'fal fa-list-ul', to: '/zones', exact: false},
+ ],
+ secondaryMenu: [
+ {name: 'Logout', icon: 'fal fa-sign-out', to: '/logout'},
+ ],
+ };
+ },
+ methods: {
+ toggleMenu() {
+ this.$refs.overlay.classList.toggle('hidden');
+ this.$refs.sidebar.classList.toggle('-translate-x-full');
+ },
+ closeMenu() {
+ this.$refs.overlay.classList.add('hidden');
+ this.$refs.sidebar.classList.add('-translate-x-full');
+ },
+ toggleDarkMode() {
+ document.body.classList.toggle('dark');
+ }
+ },
+};
+
+const _withScopeId = n => (pushScopeId("data-v-42eb52e3"),n=n(),popScopeId(),n);
+const _hoisted_1$6 = { class: "bg-gray-100 dark:bg-base min-h-screen flex flex-col relative" };
+const _hoisted_2$3 = {
+ ref: "overlay",
+ class: "sm:hidden hidden bg-gray-800 opacity-50 w-full min-h-screen absolute z-10"
+};
+const _hoisted_3$3 = { class: "bg-white relative shadow sm:hidden z-10" };
+const _hoisted_4$2 = { class: "container flex justify-between items-center py-4" };
+const _hoisted_5$1 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/createElementVNode("img", {
+ src: "/img/icon-light.svg",
+ class: "h-4",
+ alt: "bitinflow"
+}, null, -1 /* HOISTED */));
+const _hoisted_6$1 = { class: "flex items-center space-x-4" };
+const _hoisted_7$1 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/createElementVNode("img", {
+ class: "h-8 w-8 rounded-full",
+ alt: "profile",
+ src: "/img/avatar.jpg"
+}, null, -1 /* HOISTED */));
+const _hoisted_8$1 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/createElementVNode("svg", {
+ xmlns: "http://www.w3.org/2000/svg",
+ class: "h-6 w-6",
+ fill: "none",
+ viewBox: "0 0 24 24",
+ stroke: "currentColor"
+}, [
+ /*#__PURE__*/createElementVNode("path", {
+ "stroke-linecap": "round",
+ "stroke-linejoin": "round",
+ "stroke-width": "2",
+ d: "M4 6h16M4 12h16M4 18h16"
+ })
+], -1 /* HOISTED */));
+const _hoisted_9$1 = [
+ _hoisted_8$1
+];
+const _hoisted_10 = { class: "flex flex-grow" };
+const _hoisted_11 = {
+ ref: "sidebar",
+ class: "flex h-screen flex-col w-36 bg-base-800 dark:border-r dark:border-base text-gray-100 shadow sm:relative absolute inset-y-0 transform -translate-x-full sm:translate-x-0 transition transition-transform z-20"
+};
+const _hoisted_12 = { class: "flex-none bg-primary-500 h-16 sm:h-20 py-3 sm:py-6 text-white flex flex-initial justify-center" };
+const _hoisted_13 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/createElementVNode("img", {
+ src: "/img/icon-light.svg",
+ class: "h-8 w-auto",
+ alt: "Logo"
+}, null, -1 /* HOISTED */));
+const _hoisted_14 = [
+ _hoisted_13
+];
+const _hoisted_15 = { class: "flex-auto flex flex-col overflow-y-auto py-6 space-y-6" };
+const _hoisted_16 = { class: "primary flex flex-grow flex-col space-y-4 px-6" };
+const _hoisted_17 = { class: "flex flex-initial flex-col space-y-4 px-6" };
+const _hoisted_18 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/createElementVNode("div", { class: "flex-none" }, null, -1 /* HOISTED */));
+const _hoisted_19 = { class: "flex flex-1" };
+
+function render$7(_ctx, _cache, $props, $setup, $data, $options) {
+ const _component_nuxt_link = resolveComponent("nuxt-link");
+
+ return (openBlock(), createElementBlock("div", _hoisted_1$6, [
+ createCommentVNode(" Overlay "),
+ createElementVNode("div", _hoisted_2$3, null, 512 /* NEED_PATCH */),
+ createCommentVNode(" Header "),
+ createElementVNode("header", _hoisted_3$3, [
+ createElementVNode("div", _hoisted_4$2, [
+ _hoisted_5$1,
+ createElementVNode("div", _hoisted_6$1, [
+ (openBlock(true), createElementBlock(Fragment, null, renderList($data.secondaryMenu, (link) => {
+ return (openBlock(), createBlock(_component_nuxt_link, {
+ key: link.name,
+ to: link.to
+ }, {
+ default: withCtx(() => [
+ createElementVNode("i", {
+ class: normalizeClass([link.icon, "icon"])
+ }, null, 2 /* CLASS */),
+ createTextVNode(" " + toDisplayString(link.name), 1 /* TEXT */)
+ ]),
+ _: 2 /* DYNAMIC */
+ }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["to"]))
+ }), 128 /* KEYED_FRAGMENT */)),
+ createVNode(_component_nuxt_link, {
+ class: "inline-block flex",
+ to: "/"
+ }, {
+ default: withCtx(() => [
+ _hoisted_7$1
+ ]),
+ _: 1 /* STABLE */
+ }),
+ createElementVNode("button", {
+ onClick: _cache[0] || (_cache[0] = (...args) => ($options.toggleMenu && $options.toggleMenu(...args))),
+ class: "focus-within:outline-none pl-4"
+ }, _hoisted_9$1)
+ ])
+ ])
+ ]),
+ createCommentVNode(" Sidenav with Content "),
+ createElementVNode("div", _hoisted_10, [
+ createCommentVNode(" Sidenav "),
+ createElementVNode("nav", _hoisted_11, [
+ createCommentVNode(" logo "),
+ createElementVNode("div", _hoisted_12, [
+ createElementVNode("button", {
+ onClick: _cache[1] || (_cache[1] = (...args) => ($options.toggleDarkMode && $options.toggleDarkMode(...args)))
+ }, _hoisted_14)
+ ]),
+ createElementVNode("div", _hoisted_15, [
+ createCommentVNode(" nav "),
+ createElementVNode("nav", _hoisted_16, [
+ renderSlot(_ctx.$slots, "top")
+ ]),
+ createElementVNode("nav", _hoisted_17, [
+ renderSlot(_ctx.$slots, "bottom")
+ ])
+ ]),
+ _hoisted_18
+ ], 512 /* NEED_PATCH */),
+ createCommentVNode(" Content "),
+ createElementVNode("main", _hoisted_19, [
+ renderSlot(_ctx.$slots, "default")
+ ])
+ ])
+ ]))
+}
+
+script$7.render = render$7;
+script$7.__scopeId = "data-v-42eb52e3";
+script$7.__file = "src/components/FirstLevelMenu.vue";
+
+var script$6 = {
+ name: "Flex"
+};
+
+const _hoisted_1$5 = { class: "flex-auto" };
+
+function render$6(_ctx, _cache, $props, $setup, $data, $options) {
+ return (openBlock(), createElementBlock("div", _hoisted_1$5, [
+ renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$6.render = render$6;
+script$6.__file = "src/components/FlexAuto.vue";
+
+var script$5 = {
+ name: "FloatingBanner"
+};
+
+const _hoisted_1$4 = { class: "fixed inset-x-0 bottom-0 pb-2 sm:pb-5 z-[100]" };
+const _hoisted_2$2 = /*#__PURE__*/createStaticVNode("We announced a new product!Big news! We're excited to announce a brand new product.
", 1);
+const _hoisted_3$2 = [
+ _hoisted_2$2
+];
+
+function render$5(_ctx, _cache, $props, $setup, $data, $options) {
+ return (openBlock(), createElementBlock("div", _hoisted_1$4, _hoisted_3$2))
+}
+
+script$5.render = render$5;
+script$5.__file = "src/components/FloatingBanner.vue";
+
+var script$4 = {
+ name: "HeroCard"
+};
+
+const _hoisted_1$3 = { class: "bg-gradient-to-tr from-primary-600 to-primary-400 text-white rounded shadow p-8" };
+
+function render$4(_ctx, _cache, $props, $setup, $data, $options) {
+ return (openBlock(), createElementBlock("div", _hoisted_1$3, [
+ renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$4.render = render$4;
+script$4.__file = "src/components/HeroCard.vue";
+
+var script$3 = {
+ name: "ScreenScrollContainer"
+};
+
+const _hoisted_1$2 = { class: "overflow-y-auto h-screen" };
+
+function render$3(_ctx, _cache, $props, $setup, $data, $options) {
+ return (openBlock(), createElementBlock("div", _hoisted_1$2, [
+ renderSlot(_ctx.$slots, "default")
+ ]))
+}
+
+script$3.render = render$3;
+script$3.__file = "src/components/ScreenScrollContainer.vue";
+
+var script$2 = {
+ name: "SecondLevelLink",
+ components: {Button: script$d},
+ props: {
+ icon: {
+ type: String,
+ default: 'fa-arrow-up-right-from-square'
+ }
+ }
+};
+
+function render$2(_ctx, _cache, $props, $setup, $data, $options) {
+ const _component_Button = resolveComponent("Button");
+
+ return (openBlock(), createBlock(_component_Button, { class: "flex items-center gap-2" }, {
+ default: withCtx(() => [
+ createElementVNode("i", {
+ class: normalizeClass(['fal', $props.icon])
+ }, null, 2 /* CLASS */),
+ createTextVNode(),
+ renderSlot(_ctx.$slots, "default")
+ ]),
+ _: 3 /* FORWARDED */
+ }))
+}
+
+script$2.render = render$2;
+script$2.__file = "src/components/SecondLevelLink.vue";
+
+var script$1 = {
+ name: "SecondLevelMenu",
+ components: {SecondLevelLink: script$2},
+ props: {
+ items: {
+ type: Array,
+ default: [
+ {name: 'Test', href: 'Test'}
+ ]
+ }
+ }
+};
+
+const _hoisted_1$1 = { class: "w-64 bg-white text-black shadow dark:bg-base-700 dark:text-white dark:border-base-900 dark:border-l flex flex-col overflow-y-auto h-screen absolute sm:relative transform -translate-x-full sm:translate-x-0 pt-10 pb-4 px-4 space-y-2" };
+const _hoisted_2$1 = { class: "font-semibold px-4" };
+const _hoisted_3$1 = { class: "flex flex-col gap-2 justify-between flex-1" };
+const _hoisted_4$1 = { class: "flex flex-col gap-2" };
+
+function render$1(_ctx, _cache, $props, $setup, $data, $options) {
+ const _component_SecondLevelLink = resolveComponent("SecondLevelLink");
+
+ return (openBlock(), createElementBlock("nav", _hoisted_1$1, [
+ createElementVNode("span", _hoisted_2$1, [
+ renderSlot(_ctx.$slots, "title")
+ ]),
+ createElementVNode("div", _hoisted_3$1, [
+ createElementVNode("div", _hoisted_4$1, [
+ renderSlot(_ctx.$slots, "default")
+ ]),
+ createElementVNode("div", null, [
+ createVNode(_component_SecondLevelLink, {
+ class: "bg-zinc-100 hover:bg-zinc-200 dark:bg-base-500 dark:hover:bg-base-600",
+ icon: "fa-plus"
+ }, {
+ default: withCtx(() => [
+ createTextVNode(" Create Resource ")
+ ]),
+ _: 1 /* STABLE */
+ })
+ ])
+ ])
+ ]))
+}
+
+script$1.render = render$1;
+script$1.__scopeId = "data-v-05ca9b6f";
+script$1.__file = "src/components/SecondLevelMenu.vue";
+
+const useMenuStore = defineStore('menu', {
+ state: () => {
+ return {
+ thirdLevelLinks: []
+ }
+ },
+ actions: {
+ updateThirdLevelLinks(links) {
+ this.thirdLevelLinks = links;
+ },
+ },
+});
+
+var script = {
+ name: "ThirdLevelMenu",
+ components: {Button: script$d},
+ data() {
+ return {
+ link: ''
+ }
+ },
+ computed: {
+ ...mapState(useMenuStore, ['thirdLevelLinks'])
+ },
+ methods: {
+ onChange(event) {
+ this.link = event.target.value;
+ this.$router.push(event.target.value);
+ }
+ }
+};
+
+const _hoisted_1 = { class: "flex-1 dark:border-l dark:border-base shadow text-black dark:text-white" };
+const _hoisted_2 = { class: "bg-white border-b dark:bg-base-600 dark:border-base" };
+const _hoisted_3 = { class: "container mx-auto px-4 lg:px-16 py-10" };
+const _hoisted_4 = { class: "text-3xl font-semibold" };
+const _hoisted_5 = { class: "bg-white dark:bg-base-700 py-4" };
+const _hoisted_6 = { class: "container mx-auto px-4 lg:px-16" };
+const _hoisted_7 = { class: "hidden xl:block space-x-4" };
+const _hoisted_8 = { class: "flex flex-col xl:hidden" };
+const _hoisted_9 = ["to", "value"];
+
+function render(_ctx, _cache, $props, $setup, $data, $options) {
+ const _component_Button = resolveComponent("Button");
+
+ return (openBlock(), createElementBlock("div", _hoisted_1, [
+ createElementVNode("div", _hoisted_2, [
+ createElementVNode("div", _hoisted_3, [
+ createElementVNode("div", _hoisted_4, [
+ renderSlot(_ctx.$slots, "title")
+ ])
+ ])
+ ]),
+ createElementVNode("nav", _hoisted_5, [
+ createElementVNode("div", _hoisted_6, [
+ createElementVNode("div", _hoisted_7, [
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.thirdLevelLinks, (link) => {
+ return (openBlock(), createBlock(_component_Button, null, {
+ default: withCtx(() => [
+ createElementVNode("i", {
+ class: normalizeClass([link.icon, "icon"])
+ }, null, 2 /* CLASS */),
+ createTextVNode(" " + toDisplayString(link.name), 1 /* TEXT */)
+ ]),
+ _: 2 /* DYNAMIC */
+ }, 1024 /* DYNAMIC_SLOTS */))
+ }), 256 /* UNKEYED_FRAGMENT */))
+ ]),
+ createElementVNode("div", _hoisted_8, [
+ withDirectives(createElementVNode("select", {
+ onChange: _cache[0] || (_cache[0] = (...args) => ($options.onChange && $options.onChange(...args))),
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => (($data.link) = $event)),
+ class: "bg-white"
+ }, [
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.thirdLevelLinks, (link) => {
+ return (openBlock(), createElementBlock("option", {
+ key: link.name,
+ to: link.to,
+ value: link.to
+ }, toDisplayString(link.name), 9 /* TEXT, PROPS */, _hoisted_9))
+ }), 128 /* KEYED_FRAGMENT */))
+ ], 544 /* HYDRATE_EVENTS, NEED_PATCH */), [
+ [vModelSelect, $data.link]
+ ])
+ ])
+ ])
+ ])
+ ]))
+}
+
+script.render = render;
+script.__scopeId = "data-v-4c63018c";
+script.__file = "src/components/ThirdLevelMenu.vue";
+
+var components = {
+ Button: script$d,
+ Card: script$c,
+ CardBody: script$b,
+ CardHeader: script$a,
+ Container: script$9,
+ FirstLevelLink: script$8,
+ FirstLevelMenu: script$7,
+ FlexAuto: script$6,
+ FloatingBanner: script$5,
+ HeroCard: script$4,
+ ScreenScrollContainer: script$3,
+ SecondLevelLink: script$2,
+ SecondLevelMenu: script$1,
+ ThirdLevelMenu: script,
+};
+
+const colors = {
+ primary: {
+ DEFAULT: '#00BFA5',
+ '50': '#A6FFF3',
+ '100': '#8CFFEF',
+ '200': '#59FFE8',
+ '300': '#26FFE1',
+ '400': '#00F2D1',
+ '500': '#00BFA5',
+ '600': '#00917D',
+ '700': '#006356',
+ '800': '#00352E',
+ '900': '#000706'
+ },
+ base: {
+ DEFAULT: '#070709',
+ '500': '#3a3a3d',
+ '600': '#26262c',
+ '700': '#1f1f23',
+ '800': '#18181b',
+ '900': '#0e0e10'
+ },
+};
+
+const plugin = {
+ install (Vue) {
+ for (const prop in components) {
+ if (components.hasOwnProperty(prop)) {
+ const component = components[prop];
+ Vue.component(component.name, component);
+ }
+ }
+ }
+};
+
+export { colors, plugin as default };
diff --git a/dist/library.mjs.css b/dist/library.mjs.css
new file mode 100644
index 0000000..ab69d3a
--- /dev/null
+++ b/dist/library.mjs.css
@@ -0,0 +1,23 @@
+.nuxt-link-active[data-v-42eb52e3] {
+ background: #00BFA5;
+}
+
+.nuxt-link-active[data-v-42eb52e3]:hover {
+ background: #004F44;
+}
+
+.nuxt-link-active[data-v-4c63018c] {
+ background: #f3f3f3;
+}
+
+.dark .nuxt-link-active[data-v-4c63018c] {
+ background: #464649;
+}
+
+.nuxt-link-active[data-v-05ca9b6f] {
+ background: #f3f3f3;
+}
+
+.dark .nuxt-link-active[data-v-05ca9b6f] {
+ background: #464649;
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index e8021c2..d119ce6 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,28 @@
{
"name": "@bitinflow/ui",
"version": "0.0.1",
- "description": "Bitinflow UI Kit",
+ "description": "bitinflow UI Kit",
+ "main": "dist/library.cjs",
+ "module": "dist/library.mjs",
+ "type": "module",
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "build": "rollup -c"
+ },
"author": "René Preuß ",
"license": "Apache-2.0",
"dependencies": {
- "pinia": "^2.0.23"
+ "@nuxt/kit": "^3.0.0-rc.12",
+ "pinia": ">=2.0.23",
+ "vue": "^3.2.41"
+ },
+ "devDependencies": {
+ "rollup": "^3.2.3",
+ "rollup-plugin-peer-deps-external": "^2.2.4",
+ "rollup-plugin-scss": "^3.0.0",
+ "rollup-plugin-vue": "^6.0.0",
+ "sass": "^1.55.0"
}
}
diff --git a/rollup.config.js b/rollup.config.js
new file mode 100644
index 0000000..c3b82ef
--- /dev/null
+++ b/rollup.config.js
@@ -0,0 +1,22 @@
+import vue from 'rollup-plugin-vue'
+import peerDepsExternal from 'rollup-plugin-peer-deps-external'
+import scss from "rollup-plugin-scss";
+
+export default [
+ {
+ input: 'src/index.js',
+ output: [
+ {
+ format: 'esm',
+ file: 'dist/library.mjs'
+ },
+ {
+ format: 'cjs',
+ file: 'dist/library.cjs'
+ }
+ ],
+ plugins: [
+ vue(), peerDepsExternal(), scss()
+ ]
+ }
+]
\ No newline at end of file
diff --git a/colors.js b/src/colors.js
similarity index 84%
rename from colors.js
rename to src/colors.js
index ffaf462..fbd5d49 100644
--- a/colors.js
+++ b/src/colors.js
@@ -1,4 +1,4 @@
-let colors = {
+const colors = {
primary: {
DEFAULT: '#00BFA5',
'50': '#A6FFF3',
@@ -22,4 +22,4 @@ let colors = {
},
};
-module.exports = (colors.__esModule ? colors : { default: colors }).default
\ No newline at end of file
+export default colors
\ No newline at end of file
diff --git a/src/components.js b/src/components.js
new file mode 100644
index 0000000..53b4273
--- /dev/null
+++ b/src/components.js
@@ -0,0 +1,31 @@
+import Button from './components/Button.vue'
+import Card from './components/Card.vue'
+import CardBody from './components/CardBody.vue'
+import CardHeader from './components/CardHeader.vue'
+import Container from './components/Container.vue'
+import FirstLevelLink from './components/FirstLevelLink.vue'
+import FirstLevelMenu from './components/FirstLevelMenu.vue'
+import FlexAuto from './components/FlexAuto.vue'
+import FloatingBanner from './components/FloatingBanner.vue'
+import HeroCard from './components/HeroCard.vue'
+import ScreenScrollContainer from './components/ScreenScrollContainer.vue'
+import SecondLevelLink from './components/SecondLevelLink.vue'
+import SecondLevelMenu from './components/SecondLevelMenu.vue'
+import ThirdLevelMenu from './components/ThirdLevelMenu.vue'
+
+export default {
+ Button,
+ Card,
+ CardBody,
+ CardHeader,
+ Container,
+ FirstLevelLink,
+ FirstLevelMenu,
+ FlexAuto,
+ FloatingBanner,
+ HeroCard,
+ ScreenScrollContainer,
+ SecondLevelLink,
+ SecondLevelMenu,
+ ThirdLevelMenu,
+}
\ No newline at end of file
diff --git a/components/Button.vue b/src/components/Button.vue
similarity index 100%
rename from components/Button.vue
rename to src/components/Button.vue
diff --git a/components/Card.vue b/src/components/Card.vue
similarity index 100%
rename from components/Card.vue
rename to src/components/Card.vue
diff --git a/components/CardBody.vue b/src/components/CardBody.vue
similarity index 100%
rename from components/CardBody.vue
rename to src/components/CardBody.vue
diff --git a/components/CardHeader.vue b/src/components/CardHeader.vue
similarity index 100%
rename from components/CardHeader.vue
rename to src/components/CardHeader.vue
diff --git a/components/Container.vue b/src/components/Container.vue
similarity index 100%
rename from components/Container.vue
rename to src/components/Container.vue
diff --git a/components/FirstLevelLink.vue b/src/components/FirstLevelLink.vue
similarity index 100%
rename from components/FirstLevelLink.vue
rename to src/components/FirstLevelLink.vue
diff --git a/components/FirstLevelMenu.vue b/src/components/FirstLevelMenu.vue
similarity index 100%
rename from components/FirstLevelMenu.vue
rename to src/components/FirstLevelMenu.vue
diff --git a/components/FlexAuto.vue b/src/components/FlexAuto.vue
similarity index 100%
rename from components/FlexAuto.vue
rename to src/components/FlexAuto.vue
diff --git a/components/FloatingBanner.vue b/src/components/FloatingBanner.vue
similarity index 100%
rename from components/FloatingBanner.vue
rename to src/components/FloatingBanner.vue
diff --git a/components/HeroCard.vue b/src/components/HeroCard.vue
similarity index 100%
rename from components/HeroCard.vue
rename to src/components/HeroCard.vue
diff --git a/components/ScreenScrollContainer.vue b/src/components/ScreenScrollContainer.vue
similarity index 100%
rename from components/ScreenScrollContainer.vue
rename to src/components/ScreenScrollContainer.vue
diff --git a/components/SecondLevelLink.vue b/src/components/SecondLevelLink.vue
similarity index 89%
rename from components/SecondLevelLink.vue
rename to src/components/SecondLevelLink.vue
index b9f61bf..9deceb9 100644
--- a/components/SecondLevelLink.vue
+++ b/src/components/SecondLevelLink.vue
@@ -5,7 +5,8 @@