@franco_roura/module-01 0.0.0-stage → 1.0.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 (222) hide show
  1. package/LICENSE-APACHE +202 -0
  2. package/LICENSE-MIT +21 -0
  3. package/README.md +64 -2
  4. package/dist/charts.d.ts +3 -0
  5. package/dist/charts.js +3 -0
  6. package/dist/components/alert-dialog.d.ts +19 -0
  7. package/dist/components/alert-dialog.js +101 -0
  8. package/dist/components/alert-dialog.js.map +1 -0
  9. package/dist/components/amount.d.ts +24 -0
  10. package/dist/components/amount.js +27 -0
  11. package/dist/components/amount.js.map +1 -0
  12. package/dist/components/appearance-pickers.d.ts +9 -0
  13. package/dist/components/appearance-pickers.js +65 -0
  14. package/dist/components/appearance-pickers.js.map +1 -0
  15. package/dist/components/badge.d.ts +10 -0
  16. package/dist/components/badge.js +28 -0
  17. package/dist/components/badge.js.map +1 -0
  18. package/dist/components/budget-meter.d.ts +18 -0
  19. package/dist/components/budget-meter.js +38 -0
  20. package/dist/components/budget-meter.js.map +1 -0
  21. package/dist/components/button.d.ts +13 -0
  22. package/dist/components/button.js +54 -0
  23. package/dist/components/button.js.map +1 -0
  24. package/dist/components/calendar.d.ts +7 -0
  25. package/dist/components/calendar.js +52 -0
  26. package/dist/components/calendar.js.map +1 -0
  27. package/dist/components/category-icon.d.ts +33 -0
  28. package/dist/components/category-icon.js +49 -0
  29. package/dist/components/category-icon.js.map +1 -0
  30. package/dist/components/chart.d.ts +44 -0
  31. package/dist/components/chart.js +147 -0
  32. package/dist/components/chart.js.map +1 -0
  33. package/dist/components/charts.d.ts +52 -0
  34. package/dist/components/charts.js +482 -0
  35. package/dist/components/charts.js.map +1 -0
  36. package/dist/components/checkbox.d.ts +5 -0
  37. package/dist/components/checkbox.js +21 -0
  38. package/dist/components/checkbox.js.map +1 -0
  39. package/dist/components/combobox.d.ts +32 -0
  40. package/dist/components/combobox.js +100 -0
  41. package/dist/components/combobox.js.map +1 -0
  42. package/dist/components/command.d.ts +19 -0
  43. package/dist/components/command.js +86 -0
  44. package/dist/components/command.js.map +1 -0
  45. package/dist/components/cta-banner.d.ts +14 -0
  46. package/dist/components/cta-banner.js +39 -0
  47. package/dist/components/cta-banner.js.map +1 -0
  48. package/dist/components/date-picker.d.ts +19 -0
  49. package/dist/components/date-picker.js +107 -0
  50. package/dist/components/date-picker.js.map +1 -0
  51. package/dist/components/dialog.d.ts +18 -0
  52. package/dist/components/dialog.js +99 -0
  53. package/dist/components/dialog.js.map +1 -0
  54. package/dist/components/dropdown-menu.d.ts +26 -0
  55. package/dist/components/dropdown-menu.js +123 -0
  56. package/dist/components/dropdown-menu.js.map +1 -0
  57. package/dist/components/field.d.ts +30 -0
  58. package/dist/components/field.js +53 -0
  59. package/dist/components/field.js.map +1 -0
  60. package/dist/components/footer.d.ts +18 -0
  61. package/dist/components/footer.js +40 -0
  62. package/dist/components/footer.js.map +1 -0
  63. package/dist/components/fx-converter.d.ts +22 -0
  64. package/dist/components/fx-converter.js +91 -0
  65. package/dist/components/fx-converter.js.map +1 -0
  66. package/dist/components/hero.d.ts +28 -0
  67. package/dist/components/hero.js +83 -0
  68. package/dist/components/hero.js.map +1 -0
  69. package/dist/components/hud.d.ts +41 -0
  70. package/dist/components/hud.js +108 -0
  71. package/dist/components/hud.js.map +1 -0
  72. package/dist/components/input.d.ts +4 -0
  73. package/dist/components/input.js +14 -0
  74. package/dist/components/input.js.map +1 -0
  75. package/dist/components/label.d.ts +5 -0
  76. package/dist/components/label.js +15 -0
  77. package/dist/components/label.js.map +1 -0
  78. package/dist/components/media-card.d.ts +29 -0
  79. package/dist/components/media-card.js +80 -0
  80. package/dist/components/media-card.js.map +1 -0
  81. package/dist/components/money-input.d.ts +10 -0
  82. package/dist/components/money-input.js +30 -0
  83. package/dist/components/money-input.js.map +1 -0
  84. package/dist/components/multi-combobox.d.ts +27 -0
  85. package/dist/components/multi-combobox.js +101 -0
  86. package/dist/components/multi-combobox.js.map +1 -0
  87. package/dist/components/nav-bar.d.ts +21 -0
  88. package/dist/components/nav-bar.js +44 -0
  89. package/dist/components/nav-bar.js.map +1 -0
  90. package/dist/components/panel.d.ts +27 -0
  91. package/dist/components/panel.js +49 -0
  92. package/dist/components/panel.js.map +1 -0
  93. package/dist/components/popover.d.ts +11 -0
  94. package/dist/components/popover.js +56 -0
  95. package/dist/components/popover.js.map +1 -0
  96. package/dist/components/select.d.ts +16 -0
  97. package/dist/components/select.js +128 -0
  98. package/dist/components/select.js.map +1 -0
  99. package/dist/components/separator.d.ts +5 -0
  100. package/dist/components/separator.js +17 -0
  101. package/dist/components/separator.js.map +1 -0
  102. package/dist/components/sheet.d.ts +15 -0
  103. package/dist/components/sheet.js +87 -0
  104. package/dist/components/sheet.js.map +1 -0
  105. package/dist/components/skeleton.d.ts +3 -0
  106. package/dist/components/skeleton.js +13 -0
  107. package/dist/components/skeleton.js.map +1 -0
  108. package/dist/components/sonner.d.ts +5 -0
  109. package/dist/components/sonner.js +44 -0
  110. package/dist/components/sonner.js.map +1 -0
  111. package/dist/components/spec-readout.d.ts +11 -0
  112. package/dist/components/spec-readout.js +25 -0
  113. package/dist/components/spec-readout.js.map +1 -0
  114. package/dist/components/split-flap.d.ts +12 -0
  115. package/dist/components/split-flap.js +77 -0
  116. package/dist/components/split-flap.js.map +1 -0
  117. package/dist/components/tabs.d.ts +12 -0
  118. package/dist/components/tabs.js +47 -0
  119. package/dist/components/tabs.js.map +1 -0
  120. package/dist/components/tag.d.ts +16 -0
  121. package/dist/components/tag.js +26 -0
  122. package/dist/components/tag.js.map +1 -0
  123. package/dist/components/terminal.d.ts +10 -0
  124. package/dist/components/terminal.js +20 -0
  125. package/dist/components/terminal.js.map +1 -0
  126. package/dist/components/textarea.d.ts +4 -0
  127. package/dist/components/textarea.js +13 -0
  128. package/dist/components/textarea.js.map +1 -0
  129. package/dist/components/timeline-entry.d.ts +26 -0
  130. package/dist/components/timeline-entry.js +63 -0
  131. package/dist/components/timeline-entry.js.map +1 -0
  132. package/dist/components/toggle-group.d.ts +10 -0
  133. package/dist/components/toggle-group.js +49 -0
  134. package/dist/components/toggle-group.js.map +1 -0
  135. package/dist/components/toggle.d.ts +10 -0
  136. package/dist/components/toggle.js +37 -0
  137. package/dist/components/toggle.js.map +1 -0
  138. package/dist/components/tooltip.d.ts +8 -0
  139. package/dist/components/tooltip.js +36 -0
  140. package/dist/components/tooltip.js.map +1 -0
  141. package/dist/finance.d.ts +10 -0
  142. package/dist/finance.js +10 -0
  143. package/dist/index.d.ts +33 -0
  144. package/dist/index.js +33 -0
  145. package/dist/lib/category-icons.d.ts +80 -0
  146. package/dist/lib/category-icons.js +102 -0
  147. package/dist/lib/category-icons.js.map +1 -0
  148. package/dist/lib/fault.d.ts +7 -0
  149. package/dist/lib/fault.js +28 -0
  150. package/dist/lib/fault.js.map +1 -0
  151. package/dist/lib/form-flow.d.ts +15 -0
  152. package/dist/lib/form-flow.js +50 -0
  153. package/dist/lib/form-flow.js.map +1 -0
  154. package/dist/lib/fx.d.ts +39 -0
  155. package/dist/lib/fx.js +98 -0
  156. package/dist/lib/fx.js.map +1 -0
  157. package/dist/lib/money.d.ts +19 -0
  158. package/dist/lib/money.js +55 -0
  159. package/dist/lib/money.js.map +1 -0
  160. package/dist/lib/use-media-query.d.ts +3 -0
  161. package/dist/lib/use-media-query.js +15 -0
  162. package/dist/lib/use-media-query.js.map +1 -0
  163. package/dist/lib/utils.d.ts +3 -0
  164. package/dist/lib/utils.js +26 -0
  165. package/dist/lib/utils.js.map +1 -0
  166. package/dist/site.d.ts +10 -0
  167. package/dist/site.js +10 -0
  168. package/dist/styles.css +2 -0
  169. package/dist/theme.css +391 -0
  170. package/dist/tokens.css +181 -0
  171. package/guidelines/AlertDialog.md +9 -0
  172. package/guidelines/Amount.md +10 -0
  173. package/guidelines/AppearancePickers.md +8 -0
  174. package/guidelines/Badge.md +11 -0
  175. package/guidelines/BudgetMeter.md +11 -0
  176. package/guidelines/Button.md +16 -0
  177. package/guidelines/Calendar.md +8 -0
  178. package/guidelines/CategoryIcon.md +10 -0
  179. package/guidelines/Charts.md +12 -0
  180. package/guidelines/Checkbox.md +8 -0
  181. package/guidelines/Combobox.md +18 -0
  182. package/guidelines/Command.md +8 -0
  183. package/guidelines/Crosshair.md +7 -0
  184. package/guidelines/CtaBanner.md +8 -0
  185. package/guidelines/DatePicker.md +11 -0
  186. package/guidelines/Dialog.md +9 -0
  187. package/guidelines/DropdownMenu.md +9 -0
  188. package/guidelines/Field.md +22 -0
  189. package/guidelines/Footer.md +7 -0
  190. package/guidelines/FxConverter.md +12 -0
  191. package/guidelines/GlassPanel.md +8 -0
  192. package/guidelines/Grill.md +7 -0
  193. package/guidelines/Hero.md +9 -0
  194. package/guidelines/HudLabel.md +8 -0
  195. package/guidelines/Input.md +9 -0
  196. package/guidelines/Label.md +7 -0
  197. package/guidelines/MediaCard.md +8 -0
  198. package/guidelines/MoneyInput.md +10 -0
  199. package/guidelines/MultiCombobox.md +11 -0
  200. package/guidelines/NavBar.md +10 -0
  201. package/guidelines/Panel.md +10 -0
  202. package/guidelines/Popover.md +8 -0
  203. package/guidelines/README.md +100 -0
  204. package/guidelines/SectionHeader.md +9 -0
  205. package/guidelines/Select.md +9 -0
  206. package/guidelines/Separator.md +8 -0
  207. package/guidelines/Sheet.md +9 -0
  208. package/guidelines/Skeleton.md +8 -0
  209. package/guidelines/SpecReadout.md +7 -0
  210. package/guidelines/SplitFlap.md +9 -0
  211. package/guidelines/StatusLed.md +8 -0
  212. package/guidelines/Tabs.md +9 -0
  213. package/guidelines/Tag.md +9 -0
  214. package/guidelines/Terminal.md +7 -0
  215. package/guidelines/Textarea.md +8 -0
  216. package/guidelines/TickRuler.md +8 -0
  217. package/guidelines/TimelineEntry.md +8 -0
  218. package/guidelines/Toaster.md +9 -0
  219. package/guidelines/Toggle.md +9 -0
  220. package/guidelines/Tooltip.md +8 -0
  221. package/package.json +103 -4
  222. package/tokens/tokens.json +739 -0
@@ -0,0 +1,77 @@
1
+ "use client";
2
+ import { cn } from "../lib/utils.js";
3
+ import { useMediaQuery } from "../lib/use-media-query.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { useEffect, useRef, useState } from "react";
6
+ // src/components/split-flap.tsx
7
+ const CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-·/";
8
+ const STEP_MS = 35;
9
+ const STAGGER_MS = 20;
10
+ const randomChar = () => CHARSET[Math.floor(Math.random() * 39)] ?? "";
11
+ /**
12
+ * Characters flip through random glyphs before landing, like a station departure board.
13
+ * Screen readers get the final text only, and reduced motion skips the flipping.
14
+ */
15
+ function SplitFlap({ text, start = true, className }) {
16
+ const reducedMotion = useMediaQuery("(prefers-reduced-motion: reduce)");
17
+ const [display, setDisplay] = useState(text);
18
+ const shown = useRef(null);
19
+ useEffect(() => {
20
+ if (!start || shown.current === text) return;
21
+ const from = shown.current;
22
+ shown.current = text;
23
+ if (reducedMotion) {
24
+ setDisplay(text);
25
+ return;
26
+ }
27
+ const length = Math.max(text.length, from?.length ?? 0);
28
+ const flips = Array.from({ length }, () => 4 + Math.floor(Math.random() * 5));
29
+ const begin = performance.now();
30
+ let frame = 0;
31
+ let lastStep = -1;
32
+ const tick = (now) => {
33
+ const elapsed = now - begin;
34
+ const step = Math.floor(elapsed / STEP_MS);
35
+ if (step !== lastStep) {
36
+ lastStep = step;
37
+ let done = true;
38
+ let next = "";
39
+ for (let index = 0; index < length; index++) {
40
+ const target = text[index] ?? "";
41
+ const settled = elapsed >= index * STAGGER_MS + (flips[index] ?? 0) * STEP_MS;
42
+ const unchanged = from !== null && from[index] === target;
43
+ if (settled || unchanged || target === " ") next += target;
44
+ else {
45
+ next += randomChar();
46
+ done = false;
47
+ }
48
+ }
49
+ setDisplay(next);
50
+ if (done) return;
51
+ }
52
+ frame = requestAnimationFrame(tick);
53
+ };
54
+ frame = requestAnimationFrame(tick);
55
+ return () => {
56
+ cancelAnimationFrame(frame);
57
+ setDisplay(text);
58
+ };
59
+ }, [
60
+ text,
61
+ start,
62
+ reducedMotion
63
+ ]);
64
+ return /* @__PURE__ */ jsxs("span", {
65
+ className: cn("whitespace-pre", className),
66
+ children: [/* @__PURE__ */ jsx("span", {
67
+ "aria-hidden": true,
68
+ children: display
69
+ }), /* @__PURE__ */ jsx("span", {
70
+ className: "sr-only",
71
+ children: text
72
+ })]
73
+ });
74
+ }
75
+ export { SplitFlap };
76
+
77
+ //# sourceMappingURL=split-flap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-flap.js","names":[],"sources":["../../src/components/split-flap.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useMediaQuery } from \"../lib/use-media-query\";\n\nconst CHARSET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-·/\";\nconst STEP_MS = 35;\nconst STAGGER_MS = 20;\n\nconst randomChar = () => CHARSET[Math.floor(Math.random() * CHARSET.length)] ?? \"\";\n\nexport type SplitFlapProps = {\n text: string;\n /** Flaps whenever `text` changes; with `start` it also waits for the first true (in view). */\n start?: boolean;\n className?: string;\n};\n\n/**\n * Characters flip through random glyphs before landing, like a station departure board.\n * Screen readers get the final text only, and reduced motion skips the flipping.\n */\nexport function SplitFlap({ text, start = true, className }: SplitFlapProps) {\n const reducedMotion = useMediaQuery(\"(prefers-reduced-motion: reduce)\");\n const [display, setDisplay] = useState(text);\n const shown = useRef<string | null>(null);\n\n useEffect(() => {\n if (!start || shown.current === text) return;\n const from = shown.current;\n shown.current = text;\n if (reducedMotion) {\n setDisplay(text);\n return;\n }\n\n const length = Math.max(text.length, from?.length ?? 0);\n const flips = Array.from({ length }, () => 4 + Math.floor(Math.random() * 5));\n const begin = performance.now();\n let frame = 0;\n let lastStep = -1;\n\n const tick = (now: number) => {\n const elapsed = now - begin;\n const step = Math.floor(elapsed / STEP_MS);\n if (step !== lastStep) {\n lastStep = step;\n let done = true;\n let next = \"\";\n for (let index = 0; index < length; index++) {\n const target = text[index] ?? \"\";\n const settled = elapsed >= index * STAGGER_MS + (flips[index] ?? 0) * STEP_MS;\n const unchanged = from !== null && from[index] === target;\n if (settled || unchanged || target === \" \") next += target;\n else {\n next += randomChar();\n done = false;\n }\n }\n setDisplay(next);\n if (done) return;\n }\n frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n return () => {\n cancelAnimationFrame(frame);\n setDisplay(text);\n };\n }, [text, start, reducedMotion]);\n\n return (\n <span className={cn(\"whitespace-pre\", className)}>\n <span aria-hidden>{display}</span>\n <span className=\"sr-only\">{text}</span>\n </span>\n );\n}\n"],"mappings":";;;;;;AAMA,MAAM,UAAU;AAChB,MAAM,UAAU;AAChB,MAAM,aAAa;AAEnB,MAAM,mBAAmB,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,EAAc,MAAM;;;;;AAahF,SAAgB,UAAU,EAAE,MAAM,QAAQ,MAAM,aAA6B;CAC3E,MAAM,gBAAgB,cAAc,kCAAkC;CACtE,MAAM,CAAC,SAAS,cAAc,SAAS,IAAI;CAC3C,MAAM,QAAQ,OAAsB,IAAI;CAExC,gBAAgB;EACd,IAAI,CAAC,SAAS,MAAM,YAAY,MAAM;EACtC,MAAM,OAAO,MAAM;EACnB,MAAM,UAAU;EAChB,IAAI,eAAe;GACjB,WAAW,IAAI;GACf;EACF;EAEA,MAAM,SAAS,KAAK,IAAI,KAAK,QAAQ,MAAM,UAAU,CAAC;EACtD,MAAM,QAAQ,MAAM,KAAK,EAAE,OAAO,SAAS,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC;EAC5E,MAAM,QAAQ,YAAY,IAAI;EAC9B,IAAI,QAAQ;EACZ,IAAI,WAAW;EAEf,MAAM,QAAQ,QAAgB;GAC5B,MAAM,UAAU,MAAM;GACtB,MAAM,OAAO,KAAK,MAAM,UAAU,OAAO;GACzC,IAAI,SAAS,UAAU;IACrB,WAAW;IACX,IAAI,OAAO;IACX,IAAI,OAAO;IACX,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,SAAS;KAC3C,MAAM,SAAS,KAAK,UAAU;KAC9B,MAAM,UAAU,WAAW,QAAQ,cAAc,MAAM,UAAU,KAAK;KACtE,MAAM,YAAY,SAAS,QAAQ,KAAK,WAAW;KACnD,IAAI,WAAW,aAAa,WAAW,KAAK,QAAQ;UAC/C;MACH,QAAQ,WAAW;MACnB,OAAO;KACT;IACF;IACA,WAAW,IAAI;IACf,IAAI,MAAM;GACZ;GACA,QAAQ,sBAAsB,IAAI;EACpC;EACA,QAAQ,sBAAsB,IAAI;EAClC,aAAa;GACX,qBAAqB,KAAK;GAC1B,WAAW,IAAI;EACjB;CACF,GAAG;EAAC;EAAM;EAAO;CAAa,CAAC;CAE/B,OACE,qBAAC,QAAD;EAAM,WAAW,GAAG,kBAAkB,SAAS;EAA/C,UAAA,CACE,oBAAC,QAAD;GAAM,eAAA;GAAa,UAAA;EAAc,CAAA,GACjC,oBAAC,QAAD;GAAM,WAAU;GAAW,UAAA;EAAW,CAAA,CAClC;;AAEV"}
@@ -0,0 +1,12 @@
1
+ import { VariantProps } from "class-variance-authority";
2
+ import { Tabs } from "radix-ui";
3
+ import * as React from "react";
4
+ declare function Tabs$1({ className, orientation, ...props }: React.ComponentProps<typeof Tabs.Root>): React.JSX.Element;
5
+ declare const tabsListVariants: (props?: ({
6
+ variant?: "default" | "line" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ declare function TabsList({ className, variant, ...props }: React.ComponentProps<typeof Tabs.List> & VariantProps<typeof tabsListVariants>): React.JSX.Element;
9
+ declare function TabsTrigger({ className, ...props }: React.ComponentProps<typeof Tabs.Trigger>): React.JSX.Element;
10
+ declare function TabsContent({ className, ...props }: React.ComponentProps<typeof Tabs.Content>): React.JSX.Element;
11
+ export { Tabs$1 as Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants };
12
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1,47 @@
1
+ "use client";
2
+ import { cn } from "../lib/utils.js";
3
+ import { cva } from "class-variance-authority";
4
+ import { Tabs } from "radix-ui";
5
+ import { jsx } from "react/jsx-runtime";
6
+ // src/components/tabs.tsx
7
+ function Tabs$1({ className, orientation = "horizontal", ...props }) {
8
+ return /* @__PURE__ */ jsx(Tabs.Root, {
9
+ "data-slot": "tabs",
10
+ "data-orientation": orientation,
11
+ orientation,
12
+ className: cn("group/tabs flex gap-2 data-[orientation=horizontal]:flex-col", className),
13
+ ...props
14
+ });
15
+ }
16
+ const tabsListVariants = cva("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none", {
17
+ variants: { variant: {
18
+ default: "bg-muted",
19
+ line: "gap-1 bg-transparent"
20
+ } },
21
+ defaultVariants: { variant: "default" }
22
+ });
23
+ function TabsList({ className, variant = "default", ...props }) {
24
+ return /* @__PURE__ */ jsx(Tabs.List, {
25
+ "data-slot": "tabs-list",
26
+ "data-variant": variant,
27
+ className: cn(tabsListVariants({ variant }), className),
28
+ ...props
29
+ });
30
+ }
31
+ function TabsTrigger({ className, ...props }) {
32
+ return /* @__PURE__ */ jsx(Tabs.Trigger, {
33
+ "data-slot": "tabs-trigger",
34
+ className: cn("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-mold group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent", "data-[state=active]:bg-background data-[state=active]:text-foreground", "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100", className),
35
+ ...props
36
+ });
37
+ }
38
+ function TabsContent({ className, ...props }) {
39
+ return /* @__PURE__ */ jsx(Tabs.Content, {
40
+ "data-slot": "tabs-content",
41
+ className: cn("flex-1 outline-none", className),
42
+ ...props
43
+ });
44
+ }
45
+ export { Tabs$1 as Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants };
46
+
47
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","names":["Tabs","TabsPrimitive"],"sources":["../../src/components/tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Tabs as TabsPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\"group/tabs flex gap-2 data-[orientation=horizontal]:flex-col\", className)}\n {...props}\n />\n );\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-mold group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent\",\n \"data-[state=active]:bg-background data-[state=active]:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 outline-none\", className)}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants };\n"],"mappings":";;;;;;AAOA,SAASA,OAAK,EACZ,WACA,cAAc,cACd,GAAG,SAC+C;CAClD,OACE,oBAACC,KAAc,MAAf;EACE,aAAU;EACV,oBAAkB;EACL;EACb,WAAW,GAAG,gEAAgE,SAAS;EACvF,GAAI;CACL,CAAA;AAEL;AAEA,MAAM,mBAAmB,IACvB,qRACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,MAAM;CACR,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;AAEA,SAAS,SAAS,EAChB,WACA,UAAU,WACV,GAAG,SACuF;CAC1F,OACE,oBAACA,KAAc,MAAf;EACE,aAAU;EACV,gBAAc;EACd,WAAW,GAAG,iBAAiB,EAAE,QAAQ,CAAC,GAAG,SAAS;EACtD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAA6D;CAChG,OACE,oBAACA,KAAc,SAAf;EACE,aAAU;EACV,WAAW,GACT,qtBACA,6HACA,yEACA,oeACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAA6D;CAChG,OACE,oBAACA,KAAc,SAAf;EACE,aAAU;EACV,WAAW,GAAG,uBAAuB,SAAS;EAC9C,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,16 @@
1
+ import * as React from "react";
2
+ export type TagProps = {
3
+ /** Fill: recessed by default, `signal` to highlight, `tint` for soft, `outline` for quiet. */
4
+ tone?: "signal" | "tint" | "outline";
5
+ /** A lit LED before the label, for "live" and "available". */
6
+ led?: boolean;
7
+ /** Renders a focusable button (a keycap) instead of a plain label. */
8
+ interactive?: boolean;
9
+ /** The pressed state of an interactive tag. */
10
+ pressed?: boolean;
11
+ className?: string;
12
+ children: React.ReactNode;
13
+ } & Pick<React.ComponentProps<"button">, "onClick" | "onPointerEnter" | "onPointerLeave" | "onFocus" | "onBlur" | "aria-describedby">;
14
+ /** Stadium chip in HUD type: skills on an entry, the status on a project card. */
15
+ export declare function Tag({ tone, led, interactive, pressed, className, children, ...handlers }: TagProps): React.JSX.Element;
16
+ //# sourceMappingURL=tag.d.ts.map
@@ -0,0 +1,26 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { badgeVariants } from "./badge.js";
3
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
+ // src/components/tag.tsx
5
+ /** Stadium chip in HUD type: skills on an entry, the status on a project card. */
6
+ function Tag({ tone, led, interactive, pressed, className, children, ...handlers }) {
7
+ const classes = cn(badgeVariants({ variant: tone ?? "default" }), "gap-1.5 px-3 py-1", interactive && "cursor-pointer outline-none aria-pressed:bg-signal-tint aria-pressed:shadow-press", className);
8
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [led && /* @__PURE__ */ jsx("span", {
9
+ "aria-hidden": true,
10
+ className: "size-2 shrink-0 rounded-full bg-led-on shadow-[0_0_0_3px_rgba(31,164,90,0.18)]"
11
+ }), children] });
12
+ if (!interactive) return /* @__PURE__ */ jsx("span", {
13
+ className: classes,
14
+ children: content
15
+ });
16
+ return /* @__PURE__ */ jsx("button", {
17
+ type: "button",
18
+ className: classes,
19
+ "aria-pressed": pressed,
20
+ ...handlers,
21
+ children: content
22
+ });
23
+ }
24
+ export { Tag };
25
+
26
+ //# sourceMappingURL=tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.js","names":[],"sources":["../../src/components/tag.tsx"],"sourcesContent":["import type * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { badgeVariants } from \"./badge\";\n\nexport type TagProps = {\n /** Fill: recessed by default, `signal` to highlight, `tint` for soft, `outline` for quiet. */\n tone?: \"signal\" | \"tint\" | \"outline\";\n /** A lit LED before the label, for \"live\" and \"available\". */\n led?: boolean;\n /** Renders a focusable button (a keycap) instead of a plain label. */\n interactive?: boolean;\n /** The pressed state of an interactive tag. */\n pressed?: boolean;\n className?: string;\n children: React.ReactNode;\n} & Pick<\n React.ComponentProps<\"button\">,\n \"onClick\" | \"onPointerEnter\" | \"onPointerLeave\" | \"onFocus\" | \"onBlur\" | \"aria-describedby\"\n>;\n\n/** Stadium chip in HUD type: skills on an entry, the status on a project card. */\nexport function Tag({\n tone,\n led,\n interactive,\n pressed,\n className,\n children,\n ...handlers\n}: TagProps) {\n const classes = cn(\n badgeVariants({ variant: tone ?? \"default\" }),\n \"gap-1.5 px-3 py-1\",\n interactive &&\n \"cursor-pointer outline-none aria-pressed:bg-signal-tint aria-pressed:shadow-press\",\n className,\n );\n const content = (\n <>\n {led && (\n <span\n aria-hidden\n className=\"size-2 shrink-0 rounded-full bg-led-on shadow-[0_0_0_3px_rgba(31,164,90,0.18)]\"\n />\n )}\n {children}\n </>\n );\n\n if (!interactive) return <span className={classes}>{content}</span>;\n return (\n <button type=\"button\" className={classes} aria-pressed={pressed} {...handlers}>\n {content}\n </button>\n );\n}\n"],"mappings":";;;;;AAqBA,SAAgB,IAAI,EAClB,MACA,KACA,aACA,SACA,WACA,UACA,GAAG,YACQ;CACX,MAAM,UAAU,GACd,cAAc,EAAE,SAAS,QAAQ,UAAU,CAAC,GAC5C,qBACA,eACE,qFACF,SACF;CACA,MAAM,UACJ,qBAAA,UAAA,EAAA,UAAA,CACG,OACC,oBAAC,QAAD;EACE,eAAA;EACA,WAAU;CACX,CAAA,GAEF,QACD,EAAA,CAAA;CAGJ,IAAI,CAAC,aAAa,OAAO,oBAAC,QAAD;EAAM,WAAW;EAAU,UAAA;CAAc,CAAA;CAClE,OACE,oBAAC,UAAD;EAAQ,MAAK;EAAS,WAAW;EAAS,gBAAc;EAAS,GAAI;EAClE,UAAA;CACK,CAAA;AAEZ"}
@@ -0,0 +1,10 @@
1
+ export type TerminalProps = {
2
+ /** One command per line; each gets a signal `$` prompt. */
3
+ lines: string[];
4
+ /** Microprint above the lines. */
5
+ title?: string;
6
+ className?: string;
7
+ };
8
+ /** Terminal snippet on visor: black glass, shell text, signal prompts. */
9
+ export declare function Terminal({ lines, title, className }: TerminalProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=terminal.d.ts.map
@@ -0,0 +1,20 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ // src/components/terminal.tsx
4
+ /** Terminal snippet on visor: black glass, shell text, signal prompts. */
5
+ function Terminal({ lines, title, className }) {
6
+ return /* @__PURE__ */ jsxs("div", {
7
+ className: cn("rounded-md bg-visor px-6 py-4 font-mono text-code text-shell", className),
8
+ children: [title && /* @__PURE__ */ jsx("div", {
9
+ className: "hud-sm mb-2 text-visor-mark",
10
+ children: title
11
+ }), lines.map((line, index) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("span", {
12
+ "aria-hidden": true,
13
+ className: "text-signal select-none",
14
+ children: ["$", " "]
15
+ }), line] }, index))]
16
+ });
17
+ }
18
+ export { Terminal };
19
+
20
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","names":[],"sources":["../../src/components/terminal.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\n\nexport type TerminalProps = {\n /** One command per line; each gets a signal `$` prompt. */\n lines: string[];\n /** Microprint above the lines. */\n title?: string;\n className?: string;\n};\n\n/** Terminal snippet on visor: black glass, shell text, signal prompts. */\nexport function Terminal({ lines, title, className }: TerminalProps) {\n return (\n <div className={cn(\"rounded-md bg-visor px-6 py-4 font-mono text-code text-shell\", className)}>\n {title && <div className=\"hud-sm mb-2 text-visor-mark\">{title}</div>}\n {lines.map((line, index) => (\n <div key={index}>\n <span aria-hidden className=\"text-signal select-none\">\n ${\" \"}\n </span>\n {line}\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;AAWA,SAAgB,SAAS,EAAE,OAAO,OAAO,aAA4B;CACnE,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,gEAAgE,SAAS;EAA5F,UAAA,CACG,SAAS,oBAAC,OAAD;GAAK,WAAU;GAA+B,UAAA;EAAW,CAAA,GAClE,MAAM,KAAK,MAAM,UAChB,qBAAC,OAAD,EAAA,UAAA,CACE,qBAAC,QAAD;GAAM,eAAA;GAAY,WAAU;GAA5B,UAAA,CAAsD,KAClD,GACE;EACL,CAAA,GAAA,IACE,EAAA,GALK,KAKL,CACN,CACE;;AAET"}
@@ -0,0 +1,4 @@
1
+ import * as React from "react";
2
+ declare function Textarea({ className, ...props }: React.ComponentProps<"textarea">): React.JSX.Element;
3
+ export { Textarea };
4
+ //# sourceMappingURL=textarea.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ // src/components/textarea.tsx
4
+ function Textarea({ className, ...props }) {
5
+ return /* @__PURE__ */ jsx("textarea", {
6
+ "data-slot": "textarea",
7
+ className: cn("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-press transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm", className),
8
+ ...props
9
+ });
10
+ }
11
+ export { Textarea };
12
+
13
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","names":[],"sources":["../../src/components/textarea.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport type * as React from \"react\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-press transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n"],"mappings":";;;AAGA,SAAS,SAAS,EAAE,WAAW,GAAG,SAA2C;CAC3E,OACE,oBAAC,YAAD;EACE,aAAU;EACV,WAAW,GACT,mZACA,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,26 @@
1
+ import * as React from "react";
2
+ export type TimelineEntryProps = {
3
+ /** What happened: a role, a release, a milestone. */
4
+ title: React.ReactNode;
5
+ /** Who or where: a company, a team, a product. */
6
+ subtitle?: React.ReactNode;
7
+ /** Start date as text, e.g. "2022.03". */
8
+ start: string;
9
+ /** End date as text. Omitted, it reads "Now". */
10
+ end?: string;
11
+ /** Fills the timeline node with signal. */
12
+ current?: boolean;
13
+ /** Entry code, e.g. "R-03". */
14
+ code?: string;
15
+ /** One more line under the dates, e.g. a place or a version. */
16
+ detail?: string;
17
+ /** Bullets: start each with a verb and carry one result. */
18
+ points?: React.ReactNode[];
19
+ tags?: string[];
20
+ /** Renders a tag yourself, e.g. as an interactive Tag. */
21
+ renderTag?: (tag: string) => React.ReactNode;
22
+ className?: string;
23
+ };
24
+ /** One entry on a timeline (a job, a release, a milestone): dates and code, a node on the track, then title, subtitle and bullets. */
25
+ export declare function TimelineEntry({ title, subtitle, start, end, current, code, detail, points, tags, renderTag, className }: TimelineEntryProps): React.JSX.Element;
26
+ //# sourceMappingURL=timeline-entry.d.ts.map
@@ -0,0 +1,63 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { Tag } from "./tag.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { Fragment as Fragment$1 } from "react";
5
+ // src/components/timeline-entry.tsx
6
+ /** One entry on a timeline (a job, a release, a milestone): dates and code, a node on the track, then title, subtitle and bullets. */
7
+ function TimelineEntry({ title, subtitle, start, end, current, code, detail, points, tags, renderTag, className }) {
8
+ return /* @__PURE__ */ jsxs("article", {
9
+ className: cn("grid grid-cols-[24px_1fr] gap-x-4 md:grid-cols-[180px_24px_1fr]", className),
10
+ children: [
11
+ /* @__PURE__ */ jsxs("div", {
12
+ className: "col-start-2 row-start-1 flex flex-col gap-1.5 pt-0.5 max-md:pb-2 md:col-start-1",
13
+ children: [
14
+ /* @__PURE__ */ jsxs("span", {
15
+ className: "font-mono text-hud-num text-ink",
16
+ children: [
17
+ start,
18
+ " — ",
19
+ end ?? "Now"
20
+ ]
21
+ }),
22
+ code && /* @__PURE__ */ jsx("span", {
23
+ className: "hud-sm text-hud-mark",
24
+ children: code
25
+ }),
26
+ detail && /* @__PURE__ */ jsx("span", {
27
+ className: "hud-sm text-ink-soft",
28
+ children: detail
29
+ })
30
+ ]
31
+ }),
32
+ /* @__PURE__ */ jsx("div", {
33
+ "aria-hidden": true,
34
+ className: "relative col-start-1 row-span-2 row-start-1 before:absolute before:inset-y-0 before:left-[11px] before:w-0.5 before:bg-seam md:col-start-2 md:row-span-1",
35
+ children: /* @__PURE__ */ jsx("span", { className: cn("absolute top-1 left-1 size-4 rounded-full", current ? "bg-signal shadow-[0_0_0_4px_var(--color-canvas)]" : "bg-shell shadow-[0_0_0_4px_var(--color-canvas),inset_0_0_0_2px_var(--color-hud-mark)]") })
36
+ }),
37
+ /* @__PURE__ */ jsxs("div", {
38
+ className: "col-start-2 row-start-2 flex flex-col gap-2 pb-12 md:col-start-3 md:row-start-1",
39
+ children: [
40
+ /* @__PURE__ */ jsx("h3", {
41
+ className: "font-display text-display-sm text-ink",
42
+ children: title
43
+ }),
44
+ subtitle && /* @__PURE__ */ jsx("p", {
45
+ className: "text-body-sm text-ink-soft",
46
+ children: subtitle
47
+ }),
48
+ points && points.length > 0 && /* @__PURE__ */ jsx("ul", {
49
+ className: "mt-2 list-disc pl-[18px] text-body-md text-ink marker:font-mono marker:text-signal-ink",
50
+ children: points.map((point, index) => /* @__PURE__ */ jsx("li", { children: point }, index))
51
+ }),
52
+ tags && tags.length > 0 && /* @__PURE__ */ jsx("div", {
53
+ className: "mt-2 flex flex-wrap gap-2",
54
+ children: tags.map((tag) => renderTag ? /* @__PURE__ */ jsx(Fragment$1, { children: renderTag(tag) }, tag) : /* @__PURE__ */ jsx(Tag, { children: tag }, tag))
55
+ })
56
+ ]
57
+ })
58
+ ]
59
+ });
60
+ }
61
+ export { TimelineEntry };
62
+
63
+ //# sourceMappingURL=timeline-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-entry.js","names":["Fragment"],"sources":["../../src/components/timeline-entry.tsx"],"sourcesContent":["import type * as React from \"react\";\nimport { Fragment } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Tag } from \"./tag\";\n\nexport type TimelineEntryProps = {\n /** What happened: a role, a release, a milestone. */\n title: React.ReactNode;\n /** Who or where: a company, a team, a product. */\n subtitle?: React.ReactNode;\n /** Start date as text, e.g. \"2022.03\". */\n start: string;\n /** End date as text. Omitted, it reads \"Now\". */\n end?: string;\n /** Fills the timeline node with signal. */\n current?: boolean;\n /** Entry code, e.g. \"R-03\". */\n code?: string;\n /** One more line under the dates, e.g. a place or a version. */\n detail?: string;\n /** Bullets: start each with a verb and carry one result. */\n points?: React.ReactNode[];\n tags?: string[];\n /** Renders a tag yourself, e.g. as an interactive Tag. */\n renderTag?: (tag: string) => React.ReactNode;\n className?: string;\n};\n\n/** One entry on a timeline (a job, a release, a milestone): dates and code, a node on the track, then title, subtitle and bullets. */\nexport function TimelineEntry({\n title,\n subtitle,\n start,\n end,\n current,\n code,\n detail,\n points,\n tags,\n renderTag,\n className,\n}: TimelineEntryProps) {\n return (\n <article\n className={cn(\"grid grid-cols-[24px_1fr] gap-x-4 md:grid-cols-[180px_24px_1fr]\", className)}\n >\n <div className=\"col-start-2 row-start-1 flex flex-col gap-1.5 pt-0.5 max-md:pb-2 md:col-start-1\">\n <span className=\"font-mono text-hud-num text-ink\">\n {start} — {end ?? \"Now\"}\n </span>\n {code && <span className=\"hud-sm text-hud-mark\">{code}</span>}\n {detail && <span className=\"hud-sm text-ink-soft\">{detail}</span>}\n </div>\n <div\n aria-hidden\n className=\"relative col-start-1 row-span-2 row-start-1 before:absolute before:inset-y-0 before:left-[11px] before:w-0.5 before:bg-seam md:col-start-2 md:row-span-1\"\n >\n <span\n className={cn(\n \"absolute top-1 left-1 size-4 rounded-full\",\n current\n ? \"bg-signal shadow-[0_0_0_4px_var(--color-canvas)]\"\n : \"bg-shell shadow-[0_0_0_4px_var(--color-canvas),inset_0_0_0_2px_var(--color-hud-mark)]\",\n )}\n />\n </div>\n <div className=\"col-start-2 row-start-2 flex flex-col gap-2 pb-12 md:col-start-3 md:row-start-1\">\n <h3 className=\"font-display text-display-sm text-ink\">{title}</h3>\n {subtitle && <p className=\"text-body-sm text-ink-soft\">{subtitle}</p>}\n {points && points.length > 0 && (\n <ul className=\"mt-2 list-disc pl-[18px] text-body-md text-ink marker:font-mono marker:text-signal-ink\">\n {points.map((point, index) => (\n <li key={index}>{point}</li>\n ))}\n </ul>\n )}\n {tags && tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {tags.map((tag) =>\n renderTag ? (\n <Fragment key={tag}>{renderTag(tag)}</Fragment>\n ) : (\n <Tag key={tag}>{tag}</Tag>\n ),\n )}\n </div>\n )}\n </div>\n </article>\n );\n}\n"],"mappings":";;;;;;AA6BA,SAAgB,cAAc,EAC5B,OACA,UACA,OACA,KACA,SACA,MACA,QACA,QACA,MACA,WACA,aACqB;CACrB,OACE,qBAAC,WAAD;EACE,WAAW,GAAG,mEAAmE,SAAS;EAD5F,UAAA;GAGE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA;OACG;OAAM;OAAI,OAAO;MACd;;KACL,QAAQ,oBAAC,QAAD;MAAM,WAAU;MAAwB,UAAA;KAAW,CAAA;KAC3D,UAAU,oBAAC,QAAD;MAAM,WAAU;MAAwB,UAAA;KAAa,CAAA;IAC7D;;GACL,oBAAC,OAAD;IACE,eAAA;IACA,WAAU;IAEV,UAAA,oBAAC,QAAD,EACE,WAAW,GACT,6CACA,UACI,qDACA,uFACN,EACD,CAAA;GACE,CAAA;GACL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,MAAD;MAAI,WAAU;MAAyC,UAAA;KAAU,CAAA;KAChE,YAAY,oBAAC,KAAD;MAAG,WAAU;MAA8B,UAAA;KAAY,CAAA;KACnE,UAAU,OAAO,SAAS,KACzB,oBAAC,MAAD;MAAI,WAAU;MACX,UAAA,OAAO,KAAK,OAAO,UAClB,oBAAC,MAAD,EAAA,UAAiB,MAAU,GAAlB,KAAkB,CAC5B;KACC,CAAA;KAEL,QAAQ,KAAK,SAAS,KACrB,oBAAC,OAAD;MAAK,WAAU;MACZ,UAAA,KAAK,KAAK,QACT,YACE,oBAACA,YAAD,EAAA,UAAqB,UAAU,GAAG,EAAY,GAA/B,GAA+B,IAE9C,oBAAC,KAAD,EAAA,UAAgB,IAAS,GAAf,GAAe,CAE7B;KACG,CAAA;IAEJ;;EACE;;AAEb"}
@@ -0,0 +1,10 @@
1
+ import { toggleVariants } from "./toggle.js";
2
+ import { VariantProps } from "class-variance-authority";
3
+ import { ToggleGroup } from "radix-ui";
4
+ import * as React from "react";
5
+ declare function ToggleGroup$1({ className, variant, size, spacing, children, ...props }: React.ComponentProps<typeof ToggleGroup.Root> & VariantProps<typeof toggleVariants> & {
6
+ spacing?: number;
7
+ }): React.JSX.Element;
8
+ declare function ToggleGroupItem({ className, children, variant, size, ...props }: React.ComponentProps<typeof ToggleGroup.Item> & VariantProps<typeof toggleVariants>): React.JSX.Element;
9
+ export { ToggleGroup$1 as ToggleGroup, ToggleGroupItem };
10
+ //# sourceMappingURL=toggle-group.d.ts.map
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { toggleVariants } from "./toggle.js";
3
+ import { cn } from "../lib/utils.js";
4
+ import { ToggleGroup } from "radix-ui";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import * as React from "react";
7
+ // src/components/toggle-group.tsx
8
+ const ToggleGroupContext = React.createContext({
9
+ size: "default",
10
+ variant: "default",
11
+ spacing: 0
12
+ });
13
+ function ToggleGroup$1({ className, variant, size, spacing = 0, children, ...props }) {
14
+ return /* @__PURE__ */ jsx(ToggleGroup.Root, {
15
+ "data-slot": "toggle-group",
16
+ "data-variant": variant,
17
+ "data-size": size,
18
+ "data-spacing": spacing,
19
+ style: { "--gap": spacing },
20
+ className: cn("group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md data-[spacing=default]:data-[variant=outline]:shadow-mold", className),
21
+ ...props,
22
+ children: /* @__PURE__ */ jsx(ToggleGroupContext.Provider, {
23
+ value: {
24
+ variant,
25
+ size,
26
+ spacing
27
+ },
28
+ children
29
+ })
30
+ });
31
+ }
32
+ function ToggleGroupItem({ className, children, variant, size, ...props }) {
33
+ const context = React.useContext(ToggleGroupContext);
34
+ return /* @__PURE__ */ jsx(ToggleGroup.Item, {
35
+ "data-slot": "toggle-group-item",
36
+ "data-variant": context.variant || variant,
37
+ "data-size": context.size || size,
38
+ "data-spacing": context.spacing,
39
+ className: cn(toggleVariants({
40
+ variant: context.variant || variant,
41
+ size: context.size || size
42
+ }), "w-auto min-w-0 shrink-0 px-3 focus:z-10 focus-visible:z-10", "data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:first:rounded-l-md data-[spacing=0]:last:rounded-r-md data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l", className),
43
+ ...props,
44
+ children
45
+ });
46
+ }
47
+ export { ToggleGroup$1 as ToggleGroup, ToggleGroupItem };
48
+
49
+ //# sourceMappingURL=toggle-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle-group.js","names":["ToggleGroup","ToggleGroupPrimitive"],"sources":["../../src/components/toggle-group.tsx"],"sourcesContent":["\"use client\";\n\nimport { toggleVariants } from \"./toggle\";\nimport { cn } from \"../lib/utils\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport { ToggleGroup as ToggleGroupPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number;\n }\n>({\n size: \"default\",\n variant: \"default\",\n spacing: 0,\n});\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n spacing = 0,\n children,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants> & {\n spacing?: number;\n }) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n data-spacing={spacing}\n style={{ \"--gap\": spacing } as React.CSSProperties}\n className={cn(\n \"group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md data-[spacing=default]:data-[variant=outline]:shadow-mold\",\n className,\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size, spacing }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n );\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> & VariantProps<typeof toggleVariants>) {\n const context = React.useContext(ToggleGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-size={context.size || size}\n data-spacing={context.spacing}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n \"w-auto min-w-0 shrink-0 px-3 focus:z-10 focus-visible:z-10\",\n \"data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:first:rounded-l-md data-[spacing=0]:last:rounded-r-md data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l\",\n className,\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n}\n\nexport { ToggleGroup, ToggleGroupItem };\n"],"mappings":";;;;;;;AAQA,MAAM,qBAAqB,MAAM,cAI/B;CACA,MAAM;CACN,SAAS;CACT,SAAS;AACX,CAAC;AAED,SAASA,cAAY,EACnB,WACA,SACA,MACA,UAAU,GACV,UACA,GAAG,SAIA;CACH,OACE,oBAACC,YAAqB,MAAtB;EACE,aAAU;EACV,gBAAc;EACd,aAAW;EACX,gBAAc;EACd,OAAO,EAAE,SAAS,QAAQ;EAC1B,WAAW,GACT,+IACA,SACF;EACA,GAAI;EAEJ,UAAA,oBAAC,mBAAmB,UAApB;GAA6B,OAAO;IAAE;IAAS;IAAM;GAAQ;GAC1D;EAC0B,CAAA;CACJ,CAAA;AAE/B;AAEA,SAAS,gBAAgB,EACvB,WACA,UACA,SACA,MACA,GAAG,SAC4F;CAC/F,MAAM,UAAU,MAAM,WAAW,kBAAkB;CAEnD,OACE,oBAACA,YAAqB,MAAtB;EACE,aAAU;EACV,gBAAc,QAAQ,WAAW;EACjC,aAAW,QAAQ,QAAQ;EAC3B,gBAAc,QAAQ;EACtB,WAAW,GACT,eAAe;GACb,SAAS,QAAQ,WAAW;GAC5B,MAAM,QAAQ,QAAQ;EACxB,CAAC,GACD,8DACA,+OACA,SACF;EACA,GAAI;EAEH;CACwB,CAAA;AAE/B"}
@@ -0,0 +1,10 @@
1
+ import { VariantProps } from "class-variance-authority";
2
+ import { Toggle } from "radix-ui";
3
+ import * as React from "react";
4
+ declare const toggleVariants: (props?: ({
5
+ variant?: "default" | "outline" | null | undefined;
6
+ size?: "default" | "lg" | "sm" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ declare function Toggle$1({ className, variant, size, ...props }: React.ComponentProps<typeof Toggle.Root> & VariantProps<typeof toggleVariants>): React.JSX.Element;
9
+ export { Toggle$1 as Toggle, toggleVariants };
10
+ //# sourceMappingURL=toggle.d.ts.map
@@ -0,0 +1,37 @@
1
+ "use client";
2
+ import { cn } from "../lib/utils.js";
3
+ import { cva } from "class-variance-authority";
4
+ import { Toggle } from "radix-ui";
5
+ import { jsx } from "react/jsx-runtime";
6
+ // src/components/toggle.tsx
7
+ const toggleVariants = cva("inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
8
+ variants: {
9
+ variant: {
10
+ default: "bg-transparent",
11
+ outline: "border border-input bg-transparent shadow-mold hover:bg-accent hover:text-accent-foreground"
12
+ },
13
+ size: {
14
+ default: "h-9 min-w-9 px-2",
15
+ sm: "h-8 min-w-8 px-1.5",
16
+ lg: "h-10 min-w-10 px-2.5"
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ variant: "default",
21
+ size: "default"
22
+ }
23
+ });
24
+ function Toggle$1({ className, variant, size, ...props }) {
25
+ return /* @__PURE__ */ jsx(Toggle.Root, {
26
+ "data-slot": "toggle",
27
+ className: cn(toggleVariants({
28
+ variant,
29
+ size,
30
+ className
31
+ })),
32
+ ...props
33
+ });
34
+ }
35
+ export { Toggle$1 as Toggle, toggleVariants };
36
+
37
+ //# sourceMappingURL=toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.js","names":["Toggle","TogglePrimitive"],"sources":["../../src/components/toggle.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Toggle as TogglePrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-mold hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 min-w-9 px-2\",\n sm: \"h-8 min-w-8 px-1.5\",\n lg: \"h-10 min-w-10 px-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Toggle, toggleVariants };\n"],"mappings":";;;;;;AAOA,MAAM,iBAAiB,IACrB,2gBACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,SACE;EACJ;EACA,MAAM;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;EACN;CACF;CACA,iBAAiB;EACf,SAAS;EACT,MAAM;CACR;AACF,CACF;AAEA,SAASA,SAAO,EACd,WACA,SACA,MACA,GAAG,SACuF;CAC1F,OACE,oBAACC,OAAgB,MAAjB;EACE,aAAU;EACV,WAAW,GAAG,eAAe;GAAE;GAAS;GAAM;EAAU,CAAC,CAAC;EAC1D,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,8 @@
1
+ import { Tooltip } from "radix-ui";
2
+ import * as React from "react";
3
+ declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof Tooltip.Provider>): React.JSX.Element;
4
+ declare function Tooltip$1({ ...props }: React.ComponentProps<typeof Tooltip.Root>): React.JSX.Element;
5
+ declare function TooltipTrigger({ ...props }: React.ComponentProps<typeof Tooltip.Trigger>): React.JSX.Element;
6
+ declare function TooltipContent({ className, sideOffset, children, ...props }: React.ComponentProps<typeof Tooltip.Content>): React.JSX.Element;
7
+ export { Tooltip$1 as Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
8
+ //# sourceMappingURL=tooltip.d.ts.map
@@ -0,0 +1,36 @@
1
+ "use client";
2
+ import { cn } from "../lib/utils.js";
3
+ import { Tooltip } from "radix-ui";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ // src/components/tooltip.tsx
6
+ function TooltipProvider({ delayDuration = 0, ...props }) {
7
+ return /* @__PURE__ */ jsx(Tooltip.Provider, {
8
+ "data-slot": "tooltip-provider",
9
+ delayDuration,
10
+ ...props
11
+ });
12
+ }
13
+ function Tooltip$1({ ...props }) {
14
+ return /* @__PURE__ */ jsx(Tooltip.Root, {
15
+ "data-slot": "tooltip",
16
+ ...props
17
+ });
18
+ }
19
+ function TooltipTrigger({ ...props }) {
20
+ return /* @__PURE__ */ jsx(Tooltip.Trigger, {
21
+ "data-slot": "tooltip-trigger",
22
+ ...props
23
+ });
24
+ }
25
+ function TooltipContent({ className, sideOffset = 0, children, ...props }) {
26
+ return /* @__PURE__ */ jsx(Tooltip.Portal, { children: /* @__PURE__ */ jsxs(Tooltip.Content, {
27
+ "data-slot": "tooltip-content",
28
+ sideOffset,
29
+ className: cn("z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", className),
30
+ ...props,
31
+ children: [children, /* @__PURE__ */ jsx(Tooltip.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground" })]
32
+ }) });
33
+ }
34
+ export { Tooltip$1 as Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
35
+
36
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","names":["TooltipPrimitive","Tooltip"],"sources":["../../src/components/tooltip.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../lib/utils\";\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\",\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n"],"mappings":";;;;;AAMA,SAAS,gBAAgB,EACvB,gBAAgB,GAChB,GAAG,SACsD;CACzD,OACE,oBAACA,QAAiB,UAAlB;EACE,aAAU;EACK;EACf,GAAI;CACL,CAAA;AAEL;AAEA,SAASC,UAAQ,EAAE,GAAG,SAA6D;CACjF,OAAO,oBAACD,QAAiB,MAAlB;EAAuB,aAAU;EAAU,GAAI;CAAQ,CAAA;AAChE;AAEA,SAAS,eAAe,EAAE,GAAG,SAAgE;CAC3F,OAAO,oBAACA,QAAiB,SAAlB;EAA0B,aAAU;EAAkB,GAAI;CAAQ,CAAA;AAC3E;AAEA,SAAS,eAAe,EACtB,WACA,aAAa,GACb,UACA,GAAG,SACqD;CACxD,OACE,oBAACA,QAAiB,QAAlB,EAAA,UACE,qBAACA,QAAiB,SAAlB;EACE,aAAU;EACE;EACZ,WAAW,GACT,qaACA,SACF;EACA,GAAI;EAPN,UAAA,CASG,UACD,oBAACA,QAAiB,OAAlB,EAAwB,WAAU,qGAAsG,CAAA,CAChH;CACH,CAAA,EAAA,CAAA;AAE7B"}
@@ -0,0 +1,10 @@
1
+ import { Amount } from "./components/amount.js";
2
+ import { ColorPicker, IconPicker } from "./components/appearance-pickers.js";
3
+ import { BudgetMeter } from "./components/budget-meter.js";
4
+ import { CategoryIcon, ColorDot } from "./components/category-icon.js";
5
+ import { FxConverter } from "./components/fx-converter.js";
6
+ import { MoneyInput } from "./components/money-input.js";
7
+ import { CategoryColor, CategoryIconName, categoryColorVar, categoryColors, categoryIcon, categoryIcons } from "./lib/category-icons.js";
8
+ import { FxCurrencies, FxField, FxState, RATE_DISPLAY, RATE_SCALE, convertFromTo, convertToFrom, deriveRate, divRoundHalfEven, editFx, fxResult, initialFxState, parseRate } from "./lib/fx.js";
9
+ import { SignDisplay, formatAmountInput, formatMoney, minorToDecimal, parseAmount } from "./lib/money.js";
10
+ export { Amount, BudgetMeter, CategoryColor, CategoryIcon, CategoryIconName, ColorDot, ColorPicker, FxConverter, FxCurrencies, FxField, FxState, IconPicker, MoneyInput, RATE_DISPLAY, RATE_SCALE, SignDisplay, categoryColorVar, categoryColors, categoryIcon, categoryIcons, convertFromTo, convertToFrom, deriveRate, divRoundHalfEven, editFx, formatAmountInput, formatMoney, fxResult, initialFxState, minorToDecimal, parseAmount, parseRate };
@@ -0,0 +1,10 @@
1
+ import { Amount } from "./components/amount.js";
2
+ import { ColorPicker, IconPicker } from "./components/appearance-pickers.js";
3
+ import { BudgetMeter } from "./components/budget-meter.js";
4
+ import { CategoryIcon, ColorDot } from "./components/category-icon.js";
5
+ import { FxConverter } from "./components/fx-converter.js";
6
+ import { MoneyInput } from "./components/money-input.js";
7
+ import { categoryColorVar, categoryColors, categoryIcon, categoryIcons } from "./lib/category-icons.js";
8
+ import { RATE_DISPLAY, RATE_SCALE, convertFromTo, convertToFrom, deriveRate, divRoundHalfEven, editFx, fxResult, initialFxState, parseRate } from "./lib/fx.js";
9
+ import { formatAmountInput, formatMoney, minorToDecimal, parseAmount } from "./lib/money.js";
10
+ export { Amount, BudgetMeter, CategoryIcon, ColorDot, ColorPicker, FxConverter, IconPicker, MoneyInput, RATE_DISPLAY, RATE_SCALE, categoryColorVar, categoryColors, categoryIcon, categoryIcons, convertFromTo, convertToFrom, deriveRate, divRoundHalfEven, editFx, formatAmountInput, formatMoney, fxResult, initialFxState, minorToDecimal, parseAmount, parseRate };