@nextcloud/vue
Version:
Nextcloud vue components
1 lines • 4.34 kB
Source Map (JSON)
{"version":3,"file":"NcAppSidebarTab.cjs","sources":["../../src/components/NcAppSidebarTab/NcAppSidebarTab.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<!-- Follows the tab aria guidelines\n\thttps://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-1/tabs.html -->\n\n<template>\n\t<section\n\t\t:id=\"`tab-${id}`\"\n\t\t:class=\"{ 'app-sidebar__tab--active': isActive }\"\n\t\t:aria-hidden=\"!isActive\"\n\t\t:aria-label=\"isTablistShown() ? undefined : name\"\n\t\t:aria-labelledby=\"isTablistShown() ? `tab-button-${id}` : undefined\"\n\t\tclass=\"app-sidebar__tab\"\n\t\t:tabindex=\"isTablistShown() ? 0 : -1\"\n\t\t:role=\"isTablistShown() ? 'tabpanel' : undefined\"\n\t\t@scroll=\"onScroll\">\n\t\t<h3 class=\"hidden-visually\">\n\t\t\t{{ name }}\n\t\t</h3>\n\t\t<!-- @slot Tab panel content -->\n\t\t<slot />\n\t</section>\n</template>\n\n<script>\nexport default {\n\tname: 'NcAppSidebarTab',\n\n\tinject: ['registerTab', 'unregisterTab', 'getActiveTab', 'isTablistShown'],\n\n\tprops: {\n\t\t/**\n\t\t * Unique id of the sidebar tab\n\t\t */\n\t\tid: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * Tab name in navigation\n\t\t */\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * Tab icon's html class in navigation. Used if #icon slot is not provided\n\t\t */\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Tab order in navigation. If not provided, name is used.\n\t\t */\n\t\torder: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t},\n\n\temits: [\n\t\t'bottom-reached',\n\t\t'scroll',\n\t],\n\n\texpose: ['id', 'name', 'icon', 'order', 'renderIcon'],\n\n\tcomputed: {\n\t\t/**\n\t\t * Is the current tab an active tab, that should be shown?\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisActive() {\n\t\t\treturn this.getActiveTab() === this.id\n\t\t},\n\t},\n\n\tcreated() {\n\t\t// As the tab is created - register it in the tabs component\n\t\t// It's better to provide computed tab object, not component instance as it easy\n\t\tthis.registerTab(this)\n\t},\n\n\tbeforeDestroy() {\n\t\t// Unregister the tab from tabs\n\t\tthis.unregisterTab(this.id)\n\t},\n\n\tmethods: {\n\t\tonScroll(event) {\n\t\t\t// Are we scrolled to the very bottom ?\n\t\t\tif (this.$el.scrollHeight - this.$el.scrollTop === this.$el.clientHeight) {\n\t\t\t\t/**\n\t\t\t\t * Bottom scroll is reached\n\t\t\t\t *\n\t\t\t\t * @property {Event} event Native scroll event\n\t\t\t\t */\n\t\t\t\tthis.$emit('bottom-reached', event)\n\t\t\t}\n\t\t\t/**\n\t\t\t * @property {Event} event Native scroll event\n\t\t\t */\n\t\t\tthis.$emit('scroll', event)\n\t\t},\n\n\t\t/**\n\t\t * Render tab's icon slot if any\n\t\t *\n\t\t * @return {import('vue').VNode[]}\n\t\t */\n\t\trenderIcon() {\n\t\t\treturn this.$scopedSlots.icon?.()\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-sidebar__tab {\n\tdisplay: none;\n\tpadding: 10px;\n\tmin-height: 100%; // fill available height\n\tmax-height: 100%; // scroll inside\n\theight: 100%;\n\toverflow: auto;\n\n\t&:focus {\n\t\tborder-color: var(--color-primary-element);\n\t\tbox-shadow: 0 0 0.2em var(--color-primary-element);\n\t\toutline: 0;\n\t}\n\n\t&--active {\n\t\tdisplay: block;\n\t}\n}\n</style>\n"],"names":[],"mappings":";;AA4BA,MAAA,YAAA;AAAA,EACA,MAAA;AAAA,EAEA,QAAA,CAAA,eAAA,iBAAA,gBAAA,gBAAA;AAAA,EAEA,OAAA;AAAA;AAAA;AAAA;AAAA,IAIA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAKA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AAAA,IACA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,QAAA,CAAA,MAAA,QAAA,QAAA,SAAA,YAAA;AAAA,EAEA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,WAAA;AACA,aAAA,KAAA,aAAA,MAAA,KAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,UAAA;AAGA,SAAA,YAAA,IAAA;AAAA,EACA;AAAA,EAEA,gBAAA;AAEA,SAAA,cAAA,KAAA,EAAA;AAAA,EACA;AAAA,EAEA,SAAA;AAAA,IACA,SAAA,OAAA;AAEA,UAAA,KAAA,IAAA,eAAA,KAAA,IAAA,cAAA,KAAA,IAAA,cAAA;AAMA,aAAA,MAAA,kBAAA,KAAA;AAAA,MACA;AAIA,WAAA,MAAA,UAAA,KAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,aAAA;AACA,aAAA,KAAA,aAAA,OAAA;AAAA,IACA;AAAA,EACA;AACA;;;;;;;;;;;;;;;;"}