@playfast/reform-better-hub-ui-primitives 0.0.2

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 (86) hide show
  1. package/README.md +115 -0
  2. package/dist/components/agent-icon.d.ts +5 -0
  3. package/dist/components/agent-icon.d.ts.map +1 -0
  4. package/dist/components/agent-icon.js +5 -0
  5. package/dist/components/agent-icon.js.map +1 -0
  6. package/dist/components/badge.d.ts +11 -0
  7. package/dist/components/badge.d.ts.map +1 -0
  8. package/dist/components/badge.js +28 -0
  9. package/dist/components/badge.js.map +1 -0
  10. package/dist/components/button.d.ts +12 -0
  11. package/dist/components/button.d.ts.map +1 -0
  12. package/dist/components/button.js +34 -0
  13. package/dist/components/button.js.map +1 -0
  14. package/dist/components/combobox.d.ts +25 -0
  15. package/dist/components/combobox.d.ts.map +1 -0
  16. package/dist/components/combobox.js +60 -0
  17. package/dist/components/combobox.js.map +1 -0
  18. package/dist/components/command.d.ts +19 -0
  19. package/dist/components/command.d.ts.map +1 -0
  20. package/dist/components/command.js +36 -0
  21. package/dist/components/command.js.map +1 -0
  22. package/dist/components/dialog.d.ts +16 -0
  23. package/dist/components/dialog.d.ts.map +1 -0
  24. package/dist/components/dialog.js +38 -0
  25. package/dist/components/dialog.js.map +1 -0
  26. package/dist/components/dropdown-menu.d.ts +17 -0
  27. package/dist/components/dropdown-menu.d.ts.map +1 -0
  28. package/dist/components/dropdown-menu.js +35 -0
  29. package/dist/components/dropdown-menu.js.map +1 -0
  30. package/dist/components/github-background.d.ts +3 -0
  31. package/dist/components/github-background.d.ts.map +1 -0
  32. package/dist/components/github-background.js +51 -0
  33. package/dist/components/github-background.js.map +1 -0
  34. package/dist/components/halftone-background.d.ts +3 -0
  35. package/dist/components/halftone-background.d.ts.map +1 -0
  36. package/dist/components/halftone-background.js +248 -0
  37. package/dist/components/halftone-background.js.map +1 -0
  38. package/dist/components/input-group.d.ts +19 -0
  39. package/dist/components/input-group.d.ts.map +1 -0
  40. package/dist/components/input-group.js +63 -0
  41. package/dist/components/input-group.js.map +1 -0
  42. package/dist/components/input.d.ts +5 -0
  43. package/dist/components/input.d.ts.map +1 -0
  44. package/dist/components/input.js +7 -0
  45. package/dist/components/input.js.map +1 -0
  46. package/dist/components/live-duration.d.ts +9 -0
  47. package/dist/components/live-duration.d.ts.map +1 -0
  48. package/dist/components/live-duration.js +55 -0
  49. package/dist/components/live-duration.js.map +1 -0
  50. package/dist/components/logo.d.ts +8 -0
  51. package/dist/components/logo.d.ts.map +1 -0
  52. package/dist/components/logo.js +9 -0
  53. package/dist/components/logo.js.map +1 -0
  54. package/dist/components/popover.d.ts +12 -0
  55. package/dist/components/popover.d.ts.map +1 -0
  56. package/dist/components/popover.js +26 -0
  57. package/dist/components/popover.js.map +1 -0
  58. package/dist/components/resize-handle.d.ts +15 -0
  59. package/dist/components/resize-handle.d.ts.map +1 -0
  60. package/dist/components/resize-handle.js +36 -0
  61. package/dist/components/resize-handle.js.map +1 -0
  62. package/dist/components/sheet.d.ts +18 -0
  63. package/dist/components/sheet.d.ts.map +1 -0
  64. package/dist/components/sheet.js +44 -0
  65. package/dist/components/sheet.js.map +1 -0
  66. package/dist/components/textarea.d.ts +5 -0
  67. package/dist/components/textarea.d.ts.map +1 -0
  68. package/dist/components/textarea.js +7 -0
  69. package/dist/components/textarea.js.map +1 -0
  70. package/dist/components/time-ago.d.ts +8 -0
  71. package/dist/components/time-ago.d.ts.map +1 -0
  72. package/dist/components/time-ago.js +40 -0
  73. package/dist/components/time-ago.js.map +1 -0
  74. package/dist/components/tooltip.d.ts +10 -0
  75. package/dist/components/tooltip.d.ts.map +1 -0
  76. package/dist/components/tooltip.js +25 -0
  77. package/dist/components/tooltip.js.map +1 -0
  78. package/dist/foundation/cn.d.ts +7 -0
  79. package/dist/foundation/cn.d.ts.map +1 -0
  80. package/dist/foundation/cn.js +8 -0
  81. package/dist/foundation/cn.js.map +1 -0
  82. package/dist/index.d.ts +21 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +24 -0
  85. package/dist/index.js.map +1 -0
  86. package/package.json +72 -0
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from "react";
3
+ function createRng(seed) {
4
+ let s = seed;
5
+ return () => {
6
+ s = (s * 16807) % 2147483647;
7
+ return (s - 1) / 2147483646;
8
+ };
9
+ }
10
+ const LEVELS = [
11
+ "rgba(255,255,255,0.02)",
12
+ "rgba(255,255,255,0.10)",
13
+ "rgba(255,255,255,0.18)",
14
+ "rgba(255,255,255,0.28)",
15
+ "rgba(255,255,255,0.40)",
16
+ ];
17
+ const CELL = 15;
18
+ export function GitHubBackground() {
19
+ const grid = useMemo(() => {
20
+ const rng = createRng(42);
21
+ const cells = [];
22
+ for (let w = 0; w < 52; w++) {
23
+ for (let d = 0; d < 7; d++) {
24
+ const r = rng();
25
+ const level = r < 0.3 ? 0 : r < 0.5 ? 1 : r < 0.7 ? 2 : r < 0.85 ? 3 : 4;
26
+ cells.push({ w, d, level });
27
+ }
28
+ }
29
+ return cells;
30
+ }, []);
31
+ return (_jsxs("div", { className: "absolute inset-0 pointer-events-none overflow-hidden", style: { zIndex: 2 }, children: [_jsxs("div", { className: "absolute inset-0", style: {
32
+ maskImage: "radial-gradient(ellipse 85% 75% at 45% 35%, black 15%, transparent 60%)",
33
+ WebkitMaskImage: "radial-gradient(ellipse 85% 75% at 45% 35%, black 15%, transparent 60%)",
34
+ }, children: [_jsx("div", { className: "absolute", style: {
35
+ top: "8%",
36
+ left: "50%",
37
+ transform: "translate(-50%, 0) perspective(500px) rotateX(30deg) rotateZ(-2deg) scale(1.3)",
38
+ transformOrigin: "center top",
39
+ opacity: 0.4,
40
+ }, children: _jsx("svg", { width: 52 * CELL, height: 7 * CELL, viewBox: `0 0 ${52 * CELL} ${7 * CELL}`, children: grid.map(({ w, d, level }, i) => (_jsx("rect", { x: w * CELL, y: d * CELL, width: 12, height: 12, rx: 2, fill: LEVELS[level], opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.5s", begin: `${w * 0.04 + d * 0.015}s`, fill: "freeze" }) }, i))) }) }), _jsxs("svg", { className: "absolute inset-0 w-full h-full", viewBox: "0 0 400 900", preserveAspectRatio: "xMidYMid slice", style: { opacity: 0.45 }, children: [_jsx("line", { x1: "200", y1: "0", x2: "200", y2: "900", stroke: "rgba(255,255,255,0.15)", strokeWidth: "2", pathLength: 1, className: "git-line-anim", style: { animationDelay: "0.3s" } }), _jsx("path", { d: "M 200 150 C 200 180, 280 200, 280 230 L 280 350 C 280 380, 200 395, 200 400", stroke: "rgba(255,255,255,0.12)", strokeWidth: "2", fill: "none", pathLength: 1, className: "git-line-anim", style: { animationDelay: "0.8s" } }), _jsx("path", { d: "M 200 300 C 200 325, 130 340, 130 360 L 130 500 C 130 525, 200 540, 200 550", stroke: "rgba(255,255,255,0.10)", strokeWidth: "2", fill: "none", pathLength: 1, className: "git-line-anim", style: { animationDelay: "1.3s" } }), _jsx("path", { d: "M 200 550 C 200 570, 260 580, 260 600 L 260 650 C 260 670, 200 680, 200 690", stroke: "rgba(255,255,255,0.08)", strokeWidth: "2", fill: "none", pathLength: 1, className: "git-line-anim", style: { animationDelay: "1.8s" } }), _jsx("path", { d: "M 200 620 C 200 640, 110 660, 110 680 L 110 800 C 110 820, 200 835, 200 850", stroke: "rgba(255,255,255,0.07)", strokeWidth: "2", fill: "none", pathLength: 1, className: "git-line-anim", style: { animationDelay: "2.2s" } }), [80, 150, 230, 300, 400, 480, 550, 620, 690, 770, 850].map((y, i) => (_jsx("circle", { cx: 200, cy: y, r: 4, fill: "rgba(255,255,255,0.25)", opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.3s", begin: `${0.5 + i * 0.15}s`, fill: "freeze" }) }, `m${i}`))), [230, 280, 330].map((y, i) => (_jsx("circle", { cx: 280, cy: y, r: 3.5, fill: "rgba(255,255,255,0.20)", opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.3s", begin: `${1.0 + i * 0.2}s`, fill: "freeze" }) }, `f1${i}`))), [360, 420, 470].map((y, i) => (_jsx("circle", { cx: 130, cy: y, r: 3.5, fill: "rgba(255,255,255,0.18)", opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.3s", begin: `${1.5 + i * 0.2}s`, fill: "freeze" }) }, `f2${i}`))), [600, 630, 660].map((y, i) => (_jsx("circle", { cx: 260, cy: y, r: 3, fill: "rgba(255,255,255,0.15)", opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.3s", begin: `${2.0 + i * 0.2}s`, fill: "freeze" }) }, `hf${i}`))), [680, 730, 780].map((y, i) => (_jsx("circle", { cx: 110, cy: y, r: 3, fill: "rgba(255,255,255,0.12)", opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.3s", begin: `${2.4 + i * 0.2}s`, fill: "freeze" }) }, `f3${i}`)))] })] }), _jsx("style", { children: `
41
+ .git-line-anim {
42
+ stroke-dasharray: 1;
43
+ stroke-dashoffset: 1;
44
+ animation: gitDraw 2.5s ease-out forwards;
45
+ }
46
+ @keyframes gitDraw {
47
+ to { stroke-dashoffset: 0; }
48
+ }
49
+ ` })] }));
50
+ }
51
+ //# sourceMappingURL=github-background.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-background.js","sourceRoot":"","sources":["../../src/components/github-background.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,SAAS,SAAS,CAAC,IAAY;IAC9B,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,OAAO,GAAG,EAAE;QACX,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC;QAC7B,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC;IAC7B,CAAC,CAAC;AACH,CAAC;AAED,MAAM,MAAM,GAAG;IACd,wBAAwB;IACxB,wBAAwB;IACxB,wBAAwB;IACxB,wBAAwB;IACxB,wBAAwB;CACxB,CAAC;AAEF,MAAM,IAAI,GAAG,EAAE,CAAC;AAEhB,MAAM,UAAU,gBAAgB;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,KAAK,GAA8C,EAAE,CAAC;QAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;gBAChB,MAAM,KAAK,GACV,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACN,eACC,SAAS,EAAC,sDAAsD,EAChE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,aAGpB,eACC,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE;oBACN,SAAS,EAAE,yEAAyE;oBACpF,eAAe,EACd,yEAAyE;iBAC1E,aAGD,cACC,SAAS,EAAC,UAAU,EACpB,KAAK,EAAE;4BACN,GAAG,EAAE,IAAI;4BACT,IAAI,EAAE,KAAK;4BACX,SAAS,EAAE,gFAAgF;4BAC3F,eAAe,EAAE,YAAY;4BAC7B,OAAO,EAAE,GAAG;yBACZ,YAED,cACC,KAAK,EAAE,EAAE,GAAG,IAAI,EAChB,MAAM,EAAE,CAAC,GAAG,IAAI,EAChB,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,YAEtC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CACjC,eAEC,CAAC,EAAE,CAAC,GAAG,IAAI,EACX,CAAC,EAAE,CAAC,GAAG,IAAI,EACX,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,EAAE,EAAE,CAAC,EACL,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EACnB,OAAO,EAAE,CAAC,YAEV,kBACC,aAAa,EAAC,SAAS,EACvB,IAAI,EAAC,GAAG,EACR,EAAE,EAAC,GAAG,EACN,GAAG,EAAC,MAAM,EACV,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,EACjC,IAAI,EAAC,QAAQ,GACZ,IAhBG,CAAC,CAiBA,CACP,CAAC,GACG,GACD,EAGN,eACC,SAAS,EAAC,gCAAgC,EAC1C,OAAO,EAAC,aAAa,EACrB,mBAAmB,EAAC,gBAAgB,EACpC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAGxB,eACC,EAAE,EAAC,KAAK,EACR,EAAE,EAAC,GAAG,EACN,EAAE,EAAC,KAAK,EACR,EAAE,EAAC,KAAK,EACR,MAAM,EAAC,wBAAwB,EAC/B,WAAW,EAAC,GAAG,EACf,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,eAAe,EACzB,KAAK,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAChC,EAGF,eACC,CAAC,EAAC,6EAA6E,EAC/E,MAAM,EAAC,wBAAwB,EAC/B,WAAW,EAAC,GAAG,EACf,IAAI,EAAC,MAAM,EACX,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,eAAe,EACzB,KAAK,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAChC,EAGF,eACC,CAAC,EAAC,6EAA6E,EAC/E,MAAM,EAAC,wBAAwB,EAC/B,WAAW,EAAC,GAAG,EACf,IAAI,EAAC,MAAM,EACX,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,eAAe,EACzB,KAAK,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAChC,EAGF,eACC,CAAC,EAAC,6EAA6E,EAC/E,MAAM,EAAC,wBAAwB,EAC/B,WAAW,EAAC,GAAG,EACf,IAAI,EAAC,MAAM,EACX,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,eAAe,EACzB,KAAK,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAChC,EAGF,eACC,CAAC,EAAC,6EAA6E,EAC/E,MAAM,EAAC,wBAAwB,EAC/B,WAAW,EAAC,GAAG,EACf,IAAI,EAAC,MAAM,EACX,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,eAAe,EACzB,KAAK,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAChC,EAGD,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAC1D,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACT,iBAEC,EAAE,EAAE,GAAG,EACP,EAAE,EAAE,CAAC,EACL,CAAC,EAAE,CAAC,EACJ,IAAI,EAAC,wBAAwB,EAC7B,OAAO,EAAE,CAAC,YAEV,kBACC,aAAa,EAAC,SAAS,EACvB,IAAI,EAAC,GAAG,EACR,EAAE,EAAC,GAAG,EACN,GAAG,EAAC,MAAM,EACV,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,EAC3B,IAAI,EAAC,QAAQ,GACZ,IAdG,IAAI,CAAC,EAAE,CAeJ,CACT,CACD,EAGA,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,iBAEC,EAAE,EAAE,GAAG,EACP,EAAE,EAAE,CAAC,EACL,CAAC,EAAE,GAAG,EACN,IAAI,EAAC,wBAAwB,EAC7B,OAAO,EAAE,CAAC,YAEV,kBACC,aAAa,EAAC,SAAS,EACvB,IAAI,EAAC,GAAG,EACR,EAAE,EAAC,GAAG,EACN,GAAG,EAAC,MAAM,EACV,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,EAC1B,IAAI,EAAC,QAAQ,GACZ,IAdG,KAAK,CAAC,EAAE,CAeL,CACT,CAAC,EAGD,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,iBAEC,EAAE,EAAE,GAAG,EACP,EAAE,EAAE,CAAC,EACL,CAAC,EAAE,GAAG,EACN,IAAI,EAAC,wBAAwB,EAC7B,OAAO,EAAE,CAAC,YAEV,kBACC,aAAa,EAAC,SAAS,EACvB,IAAI,EAAC,GAAG,EACR,EAAE,EAAC,GAAG,EACN,GAAG,EAAC,MAAM,EACV,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,EAC1B,IAAI,EAAC,QAAQ,GACZ,IAdG,KAAK,CAAC,EAAE,CAeL,CACT,CAAC,EAGD,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,iBAEC,EAAE,EAAE,GAAG,EACP,EAAE,EAAE,CAAC,EACL,CAAC,EAAE,CAAC,EACJ,IAAI,EAAC,wBAAwB,EAC7B,OAAO,EAAE,CAAC,YAEV,kBACC,aAAa,EAAC,SAAS,EACvB,IAAI,EAAC,GAAG,EACR,EAAE,EAAC,GAAG,EACN,GAAG,EAAC,MAAM,EACV,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,EAC1B,IAAI,EAAC,QAAQ,GACZ,IAdG,KAAK,CAAC,EAAE,CAeL,CACT,CAAC,EAGD,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,iBAEC,EAAE,EAAE,GAAG,EACP,EAAE,EAAE,CAAC,EACL,CAAC,EAAE,CAAC,EACJ,IAAI,EAAC,wBAAwB,EAC7B,OAAO,EAAE,CAAC,YAEV,kBACC,aAAa,EAAC,SAAS,EACvB,IAAI,EAAC,GAAG,EACR,EAAE,EAAC,GAAG,EACN,GAAG,EAAC,MAAM,EACV,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,EAC1B,IAAI,EAAC,QAAQ,GACZ,IAdG,KAAK,CAAC,EAAE,CAeL,CACT,CAAC,IACG,IACD,EAGN,0BAAQ;;;;;;;;;IASP,GAAS,IACL,CACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type * as React from "react";
2
+ export declare function HalftoneBackground(): React.JSX.Element;
3
+ //# sourceMappingURL=halftone-background.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"halftone-background.d.ts","sourceRoot":"","sources":["../../src/components/halftone-background.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AA8IpC,wBAAgB,kBAAkB,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CA+ItD"}
@@ -0,0 +1,248 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ const VERTEX_SHADER = `
4
+ attribute vec2 a_position;
5
+ void main() {
6
+ gl_Position = vec4(a_position, 0.0, 1.0);
7
+ }`;
8
+ const FRAGMENT_SHADER = `
9
+ precision highp float;
10
+
11
+ uniform float u_time;
12
+ uniform vec2 u_resolution;
13
+ uniform vec2 u_mouse;
14
+ uniform float u_click;
15
+ uniform vec2 u_clickPos;
16
+
17
+ vec3 mod289(vec3 x) { return x - floor(x * (1.0/289.0)) * 289.0; }
18
+ vec2 mod289(vec2 x) { return x - floor(x * (1.0/289.0)) * 289.0; }
19
+ vec3 permute(vec3 x) { return mod289(((x*34.0)+1.0)*x); }
20
+
21
+ float snoise(vec2 v) {
22
+ const vec4 C = vec4(
23
+ 0.211324865405187,
24
+ 0.366025403784439,
25
+ -0.577350269189626,
26
+ 0.024390243902439
27
+ );
28
+ vec2 i = floor(v + dot(v, C.yy));
29
+ vec2 x0 = v - i + dot(i, C.xx);
30
+ vec2 i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
31
+ vec4 x12 = x0.xyxy + C.xxzz;
32
+ x12.xy -= i1;
33
+ i = mod289(i);
34
+ vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0)) + i.x + vec3(0.0, i1.x, 1.0));
35
+ vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0);
36
+ m = m*m;
37
+ m = m*m;
38
+ vec3 x = 2.0 * fract(p * C.www) - 1.0;
39
+ vec3 h = abs(x) - 0.5;
40
+ vec3 ox = floor(x + 0.5);
41
+ vec3 a0 = x - ox;
42
+ m *= 1.79284291400159 - 0.85373472095314 * (a0*a0 + h*h);
43
+ vec3 g;
44
+ g.x = a0.x * x0.x + h.x * x0.y;
45
+ g.yz = a0.yz * x12.xz + h.yz * x12.yw;
46
+ return 130.0 * dot(m, g);
47
+ }
48
+
49
+ float fbm(vec2 p) {
50
+ float value = 0.0;
51
+ float amp = 0.5;
52
+ float freq = 1.0;
53
+ for (int i = 0; i < 6; i++) {
54
+ value += amp * snoise(p * freq);
55
+ freq *= 2.0;
56
+ amp *= 0.5;
57
+ }
58
+ return value;
59
+ }
60
+
61
+ float hash21(vec2 p) {
62
+ p = fract(p * vec2(233.34, 851.73));
63
+ p += dot(p, p + 23.45);
64
+ return fract(p.x * p.y);
65
+ }
66
+
67
+ void main() {
68
+ vec2 uv = gl_FragCoord.xy / u_resolution.xy;
69
+ float aspect = u_resolution.x / u_resolution.y;
70
+ float time = u_time;
71
+ float t = time * 0.04;
72
+
73
+ vec2 ap = vec2(uv.x * aspect, uv.y);
74
+
75
+ // ═══ SHARED MOUSE WARP ═══
76
+ vec2 scaledP = ap * 2.5;
77
+ vec2 mUV = u_mouse;
78
+ mUV.x *= aspect;
79
+ mUV *= 2.5;
80
+ vec2 mDiff = scaledP - mUV;
81
+ float mDist = length(mDiff);
82
+ vec2 warp = vec2(0.0);
83
+ if (u_mouse.x > 0.0 && mDist < 0.5) {
84
+ warp = normalize(mDiff) * smoothstep(0.5, 0.0, mDist) * 0.2;
85
+ }
86
+ if (u_click > 0.01) {
87
+ vec2 cUV = u_clickPos;
88
+ cUV.x *= aspect;
89
+ cUV *= 2.5;
90
+ vec2 cD = scaledP - cUV;
91
+ float cDist = length(cD);
92
+ warp += normalize(cD + 0.001) * sin(cDist * 12.0 - time * 8.0) * u_click * 0.4 * exp(-cDist * 2.0);
93
+ }
94
+
95
+ // ═══ NOISE LAYER ═══
96
+ vec2 np = scaledP + warp;
97
+ vec2 q = vec2(fbm(np + t * 0.3), fbm(np + vec2(5.2, 1.3) + t * 0.2));
98
+ vec2 r = vec2(
99
+ fbm(np + 4.0 * q + vec2(1.7, 9.2) + t * 0.15),
100
+ fbm(np + 4.0 * q + vec2(8.3, 2.8) + t * 0.12)
101
+ );
102
+ float f = fbm(np + 4.0 * r);
103
+ float noise = clamp(f*f*f + 0.6*f*f + 0.5*f, 0.0, 1.0) * 0.15;
104
+
105
+ // ═══ CONTRIBUTION GRID ═══
106
+ vec2 gp = ap;
107
+ gp += vec2(snoise(ap * 3.0 + t), snoise(ap * 3.0 + t + 50.0)) * 0.004;
108
+ gp += warp * 0.04;
109
+ gp += vec2(t * 0.2, t * 0.12);
110
+
111
+ float cellTotal = 0.025;
112
+ vec2 cellId = floor(gp / cellTotal);
113
+ vec2 cellUV = fract(gp / cellTotal);
114
+
115
+ float pad = 0.10;
116
+ float edge = 0.04;
117
+ float inX = smoothstep(pad - edge, pad + edge, cellUV.x)
118
+ * (1.0 - smoothstep(1.0 - pad - edge, 1.0 - pad + edge, cellUV.x));
119
+ float inY = smoothstep(pad - edge, pad + edge, cellUV.y)
120
+ * (1.0 - smoothstep(1.0 - pad - edge, 1.0 - pad + edge, cellUV.y));
121
+ float inSquare = inX * inY;
122
+
123
+ float hVal = hash21(cellId);
124
+ float level = hVal < 0.35 ? 0.0 : (hVal - 0.35) / 0.65;
125
+ level *= level;
126
+
127
+ vec2 fp = uv - vec2(0.45, 0.55);
128
+ float gFade = max(1.0 - smoothstep(0.15, 0.45, length(fp * vec2(1.3, 1.6))), 0.0);
129
+
130
+ float gridReveal = smoothstep(0.5, 3.0, time);
131
+ float grid = inSquare * level * gFade * gridReveal * 0.10;
132
+
133
+ // ═══ COMPOSE ═══
134
+ vec2 vc = uv - 0.5;
135
+ float vignette = 1.0 - dot(vc, vc) * 0.3;
136
+
137
+ float col = noise * vignette + grid;
138
+ gl_FragColor = vec4(vec3(col), 1.0);
139
+ }`;
140
+ export function HalftoneBackground() {
141
+ const canvasRef = useRef(null);
142
+ const wrapperRef = useRef(null);
143
+ const frameRef = useRef(0);
144
+ const mouseRef = useRef({ x: -1, y: -1 });
145
+ const smoothMouseRef = useRef({ x: -1, y: -1 });
146
+ const clickRef = useRef({ strength: 0, x: 0, y: 0 });
147
+ useEffect(() => {
148
+ const canvas = canvasRef.current;
149
+ const wrapper = wrapperRef.current;
150
+ if (!canvas || !wrapper)
151
+ return;
152
+ const gl = canvas.getContext("webgl", {
153
+ alpha: false,
154
+ antialias: false,
155
+ preserveDrawingBuffer: false,
156
+ });
157
+ if (!gl)
158
+ return;
159
+ function createShader(type, source) {
160
+ const shader = gl.createShader(type);
161
+ gl.shaderSource(shader, source);
162
+ gl.compileShader(shader);
163
+ return shader;
164
+ }
165
+ const vs = createShader(gl.VERTEX_SHADER, VERTEX_SHADER);
166
+ const fs = createShader(gl.FRAGMENT_SHADER, FRAGMENT_SHADER);
167
+ const program = gl.createProgram();
168
+ gl.attachShader(program, vs);
169
+ gl.attachShader(program, fs);
170
+ gl.linkProgram(program);
171
+ gl.useProgram(program);
172
+ const buffer = gl.createBuffer();
173
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
174
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]), gl.STATIC_DRAW);
175
+ const aPosition = gl.getAttribLocation(program, "a_position");
176
+ gl.enableVertexAttribArray(aPosition);
177
+ gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0);
178
+ const uTime = gl.getUniformLocation(program, "u_time");
179
+ const uResolution = gl.getUniformLocation(program, "u_resolution");
180
+ const uMouse = gl.getUniformLocation(program, "u_mouse");
181
+ const uClick = gl.getUniformLocation(program, "u_click");
182
+ const uClickPos = gl.getUniformLocation(program, "u_clickPos");
183
+ const startTime = performance.now();
184
+ const resize = () => {
185
+ const dpr = Math.min(window.devicePixelRatio || 1, 2);
186
+ const scale = 0.5 * dpr;
187
+ canvas.width = canvas.offsetWidth * scale;
188
+ canvas.height = canvas.offsetHeight * scale;
189
+ gl.viewport(0, 0, canvas.width, canvas.height);
190
+ };
191
+ resize();
192
+ window.addEventListener("resize", resize);
193
+ const onMouseMove = (e) => {
194
+ const rect = wrapper.getBoundingClientRect();
195
+ mouseRef.current.x = (e.clientX - rect.left) / rect.width;
196
+ mouseRef.current.y = 1.0 - (e.clientY - rect.top) / rect.height;
197
+ };
198
+ const onMouseLeave = () => {
199
+ mouseRef.current.x = -1;
200
+ mouseRef.current.y = -1;
201
+ };
202
+ const onClick = (e) => {
203
+ const rect = wrapper.getBoundingClientRect();
204
+ clickRef.current.x = (e.clientX - rect.left) / rect.width;
205
+ clickRef.current.y = 1.0 - (e.clientY - rect.top) / rect.height;
206
+ clickRef.current.strength = 1.0;
207
+ };
208
+ window.addEventListener("mousemove", onMouseMove, { passive: true });
209
+ wrapper.addEventListener("mouseleave", onMouseLeave);
210
+ wrapper.addEventListener("click", onClick);
211
+ const draw = () => {
212
+ const elapsed = (performance.now() - startTime) / 1000;
213
+ const lerp = 0.08;
214
+ const target = mouseRef.current;
215
+ const smooth = smoothMouseRef.current;
216
+ if (target.x < 0) {
217
+ smooth.x += (target.x - smooth.x) * 0.02;
218
+ smooth.y += (target.y - smooth.y) * 0.02;
219
+ }
220
+ else {
221
+ smooth.x += (target.x - smooth.x) * lerp;
222
+ smooth.y += (target.y - smooth.y) * lerp;
223
+ }
224
+ clickRef.current.strength *= 0.96;
225
+ gl.uniform1f(uTime, elapsed);
226
+ gl.uniform2f(uResolution, canvas.width, canvas.height);
227
+ gl.uniform2f(uMouse, smooth.x, smooth.y);
228
+ gl.uniform1f(uClick, clickRef.current.strength);
229
+ gl.uniform2f(uClickPos, clickRef.current.x, clickRef.current.y);
230
+ gl.drawArrays(gl.TRIANGLES, 0, 6);
231
+ frameRef.current = requestAnimationFrame(draw);
232
+ };
233
+ frameRef.current = requestAnimationFrame(draw);
234
+ return () => {
235
+ cancelAnimationFrame(frameRef.current);
236
+ window.removeEventListener("resize", resize);
237
+ window.removeEventListener("mousemove", onMouseMove);
238
+ wrapper.removeEventListener("mouseleave", onMouseLeave);
239
+ wrapper.removeEventListener("click", onClick);
240
+ gl.deleteProgram(program);
241
+ gl.deleteShader(vs);
242
+ gl.deleteShader(fs);
243
+ gl.deleteBuffer(buffer);
244
+ };
245
+ }, []);
246
+ return (_jsx("div", { ref: wrapperRef, className: "absolute inset-0 overflow-hidden", style: { background: "var(--shader-bg)" }, "aria-hidden": "true", children: _jsx("canvas", { ref: canvasRef, className: "w-full h-full", style: { filter: "var(--shader-filter)" } }) }));
247
+ }
248
+ //# sourceMappingURL=halftone-background.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"halftone-background.js","sourceRoot":"","sources":["../../src/components/halftone-background.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type * as React from "react";
2
+ import type { ComponentProps } from "react";
3
+ import { type VariantProps } from "class-variance-authority";
4
+ import type { ClassProp } from "class-variance-authority/types";
5
+ import { Button } from "./button";
6
+ declare function InputGroup({ className, ...props }: ComponentProps<"div">): React.JSX.Element;
7
+ declare const inputGroupAddonVariants: (props?: ({
8
+ align?: "inline-start" | "inline-end" | "block-start" | "block-end" | null | undefined;
9
+ } & ClassProp) | undefined) => string;
10
+ declare function InputGroupAddon({ className, align, ...props }: ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>): React.JSX.Element;
11
+ declare const inputGroupButtonVariants: (props?: ({
12
+ size?: "xs" | "sm" | "icon-xs" | "icon-sm" | null | undefined;
13
+ } & ClassProp) | undefined) => string;
14
+ declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<ComponentProps<typeof Button>, "size"> & VariantProps<typeof inputGroupButtonVariants>): React.JSX.Element;
15
+ declare function InputGroupText({ className, ...props }: ComponentProps<"span">): React.JSX.Element;
16
+ declare function InputGroupInput({ className, ...props }: ComponentProps<"input">): React.JSX.Element;
17
+ declare function InputGroupTextarea({ className, ...props }: ComponentProps<"textarea">): React.JSX.Element;
18
+ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea, };
19
+ //# sourceMappingURL=input-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-group.d.ts","sourceRoot":"","sources":["../../src/components/input-group.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0BrF;AAED,QAAA,MAAM,uBAAuB,EAAE,CAC9B,KAAK,CAAC,EACH,CAAC;IACD,KAAK,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;CACtF,GAAG,SAAS,CAAC,GACd,SAAS,KACR,MAmBJ,CAAC;AAEF,iBAAS,eAAe,CAAC,EACxB,SAAS,EACT,KAAsB,EACtB,GAAG,KAAK,EACR,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,uBAAuB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAgB1F;AAED,QAAA,MAAM,wBAAwB,EAAE,CAC/B,KAAK,CAAC,EACH,CAAC;IACD,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;CAC7D,GAAG,SAAS,CAAC,GACd,SAAS,KACR,MAYH,CAAC;AAEH,iBAAS,gBAAgB,CAAC,EACzB,SAAS,EACT,IAAe,EACf,OAAiB,EACjB,IAAW,EACX,GAAG,KAAK,EACR,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,MAAM,CAAC,GAC7C,YAAY,CAAC,OAAO,wBAAwB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAUjE;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAU1F;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAW5F;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAWlG;AAED,OAAO,EACN,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,GAClB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import { cn } from "../foundation/cn";
4
+ import { Button } from "./button";
5
+ import { Input } from "./input";
6
+ import { Textarea } from "./textarea";
7
+ function InputGroup({ className, ...props }) {
8
+ return (_jsx("div", { "data-slot": "input-group", role: "group", className: cn("group/input-group relative flex w-full items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none dark:bg-input/30", "h-9 min-w-0 has-[>textarea]:h-auto",
9
+ // Variants based on alignment.
10
+ "has-[>[data-align=inline-start]]:[&>input]:pl-2", "has-[>[data-align=inline-end]]:[&>input]:pr-2", "has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3", "has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3",
11
+ // Focus state.
12
+ "has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50",
13
+ // Error state.
14
+ "has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40", className), ...props }));
15
+ }
16
+ const inputGroupAddonVariants = cva("flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4", {
17
+ variants: {
18
+ align: {
19
+ "inline-start": "order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]",
20
+ "inline-end": "order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]",
21
+ "block-start": "order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3",
22
+ "block-end": "order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3",
23
+ },
24
+ },
25
+ defaultVariants: {
26
+ align: "inline-start",
27
+ },
28
+ });
29
+ function InputGroupAddon({ className, align = "inline-start", ...props }) {
30
+ return (_jsx("div", { role: "group", "data-slot": "input-group-addon", "data-align": align, className: cn(inputGroupAddonVariants({ align }), className), onClick: (e) => {
31
+ if (e.target.closest("button")) {
32
+ return;
33
+ }
34
+ e.currentTarget.parentElement?.querySelector("input")?.focus();
35
+ }, ...props }));
36
+ }
37
+ const inputGroupButtonVariants = cva("flex items-center gap-2 text-sm shadow-none", {
38
+ variants: {
39
+ size: {
40
+ xs: "h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5",
41
+ sm: "h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5",
42
+ "icon-xs": "size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0",
43
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0",
44
+ },
45
+ },
46
+ defaultVariants: {
47
+ size: "xs",
48
+ },
49
+ });
50
+ function InputGroupButton({ className, type = "button", variant = "ghost", size = "xs", ...props }) {
51
+ return (_jsx(Button, { type: type, "data-size": size, variant: variant, className: cn(inputGroupButtonVariants({ size }), className), ...props }));
52
+ }
53
+ function InputGroupText({ className, ...props }) {
54
+ return (_jsx("span", { className: cn("flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4", className), ...props }));
55
+ }
56
+ function InputGroupInput({ className, ...props }) {
57
+ return (_jsx(Input, { "data-slot": "input-group-control", className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent", className), ...props }));
58
+ }
59
+ function InputGroupTextarea({ className, ...props }) {
60
+ return (_jsx(Textarea, { "data-slot": "input-group-control", className: cn("flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent", className), ...props }));
61
+ }
62
+ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea, };
63
+ //# sourceMappingURL=input-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-group.js","sourceRoot":"","sources":["../../src/components/input-group.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAyB;IACjE,OAAO,CACN,2BACW,aAAa,EACvB,IAAI,EAAC,OAAO,EACZ,SAAS,EAAE,EAAE,CACZ,0JAA0J,EAC1J,oCAAoC;QAEpC,+BAA+B;QAC/B,iDAAiD,EACjD,+CAA+C,EAC/C,gIAAgI,EAChI,0HAA0H;QAE1H,eAAe;QACf,iMAAiM;QAEjM,eAAe;QACf,gLAAgL,EAEhL,SAAS,CACT,KACG,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,MAAM,uBAAuB,GAMf,GAAG,CAChB,yPAAyP,EACzP;IACC,QAAQ,EAAE;QACT,KAAK,EAAE;YACN,cAAc,EACb,uEAAuE;YACxE,YAAY,EACX,sEAAsE;YACvE,aAAa,EACZ,mGAAmG;YACpG,WAAW,EACV,kGAAkG;SACnG;KACD;IACD,eAAe,EAAE;QAChB,KAAK,EAAE,cAAc;KACrB;CACD,CACD,CAAC;AAEF,SAAS,eAAe,CAAC,EACxB,SAAS,EACT,KAAK,GAAG,cAAc,EACtB,GAAG,KAAK,EAC8D;IACtE,OAAO,CACN,cACC,IAAI,EAAC,OAAO,eACF,mBAAmB,gBACjB,KAAK,EACjB,SAAS,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,EAC5D,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACd,IAAK,CAAC,CAAC,MAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjD,OAAO;YACR,CAAC;YACD,CAAC,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;QAChE,CAAC,KACG,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,MAAM,wBAAwB,GAMhB,GAAG,CAAC,6CAA6C,EAAE;IAChE,QAAQ,EAAE;QACT,IAAI,EAAE;YACL,EAAE,EAAE,yGAAyG;YAC7G,EAAE,EAAE,iDAAiD;YACrD,SAAS,EAAE,6DAA6D;YACxE,SAAS,EAAE,2BAA2B;SACtC;KACD;IACD,eAAe,EAAE;QAChB,IAAI,EAAE,IAAI;KACV;CACD,CAAC,CAAC;AAEH,SAAS,gBAAgB,CAAC,EACzB,SAAS,EACT,IAAI,GAAG,QAAQ,EACf,OAAO,GAAG,OAAO,EACjB,IAAI,GAAG,IAAI,EACX,GAAG,KAAK,EAEqC;IAC7C,OAAO,CACN,KAAC,MAAM,IACN,IAAI,EAAE,IAAI,eACC,IAAI,EACf,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,KACxD,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA0B;IACtE,OAAO,CACN,eACC,SAAS,EAAE,EAAE,CACZ,wHAAwH,EACxH,SAAS,CACT,KACG,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA2B;IACxE,OAAO,CACN,KAAC,KAAK,iBACK,qBAAqB,EAC/B,SAAS,EAAE,EAAE,CACZ,kGAAkG,EAClG,SAAS,CACT,KACG,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA8B;IAC9E,OAAO,CACN,KAAC,QAAQ,iBACE,qBAAqB,EAC/B,SAAS,EAAE,EAAE,CACZ,mHAAmH,EACnH,SAAS,CACT,KACG,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,OAAO,EACN,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,GAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type * as React from "react";
2
+ import type { ComponentProps } from 'react';
3
+ declare function Input({ className, type, ...props }: ComponentProps<'input'>): React.JSX.Element;
4
+ export { Input };
5
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAI5C,iBAAS,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAcxF;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../foundation/cn';
3
+ function Input({ className, type, ...props }) {
4
+ return (_jsx("input", { type: type, "data-slot": "input", className: cn("h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30", "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50", "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40", className), ...props }));
5
+ }
6
+ export { Input };
7
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEtC,SAAS,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAA2B;IACpE,OAAO,CACN,gBACC,IAAI,EAAE,IAAI,eACA,OAAO,EACjB,SAAS,EAAE,EAAE,CACZ,4bAA4b,EAC5b,+EAA+E,EAC/E,wGAAwG,EACxG,SAAS,CACT,KACG,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type * as React from "react";
2
+ interface LiveDurationProps {
3
+ startedAt: string | null;
4
+ completedAt?: string | null;
5
+ className?: string;
6
+ }
7
+ export declare function LiveDuration({ startedAt, completedAt, className }: LiveDurationProps): React.ReactNode;
8
+ export {};
9
+ //# sourceMappingURL=live-duration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-duration.d.ts","sourceRoot":"","sources":["../../src/components/live-duration.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAyCpC,UAAU,iBAAiB;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAmBtG"}
@@ -0,0 +1,55 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ // Inlined from "@/lib/utils" (formatDuration) — only this helper is used here.
4
+ function formatDuration(startedAt, completedAt) {
5
+ if (!startedAt)
6
+ return "";
7
+ const start = new Date(startedAt);
8
+ const end = completedAt ? new Date(completedAt) : new Date();
9
+ const totalSeconds = Math.max(0, Math.floor((end.getTime() - start.getTime()) / 1000));
10
+ const hours = Math.floor(totalSeconds / 3600);
11
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
12
+ const seconds = totalSeconds % 60;
13
+ if (hours > 0)
14
+ return `${hours}h ${minutes}m`;
15
+ if (minutes > 0)
16
+ return `${minutes}m ${seconds}s`;
17
+ return `${seconds}s`;
18
+ }
19
+ // Inlined from "@/lib/live-tick".
20
+ // Shared tick for LiveDuration components. One interval drives all subscribers
21
+ // instead of each component running its own 1s interval.
22
+ const callbacks = new Set();
23
+ const tickState = {
24
+ intervalId: null,
25
+ };
26
+ function subscribeLiveTick(callback) {
27
+ callbacks.add(callback);
28
+ if (tickState.intervalId === null) {
29
+ tickState.intervalId = setInterval(() => {
30
+ callbacks.forEach((cb) => cb());
31
+ }, 1000);
32
+ }
33
+ return () => {
34
+ callbacks.delete(callback);
35
+ if (callbacks.size === 0 && tickState.intervalId !== null) {
36
+ clearInterval(tickState.intervalId);
37
+ tickState.intervalId = null;
38
+ }
39
+ };
40
+ }
41
+ export function LiveDuration({ startedAt, completedAt, className }) {
42
+ // tick forces re-renders when subscribeLiveTick fires; value is unused in render
43
+ const [, setTick] = useState(0);
44
+ useEffect(() => {
45
+ if (!startedAt || completedAt != null)
46
+ return;
47
+ setTick(0);
48
+ return subscribeLiveTick(() => setTick((t) => t + 1));
49
+ }, [startedAt, completedAt]);
50
+ if (!startedAt)
51
+ return null;
52
+ const formatted = formatDuration(startedAt, completedAt ?? null);
53
+ return (_jsx("span", { className: className, suppressHydrationWarning: true, children: formatted }));
54
+ }
55
+ //# sourceMappingURL=live-duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-duration.js","sourceRoot":"","sources":["../../src/components/live-duration.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type * as React from "react";
2
+ export declare function Logo({ className }: {
3
+ className?: string;
4
+ }): React.JSX.Element;
5
+ export declare function LogoMark({ className }: {
6
+ className?: string;
7
+ }): React.JSX.Element;
8
+ //# sourceMappingURL=logo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../../src/components/logo.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAGpC,wBAAgB,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAM7E;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAMjF"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../foundation/cn';
3
+ export function Logo({ className }) {
4
+ return (_jsx("span", { className: cn("font-mono text-sm font-medium tracking-tight", className), children: "BETTER-HUB." }));
5
+ }
6
+ export function LogoMark({ className }) {
7
+ return (_jsx("span", { className: cn("font-mono text-sm font-bold tracking-tight", className), children: "b." }));
8
+ }
9
+ //# sourceMappingURL=logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/components/logo.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEtC,MAAM,UAAU,IAAI,CAAC,EAAE,SAAS,EAA0B;IACzD,OAAO,CACN,eAAM,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,SAAS,CAAC,4BAEvE,CACP,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAA0B;IAC7D,OAAO,CACN,eAAM,SAAS,EAAE,EAAE,CAAC,4CAA4C,EAAE,SAAS,CAAC,mBAErE,CACP,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type * as React from "react";
2
+ import type { ComponentProps } from "react";
3
+ import { Popover as PopoverPrimitive } from "radix-ui";
4
+ declare function Popover({ ...props }: ComponentProps<typeof PopoverPrimitive.Root>): React.JSX.Element;
5
+ declare function PopoverTrigger({ ...props }: ComponentProps<typeof PopoverPrimitive.Trigger>): React.JSX.Element;
6
+ declare function PopoverContent({ className, align, sideOffset, ...props }: ComponentProps<typeof PopoverPrimitive.Content>): React.JSX.Element;
7
+ declare function PopoverAnchor({ ...props }: ComponentProps<typeof PopoverPrimitive.Anchor>): React.JSX.Element;
8
+ declare function PopoverHeader({ className, ...props }: ComponentProps<"div">): React.JSX.Element;
9
+ declare function PopoverTitle({ className, ...props }: ComponentProps<"h2">): React.JSX.Element;
10
+ declare function PopoverDescription({ className, ...props }: ComponentProps<"p">): React.JSX.Element;
11
+ export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverHeader, PopoverTitle, PopoverDescription, };
12
+ //# sourceMappingURL=popover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIvD,iBAAS,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAE9F;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAExG;AAED,iBAAS,cAAc,CAAC,EACvB,SAAS,EACT,KAAgB,EAChB,UAAc,EACd,GAAG,KAAK,EACR,EAAE,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAerE;AAED,iBAAS,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,gBAAgB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAEtG;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAQxF;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAQtF;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAQ3F;AAED,OAAO,EACN,OAAO,EACP,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,GAClB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Popover as PopoverPrimitive } from "radix-ui";
3
+ import { cn } from "../foundation/cn";
4
+ function Popover({ ...props }) {
5
+ return _jsx(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
6
+ }
7
+ function PopoverTrigger({ ...props }) {
8
+ return _jsx(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
9
+ }
10
+ function PopoverContent({ className, align = "center", sideOffset = 4, ...props }) {
11
+ return (_jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { "data-slot": "popover-content", align: align, sideOffset: sideOffset, className: cn("z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95", className), ...props }) }));
12
+ }
13
+ function PopoverAnchor({ ...props }) {
14
+ return _jsx(PopoverPrimitive.Anchor, { "data-slot": "popover-anchor", ...props });
15
+ }
16
+ function PopoverHeader({ className, ...props }) {
17
+ return (_jsx("div", { "data-slot": "popover-header", className: cn("flex flex-col gap-1 text-sm", className), ...props }));
18
+ }
19
+ function PopoverTitle({ className, ...props }) {
20
+ return (_jsx("div", { "data-slot": "popover-title", className: cn("font-medium", className), ...props }));
21
+ }
22
+ function PopoverDescription({ className, ...props }) {
23
+ return (_jsx("p", { "data-slot": "popover-description", className: cn("text-muted-foreground", className), ...props }));
24
+ }
25
+ export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverHeader, PopoverTitle, PopoverDescription, };
26
+ //# sourceMappingURL=popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.js","sourceRoot":"","sources":["../../src/components/popover.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEtC,SAAS,OAAO,CAAC,EAAE,GAAG,KAAK,EAAgD;IAC1E,OAAO,KAAC,gBAAgB,CAAC,IAAI,iBAAW,SAAS,KAAK,KAAK,GAAI,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAmD;IACpF,OAAO,KAAC,gBAAgB,CAAC,OAAO,iBAAW,iBAAiB,KAAK,KAAK,GAAI,CAAC;AAC5E,CAAC;AAED,SAAS,cAAc,CAAC,EACvB,SAAS,EACT,KAAK,GAAG,QAAQ,EAChB,UAAU,GAAG,CAAC,EACd,GAAG,KAAK,EACyC;IACjD,OAAO,CACN,KAAC,gBAAgB,CAAC,MAAM,cACvB,KAAC,gBAAgB,CAAC,OAAO,iBACd,iBAAiB,EAC3B,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,EAAE,CACZ,geAAge,EAChe,SAAS,CACT,KACG,KAAK,GACR,GACuB,CAC1B,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,GAAG,KAAK,EAAkD;IAClF,OAAO,KAAC,gBAAgB,CAAC,MAAM,iBAAW,gBAAgB,KAAK,KAAK,GAAI,CAAC;AAC1E,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAyB;IACpE,OAAO,CACN,2BACW,gBAAgB,EAC1B,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,CAAC,KACnD,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAwB;IAClE,OAAO,CACN,2BACW,eAAe,EACzB,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,KACnC,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAuB;IACvE,OAAO,CACN,yBACW,qBAAqB,EAC/B,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,KAC7C,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,OAAO,EACN,OAAO,EACP,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,GAClB,CAAC"}