zhuguifei
2025-06-17 c1cc49dd93d38f51790558541d6835d1598ecccf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<script setup lang="ts">
import { useId } from "@/composables/useId";
 
defineOptions({
  name: "DotPattern"
});
 
interface DotPatternProps {
  width?: number;
  height?: number;
  x?: number;
  y?: number;
  cx?: number;
  cy?: number;
  cr?: number;
  userSpaceOnUse?: string;
}
const props = withDefaults(defineProps<DotPatternProps>(), {
  width: 16,
  height: 16,
  x: 0,
  y: 0,
  cx: 1,
  cy: 1,
  cr: 1,
  userSpaceOnUse: "userSpaceOnUse"
});
const id = `pattern-${useId()}`;
</script>
 
<template>
  <svg
    aria-hidden="true"
    class="pointer-events-none absolute inset-0 h-full w-full fill-neutral-400/80"
    v-bind="$attrs"
  >
    <defs>
      <pattern
        :id="id"
        :width="props.width"
        :height="props.height"
        :patternUnits="props.userSpaceOnUse"
        :patternContentUnits="props.userSpaceOnUse"
        :x="props.x"
        :y="props.y"
      >
        <circle
          id="pattern-circle"
          :cx="props.cx"
          :cy="props.cy"
          :r="props.cr"
        />
      </pattern>
    </defs>
    <rect width="100%" height="100%" strokeWidth="0" :fill="`url(#${id})`" />
  </svg>
</template>