@shadow-js/ui 0.0.0-stage → 1.0.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 (190) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/README.md +598 -2
  4. package/dist/cli.mjs +2293 -0
  5. package/dist/dev/cli/schema.d.ts +73 -0
  6. package/dist/dev/index.d.ts +6 -0
  7. package/dist/dev/index.js +5 -0
  8. package/dist/dev/locales/ar.d.ts +141 -0
  9. package/dist/dev/locales/ar.js +128 -0
  10. package/dist/dev/locales/ar.js.map +1 -0
  11. package/dist/dev/locales/en.d.ts +141 -0
  12. package/dist/dev/locales/en.js +128 -0
  13. package/dist/dev/locales/en.js.map +1 -0
  14. package/dist/dev/registry/utils/utils.d.ts +29 -0
  15. package/dist/dev/registry/utils/utils.js +27 -0
  16. package/dist/dev/registry/utils/utils.js.map +1 -0
  17. package/dist/dev/theme/theme-logic.d.ts +187 -0
  18. package/dist/dev/theme/theme-logic.js +184 -0
  19. package/dist/dev/theme/theme-logic.js.map +1 -0
  20. package/dist/dev/theme/theme-provider.d.ts +90 -0
  21. package/dist/dev/theme/theme-provider.js +150 -0
  22. package/dist/dev/theme/theme-provider.js.map +1 -0
  23. package/dist/prod/index.js +1 -0
  24. package/dist/prod/locales/ar.js +2 -0
  25. package/dist/prod/locales/ar.js.map +1 -0
  26. package/dist/prod/locales/en.js +2 -0
  27. package/dist/prod/locales/en.js.map +1 -0
  28. package/dist/prod/registry/utils/utils.js +2 -0
  29. package/dist/prod/registry/utils/utils.js.map +1 -0
  30. package/dist/prod/theme/theme-logic.js +2 -0
  31. package/dist/prod/theme/theme-logic.js.map +1 -0
  32. package/dist/prod/theme/theme-provider.js +2 -0
  33. package/dist/prod/theme/theme-provider.js.map +1 -0
  34. package/package.json +102 -4
  35. package/registry/accordion/accordion.tsx +210 -0
  36. package/registry/accordion/item.json +4 -0
  37. package/registry/alert/alert.tsx +200 -0
  38. package/registry/alert/item.json +4 -0
  39. package/registry/alert-dialog/alert-dialog.tsx +530 -0
  40. package/registry/alert-dialog/item.json +4 -0
  41. package/registry/aspect-ratio/aspect-ratio.tsx +71 -0
  42. package/registry/aspect-ratio/item.json +4 -0
  43. package/registry/attachment/attachment.tsx +459 -0
  44. package/registry/attachment/item.json +4 -0
  45. package/registry/avatar/avatar.tsx +385 -0
  46. package/registry/avatar/item.json +4 -0
  47. package/registry/badge/badge.tsx +108 -0
  48. package/registry/badge/item.json +4 -0
  49. package/registry/breadcrumb/breadcrumb.tsx +354 -0
  50. package/registry/breadcrumb/item.json +4 -0
  51. package/registry/bubble/bubble.tsx +260 -0
  52. package/registry/bubble/item.json +4 -0
  53. package/registry/button/button.tsx +125 -0
  54. package/registry/button/item.json +4 -0
  55. package/registry/button-group/button-group.tsx +189 -0
  56. package/registry/button-group/item.json +4 -0
  57. package/registry/calendar/calendar.tsx +348 -0
  58. package/registry/calendar/item.json +4 -0
  59. package/registry/card/card.tsx +311 -0
  60. package/registry/card/item.json +4 -0
  61. package/registry/carousel/carousel.tsx +851 -0
  62. package/registry/carousel/item.json +4 -0
  63. package/registry/chart/chart.tsx +1956 -0
  64. package/registry/chart/item.json +4 -0
  65. package/registry/chart-scale/chart-scale.ts +670 -0
  66. package/registry/chart-scale/item.json +5 -0
  67. package/registry/checkbox/checkbox.tsx +79 -0
  68. package/registry/checkbox/item.json +4 -0
  69. package/registry/code-block/code-block.tsx +470 -0
  70. package/registry/code-block/item.json +4 -0
  71. package/registry/collapsible/collapsible.tsx +117 -0
  72. package/registry/collapsible/item.json +4 -0
  73. package/registry/combobox/combobox.tsx +977 -0
  74. package/registry/combobox/item.json +4 -0
  75. package/registry/command/command.tsx +757 -0
  76. package/registry/command/item.json +4 -0
  77. package/registry/context-menu/context-menu.tsx +697 -0
  78. package/registry/context-menu/item.json +4 -0
  79. package/registry/data-table/data-table.tsx +437 -0
  80. package/registry/data-table/item.json +4 -0
  81. package/registry/date-picker/date-picker.tsx +349 -0
  82. package/registry/date-picker/item.json +4 -0
  83. package/registry/dialog/dialog.tsx +412 -0
  84. package/registry/dialog/item.json +4 -0
  85. package/registry/direction/direction.tsx +88 -0
  86. package/registry/direction/item.json +4 -0
  87. package/registry/drawer/drawer.tsx +787 -0
  88. package/registry/drawer/item.json +4 -0
  89. package/registry/dropdown-menu/dropdown-menu.tsx +692 -0
  90. package/registry/dropdown-menu/item.json +4 -0
  91. package/registry/empty/empty.tsx +240 -0
  92. package/registry/empty/item.json +4 -0
  93. package/registry/field/field.tsx +624 -0
  94. package/registry/field/item.json +4 -0
  95. package/registry/form/form.tsx +1112 -0
  96. package/registry/form/item.json +4 -0
  97. package/registry/hover-card/hover-card.tsx +144 -0
  98. package/registry/hover-card/item.json +4 -0
  99. package/registry/icons/icons.tsx +1691 -0
  100. package/registry/icons/item.json +4 -0
  101. package/registry/input/input.tsx +43 -0
  102. package/registry/input/item.json +4 -0
  103. package/registry/input-group/input-group.tsx +315 -0
  104. package/registry/input-group/item.json +4 -0
  105. package/registry/input-otp/input-otp.tsx +329 -0
  106. package/registry/input-otp/item.json +4 -0
  107. package/registry/item/item.json +4 -0
  108. package/registry/item/item.tsx +439 -0
  109. package/registry/kbd/item.json +4 -0
  110. package/registry/kbd/kbd.tsx +65 -0
  111. package/registry/label/item.json +4 -0
  112. package/registry/label/label.tsx +60 -0
  113. package/registry/marker/item.json +4 -0
  114. package/registry/marker/marker.tsx +175 -0
  115. package/registry/menubar/item.json +4 -0
  116. package/registry/menubar/menubar.tsx +694 -0
  117. package/registry/message/item.json +4 -0
  118. package/registry/message/message.tsx +280 -0
  119. package/registry/message-scroller/item.json +4 -0
  120. package/registry/message-scroller/message-scroller.tsx +262 -0
  121. package/registry/native-select/item.json +4 -0
  122. package/registry/native-select/native-select.tsx +113 -0
  123. package/registry/navigation-menu/item.json +4 -0
  124. package/registry/navigation-menu/navigation-menu.tsx +362 -0
  125. package/registry/pagination/item.json +4 -0
  126. package/registry/pagination/pagination.tsx +460 -0
  127. package/registry/password-input/item.json +5 -0
  128. package/registry/password-input/password-input.tsx +494 -0
  129. package/registry/popover/item.json +4 -0
  130. package/registry/popover/popover.tsx +284 -0
  131. package/registry/progress/item.json +4 -0
  132. package/registry/progress/progress.tsx +190 -0
  133. package/registry/questionnaire/item.json +4 -0
  134. package/registry/questionnaire/questionnaire.tsx +569 -0
  135. package/registry/radio-group/item.json +4 -0
  136. package/registry/radio-group/radio-group.tsx +101 -0
  137. package/registry/resizable/item.json +4 -0
  138. package/registry/resizable/resizable.tsx +455 -0
  139. package/registry/scroll-area/item.json +4 -0
  140. package/registry/scroll-area/scroll-area.tsx +149 -0
  141. package/registry/select/item.json +4 -0
  142. package/registry/select/select.tsx +571 -0
  143. package/registry/separator/item.json +4 -0
  144. package/registry/separator/separator.tsx +52 -0
  145. package/registry/sheet/item.json +4 -0
  146. package/registry/sheet/sheet.tsx +476 -0
  147. package/registry/sidebar/item.json +4 -0
  148. package/registry/sidebar/sidebar.tsx +1870 -0
  149. package/registry/skeleton/item.json +4 -0
  150. package/registry/skeleton/skeleton.tsx +47 -0
  151. package/registry/slider/item.json +4 -0
  152. package/registry/slider/slider.tsx +149 -0
  153. package/registry/spinner/item.json +4 -0
  154. package/registry/spinner/spinner.tsx +51 -0
  155. package/registry/switch/item.json +4 -0
  156. package/registry/switch/switch.tsx +93 -0
  157. package/registry/table/item.json +4 -0
  158. package/registry/table/table.tsx +373 -0
  159. package/registry/tabs/item.json +4 -0
  160. package/registry/tabs/tabs.tsx +209 -0
  161. package/registry/textarea/item.json +4 -0
  162. package/registry/textarea/textarea.tsx +51 -0
  163. package/registry/toast/item.json +4 -0
  164. package/registry/toast/toast.tsx +949 -0
  165. package/registry/toggle/item.json +4 -0
  166. package/registry/toggle/toggle.tsx +110 -0
  167. package/registry/toggle-group/item.json +4 -0
  168. package/registry/toggle-group/toggle-group.tsx +189 -0
  169. package/registry/tooltip/item.json +4 -0
  170. package/registry/tooltip/tooltip.tsx +169 -0
  171. package/registry/trace/item.json +4 -0
  172. package/registry/trace/trace.tsx +356 -0
  173. package/registry/ui-strings/item.json +5 -0
  174. package/registry/ui-strings/ui-strings.tsx +454 -0
  175. package/registry/use-highlighted-code/item.json +5 -0
  176. package/registry/use-highlighted-code/use-highlighted-code.tsx +145 -0
  177. package/registry/use-mobile/item.json +5 -0
  178. package/registry/use-mobile/use-mobile.ts +46 -0
  179. package/registry/utils/item.json +5 -0
  180. package/registry/utils/utils.ts +38 -0
  181. package/registry.json +3274 -0
  182. package/styles/animations.css +321 -0
  183. package/styles/theme-core.css +55 -0
  184. package/styles/theme.css +12 -0
  185. package/styles/themes/gray.css +69 -0
  186. package/styles/themes/neutral.css +69 -0
  187. package/styles/themes/slate.css +69 -0
  188. package/styles/themes/stone.css +69 -0
  189. package/styles/themes/zinc.css +69 -0
  190. package/styles/typeset.css +251 -0
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Form",
3
+ "description": "Accessible form wiring for any form library: a Form root, field ids, labels, descriptions, error messages and an error summary."
4
+ }
@@ -0,0 +1,144 @@
1
+ import { splitProps } from "@shadow-js/core";
2
+ import {
3
+ type HoverCardContentProps,
4
+ HoverCard as HoverCardPrimitive,
5
+ type HoverCardProps as HoverCardRootProps,
6
+ type HoverCardTriggerProps,
7
+ type PolymorphicTarget,
8
+ } from "@shadow-js/primitives";
9
+ import type { JSX } from "@shadow-js/web";
10
+ import { cn } from "@/lib/utils";
11
+
12
+ /**
13
+ * Props of {@link HoverCard}: the primitive's root props, and `delay`, the shadcn name for `openDelay`.
14
+ * @see {@link HoverCard}
15
+ * @since 1.0.0
16
+ */
17
+ export type HoverCardProps = HoverCardRootProps & {
18
+ /**
19
+ * The shadcn name for `openDelay`: how long the pointer (or focus) rests on the trigger before the card
20
+ * opens, in ms. The delays live on the root, so `delay` is a root prop, not a trigger prop. When both are
21
+ * given, `openDelay` wins.
22
+ * @default 700
23
+ * @see {@link HoverCardProps}
24
+ */
25
+ readonly delay?: number | undefined;
26
+ };
27
+
28
+ /**
29
+ * A preview card that opens when the pointer rests on a link, or when keyboard focus reaches it. Use it
30
+ * for supplementary detail about a link, such as a profile preview. The card is for sighted pointer users
31
+ * and is not an interactive dialog: it is not announced, it never traps focus, and touch devices never
32
+ * open it. Whatever it shows must also be reachable by following the link.
33
+ *
34
+ * The pointer opens the card after `openDelay` (700 ms by default, `delay` is its shadcn name) and closes it
35
+ * after `closeDelay` (300 ms by default), so the pointer can cross the gap into the card. It is controlled with `open` and
36
+ * `onOpenChange`, or uncontrolled with `defaultOpen`.
37
+ *
38
+ * Keyboard and ARIA: focus on the trigger opens the card and leaving the trigger closes it, after the
39
+ * delays. Tab from an open trigger enters the card, Shift+Tab from its first control returns to the
40
+ * trigger, and Escape closes the card and returns focus to the trigger. No ARIA role is set, and the
41
+ * trigger is a link in the tab order. Name the link by its text.
42
+ *
43
+ * shadcn/ui differences: `as` replaces `asChild` on {@link HoverCardTrigger}, and the prop is `class`,
44
+ * not `className`. Every part has a `data-slot`.
45
+ *
46
+ * @param props The card props: see {@link HoverCardProps}.
47
+ * @returns The card. It renders no element of its own.
48
+ * @example
49
+ * import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card";
50
+ *
51
+ * export function AuthorPreview() {
52
+ * return (
53
+ * <HoverCard>
54
+ * <HoverCardTrigger href="https://shadow-js.dev">@shadow-js</HoverCardTrigger>
55
+ * <HoverCardContent>The fine-grained UI framework.</HoverCardContent>
56
+ * </HoverCard>
57
+ * );
58
+ * }
59
+ * @see {@link HoverCardTrigger}
60
+ * @see {@link HoverCardContent}
61
+ * @since 1.0.0
62
+ */
63
+ function HoverCard(props: HoverCardProps): JSX.Element {
64
+ const [local, rest] = splitProps(props, ["delay"]);
65
+ return <HoverCardPrimitive {...rest} openDelay={rest.openDelay ?? local.delay} />;
66
+ }
67
+
68
+ /**
69
+ * The link the card previews. It renders an `a`, so give it an `href`; `as` renders another element. The
70
+ * mouse or a pen opens the card after the open delay, and keyboard focus does the same. Touch never opens
71
+ * it, not even through the focus a tap can cause.
72
+ *
73
+ * @param props The trigger props: the attributes of the rendered element, and `as`.
74
+ * @returns The trigger link.
75
+ * @throws Error when rendered outside a {@link HoverCard}.
76
+ * @example
77
+ * import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card";
78
+ *
79
+ * export function AdaLink() {
80
+ * return (
81
+ * <HoverCard>
82
+ * <HoverCardTrigger href="/ada" class="underline">
83
+ * Ada Lovelace
84
+ * </HoverCardTrigger>
85
+ * <HoverCardContent>Ada Lovelace wrote the first program.</HoverCardContent>
86
+ * </HoverCard>
87
+ * );
88
+ * }
89
+ * @see {@link HoverCard}
90
+ * @since 1.0.0
91
+ */
92
+ function HoverCardTrigger<T extends PolymorphicTarget = "a">(
93
+ props: HoverCardTriggerProps<T>,
94
+ ): JSX.Element {
95
+ return <HoverCardPrimitive.Trigger data-slot="hover-card-trigger" {...props} />;
96
+ }
97
+
98
+ /**
99
+ * The card. It is rendered in `document.body` and placed against the trigger, centered below it by
100
+ * default with a 4 px gap (`side="bottom"`, `align="center"` and `sideOffset={4}`, all of which you can
101
+ * change). Keyboard and ARIA: see {@link HoverCard}; the card has no keys or role of its own. The
102
+ * pointer can move from the trigger onto the card without closing it. Escape and a press outside close
103
+ * it. The card does not take focus, and focus leaving the card closes it.
104
+ *
105
+ * @param props The card props: `side` (`"bottom"` by default, or `"top"`, `"left"` or `"right"`), `align`,
106
+ * `sideOffset`, `class`, and the attributes of the rendered `div`.
107
+ * @returns The card, rendered in a portal while it is open.
108
+ * @throws Error when rendered outside a {@link HoverCard}.
109
+ * @example
110
+ * import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card";
111
+ *
112
+ * export function Profile() {
113
+ * return (
114
+ * <HoverCard>
115
+ * <HoverCardTrigger href="/ada">@ada</HoverCardTrigger>
116
+ * <HoverCardContent class="w-80">
117
+ * <p>Ada Lovelace, 1815 to 1852.</p>
118
+ * </HoverCardContent>
119
+ * </HoverCard>
120
+ * );
121
+ * }
122
+ * @see {@link HoverCardTrigger}
123
+ * @since 1.0.0
124
+ */
125
+ function HoverCardContent(props: HoverCardContentProps): JSX.Element {
126
+ const [local, rest] = splitProps(props, ["class", "side", "align", "sideOffset"]);
127
+ return (
128
+ <HoverCardPrimitive.Portal>
129
+ <HoverCardPrimitive.Content
130
+ data-slot="hover-card-content"
131
+ side={local.side ?? "bottom"}
132
+ align={local.align ?? "center"}
133
+ sideOffset={local.sideOffset ?? 4}
134
+ class={cn(
135
+ "z-50 w-64 origin-(--primitives-transform-origin) rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
136
+ local.class,
137
+ )}
138
+ {...rest}
139
+ />
140
+ </HoverCardPrimitive.Portal>
141
+ );
142
+ }
143
+
144
+ export { HoverCard, HoverCardContent, HoverCardTrigger };
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Hover Card",
3
+ "description": "For sighted users to preview content available behind a link."
4
+ }