VExpansionPanelTitle.mjs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { withDirectives as _withDirectives, resolveDirective as _resolveDirective, createVNode as _createVNode } from "vue";
  2. // Components
  3. import { VExpansionPanelSymbol } from "./shared.mjs";
  4. import { VDefaultsProvider } from "../VDefaultsProvider/index.mjs";
  5. import { VIcon } from "../VIcon/index.mjs"; // Composables
  6. import { useBackgroundColor } from "../../composables/color.mjs";
  7. import { makeComponentProps } from "../../composables/component.mjs";
  8. import { makeDimensionProps, useDimension } from "../../composables/dimensions.mjs";
  9. import { IconValue } from "../../composables/icons.mjs"; // Directives
  10. import { Ripple } from "../../directives/ripple/index.mjs"; // Utilities
  11. import { computed, inject } from 'vue';
  12. import { genericComponent, propsFactory, useRender } from "../../util/index.mjs"; // Types
  13. export const makeVExpansionPanelTitleProps = propsFactory({
  14. color: String,
  15. expandIcon: {
  16. type: IconValue,
  17. default: '$expand'
  18. },
  19. collapseIcon: {
  20. type: IconValue,
  21. default: '$collapse'
  22. },
  23. hideActions: Boolean,
  24. focusable: Boolean,
  25. static: Boolean,
  26. ripple: {
  27. type: [Boolean, Object],
  28. default: false
  29. },
  30. readonly: Boolean,
  31. ...makeComponentProps(),
  32. ...makeDimensionProps()
  33. }, 'VExpansionPanelTitle');
  34. export const VExpansionPanelTitle = genericComponent()({
  35. name: 'VExpansionPanelTitle',
  36. directives: {
  37. Ripple
  38. },
  39. props: makeVExpansionPanelTitleProps(),
  40. setup(props, _ref) {
  41. let {
  42. slots
  43. } = _ref;
  44. const expansionPanel = inject(VExpansionPanelSymbol);
  45. if (!expansionPanel) throw new Error('[Vuetify] v-expansion-panel-title needs to be placed inside v-expansion-panel');
  46. const {
  47. backgroundColorClasses,
  48. backgroundColorStyles
  49. } = useBackgroundColor(props, 'color');
  50. const {
  51. dimensionStyles
  52. } = useDimension(props);
  53. const slotProps = computed(() => ({
  54. collapseIcon: props.collapseIcon,
  55. disabled: expansionPanel.disabled.value,
  56. expanded: expansionPanel.isSelected.value,
  57. expandIcon: props.expandIcon,
  58. readonly: props.readonly
  59. }));
  60. const icon = computed(() => expansionPanel.isSelected.value ? props.collapseIcon : props.expandIcon);
  61. useRender(() => _withDirectives(_createVNode("button", {
  62. "class": ['v-expansion-panel-title', {
  63. 'v-expansion-panel-title--active': expansionPanel.isSelected.value,
  64. 'v-expansion-panel-title--focusable': props.focusable,
  65. 'v-expansion-panel-title--static': props.static
  66. }, backgroundColorClasses.value, props.class],
  67. "style": [backgroundColorStyles.value, dimensionStyles.value, props.style],
  68. "type": "button",
  69. "tabindex": expansionPanel.disabled.value ? -1 : undefined,
  70. "disabled": expansionPanel.disabled.value,
  71. "aria-expanded": expansionPanel.isSelected.value,
  72. "onClick": !props.readonly ? expansionPanel.toggle : undefined
  73. }, [_createVNode("span", {
  74. "class": "v-expansion-panel-title__overlay"
  75. }, null), slots.default?.(slotProps.value), !props.hideActions && _createVNode(VDefaultsProvider, {
  76. "defaults": {
  77. VIcon: {
  78. icon: icon.value
  79. }
  80. }
  81. }, {
  82. default: () => [_createVNode("span", {
  83. "class": "v-expansion-panel-title__icon"
  84. }, [slots.actions?.(slotProps.value) ?? _createVNode(VIcon, null, null)])]
  85. })]), [[_resolveDirective("ripple"), props.ripple]]));
  86. return {};
  87. }
  88. });
  89. //# sourceMappingURL=VExpansionPanelTitle.mjs.map