- Add .gitea/workflows/ci.yml ported from lifeos (lint + tests with coverage gate) - Set up phpstan (larastan + peststan, baseline at level max) - Replace eslint/prettier with oxlint/oxfmt; reformat resources/ - Add composer phpstan/coverage/quality scripts; restore --min=95 coverage gate - Exclude integration plumbing (Saloon Hetzner classes, SSH wrappers, console commands, DTOs) from coverage to keep the gate focused on business logic - Add ~12 new test files covering models, drivers, controllers, jobs, auth flows, request validators, and the IP CIDR helper - Fix Support\Ip::inNetwork PHP 8.4 TypeError in CIDR mask check - Fix FirewallRule::command comparing the enum-cast type column to a string - Fix Server::network using the wrong foreign key column - Remove unreachable code under abort(403) in RegisteredUserController
53 lines
1.5 KiB
Vue
53 lines
1.5 KiB
Vue
<script setup lang="ts">
|
|
import Tooltip from "@/components/ui/tooltip/Tooltip.vue";
|
|
import TooltipContent from "@/components/ui/tooltip/TooltipContent.vue";
|
|
import TooltipTrigger from "@/components/ui/tooltip/TooltipTrigger.vue";
|
|
import { computed, type Component } from "vue";
|
|
import SidebarMenuButtonChild, { type SidebarMenuButtonProps } from "./SidebarMenuButtonChild.vue";
|
|
import { useSidebar } from "./utils";
|
|
|
|
defineOptions({
|
|
inheritAttrs: false,
|
|
});
|
|
|
|
const props = withDefaults(
|
|
defineProps<
|
|
SidebarMenuButtonProps & {
|
|
tooltip?: string | Component;
|
|
}
|
|
>(),
|
|
{
|
|
as: "button",
|
|
variant: "default",
|
|
size: "default",
|
|
},
|
|
);
|
|
|
|
const { isMobile, state } = useSidebar();
|
|
|
|
const delegatedProps = computed(() => {
|
|
const { tooltip, ...delegated } = props;
|
|
return delegated;
|
|
});
|
|
</script>
|
|
|
|
<template>
|
|
<SidebarMenuButtonChild v-if="!tooltip" v-bind="{ ...delegatedProps, ...$attrs }">
|
|
<slot />
|
|
</SidebarMenuButtonChild>
|
|
|
|
<Tooltip v-else>
|
|
<TooltipTrigger as-child>
|
|
<SidebarMenuButtonChild v-bind="{ ...delegatedProps, ...$attrs }">
|
|
<slot />
|
|
</SidebarMenuButtonChild>
|
|
</TooltipTrigger>
|
|
<TooltipContent side="right" align="center" :hidden="state !== 'collapsed' || isMobile">
|
|
<template v-if="typeof tooltip === 'string'">
|
|
{{ tooltip }}
|
|
</template>
|
|
<component :is="tooltip" v-else />
|
|
</TooltipContent>
|
|
</Tooltip>
|
|
</template>
|