@bl33dz/fa814698dcde12f86a37ac31dd3aedf9 1.0.9 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/env.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ declare module "*.vue" {
2
+ import type { DefineComponent } from "vue"
3
+ const component: DefineComponent<{}, {}, any>
4
+ export default component
5
+ }
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.0.9",
6
+ "version": "1.0.11",
7
7
  "main": "dist/perisai-ui.umd.js",
8
8
  "module": "dist/perisai-ui.es.js",
9
9
  "scripts": {
package/src/index.ts CHANGED
@@ -6,8 +6,10 @@ import './globals.css'
6
6
  export * from './shadcn/breadcrumb';
7
7
  export * from './shadcn/accordion';
8
8
  export * from './shadcn/spinner';
9
- export * from './shadcn/tree';
9
+ export * from './shadcn/tooltip';
10
+ export * from './shadcn/command';
10
11
 
12
+ export * from './ui/tree';
11
13
  export { default as InputOTP } from './ui/InputOTP.vue';
12
14
  export { default as InputOTPGroup } from './ui/InputOTPGroup.vue';
13
15
  export { default as InputOTPSeparator } from './ui/InputOTPSeparator.vue';
@@ -171,8 +173,3 @@ export { default as Tabs } from './ui/tabs.vue';
171
173
  export { default as Textarea } from './ui/textarea.vue';
172
174
  export { default as ThreatGauge } from './ui/threat-gauge.vue';
173
175
  export { default as Toggle } from './ui/toggle.vue';
174
- export { default as TooltipContent } from './ui/tooltip-content.vue';
175
- export { default as TooltipProvider } from './ui/tooltip-provider.vue';
176
- export { default as TooltipRoot } from './ui/tooltip-root.vue';
177
- export { default as TooltipTrigger } from './ui/tooltip-trigger.vue';
178
- export { default as Tooltip } from './ui/tooltip.vue';
@@ -4,13 +4,95 @@ import type { HTMLAttributes } from "vue"
4
4
  import { reactiveOmit } from "@vueuse/core"
5
5
  import { TooltipArrow, TooltipContent, TooltipPortal, useForwardPropsEmits } from "reka-ui"
6
6
  import { cn } from "@/lib/utils"
7
+ import { cva } from "class-variance-authority"
8
+
9
+ const tooltipVariants = cva(
10
+ "animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
11
+ {
12
+ variants: {
13
+ variant: {
14
+ default: "bg-primary text-primary-foreground",
15
+ secondary: "bg-secondary text-secondary-foreground",
16
+ outline:
17
+ "bg-popover text-popover-foreground border border-border shadow-md",
18
+ // Soft semantic variants using design system colors
19
+ "soft-success":
20
+ "bg-green-50 text-green-700 border border-green-200 dark:bg-green-950 dark:text-green-300 dark:border-green-800",
21
+ "soft-warning":
22
+ "bg-yellow-50 text-yellow-700 border border-yellow-200 dark:bg-yellow-950 dark:text-yellow-300 dark:border-yellow-800",
23
+ "soft-danger":
24
+ "bg-red-50 text-red-700 border border-red-200 dark:bg-red-950 dark:text-red-300 dark:border-red-800",
25
+ "soft-info":
26
+ "bg-blue-50 text-blue-700 border border-blue-200 dark:bg-blue-950 dark:text-blue-300 dark:border-blue-800",
27
+ // Additional soft variants
28
+ "soft-primary":
29
+ "bg-cyan-50 text-cyan-700 border border-cyan-200 dark:bg-cyan-950 dark:text-cyan-300 dark:border-cyan-800",
30
+ "soft-purple":
31
+ "bg-purple-50 text-purple-700 border border-purple-200 dark:bg-purple-950 dark:text-purple-300 dark:border-purple-800",
32
+ "soft-pink":
33
+ "bg-pink-50 text-pink-700 border border-pink-200 dark:bg-pink-950 dark:text-pink-300 dark:border-pink-800",
34
+ "soft-indigo":
35
+ "bg-indigo-50 text-indigo-700 border border-indigo-200 dark:bg-indigo-950 dark:text-indigo-300 dark:border-indigo-800",
36
+ "soft-orange":
37
+ "bg-orange-50 text-orange-700 border border-orange-200 dark:bg-orange-950 dark:text-orange-300 dark:border-orange-800",
38
+ "soft-teal":
39
+ "bg-teal-50 text-teal-700 border border-teal-200 dark:bg-teal-950 dark:text-teal-300 dark:border-teal-800",
40
+ "soft-neutral":
41
+ "bg-stone-50 text-stone-700 border border-stone-200 dark:bg-stone-900 dark:text-stone-300 dark:border-stone-700",
42
+ },
43
+ },
44
+ defaultVariants: {
45
+ variant: "default",
46
+ },
47
+ },
48
+ );
49
+
50
+ const tooltipArrowVariants = cva(
51
+ "z-50 size-2.5 translate-y-[calc(-50%_-_1px)] rotate-45 rounded-[2px]",
52
+ {
53
+ variants: {
54
+ variant: {
55
+ default: "bg-primary fill-primary",
56
+ secondary: "bg-secondary fill-secondary",
57
+ outline: "bg-popover fill-popover border border-border",
58
+ // Soft semantic variants - arrows match background with borders
59
+ "soft-success":
60
+ "bg-green-50 fill-green-50 border border-green-200 dark:bg-green-950 dark:fill-green-950 dark:border-green-800",
61
+ "soft-warning":
62
+ "bg-yellow-50 fill-yellow-50 border border-yellow-200 dark:bg-yellow-950 dark:fill-yellow-950 dark:border-yellow-800",
63
+ "soft-danger":
64
+ "bg-red-50 fill-red-50 border border-red-200 dark:bg-red-950 dark:fill-red-950 dark:border-red-800",
65
+ "soft-info":
66
+ "bg-blue-50 fill-blue-50 border border-blue-200 dark:bg-blue-950 dark:fill-blue-950 dark:border-blue-800",
67
+ "soft-primary":
68
+ "bg-cyan-50 fill-cyan-50 border border-cyan-200 dark:bg-cyan-950 dark:fill-cyan-950 dark:border-cyan-800",
69
+ "soft-purple":
70
+ "bg-purple-50 fill-purple-50 border border-purple-200 dark:bg-purple-950 dark:fill-purple-950 dark:border-purple-800",
71
+ "soft-pink":
72
+ "bg-pink-50 fill-pink-50 border border-pink-200 dark:bg-pink-950 dark:fill-pink-950 dark:border-pink-800",
73
+ "soft-indigo":
74
+ "bg-indigo-50 fill-indigo-50 border border-indigo-200 dark:bg-indigo-950 dark:fill-indigo-950 dark:border-indigo-800",
75
+ "soft-orange":
76
+ "bg-orange-50 fill-orange-50 border border-orange-200 dark:bg-orange-950 dark:fill-orange-950 dark:border-orange-800",
77
+ "soft-teal":
78
+ "bg-teal-50 fill-teal-50 border border-teal-200 dark:bg-teal-950 dark:fill-teal-950 dark:border-teal-800",
79
+ "soft-neutral":
80
+ "bg-stone-50 fill-stone-50 border border-stone-200 dark:bg-stone-900 dark:fill-stone-900 dark:border-stone-700",
81
+ },
82
+ },
83
+ defaultVariants: {
84
+ variant: "default",
85
+ },
86
+ },
87
+ );
7
88
 
8
89
  defineOptions({
9
90
  inheritAttrs: false,
10
91
  })
11
92
 
12
- const props = withDefaults(defineProps<TooltipContentProps & { class?: HTMLAttributes["class"] }>(), {
93
+ const props = withDefaults(defineProps<TooltipContentProps & { class?: HTMLAttributes["class"], variant?: "default" | "secondary" | "outline" | "soft-success" | "soft-warning" | "soft-danger" | "soft-info" | "soft-primary" | "soft-purple" | "soft-pink" | "soft-indigo" | "soft-orange" | "soft-teal" | "soft-neutral" }>(), {
13
94
  sideOffset: 4,
95
+ variant: "default"
14
96
  })
15
97
 
16
98
  const emits = defineEmits<TooltipContentEmits>()
@@ -24,11 +106,21 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits)
24
106
  <TooltipContent
25
107
  data-slot="tooltip-content"
26
108
  v-bind="{ ...forwarded, ...$attrs }"
27
- :class="cn('bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance', props.class)"
109
+ :class="cn(
110
+ 'bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance',
111
+ tooltipVariants({ variant: props.variant }),
112
+ props.class,
113
+ 'p-3'
114
+ )"
28
115
  >
29
116
  <slot />
30
117
 
31
- <TooltipArrow class="bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" />
118
+ <TooltipArrow
119
+ :class="cn(
120
+ 'bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]',
121
+ tooltipArrowVariants({ variant: props.variant })
122
+ )"
123
+ />
32
124
  </TooltipContent>
33
125
  </TooltipPortal>
34
126
  </template>
@@ -0,0 +1 @@
1
+ export { default as Tree } from './tree.vue';
@@ -0,0 +1,57 @@
1
+ <script setup lang="ts">
2
+ import { computed } from "vue"
3
+
4
+ const props = defineProps<{
5
+ node: any
6
+ level: number
7
+ expandedIds: Array<string | number>
8
+ }>()
9
+
10
+ const emit = defineEmits<{
11
+ (e: "toggle", id: string | number): void
12
+ (e: "nodeClick", node: any): void
13
+ }>()
14
+
15
+ const isExpanded = computed(() => props.expandedIds.includes(props.node.id))
16
+
17
+ const handleClick = () => {
18
+ emit("toggle", props.node.id)
19
+ emit("nodeClick", props.node)
20
+ }
21
+ </script>
22
+
23
+ <template>
24
+ <li>
25
+ <button
26
+ type="button"
27
+ class="flex w-full items-center gap-1 px-2 py-1 text-xs text-slate-200 hover:bg-slate-800/80 rounded-md transition-colors"
28
+ :style="{ paddingLeft: `${8 + level * 12}px` }"
29
+ @click="handleClick"
30
+ >
31
+ <span
32
+ v-if="node.children?.length"
33
+ class="inline-flex w-3 justify-center text-muted-foreground transition-transform duration-200"
34
+ :class="isExpanded ? 'rotate-90' : 'rotate-0'"
35
+ >
36
+
37
+ </span>
38
+
39
+ <span class="truncate">{{ node.title }}</span>
40
+ </button>
41
+
42
+ <ul
43
+ v-if="isExpanded && node.children?.length"
44
+ class="ml-4 mt-0.5 space-y-0.5 pl-2"
45
+ >
46
+ <TreeNode
47
+ v-for="child in node.children"
48
+ :key="child.id"
49
+ :node="child"
50
+ :level="level + 1"
51
+ :expanded-ids="expandedIds"
52
+ @toggle="emit('toggle', $event)"
53
+ @nodeClick="emit('nodeClick', $event)"
54
+ />
55
+ </ul>
56
+ </li>
57
+ </template>
@@ -0,0 +1,43 @@
1
+ <script setup lang="ts">
2
+ import { ref } from "vue"
3
+ import TreeNode from "./tree-node.vue"
4
+
5
+ export interface TreeItem {
6
+ id: string | number
7
+ title: string
8
+ icon?: any
9
+ children?: TreeItem[]
10
+ }
11
+
12
+ const props = defineProps<{
13
+ items: TreeItem[]
14
+ }>()
15
+
16
+ const emit = defineEmits<{
17
+ (e: "nodeClick", node: TreeItem): void
18
+ }>()
19
+
20
+ const expandedIds = ref<Array<string | number>>([])
21
+
22
+ const toggleNode = (id: string | number) => {
23
+ const list = expandedIds.value.slice()
24
+ const idx = list.indexOf(id)
25
+ if (idx >= 0) list.splice(idx, 1)
26
+ else list.push(id)
27
+ expandedIds.value = list
28
+ }
29
+ </script>
30
+
31
+ <template>
32
+ <ul class="space-y-0.5">
33
+ <TreeNode
34
+ v-for="node in items"
35
+ :key="node.id"
36
+ :node="node"
37
+ :level="0"
38
+ :expanded-ids="expandedIds"
39
+ @toggle="toggleNode"
40
+ @nodeClick="emit('nodeClick', $event)"
41
+ />
42
+ </ul>
43
+ </template>