@farzadbagheri/fb-components 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/ai.cjs +16 -0
  4. package/dist/ai.cjs.map +1 -0
  5. package/dist/ai.css +176 -0
  6. package/dist/ai.css.map +1 -0
  7. package/dist/ai.d.cts +33 -0
  8. package/dist/ai.d.ts +33 -0
  9. package/dist/ai.js +3 -0
  10. package/dist/ai.js.map +1 -0
  11. package/dist/backgrounds.cjs +32 -0
  12. package/dist/backgrounds.cjs.map +1 -0
  13. package/dist/backgrounds.css +253 -0
  14. package/dist/backgrounds.css.map +1 -0
  15. package/dist/backgrounds.d.cts +71 -0
  16. package/dist/backgrounds.d.ts +71 -0
  17. package/dist/backgrounds.js +3 -0
  18. package/dist/backgrounds.js.map +1 -0
  19. package/dist/buttons.cjs +20 -0
  20. package/dist/buttons.cjs.map +1 -0
  21. package/dist/buttons.css +116 -0
  22. package/dist/buttons.css.map +1 -0
  23. package/dist/buttons.d.cts +40 -0
  24. package/dist/buttons.d.ts +40 -0
  25. package/dist/buttons.js +3 -0
  26. package/dist/buttons.js.map +1 -0
  27. package/dist/chunk-4FWJRWS5.cjs +125 -0
  28. package/dist/chunk-4FWJRWS5.cjs.map +1 -0
  29. package/dist/chunk-BSEOOGOV.cjs +217 -0
  30. package/dist/chunk-BSEOOGOV.cjs.map +1 -0
  31. package/dist/chunk-C3ASXASL.cjs +205 -0
  32. package/dist/chunk-C3ASXASL.cjs.map +1 -0
  33. package/dist/chunk-CTD2GDO6.cjs +121 -0
  34. package/dist/chunk-CTD2GDO6.cjs.map +1 -0
  35. package/dist/chunk-EIE6FLCL.js +202 -0
  36. package/dist/chunk-EIE6FLCL.js.map +1 -0
  37. package/dist/chunk-H2AV67DY.cjs +260 -0
  38. package/dist/chunk-H2AV67DY.cjs.map +1 -0
  39. package/dist/chunk-H6Y3EJPA.cjs +83 -0
  40. package/dist/chunk-H6Y3EJPA.cjs.map +1 -0
  41. package/dist/chunk-JHOJY54P.js +123 -0
  42. package/dist/chunk-JHOJY54P.js.map +1 -0
  43. package/dist/chunk-JWV3IITG.js +80 -0
  44. package/dist/chunk-JWV3IITG.js.map +1 -0
  45. package/dist/chunk-K5QRX5CZ.js +194 -0
  46. package/dist/chunk-K5QRX5CZ.js.map +1 -0
  47. package/dist/chunk-MKCSRMHF.cjs +198 -0
  48. package/dist/chunk-MKCSRMHF.cjs.map +1 -0
  49. package/dist/chunk-R2F3FTBL.js +119 -0
  50. package/dist/chunk-R2F3FTBL.js.map +1 -0
  51. package/dist/chunk-ROKPXWY2.cjs +198 -0
  52. package/dist/chunk-ROKPXWY2.cjs.map +1 -0
  53. package/dist/chunk-RUSFF3MZ.js +214 -0
  54. package/dist/chunk-RUSFF3MZ.js.map +1 -0
  55. package/dist/chunk-T7CC3CLH.js +195 -0
  56. package/dist/chunk-T7CC3CLH.js.map +1 -0
  57. package/dist/chunk-UWQ5QNE3.cjs +311 -0
  58. package/dist/chunk-UWQ5QNE3.cjs.map +1 -0
  59. package/dist/chunk-WDUETPNG.js +256 -0
  60. package/dist/chunk-WDUETPNG.js.map +1 -0
  61. package/dist/chunk-YQSTEIU5.js +304 -0
  62. package/dist/chunk-YQSTEIU5.js.map +1 -0
  63. package/dist/data.cjs +20 -0
  64. package/dist/data.cjs.map +1 -0
  65. package/dist/data.css +151 -0
  66. package/dist/data.css.map +1 -0
  67. package/dist/data.d.cts +47 -0
  68. package/dist/data.d.ts +47 -0
  69. package/dist/data.js +3 -0
  70. package/dist/data.js.map +1 -0
  71. package/dist/heroes.cjs +12 -0
  72. package/dist/heroes.cjs.map +1 -0
  73. package/dist/heroes.css +190 -0
  74. package/dist/heroes.css.map +1 -0
  75. package/dist/heroes.d.cts +19 -0
  76. package/dist/heroes.d.ts +19 -0
  77. package/dist/heroes.js +3 -0
  78. package/dist/heroes.js.map +1 -0
  79. package/dist/index.cjs +104 -0
  80. package/dist/index.cjs.map +1 -0
  81. package/dist/index.css +1269 -0
  82. package/dist/index.css.map +1 -0
  83. package/dist/index.d.cts +10 -0
  84. package/dist/index.d.ts +10 -0
  85. package/dist/index.js +11 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/landing.cjs +12 -0
  88. package/dist/landing.cjs.map +1 -0
  89. package/dist/landing.css +137 -0
  90. package/dist/landing.css.map +1 -0
  91. package/dist/landing.d.cts +14 -0
  92. package/dist/landing.d.ts +14 -0
  93. package/dist/landing.js +3 -0
  94. package/dist/landing.js.map +1 -0
  95. package/dist/motion.cjs +16 -0
  96. package/dist/motion.cjs.map +1 -0
  97. package/dist/motion.css +79 -0
  98. package/dist/motion.css.map +1 -0
  99. package/dist/motion.d.cts +26 -0
  100. package/dist/motion.d.ts +26 -0
  101. package/dist/motion.js +3 -0
  102. package/dist/motion.js.map +1 -0
  103. package/dist/text.cjs +16 -0
  104. package/dist/text.cjs.map +1 -0
  105. package/dist/text.css +72 -0
  106. package/dist/text.css.map +1 -0
  107. package/dist/text.d.cts +28 -0
  108. package/dist/text.d.ts +28 -0
  109. package/dist/text.js +3 -0
  110. package/dist/text.js.map +1 -0
  111. package/dist/ui.cjs +16 -0
  112. package/dist/ui.cjs.map +1 -0
  113. package/dist/ui.css +95 -0
  114. package/dist/ui.css.map +1 -0
  115. package/dist/ui.d.cts +28 -0
  116. package/dist/ui.d.ts +28 -0
  117. package/dist/ui.js +3 -0
  118. package/dist/ui.js.map +1 -0
  119. package/package.json +134 -0
@@ -0,0 +1,121 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ // src/landing/StartupLanding.tsx
6
+ function StartupLanding({
7
+ accent = "#7d63ff",
8
+ background = "#08080c",
9
+ radius = 20,
10
+ showMetrics = true,
11
+ showFeatures = true,
12
+ className = "",
13
+ style,
14
+ ...props
15
+ }) {
16
+ return /* @__PURE__ */ jsxRuntime.jsxs(
17
+ "section",
18
+ {
19
+ ...props,
20
+ className: `fb-startup-landing ${className}`,
21
+ style: {
22
+ ...style,
23
+ background,
24
+ ["--fb-startup-accent"]: accent,
25
+ ["--fb-startup-radius"]: `${radius}px`
26
+ },
27
+ children: [
28
+ /* @__PURE__ */ jsxRuntime.jsxs("nav", { className: "fb-startup-landing__nav", children: [
29
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "ACME." }),
30
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
31
+ /* @__PURE__ */ jsxRuntime.jsx("a", { href: "#product", children: "Product" }),
32
+ /* @__PURE__ */ jsxRuntime.jsx("a", { href: "#features", children: "Features" }),
33
+ /* @__PURE__ */ jsxRuntime.jsx("a", { href: "#pricing", children: "Pricing" })
34
+ ] }),
35
+ /* @__PURE__ */ jsxRuntime.jsx(
36
+ "button",
37
+ {
38
+ type: "button",
39
+ children: "Join waitlist"
40
+ }
41
+ )
42
+ ] }),
43
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "fb-startup-landing__hero", children: [
44
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "LAUNCHING 2026" }),
45
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { children: [
46
+ "From idea",
47
+ /* @__PURE__ */ jsxRuntime.jsx("br", {}),
48
+ "to momentum."
49
+ ] }),
50
+ /* @__PURE__ */ jsxRuntime.jsx("p", { children: "A focused operating layer for ambitious startups that want to build, launch and learn faster." }),
51
+ /* @__PURE__ */ jsxRuntime.jsx(
52
+ "button",
53
+ {
54
+ type: "button",
55
+ children: "Get early access"
56
+ }
57
+ )
58
+ ] }),
59
+ showMetrics && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fb-startup-landing__metrics", children: [
60
+ [
61
+ "42K",
62
+ "Early users"
63
+ ],
64
+ [
65
+ "4.9",
66
+ "Average rating"
67
+ ],
68
+ [
69
+ "99.9%",
70
+ "Platform uptime"
71
+ ]
72
+ ].map(
73
+ ([
74
+ value,
75
+ label
76
+ ]) => /* @__PURE__ */ jsxRuntime.jsxs(
77
+ "article",
78
+ {
79
+ children: [
80
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: value }),
81
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: label })
82
+ ]
83
+ },
84
+ label
85
+ )
86
+ ) }),
87
+ showFeatures && /* @__PURE__ */ jsxRuntime.jsx(
88
+ "div",
89
+ {
90
+ id: "features",
91
+ className: "fb-startup-landing__features",
92
+ children: [
93
+ "Ship",
94
+ "Measure",
95
+ "Scale"
96
+ ].map(
97
+ (feature, index) => /* @__PURE__ */ jsxRuntime.jsxs(
98
+ "article",
99
+ {
100
+ children: [
101
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
102
+ "0",
103
+ index + 1
104
+ ] }),
105
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { children: feature }),
106
+ /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Simple tools designed around the decisions that matter." })
107
+ ]
108
+ },
109
+ feature
110
+ )
111
+ )
112
+ }
113
+ )
114
+ ]
115
+ }
116
+ );
117
+ }
118
+
119
+ exports.StartupLanding = StartupLanding;
120
+ //# sourceMappingURL=chunk-CTD2GDO6.cjs.map
121
+ //# sourceMappingURL=chunk-CTD2GDO6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/landing/StartupLanding.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"chunk-CTD2GDO6.cjs","sourcesContent":["import type {\r\n HTMLAttributes,\r\n} from \"react\";\r\n\r\nimport \"./StartupLanding.css\";\r\n\r\nexport interface StartupLandingProps\r\n extends HTMLAttributes<HTMLElement> {\r\n accent?: string;\r\n background?: string;\r\n radius?: number;\r\n\r\n showMetrics?: boolean;\r\n showFeatures?: boolean;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function StartupLanding({\r\n accent = \"#7d63ff\",\r\n background = \"#08080c\",\r\n radius = 20,\r\n\r\n showMetrics = true,\r\n showFeatures = true,\r\n\r\n className = \"\",\r\n style,\r\n\r\n ...props\r\n}: StartupLandingProps) {\r\n return (\r\n <section\r\n {...props}\r\n className={`fb-startup-landing ${className}`}\r\n style={{\r\n ...style,\r\n\r\n background,\r\n\r\n [\"--fb-startup-accent\" as string]:\r\n accent,\r\n\r\n [\"--fb-startup-radius\" as string]:\r\n `${radius}px`,\r\n }}\r\n >\r\n <nav className=\"fb-startup-landing__nav\">\r\n <strong>\r\n ACME.\r\n </strong>\r\n\r\n <div>\r\n <a href=\"#product\">\r\n Product\r\n </a>\r\n\r\n <a href=\"#features\">\r\n Features\r\n </a>\r\n\r\n <a href=\"#pricing\">\r\n Pricing\r\n </a>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n >\r\n Join waitlist\r\n </button>\r\n </nav>\r\n\r\n <div className=\"fb-startup-landing__hero\">\r\n <span>\r\n LAUNCHING 2026\r\n </span>\r\n\r\n <h2>\r\n From idea\r\n <br />\r\n to momentum.\r\n </h2>\r\n\r\n <p>\r\n A focused operating\r\n layer for ambitious\r\n startups that want to\r\n build, launch and learn\r\n faster.\r\n </p>\r\n\r\n <button\r\n type=\"button\"\r\n >\r\n Get early access\r\n </button>\r\n </div>\r\n\r\n {showMetrics && (\r\n <div className=\"fb-startup-landing__metrics\">\r\n {[\r\n [\r\n \"42K\",\r\n \"Early users\",\r\n ],\r\n [\r\n \"4.9\",\r\n \"Average rating\",\r\n ],\r\n [\r\n \"99.9%\",\r\n \"Platform uptime\",\r\n ],\r\n ].map(\r\n (\r\n [\r\n value,\r\n label,\r\n ]\r\n ) => (\r\n <article\r\n key={\r\n label\r\n }\r\n >\r\n <strong>\r\n {value}\r\n </strong>\r\n\r\n <span>\r\n {label}\r\n </span>\r\n </article>\r\n )\r\n )}\r\n </div>\r\n )}\r\n\r\n {showFeatures && (\r\n <div\r\n id=\"features\"\r\n className=\"fb-startup-landing__features\"\r\n >\r\n {[\r\n \"Ship\",\r\n \"Measure\",\r\n \"Scale\",\r\n ].map(\r\n (\r\n feature,\r\n index\r\n ) => (\r\n <article\r\n key={\r\n feature\r\n }\r\n >\r\n <span>\r\n 0{\r\n index +\r\n 1\r\n }\r\n </span>\r\n\r\n <h3>\r\n {feature}\r\n </h3>\r\n\r\n <p>\r\n Simple tools\r\n designed around\r\n the decisions\r\n that matter.\r\n </p>\r\n </article>\r\n )\r\n )}\r\n </div>\r\n )}\r\n </section>\r\n );\r\n}"]}
@@ -0,0 +1,202 @@
1
+ import { useState } from 'react';
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+
4
+ // src/ui/SpotlightCard.tsx
5
+ function SpotlightCard({
6
+ children = /* @__PURE__ */ jsxs(Fragment, { children: [
7
+ /* @__PURE__ */ jsx("span", { children: "FB" }),
8
+ /* @__PURE__ */ jsx("strong", { children: "Spotlight" }),
9
+ /* @__PURE__ */ jsx("p", { children: "Move your pointer across the card." })
10
+ ] }),
11
+ background = "#111116",
12
+ spotlightColor = "#9b7cff",
13
+ radius = 14,
14
+ glow = 35,
15
+ borderOpacity = 0.12,
16
+ className = ""
17
+ }) {
18
+ const [
19
+ point,
20
+ setPoint
21
+ ] = useState({
22
+ x: 50,
23
+ y: 30
24
+ });
25
+ function handleMove(event) {
26
+ const rect = event.currentTarget.getBoundingClientRect();
27
+ setPoint({
28
+ x: (event.clientX - rect.left) / rect.width * 100,
29
+ y: (event.clientY - rect.top) / rect.height * 100
30
+ });
31
+ }
32
+ return /* @__PURE__ */ jsx(
33
+ "div",
34
+ {
35
+ className: `fb-spotlight-card ${className}`,
36
+ onMouseMove: handleMove,
37
+ style: {
38
+ borderRadius: radius,
39
+ borderColor: `rgba(
40
+ 255,
41
+ 255,
42
+ 255,
43
+ ${borderOpacity}
44
+ )`,
45
+ background: `
46
+ radial-gradient(
47
+ circle at
48
+ ${point.x}%
49
+ ${point.y}%,
50
+ ${spotlightColor}${hexAlpha(
51
+ glow / 100
52
+ )},
53
+ transparent 38%
54
+ ),
55
+ ${background}
56
+ `
57
+ },
58
+ children
59
+ }
60
+ );
61
+ }
62
+ function hexAlpha(opacity) {
63
+ return Math.round(
64
+ Math.min(
65
+ 1,
66
+ Math.max(
67
+ 0,
68
+ opacity
69
+ )
70
+ ) * 255
71
+ ).toString(16).padStart(
72
+ 2,
73
+ "0"
74
+ );
75
+ }
76
+ function hexToRgb(value) {
77
+ const clean = value.replace(
78
+ "#",
79
+ ""
80
+ ).trim();
81
+ const normalized = clean.length === 3 ? clean.split("").map(
82
+ (character) => character + character
83
+ ).join("") : clean;
84
+ if (normalized.length !== 6) {
85
+ return {
86
+ r: 143,
87
+ g: 115,
88
+ b: 255
89
+ };
90
+ }
91
+ return {
92
+ r: Number.parseInt(
93
+ normalized.slice(
94
+ 0,
95
+ 2
96
+ ),
97
+ 16
98
+ ),
99
+ g: Number.parseInt(
100
+ normalized.slice(
101
+ 2,
102
+ 4
103
+ ),
104
+ 16
105
+ ),
106
+ b: Number.parseInt(
107
+ normalized.slice(
108
+ 4,
109
+ 6
110
+ ),
111
+ 16
112
+ )
113
+ };
114
+ }
115
+ function GlassCard({
116
+ children = /* @__PURE__ */ jsxs(Fragment, { children: [
117
+ /* @__PURE__ */ jsx("span", { className: "fb-glass-card__eyebrow", children: "01 / FEATURE" }),
118
+ /* @__PURE__ */ jsxs("div", { className: "fb-glass-card__content", children: [
119
+ /* @__PURE__ */ jsxs("strong", { children: [
120
+ "Built for",
121
+ /* @__PURE__ */ jsx("br", {}),
122
+ "motion."
123
+ ] }),
124
+ /* @__PURE__ */ jsx("p", { children: "Premium interaction without visual noise." })
125
+ ] })
126
+ ] }),
127
+ tint = "#8f73ff",
128
+ opacity = 0.08,
129
+ blur = 18,
130
+ radius = 22,
131
+ borderOpacity = 0.16,
132
+ glowColor = "#8f73ff",
133
+ glow = 34,
134
+ className = "",
135
+ style,
136
+ ...props
137
+ }) {
138
+ const tintRgb = hexToRgb(
139
+ tint
140
+ );
141
+ const glowRgb = hexToRgb(
142
+ glowColor
143
+ );
144
+ return /* @__PURE__ */ jsxs(
145
+ "div",
146
+ {
147
+ ...props,
148
+ className: `fb-glass-card ${className}`,
149
+ style: {
150
+ ...style,
151
+ borderRadius: radius,
152
+ borderColor: `rgba(
153
+ 255,
154
+ 255,
155
+ 255,
156
+ ${borderOpacity}
157
+ )`,
158
+ background: `linear-gradient(
159
+ 145deg,
160
+ rgba(
161
+ ${tintRgb.r},
162
+ ${tintRgb.g},
163
+ ${tintRgb.b},
164
+ ${opacity}
165
+ ),
166
+ rgba(
167
+ 255,
168
+ 255,
169
+ 255,
170
+ ${opacity * 0.35}
171
+ )
172
+ )`,
173
+ backdropFilter: `blur(${blur}px)`,
174
+ WebkitBackdropFilter: `blur(${blur}px)`,
175
+ boxShadow: `0 24px 80px rgba(
176
+ ${glowRgb.r},
177
+ ${glowRgb.g},
178
+ ${glowRgb.b},
179
+ ${glow / 400}
180
+ )`
181
+ },
182
+ children: [
183
+ /* @__PURE__ */ jsx(
184
+ "span",
185
+ {
186
+ className: "fb-glass-card__glow",
187
+ "aria-hidden": "true",
188
+ style: {
189
+ background: glowColor,
190
+ filter: `blur(${glow}px)`
191
+ }
192
+ }
193
+ ),
194
+ /* @__PURE__ */ jsx("div", { className: "fb-glass-card__inner", children })
195
+ ]
196
+ }
197
+ );
198
+ }
199
+
200
+ export { GlassCard, SpotlightCard };
201
+ //# sourceMappingURL=chunk-EIE6FLCL.js.map
202
+ //# sourceMappingURL=chunk-EIE6FLCL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/SpotlightCard.tsx","../src/ui/GlassCard.tsx"],"names":["jsxs","Fragment","jsx"],"mappings":"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","file":"chunk-EIE6FLCL.js","sourcesContent":["import {\r\n useState,\r\n} from \"react\";\r\n\r\nimport \"./SpotlightCard.css\";\r\n\r\nexport interface SpotlightCardProps {\r\n children?:\r\n React.ReactNode;\r\n\r\n background?:\r\n string;\r\n\r\n spotlightColor?:\r\n string;\r\n\r\n radius?:\r\n number;\r\n\r\n glow?:\r\n number;\r\n\r\n borderOpacity?:\r\n number;\r\n\r\n className?:\r\n string;\r\n}\r\n\r\nexport function SpotlightCard({\r\n children = (\r\n <>\r\n <span>\r\n FB\r\n </span>\r\n\r\n <strong>\r\n Spotlight\r\n </strong>\r\n\r\n <p>\r\n Move your pointer\r\n across the card.\r\n </p>\r\n </>\r\n ),\r\n\r\n background =\r\n \"#111116\",\r\n\r\n spotlightColor =\r\n \"#9b7cff\",\r\n\r\n radius =\r\n 14,\r\n\r\n glow =\r\n 35,\r\n\r\n borderOpacity =\r\n 0.12,\r\n\r\n className =\r\n \"\",\r\n}: SpotlightCardProps) {\r\n const [\r\n point,\r\n setPoint,\r\n ] =\r\n useState({\r\n x: 50,\r\n y: 30,\r\n });\r\n\r\n function handleMove(\r\n event:\r\n React.MouseEvent<HTMLDivElement>\r\n ) {\r\n const rect =\r\n event.currentTarget.getBoundingClientRect();\r\n\r\n setPoint({\r\n x:\r\n ((event.clientX -\r\n rect.left) /\r\n rect.width) *\r\n 100,\r\n\r\n y:\r\n ((event.clientY -\r\n rect.top) /\r\n rect.height) *\r\n 100,\r\n });\r\n }\r\n\r\n return (\r\n <div\r\n className={`fb-spotlight-card ${className}`}\r\n onMouseMove={\r\n handleMove\r\n }\r\n style={{\r\n borderRadius:\r\n radius,\r\n\r\n borderColor:\r\n `rgba(\r\n 255,\r\n 255,\r\n 255,\r\n ${borderOpacity}\r\n )`,\r\n\r\n background: `\r\n radial-gradient(\r\n circle at\r\n ${point.x}%\r\n ${point.y}%,\r\n ${spotlightColor}${hexAlpha(\r\n glow /\r\n 100\r\n )},\r\n transparent 38%\r\n ),\r\n ${background}\r\n `,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nfunction hexAlpha(\r\n opacity: number\r\n) {\r\n return Math.round(\r\n Math.min(\r\n 1,\r\n Math.max(\r\n 0,\r\n opacity\r\n )\r\n ) *\r\n 255\r\n )\r\n .toString(16)\r\n .padStart(\r\n 2,\r\n \"0\"\r\n );\r\n}","import type {\r\n HTMLAttributes,\r\n ReactNode,\r\n} from \"react\";\r\n\r\nimport \"./GlassCard.css\";\r\n\r\nexport interface GlassCardProps\r\n extends HTMLAttributes<HTMLDivElement> {\r\n children?: ReactNode;\r\n\r\n tint?: string;\r\n\r\n opacity?: number;\r\n\r\n blur?: number;\r\n\r\n radius?: number;\r\n\r\n borderOpacity?: number;\r\n\r\n glowColor?: string;\r\n\r\n glow?: number;\r\n\r\n className?: string;\r\n}\r\n\r\nfunction hexToRgb(\r\n value: string\r\n) {\r\n const clean =\r\n value\r\n .replace(\r\n \"#\",\r\n \"\"\r\n )\r\n .trim();\r\n\r\n const normalized =\r\n clean.length ===\r\n 3\r\n ? clean\r\n .split(\"\")\r\n .map(\r\n (\r\n character\r\n ) =>\r\n character +\r\n character\r\n )\r\n .join(\"\")\r\n : clean;\r\n\r\n if (\r\n normalized.length !==\r\n 6\r\n ) {\r\n return {\r\n r: 143,\r\n g: 115,\r\n b: 255,\r\n };\r\n }\r\n\r\n return {\r\n r:\r\n Number.parseInt(\r\n normalized.slice(\r\n 0,\r\n 2\r\n ),\r\n 16\r\n ),\r\n\r\n g:\r\n Number.parseInt(\r\n normalized.slice(\r\n 2,\r\n 4\r\n ),\r\n 16\r\n ),\r\n\r\n b:\r\n Number.parseInt(\r\n normalized.slice(\r\n 4,\r\n 6\r\n ),\r\n 16\r\n ),\r\n };\r\n}\r\n\r\nexport function GlassCard({\r\n children = (\r\n <>\r\n <span className=\"fb-glass-card__eyebrow\">\r\n 01 / FEATURE\r\n </span>\r\n\r\n <div className=\"fb-glass-card__content\">\r\n <strong>\r\n Built for\r\n <br />\r\n motion.\r\n </strong>\r\n\r\n <p>\r\n Premium interaction\r\n without visual noise.\r\n </p>\r\n </div>\r\n </>\r\n ),\r\n\r\n tint = \"#8f73ff\",\r\n\r\n opacity = 0.08,\r\n\r\n blur = 18,\r\n\r\n radius = 22,\r\n\r\n borderOpacity = 0.16,\r\n\r\n glowColor = \"#8f73ff\",\r\n\r\n glow = 34,\r\n\r\n className = \"\",\r\n\r\n style,\r\n\r\n ...props\r\n}: GlassCardProps) {\r\n const tintRgb =\r\n hexToRgb(\r\n tint\r\n );\r\n\r\n const glowRgb =\r\n hexToRgb(\r\n glowColor\r\n );\r\n\r\n return (\r\n <div\r\n {...props}\r\n className={`fb-glass-card ${className}`}\r\n style={{\r\n ...style,\r\n\r\n borderRadius:\r\n radius,\r\n\r\n borderColor:\r\n `rgba(\r\n 255,\r\n 255,\r\n 255,\r\n ${borderOpacity}\r\n )`,\r\n\r\n background:\r\n `linear-gradient(\r\n 145deg,\r\n rgba(\r\n ${tintRgb.r},\r\n ${tintRgb.g},\r\n ${tintRgb.b},\r\n ${opacity}\r\n ),\r\n rgba(\r\n 255,\r\n 255,\r\n 255,\r\n ${opacity * 0.35}\r\n )\r\n )`,\r\n\r\n backdropFilter:\r\n `blur(${blur}px)`,\r\n\r\n WebkitBackdropFilter:\r\n `blur(${blur}px)`,\r\n\r\n boxShadow:\r\n `0 24px 80px rgba(\r\n ${glowRgb.r},\r\n ${glowRgb.g},\r\n ${glowRgb.b},\r\n ${glow / 400}\r\n )`,\r\n }}\r\n >\r\n <span\r\n className=\"fb-glass-card__glow\"\r\n aria-hidden=\"true\"\r\n style={{\r\n background:\r\n glowColor,\r\n\r\n filter:\r\n `blur(${glow}px)`,\r\n }}\r\n />\r\n\r\n <div className=\"fb-glass-card__inner\">\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}"]}
@@ -0,0 +1,260 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ // src/data/AnimatedCounter.tsx
7
+ function AnimatedCounter({
8
+ value = 128,
9
+ duration = 1.5,
10
+ color = "#ffffff",
11
+ accent = "#9b7cff",
12
+ fontSize = 72,
13
+ prefix = "",
14
+ suffix = "K",
15
+ label = "ACTIVE USERS",
16
+ delta = "+18.4%",
17
+ decimals = 0,
18
+ className = "",
19
+ style,
20
+ ...props
21
+ }) {
22
+ const [
23
+ displayed,
24
+ setDisplayed
25
+ ] = react.useState(0);
26
+ const frameRef = react.useRef(
27
+ null
28
+ );
29
+ react.useEffect(() => {
30
+ const start = performance.now();
31
+ const total = Math.max(
32
+ duration,
33
+ 0.01
34
+ ) * 1e3;
35
+ function animate(now) {
36
+ const progress = Math.min(
37
+ (now - start) / total,
38
+ 1
39
+ );
40
+ const eased = 1 - Math.pow(
41
+ 1 - progress,
42
+ 3
43
+ );
44
+ setDisplayed(
45
+ value * eased
46
+ );
47
+ if (progress < 1) {
48
+ frameRef.current = requestAnimationFrame(
49
+ animate
50
+ );
51
+ }
52
+ }
53
+ frameRef.current = requestAnimationFrame(
54
+ animate
55
+ );
56
+ return () => {
57
+ if (frameRef.current !== null) {
58
+ cancelAnimationFrame(
59
+ frameRef.current
60
+ );
61
+ }
62
+ };
63
+ }, [
64
+ value,
65
+ duration
66
+ ]);
67
+ return /* @__PURE__ */ jsxRuntime.jsxs(
68
+ "div",
69
+ {
70
+ ...props,
71
+ className: `fb-animated-counter ${className}`,
72
+ style: {
73
+ ...style,
74
+ color,
75
+ ["--fb-counter-accent"]: accent,
76
+ ["--fb-counter-size"]: `${fontSize}px`
77
+ },
78
+ children: [
79
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "fb-animated-counter__label", children: label }),
80
+ /* @__PURE__ */ jsxRuntime.jsxs("strong", { children: [
81
+ prefix,
82
+ displayed.toLocaleString(
83
+ void 0,
84
+ {
85
+ minimumFractionDigits: decimals,
86
+ maximumFractionDigits: decimals
87
+ }
88
+ ),
89
+ suffix
90
+ ] }),
91
+ delta && /* @__PURE__ */ jsxRuntime.jsx("small", { children: delta })
92
+ ]
93
+ }
94
+ );
95
+ }
96
+ function RadialProgress({
97
+ value = 72,
98
+ size = 180,
99
+ strokeWidth = 10,
100
+ color = "#9b7cff",
101
+ trackColor = "#24242c",
102
+ animated = true,
103
+ label = "COMPLETE",
104
+ className = "",
105
+ style,
106
+ ...props
107
+ }) {
108
+ const clamped = Math.min(
109
+ 100,
110
+ Math.max(
111
+ 0,
112
+ value
113
+ )
114
+ );
115
+ const radius = 50 - strokeWidth / 2;
116
+ const circumference = 2 * Math.PI * radius;
117
+ const offset = circumference * (1 - clamped / 100);
118
+ return /* @__PURE__ */ jsxRuntime.jsxs(
119
+ "div",
120
+ {
121
+ ...props,
122
+ className: `fb-radial-progress ${className}`,
123
+ style: {
124
+ ...style,
125
+ width: size,
126
+ height: size,
127
+ ["--fb-radial-color"]: color
128
+ },
129
+ role: "progressbar",
130
+ "aria-valuemin": 0,
131
+ "aria-valuemax": 100,
132
+ "aria-valuenow": clamped,
133
+ children: [
134
+ /* @__PURE__ */ jsxRuntime.jsxs(
135
+ "svg",
136
+ {
137
+ viewBox: "0 0 100 100",
138
+ "aria-hidden": "true",
139
+ children: [
140
+ /* @__PURE__ */ jsxRuntime.jsx(
141
+ "circle",
142
+ {
143
+ cx: "50",
144
+ cy: "50",
145
+ r: radius,
146
+ fill: "none",
147
+ stroke: trackColor,
148
+ strokeWidth
149
+ }
150
+ ),
151
+ /* @__PURE__ */ jsxRuntime.jsx(
152
+ "circle",
153
+ {
154
+ cx: "50",
155
+ cy: "50",
156
+ r: radius,
157
+ fill: "none",
158
+ stroke: color,
159
+ strokeWidth,
160
+ strokeLinecap: "round",
161
+ strokeDasharray: circumference,
162
+ strokeDashoffset: offset,
163
+ className: animated ? "fb-radial-progress__value fb-radial-progress__value--animated" : "fb-radial-progress__value"
164
+ }
165
+ )
166
+ ]
167
+ }
168
+ ),
169
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "fb-radial-progress__content", children: [
170
+ /* @__PURE__ */ jsxRuntime.jsxs("strong", { children: [
171
+ Math.round(
172
+ clamped
173
+ ),
174
+ /* @__PURE__ */ jsxRuntime.jsx("small", { children: "%" })
175
+ ] }),
176
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: label })
177
+ ] })
178
+ ]
179
+ }
180
+ );
181
+ }
182
+ var defaultItems = [
183
+ {
184
+ label: "Revenue",
185
+ value: "$84.2K",
186
+ delta: "+12.6%",
187
+ positive: true
188
+ },
189
+ {
190
+ label: "Users",
191
+ value: "18.4K",
192
+ delta: "+8.1%",
193
+ positive: true
194
+ },
195
+ {
196
+ label: "Conversion",
197
+ value: "7.8%",
198
+ delta: "+2.4%",
199
+ positive: true
200
+ },
201
+ {
202
+ label: "Latency",
203
+ value: "94ms",
204
+ delta: "-11%",
205
+ positive: true
206
+ }
207
+ ];
208
+ function MetricGrid({
209
+ accent = "#9b7cff",
210
+ background = "#111116",
211
+ columns = 3,
212
+ radius = 18,
213
+ items = defaultItems,
214
+ className = "",
215
+ style,
216
+ ...props
217
+ }) {
218
+ return /* @__PURE__ */ jsxRuntime.jsx(
219
+ "div",
220
+ {
221
+ ...props,
222
+ className: `fb-metric-grid ${className}`,
223
+ style: {
224
+ ...style,
225
+ gridTemplateColumns: `repeat(${Math.max(
226
+ 1,
227
+ columns
228
+ )}, minmax(0, 1fr))`,
229
+ ["--fb-metric-accent"]: accent,
230
+ ["--fb-metric-background"]: background,
231
+ ["--fb-metric-radius"]: `${radius}px`
232
+ },
233
+ children: items.map(
234
+ (item) => /* @__PURE__ */ jsxRuntime.jsxs(
235
+ "article",
236
+ {
237
+ children: [
238
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: item.label }),
239
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: item.value }),
240
+ item.delta && /* @__PURE__ */ jsxRuntime.jsx(
241
+ "small",
242
+ {
243
+ className: item.positive === false ? "is-negative" : "",
244
+ children: item.delta
245
+ }
246
+ )
247
+ ]
248
+ },
249
+ item.label
250
+ )
251
+ )
252
+ }
253
+ );
254
+ }
255
+
256
+ exports.AnimatedCounter = AnimatedCounter;
257
+ exports.MetricGrid = MetricGrid;
258
+ exports.RadialProgress = RadialProgress;
259
+ //# sourceMappingURL=chunk-H2AV67DY.cjs.map
260
+ //# sourceMappingURL=chunk-H2AV67DY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/AnimatedCounter.tsx","../src/data/RadialProgress.tsx","../src/data/MetricGrid.tsx"],"names":["useState","useRef","useEffect","jsxs","jsx"],"mappings":"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","file":"chunk-H2AV67DY.cjs","sourcesContent":["import {\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\n\r\nimport type {\r\n HTMLAttributes,\r\n} from \"react\";\r\n\r\nimport \"./AnimatedCounter.css\";\r\n\r\nexport interface AnimatedCounterProps\r\n extends HTMLAttributes<HTMLDivElement> {\r\n value?: number;\r\n duration?: number;\r\n\r\n color?: string;\r\n accent?: string;\r\n\r\n fontSize?: number;\r\n\r\n prefix?: string;\r\n suffix?: string;\r\n\r\n label?: string;\r\n delta?: string;\r\n\r\n decimals?: number;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function AnimatedCounter({\r\n value = 128,\r\n duration = 1.5,\r\n\r\n color = \"#ffffff\",\r\n accent = \"#9b7cff\",\r\n\r\n fontSize = 72,\r\n\r\n prefix = \"\",\r\n suffix = \"K\",\r\n\r\n label =\r\n \"ACTIVE USERS\",\r\n\r\n delta =\r\n \"+18.4%\",\r\n\r\n decimals = 0,\r\n\r\n className = \"\",\r\n style,\r\n\r\n ...props\r\n}: AnimatedCounterProps) {\r\n const [\r\n displayed,\r\n setDisplayed,\r\n ] =\r\n useState(0);\r\n\r\n const frameRef =\r\n useRef<number | null>(\r\n null\r\n );\r\n\r\n useEffect(() => {\r\n const start =\r\n performance.now();\r\n\r\n const total =\r\n Math.max(\r\n duration,\r\n 0.01\r\n ) *\r\n 1000;\r\n\r\n function animate(\r\n now: number\r\n ) {\r\n const progress =\r\n Math.min(\r\n (\r\n now -\r\n start\r\n ) /\r\n total,\r\n 1\r\n );\r\n\r\n const eased =\r\n 1 -\r\n Math.pow(\r\n 1 -\r\n progress,\r\n 3\r\n );\r\n\r\n setDisplayed(\r\n value *\r\n eased\r\n );\r\n\r\n if (\r\n progress <\r\n 1\r\n ) {\r\n frameRef.current =\r\n requestAnimationFrame(\r\n animate\r\n );\r\n }\r\n }\r\n\r\n frameRef.current =\r\n requestAnimationFrame(\r\n animate\r\n );\r\n\r\n return () => {\r\n if (\r\n frameRef.current !==\r\n null\r\n ) {\r\n cancelAnimationFrame(\r\n frameRef.current\r\n );\r\n }\r\n };\r\n }, [\r\n value,\r\n duration,\r\n ]);\r\n\r\n return (\r\n <div\r\n {...props}\r\n className={`fb-animated-counter ${className}`}\r\n style={{\r\n ...style,\r\n\r\n color,\r\n\r\n [\"--fb-counter-accent\" as string]:\r\n accent,\r\n\r\n [\"--fb-counter-size\" as string]:\r\n `${fontSize}px`,\r\n }}\r\n >\r\n <span className=\"fb-animated-counter__label\">\r\n {label}\r\n </span>\r\n\r\n <strong>\r\n {prefix}\r\n\r\n {displayed.toLocaleString(\r\n undefined,\r\n {\r\n minimumFractionDigits:\r\n decimals,\r\n\r\n maximumFractionDigits:\r\n decimals,\r\n }\r\n )}\r\n\r\n {suffix}\r\n </strong>\r\n\r\n {delta && (\r\n <small>\r\n {delta}\r\n </small>\r\n )}\r\n </div>\r\n );\r\n}","import type {\r\n HTMLAttributes,\r\n} from \"react\";\r\n\r\nimport \"./RadialProgress.css\";\r\n\r\nexport interface RadialProgressProps\r\n extends HTMLAttributes<HTMLDivElement> {\r\n value?: number;\r\n\r\n size?: number;\r\n strokeWidth?: number;\r\n\r\n color?: string;\r\n trackColor?: string;\r\n\r\n animated?: boolean;\r\n\r\n label?: string;\r\n\r\n className?: string;\r\n}\r\n\r\nexport function RadialProgress({\r\n value = 72,\r\n\r\n size = 180,\r\n strokeWidth = 10,\r\n\r\n color = \"#9b7cff\",\r\n trackColor = \"#24242c\",\r\n\r\n animated = true,\r\n\r\n label =\r\n \"COMPLETE\",\r\n\r\n className = \"\",\r\n style,\r\n\r\n ...props\r\n}: RadialProgressProps) {\r\n const clamped =\r\n Math.min(\r\n 100,\r\n Math.max(\r\n 0,\r\n value\r\n )\r\n );\r\n\r\n const radius =\r\n 50 -\r\n strokeWidth /\r\n 2;\r\n\r\n const circumference =\r\n 2 *\r\n Math.PI *\r\n radius;\r\n\r\n const offset =\r\n circumference *\r\n (\r\n 1 -\r\n clamped /\r\n 100\r\n );\r\n\r\n return (\r\n <div\r\n {...props}\r\n className={`fb-radial-progress ${className}`}\r\n style={{\r\n ...style,\r\n\r\n width:\r\n size,\r\n\r\n height:\r\n size,\r\n\r\n [\"--fb-radial-color\" as string]:\r\n color,\r\n }}\r\n role=\"progressbar\"\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-valuenow={\r\n clamped\r\n }\r\n >\r\n <svg\r\n viewBox=\"0 0 100 100\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r={\r\n radius\r\n }\r\n fill=\"none\"\r\n stroke={\r\n trackColor\r\n }\r\n strokeWidth={\r\n strokeWidth\r\n }\r\n />\r\n\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r={\r\n radius\r\n }\r\n fill=\"none\"\r\n stroke={\r\n color\r\n }\r\n strokeWidth={\r\n strokeWidth\r\n }\r\n strokeLinecap=\"round\"\r\n strokeDasharray={\r\n circumference\r\n }\r\n strokeDashoffset={\r\n offset\r\n }\r\n className={\r\n animated\r\n ? \"fb-radial-progress__value fb-radial-progress__value--animated\"\r\n : \"fb-radial-progress__value\"\r\n }\r\n />\r\n </svg>\r\n\r\n <div className=\"fb-radial-progress__content\">\r\n <strong>\r\n {Math.round(\r\n clamped\r\n )}\r\n <small>\r\n %\r\n </small>\r\n </strong>\r\n\r\n <span>\r\n {label}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n}","import type {\r\n HTMLAttributes,\r\n} from \"react\";\r\n\r\nimport \"./MetricGrid.css\";\r\n\r\nexport interface MetricItem {\r\n label: string;\r\n value: string;\r\n delta?: string;\r\n positive?: boolean;\r\n}\r\n\r\nexport interface MetricGridProps\r\n extends HTMLAttributes<HTMLDivElement> {\r\n accent?: string;\r\n background?: string;\r\n\r\n columns?: number;\r\n radius?: number;\r\n\r\n items?: MetricItem[];\r\n\r\n className?: string;\r\n}\r\n\r\nconst defaultItems:\r\n MetricItem[] = [\r\n {\r\n label:\r\n \"Revenue\",\r\n\r\n value:\r\n \"$84.2K\",\r\n\r\n delta:\r\n \"+12.6%\",\r\n\r\n positive:\r\n true,\r\n },\r\n\r\n {\r\n label:\r\n \"Users\",\r\n\r\n value:\r\n \"18.4K\",\r\n\r\n delta:\r\n \"+8.1%\",\r\n\r\n positive:\r\n true,\r\n },\r\n\r\n {\r\n label:\r\n \"Conversion\",\r\n\r\n value:\r\n \"7.8%\",\r\n\r\n delta:\r\n \"+2.4%\",\r\n\r\n positive:\r\n true,\r\n },\r\n\r\n {\r\n label:\r\n \"Latency\",\r\n\r\n value:\r\n \"94ms\",\r\n\r\n delta:\r\n \"-11%\",\r\n\r\n positive:\r\n true,\r\n },\r\n ];\r\n\r\nexport function MetricGrid({\r\n accent = \"#9b7cff\",\r\n background = \"#111116\",\r\n\r\n columns = 3,\r\n radius = 18,\r\n\r\n items =\r\n defaultItems,\r\n\r\n className = \"\",\r\n style,\r\n\r\n ...props\r\n}: MetricGridProps) {\r\n return (\r\n <div\r\n {...props}\r\n className={`fb-metric-grid ${className}`}\r\n style={{\r\n ...style,\r\n\r\n gridTemplateColumns:\r\n `repeat(${Math.max(\r\n 1,\r\n columns\r\n )}, minmax(0, 1fr))`,\r\n\r\n [\"--fb-metric-accent\" as string]:\r\n accent,\r\n\r\n [\"--fb-metric-background\" as string]:\r\n background,\r\n\r\n [\"--fb-metric-radius\" as string]:\r\n `${radius}px`,\r\n }}\r\n >\r\n {items.map(\r\n (\r\n item\r\n ) => (\r\n <article\r\n key={\r\n item.label\r\n }\r\n >\r\n <span>\r\n {\r\n item.label\r\n }\r\n </span>\r\n\r\n <strong>\r\n {\r\n item.value\r\n }\r\n </strong>\r\n\r\n {item.delta && (\r\n <small\r\n className={\r\n item.positive ===\r\n false\r\n ? \"is-negative\"\r\n : \"\"\r\n }\r\n >\r\n {\r\n item.delta\r\n }\r\n </small>\r\n )}\r\n </article>\r\n )\r\n )}\r\n </div>\r\n );\r\n}"]}