@cl-light-ds/ui 0.1.0 → 0.2.0

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 (171) hide show
  1. package/README.md +45 -45
  2. package/package.json +1 -1
  3. package/src/components/accordion/Accordion.astro +248 -248
  4. package/src/components/accordion/AccordionContent.astro +26 -26
  5. package/src/components/accordion/AccordionItem.astro +36 -36
  6. package/src/components/accordion/AccordionTrigger.astro +118 -118
  7. package/src/components/alert/Alert.astro +167 -167
  8. package/src/components/alert/AlertDescription.astro +24 -24
  9. package/src/components/alert/AlertTitle.astro +24 -24
  10. package/src/components/avatar/Avatar.astro +197 -197
  11. package/src/components/avatar/AvatarBadge.astro +44 -44
  12. package/src/components/avatar/AvatarFallback.astro +26 -26
  13. package/src/components/avatar/AvatarGroup.astro +26 -26
  14. package/src/components/avatar/AvatarGroupCount.astro +30 -30
  15. package/src/components/avatar/AvatarImage.astro +46 -46
  16. package/src/components/badge/Badge.astro +167 -167
  17. package/src/components/breadcrumb/Breadcrumb.astro +76 -76
  18. package/src/components/breadcrumb/BreadcrumbItem.astro +32 -32
  19. package/src/components/breadcrumb/BreadcrumbList.astro +26 -26
  20. package/src/components/breadcrumb/BreadcrumbSeparator.astro +26 -26
  21. package/src/components/button/Button.astro +233 -233
  22. package/src/components/button-group/ButtonGroup.astro +130 -130
  23. package/src/components/button-group/ButtonGroupSeparator.astro +30 -30
  24. package/src/components/button-group/ButtonGroupText.astro +21 -21
  25. package/src/components/card/Card.astro +182 -182
  26. package/src/components/card/CardAction.astro +26 -26
  27. package/src/components/card/CardContent.astro +28 -28
  28. package/src/components/card/CardDescription.astro +28 -28
  29. package/src/components/card/CardFooter.astro +24 -24
  30. package/src/components/card/CardHeader.astro +30 -30
  31. package/src/components/card/CardMedia.astro +27 -27
  32. package/src/components/card/CardOverlay.astro +32 -32
  33. package/src/components/card/CardTitle.astro +21 -21
  34. package/src/components/carousel/Carousel.astro +106 -106
  35. package/src/components/carousel/CarouselSlide.astro +22 -22
  36. package/src/components/checkbox/Checkbox.astro +159 -159
  37. package/src/components/collapsible/Collapsible.astro +202 -202
  38. package/src/components/collapsible/CollapsibleContent.astro +36 -36
  39. package/src/components/collapsible/CollapsibleTrigger.astro +34 -34
  40. package/src/components/combobox/Combobox.astro +365 -365
  41. package/src/components/combobox/ComboboxContent.astro +37 -37
  42. package/src/components/combobox/ComboboxEmpty.astro +18 -18
  43. package/src/components/combobox/ComboboxGroup.astro +19 -19
  44. package/src/components/combobox/ComboboxInput.astro +74 -74
  45. package/src/components/combobox/ComboboxItem.astro +39 -39
  46. package/src/components/combobox/ComboboxLabel.astro +18 -18
  47. package/src/components/combobox/ComboboxList.astro +21 -21
  48. package/src/components/combobox/ComboboxSeparator.astro +17 -17
  49. package/src/components/combobox/ComboboxTrigger.astro +30 -30
  50. package/src/components/combobox/ComboboxValue.astro +22 -22
  51. package/src/components/date/Date.astro +137 -137
  52. package/src/components/dialog/Dialog.astro +196 -196
  53. package/src/components/dialog/DialogClose.astro +23 -23
  54. package/src/components/dialog/DialogContent.astro +42 -42
  55. package/src/components/dialog/DialogDescription.astro +18 -18
  56. package/src/components/dialog/DialogFooter.astro +18 -18
  57. package/src/components/dialog/DialogHeader.astro +18 -18
  58. package/src/components/dialog/DialogOverlay.astro +19 -19
  59. package/src/components/dialog/DialogTitle.astro +18 -18
  60. package/src/components/dialog/DialogTrigger.astro +37 -37
  61. package/src/components/dropdown-menu/DropdownMenu.astro +226 -226
  62. package/src/components/dropdown-menu/DropdownMenuCheckboxItem.astro +114 -114
  63. package/src/components/dropdown-menu/DropdownMenuContent.astro +42 -42
  64. package/src/components/dropdown-menu/DropdownMenuGroup.astro +19 -19
  65. package/src/components/dropdown-menu/DropdownMenuItem.astro +220 -220
  66. package/src/components/dropdown-menu/DropdownMenuLabel.astro +20 -20
  67. package/src/components/dropdown-menu/DropdownMenuRadioItem.astro +101 -101
  68. package/src/components/dropdown-menu/DropdownMenuSeparator.astro +18 -18
  69. package/src/components/dropdown-menu/DropdownMenuShortcut.astro +18 -18
  70. package/src/components/dropdown-menu/DropdownMenuTrigger.astro +49 -49
  71. package/src/components/field/Field.astro +664 -664
  72. package/src/components/field/FieldContent.astro +20 -20
  73. package/src/components/field/FieldDescription.astro +22 -22
  74. package/src/components/field/FieldError.astro +51 -51
  75. package/src/components/field/FieldGroup.astro +20 -20
  76. package/src/components/field/FieldLabel.astro +22 -22
  77. package/src/components/field/FieldLegend.astro +23 -23
  78. package/src/components/field/FieldSeparator.astro +30 -30
  79. package/src/components/field/FieldSet.astro +20 -20
  80. package/src/components/field/FieldTitle.astro +20 -20
  81. package/src/components/hover-card/HoverCard.astro +235 -235
  82. package/src/components/hover-card/HoverCardContent.astro +54 -54
  83. package/src/components/hover-card/HoverCardTrigger.astro +38 -38
  84. package/src/components/input/Input.astro +130 -130
  85. package/src/components/input-group/InputGroup.astro +135 -135
  86. package/src/components/input-group/InputGroupAddon.astro +49 -49
  87. package/src/components/input-group/InputGroupButton.astro +58 -58
  88. package/src/components/input-group/InputGroupInput.astro +18 -18
  89. package/src/components/input-group/InputGroupText.astro +21 -21
  90. package/src/components/input-group/InputGroupTextarea.astro +17 -17
  91. package/src/components/item/Item.astro +122 -122
  92. package/src/components/item/ItemActions.astro +21 -21
  93. package/src/components/item/ItemContent.astro +25 -25
  94. package/src/components/item/ItemDescription.astro +25 -25
  95. package/src/components/item/ItemFooter.astro +24 -24
  96. package/src/components/item/ItemGroup.astro +24 -24
  97. package/src/components/item/ItemHeader.astro +24 -24
  98. package/src/components/item/ItemMedia.astro +47 -47
  99. package/src/components/item/ItemSeparator.astro +21 -21
  100. package/src/components/item/ItemTitle.astro +25 -25
  101. package/src/components/kbd/Kbd.astro +145 -145
  102. package/src/components/kbd/KbdGroup.astro +55 -55
  103. package/src/components/label/Label.astro +97 -97
  104. package/src/components/link-group/LinkGroup.astro +67 -67
  105. package/src/components/link-group/LinkGroupItem.astro +32 -32
  106. package/src/components/link-group/LinkGroupList.astro +25 -25
  107. package/src/components/link-group/LinkGroupTitle.astro +22 -22
  108. package/src/components/marquee/Marquee.astro +119 -119
  109. package/src/components/native-select/NativeSelect.astro +125 -125
  110. package/src/components/native-select/NativeSelectOptGroup.astro +14 -14
  111. package/src/components/navigation-menu/NavigationMenu.astro +414 -414
  112. package/src/components/navigation-menu/NavigationMenuContent.astro +37 -37
  113. package/src/components/navigation-menu/NavigationMenuIndicator.astro +24 -24
  114. package/src/components/navigation-menu/NavigationMenuItem.astro +22 -22
  115. package/src/components/navigation-menu/NavigationMenuLink.astro +18 -18
  116. package/src/components/navigation-menu/NavigationMenuList.astro +21 -21
  117. package/src/components/navigation-menu/NavigationMenuPositioner.astro +44 -44
  118. package/src/components/navigation-menu/NavigationMenuTrigger.astro +30 -30
  119. package/src/components/navigation-menu/NavigationMenuViewport.astro +19 -19
  120. package/src/components/popover/CHANGELOG.md +17 -2
  121. package/src/components/popover/Popover.astro +211 -210
  122. package/src/components/popover/PopoverClose.astro +18 -18
  123. package/src/components/popover/PopoverContent.astro +50 -49
  124. package/src/components/popover/PopoverDescription.astro +18 -18
  125. package/src/components/popover/PopoverHeader.astro +18 -18
  126. package/src/components/popover/PopoverTitle.astro +18 -18
  127. package/src/components/popover/PopoverTrigger.astro +35 -29
  128. package/src/components/radio-group/CHANGELOG.md +23 -1
  129. package/src/components/radio-group/RadioGroup.astro +81 -81
  130. package/src/components/radio-group/RadioGroupItem.astro +51 -42
  131. package/src/components/select/Select.astro +373 -373
  132. package/src/components/select/SelectContent.astro +91 -91
  133. package/src/components/select/SelectGroup.astro +19 -19
  134. package/src/components/select/SelectItem.astro +48 -48
  135. package/src/components/select/SelectLabel.astro +18 -18
  136. package/src/components/select/SelectSeparator.astro +17 -17
  137. package/src/components/select/SelectTrigger.astro +34 -34
  138. package/src/components/select/SelectValue.astro +22 -22
  139. package/src/components/separator/Separator.astro +60 -60
  140. package/src/components/skeleton/Skeleton.astro +121 -121
  141. package/src/components/slider/Slider.astro +198 -198
  142. package/src/components/spinner/CHANGELOG.md +14 -1
  143. package/src/components/spinner/Spinner.astro +135 -134
  144. package/src/components/sticky-surface/StickySurface.astro +152 -152
  145. package/src/components/switch/CHANGELOG.md +20 -0
  146. package/src/components/switch/Switch.astro +106 -106
  147. package/src/components/table/CHANGELOG.md +21 -2
  148. package/src/components/table/Table.astro +251 -250
  149. package/src/components/table/TableBody.astro +18 -18
  150. package/src/components/table/TableCaption.astro +17 -17
  151. package/src/components/table/TableCell.astro +21 -21
  152. package/src/components/table/TableFooter.astro +21 -21
  153. package/src/components/table/TableHead.astro +21 -21
  154. package/src/components/table/TableHeader.astro +17 -17
  155. package/src/components/table/TableRow.astro +21 -21
  156. package/src/components/tabs/Tabs.astro +306 -306
  157. package/src/components/tabs/TabsContent.astro +47 -47
  158. package/src/components/tabs/TabsList.astro +69 -69
  159. package/src/components/tabs/TabsTrigger.astro +40 -40
  160. package/src/components/textarea/CHANGELOG.md +18 -1
  161. package/src/components/textarea/Textarea.astro +58 -36
  162. package/src/components/toggle/CHANGELOG.md +19 -1
  163. package/src/components/toggle/Toggle.astro +150 -138
  164. package/src/components/toggle-group/CHANGELOG.md +14 -1
  165. package/src/components/toggle-group/ToggleGroup.astro +236 -224
  166. package/src/components/toggle-group/ToggleGroupItem.astro +48 -48
  167. package/src/components/tooltip/CHANGELOG.md +19 -2
  168. package/src/components/tooltip/Tooltip.astro +357 -331
  169. package/src/components/tooltip/TooltipContent.astro +85 -60
  170. package/src/components/tooltip/TooltipTrigger.astro +34 -34
  171. package/src/lib/toggle-shared.ts +3 -2
@@ -1,130 +1,130 @@
1
- ---
2
- /**
3
- * @component Input
4
- * @title Input
5
- * @description Base input field used in forms.
6
- * @description A field for collecting user input.
7
- * @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=145-3
8
- * @status stable
9
- * @since 0.1.0
10
- *
11
- * @preview
12
- *
13
- * <Input type="text" placeholder="Enter your name" />
14
- *
15
- * @usage
16
- *
17
- * ```astro nocollapse
18
- * ---
19
- * import { Input } from '@bejamas/ui/components/input';
20
- * ---
21
- * <Input type="email" placeholder="Enter your email" />
22
- * ```
23
- *
24
- * @examples
25
- *
26
- * ### Default
27
- *
28
- * <Input type="email" placeholder="Enter your email" />
29
- *
30
- * ### Disabled
31
- *
32
- * <Input type="email" placeholder="Enter your email" disabled />
33
- *
34
- * ### Sizes
35
- *
36
- * <div class="grid w-full max-w-sm gap-3">
37
- * <div class="flex items-center gap-2">
38
- * <Input size="sm" placeholder="Small input (h-8)" />
39
- * <Button size="sm" variant="outline">
40
- * Small
41
- * </Button>
42
- * </div>
43
- * <div class="flex items-center gap-2">
44
- * <Input placeholder="Default input (h-9)" />
45
- * <Button variant="outline">Default</Button>
46
- * </div>
47
- * <div class="flex items-center gap-2">
48
- * <Input size="lg" placeholder="Large input (h-10)" />
49
- * <Button size="lg" variant="outline">
50
- * Large
51
- * </Button>
52
- * </div>
53
- * </div>
54
- *
55
- * ### File
56
- *
57
- * <div class="grid w-full max-w-sm items-center gap-3">
58
- * <Label htmlFor="picture">Picture</Label>
59
- * <Input id="picture" type="file" />
60
- * </div>
61
- *
62
- * ### With Label
63
- *
64
- * <div class="grid w-full max-w-sm items-center gap-3">
65
- * <Label htmlFor="email">Email</Label>
66
- * <Input id="email" type="email" placeholder="Enter your email" />
67
- * </div>
68
- *
69
- * ### With Button
70
- *
71
- * <div class="flex w-full max-w-sm items-center gap-2">
72
- * <Input type="email" placeholder="Email" />
73
- * <Button type="submit" variant="outline">
74
- * Subscribe
75
- * </Button>
76
- * </div>
77
- */
78
-
79
- import { cn } from "@cl-light-ds/ui/lib/utils";
80
- import { cva, type VariantProps } from "class-variance-authority";
81
- import type { HTMLAttributes } from "astro/types";
82
-
83
- const inputVariants = cva(
84
- "w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed",
85
- {
86
- variants: {
87
- size: {
88
- sm: "data-[size=sm]",
89
- default: "data-[size=default]",
90
- lg: "data-[size=lg]",
91
- },
92
- },
93
- defaultVariants: {
94
- size: "default",
95
- },
96
- },
97
- );
98
-
99
- type InputUiSize = NonNullable<VariantProps<typeof inputVariants>["size"]>;
100
- type NativeInputSize = HTMLAttributes<"input">["size"];
101
-
102
- interface Props extends Omit<HTMLAttributes<"input">, "size"> {
103
- size?: InputUiSize | NativeInputSize;
104
- nativeSize?: NativeInputSize;
105
- }
106
-
107
- const {
108
- class: className = "",
109
- type = "text",
110
- size: sizeProp,
111
- nativeSize,
112
- ...props
113
- } = Astro.props as Props;
114
-
115
- const isUiSize = (value: unknown): value is InputUiSize =>
116
- value === "sm" || value === "default" || value === "lg";
117
-
118
- const resolvedUiSize = isUiSize(sizeProp) ? sizeProp : "default";
119
- const resolvedNativeSize =
120
- nativeSize ?? (!isUiSize(sizeProp) ? sizeProp : undefined);
121
- ---
122
-
123
- <input
124
- type={type}
125
- size={resolvedNativeSize}
126
- data-slot={props["data-slot"] ?? "input"}
127
- data-size={resolvedUiSize}
128
- class={cn("border-input 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:aria-invalid:border-destructive/50 active:border-ring rounded-lg border bg-card shadow-xs transition-[color,box-shadow] file:h-7 file:text-sm file:font-medium focus-visible:ring-3 aria-invalid:ring-3 disabled:bg-muted disabled:text-muted-foreground data-[size=sm]:h-8 data-[size=sm]:px-2.5 data-[size=sm]:py-1 data-[size=sm]:md:text-xs data-[size=default]:h-9 data-[size=default]:px-2.5 data-[size=default]:py-1 data-[size=default]:md:text-sm data-[size=lg]:h-10 data-[size=lg]:px-3.5 data-[size=lg]:py-1.5 data-[size=lg]:md:text-base", inputVariants({ size: resolvedUiSize }), className)}
129
- {...props}
130
- />
1
+ ---
2
+ /**
3
+ * @component Input
4
+ * @title Input
5
+ * @description Base input field used in forms.
6
+ * @description A field for collecting user input.
7
+ * @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=145-3
8
+ * @status stable
9
+ * @since 0.1.0
10
+ *
11
+ * @preview
12
+ *
13
+ * <Input type="text" placeholder="Enter your name" />
14
+ *
15
+ * @usage
16
+ *
17
+ * ```astro nocollapse
18
+ * ---
19
+ * import { Input } from '@bejamas/ui/components/input';
20
+ * ---
21
+ * <Input type="email" placeholder="Enter your email" />
22
+ * ```
23
+ *
24
+ * @examples
25
+ *
26
+ * ### Default
27
+ *
28
+ * <Input type="email" placeholder="Enter your email" />
29
+ *
30
+ * ### Disabled
31
+ *
32
+ * <Input type="email" placeholder="Enter your email" disabled />
33
+ *
34
+ * ### Sizes
35
+ *
36
+ * <div class="grid w-full max-w-sm gap-3">
37
+ * <div class="flex items-center gap-2">
38
+ * <Input size="sm" placeholder="Small input (h-8)" />
39
+ * <Button size="sm" variant="outline">
40
+ * Small
41
+ * </Button>
42
+ * </div>
43
+ * <div class="flex items-center gap-2">
44
+ * <Input placeholder="Default input (h-9)" />
45
+ * <Button variant="outline">Default</Button>
46
+ * </div>
47
+ * <div class="flex items-center gap-2">
48
+ * <Input size="lg" placeholder="Large input (h-10)" />
49
+ * <Button size="lg" variant="outline">
50
+ * Large
51
+ * </Button>
52
+ * </div>
53
+ * </div>
54
+ *
55
+ * ### File
56
+ *
57
+ * <div class="grid w-full max-w-sm items-center gap-3">
58
+ * <Label htmlFor="picture">Picture</Label>
59
+ * <Input id="picture" type="file" />
60
+ * </div>
61
+ *
62
+ * ### With Label
63
+ *
64
+ * <div class="grid w-full max-w-sm items-center gap-3">
65
+ * <Label htmlFor="email">Email</Label>
66
+ * <Input id="email" type="email" placeholder="Enter your email" />
67
+ * </div>
68
+ *
69
+ * ### With Button
70
+ *
71
+ * <div class="flex w-full max-w-sm items-center gap-2">
72
+ * <Input type="email" placeholder="Email" />
73
+ * <Button type="submit" variant="outline">
74
+ * Subscribe
75
+ * </Button>
76
+ * </div>
77
+ */
78
+
79
+ import { cn } from "@cl-light-ds/ui/lib/utils";
80
+ import { cva, type VariantProps } from "class-variance-authority";
81
+ import type { HTMLAttributes } from "astro/types";
82
+
83
+ const inputVariants = cva(
84
+ "w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed",
85
+ {
86
+ variants: {
87
+ size: {
88
+ sm: "data-[size=sm]",
89
+ default: "data-[size=default]",
90
+ lg: "data-[size=lg]",
91
+ },
92
+ },
93
+ defaultVariants: {
94
+ size: "default",
95
+ },
96
+ },
97
+ );
98
+
99
+ type InputUiSize = NonNullable<VariantProps<typeof inputVariants>["size"]>;
100
+ type NativeInputSize = HTMLAttributes<"input">["size"];
101
+
102
+ interface Props extends Omit<HTMLAttributes<"input">, "size"> {
103
+ size?: InputUiSize | NativeInputSize;
104
+ nativeSize?: NativeInputSize;
105
+ }
106
+
107
+ const {
108
+ class: className = "",
109
+ type = "text",
110
+ size: sizeProp,
111
+ nativeSize,
112
+ ...props
113
+ } = Astro.props as Props;
114
+
115
+ const isUiSize = (value: unknown): value is InputUiSize =>
116
+ value === "sm" || value === "default" || value === "lg";
117
+
118
+ const resolvedUiSize = isUiSize(sizeProp) ? sizeProp : "default";
119
+ const resolvedNativeSize =
120
+ nativeSize ?? (!isUiSize(sizeProp) ? sizeProp : undefined);
121
+ ---
122
+
123
+ <input
124
+ type={type}
125
+ size={resolvedNativeSize}
126
+ data-slot={props["data-slot"] ?? "input"}
127
+ data-size={resolvedUiSize}
128
+ class={cn("border-input 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:aria-invalid:border-destructive/50 active:border-ring rounded-lg border bg-card shadow-xs transition-[color,box-shadow] file:h-7 file:text-sm file:font-medium focus-visible:ring-3 aria-invalid:ring-3 disabled:bg-muted disabled:text-muted-foreground data-[size=sm]:h-8 data-[size=sm]:px-2.5 data-[size=sm]:py-1 data-[size=sm]:md:text-xs data-[size=default]:h-9 data-[size=default]:px-2.5 data-[size=default]:py-1 data-[size=default]:md:text-sm data-[size=lg]:h-10 data-[size=lg]:px-3.5 data-[size=lg]:py-1.5 data-[size=lg]:md:text-base", inputVariants({ size: resolvedUiSize }), className)}
129
+ {...props}
130
+ />
@@ -1,135 +1,135 @@
1
- ---
2
- /**
3
- * @component InputGroup
4
- * @title Input Group
5
- * @description An input field with attached addons like icons, buttons, or text labels.
6
- * @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=2282-6923
7
- *
8
- * @preview
9
- *
10
- * <div class="grid w-full max-w-sm gap-6">
11
- * <InputGroup>
12
- * <InputGroupInput placeholder="Search..." />
13
- * <InputGroupAddon>
14
- * <SearchIcon />
15
- * </InputGroupAddon>
16
- * <InputGroupAddon align="inline-end">12 results</InputGroupAddon>
17
- * </InputGroup>
18
- *
19
- * <InputGroup>
20
- * <InputGroupInput placeholder="example.com" />
21
- * <InputGroupAddon>
22
- * <InputGroupText>https://</InputGroupText>
23
- * </InputGroupAddon>
24
- * <InputGroupAddon align="inline-end">
25
- * <InputGroupButton size="xs">Check</InputGroupButton>
26
- * </InputGroupAddon>
27
- * </InputGroup>
28
- *
29
- * <InputGroup>
30
- * <InputGroupTextarea placeholder="Ask, Search or Chat..." />
31
- * <InputGroupAddon align="block-end">
32
- * <InputGroupButton size="icon-sm" class="rounded-full">
33
- * <PlusIcon />
34
- * </InputGroupButton>
35
- * <InputGroupButton variant="ghost">Auto</InputGroupButton>
36
- * <InputGroupText class="ml-auto">52% used</InputGroupText>
37
- * <Separator orientation="vertical" class="!h-4" />
38
- * <InputGroupButton size="icon-sm" variant="default" class="rounded-full">
39
- * <ArrowUpIcon />
40
- * <span class="sr-only">Send</span>
41
- * </InputGroupButton>
42
- * </InputGroupAddon>
43
- * </InputGroup>
44
- * </div>
45
- *
46
- * @usage
47
- *
48
- * ```astro nocollapse
49
- * ---
50
- * import { InputGroup, InputGroupInput, InputGroupAddon, InputGroupButton, InputGroupText } from '@bejamas/ui/components/input-group';
51
- * ---
52
- *
53
- * <InputGroup>
54
- * <InputGroupInput placeholder="Search..." />
55
- * <InputGroupAddon><SearchIcon /></InputGroupAddon>
56
- * </InputGroup>
57
- * ```
58
- *
59
- * @examples
60
- *
61
- * ### Sizes
62
- *
63
- * <div class="grid w-full max-w-sm gap-3">
64
- * <InputGroup size="sm">
65
- * <InputGroupInput placeholder="Small (h-8)" />
66
- * </InputGroup>
67
- * <InputGroup>
68
- * <InputGroupInput placeholder="Default (h-9)" />
69
- * </InputGroup>
70
- * <InputGroup size="lg">
71
- * <InputGroupInput placeholder="Large (h-10)" />
72
- * </InputGroup>
73
- * </div>
74
- *
75
- * @api
76
- *
77
- * | Prop | Type | Default |
78
- * | --- | --- | --- |
79
- * | `size` | `"sm" \| "default" \| "lg"` | `"default"` |
80
- */
81
- import type { HTMLAttributes } from "astro/types";
82
- import { cn } from "@cl-light-ds/ui/lib/utils";
83
-
84
- interface Props extends HTMLAttributes<"div"> {
85
- size?: "sm" | "default" | "lg";
86
- class?: string;
87
- }
88
-
89
- const {
90
- size = "default",
91
- class: className = "",
92
- ...rest
93
- } = Astro.props as Props;
94
- ---
95
-
96
- <div
97
- {...rest}
98
- role="group"
99
- data-slot="input-group"
100
- data-size={size}
101
- class={cn(
102
- "group/input-group border-input bg-card has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 data-[size=sm]:h-8 data-[size=default]:h-9 data-[size=lg]:h-10 rounded-lg border shadow-xs transition-[color,box-shadow] in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-3 has-[>[data-align=block-end]]:h-auto! has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto! has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5 relative flex w-full min-w-0 items-center outline-none has-[>textarea]:h-auto!",
103
- className,
104
- )}
105
- >
106
- <slot />
107
- </div>
108
-
109
- <script is:inline type="module">
110
- // Focus the nearest input when clicking on addons (unless clicking a button)
111
- document.addEventListener("click", (e) => {
112
- const addon = e.target.closest("[data-slot='input-group-addon']");
113
- if (!addon) return;
114
- if (e.target.closest("button")) return;
115
- const root = addon.closest("[data-slot='input-group']");
116
- if (!root) return;
117
- const input = root.querySelector(
118
- "[data-input-group-control], [data-slot='input-group-control']",
119
- );
120
- input?.focus();
121
- });
122
- // Disabled styling passthrough when any control is disabled
123
- document.querySelectorAll("[data-slot='input-group']").forEach((group) => {
124
- const updateDisabled = () => {
125
- const ctrl = group.querySelector(
126
- "[data-input-group-control], [data-slot='input-group-control']",
127
- );
128
- group.dataset.disabled = ctrl?.hasAttribute("disabled")
129
- ? "true"
130
- : "false";
131
- };
132
- updateDisabled();
133
- group.addEventListener("change", updateDisabled, { capture: true });
134
- });
135
- </script>
1
+ ---
2
+ /**
3
+ * @component InputGroup
4
+ * @title Input Group
5
+ * @description An input field with attached addons like icons, buttons, or text labels.
6
+ * @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=2282-6923
7
+ *
8
+ * @preview
9
+ *
10
+ * <div class="grid w-full max-w-sm gap-6">
11
+ * <InputGroup>
12
+ * <InputGroupInput placeholder="Search..." />
13
+ * <InputGroupAddon>
14
+ * <SearchIcon />
15
+ * </InputGroupAddon>
16
+ * <InputGroupAddon align="inline-end">12 results</InputGroupAddon>
17
+ * </InputGroup>
18
+ *
19
+ * <InputGroup>
20
+ * <InputGroupInput placeholder="example.com" />
21
+ * <InputGroupAddon>
22
+ * <InputGroupText>https://</InputGroupText>
23
+ * </InputGroupAddon>
24
+ * <InputGroupAddon align="inline-end">
25
+ * <InputGroupButton size="xs">Check</InputGroupButton>
26
+ * </InputGroupAddon>
27
+ * </InputGroup>
28
+ *
29
+ * <InputGroup>
30
+ * <InputGroupTextarea placeholder="Ask, Search or Chat..." />
31
+ * <InputGroupAddon align="block-end">
32
+ * <InputGroupButton size="icon-sm" class="rounded-full">
33
+ * <PlusIcon />
34
+ * </InputGroupButton>
35
+ * <InputGroupButton variant="ghost">Auto</InputGroupButton>
36
+ * <InputGroupText class="ml-auto">52% used</InputGroupText>
37
+ * <Separator orientation="vertical" class="!h-4" />
38
+ * <InputGroupButton size="icon-sm" variant="default" class="rounded-full">
39
+ * <ArrowUpIcon />
40
+ * <span class="sr-only">Send</span>
41
+ * </InputGroupButton>
42
+ * </InputGroupAddon>
43
+ * </InputGroup>
44
+ * </div>
45
+ *
46
+ * @usage
47
+ *
48
+ * ```astro nocollapse
49
+ * ---
50
+ * import { InputGroup, InputGroupInput, InputGroupAddon, InputGroupButton, InputGroupText } from '@bejamas/ui/components/input-group';
51
+ * ---
52
+ *
53
+ * <InputGroup>
54
+ * <InputGroupInput placeholder="Search..." />
55
+ * <InputGroupAddon><SearchIcon /></InputGroupAddon>
56
+ * </InputGroup>
57
+ * ```
58
+ *
59
+ * @examples
60
+ *
61
+ * ### Sizes
62
+ *
63
+ * <div class="grid w-full max-w-sm gap-3">
64
+ * <InputGroup size="sm">
65
+ * <InputGroupInput placeholder="Small (h-8)" />
66
+ * </InputGroup>
67
+ * <InputGroup>
68
+ * <InputGroupInput placeholder="Default (h-9)" />
69
+ * </InputGroup>
70
+ * <InputGroup size="lg">
71
+ * <InputGroupInput placeholder="Large (h-10)" />
72
+ * </InputGroup>
73
+ * </div>
74
+ *
75
+ * @api
76
+ *
77
+ * | Prop | Type | Default |
78
+ * | --- | --- | --- |
79
+ * | `size` | `"sm" \| "default" \| "lg"` | `"default"` |
80
+ */
81
+ import type { HTMLAttributes } from "astro/types";
82
+ import { cn } from "@cl-light-ds/ui/lib/utils";
83
+
84
+ interface Props extends HTMLAttributes<"div"> {
85
+ size?: "sm" | "default" | "lg";
86
+ class?: string;
87
+ }
88
+
89
+ const {
90
+ size = "default",
91
+ class: className = "",
92
+ ...rest
93
+ } = Astro.props as Props;
94
+ ---
95
+
96
+ <div
97
+ {...rest}
98
+ role="group"
99
+ data-slot="input-group"
100
+ data-size={size}
101
+ class={cn(
102
+ "group/input-group border-input bg-card has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 data-[size=sm]:h-8 data-[size=default]:h-9 data-[size=lg]:h-10 rounded-lg border shadow-xs transition-[color,box-shadow] in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-3 has-[>[data-align=block-end]]:h-auto! has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto! has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5 relative flex w-full min-w-0 items-center outline-none has-[>textarea]:h-auto!",
103
+ className,
104
+ )}
105
+ >
106
+ <slot />
107
+ </div>
108
+
109
+ <script is:inline type="module">
110
+ // Focus the nearest input when clicking on addons (unless clicking a button)
111
+ document.addEventListener("click", (e) => {
112
+ const addon = e.target.closest("[data-slot='input-group-addon']");
113
+ if (!addon) return;
114
+ if (e.target.closest("button")) return;
115
+ const root = addon.closest("[data-slot='input-group']");
116
+ if (!root) return;
117
+ const input = root.querySelector(
118
+ "[data-input-group-control], [data-slot='input-group-control']",
119
+ );
120
+ input?.focus();
121
+ });
122
+ // Disabled styling passthrough when any control is disabled
123
+ document.querySelectorAll("[data-slot='input-group']").forEach((group) => {
124
+ const updateDisabled = () => {
125
+ const ctrl = group.querySelector(
126
+ "[data-input-group-control], [data-slot='input-group-control']",
127
+ );
128
+ group.dataset.disabled = ctrl?.hasAttribute("disabled")
129
+ ? "true"
130
+ : "false";
131
+ };
132
+ updateDisabled();
133
+ group.addEventListener("change", updateDisabled, { capture: true });
134
+ });
135
+ </script>
@@ -1,49 +1,49 @@
1
- ---
2
- import type { HTMLAttributes } from "astro/types";
3
- import { cva } from "class-variance-authority";
4
- import { cn } from "@cl-light-ds/ui/lib/utils";
5
-
6
- type Align = "inline-start" | "inline-end" | "block-start" | "block-end";
7
-
8
- interface Props extends HTMLAttributes<"div"> {
9
- align?: Align;
10
- class?: string;
11
- }
12
-
13
- const {
14
- align = "inline-start",
15
- class: className = "",
16
- ...rest
17
- } = Astro.props as Props;
18
-
19
- const addonVariants = cva(
20
- "text-muted-foreground h-auto gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4 flex cursor-text items-center justify-center select-none",
21
- {
22
- variants: {
23
- align: {
24
- "inline-start":
25
- "pl-2 has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem] order-first",
26
- "inline-end":
27
- "pr-2 has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem] order-last",
28
- "block-start":
29
- "px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2 order-first w-full justify-start",
30
- "block-end":
31
- "px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2 order-last w-full justify-start",
32
- },
33
- },
34
- defaultVariants: {
35
- align: "inline-start",
36
- },
37
- },
38
- );
39
- ---
40
-
41
- <div
42
- {...rest}
43
- role="group"
44
- data-slot="input-group-addon"
45
- data-align={align}
46
- class={cn(addonVariants({ align }), className)}
47
- >
48
- <slot />
49
- </div>
1
+ ---
2
+ import type { HTMLAttributes } from "astro/types";
3
+ import { cva } from "class-variance-authority";
4
+ import { cn } from "@cl-light-ds/ui/lib/utils";
5
+
6
+ type Align = "inline-start" | "inline-end" | "block-start" | "block-end";
7
+
8
+ interface Props extends HTMLAttributes<"div"> {
9
+ align?: Align;
10
+ class?: string;
11
+ }
12
+
13
+ const {
14
+ align = "inline-start",
15
+ class: className = "",
16
+ ...rest
17
+ } = Astro.props as Props;
18
+
19
+ const addonVariants = cva(
20
+ "text-muted-foreground h-auto gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4 flex cursor-text items-center justify-center select-none",
21
+ {
22
+ variants: {
23
+ align: {
24
+ "inline-start":
25
+ "pl-2 has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem] order-first",
26
+ "inline-end":
27
+ "pr-2 has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem] order-last",
28
+ "block-start":
29
+ "px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2 order-first w-full justify-start",
30
+ "block-end":
31
+ "px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2 order-last w-full justify-start",
32
+ },
33
+ },
34
+ defaultVariants: {
35
+ align: "inline-start",
36
+ },
37
+ },
38
+ );
39
+ ---
40
+
41
+ <div
42
+ {...rest}
43
+ role="group"
44
+ data-slot="input-group-addon"
45
+ data-align={align}
46
+ class={cn(addonVariants({ align }), className)}
47
+ >
48
+ <slot />
49
+ </div>