Newer
Older
gnexus-ui-kit / examples / vue / src / main.js
@Eugene Sukhodolskiy Eugene Sukhodolskiy 13 hours ago 5 KB Add Vue form adapter components
import { createApp, ref } from "vue";
import "gnexus-ui-kit/dist/css/kit.css";
import "gnexus-ui-kit/dist/assets/fonts/phosphor-icons/src/css/icons.css";
import {
	GnButton,
	GnActivityLog,
	GnAvatar,
	GnBadge,
	GnChip,
	GnChipGroup,
	GnCombobox,
	GnDescriptionList,
	GnDropdown,
	GnEmptyState,
	GnFileUpload,
	GnInput,
	GnModal,
	GnPopover,
	GnPageHeader,
	GnProgress,
	GnRadioGroup,
	GnRange,
	GnSearchField,
	GnTabs,
	GnTooltip,
	GnToolbar,
	GnToastProvider,
	useToast
} from "gnexus-ui-kit/vue";

const DemoScreen = {
	components: {
		GnButton,
		GnActivityLog,
		GnAvatar,
		GnBadge,
		GnChip,
		GnChipGroup,
		GnCombobox,
		GnDescriptionList,
		GnDropdown,
		GnEmptyState,
		GnFileUpload,
		GnInput,
		GnModal,
		GnPopover,
		GnPageHeader,
		GnProgress,
		GnRadioGroup,
		GnRange,
		GnSearchField,
		GnTabs,
		GnTooltip,
	},
	setup() {
		const activeTab = ref("overview");
		const modalOpen = ref(false);
		const name = ref("Launch Plan");
		const query = ref("");
		const mode = ref("auto");
		const rollout = ref(72);
		const assignee = ref("");
		const files = ref([]);
		const toast = useToast();

		const tabs = [
			{ id: "overview", label: "Overview", icon: "ph-chart-bar" },
			{ id: "activity", label: "Activity", icon: "ph-clock" }
		];
		const details = [
			{ key: "owner", term: "Owner", value: "Ops Console" },
			{ key: "status", term: "Status", value: "Active" },
			{ key: "region", term: "Region", value: "eu-central" }
		];
		const activity = [
			{ key: "created", time: "10:12", title: "Workspace created" },
			{ key: "synced", time: "10:18", title: "Tokens synced" }
		];
		const menuItems = [
			{ label: "Edit", icon: "ph-pencil-simple" },
			{ label: "Duplicate", icon: "ph-copy" },
			{ label: "Delete", icon: "ph-trash", danger: true }
		];
		const modes = [
			{ label: "Auto", value: "auto" },
			{ label: "Manual", value: "manual" },
			{ label: "Locked", value: "locked", disabled: true }
		];
		const people = [
			{ label: "Joe", value: "joe" },
			{ label: "James", value: "james" },
			{ label: "Eliza", value: "eliza" },
			{ label: "Emily", value: "emily" }
		];

		const save = () => {
			toast.success({ title: "Saved", text: `${name.value} updated` });
			modalOpen.value = false;
		};

		return {
			activeTab,
			activity,
			details,
			files,
			mode,
			menuItems,
			modalOpen,
			name,
			assignee,
			people,
			query,
			rollout,
			modes,
			tabs,
			save
		};
	},
	template: `
		<main class="container docs-page">
			<GnPageHeader
				title="Vue Adapter"
				subtitle="Stable Vue components over GNexus UI Kit classes"
				kicker="GNexus UI Kit"
				accent
			>
				<template #actions>
					<GnButton variant="secondary" icon="ph-plus" @click="modalOpen = true">
						Create
					</GnButton>
				</template>
			</GnPageHeader>

			<section class="section">
				<GnToolbar title="Projects" meta="2 records">
					<template #actions>
						<GnSearchField v-model="query" placeholder="Search projects" />
						<GnDropdown :items="menuItems" />
						<GnPopover title="Context" text="Popover keeps short metadata near the action." />
						<GnTooltip text="Short contextual hint">
							<GnButton variant="primary" icon="ph-question">Help</GnButton>
						</GnTooltip>
					</template>
				</GnToolbar>
			</section>

			<section class="section">
				<GnTabs v-model="activeTab" :items="tabs">
					<template #overview>
						<GnDescriptionList :items="details" />
						<div class="mt-4">
							<GnProgress label="Rollout" :value="Number(rollout)" animated />
						</div>
						<div class="mt-4">
							<GnChipGroup>
								<GnChip variant="secondary" selected>Vue</GnChip>
								<GnChip variant="success">Stable</GnChip>
								<GnChip variant="danger">Contract</GnChip>
							</GnChipGroup>
						</div>
					</template>
					<template #activity>
						<GnActivityLog :items="activity">
							<template #actions>
								<GnBadge variant="secondary">log</GnBadge>
							</template>
						</GnActivityLog>
					</template>
				</GnTabs>
			</section>

			<section class="section">
				<div class="form-grid">
					<GnRadioGroup v-model="mode" label="Mode" :options="modes" />
					<GnRange v-model="rollout" label="Rollout" />
					<GnCombobox v-model="assignee" label="Assignee" icon="ph-user" :options="people" />
				</div>
			</section>

			<section class="section">
				<GnFileUpload v-model="files" badge="Max 12 MB" />
			</section>

			<section class="section">
				<GnEmptyState title="No blocking issues" text="Vue adapter components keep project markup consistent.">
					<template #actions>
						<GnAvatar initials="GN" status="online" />
						<GnBadge variant="success">Ready</GnBadge>
					</template>
				</GnEmptyState>
			</section>

			<GnModal v-model:open="modalOpen" title="Edit item">
				<GnInput v-model="name" label="Project name" icon="ph-pencil-simple" />
				<template #actions>
					<GnButton variant="primary" @click="modalOpen = false">Cancel</GnButton>
					<GnButton variant="success" @click="save">Save</GnButton>
				</template>
			</GnModal>
		</main>
	`
};

const App = {
	components: {
		GnToastProvider,
		DemoScreen
	},
	template: `
		<GnToastProvider>
			<DemoScreen />
		</GnToastProvider>
	`
};

createApp(App).mount("#app");