@owlmeans/web-auth-token 0.1.18-rc.1

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.
Files changed (121) hide show
  1. package/README.md +82 -0
  2. package/agent-meta/manifest.json +16 -0
  3. package/agent-meta/skills/web-auth-token/SKILL.md +128 -0
  4. package/build/@/components/ui/alert.d.ts +10 -0
  5. package/build/@/components/ui/alert.d.ts.map +1 -0
  6. package/build/@/components/ui/alert.js +26 -0
  7. package/build/@/components/ui/alert.js.map +1 -0
  8. package/build/@/components/ui/badge.d.ts +10 -0
  9. package/build/@/components/ui/badge.d.ts.map +1 -0
  10. package/build/@/components/ui/badge.js +23 -0
  11. package/build/@/components/ui/badge.js.map +1 -0
  12. package/build/@/components/ui/button.d.ts +11 -0
  13. package/build/@/components/ui/button.d.ts.map +1 -0
  14. package/build/@/components/ui/button.js +32 -0
  15. package/build/@/components/ui/button.js.map +1 -0
  16. package/build/@/components/ui/card.d.ts +10 -0
  17. package/build/@/components/ui/card.d.ts.map +1 -0
  18. package/build/@/components/ui/card.js +25 -0
  19. package/build/@/components/ui/card.js.map +1 -0
  20. package/build/@/components/ui/dialog.d.ts +17 -0
  21. package/build/@/components/ui/dialog.d.ts.map +1 -0
  22. package/build/@/components/ui/dialog.js +36 -0
  23. package/build/@/components/ui/dialog.js.map +1 -0
  24. package/build/@/components/ui/input.d.ts +4 -0
  25. package/build/@/components/ui/input.d.ts.map +1 -0
  26. package/build/@/components/ui/input.js +7 -0
  27. package/build/@/components/ui/input.js.map +1 -0
  28. package/build/@/components/ui/label.d.ts +5 -0
  29. package/build/@/components/ui/label.d.ts.map +1 -0
  30. package/build/@/components/ui/label.js +8 -0
  31. package/build/@/components/ui/label.js.map +1 -0
  32. package/build/@/components/ui/select.d.ts +16 -0
  33. package/build/@/components/ui/select.d.ts.map +1 -0
  34. package/build/@/components/ui/select.js +38 -0
  35. package/build/@/components/ui/select.js.map +1 -0
  36. package/build/@/components/ui/table.d.ts +11 -0
  37. package/build/@/components/ui/table.d.ts.map +1 -0
  38. package/build/@/components/ui/table.js +28 -0
  39. package/build/@/components/ui/table.js.map +1 -0
  40. package/build/@/lib/utils.d.ts +3 -0
  41. package/build/@/lib/utils.d.ts.map +1 -0
  42. package/build/@/lib/utils.js +6 -0
  43. package/build/@/lib/utils.js.map +1 -0
  44. package/build/components/connected.d.ts +16 -0
  45. package/build/components/connected.d.ts.map +1 -0
  46. package/build/components/connected.js +14 -0
  47. package/build/components/connected.js.map +1 -0
  48. package/build/components/index.d.ts +3 -0
  49. package/build/components/index.d.ts.map +1 -0
  50. package/build/components/index.js +3 -0
  51. package/build/components/index.js.map +1 -0
  52. package/build/components/panel.d.ts +11 -0
  53. package/build/components/panel.d.ts.map +1 -0
  54. package/build/components/panel.js +119 -0
  55. package/build/components/panel.js.map +1 -0
  56. package/build/consts.d.ts +19 -0
  57. package/build/consts.d.ts.map +1 -0
  58. package/build/consts.js +19 -0
  59. package/build/consts.js.map +1 -0
  60. package/build/helpers.d.ts +18 -0
  61. package/build/helpers.d.ts.map +1 -0
  62. package/build/helpers.js +45 -0
  63. package/build/helpers.js.map +1 -0
  64. package/build/hooks/use-access-tokens.d.ts +11 -0
  65. package/build/hooks/use-access-tokens.d.ts.map +1 -0
  66. package/build/hooks/use-access-tokens.js +74 -0
  67. package/build/hooks/use-access-tokens.js.map +1 -0
  68. package/build/i18n/be.json +51 -0
  69. package/build/i18n/de.json +51 -0
  70. package/build/i18n/en.json +51 -0
  71. package/build/i18n/es.json +51 -0
  72. package/build/i18n/pl.json +51 -0
  73. package/build/i18n/ru.json +51 -0
  74. package/build/i18n/uk.json +51 -0
  75. package/build/i18n.d.ts +2 -0
  76. package/build/i18n.d.ts.map +1 -0
  77. package/build/i18n.js +17 -0
  78. package/build/i18n.js.map +1 -0
  79. package/build/index.d.ts +8 -0
  80. package/build/index.d.ts.map +1 -0
  81. package/build/index.js +7 -0
  82. package/build/index.js.map +1 -0
  83. package/build/types.d.ts +54 -0
  84. package/build/types.d.ts.map +1 -0
  85. package/build/types.js +2 -0
  86. package/build/types.js.map +1 -0
  87. package/build/utils.d.ts +13 -0
  88. package/build/utils.d.ts.map +1 -0
  89. package/build/utils.js +14 -0
  90. package/build/utils.js.map +1 -0
  91. package/components.json +21 -0
  92. package/package.json +68 -0
  93. package/src/@/components/ui/alert.tsx +70 -0
  94. package/src/@/components/ui/badge.tsx +47 -0
  95. package/src/@/components/ui/button.tsx +60 -0
  96. package/src/@/components/ui/card.tsx +93 -0
  97. package/src/@/components/ui/dialog.tsx +147 -0
  98. package/src/@/components/ui/input.tsx +22 -0
  99. package/src/@/components/ui/label.tsx +23 -0
  100. package/src/@/components/ui/select.tsx +184 -0
  101. package/src/@/components/ui/table.tsx +115 -0
  102. package/src/@/globals.css +57 -0
  103. package/src/@/lib/utils.ts +6 -0
  104. package/src/components/connected.tsx +34 -0
  105. package/src/components/index.ts +2 -0
  106. package/src/components/panel.tsx +310 -0
  107. package/src/consts.ts +21 -0
  108. package/src/helpers.ts +50 -0
  109. package/src/hooks/use-access-tokens.ts +83 -0
  110. package/src/i18n/be.json +51 -0
  111. package/src/i18n/de.json +51 -0
  112. package/src/i18n/en.json +51 -0
  113. package/src/i18n/es.json +51 -0
  114. package/src/i18n/pl.json +51 -0
  115. package/src/i18n/ru.json +51 -0
  116. package/src/i18n/uk.json +51 -0
  117. package/src/i18n.ts +18 -0
  118. package/src/index.ts +7 -0
  119. package/src/types.ts +59 -0
  120. package/src/utils.ts +14 -0
  121. package/tsconfig.json +14 -0
@@ -0,0 +1,47 @@
1
+ // shadcn badge — sourced from shadcn (new-york) 2026-09-06
2
+ import * as React from 'react'
3
+ import { Slot } from '@radix-ui/react-slot'
4
+ import { cva, type VariantProps } from 'class-variance-authority'
5
+
6
+ import { cn } from '@/lib/utils'
7
+
8
+ const badgeVariants = cva(
9
+ "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
10
+ {
11
+ variants: {
12
+ variant: {
13
+ default:
14
+ "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
15
+ secondary:
16
+ "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
17
+ destructive:
18
+ "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
19
+ outline:
20
+ "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
21
+ },
22
+ },
23
+ defaultVariants: {
24
+ variant: "default",
25
+ },
26
+ }
27
+ )
28
+
29
+ function Badge({
30
+ className,
31
+ variant,
32
+ asChild = false,
33
+ ...props
34
+ }: React.ComponentProps<"span"> &
35
+ VariantProps<typeof badgeVariants> & { asChild?: boolean }) {
36
+ const Comp = asChild ? Slot : "span"
37
+
38
+ return (
39
+ <Comp
40
+ data-slot="badge"
41
+ className={cn(badgeVariants({ variant }), className)}
42
+ {...props}
43
+ />
44
+ )
45
+ }
46
+
47
+ export { Badge, badgeVariants }
@@ -0,0 +1,60 @@
1
+ // shadcn button — sourced from shadcn (new-york) 2026-05-23
2
+ import * as React from 'react'
3
+ import { Slot } from '@radix-ui/react-slot'
4
+ import { cva, type VariantProps } from 'class-variance-authority'
5
+
6
+ import { cn } from '@/lib/utils'
7
+
8
+ const buttonVariants = cva(
9
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive cursor-pointer",
10
+ {
11
+ variants: {
12
+ variant: {
13
+ default:
14
+ "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
15
+ destructive:
16
+ "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
17
+ outline:
18
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
19
+ secondary:
20
+ "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
21
+ ghost:
22
+ "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
23
+ link: "text-primary underline-offset-4 hover:underline",
24
+ },
25
+ size: {
26
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
27
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
28
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
29
+ icon: "size-9",
30
+ },
31
+ },
32
+ defaultVariants: {
33
+ variant: "default",
34
+ size: "default",
35
+ },
36
+ }
37
+ )
38
+
39
+ function Button({
40
+ className,
41
+ variant,
42
+ size,
43
+ asChild = false,
44
+ ...props
45
+ }: React.ComponentProps<"button"> &
46
+ VariantProps<typeof buttonVariants> & {
47
+ asChild?: boolean
48
+ }) {
49
+ const Comp = asChild ? Slot : "button"
50
+
51
+ return (
52
+ <Comp
53
+ data-slot="button"
54
+ className={cn(buttonVariants({ variant, size, className }))}
55
+ {...props}
56
+ />
57
+ )
58
+ }
59
+
60
+ export { Button, buttonVariants }
@@ -0,0 +1,93 @@
1
+ // shadcn card — sourced from shadcn (new-york) 2026-05-23
2
+ import * as React from 'react'
3
+
4
+ import { cn } from '@/lib/utils'
5
+
6
+ function Card({ className, ...props }: React.ComponentProps<"div">) {
7
+ return (
8
+ <div
9
+ data-slot="card"
10
+ className={cn(
11
+ "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
12
+ className
13
+ )}
14
+ {...props}
15
+ />
16
+ )
17
+ }
18
+
19
+ function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
20
+ return (
21
+ <div
22
+ data-slot="card-header"
23
+ className={cn(
24
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
25
+ className
26
+ )}
27
+ {...props}
28
+ />
29
+ )
30
+ }
31
+
32
+ function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
33
+ return (
34
+ <div
35
+ data-slot="card-title"
36
+ className={cn("leading-none font-semibold", className)}
37
+ {...props}
38
+ />
39
+ )
40
+ }
41
+
42
+ function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
43
+ return (
44
+ <div
45
+ data-slot="card-description"
46
+ className={cn("text-muted-foreground text-sm", className)}
47
+ {...props}
48
+ />
49
+ )
50
+ }
51
+
52
+ function CardAction({ className, ...props }: React.ComponentProps<"div">) {
53
+ return (
54
+ <div
55
+ data-slot="card-action"
56
+ className={cn(
57
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
58
+ className
59
+ )}
60
+ {...props}
61
+ />
62
+ )
63
+ }
64
+
65
+ function CardContent({ className, ...props }: React.ComponentProps<"div">) {
66
+ return (
67
+ <div
68
+ data-slot="card-content"
69
+ className={cn("px-6", className)}
70
+ {...props}
71
+ />
72
+ )
73
+ }
74
+
75
+ function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
76
+ return (
77
+ <div
78
+ data-slot="card-footer"
79
+ className={cn("flex items-center px-6 [.border-t]:pt-6", className)}
80
+ {...props}
81
+ />
82
+ )
83
+ }
84
+
85
+ export {
86
+ Card,
87
+ CardHeader,
88
+ CardFooter,
89
+ CardTitle,
90
+ CardAction,
91
+ CardDescription,
92
+ CardContent,
93
+ }
@@ -0,0 +1,147 @@
1
+ // shadcn dialog — sourced from shadcn (new-york) 2026-09-06
2
+ // The close button's screen-reader label arrives as `closeLabel` rather than through an i18n hook:
3
+ // a vendored primitive belongs to whatever application resolves `@`, and must not bind to one
4
+ // app's translation namespace.
5
+ import * as React from 'react'
6
+ import * as DialogPrimitive from '@radix-ui/react-dialog'
7
+ import { XIcon } from 'lucide-react'
8
+
9
+ import { cn } from '@/lib/utils'
10
+
11
+ function Dialog({
12
+ ...props
13
+ }: React.ComponentProps<typeof DialogPrimitive.Root>) {
14
+ return <DialogPrimitive.Root data-slot="dialog" {...props} />
15
+ }
16
+
17
+ function DialogTrigger({
18
+ ...props
19
+ }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {
20
+ return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
21
+ }
22
+
23
+ function DialogPortal({
24
+ ...props
25
+ }: React.ComponentProps<typeof DialogPrimitive.Portal>) {
26
+ return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
27
+ }
28
+
29
+ function DialogClose({
30
+ ...props
31
+ }: React.ComponentProps<typeof DialogPrimitive.Close>) {
32
+ return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
33
+ }
34
+
35
+ function DialogOverlay({
36
+ className,
37
+ ...props
38
+ }: React.ComponentProps<typeof DialogPrimitive.Overlay>) {
39
+ return (
40
+ <DialogPrimitive.Overlay
41
+ data-slot="dialog-overlay"
42
+ className={cn(
43
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
44
+ className
45
+ )}
46
+ {...props}
47
+ />
48
+ )
49
+ }
50
+
51
+ function DialogContent({
52
+ className,
53
+ children,
54
+ showCloseButton = true,
55
+ closeLabel = 'Close',
56
+ ...props
57
+ }: React.ComponentProps<typeof DialogPrimitive.Content> & {
58
+ showCloseButton?: boolean
59
+ closeLabel?: string
60
+ }) {
61
+ return (
62
+ <DialogPortal data-slot="dialog-portal">
63
+ <DialogOverlay />
64
+ <DialogPrimitive.Content
65
+ data-slot="dialog-content"
66
+ className={cn(
67
+ "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",
68
+ className
69
+ )}
70
+ {...props}
71
+ >
72
+ {children}
73
+ {showCloseButton && (
74
+ <DialogPrimitive.Close
75
+ data-slot="dialog-close"
76
+ className="ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
77
+ >
78
+ <XIcon />
79
+ <span className="sr-only">{closeLabel}</span>
80
+ </DialogPrimitive.Close>
81
+ )}
82
+ </DialogPrimitive.Content>
83
+ </DialogPortal>
84
+ )
85
+ }
86
+
87
+ function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
88
+ return (
89
+ <div
90
+ data-slot="dialog-header"
91
+ className={cn("flex flex-col gap-2 text-center sm:text-left", className)}
92
+ {...props}
93
+ />
94
+ )
95
+ }
96
+
97
+ function DialogFooter({ className, ...props }: React.ComponentProps<"div">) {
98
+ return (
99
+ <div
100
+ data-slot="dialog-footer"
101
+ className={cn(
102
+ "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
103
+ className
104
+ )}
105
+ {...props}
106
+ />
107
+ )
108
+ }
109
+
110
+ function DialogTitle({
111
+ className,
112
+ ...props
113
+ }: React.ComponentProps<typeof DialogPrimitive.Title>) {
114
+ return (
115
+ <DialogPrimitive.Title
116
+ data-slot="dialog-title"
117
+ className={cn("text-lg leading-none font-semibold", className)}
118
+ {...props}
119
+ />
120
+ )
121
+ }
122
+
123
+ function DialogDescription({
124
+ className,
125
+ ...props
126
+ }: React.ComponentProps<typeof DialogPrimitive.Description>) {
127
+ return (
128
+ <DialogPrimitive.Description
129
+ data-slot="dialog-description"
130
+ className={cn("text-muted-foreground text-sm", className)}
131
+ {...props}
132
+ />
133
+ )
134
+ }
135
+
136
+ export {
137
+ Dialog,
138
+ DialogClose,
139
+ DialogContent,
140
+ DialogDescription,
141
+ DialogFooter,
142
+ DialogHeader,
143
+ DialogOverlay,
144
+ DialogPortal,
145
+ DialogTitle,
146
+ DialogTrigger,
147
+ }
@@ -0,0 +1,22 @@
1
+ // shadcn input — sourced from shadcn (new-york) 2026-05-23
2
+ import * as React from 'react'
3
+
4
+ import { cn } from '@/lib/utils'
5
+
6
+ function Input({ className, type, ...props }: React.ComponentProps<"input">) {
7
+ return (
8
+ <input
9
+ type={type}
10
+ data-slot="input"
11
+ className={cn(
12
+ "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
13
+ "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
14
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
15
+ className
16
+ )}
17
+ {...props}
18
+ />
19
+ )
20
+ }
21
+
22
+ export { Input }
@@ -0,0 +1,23 @@
1
+ // shadcn label — sourced from shadcn (new-york) 2026-05-23
2
+ import * as React from 'react'
3
+ import * as LabelPrimitive from '@radix-ui/react-label'
4
+
5
+ import { cn } from '@/lib/utils'
6
+
7
+ function Label({
8
+ className,
9
+ ...props
10
+ }: React.ComponentProps<typeof LabelPrimitive.Root>) {
11
+ return (
12
+ <LabelPrimitive.Root
13
+ data-slot="label"
14
+ className={cn(
15
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
16
+ className
17
+ )}
18
+ {...props}
19
+ />
20
+ )
21
+ }
22
+
23
+ export { Label }
@@ -0,0 +1,184 @@
1
+ // shadcn select — sourced from shadcn (new-york) 2026-09-06
2
+ import * as React from 'react'
3
+ import * as SelectPrimitive from '@radix-ui/react-select'
4
+ import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'
5
+
6
+ import { cn } from '@/lib/utils'
7
+
8
+ function Select({
9
+ ...props
10
+ }: React.ComponentProps<typeof SelectPrimitive.Root>) {
11
+ return <SelectPrimitive.Root data-slot="select" {...props} />
12
+ }
13
+
14
+ function SelectGroup({
15
+ ...props
16
+ }: React.ComponentProps<typeof SelectPrimitive.Group>) {
17
+ return <SelectPrimitive.Group data-slot="select-group" {...props} />
18
+ }
19
+
20
+ function SelectValue({
21
+ ...props
22
+ }: React.ComponentProps<typeof SelectPrimitive.Value>) {
23
+ return <SelectPrimitive.Value data-slot="select-value" {...props} />
24
+ }
25
+
26
+ function SelectTrigger({
27
+ className,
28
+ size = "default",
29
+ children,
30
+ ...props
31
+ }: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
32
+ size?: "sm" | "default"
33
+ }) {
34
+ return (
35
+ <SelectPrimitive.Trigger
36
+ data-slot="select-trigger"
37
+ data-size={size}
38
+ className={cn(
39
+ "border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
40
+ className
41
+ )}
42
+ {...props}
43
+ >
44
+ {children}
45
+ <SelectPrimitive.Icon asChild>
46
+ <ChevronDownIcon className="size-4 opacity-50" />
47
+ </SelectPrimitive.Icon>
48
+ </SelectPrimitive.Trigger>
49
+ )
50
+ }
51
+
52
+ function SelectContent({
53
+ className,
54
+ children,
55
+ position = "popper",
56
+ ...props
57
+ }: React.ComponentProps<typeof SelectPrimitive.Content>) {
58
+ return (
59
+ <SelectPrimitive.Portal>
60
+ <SelectPrimitive.Content
61
+ data-slot="select-content"
62
+ className={cn(
63
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",
64
+ position === "popper" &&
65
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
66
+ className
67
+ )}
68
+ position={position}
69
+ {...props}
70
+ >
71
+ <SelectScrollUpButton />
72
+ <SelectPrimitive.Viewport
73
+ className={cn(
74
+ "p-1",
75
+ position === "popper" &&
76
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"
77
+ )}
78
+ >
79
+ {children}
80
+ </SelectPrimitive.Viewport>
81
+ <SelectScrollDownButton />
82
+ </SelectPrimitive.Content>
83
+ </SelectPrimitive.Portal>
84
+ )
85
+ }
86
+
87
+ function SelectLabel({
88
+ className,
89
+ ...props
90
+ }: React.ComponentProps<typeof SelectPrimitive.Label>) {
91
+ return (
92
+ <SelectPrimitive.Label
93
+ data-slot="select-label"
94
+ className={cn("text-muted-foreground px-2 py-1.5 text-xs", className)}
95
+ {...props}
96
+ />
97
+ )
98
+ }
99
+
100
+ function SelectItem({
101
+ className,
102
+ children,
103
+ ...props
104
+ }: React.ComponentProps<typeof SelectPrimitive.Item>) {
105
+ return (
106
+ <SelectPrimitive.Item
107
+ data-slot="select-item"
108
+ className={cn(
109
+ "focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
110
+ className
111
+ )}
112
+ {...props}
113
+ >
114
+ <span className="absolute right-2 flex size-3.5 items-center justify-center">
115
+ <SelectPrimitive.ItemIndicator>
116
+ <CheckIcon className="size-4" />
117
+ </SelectPrimitive.ItemIndicator>
118
+ </span>
119
+ <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
120
+ </SelectPrimitive.Item>
121
+ )
122
+ }
123
+
124
+ function SelectSeparator({
125
+ className,
126
+ ...props
127
+ }: React.ComponentProps<typeof SelectPrimitive.Separator>) {
128
+ return (
129
+ <SelectPrimitive.Separator
130
+ data-slot="select-separator"
131
+ className={cn("bg-border pointer-events-none -mx-1 my-1 h-px", className)}
132
+ {...props}
133
+ />
134
+ )
135
+ }
136
+
137
+ function SelectScrollUpButton({
138
+ className,
139
+ ...props
140
+ }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {
141
+ return (
142
+ <SelectPrimitive.ScrollUpButton
143
+ data-slot="select-scroll-up-button"
144
+ className={cn(
145
+ "flex cursor-default items-center justify-center py-1",
146
+ className
147
+ )}
148
+ {...props}
149
+ >
150
+ <ChevronUpIcon className="size-4" />
151
+ </SelectPrimitive.ScrollUpButton>
152
+ )
153
+ }
154
+
155
+ function SelectScrollDownButton({
156
+ className,
157
+ ...props
158
+ }: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {
159
+ return (
160
+ <SelectPrimitive.ScrollDownButton
161
+ data-slot="select-scroll-down-button"
162
+ className={cn(
163
+ "flex cursor-default items-center justify-center py-1",
164
+ className
165
+ )}
166
+ {...props}
167
+ >
168
+ <ChevronDownIcon className="size-4" />
169
+ </SelectPrimitive.ScrollDownButton>
170
+ )
171
+ }
172
+
173
+ export {
174
+ Select,
175
+ SelectContent,
176
+ SelectGroup,
177
+ SelectItem,
178
+ SelectLabel,
179
+ SelectScrollDownButton,
180
+ SelectScrollUpButton,
181
+ SelectSeparator,
182
+ SelectTrigger,
183
+ SelectValue,
184
+ }
@@ -0,0 +1,115 @@
1
+ // shadcn table — sourced from shadcn (new-york) 2026-09-06
2
+ import * as React from 'react'
3
+
4
+ import { cn } from '@/lib/utils'
5
+
6
+ function Table({ className, ...props }: React.ComponentProps<"table">) {
7
+ return (
8
+ <div
9
+ data-slot="table-container"
10
+ className="relative w-full overflow-x-auto"
11
+ >
12
+ <table
13
+ data-slot="table"
14
+ className={cn("w-full caption-bottom text-sm", className)}
15
+ {...props}
16
+ />
17
+ </div>
18
+ )
19
+ }
20
+
21
+ function TableHeader({ className, ...props }: React.ComponentProps<"thead">) {
22
+ return (
23
+ <thead
24
+ data-slot="table-header"
25
+ className={cn("[&_tr]:border-b", className)}
26
+ {...props}
27
+ />
28
+ )
29
+ }
30
+
31
+ function TableBody({ className, ...props }: React.ComponentProps<"tbody">) {
32
+ return (
33
+ <tbody
34
+ data-slot="table-body"
35
+ className={cn("[&_tr:last-child]:border-0", className)}
36
+ {...props}
37
+ />
38
+ )
39
+ }
40
+
41
+ function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) {
42
+ return (
43
+ <tfoot
44
+ data-slot="table-footer"
45
+ className={cn(
46
+ "bg-muted/50 border-t font-medium [&>tr]:last:border-b-0",
47
+ className
48
+ )}
49
+ {...props}
50
+ />
51
+ )
52
+ }
53
+
54
+ function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
55
+ return (
56
+ <tr
57
+ data-slot="table-row"
58
+ className={cn(
59
+ "hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",
60
+ className
61
+ )}
62
+ {...props}
63
+ />
64
+ )
65
+ }
66
+
67
+ function TableHead({ className, ...props }: React.ComponentProps<"th">) {
68
+ return (
69
+ <th
70
+ data-slot="table-head"
71
+ className={cn(
72
+ "text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
73
+ className
74
+ )}
75
+ {...props}
76
+ />
77
+ )
78
+ }
79
+
80
+ function TableCell({ className, ...props }: React.ComponentProps<"td">) {
81
+ return (
82
+ <td
83
+ data-slot="table-cell"
84
+ className={cn(
85
+ "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
86
+ className
87
+ )}
88
+ {...props}
89
+ />
90
+ )
91
+ }
92
+
93
+ function TableCaption({
94
+ className,
95
+ ...props
96
+ }: React.ComponentProps<"caption">) {
97
+ return (
98
+ <caption
99
+ data-slot="table-caption"
100
+ className={cn("text-muted-foreground mt-4 text-sm", className)}
101
+ {...props}
102
+ />
103
+ )
104
+ }
105
+
106
+ export {
107
+ Table,
108
+ TableHeader,
109
+ TableBody,
110
+ TableFooter,
111
+ TableHead,
112
+ TableRow,
113
+ TableCell,
114
+ TableCaption,
115
+ }