routie dev init since i didn't adhere to any proper guidance up until now
This commit is contained in:
+102
@@ -0,0 +1,102 @@
|
||||
import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createVNode as _createVNode, normalizeStyle as _normalizeStyle } from "vue";
|
||||
// Components
|
||||
import { VExpansionPanelSymbol } from "./shared.js";
|
||||
import { makeVExpansionPanelTextProps, VExpansionPanelText } from "./VExpansionPanelText.js";
|
||||
import { makeVExpansionPanelTitleProps, VExpansionPanelTitle } from "./VExpansionPanelTitle.js";
|
||||
import { VDefaultsProvider } from "../VDefaultsProvider/index.js"; // Composables
|
||||
import { useBackgroundColor } from "../../composables/color.js";
|
||||
import { makeElevationProps, useElevation } from "../../composables/elevation.js";
|
||||
import { makeGroupItemProps, useGroupItem } from "../../composables/group.js";
|
||||
import { makeRoundedProps, useRounded } from "../../composables/rounded.js";
|
||||
import { makeTagProps } from "../../composables/tag.js"; // Utilities
|
||||
import { computed, provide, toRef } from 'vue';
|
||||
import { genericComponent, propsFactory, useRender } from "../../util/index.js";
|
||||
export const makeVExpansionPanelProps = propsFactory({
|
||||
title: String,
|
||||
text: String,
|
||||
bgColor: String,
|
||||
...makeElevationProps(),
|
||||
...makeGroupItemProps(),
|
||||
...makeRoundedProps(),
|
||||
...makeTagProps(),
|
||||
...makeVExpansionPanelTitleProps(),
|
||||
...makeVExpansionPanelTextProps()
|
||||
}, 'VExpansionPanel');
|
||||
export const VExpansionPanel = genericComponent()({
|
||||
name: 'VExpansionPanel',
|
||||
props: makeVExpansionPanelProps(),
|
||||
emits: {
|
||||
'group:selected': val => true
|
||||
},
|
||||
setup(props, {
|
||||
slots
|
||||
}) {
|
||||
const groupItem = useGroupItem(props, VExpansionPanelSymbol);
|
||||
const {
|
||||
backgroundColorClasses,
|
||||
backgroundColorStyles
|
||||
} = useBackgroundColor(() => props.bgColor);
|
||||
const {
|
||||
elevationClasses
|
||||
} = useElevation(props);
|
||||
const {
|
||||
roundedClasses
|
||||
} = useRounded(props);
|
||||
const isDisabled = toRef(() => groupItem?.disabled.value || props.disabled);
|
||||
const selectedIndices = computed(() => groupItem.group.items.value.reduce((arr, item, index) => {
|
||||
if (groupItem.group.selected.value.includes(item.id)) arr.push(index);
|
||||
return arr;
|
||||
}, []));
|
||||
const isBeforeSelected = computed(() => {
|
||||
const index = groupItem.group.items.value.findIndex(item => item.id === groupItem.id);
|
||||
return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === 1);
|
||||
});
|
||||
const isAfterSelected = computed(() => {
|
||||
const index = groupItem.group.items.value.findIndex(item => item.id === groupItem.id);
|
||||
return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === -1);
|
||||
});
|
||||
provide(VExpansionPanelSymbol, groupItem);
|
||||
useRender(() => {
|
||||
const hasText = !!(slots.text || props.text);
|
||||
const hasTitle = !!(slots.title || props.title);
|
||||
const expansionPanelTitleProps = VExpansionPanelTitle.filterProps(props);
|
||||
const expansionPanelTextProps = VExpansionPanelText.filterProps(props);
|
||||
return _createVNode(props.tag, {
|
||||
"class": _normalizeClass(['v-expansion-panel', {
|
||||
'v-expansion-panel--active': groupItem.isSelected.value,
|
||||
'v-expansion-panel--before-active': isBeforeSelected.value,
|
||||
'v-expansion-panel--after-active': isAfterSelected.value,
|
||||
'v-expansion-panel--disabled': isDisabled.value
|
||||
}, roundedClasses.value, backgroundColorClasses.value, props.class]),
|
||||
"style": _normalizeStyle([backgroundColorStyles.value, props.style])
|
||||
}, {
|
||||
default: () => [_createElementVNode("div", {
|
||||
"class": _normalizeClass(['v-expansion-panel__shadow', ...elevationClasses.value])
|
||||
}, null), _createVNode(VDefaultsProvider, {
|
||||
"defaults": {
|
||||
VExpansionPanelTitle: {
|
||||
...expansionPanelTitleProps
|
||||
},
|
||||
VExpansionPanelText: {
|
||||
...expansionPanelTextProps
|
||||
}
|
||||
}
|
||||
}, {
|
||||
default: () => [hasTitle && _createVNode(VExpansionPanelTitle, {
|
||||
"key": "title"
|
||||
}, {
|
||||
default: () => [slots.title ? slots.title() : props.title]
|
||||
}), hasText && _createVNode(VExpansionPanelText, {
|
||||
"key": "text"
|
||||
}, {
|
||||
default: () => [slots.text ? slots.text() : props.text]
|
||||
}), slots.default?.()]
|
||||
})]
|
||||
});
|
||||
});
|
||||
return {
|
||||
groupItem
|
||||
};
|
||||
}
|
||||
});
|
||||
//# sourceMappingURL=VExpansionPanel.js.map
|
||||
Reference in New Issue
Block a user