@journ/bloom 0.1.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 (278) hide show
  1. package/DESIGN.md +287 -0
  2. package/LICENSE +21 -0
  3. package/README.md +59 -0
  4. package/dist/accordion-parts.d.ts +9 -0
  5. package/dist/accordion-parts.js +37 -0
  6. package/dist/accordion.d.ts +10 -0
  7. package/dist/accordion.js +10 -0
  8. package/dist/alert-dialog-parts.d.ts +16 -0
  9. package/dist/alert-dialog-parts.js +33 -0
  10. package/dist/alert-dialog.d.ts +15 -0
  11. package/dist/alert-dialog.js +15 -0
  12. package/dist/alert.d.ts +48 -0
  13. package/dist/alert.js +51 -0
  14. package/dist/animated-size.d.ts +6 -0
  15. package/dist/animated-size.js +12 -0
  16. package/dist/avatar-parts.d.ts +10 -0
  17. package/dist/avatar-parts.js +20 -0
  18. package/dist/avatar.d.ts +9 -0
  19. package/dist/avatar.js +9 -0
  20. package/dist/badge.d.ts +38 -0
  21. package/dist/badge.js +22 -0
  22. package/dist/breadcrumbs.d.ts +18 -0
  23. package/dist/breadcrumbs.js +44 -0
  24. package/dist/bulk-bar.d.ts +13 -0
  25. package/dist/bulk-bar.js +27 -0
  26. package/dist/button.d.ts +40 -0
  27. package/dist/button.js +41 -0
  28. package/dist/calendar-parts.d.ts +17 -0
  29. package/dist/calendar-parts.js +90 -0
  30. package/dist/calendar.d.ts +17 -0
  31. package/dist/calendar.js +17 -0
  32. package/dist/card.d.ts +51 -0
  33. package/dist/card.js +63 -0
  34. package/dist/carousel-parts.d.ts +13 -0
  35. package/dist/carousel-parts.js +53 -0
  36. package/dist/carousel.d.ts +11 -0
  37. package/dist/carousel.js +11 -0
  38. package/dist/checkbox-parts.d.ts +8 -0
  39. package/dist/checkbox-parts.js +21 -0
  40. package/dist/checkbox.d.ts +8 -0
  41. package/dist/checkbox.js +8 -0
  42. package/dist/chip.d.ts +45 -0
  43. package/dist/chip.js +55 -0
  44. package/dist/collapsible-parts.d.ts +8 -0
  45. package/dist/collapsible-parts.js +22 -0
  46. package/dist/collapsible.d.ts +9 -0
  47. package/dist/collapsible.js +9 -0
  48. package/dist/combobox-parts.d.ts +22 -0
  49. package/dist/combobox-parts.js +54 -0
  50. package/dist/combobox.d.ts +26 -0
  51. package/dist/combobox.js +21 -0
  52. package/dist/command-palette-parts.d.ts +13 -0
  53. package/dist/command-palette-parts.js +19 -0
  54. package/dist/command-palette.d.ts +17 -0
  55. package/dist/command-palette.js +17 -0
  56. package/dist/composer.d.ts +12 -0
  57. package/dist/composer.js +21 -0
  58. package/dist/context-menu-parts.d.ts +15 -0
  59. package/dist/context-menu-parts.js +10 -0
  60. package/dist/context-menu.d.ts +20 -0
  61. package/dist/context-menu.js +13 -0
  62. package/dist/currency-input-parts.d.ts +8 -0
  63. package/dist/currency-input-parts.js +13 -0
  64. package/dist/currency-input.d.ts +8 -0
  65. package/dist/currency-input.js +8 -0
  66. package/dist/data-table-parts.d.ts +10 -0
  67. package/dist/data-table-parts.js +65 -0
  68. package/dist/data-table.d.ts +12 -0
  69. package/dist/data-table.js +12 -0
  70. package/dist/date-input-parts.d.ts +7 -0
  71. package/dist/date-input-parts.js +12 -0
  72. package/dist/date-input.d.ts +8 -0
  73. package/dist/date-input.js +8 -0
  74. package/dist/date-picker-parts.d.ts +11 -0
  75. package/dist/date-picker-parts.js +8 -0
  76. package/dist/date-picker.d.ts +20 -0
  77. package/dist/date-picker.js +15 -0
  78. package/dist/date-range-picker-parts.d.ts +11 -0
  79. package/dist/date-range-picker-parts.js +8 -0
  80. package/dist/date-range-picker.d.ts +20 -0
  81. package/dist/date-range-picker.js +15 -0
  82. package/dist/description-list.d.ts +12 -0
  83. package/dist/description-list.js +23 -0
  84. package/dist/dialog-parts.d.ts +15 -0
  85. package/dist/dialog-parts.js +32 -0
  86. package/dist/dialog.d.ts +15 -0
  87. package/dist/dialog.js +15 -0
  88. package/dist/divider.d.ts +6 -0
  89. package/dist/divider.js +12 -0
  90. package/dist/drawer-parts.d.ts +13 -0
  91. package/dist/drawer-parts.js +31 -0
  92. package/dist/drawer.d.ts +15 -0
  93. package/dist/drawer.js +15 -0
  94. package/dist/dropdown-menu-parts.d.ts +15 -0
  95. package/dist/dropdown-menu-parts.js +10 -0
  96. package/dist/dropdown-menu.d.ts +20 -0
  97. package/dist/dropdown-menu.js +13 -0
  98. package/dist/empty-state.d.ts +16 -0
  99. package/dist/empty-state.js +40 -0
  100. package/dist/field-parts.d.ts +10 -0
  101. package/dist/field-parts.js +25 -0
  102. package/dist/field.d.ts +11 -0
  103. package/dist/field.js +11 -0
  104. package/dist/file-dropzone-parts.d.ts +12 -0
  105. package/dist/file-dropzone-parts.js +32 -0
  106. package/dist/file-dropzone.d.ts +10 -0
  107. package/dist/file-dropzone.js +10 -0
  108. package/dist/heading.d.ts +31 -0
  109. package/dist/heading.js +26 -0
  110. package/dist/hover-card-parts.d.ts +8 -0
  111. package/dist/hover-card-parts.js +20 -0
  112. package/dist/hover-card.d.ts +9 -0
  113. package/dist/hover-card.js +9 -0
  114. package/dist/icon-button.d.ts +44 -0
  115. package/dist/icon-button.js +39 -0
  116. package/dist/icon.d.ts +30 -0
  117. package/dist/icon.js +27 -0
  118. package/dist/index.d.ts +96 -0
  119. package/dist/index.js +89 -0
  120. package/dist/input.d.ts +7 -0
  121. package/dist/input.js +14 -0
  122. package/dist/lib/cn.d.ts +6 -0
  123. package/dist/lib/cn.js +7 -0
  124. package/dist/lib/icon-tile.d.ts +32 -0
  125. package/dist/lib/icon-tile.js +23 -0
  126. package/dist/lib/interactive.d.ts +11 -0
  127. package/dist/lib/interactive.js +19 -0
  128. package/dist/lib/menu-parts.d.ts +25 -0
  129. package/dist/lib/menu-parts.js +41 -0
  130. package/dist/lib/modal-content.d.ts +10 -0
  131. package/dist/lib/modal-content.js +17 -0
  132. package/dist/lib/modal-parts.d.ts +7 -0
  133. package/dist/lib/modal-parts.js +15 -0
  134. package/dist/lib/overlay.d.ts +41 -0
  135. package/dist/lib/overlay.js +22 -0
  136. package/dist/lib/picker.d.ts +18 -0
  137. package/dist/lib/picker.js +25 -0
  138. package/dist/lib/text-styles.d.ts +25 -0
  139. package/dist/lib/text-styles.js +25 -0
  140. package/dist/lib/theme.d.ts +43 -0
  141. package/dist/lib/theme.js +45 -0
  142. package/dist/lib/tones.d.ts +52 -0
  143. package/dist/lib/tones.js +55 -0
  144. package/dist/lib/tv.d.ts +2 -0
  145. package/dist/lib/tv.js +2 -0
  146. package/dist/lib/use-enter.d.ts +15 -0
  147. package/dist/lib/use-enter.js +54 -0
  148. package/dist/link.d.ts +8 -0
  149. package/dist/link.js +13 -0
  150. package/dist/markdown.d.ts +10 -0
  151. package/dist/markdown.js +70 -0
  152. package/dist/message.d.ts +15 -0
  153. package/dist/message.js +25 -0
  154. package/dist/month-picker-parts.d.ts +2 -0
  155. package/dist/month-picker-parts.js +3 -0
  156. package/dist/month-picker.d.ts +15 -0
  157. package/dist/month-picker.js +15 -0
  158. package/dist/month-stepper-parts.d.ts +11 -0
  159. package/dist/month-stepper-parts.js +37 -0
  160. package/dist/month-stepper.d.ts +10 -0
  161. package/dist/month-stepper.js +10 -0
  162. package/dist/multiple-selector-parts.d.ts +18 -0
  163. package/dist/multiple-selector-parts.js +28 -0
  164. package/dist/multiple-selector.d.ts +28 -0
  165. package/dist/multiple-selector.js +23 -0
  166. package/dist/nav-bar.d.ts +10 -0
  167. package/dist/nav-bar.js +23 -0
  168. package/dist/navigation-menu-parts.d.ts +12 -0
  169. package/dist/navigation-menu-parts.js +47 -0
  170. package/dist/navigation-menu.d.ts +12 -0
  171. package/dist/navigation-menu.js +12 -0
  172. package/dist/otp-input-parts.d.ts +8 -0
  173. package/dist/otp-input-parts.js +17 -0
  174. package/dist/otp-input.d.ts +9 -0
  175. package/dist/otp-input.js +9 -0
  176. package/dist/page-header.d.ts +12 -0
  177. package/dist/page-header.js +23 -0
  178. package/dist/page.d.ts +45 -0
  179. package/dist/page.js +41 -0
  180. package/dist/pagination.d.ts +18 -0
  181. package/dist/pagination.js +49 -0
  182. package/dist/pill-select.d.ts +5 -0
  183. package/dist/pill-select.js +21 -0
  184. package/dist/popover-parts.d.ts +9 -0
  185. package/dist/popover-parts.js +21 -0
  186. package/dist/popover.d.ts +10 -0
  187. package/dist/popover.js +10 -0
  188. package/dist/portal.d.ts +2 -0
  189. package/dist/portal.js +2 -0
  190. package/dist/progress-parts.d.ts +38 -0
  191. package/dist/progress-parts.js +25 -0
  192. package/dist/progress.d.ts +8 -0
  193. package/dist/progress.js +8 -0
  194. package/dist/quantity-input-parts.d.ts +11 -0
  195. package/dist/quantity-input-parts.js +36 -0
  196. package/dist/quantity-input.d.ts +10 -0
  197. package/dist/quantity-input.js +10 -0
  198. package/dist/radio-parts.d.ts +7 -0
  199. package/dist/radio-parts.js +19 -0
  200. package/dist/radio.d.ts +8 -0
  201. package/dist/radio.js +8 -0
  202. package/dist/scroll-area-parts.d.ts +9 -0
  203. package/dist/scroll-area-parts.js +23 -0
  204. package/dist/scroll-area.d.ts +10 -0
  205. package/dist/scroll-area.js +10 -0
  206. package/dist/select-parts.d.ts +13 -0
  207. package/dist/select-parts.js +46 -0
  208. package/dist/select.d.ts +14 -0
  209. package/dist/select.js +14 -0
  210. package/dist/sheet-parts.d.ts +33 -0
  211. package/dist/sheet-parts.js +41 -0
  212. package/dist/sheet.d.ts +16 -0
  213. package/dist/sheet.js +16 -0
  214. package/dist/sidebar.d.ts +24 -0
  215. package/dist/sidebar.js +58 -0
  216. package/dist/skeleton.d.ts +5 -0
  217. package/dist/skeleton.js +11 -0
  218. package/dist/slider-parts.d.ts +9 -0
  219. package/dist/slider-parts.js +26 -0
  220. package/dist/slider.d.ts +10 -0
  221. package/dist/slider.js +10 -0
  222. package/dist/spinner.d.ts +5 -0
  223. package/dist/spinner.js +10 -0
  224. package/dist/stack-parts.d.ts +39 -0
  225. package/dist/stack-parts.js +35 -0
  226. package/dist/stack.d.ts +10 -0
  227. package/dist/stack.js +10 -0
  228. package/dist/stat.d.ts +14 -0
  229. package/dist/stat.js +29 -0
  230. package/dist/step-button.d.ts +10 -0
  231. package/dist/step-button.js +14 -0
  232. package/dist/stepper-parts.d.ts +10 -0
  233. package/dist/stepper-parts.js +33 -0
  234. package/dist/stepper.d.ts +11 -0
  235. package/dist/stepper.js +11 -0
  236. package/dist/styles.css +2 -0
  237. package/dist/switch-parts.d.ts +7 -0
  238. package/dist/switch-parts.js +19 -0
  239. package/dist/switch.d.ts +8 -0
  240. package/dist/switch.js +8 -0
  241. package/dist/table.d.ts +20 -0
  242. package/dist/table.js +48 -0
  243. package/dist/tabs-parts.d.ts +9 -0
  244. package/dist/tabs-parts.js +25 -0
  245. package/dist/tabs.d.ts +10 -0
  246. package/dist/tabs.js +10 -0
  247. package/dist/tag-input-parts.d.ts +15 -0
  248. package/dist/tag-input-parts.js +24 -0
  249. package/dist/tag-input.d.ts +10 -0
  250. package/dist/tag-input.js +10 -0
  251. package/dist/text-morph.d.ts +6 -0
  252. package/dist/text-morph.js +14 -0
  253. package/dist/text-shimmer.d.ts +9 -0
  254. package/dist/text-shimmer.js +12 -0
  255. package/dist/text.d.ts +38 -0
  256. package/dist/text.js +32 -0
  257. package/dist/textarea.d.ts +5 -0
  258. package/dist/textarea.js +12 -0
  259. package/dist/time-range-parts.d.ts +10 -0
  260. package/dist/time-range-parts.js +22 -0
  261. package/dist/time-range.d.ts +10 -0
  262. package/dist/time-range.js +10 -0
  263. package/dist/toast-parts.d.ts +11 -0
  264. package/dist/toast-parts.js +39 -0
  265. package/dist/toast.d.ts +13 -0
  266. package/dist/toast.js +12 -0
  267. package/dist/toggle-group-parts.d.ts +7 -0
  268. package/dist/toggle-group-parts.js +17 -0
  269. package/dist/toggle-group.d.ts +8 -0
  270. package/dist/toggle-group.js +8 -0
  271. package/dist/tokens.css +64 -0
  272. package/dist/tooltip-parts.d.ts +9 -0
  273. package/dist/tooltip-parts.js +21 -0
  274. package/dist/tooltip.d.ts +10 -0
  275. package/dist/tooltip.js +10 -0
  276. package/dist/touch-target.d.ts +7 -0
  277. package/dist/touch-target.js +10 -0
  278. package/package.json +71 -0
@@ -0,0 +1,20 @@
1
+ import { ComponentPropsWithRef } from "react";
2
+ //#region src/table.d.ts
3
+ declare const Root: ({ className, ...props }: ComponentPropsWithRef<'table'>) => import("react").JSX.Element;
4
+ declare const Caption: ({ className, ...props }: ComponentPropsWithRef<'caption'>) => import("react").JSX.Element;
5
+ declare const Head: ({ className, ...props }: ComponentPropsWithRef<'thead'>) => import("react").JSX.Element;
6
+ declare const Body: ({ className, ...props }: ComponentPropsWithRef<'tbody'>) => import("react").JSX.Element;
7
+ declare const Row: ({ className, ...props }: ComponentPropsWithRef<'tr'>) => import("react").JSX.Element;
8
+ declare const Header: ({ className, ...props }: ComponentPropsWithRef<'th'>) => import("react").JSX.Element;
9
+ declare const Cell: ({ className, ...props }: ComponentPropsWithRef<'td'>) => import("react").JSX.Element;
10
+ declare const Table: {
11
+ Root: typeof Root;
12
+ Caption: typeof Caption;
13
+ Head: typeof Head;
14
+ Body: typeof Body;
15
+ Row: typeof Row;
16
+ Header: typeof Header;
17
+ Cell: typeof Cell;
18
+ };
19
+ //#endregion
20
+ export { Table };
package/dist/table.js ADDED
@@ -0,0 +1,48 @@
1
+ import { cn } from "./lib/cn.js";
2
+ import { mutedText } from "./lib/text-styles.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Table as Table$1 } from "@journ/nude/table";
5
+ //#region src/table.tsx
6
+ const Root = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
7
+ "data-slot": "table-container",
8
+ className: "scrollbar-bloom w-full overflow-x-auto",
9
+ children: /* @__PURE__ */ jsx(Table$1.Root, {
10
+ ...props,
11
+ className: cn("w-full caption-bottom border-collapse text-left text-sm/6", className)
12
+ })
13
+ });
14
+ const Caption = ({ className, ...props }) => /* @__PURE__ */ jsx(Table$1.Caption, {
15
+ ...props,
16
+ className: cn("mt-4 text-left", mutedText, className)
17
+ });
18
+ const Head = ({ className, ...props }) => /* @__PURE__ */ jsx(Table$1.Head, {
19
+ ...props,
20
+ className: cn("border border-current/10", className)
21
+ });
22
+ const Body = ({ className, ...props }) => /* @__PURE__ */ jsx(Table$1.Body, {
23
+ ...props,
24
+ className: cn("border border-current/10 [&>tr:last-child]:border-b-0", className)
25
+ });
26
+ const Row = ({ className, ...props }) => /* @__PURE__ */ jsx(Table$1.Row, {
27
+ ...props,
28
+ className: cn("border-b border-current/10 hover:bg-current/5", className)
29
+ });
30
+ const Header = ({ className, ...props }) => /* @__PURE__ */ jsx(Table$1.Header, {
31
+ ...props,
32
+ className: cn("h-12 border-r border-b border-current/10 px-4 font-medium text-current/60 last:border-r-0", className)
33
+ });
34
+ const Cell = ({ className, ...props }) => /* @__PURE__ */ jsx(Table$1.Cell, {
35
+ ...props,
36
+ className: cn("border-r border-current/10 px-4 py-2 tabular-nums last:border-r-0", className)
37
+ });
38
+ const Table = {
39
+ Root,
40
+ Caption,
41
+ Head,
42
+ Body,
43
+ Row,
44
+ Header,
45
+ Cell
46
+ };
47
+ //#endregion
48
+ export { Table };
@@ -0,0 +1,9 @@
1
+ import { ComponentPropsWithRef } from "react";
2
+ import * as Nude from "@journ/nude/tabs-parts";
3
+ //#region src/tabs-parts.d.ts
4
+ declare const Root: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.Root>) => import("react").JSX.Element;
5
+ declare const List: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.List>) => import("react").JSX.Element;
6
+ declare const Trigger: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.Trigger>) => import("react").JSX.Element;
7
+ declare const Content: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.Content>) => import("react").JSX.Element;
8
+ //#endregion
9
+ export { Content, List, Root, Trigger };
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import { cn } from "./lib/cn.js";
3
+ import { pressReset } from "./lib/interactive.js";
4
+ import { controlSize, selectedWhenActive } from "./lib/text-styles.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import * as Nude from "@journ/nude/tabs-parts";
7
+ //#region src/tabs-parts.tsx
8
+ const Root = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Root, {
9
+ ...props,
10
+ className: cn("flex flex-col gap-4", className)
11
+ });
12
+ const List = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.List, {
13
+ ...props,
14
+ className: cn("flex items-center bg-current/8 p-1", className)
15
+ });
16
+ const Trigger = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Trigger, {
17
+ ...props,
18
+ className: cn(pressReset, controlSize, "flex-1 cursor-default px-3 font-medium outline-none transition-colors data-[state=inactive]:text-current/60", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-bloom-sky", selectedWhenActive, "disabled:pointer-events-none disabled:opacity-50", className)
19
+ });
20
+ const Content = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Content, {
21
+ ...props,
22
+ className: cn("outline-none focus-visible:outline-2 focus-visible:outline-bloom-sky", className)
23
+ });
24
+ //#endregion
25
+ export { Content, List, Root, Trigger };
package/dist/tabs.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { Content, List, Root, Trigger } from "./tabs-parts.js";
2
+ //#region src/tabs.d.ts
3
+ declare const Tabs: {
4
+ Root: typeof Root;
5
+ List: typeof List;
6
+ Trigger: typeof Trigger;
7
+ Content: typeof Content;
8
+ };
9
+ //#endregion
10
+ export { Tabs };
package/dist/tabs.js ADDED
@@ -0,0 +1,10 @@
1
+ import { Content, List, Root, Trigger } from "./tabs-parts.js";
2
+ //#region src/tabs.tsx
3
+ const Tabs = {
4
+ Root,
5
+ List,
6
+ Trigger,
7
+ Content
8
+ };
9
+ //#endregion
10
+ export { Tabs };
@@ -0,0 +1,15 @@
1
+ import { Chip } from "./chip.js";
2
+ import { ComponentPropsWithRef } from "react";
3
+ import * as Nude from "@journ/nude/tag-input-parts";
4
+ //#region src/tag-input-parts.d.ts
5
+ declare const useTagInput: any;
6
+ type RootProps = Nude.RootProps;
7
+ declare const Root: ({ className, ...props }: RootProps) => import("react").JSX.Element;
8
+ type TagProps = Omit<ComponentPropsWithRef<typeof Chip.Tag>, 'children' | 'onRemove'> & {
9
+ value: string;
10
+ };
11
+ declare const Tag: (props: TagProps) => import("react").JSX.Element;
12
+ declare const Tags: () => import("react").JSX.Element;
13
+ declare const Field: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.Field>) => import("react").JSX.Element;
14
+ //#endregion
15
+ export { Field, Root, type RootProps, Tag, Tags, useTagInput };
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { cn } from "./lib/cn.js";
3
+ import { Chip } from "./chip.js";
4
+ import { composerInput, composerRoot } from "./composer.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import * as Nude from "@journ/nude/tag-input-parts";
7
+ //#region src/tag-input-parts.tsx
8
+ const { useTagInput } = Nude;
9
+ const components = { Tag: Chip.Tag };
10
+ const Root = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Root, {
11
+ ...props,
12
+ className: composerRoot(cn("flex-wrap", className))
13
+ });
14
+ const Tag = (props) => /* @__PURE__ */ jsx(Nude.Tag, {
15
+ ...props,
16
+ components
17
+ });
18
+ const Tags = () => /* @__PURE__ */ jsx(Nude.Tags, { components });
19
+ const Field = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Field, {
20
+ ...props,
21
+ className: composerInput(cn("min-w-24", className))
22
+ });
23
+ //#endregion
24
+ export { Field, Root, Tag, Tags, useTagInput };
@@ -0,0 +1,10 @@
1
+ import { Field, Root, RootProps, Tag, Tags, useTagInput } from "./tag-input-parts.js";
2
+ //#region src/tag-input.d.ts
3
+ declare const TagInput: {
4
+ Root: typeof Root;
5
+ Tags: typeof Tags;
6
+ Tag: typeof Tag;
7
+ Field: typeof Field;
8
+ };
9
+ //#endregion
10
+ export { TagInput, type RootProps as TagInputProps, useTagInput };
@@ -0,0 +1,10 @@
1
+ import { Field, Root, Tag, Tags, useTagInput } from "./tag-input-parts.js";
2
+ //#region src/tag-input.tsx
3
+ const TagInput = {
4
+ Root,
5
+ Tags,
6
+ Tag,
7
+ Field
8
+ };
9
+ //#endregion
10
+ export { TagInput, useTagInput };
@@ -0,0 +1,6 @@
1
+ import { TextMorphProps as TextMorphProps$1 } from "@journ/nude/text-morph";
2
+ //#region src/text-morph.d.ts
3
+ type TextMorphProps = Omit<TextMorphProps$1, 'classNames'>;
4
+ declare const TextMorph: ({ className, ...props }: TextMorphProps) => import("react").JSX.Element;
5
+ //#endregion
6
+ export { TextMorph, type TextMorphProps };
@@ -0,0 +1,14 @@
1
+ import { cn } from "./lib/cn.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { TextMorph as TextMorph$1 } from "@journ/nude/text-morph";
4
+ //#region src/text-morph.tsx
5
+ const TextMorph = ({ className, ...props }) => /* @__PURE__ */ jsx(TextMorph$1, {
6
+ ...props,
7
+ className: cn("whitespace-pre", className),
8
+ classNames: {
9
+ label: "sr-only",
10
+ char: "inline-block whitespace-pre"
11
+ }
12
+ });
13
+ //#endregion
14
+ export { TextMorph };
@@ -0,0 +1,9 @@
1
+ import { ComponentPropsWithRef, ElementType } from "react";
2
+ //#region src/text-shimmer.d.ts
3
+ type TextShimmerProps = ComponentPropsWithRef<'span'> & {
4
+ /** The element to render, `span` by default. */
5
+ as?: ElementType;
6
+ };
7
+ declare const TextShimmer: ({ as: Component, className, ...props }: TextShimmerProps) => import("react").JSX.Element;
8
+ //#endregion
9
+ export { TextShimmer, type TextShimmerProps };
@@ -0,0 +1,12 @@
1
+ import { cn } from "./lib/cn.js";
2
+ import { shimmer } from "./lib/theme.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { TextShimmer as TextShimmer$1 } from "@journ/nude/text-shimmer";
5
+ //#region src/text-shimmer.tsx
6
+ const TextShimmer = ({ as: Component = "span", className, ...props }) => /* @__PURE__ */ jsx(TextShimmer$1, {
7
+ as: Component,
8
+ ...props,
9
+ className: cn(shimmer, "animate-bloom-shimmer bg-size-[200%_100%] bg-clip-text text-transparent motion-reduce:animate-none", className)
10
+ });
11
+ //#endregion
12
+ export { TextShimmer };
package/dist/text.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ import { VariantProps } from "./lib/tv.js";
2
+ import { ComponentPropsWithRef } from "react";
3
+ //#region src/text.d.ts
4
+ declare const text: import("tailwind-variants").TVReturnType<{
5
+ size: {
6
+ sm: "text-xs/5";
7
+ md: "text-sm/6";
8
+ lg: "text-base/7";
9
+ };
10
+ tone: {
11
+ default: "";
12
+ muted: "opacity-60";
13
+ };
14
+ }, undefined, "text-pretty", {
15
+ size: {
16
+ sm: "text-xs/5";
17
+ md: "text-sm/6";
18
+ lg: "text-base/7";
19
+ };
20
+ tone: {
21
+ default: "";
22
+ muted: "opacity-60";
23
+ };
24
+ }, undefined, import("tailwind-variants").TVReturnTypeLike<{
25
+ size: {
26
+ sm: "text-xs/5";
27
+ md: "text-sm/6";
28
+ lg: "text-base/7";
29
+ };
30
+ tone: {
31
+ default: "";
32
+ muted: "opacity-60";
33
+ };
34
+ }, undefined>>;
35
+ type TextProps = ComponentPropsWithRef<'p'> & VariantProps<typeof text>;
36
+ declare const Text: ({ size, tone, className, ...props }: TextProps) => import("react").JSX.Element;
37
+ //#endregion
38
+ export { Text, type TextProps };
package/dist/text.js ADDED
@@ -0,0 +1,32 @@
1
+ import { tv } from "./lib/tv.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { Text as Text$1 } from "@journ/nude/text";
4
+ //#region src/text.tsx
5
+ const text = tv({
6
+ base: "text-pretty",
7
+ variants: {
8
+ size: {
9
+ sm: "text-xs/5",
10
+ md: "text-sm/6",
11
+ lg: "text-base/7"
12
+ },
13
+ tone: {
14
+ default: "",
15
+ muted: "opacity-60"
16
+ }
17
+ },
18
+ defaultVariants: {
19
+ size: "md",
20
+ tone: "default"
21
+ }
22
+ });
23
+ const Text = ({ size, tone, className, ...props }) => /* @__PURE__ */ jsx(Text$1, {
24
+ ...props,
25
+ className: text({
26
+ size,
27
+ tone,
28
+ class: className
29
+ })
30
+ });
31
+ //#endregion
32
+ export { Text };
@@ -0,0 +1,5 @@
1
+ import { ComponentPropsWithRef } from "react";
2
+ //#region src/textarea.d.ts
3
+ declare const Textarea: ({ className, rows, ...props }: ComponentPropsWithRef<'textarea'>) => import("react").JSX.Element;
4
+ //#endregion
5
+ export { Textarea };
@@ -0,0 +1,12 @@
1
+ import { cn } from "./lib/cn.js";
2
+ import { field } from "./input.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Textarea as Textarea$1 } from "@journ/nude/textarea";
5
+ //#region src/textarea.tsx
6
+ const Textarea = ({ className, rows = 4, ...props }) => /* @__PURE__ */ jsx(Textarea$1, {
7
+ rows,
8
+ ...props,
9
+ className: cn(field, "resize-y", className)
10
+ });
11
+ //#endregion
12
+ export { Textarea };
@@ -0,0 +1,10 @@
1
+ import { ComponentPropsWithRef } from "react";
2
+ import * as Nude from "@journ/nude/time-range-parts";
3
+ import { RootProps, TimeRangeValue } from "@journ/nude/time-range-parts";
4
+ //#region src/time-range-parts.d.ts
5
+ declare const Root: any;
6
+ declare const Start: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.Start>) => import("react").JSX.Element;
7
+ declare const Stop: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.Stop>) => import("react").JSX.Element;
8
+ declare const Duration: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.Duration>) => import("react").JSX.Element;
9
+ //#endregion
10
+ export { Duration, Root, type RootProps, Start, Stop, type TimeRangeValue };
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { cn } from "./lib/cn.js";
3
+ import { mutedText } from "./lib/text-styles.js";
4
+ import { input } from "./input.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import * as Nude from "@journ/nude/time-range-parts";
7
+ //#region src/time-range-parts.tsx
8
+ const Root = Nude.Root;
9
+ const Start = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Start, {
10
+ ...props,
11
+ className: input(cn("tabular-nums", className))
12
+ });
13
+ const Stop = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Stop, {
14
+ ...props,
15
+ className: input(cn("tabular-nums", className))
16
+ });
17
+ const Duration = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Duration, {
18
+ ...props,
19
+ className: cn(mutedText, "tabular-nums", className)
20
+ });
21
+ //#endregion
22
+ export { Duration, Root, Start, Stop };
@@ -0,0 +1,10 @@
1
+ import { Duration, RootProps, Start, Stop, TimeRangeValue } from "./time-range-parts.js";
2
+ //#region src/time-range.d.ts
3
+ declare const TimeRange: {
4
+ Root: any;
5
+ Start: typeof Start;
6
+ Stop: typeof Stop;
7
+ Duration: typeof Duration;
8
+ };
9
+ //#endregion
10
+ export { TimeRange, type RootProps as TimeRangeProps, type TimeRangeValue };
@@ -0,0 +1,10 @@
1
+ import { Duration, Root, Start, Stop } from "./time-range-parts.js";
2
+ //#region src/time-range.tsx
3
+ const TimeRange = {
4
+ Root,
5
+ Start,
6
+ Stop,
7
+ Duration
8
+ };
9
+ //#endregion
10
+ export { TimeRange };
@@ -0,0 +1,11 @@
1
+ import { ComponentPropsWithRef } from "react";
2
+ import * as Nude from "@journ/nude/toast-parts";
3
+ //#region src/toast-parts.d.ts
4
+ declare const Provider: (props: ComponentPropsWithRef<typeof Nude.Provider>) => import("react").JSX.Element;
5
+ declare const show: typeof Nude.show;
6
+ declare const Root: ({ className, ...props }: ComponentPropsWithRef<'div'>) => import("react").JSX.Element;
7
+ declare const Title: ({ className, ...props }: ComponentPropsWithRef<'p'>) => import("react").JSX.Element;
8
+ declare const Description: ({ className, ...props }: ComponentPropsWithRef<'p'>) => import("react").JSX.Element;
9
+ declare const Action: ({ className, ...props }: ComponentPropsWithRef<'button'>) => import("react").JSX.Element;
10
+ //#endregion
11
+ export { Action, Description, Provider, Root, Title, show };
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import { cn } from "./lib/cn.js";
3
+ import { displayLabel } from "./lib/text-styles.js";
4
+ import { line, raised } from "./lib/theme.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import * as Nude from "@journ/nude/toast-parts";
7
+ //#region src/toast-parts.tsx
8
+ const outlinedAction = `border ${line} bg-transparent h-8 shrink-0 px-3 text-sm font-medium whitespace-nowrap`;
9
+ const Provider = (props) => /* @__PURE__ */ jsx(Nude.Provider, {
10
+ position: "top-center",
11
+ ...props,
12
+ toastOptions: { classNames: {
13
+ toast: `${raised} flex w-full max-w-sm items-center gap-3 rounded-bloom p-5 shadow-md`,
14
+ title: displayLabel,
15
+ description: "text-xs/5 opacity-60",
16
+ actionButton: `${outlinedAction} ml-auto`,
17
+ cancelButton: outlinedAction
18
+ } }
19
+ });
20
+ const show = Nude.show;
21
+ const Root = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Root, {
22
+ ...props,
23
+ className: cn(raised, "flex w-full max-w-sm items-center gap-3 rounded-bloom p-5 shadow-md", className)
24
+ });
25
+ const Title = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Title, {
26
+ ...props,
27
+ className: cn(displayLabel, className)
28
+ });
29
+ const Description = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Description, {
30
+ ...props,
31
+ className: cn("text-xs/5 opacity-60", className)
32
+ });
33
+ const Action = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Action, {
34
+ type: "button",
35
+ ...props,
36
+ className: cn(outlinedAction, "ml-auto", className)
37
+ });
38
+ //#endregion
39
+ export { Action, Description, Provider, Root, Title, show };
@@ -0,0 +1,13 @@
1
+ import { Action, Description, Provider, Root, Title, show } from "./toast-parts.js";
2
+ //#region src/toast.d.ts
3
+ type ToastParts = {
4
+ Provider: typeof Provider;
5
+ show: typeof show;
6
+ Root: typeof Root;
7
+ Title: typeof Title;
8
+ Description: typeof Description;
9
+ Action: typeof Action;
10
+ };
11
+ declare const Toast: ToastParts;
12
+ //#endregion
13
+ export { Toast };
package/dist/toast.js ADDED
@@ -0,0 +1,12 @@
1
+ import { Action, Description, Provider, Root, Title, show } from "./toast-parts.js";
2
+ //#region src/toast.tsx
3
+ const Toast = {
4
+ Provider,
5
+ show,
6
+ Root,
7
+ Title,
8
+ Description,
9
+ Action
10
+ };
11
+ //#endregion
12
+ export { Toast };
@@ -0,0 +1,7 @@
1
+ import { ComponentPropsWithRef } from "react";
2
+ import * as Nude from "@journ/nude/toggle-group-parts";
3
+ //#region src/toggle-group-parts.d.ts
4
+ declare const Root: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.Root>) => import("react").JSX.Element;
5
+ declare const Item: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.Item>) => import("react").JSX.Element;
6
+ //#endregion
7
+ export { Item, Root };
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { cn } from "./lib/cn.js";
3
+ import { pressReset } from "./lib/interactive.js";
4
+ import { controlSize, selectedWhenOn } from "./lib/text-styles.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import * as Nude from "@journ/nude/toggle-group-parts";
7
+ //#region src/toggle-group-parts.tsx
8
+ const Root = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Root, {
9
+ ...props,
10
+ className: cn("inline-flex items-center bg-current/8 p-1", className)
11
+ });
12
+ const Item = ({ className, ...props }) => /* @__PURE__ */ jsx(Nude.Item, {
13
+ ...props,
14
+ className: cn(pressReset, controlSize, "inline-flex cursor-default items-center justify-center gap-1.5 px-3 font-medium outline-none transition-colors data-[state=off]:text-current/60", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-bloom-sky [&>svg]:size-4", selectedWhenOn, "disabled:pointer-events-none disabled:opacity-50", className)
15
+ });
16
+ //#endregion
17
+ export { Item, Root };
@@ -0,0 +1,8 @@
1
+ import { Item, Root } from "./toggle-group-parts.js";
2
+ //#region src/toggle-group.d.ts
3
+ declare const ToggleGroup: {
4
+ Root: typeof Root;
5
+ Item: typeof Item;
6
+ };
7
+ //#endregion
8
+ export { ToggleGroup };
@@ -0,0 +1,8 @@
1
+ import { Item, Root } from "./toggle-group-parts.js";
2
+ //#region src/toggle-group.tsx
3
+ const ToggleGroup = {
4
+ Root,
5
+ Item
6
+ };
7
+ //#endregion
8
+ export { ToggleGroup };
@@ -0,0 +1,64 @@
1
+ /*
2
+ * Design tokens. Override any of them in your own @theme block, imported after
3
+ * this file. Theme roles come in pairs: `--color-bloom-canvas` is the light
4
+ * value and `--color-bloom-canvas-dark` the dark one. Components pair them with
5
+ * Tailwind's `dark:` variant. Without a class it follows the OS; put `.light`
6
+ * or `.dark` on <html> (or any ancestor) to force a theme.
7
+ */
8
+
9
+ /* `dark:` follows the OS unless `.light` is set, and always applies under `.dark`. */
10
+ @custom-variant dark {
11
+ &:where(.dark, .dark *) {
12
+ @slot;
13
+ }
14
+ @media (prefers-color-scheme: dark) {
15
+ &:where(:not(.light, .light *)) {
16
+ @slot;
17
+ }
18
+ }
19
+ }
20
+ @theme {
21
+ /* Palette: the same in both themes. Status colors, used as tints far more than as fills. */
22
+ --color-bloom-ink: oklch(16% 0 0);
23
+ --color-bloom-paper: oklch(98.5% 0 0);
24
+ --color-bloom-coral: oklch(65% 0.24 26);
25
+ --color-bloom-yellow: oklch(87% 0.17 92);
26
+ --color-bloom-indigo: oklch(62% 0.19 275);
27
+ --color-bloom-mint: oklch(74% 0.21 152);
28
+ --color-bloom-sky: oklch(70% 0.15 245);
29
+
30
+ /* Roles, light. */
31
+ --color-bloom-canvas: oklch(100% 0 0);
32
+ --color-bloom-surface: oklch(100% 0 0);
33
+ --color-bloom-foreground: oklch(18% 0 0);
34
+ --color-bloom-accent: oklch(52% 0.13 75);
35
+ --color-bloom-line: oklch(88.5% 0.004 95);
36
+
37
+ /* Roles, dark. */
38
+ --color-bloom-canvas-dark: oklch(16% 0 0);
39
+ --color-bloom-surface-dark: oklch(16% 0 0);
40
+ --color-bloom-foreground-dark: oklch(98.5% 0 0);
41
+ --color-bloom-accent-dark: oklch(87% 0.17 92);
42
+ --color-bloom-line-dark: oklch(22.6% 0 0);
43
+
44
+ --font-bloom-display: 'Hedvig Letters Sans', ui-sans-serif, system-ui, sans-serif;
45
+
46
+ --radius-bloom: 0rem;
47
+
48
+ --animate-bloom-shimmer: bloom-shimmer 2.2s linear infinite;
49
+
50
+ @keyframes bloom-shimmer {
51
+ from {
52
+ background-position: 100% 0;
53
+ }
54
+ to {
55
+ background-position: -100% 0;
56
+ }
57
+ }
58
+ }
59
+
60
+ /* Thin, quiet scrollbar for native scroll containers. Thumb follows the text color. */
61
+ @utility scrollbar-bloom {
62
+ scrollbar-width: thin;
63
+ scrollbar-color: color-mix(in oklab, currentColor 30%, transparent) transparent;
64
+ }
@@ -0,0 +1,9 @@
1
+ import { ComponentPropsWithRef } from "react";
2
+ import * as Nude from "@journ/nude/tooltip-parts";
3
+ //#region src/tooltip-parts.d.ts
4
+ declare const Provider: any;
5
+ declare const Root: any;
6
+ declare const Trigger: any;
7
+ declare const Content: ({ className, ...props }: ComponentPropsWithRef<typeof Nude.Content>) => import("react").JSX.Element;
8
+ //#endregion
9
+ export { Content, Provider, Root, Trigger };
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { cn } from "./lib/cn.js";
3
+ import { useDropEnter } from "./lib/use-enter.js";
4
+ import { raised } from "./lib/theme.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import * as Nude from "@journ/nude/tooltip-parts";
7
+ //#region src/tooltip-parts.tsx
8
+ const Provider = Nude.Provider;
9
+ const Root = Nude.Root;
10
+ const Trigger = Nude.Trigger;
11
+ const Content = ({ className, ...props }) => {
12
+ const panel = useDropEnter();
13
+ return /* @__PURE__ */ jsx(Nude.Content, {
14
+ ref: panel,
15
+ sideOffset: 8,
16
+ ...props,
17
+ className: cn(raised, "z-50 max-w-60 px-3 py-1.5 text-sm/5 shadow-md", className)
18
+ });
19
+ };
20
+ //#endregion
21
+ export { Content, Provider, Root, Trigger };
@@ -0,0 +1,10 @@
1
+ import { Content } from "./tooltip-parts.js";
2
+ //#region src/tooltip.d.ts
3
+ declare const Tooltip: {
4
+ Provider: any;
5
+ Root: any;
6
+ Trigger: any;
7
+ Content: typeof Content;
8
+ };
9
+ //#endregion
10
+ export { Tooltip };
@@ -0,0 +1,10 @@
1
+ import { Content, Provider, Root, Trigger } from "./tooltip-parts.js";
2
+ //#region src/tooltip.tsx
3
+ const Tooltip = {
4
+ Provider,
5
+ Root,
6
+ Trigger,
7
+ Content
8
+ };
9
+ //#endregion
10
+ export { Tooltip };
@@ -0,0 +1,7 @@
1
+ //#region src/touch-target.d.ts
2
+ /** Grows the hit area to at least 44x44px on touch devices without changing layout. */
3
+ declare const TouchTarget: ({ children }: {
4
+ children?: React.ReactNode;
5
+ }) => import("react").JSX.Element;
6
+ //#endregion
7
+ export { TouchTarget };