@braintwopoint0/playback-commons 0.1.0 → 0.1.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.
- package/dist/playerdata/index.d.ts +171 -0
- package/dist/playerdata/index.js +314 -0
- package/dist/playerdata/index.js.map +1 -0
- package/dist/ui/index.d.ts +11 -1
- package/dist/ui/index.js +148 -32
- package/dist/ui/index.js.map +1 -1
- package/package.json +25 -18
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
declare const PLAYERDATA_BASE_URL = "https://app.playerdata.co.uk";
|
|
2
|
+
declare const PLAYERDATA_AUTH_URL = "https://app.playerdata.co.uk/api/oauth/authorize";
|
|
3
|
+
declare const PLAYERDATA_TOKEN_URL = "https://app.playerdata.co.uk/api/oauth/token";
|
|
4
|
+
declare const PLAYERDATA_GRAPHQL_URL = "https://app.playerdata.co.uk/api/graphql";
|
|
5
|
+
|
|
6
|
+
interface PlayerDataCredentials {
|
|
7
|
+
clientId: string;
|
|
8
|
+
clientSecret: string;
|
|
9
|
+
}
|
|
10
|
+
interface PlayerDataTokenResponse {
|
|
11
|
+
access_token: string;
|
|
12
|
+
refresh_token: string;
|
|
13
|
+
token_type: string;
|
|
14
|
+
expires_in: number;
|
|
15
|
+
scope?: string;
|
|
16
|
+
}
|
|
17
|
+
interface PlayerDataToken {
|
|
18
|
+
accessToken: string;
|
|
19
|
+
refreshToken: string;
|
|
20
|
+
expiresAt: number;
|
|
21
|
+
}
|
|
22
|
+
interface GraphQLResponse<T = unknown> {
|
|
23
|
+
data?: T;
|
|
24
|
+
errors?: GraphQLError[];
|
|
25
|
+
}
|
|
26
|
+
interface GraphQLError {
|
|
27
|
+
message: string;
|
|
28
|
+
locations?: {
|
|
29
|
+
line: number;
|
|
30
|
+
column: number;
|
|
31
|
+
}[];
|
|
32
|
+
path?: string[];
|
|
33
|
+
extensions?: Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
interface PDOrganisation {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
clubs: PDClub[];
|
|
39
|
+
}
|
|
40
|
+
interface PDClub {
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
initials?: string;
|
|
44
|
+
sportDefinition?: PDSportDefinition;
|
|
45
|
+
athletes?: PDAthlete[];
|
|
46
|
+
}
|
|
47
|
+
interface PDSportDefinition {
|
|
48
|
+
id: string;
|
|
49
|
+
name: string;
|
|
50
|
+
positionDefinitions?: PDPositionDefinition[];
|
|
51
|
+
}
|
|
52
|
+
interface PDPositionDefinition {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
initial?: string;
|
|
56
|
+
}
|
|
57
|
+
interface PDAthlete {
|
|
58
|
+
id: string;
|
|
59
|
+
name: string;
|
|
60
|
+
initials: string;
|
|
61
|
+
customId?: string;
|
|
62
|
+
topSpeedKph?: number;
|
|
63
|
+
autoTopSpeedKph?: number;
|
|
64
|
+
defaultPosition?: PDPositionDefinition;
|
|
65
|
+
profilePicture?: PDProfilePicture;
|
|
66
|
+
}
|
|
67
|
+
interface PDProfilePicture {
|
|
68
|
+
thumbnailUrl?: string;
|
|
69
|
+
}
|
|
70
|
+
interface PDPerson {
|
|
71
|
+
id: string;
|
|
72
|
+
name: string;
|
|
73
|
+
email?: string;
|
|
74
|
+
athletes?: PDAthlete[];
|
|
75
|
+
clubs?: PDClub[];
|
|
76
|
+
}
|
|
77
|
+
interface PDSessionBase {
|
|
78
|
+
id: string;
|
|
79
|
+
startTime?: string;
|
|
80
|
+
endTime?: string;
|
|
81
|
+
description?: string;
|
|
82
|
+
club?: {
|
|
83
|
+
id: string;
|
|
84
|
+
name: string;
|
|
85
|
+
};
|
|
86
|
+
sessionParticipations?: PDSessionParticipation[];
|
|
87
|
+
}
|
|
88
|
+
interface PDTrainingSession extends PDSessionBase {
|
|
89
|
+
__typename: 'TrainingSession';
|
|
90
|
+
}
|
|
91
|
+
interface PDMatchSession extends PDSessionBase {
|
|
92
|
+
__typename: 'MatchSession';
|
|
93
|
+
opponent?: string;
|
|
94
|
+
opponentScore?: number;
|
|
95
|
+
ourTeam: string;
|
|
96
|
+
}
|
|
97
|
+
type PDSession = PDTrainingSession | PDMatchSession;
|
|
98
|
+
interface PDSessionParticipation {
|
|
99
|
+
id: string;
|
|
100
|
+
athlete: {
|
|
101
|
+
id: string;
|
|
102
|
+
name: string;
|
|
103
|
+
initials: string;
|
|
104
|
+
};
|
|
105
|
+
configuredMetrics?: PDConfiguredMetrics;
|
|
106
|
+
}
|
|
107
|
+
interface PDConfiguredMetrics {
|
|
108
|
+
data?: PDGenericMetric[];
|
|
109
|
+
}
|
|
110
|
+
interface PDConfiguredAggMetrics {
|
|
111
|
+
data?: PDGenericMetric[];
|
|
112
|
+
}
|
|
113
|
+
interface PDGenericMetric {
|
|
114
|
+
key: string;
|
|
115
|
+
label?: string;
|
|
116
|
+
shortLabel?: string;
|
|
117
|
+
localValue?: number | string | null;
|
|
118
|
+
localUnitLabel?: string;
|
|
119
|
+
category?: string;
|
|
120
|
+
precision?: number;
|
|
121
|
+
}
|
|
122
|
+
interface PDAthleteMetricsSummary {
|
|
123
|
+
athlete: {
|
|
124
|
+
id: string;
|
|
125
|
+
name: string;
|
|
126
|
+
};
|
|
127
|
+
configuredAggMetrics?: PDConfiguredAggMetrics;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Generate the OAuth authorization URL for user-level access.
|
|
132
|
+
* Redirect the user's browser to this URL to start the OAuth flow.
|
|
133
|
+
*/
|
|
134
|
+
declare function generateAuthUrl(credentials: PlayerDataCredentials, redirectUri: string, state?: string): string;
|
|
135
|
+
/**
|
|
136
|
+
* Exchange an authorization code for access + refresh tokens.
|
|
137
|
+
* Used after the user is redirected back from PlayerData.
|
|
138
|
+
*/
|
|
139
|
+
declare function exchangeCode(credentials: PlayerDataCredentials, code: string, redirectUri: string): Promise<PlayerDataToken>;
|
|
140
|
+
/**
|
|
141
|
+
* Refresh an expired access token using a refresh token.
|
|
142
|
+
* IMPORTANT: PlayerData refresh tokens are single-use.
|
|
143
|
+
* The response contains a NEW refresh token that must replace the old one.
|
|
144
|
+
*/
|
|
145
|
+
declare function refreshToken(credentials: PlayerDataCredentials, currentRefreshToken: string): Promise<PlayerDataToken>;
|
|
146
|
+
/**
|
|
147
|
+
* Get a service-level token using client credentials grant.
|
|
148
|
+
* Used for org-wide data access without user interaction.
|
|
149
|
+
*/
|
|
150
|
+
declare function getServiceToken(credentials: PlayerDataCredentials): Promise<PlayerDataToken>;
|
|
151
|
+
|
|
152
|
+
/** Verify auth and get the current user's identity */
|
|
153
|
+
declare const GET_CURRENT_PERSON = "\n query GetCurrentPerson {\n currentPerson {\n id\n name\n email\n athletes {\n id\n name\n club {\n id\n name\n }\n }\n clubs {\n id\n name\n }\n }\n }\n";
|
|
154
|
+
/** Get club info and its athlete roster */
|
|
155
|
+
declare const GET_CLUB = "\n query GetClub($clubId: ID!) {\n club(id: $clubId) {\n id\n name\n sportDefinition {\n id\n name\n positionDefinitions {\n id\n name\n initial\n }\n }\n athletes {\n id\n name\n initials\n customId\n topSpeedKph\n autoTopSpeedKph\n defaultPosition {\n id\n name\n initial\n }\n profilePicture {\n thumbnailUrl\n }\n }\n }\n }\n";
|
|
156
|
+
/** List sessions for a club with optional date filters */
|
|
157
|
+
declare const GET_CLUB_SESSIONS = "\n query GetClubSessions($clubId: ID!, $startTimeGteq: ISO8601DateTime, $startTimeLteq: ISO8601DateTime, $limit: Int, $offset: Int!) {\n club(id: $clubId) {\n id\n sessions(\n filter: { startTimeGteq: $startTimeGteq, startTimeLteq: $startTimeLteq }\n limit: $limit\n offset: $offset\n ) {\n id\n startTime\n endTime\n description\n ... on TrainingSession {\n __typename\n }\n ... on MatchSession {\n __typename\n opponent\n opponentScore\n ourTeam\n }\n }\n }\n }\n";
|
|
158
|
+
/** Get an athlete's sessions */
|
|
159
|
+
declare const GET_ATHLETE_SESSIONS = "\n query GetAthleteSessions($athleteId: ID!, $limit: Int, $offset: Int) {\n athlete(id: $athleteId) {\n id\n name\n sessions(limit: $limit, offset: $offset) {\n id\n startTime\n endTime\n description\n ... on TrainingSession {\n __typename\n }\n ... on MatchSession {\n __typename\n opponent\n opponentScore\n ourTeam\n }\n }\n }\n }\n";
|
|
160
|
+
/** Get a session with per-athlete metrics via participations */
|
|
161
|
+
declare const GET_SESSION_DETAILS = "\n query GetSessionDetails($sessionId: ID!) {\n session(id: $sessionId) {\n id\n startTime\n endTime\n description\n club {\n id\n name\n }\n ... on TrainingSession {\n __typename\n sessionParticipations {\n id\n athlete {\n id\n name\n initials\n }\n configuredMetrics {\n data {\n key\n label\n shortLabel\n localValue\n localUnitLabel\n category\n precision\n }\n }\n }\n }\n ... on MatchSession {\n __typename\n opponent\n opponentScore\n ourTeam\n sessionParticipations {\n id\n athlete {\n id\n name\n initials\n }\n configuredMetrics {\n data {\n key\n label\n shortLabel\n localValue\n localUnitLabel\n category\n precision\n }\n }\n }\n }\n }\n }\n";
|
|
162
|
+
/** Get aggregated metrics for an athlete over a date range */
|
|
163
|
+
declare const GET_ATHLETE_SUMMARY = "\n query GetAthleteSummary($athleteId: ID!, $startTime: ISO8601DateTime!, $endTime: ISO8601DateTime) {\n athlete(id: $athleteId) {\n id\n name\n timeSafeMetricsSummary(startTime: $startTime, endTime: $endTime) {\n athlete {\n id\n name\n }\n configuredAggMetrics {\n data {\n key\n label\n shortLabel\n localValue\n localUnitLabel\n category\n precision\n }\n }\n }\n }\n }\n";
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Execute a GraphQL query against the PlayerData API.
|
|
167
|
+
* Stateless — caller provides the access token.
|
|
168
|
+
*/
|
|
169
|
+
declare function executeQuery<T = unknown>(token: string, query: string, variables?: Record<string, unknown>): Promise<T>;
|
|
170
|
+
|
|
171
|
+
export { GET_ATHLETE_SESSIONS, GET_ATHLETE_SUMMARY, GET_CLUB, GET_CLUB_SESSIONS, GET_CURRENT_PERSON, GET_SESSION_DETAILS, type GraphQLError, type GraphQLResponse, type PDAthlete, type PDAthleteMetricsSummary, type PDClub, type PDConfiguredAggMetrics, type PDConfiguredMetrics, type PDGenericMetric, type PDMatchSession, type PDOrganisation, type PDPerson, type PDPositionDefinition, type PDProfilePicture, type PDSession, type PDSessionBase, type PDSessionParticipation, type PDSportDefinition, type PDTrainingSession, PLAYERDATA_AUTH_URL, PLAYERDATA_BASE_URL, PLAYERDATA_GRAPHQL_URL, PLAYERDATA_TOKEN_URL, type PlayerDataCredentials, type PlayerDataToken, type PlayerDataTokenResponse, exchangeCode, executeQuery, generateAuthUrl, getServiceToken, refreshToken };
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/playerdata/config.ts
|
|
4
|
+
var PLAYERDATA_BASE_URL = "https://app.playerdata.co.uk";
|
|
5
|
+
var PLAYERDATA_AUTH_URL = `${PLAYERDATA_BASE_URL}/api/oauth/authorize`;
|
|
6
|
+
var PLAYERDATA_TOKEN_URL = `${PLAYERDATA_BASE_URL}/api/oauth/token`;
|
|
7
|
+
var PLAYERDATA_GRAPHQL_URL = `${PLAYERDATA_BASE_URL}/api/graphql`;
|
|
8
|
+
|
|
9
|
+
// src/playerdata/auth.ts
|
|
10
|
+
function parseTokenResponse(raw) {
|
|
11
|
+
return {
|
|
12
|
+
accessToken: raw.access_token,
|
|
13
|
+
refreshToken: raw.refresh_token,
|
|
14
|
+
expiresAt: Date.now() + raw.expires_in * 1e3
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function generateAuthUrl(credentials, redirectUri, state) {
|
|
18
|
+
const params = new URLSearchParams({
|
|
19
|
+
response_type: "code",
|
|
20
|
+
client_id: credentials.clientId,
|
|
21
|
+
redirect_uri: redirectUri,
|
|
22
|
+
scope: ""
|
|
23
|
+
});
|
|
24
|
+
if (state) params.set("state", state);
|
|
25
|
+
return `${PLAYERDATA_AUTH_URL}?${params.toString()}`;
|
|
26
|
+
}
|
|
27
|
+
async function exchangeCode(credentials, code, redirectUri) {
|
|
28
|
+
const res = await fetch(PLAYERDATA_TOKEN_URL, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
31
|
+
body: new URLSearchParams({
|
|
32
|
+
grant_type: "authorization_code",
|
|
33
|
+
client_id: credentials.clientId,
|
|
34
|
+
client_secret: credentials.clientSecret,
|
|
35
|
+
code,
|
|
36
|
+
redirect_uri: redirectUri
|
|
37
|
+
})
|
|
38
|
+
});
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
const text = await res.text();
|
|
41
|
+
throw new Error(`PlayerData code exchange failed (${res.status}): ${text}`);
|
|
42
|
+
}
|
|
43
|
+
const raw = await res.json();
|
|
44
|
+
return parseTokenResponse(raw);
|
|
45
|
+
}
|
|
46
|
+
async function refreshToken(credentials, currentRefreshToken) {
|
|
47
|
+
const res = await fetch(PLAYERDATA_TOKEN_URL, {
|
|
48
|
+
method: "POST",
|
|
49
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
50
|
+
body: new URLSearchParams({
|
|
51
|
+
grant_type: "refresh_token",
|
|
52
|
+
client_id: credentials.clientId,
|
|
53
|
+
client_secret: credentials.clientSecret,
|
|
54
|
+
refresh_token: currentRefreshToken
|
|
55
|
+
})
|
|
56
|
+
});
|
|
57
|
+
if (!res.ok) {
|
|
58
|
+
const text = await res.text();
|
|
59
|
+
throw new Error(`PlayerData token refresh failed (${res.status}): ${text}`);
|
|
60
|
+
}
|
|
61
|
+
const raw = await res.json();
|
|
62
|
+
return parseTokenResponse(raw);
|
|
63
|
+
}
|
|
64
|
+
async function getServiceToken(credentials) {
|
|
65
|
+
const res = await fetch(PLAYERDATA_TOKEN_URL, {
|
|
66
|
+
method: "POST",
|
|
67
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
68
|
+
body: new URLSearchParams({
|
|
69
|
+
grant_type: "client_credentials",
|
|
70
|
+
client_id: credentials.clientId,
|
|
71
|
+
client_secret: credentials.clientSecret
|
|
72
|
+
})
|
|
73
|
+
});
|
|
74
|
+
if (!res.ok) {
|
|
75
|
+
const text = await res.text();
|
|
76
|
+
throw new Error(`PlayerData service token failed (${res.status}): ${text}`);
|
|
77
|
+
}
|
|
78
|
+
const raw = await res.json();
|
|
79
|
+
return parseTokenResponse(raw);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// src/playerdata/queries.ts
|
|
83
|
+
var GET_CURRENT_PERSON = `
|
|
84
|
+
query GetCurrentPerson {
|
|
85
|
+
currentPerson {
|
|
86
|
+
id
|
|
87
|
+
name
|
|
88
|
+
email
|
|
89
|
+
athletes {
|
|
90
|
+
id
|
|
91
|
+
name
|
|
92
|
+
club {
|
|
93
|
+
id
|
|
94
|
+
name
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
clubs {
|
|
98
|
+
id
|
|
99
|
+
name
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
`;
|
|
104
|
+
var GET_CLUB = `
|
|
105
|
+
query GetClub($clubId: ID!) {
|
|
106
|
+
club(id: $clubId) {
|
|
107
|
+
id
|
|
108
|
+
name
|
|
109
|
+
sportDefinition {
|
|
110
|
+
id
|
|
111
|
+
name
|
|
112
|
+
positionDefinitions {
|
|
113
|
+
id
|
|
114
|
+
name
|
|
115
|
+
initial
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
athletes {
|
|
119
|
+
id
|
|
120
|
+
name
|
|
121
|
+
initials
|
|
122
|
+
customId
|
|
123
|
+
topSpeedKph
|
|
124
|
+
autoTopSpeedKph
|
|
125
|
+
defaultPosition {
|
|
126
|
+
id
|
|
127
|
+
name
|
|
128
|
+
initial
|
|
129
|
+
}
|
|
130
|
+
profilePicture {
|
|
131
|
+
thumbnailUrl
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
`;
|
|
137
|
+
var GET_CLUB_SESSIONS = `
|
|
138
|
+
query GetClubSessions($clubId: ID!, $startTimeGteq: ISO8601DateTime, $startTimeLteq: ISO8601DateTime, $limit: Int, $offset: Int!) {
|
|
139
|
+
club(id: $clubId) {
|
|
140
|
+
id
|
|
141
|
+
sessions(
|
|
142
|
+
filter: { startTimeGteq: $startTimeGteq, startTimeLteq: $startTimeLteq }
|
|
143
|
+
limit: $limit
|
|
144
|
+
offset: $offset
|
|
145
|
+
) {
|
|
146
|
+
id
|
|
147
|
+
startTime
|
|
148
|
+
endTime
|
|
149
|
+
description
|
|
150
|
+
... on TrainingSession {
|
|
151
|
+
__typename
|
|
152
|
+
}
|
|
153
|
+
... on MatchSession {
|
|
154
|
+
__typename
|
|
155
|
+
opponent
|
|
156
|
+
opponentScore
|
|
157
|
+
ourTeam
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
`;
|
|
163
|
+
var GET_ATHLETE_SESSIONS = `
|
|
164
|
+
query GetAthleteSessions($athleteId: ID!, $limit: Int, $offset: Int) {
|
|
165
|
+
athlete(id: $athleteId) {
|
|
166
|
+
id
|
|
167
|
+
name
|
|
168
|
+
sessions(limit: $limit, offset: $offset) {
|
|
169
|
+
id
|
|
170
|
+
startTime
|
|
171
|
+
endTime
|
|
172
|
+
description
|
|
173
|
+
... on TrainingSession {
|
|
174
|
+
__typename
|
|
175
|
+
}
|
|
176
|
+
... on MatchSession {
|
|
177
|
+
__typename
|
|
178
|
+
opponent
|
|
179
|
+
opponentScore
|
|
180
|
+
ourTeam
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
`;
|
|
186
|
+
var GET_SESSION_DETAILS = `
|
|
187
|
+
query GetSessionDetails($sessionId: ID!) {
|
|
188
|
+
session(id: $sessionId) {
|
|
189
|
+
id
|
|
190
|
+
startTime
|
|
191
|
+
endTime
|
|
192
|
+
description
|
|
193
|
+
club {
|
|
194
|
+
id
|
|
195
|
+
name
|
|
196
|
+
}
|
|
197
|
+
... on TrainingSession {
|
|
198
|
+
__typename
|
|
199
|
+
sessionParticipations {
|
|
200
|
+
id
|
|
201
|
+
athlete {
|
|
202
|
+
id
|
|
203
|
+
name
|
|
204
|
+
initials
|
|
205
|
+
}
|
|
206
|
+
configuredMetrics {
|
|
207
|
+
data {
|
|
208
|
+
key
|
|
209
|
+
label
|
|
210
|
+
shortLabel
|
|
211
|
+
localValue
|
|
212
|
+
localUnitLabel
|
|
213
|
+
category
|
|
214
|
+
precision
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
... on MatchSession {
|
|
220
|
+
__typename
|
|
221
|
+
opponent
|
|
222
|
+
opponentScore
|
|
223
|
+
ourTeam
|
|
224
|
+
sessionParticipations {
|
|
225
|
+
id
|
|
226
|
+
athlete {
|
|
227
|
+
id
|
|
228
|
+
name
|
|
229
|
+
initials
|
|
230
|
+
}
|
|
231
|
+
configuredMetrics {
|
|
232
|
+
data {
|
|
233
|
+
key
|
|
234
|
+
label
|
|
235
|
+
shortLabel
|
|
236
|
+
localValue
|
|
237
|
+
localUnitLabel
|
|
238
|
+
category
|
|
239
|
+
precision
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
`;
|
|
247
|
+
var GET_ATHLETE_SUMMARY = `
|
|
248
|
+
query GetAthleteSummary($athleteId: ID!, $startTime: ISO8601DateTime!, $endTime: ISO8601DateTime) {
|
|
249
|
+
athlete(id: $athleteId) {
|
|
250
|
+
id
|
|
251
|
+
name
|
|
252
|
+
timeSafeMetricsSummary(startTime: $startTime, endTime: $endTime) {
|
|
253
|
+
athlete {
|
|
254
|
+
id
|
|
255
|
+
name
|
|
256
|
+
}
|
|
257
|
+
configuredAggMetrics {
|
|
258
|
+
data {
|
|
259
|
+
key
|
|
260
|
+
label
|
|
261
|
+
shortLabel
|
|
262
|
+
localValue
|
|
263
|
+
localUnitLabel
|
|
264
|
+
category
|
|
265
|
+
precision
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
`;
|
|
272
|
+
|
|
273
|
+
// src/playerdata/client.ts
|
|
274
|
+
async function executeQuery(token, query, variables) {
|
|
275
|
+
const res = await fetch(PLAYERDATA_GRAPHQL_URL, {
|
|
276
|
+
method: "POST",
|
|
277
|
+
headers: {
|
|
278
|
+
"Content-Type": "application/json",
|
|
279
|
+
Authorization: `Bearer ${token}`
|
|
280
|
+
},
|
|
281
|
+
body: JSON.stringify({ query, variables })
|
|
282
|
+
});
|
|
283
|
+
if (!res.ok) {
|
|
284
|
+
const text = await res.text();
|
|
285
|
+
throw new Error(`PlayerData GraphQL request failed (${res.status}): ${text}`);
|
|
286
|
+
}
|
|
287
|
+
const json = await res.json();
|
|
288
|
+
if (json.errors?.length) {
|
|
289
|
+
const messages = json.errors.map((e) => e.message).join("; ");
|
|
290
|
+
throw new Error(`PlayerData GraphQL errors: ${messages}`);
|
|
291
|
+
}
|
|
292
|
+
if (!json.data) {
|
|
293
|
+
throw new Error("PlayerData GraphQL response missing data");
|
|
294
|
+
}
|
|
295
|
+
return json.data;
|
|
296
|
+
}
|
|
297
|
+
export {
|
|
298
|
+
GET_ATHLETE_SESSIONS,
|
|
299
|
+
GET_ATHLETE_SUMMARY,
|
|
300
|
+
GET_CLUB,
|
|
301
|
+
GET_CLUB_SESSIONS,
|
|
302
|
+
GET_CURRENT_PERSON,
|
|
303
|
+
GET_SESSION_DETAILS,
|
|
304
|
+
PLAYERDATA_AUTH_URL,
|
|
305
|
+
PLAYERDATA_BASE_URL,
|
|
306
|
+
PLAYERDATA_GRAPHQL_URL,
|
|
307
|
+
PLAYERDATA_TOKEN_URL,
|
|
308
|
+
exchangeCode,
|
|
309
|
+
executeQuery,
|
|
310
|
+
generateAuthUrl,
|
|
311
|
+
getServiceToken,
|
|
312
|
+
refreshToken
|
|
313
|
+
};
|
|
314
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/playerdata/config.ts","../../src/playerdata/auth.ts","../../src/playerdata/queries.ts","../../src/playerdata/client.ts"],"sourcesContent":["// PlayerData API endpoint constants\nexport const PLAYERDATA_BASE_URL = 'https://app.playerdata.co.uk'\nexport const PLAYERDATA_AUTH_URL = `${PLAYERDATA_BASE_URL}/api/oauth/authorize`\nexport const PLAYERDATA_TOKEN_URL = `${PLAYERDATA_BASE_URL}/api/oauth/token`\nexport const PLAYERDATA_GRAPHQL_URL = `${PLAYERDATA_BASE_URL}/api/graphql`\n","import { PLAYERDATA_AUTH_URL, PLAYERDATA_TOKEN_URL } from './config'\nimport type {\n PlayerDataCredentials,\n PlayerDataToken,\n PlayerDataTokenResponse,\n} from './types'\n\nfunction parseTokenResponse(raw: PlayerDataTokenResponse): PlayerDataToken {\n return {\n accessToken: raw.access_token,\n refreshToken: raw.refresh_token,\n expiresAt: Date.now() + raw.expires_in * 1000,\n }\n}\n\n/**\n * Generate the OAuth authorization URL for user-level access.\n * Redirect the user's browser to this URL to start the OAuth flow.\n */\nexport function generateAuthUrl(\n credentials: PlayerDataCredentials,\n redirectUri: string,\n state?: string\n): string {\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: credentials.clientId,\n redirect_uri: redirectUri,\n scope: '',\n })\n if (state) params.set('state', state)\n return `${PLAYERDATA_AUTH_URL}?${params.toString()}`\n}\n\n/**\n * Exchange an authorization code for access + refresh tokens.\n * Used after the user is redirected back from PlayerData.\n */\nexport async function exchangeCode(\n credentials: PlayerDataCredentials,\n code: string,\n redirectUri: string\n): Promise<PlayerDataToken> {\n const res = await fetch(PLAYERDATA_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: credentials.clientId,\n client_secret: credentials.clientSecret,\n code,\n redirect_uri: redirectUri,\n }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`PlayerData code exchange failed (${res.status}): ${text}`)\n }\n\n const raw: PlayerDataTokenResponse = await res.json()\n return parseTokenResponse(raw)\n}\n\n/**\n * Refresh an expired access token using a refresh token.\n * IMPORTANT: PlayerData refresh tokens are single-use.\n * The response contains a NEW refresh token that must replace the old one.\n */\nexport async function refreshToken(\n credentials: PlayerDataCredentials,\n currentRefreshToken: string\n): Promise<PlayerDataToken> {\n const res = await fetch(PLAYERDATA_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: credentials.clientId,\n client_secret: credentials.clientSecret,\n refresh_token: currentRefreshToken,\n }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`PlayerData token refresh failed (${res.status}): ${text}`)\n }\n\n const raw: PlayerDataTokenResponse = await res.json()\n return parseTokenResponse(raw)\n}\n\n/**\n * Get a service-level token using client credentials grant.\n * Used for org-wide data access without user interaction.\n */\nexport async function getServiceToken(\n credentials: PlayerDataCredentials\n): Promise<PlayerDataToken> {\n const res = await fetch(PLAYERDATA_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: credentials.clientId,\n client_secret: credentials.clientSecret,\n }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`PlayerData service token failed (${res.status}): ${text}`)\n }\n\n const raw: PlayerDataTokenResponse = await res.json()\n return parseTokenResponse(raw)\n}\n","// GraphQL queries for the PlayerData API\n// Uses configuredMetrics/configuredAggMetrics (not deprecated individual fields)\n\n/** Verify auth and get the current user's identity */\nexport const GET_CURRENT_PERSON = `\n query GetCurrentPerson {\n currentPerson {\n id\n name\n email\n athletes {\n id\n name\n club {\n id\n name\n }\n }\n clubs {\n id\n name\n }\n }\n }\n`\n\n/** Get club info and its athlete roster */\nexport const GET_CLUB = `\n query GetClub($clubId: ID!) {\n club(id: $clubId) {\n id\n name\n sportDefinition {\n id\n name\n positionDefinitions {\n id\n name\n initial\n }\n }\n athletes {\n id\n name\n initials\n customId\n topSpeedKph\n autoTopSpeedKph\n defaultPosition {\n id\n name\n initial\n }\n profilePicture {\n thumbnailUrl\n }\n }\n }\n }\n`\n\n/** List sessions for a club with optional date filters */\nexport const GET_CLUB_SESSIONS = `\n query GetClubSessions($clubId: ID!, $startTimeGteq: ISO8601DateTime, $startTimeLteq: ISO8601DateTime, $limit: Int, $offset: Int!) {\n club(id: $clubId) {\n id\n sessions(\n filter: { startTimeGteq: $startTimeGteq, startTimeLteq: $startTimeLteq }\n limit: $limit\n offset: $offset\n ) {\n id\n startTime\n endTime\n description\n ... on TrainingSession {\n __typename\n }\n ... on MatchSession {\n __typename\n opponent\n opponentScore\n ourTeam\n }\n }\n }\n }\n`\n\n/** Get an athlete's sessions */\nexport const GET_ATHLETE_SESSIONS = `\n query GetAthleteSessions($athleteId: ID!, $limit: Int, $offset: Int) {\n athlete(id: $athleteId) {\n id\n name\n sessions(limit: $limit, offset: $offset) {\n id\n startTime\n endTime\n description\n ... on TrainingSession {\n __typename\n }\n ... on MatchSession {\n __typename\n opponent\n opponentScore\n ourTeam\n }\n }\n }\n }\n`\n\n/** Get a session with per-athlete metrics via participations */\nexport const GET_SESSION_DETAILS = `\n query GetSessionDetails($sessionId: ID!) {\n session(id: $sessionId) {\n id\n startTime\n endTime\n description\n club {\n id\n name\n }\n ... on TrainingSession {\n __typename\n sessionParticipations {\n id\n athlete {\n id\n name\n initials\n }\n configuredMetrics {\n data {\n key\n label\n shortLabel\n localValue\n localUnitLabel\n category\n precision\n }\n }\n }\n }\n ... on MatchSession {\n __typename\n opponent\n opponentScore\n ourTeam\n sessionParticipations {\n id\n athlete {\n id\n name\n initials\n }\n configuredMetrics {\n data {\n key\n label\n shortLabel\n localValue\n localUnitLabel\n category\n precision\n }\n }\n }\n }\n }\n }\n`\n\n/** Get aggregated metrics for an athlete over a date range */\nexport const GET_ATHLETE_SUMMARY = `\n query GetAthleteSummary($athleteId: ID!, $startTime: ISO8601DateTime!, $endTime: ISO8601DateTime) {\n athlete(id: $athleteId) {\n id\n name\n timeSafeMetricsSummary(startTime: $startTime, endTime: $endTime) {\n athlete {\n id\n name\n }\n configuredAggMetrics {\n data {\n key\n label\n shortLabel\n localValue\n localUnitLabel\n category\n precision\n }\n }\n }\n }\n }\n`\n","import { PLAYERDATA_GRAPHQL_URL } from './config'\nimport type { GraphQLResponse } from './types'\n\n/**\n * Execute a GraphQL query against the PlayerData API.\n * Stateless — caller provides the access token.\n */\nexport async function executeQuery<T = unknown>(\n token: string,\n query: string,\n variables?: Record<string, unknown>\n): Promise<T> {\n const res = await fetch(PLAYERDATA_GRAPHQL_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({ query, variables }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`PlayerData GraphQL request failed (${res.status}): ${text}`)\n }\n\n const json: GraphQLResponse<T> = await res.json()\n\n if (json.errors?.length) {\n const messages = json.errors.map((e) => e.message).join('; ')\n throw new Error(`PlayerData GraphQL errors: ${messages}`)\n }\n\n if (!json.data) {\n throw new Error('PlayerData GraphQL response missing data')\n }\n\n return json.data\n}\n"],"mappings":"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","names":[]}
|
package/dist/ui/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { VariantProps } from 'class-variance-authority';
|
|
|
5
5
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
6
6
|
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
7
7
|
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
8
|
+
import * as SelectPrimitive from '@radix-ui/react-select';
|
|
8
9
|
|
|
9
10
|
declare const buttonVariants: (props?: ({
|
|
10
11
|
variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
|
|
@@ -52,6 +53,15 @@ declare const DialogFooter: {
|
|
|
52
53
|
declare const DialogTitle: React$1.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React$1.RefAttributes<HTMLHeadingElement>, "ref"> & React$1.RefAttributes<HTMLHeadingElement>>;
|
|
53
54
|
declare const DialogDescription: React$1.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React$1.RefAttributes<HTMLParagraphElement>, "ref"> & React$1.RefAttributes<HTMLParagraphElement>>;
|
|
54
55
|
|
|
56
|
+
declare const Select: React$1.FC<SelectPrimitive.SelectProps>;
|
|
57
|
+
declare const SelectGroup: React$1.ForwardRefExoticComponent<SelectPrimitive.SelectGroupProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
58
|
+
declare const SelectValue: React$1.ForwardRefExoticComponent<SelectPrimitive.SelectValueProps & React$1.RefAttributes<HTMLSpanElement>>;
|
|
59
|
+
declare const SelectTrigger: React$1.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectTriggerProps & React$1.RefAttributes<HTMLButtonElement>, "ref"> & React$1.RefAttributes<HTMLButtonElement>>;
|
|
60
|
+
declare const SelectContent: React$1.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectContentProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
61
|
+
declare const SelectItem: React$1.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
62
|
+
declare const SelectSeparator: React$1.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
63
|
+
declare const SelectLabel: React$1.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
64
|
+
|
|
55
65
|
declare const AnimatedTooltip: ({ items, }: {
|
|
56
66
|
items: {
|
|
57
67
|
id: number;
|
|
@@ -100,4 +110,4 @@ declare const Highlight: ({ children, className, }: {
|
|
|
100
110
|
className?: string;
|
|
101
111
|
}) => react_jsx_runtime.JSX.Element;
|
|
102
112
|
|
|
103
|
-
export { AnimatedTooltip, Badge, type BadgeProps, Button, type ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, FlipWords, HeroHighlight, Highlight, HoverCard, HoverCardDescription, HoverCardTitle, HoverEffect, Input, type InputProps, Label, badgeVariants, buttonVariants };
|
|
113
|
+
export { AnimatedTooltip, Badge, type BadgeProps, Button, type ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, FlipWords, HeroHighlight, Highlight, HoverCard, HoverCardDescription, HoverCardTitle, HoverEffect, Input, type InputProps, Label, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, badgeVariants, buttonVariants };
|
package/dist/ui/index.js
CHANGED
|
@@ -300,6 +300,114 @@ var DialogDescription = React5.forwardRef(({ className, ...props }, ref) => /* @
|
|
|
300
300
|
));
|
|
301
301
|
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
302
302
|
|
|
303
|
+
// src/ui/select.tsx
|
|
304
|
+
import * as React6 from "react";
|
|
305
|
+
import * as SelectPrimitive from "@radix-ui/react-select";
|
|
306
|
+
import { jsx as jsx7, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
307
|
+
var Select = SelectPrimitive.Root;
|
|
308
|
+
var SelectGroup = SelectPrimitive.Group;
|
|
309
|
+
var SelectValue = SelectPrimitive.Value;
|
|
310
|
+
var SelectTrigger = React6.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs2(
|
|
311
|
+
SelectPrimitive.Trigger,
|
|
312
|
+
{
|
|
313
|
+
ref,
|
|
314
|
+
className: cn(
|
|
315
|
+
"flex h-10 w-full items-center justify-between rounded-md border border-neutral-700 bg-zinc-800 px-3 py-2 text-sm text-white shadow-sm ring-offset-background placeholder:text-neutral-500 focus:outline-none focus:ring-2 focus:ring-neutral-600 focus:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
|
|
316
|
+
className
|
|
317
|
+
),
|
|
318
|
+
...props,
|
|
319
|
+
children: [
|
|
320
|
+
children,
|
|
321
|
+
/* @__PURE__ */ jsx7(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx7(
|
|
322
|
+
"svg",
|
|
323
|
+
{
|
|
324
|
+
className: "h-4 w-4 opacity-50",
|
|
325
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
326
|
+
viewBox: "0 0 24 24",
|
|
327
|
+
fill: "none",
|
|
328
|
+
stroke: "currentColor",
|
|
329
|
+
strokeWidth: "2",
|
|
330
|
+
strokeLinecap: "round",
|
|
331
|
+
strokeLinejoin: "round",
|
|
332
|
+
children: /* @__PURE__ */ jsx7("path", { d: "m6 9 6 6 6-6" })
|
|
333
|
+
}
|
|
334
|
+
) })
|
|
335
|
+
]
|
|
336
|
+
}
|
|
337
|
+
));
|
|
338
|
+
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
|
|
339
|
+
var SelectContent = React6.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx7(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsx7(
|
|
340
|
+
SelectPrimitive.Content,
|
|
341
|
+
{
|
|
342
|
+
ref,
|
|
343
|
+
className: cn(
|
|
344
|
+
"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-neutral-700 bg-zinc-800 text-white shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]: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",
|
|
345
|
+
position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
|
|
346
|
+
className
|
|
347
|
+
),
|
|
348
|
+
position,
|
|
349
|
+
...props,
|
|
350
|
+
children: /* @__PURE__ */ jsx7(
|
|
351
|
+
SelectPrimitive.Viewport,
|
|
352
|
+
{
|
|
353
|
+
className: cn(
|
|
354
|
+
"p-1",
|
|
355
|
+
position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"
|
|
356
|
+
),
|
|
357
|
+
children
|
|
358
|
+
}
|
|
359
|
+
)
|
|
360
|
+
}
|
|
361
|
+
) }));
|
|
362
|
+
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
|
363
|
+
var SelectItem = React6.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs2(
|
|
364
|
+
SelectPrimitive.Item,
|
|
365
|
+
{
|
|
366
|
+
ref,
|
|
367
|
+
className: cn(
|
|
368
|
+
"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-white/10 focus:text-white data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
369
|
+
className
|
|
370
|
+
),
|
|
371
|
+
...props,
|
|
372
|
+
children: [
|
|
373
|
+
/* @__PURE__ */ jsx7("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx7(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx7(
|
|
374
|
+
"svg",
|
|
375
|
+
{
|
|
376
|
+
className: "h-4 w-4",
|
|
377
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
378
|
+
viewBox: "0 0 24 24",
|
|
379
|
+
fill: "none",
|
|
380
|
+
stroke: "currentColor",
|
|
381
|
+
strokeWidth: "2",
|
|
382
|
+
strokeLinecap: "round",
|
|
383
|
+
strokeLinejoin: "round",
|
|
384
|
+
children: /* @__PURE__ */ jsx7("path", { d: "M20 6 9 17l-5-5" })
|
|
385
|
+
}
|
|
386
|
+
) }) }),
|
|
387
|
+
/* @__PURE__ */ jsx7(SelectPrimitive.ItemText, { children })
|
|
388
|
+
]
|
|
389
|
+
}
|
|
390
|
+
));
|
|
391
|
+
SelectItem.displayName = SelectPrimitive.Item.displayName;
|
|
392
|
+
var SelectSeparator = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
|
|
393
|
+
SelectPrimitive.Separator,
|
|
394
|
+
{
|
|
395
|
+
ref,
|
|
396
|
+
className: cn("-mx-1 my-1 h-px bg-neutral-700", className),
|
|
397
|
+
...props
|
|
398
|
+
}
|
|
399
|
+
));
|
|
400
|
+
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
|
401
|
+
var SelectLabel = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
|
|
402
|
+
SelectPrimitive.Label,
|
|
403
|
+
{
|
|
404
|
+
ref,
|
|
405
|
+
className: cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className),
|
|
406
|
+
...props
|
|
407
|
+
}
|
|
408
|
+
));
|
|
409
|
+
SelectLabel.displayName = SelectPrimitive.Label.displayName;
|
|
410
|
+
|
|
303
411
|
// src/ui/animated-tooltip.tsx
|
|
304
412
|
import { useState as useState2 } from "react";
|
|
305
413
|
import {
|
|
@@ -308,7 +416,7 @@ import {
|
|
|
308
416
|
useMotionValue as useMotionValue2,
|
|
309
417
|
useSpring
|
|
310
418
|
} from "motion/react";
|
|
311
|
-
import { Fragment, jsx as
|
|
419
|
+
import { Fragment, jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
312
420
|
var AnimatedTooltip = ({
|
|
313
421
|
items
|
|
314
422
|
}) => {
|
|
@@ -327,14 +435,14 @@ var AnimatedTooltip = ({
|
|
|
327
435
|
const halfWidth = event.target.offsetWidth / 2;
|
|
328
436
|
x.set(event.nativeEvent.offsetX - halfWidth);
|
|
329
437
|
};
|
|
330
|
-
return /* @__PURE__ */
|
|
438
|
+
return /* @__PURE__ */ jsx8(Fragment, { children: items.map((item, idx) => /* @__PURE__ */ jsxs3(
|
|
331
439
|
"div",
|
|
332
440
|
{
|
|
333
441
|
className: "-mr-4 relative group",
|
|
334
442
|
onMouseEnter: () => setHoveredIndex(item.id),
|
|
335
443
|
onMouseLeave: () => setHoveredIndex(null),
|
|
336
444
|
children: [
|
|
337
|
-
hoveredIndex === item.id && /* @__PURE__ */
|
|
445
|
+
hoveredIndex === item.id && /* @__PURE__ */ jsxs3(
|
|
338
446
|
motion2.div,
|
|
339
447
|
{
|
|
340
448
|
initial: { opacity: 0, y: 20, scale: 0.6 },
|
|
@@ -356,14 +464,14 @@ var AnimatedTooltip = ({
|
|
|
356
464
|
},
|
|
357
465
|
className: "absolute -top-16 -left-1/2 translate-x-1/2 flex text-xs flex-col items-center justify-center rounded-md bg-black z-50 shadow-xl px-4 py-2",
|
|
358
466
|
children: [
|
|
359
|
-
/* @__PURE__ */
|
|
360
|
-
/* @__PURE__ */
|
|
361
|
-
/* @__PURE__ */
|
|
362
|
-
/* @__PURE__ */
|
|
467
|
+
/* @__PURE__ */ jsx8("div", { className: "absolute inset-x-10 z-30 w-[20%] -bottom-px bg-gradient-to-r from-transparent via-emerald-500 to-transparent h-px " }),
|
|
468
|
+
/* @__PURE__ */ jsx8("div", { className: "absolute left-10 w-[40%] z-30 -bottom-px bg-gradient-to-r from-transparent via-sky-500 to-transparent h-px " }),
|
|
469
|
+
/* @__PURE__ */ jsx8("div", { className: "font-bold text-white relative z-30 text-base", children: item.name }),
|
|
470
|
+
/* @__PURE__ */ jsx8("div", { className: "text-white text-xs", children: item.designation })
|
|
363
471
|
]
|
|
364
472
|
}
|
|
365
473
|
),
|
|
366
|
-
/* @__PURE__ */
|
|
474
|
+
/* @__PURE__ */ jsx8(
|
|
367
475
|
"img",
|
|
368
476
|
{
|
|
369
477
|
onMouseMove: handleMouseMove,
|
|
@@ -384,20 +492,20 @@ var AnimatedTooltip = ({
|
|
|
384
492
|
import { AnimatePresence as AnimatePresence2, motion as motion3 } from "motion/react";
|
|
385
493
|
import Link from "next/link";
|
|
386
494
|
import { useState as useState3 } from "react";
|
|
387
|
-
import { jsx as
|
|
495
|
+
import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
388
496
|
var HoverEffect = ({
|
|
389
497
|
items,
|
|
390
498
|
className
|
|
391
499
|
}) => {
|
|
392
500
|
let [hoveredIndex, setHoveredIndex] = useState3(null);
|
|
393
|
-
return /* @__PURE__ */
|
|
501
|
+
return /* @__PURE__ */ jsx9(
|
|
394
502
|
"div",
|
|
395
503
|
{
|
|
396
504
|
className: cn(
|
|
397
505
|
"flex flex-wrap justify-center items-center pb-10",
|
|
398
506
|
className
|
|
399
507
|
),
|
|
400
|
-
children: items.map((item, idx) => /* @__PURE__ */
|
|
508
|
+
children: items.map((item, idx) => /* @__PURE__ */ jsxs4(
|
|
401
509
|
Link,
|
|
402
510
|
{
|
|
403
511
|
href: item?.link,
|
|
@@ -405,7 +513,7 @@ var HoverEffect = ({
|
|
|
405
513
|
onMouseEnter: () => setHoveredIndex(idx),
|
|
406
514
|
onMouseLeave: () => setHoveredIndex(null),
|
|
407
515
|
children: [
|
|
408
|
-
/* @__PURE__ */
|
|
516
|
+
/* @__PURE__ */ jsx9(AnimatePresence2, { children: hoveredIndex === idx && /* @__PURE__ */ jsx9(
|
|
409
517
|
motion3.span,
|
|
410
518
|
{
|
|
411
519
|
className: "absolute inset-0 h-full w-full bg-neutral-400/[0.5] block rounded-3xl",
|
|
@@ -421,9 +529,9 @@ var HoverEffect = ({
|
|
|
421
529
|
}
|
|
422
530
|
}
|
|
423
531
|
) }),
|
|
424
|
-
/* @__PURE__ */
|
|
425
|
-
/* @__PURE__ */
|
|
426
|
-
/* @__PURE__ */
|
|
532
|
+
/* @__PURE__ */ jsxs4(HoverCard, { logoUrl: item.logoUrl, children: [
|
|
533
|
+
/* @__PURE__ */ jsx9(HoverCardTitle, { children: item.title }),
|
|
534
|
+
/* @__PURE__ */ jsx9(HoverCardDescription, { children: item.description })
|
|
427
535
|
] })
|
|
428
536
|
]
|
|
429
537
|
},
|
|
@@ -437,7 +545,7 @@ var HoverCard = ({
|
|
|
437
545
|
children,
|
|
438
546
|
logoUrl
|
|
439
547
|
}) => {
|
|
440
|
-
return /* @__PURE__ */
|
|
548
|
+
return /* @__PURE__ */ jsxs4(
|
|
441
549
|
"div",
|
|
442
550
|
{
|
|
443
551
|
className: cn(
|
|
@@ -445,7 +553,7 @@ var HoverCard = ({
|
|
|
445
553
|
className
|
|
446
554
|
),
|
|
447
555
|
children: [
|
|
448
|
-
/* @__PURE__ */
|
|
556
|
+
/* @__PURE__ */ jsx9(
|
|
449
557
|
"div",
|
|
450
558
|
{
|
|
451
559
|
className: "absolute bottom-[-3rem] left-[-5rem] h-56 w-56 opacity-50",
|
|
@@ -458,7 +566,7 @@ var HoverCard = ({
|
|
|
458
566
|
}
|
|
459
567
|
}
|
|
460
568
|
),
|
|
461
|
-
/* @__PURE__ */
|
|
569
|
+
/* @__PURE__ */ jsx9("div", { className: "relative z-50", children: /* @__PURE__ */ jsx9("div", { className: "p-4", children }) })
|
|
462
570
|
]
|
|
463
571
|
}
|
|
464
572
|
);
|
|
@@ -467,13 +575,13 @@ var HoverCardTitle = ({
|
|
|
467
575
|
className,
|
|
468
576
|
children
|
|
469
577
|
}) => {
|
|
470
|
-
return /* @__PURE__ */
|
|
578
|
+
return /* @__PURE__ */ jsx9("h4", { className: cn("text-zinc-100 font-bold tracking-wide mt-4", className), children });
|
|
471
579
|
};
|
|
472
580
|
var HoverCardDescription = ({
|
|
473
581
|
className,
|
|
474
582
|
children
|
|
475
583
|
}) => {
|
|
476
|
-
return /* @__PURE__ */
|
|
584
|
+
return /* @__PURE__ */ jsx9(
|
|
477
585
|
"p",
|
|
478
586
|
{
|
|
479
587
|
className: cn(
|
|
@@ -488,7 +596,7 @@ var HoverCardDescription = ({
|
|
|
488
596
|
// src/ui/flip-words.tsx
|
|
489
597
|
import { useCallback, useEffect, useState as useState4 } from "react";
|
|
490
598
|
import { AnimatePresence as AnimatePresence3, motion as motion4 } from "motion/react";
|
|
491
|
-
import { jsx as
|
|
599
|
+
import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
492
600
|
var FlipWords = ({
|
|
493
601
|
words,
|
|
494
602
|
duration = 3e3,
|
|
@@ -507,13 +615,13 @@ var FlipWords = ({
|
|
|
507
615
|
startAnimation();
|
|
508
616
|
}, duration);
|
|
509
617
|
}, [isAnimating, duration, startAnimation]);
|
|
510
|
-
return /* @__PURE__ */
|
|
618
|
+
return /* @__PURE__ */ jsx10(
|
|
511
619
|
AnimatePresence3,
|
|
512
620
|
{
|
|
513
621
|
onExitComplete: () => {
|
|
514
622
|
setIsAnimating(false);
|
|
515
623
|
},
|
|
516
|
-
children: /* @__PURE__ */
|
|
624
|
+
children: /* @__PURE__ */ jsx10(
|
|
517
625
|
motion4.div,
|
|
518
626
|
{
|
|
519
627
|
initial: {
|
|
@@ -541,7 +649,7 @@ var FlipWords = ({
|
|
|
541
649
|
"z-10 inline-block relative text-left text-neutral-100 px-2",
|
|
542
650
|
className
|
|
543
651
|
),
|
|
544
|
-
children: currentWord.split(" ").map((word, wordIndex) => /* @__PURE__ */
|
|
652
|
+
children: currentWord.split(" ").map((word, wordIndex) => /* @__PURE__ */ jsxs5(
|
|
545
653
|
motion4.span,
|
|
546
654
|
{
|
|
547
655
|
initial: { opacity: 0, y: 10, filter: "blur(8px)" },
|
|
@@ -552,7 +660,7 @@ var FlipWords = ({
|
|
|
552
660
|
},
|
|
553
661
|
className: "inline-block whitespace-nowrap",
|
|
554
662
|
children: [
|
|
555
|
-
word.split("").map((letter, letterIndex) => /* @__PURE__ */
|
|
663
|
+
word.split("").map((letter, letterIndex) => /* @__PURE__ */ jsx10(
|
|
556
664
|
motion4.span,
|
|
557
665
|
{
|
|
558
666
|
initial: { opacity: 0, y: 10, filter: "blur(8px)" },
|
|
@@ -566,7 +674,7 @@ var FlipWords = ({
|
|
|
566
674
|
},
|
|
567
675
|
word + letterIndex
|
|
568
676
|
)),
|
|
569
|
-
/* @__PURE__ */
|
|
677
|
+
/* @__PURE__ */ jsx10("span", { className: "inline-block", children: "\xA0" })
|
|
570
678
|
]
|
|
571
679
|
},
|
|
572
680
|
word + wordIndex
|
|
@@ -586,7 +694,7 @@ import {
|
|
|
586
694
|
animate
|
|
587
695
|
} from "motion/react";
|
|
588
696
|
import { useEffect as useEffect2, useState as useState5 } from "react";
|
|
589
|
-
import { jsx as
|
|
697
|
+
import { jsx as jsx11, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
590
698
|
var HeroHighlight = ({
|
|
591
699
|
children,
|
|
592
700
|
className,
|
|
@@ -625,7 +733,7 @@ var HeroHighlight = ({
|
|
|
625
733
|
mouseX.set(event.clientX - left);
|
|
626
734
|
mouseY.set(event.clientY - top);
|
|
627
735
|
};
|
|
628
|
-
return /* @__PURE__ */
|
|
736
|
+
return /* @__PURE__ */ jsxs6(
|
|
629
737
|
"div",
|
|
630
738
|
{
|
|
631
739
|
className: cn(
|
|
@@ -634,8 +742,8 @@ var HeroHighlight = ({
|
|
|
634
742
|
),
|
|
635
743
|
onMouseMove: handleMouseMove,
|
|
636
744
|
children: [
|
|
637
|
-
/* @__PURE__ */
|
|
638
|
-
/* @__PURE__ */
|
|
745
|
+
/* @__PURE__ */ jsx11("div", { className: "absolute inset-0 bg-dot-thick-neutral-800 pointer-events-none" }),
|
|
746
|
+
/* @__PURE__ */ jsx11(
|
|
639
747
|
motion5.div,
|
|
640
748
|
{
|
|
641
749
|
className: "pointer-events-none bg-dot-thick-gray-100 absolute inset-0 opacity-0 transition duration-300 group-hover:opacity-100",
|
|
@@ -657,7 +765,7 @@ var HeroHighlight = ({
|
|
|
657
765
|
}
|
|
658
766
|
}
|
|
659
767
|
),
|
|
660
|
-
/* @__PURE__ */
|
|
768
|
+
/* @__PURE__ */ jsx11("div", { className: cn("relative z-20", className), children })
|
|
661
769
|
]
|
|
662
770
|
}
|
|
663
771
|
);
|
|
@@ -666,7 +774,7 @@ var Highlight = ({
|
|
|
666
774
|
children,
|
|
667
775
|
className
|
|
668
776
|
}) => {
|
|
669
|
-
return /* @__PURE__ */
|
|
777
|
+
return /* @__PURE__ */ jsx11(
|
|
670
778
|
motion5.span,
|
|
671
779
|
{
|
|
672
780
|
initial: {
|
|
@@ -722,6 +830,14 @@ export {
|
|
|
722
830
|
HoverEffect,
|
|
723
831
|
Input,
|
|
724
832
|
Label,
|
|
833
|
+
Select,
|
|
834
|
+
SelectContent,
|
|
835
|
+
SelectGroup,
|
|
836
|
+
SelectItem,
|
|
837
|
+
SelectLabel,
|
|
838
|
+
SelectSeparator,
|
|
839
|
+
SelectTrigger,
|
|
840
|
+
SelectValue,
|
|
725
841
|
badgeVariants,
|
|
726
842
|
buttonVariants
|
|
727
843
|
};
|
package/dist/ui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/button.tsx","../../src/utils/cn.ts","../../src/ui/card.tsx","../../src/ui/badge.tsx","../../src/ui/label.tsx","../../src/ui/input.tsx","../../src/ui/dialog.tsx","../../src/ui/animated-tooltip.tsx","../../src/ui/card-hover-effect.tsx","../../src/ui/flip-words.tsx","../../src/ui/hero-highlight.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../utils/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline:\n 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'rounded-lg border bg-card text-card-foreground shadow-sm',\n className\n )}\n {...props}\n />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n />\n))\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n 'text-2xl font-semibold leading-none tracking-tight',\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n))\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../utils/cn'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n","'use client'\n\nimport * as React from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../utils/cn'\n\nconst labelVariants = cva(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","'use client'\n\nimport * as React from 'react'\nimport { cn } from '../utils/cn'\nimport { useMotionTemplate, useMotionValue, motion } from 'motion/react'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n const radius = 100\n const [visible, setVisible] = React.useState(false)\n\n let mouseX = useMotionValue(0)\n let mouseY = useMotionValue(0)\n\n function handleMouseMove({ currentTarget, clientX, clientY }: any) {\n let { left, top } = currentTarget.getBoundingClientRect()\n\n mouseX.set(clientX - left)\n mouseY.set(clientY - top)\n }\n return (\n <motion.div\n style={{\n background: useMotionTemplate`\n radial-gradient(\n ${visible ? radius + 'px' : '0px'} circle at ${mouseX}px ${mouseY}px,\n var(--timberwolf),\n transparent 80%\n )\n `,\n }}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n className=\"p-[2px] rounded-lg transition duration-300 group/input\"\n >\n <input\n type={type}\n className={cn(\n `flex h-10 w-full border-none bg-zinc-800 text-white shadow-input rounded-md px-3 py-2 text-sm file:border-0 file:bg-transparent\n file:text-sm file:font-mediumplaceholder-text-neutral-600\n focus-visible:outline-none focus-visible:ring-[2px] focus-visible:ring-neutral-600\n disabled:cursor-not-allowed disabled:opacity-50\n shadow-[0px_0px_1px_1px_var(--neutral-700)]\n group-hover/input:shadow-none transition duration-400\n `,\n className\n )}\n ref={ref}\n {...props}\n />\n </motion.div>\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { cn } from '../utils/cn'\nimport { Cross2Icon } from '@radix-ui/react-icons'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-zinc-800 bg-zinc-950 p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-zinc-950 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-zinc-300 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-zinc-800 data-[state=open]:text-zinc-400\">\n <Cross2Icon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'flex flex-col space-y-1.5 text-center sm:text-left',\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n 'text-lg font-semibold leading-none tracking-tight',\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-zinc-400', className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","'use client'\n\nimport React, { useState } from 'react'\nimport {\n motion,\n useTransform,\n AnimatePresence,\n useMotionValue,\n useSpring,\n} from 'motion/react'\n\nexport const AnimatedTooltip = ({\n items,\n}: {\n items: {\n id: number\n name: string\n designation: string\n image: string\n }[]\n}) => {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n const springConfig = { stiffness: 100, damping: 5 }\n const x = useMotionValue(0)\n const rotate = useSpring(\n useTransform(x, [-100, 100], [-45, 45]),\n springConfig\n )\n const translateX = useSpring(\n useTransform(x, [-100, 100], [-50, 50]),\n springConfig\n )\n const handleMouseMove = (event: any) => {\n const halfWidth = event.target.offsetWidth / 2\n x.set(event.nativeEvent.offsetX - halfWidth)\n }\n\n return (\n <>\n {items.map((item, idx) => (\n <div\n className=\"-mr-4 relative group\"\n key={item.name}\n onMouseEnter={() => setHoveredIndex(item.id)}\n onMouseLeave={() => setHoveredIndex(null)}\n >\n {hoveredIndex === item.id && (\n <motion.div\n initial={{ opacity: 0, y: 20, scale: 0.6 }}\n animate={{\n opacity: 1,\n y: 0,\n scale: 1,\n transition: {\n type: 'spring',\n stiffness: 260,\n damping: 10,\n },\n }}\n exit={{ opacity: 0, y: 20, scale: 0.6 }}\n style={{\n translateX: translateX,\n rotate: rotate,\n whiteSpace: 'nowrap',\n }}\n className=\"absolute -top-16 -left-1/2 translate-x-1/2 flex text-xs flex-col items-center justify-center rounded-md bg-black z-50 shadow-xl px-4 py-2\"\n >\n <div className=\"absolute inset-x-10 z-30 w-[20%] -bottom-px bg-gradient-to-r from-transparent via-emerald-500 to-transparent h-px \" />\n <div className=\"absolute left-10 w-[40%] z-30 -bottom-px bg-gradient-to-r from-transparent via-sky-500 to-transparent h-px \" />\n <div className=\"font-bold text-white relative z-30 text-base\">\n {item.name}\n </div>\n <div className=\"text-white text-xs\">{item.designation}</div>\n </motion.div>\n )}\n <img\n onMouseMove={handleMouseMove}\n height={100}\n width={100}\n src={item.image}\n alt={item.name}\n className=\"object-cover !m-0 !p-0 object-top rounded-full h-16 w-16 border-2 group-hover:scale-105 group-hover:z-30 border-[var(--ash-grey)] relative transition duration-500\"\n />\n </div>\n ))}\n </>\n )\n}\n","'use client'\n\nimport { cn } from '../utils/cn'\nimport { AnimatePresence, motion } from 'motion/react'\nimport Link from 'next/link'\nimport { useState } from 'react'\n\nexport const HoverEffect = ({\n items,\n className,\n}: {\n items: {\n title: string\n description: string\n link: string\n logoUrl: string\n }[]\n className?: string\n}) => {\n let [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n return (\n <div\n className={cn(\n 'flex flex-wrap justify-center items-center pb-10',\n className\n )}\n >\n {items.map((item, idx) => (\n <Link\n href={item?.link}\n key={item?.link}\n className=\"relative group block p-2 h-72 w-80\"\n onMouseEnter={() => setHoveredIndex(idx)}\n onMouseLeave={() => setHoveredIndex(null)}\n >\n <AnimatePresence>\n {hoveredIndex === idx && (\n <motion.span\n className=\"absolute inset-0 h-full w-full bg-neutral-400/[0.5] block rounded-3xl\"\n layoutId=\"hoverBackground\"\n initial={{ opacity: 0 }}\n animate={{\n opacity: 1,\n transition: { duration: 0.15 },\n }}\n exit={{\n opacity: 0,\n transition: { duration: 0.15, delay: 0.2 },\n }}\n />\n )}\n </AnimatePresence>\n <HoverCard logoUrl={item.logoUrl}>\n <HoverCardTitle>{item.title}</HoverCardTitle>\n <HoverCardDescription>{item.description}</HoverCardDescription>\n </HoverCard>\n </Link>\n ))}\n </div>\n )\n}\n\nexport const HoverCard = ({\n className,\n children,\n logoUrl,\n}: {\n className?: string\n children: React.ReactNode\n logoUrl: string\n}) => {\n return (\n <div\n className={cn(\n 'rounded-2xl h-full w-full p-4 overflow-hidden bg-black border border-white/[0.2] group-hover:border-[var(--timberwolf)] relative z-20',\n className\n )}\n >\n <div\n className=\"absolute bottom-[-3rem] left-[-5rem] h-56 w-56 opacity-50\"\n style={{\n backgroundImage: `url(${logoUrl})`,\n backgroundPosition: 'bottom left',\n backgroundSize: 'contain',\n backgroundRepeat: 'no-repeat',\n maskImage: 'linear-gradient(to bottom left, transparent, black)',\n }}\n />\n <div className=\"relative z-50\">\n <div className=\"p-4\">{children}</div>\n </div>\n </div>\n )\n}\nexport const HoverCardTitle = ({\n className,\n children,\n}: {\n className?: string\n children: React.ReactNode\n}) => {\n return (\n <h4 className={cn('text-zinc-100 font-bold tracking-wide mt-4', className)}>\n {children}\n </h4>\n )\n}\nexport const HoverCardDescription = ({\n className,\n children,\n}: {\n className?: string\n children: React.ReactNode\n}) => {\n return (\n <p\n className={cn(\n 'mt-8 text-zinc-400 tracking-wide leading-relaxed text-sm',\n className\n )}\n >\n {children}\n </p>\n )\n}\n","'use client'\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { AnimatePresence, motion, LayoutGroup } from 'motion/react'\nimport { cn } from '../utils/cn'\n\nexport const FlipWords = ({\n words,\n duration = 3000,\n className,\n}: {\n words: string[]\n duration?: number\n className?: string\n}) => {\n const [currentWord, setCurrentWord] = useState(words[0])\n const [isAnimating, setIsAnimating] = useState<boolean>(false)\n\n const startAnimation = useCallback(() => {\n const word = words[words.indexOf(currentWord) + 1] || words[0]\n setCurrentWord(word)\n setIsAnimating(true)\n }, [currentWord, words])\n\n useEffect(() => {\n if (!isAnimating)\n setTimeout(() => {\n startAnimation()\n }, duration)\n }, [isAnimating, duration, startAnimation])\n\n return (\n <AnimatePresence\n onExitComplete={() => {\n setIsAnimating(false)\n }}\n >\n <motion.div\n initial={{\n opacity: 0,\n y: 10,\n }}\n animate={{\n opacity: 1,\n y: 0,\n }}\n transition={{\n type: 'spring',\n stiffness: 100,\n damping: 10,\n }}\n exit={{\n opacity: 0,\n y: -40,\n x: 40,\n filter: 'blur(8px)',\n scale: 2,\n position: 'absolute',\n }}\n className={cn(\n 'z-10 inline-block relative text-left text-neutral-100 px-2',\n className\n )}\n key={currentWord}\n >\n {currentWord.split(' ').map((word, wordIndex) => (\n <motion.span\n key={word + wordIndex}\n initial={{ opacity: 0, y: 10, filter: 'blur(8px)' }}\n animate={{ opacity: 1, y: 0, filter: 'blur(0px)' }}\n transition={{\n delay: wordIndex * 0.3,\n duration: 0.3,\n }}\n className=\"inline-block whitespace-nowrap\"\n >\n {word.split('').map((letter, letterIndex) => (\n <motion.span\n key={word + letterIndex}\n initial={{ opacity: 0, y: 10, filter: 'blur(8px)' }}\n animate={{ opacity: 1, y: 0, filter: 'blur(0px)' }}\n transition={{\n delay: wordIndex * 0.3 + letterIndex * 0.05,\n duration: 0.2,\n }}\n className=\"inline-block\"\n >\n {letter}\n </motion.span>\n ))}\n <span className=\"inline-block\"> </span>\n </motion.span>\n ))}\n </motion.div>\n </AnimatePresence>\n )\n}\n","'use client'\n\nimport { cn } from '../utils/cn'\nimport {\n useMotionValue,\n motion,\n useMotionTemplate,\n animate,\n} from 'motion/react'\nimport React, { useEffect, useState } from 'react'\n\nexport const HeroHighlight = ({\n children,\n className,\n containerClassName,\n}: {\n children: React.ReactNode\n className?: string\n containerClassName?: string\n}) => {\n let mouseX = useMotionValue(0)\n let mouseY = useMotionValue(0)\n const [isHoverable, setIsHoverable] = useState(false)\n\n useEffect(() => {\n const mediaQuery = window.matchMedia('(pointer: fine)')\n setIsHoverable(mediaQuery.matches)\n\n const handleChange = (e: MediaQueryListEvent) => {\n setIsHoverable(e.matches)\n }\n\n mediaQuery.addEventListener('change', handleChange)\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange)\n }\n }, [])\n\n useEffect(() => {\n if (!isHoverable) {\n const updatePosition = () => {\n const randomX = Math.random() * window.innerWidth\n const randomY = Math.random() * window.innerHeight\n animate(mouseX, randomX, { duration: 2 })\n animate(mouseY, randomY, { duration: 2 })\n }\n\n const interval = setInterval(updatePosition, 2000)\n updatePosition()\n\n return () => clearInterval(interval)\n }\n }, [isHoverable, mouseX, mouseY])\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n if (!isHoverable || !event.currentTarget) return\n const { left, top } = event.currentTarget.getBoundingClientRect()\n mouseX.set(event.clientX - left)\n mouseY.set(event.clientY - top)\n }\n\n return (\n <div\n className={cn(\n 'relative h-[40rem] flex items-center bg-[var(--night)] justify-center w-full group',\n containerClassName\n )}\n onMouseMove={handleMouseMove}\n >\n <div className=\"absolute inset-0 bg-dot-thick-neutral-800 pointer-events-none\" />\n <motion.div\n className=\"pointer-events-none bg-dot-thick-gray-100 absolute inset-0 opacity-0 transition duration-300 group-hover:opacity-100\"\n style={{\n WebkitMaskImage: useMotionTemplate`\n radial-gradient(\n 200px circle at ${mouseX}px ${mouseY}px,\n black 0%,\n transparent 100%\n )\n `,\n maskImage: useMotionTemplate`\n radial-gradient(\n 200px circle at ${mouseX}px ${mouseY}px,\n black 0%,\n transparent 100%\n )\n `,\n }}\n />\n\n <div className={cn('relative z-20', className)}>{children}</div>\n </div>\n )\n}\n\nexport const Highlight = ({\n children,\n className,\n}: {\n children: React.ReactNode\n className?: string\n}) => {\n return (\n <motion.span\n initial={{\n backgroundSize: '0% 100%',\n }}\n animate={{\n backgroundSize: '100% 100%',\n }}\n transition={{\n duration: 2,\n ease: 'linear',\n delay: 0.5,\n }}\n style={{\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'left center',\n display: 'inline',\n }}\n className={cn(\n `relative inline-block pb-1 px-1 rounded-lg bg-gradient-to-r from-[var(--ash-grey)] to-[var(--timberwolf)]`,\n className\n )}\n >\n {children}\n </motion.span>\n )\n}\n"],"mappings":"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","names":["React","jsx","cva","jsx","cva","React","cva","jsx","cva","React","jsx","React","jsx","useState","motion","useMotionValue","jsx","jsxs","AnimatePresence","motion","useState","jsx","jsxs","useState","AnimatePresence","motion","jsx","jsxs","useState","AnimatePresence","motion","useMotionValue","motion","useMotionTemplate","useEffect","useState","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/button.tsx","../../src/utils/cn.ts","../../src/ui/card.tsx","../../src/ui/badge.tsx","../../src/ui/label.tsx","../../src/ui/input.tsx","../../src/ui/dialog.tsx","../../src/ui/select.tsx","../../src/ui/animated-tooltip.tsx","../../src/ui/card-hover-effect.tsx","../../src/ui/flip-words.tsx","../../src/ui/hero-highlight.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../utils/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline:\n 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'rounded-lg border bg-card text-card-foreground shadow-sm',\n className\n )}\n {...props}\n />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n />\n))\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n 'text-2xl font-semibold leading-none tracking-tight',\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n))\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../utils/cn'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n","'use client'\n\nimport * as React from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../utils/cn'\n\nconst labelVariants = cva(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","'use client'\n\nimport * as React from 'react'\nimport { cn } from '../utils/cn'\nimport { useMotionTemplate, useMotionValue, motion } from 'motion/react'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n const radius = 100\n const [visible, setVisible] = React.useState(false)\n\n let mouseX = useMotionValue(0)\n let mouseY = useMotionValue(0)\n\n function handleMouseMove({ currentTarget, clientX, clientY }: any) {\n let { left, top } = currentTarget.getBoundingClientRect()\n\n mouseX.set(clientX - left)\n mouseY.set(clientY - top)\n }\n return (\n <motion.div\n style={{\n background: useMotionTemplate`\n radial-gradient(\n ${visible ? radius + 'px' : '0px'} circle at ${mouseX}px ${mouseY}px,\n var(--timberwolf),\n transparent 80%\n )\n `,\n }}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n className=\"p-[2px] rounded-lg transition duration-300 group/input\"\n >\n <input\n type={type}\n className={cn(\n `flex h-10 w-full border-none bg-zinc-800 text-white shadow-input rounded-md px-3 py-2 text-sm file:border-0 file:bg-transparent\n file:text-sm file:font-mediumplaceholder-text-neutral-600\n focus-visible:outline-none focus-visible:ring-[2px] focus-visible:ring-neutral-600\n disabled:cursor-not-allowed disabled:opacity-50\n shadow-[0px_0px_1px_1px_var(--neutral-700)]\n group-hover/input:shadow-none transition duration-400\n `,\n className\n )}\n ref={ref}\n {...props}\n />\n </motion.div>\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { cn } from '../utils/cn'\nimport { Cross2Icon } from '@radix-ui/react-icons'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-zinc-800 bg-zinc-950 p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-zinc-950 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-zinc-300 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-zinc-800 data-[state=open]:text-zinc-400\">\n <Cross2Icon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'flex flex-col space-y-1.5 text-center sm:text-left',\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n 'text-lg font-semibold leading-none tracking-tight',\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-zinc-400', className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { cn } from '../utils/cn'\n\nconst Select = SelectPrimitive.Root\nconst SelectGroup = SelectPrimitive.Group\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-10 w-full items-center justify-between rounded-md border border-neutral-700 bg-zinc-800 px-3 py-2 text-sm text-white shadow-sm ring-offset-background placeholder:text-neutral-500 focus:outline-none focus:ring-2 focus:ring-neutral-600 focus:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <svg\n className=\"h-4 w-4 opacity-50\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-neutral-700 bg-zinc-800 text-white shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]: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',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-white/10 focus:text-white data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <svg\n className=\"h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-neutral-700', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n}\n","'use client'\n\nimport React, { useState } from 'react'\nimport {\n motion,\n useTransform,\n AnimatePresence,\n useMotionValue,\n useSpring,\n} from 'motion/react'\n\nexport const AnimatedTooltip = ({\n items,\n}: {\n items: {\n id: number\n name: string\n designation: string\n image: string\n }[]\n}) => {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n const springConfig = { stiffness: 100, damping: 5 }\n const x = useMotionValue(0)\n const rotate = useSpring(\n useTransform(x, [-100, 100], [-45, 45]),\n springConfig\n )\n const translateX = useSpring(\n useTransform(x, [-100, 100], [-50, 50]),\n springConfig\n )\n const handleMouseMove = (event: any) => {\n const halfWidth = event.target.offsetWidth / 2\n x.set(event.nativeEvent.offsetX - halfWidth)\n }\n\n return (\n <>\n {items.map((item, idx) => (\n <div\n className=\"-mr-4 relative group\"\n key={item.name}\n onMouseEnter={() => setHoveredIndex(item.id)}\n onMouseLeave={() => setHoveredIndex(null)}\n >\n {hoveredIndex === item.id && (\n <motion.div\n initial={{ opacity: 0, y: 20, scale: 0.6 }}\n animate={{\n opacity: 1,\n y: 0,\n scale: 1,\n transition: {\n type: 'spring',\n stiffness: 260,\n damping: 10,\n },\n }}\n exit={{ opacity: 0, y: 20, scale: 0.6 }}\n style={{\n translateX: translateX,\n rotate: rotate,\n whiteSpace: 'nowrap',\n }}\n className=\"absolute -top-16 -left-1/2 translate-x-1/2 flex text-xs flex-col items-center justify-center rounded-md bg-black z-50 shadow-xl px-4 py-2\"\n >\n <div className=\"absolute inset-x-10 z-30 w-[20%] -bottom-px bg-gradient-to-r from-transparent via-emerald-500 to-transparent h-px \" />\n <div className=\"absolute left-10 w-[40%] z-30 -bottom-px bg-gradient-to-r from-transparent via-sky-500 to-transparent h-px \" />\n <div className=\"font-bold text-white relative z-30 text-base\">\n {item.name}\n </div>\n <div className=\"text-white text-xs\">{item.designation}</div>\n </motion.div>\n )}\n <img\n onMouseMove={handleMouseMove}\n height={100}\n width={100}\n src={item.image}\n alt={item.name}\n className=\"object-cover !m-0 !p-0 object-top rounded-full h-16 w-16 border-2 group-hover:scale-105 group-hover:z-30 border-[var(--ash-grey)] relative transition duration-500\"\n />\n </div>\n ))}\n </>\n )\n}\n","'use client'\n\nimport { cn } from '../utils/cn'\nimport { AnimatePresence, motion } from 'motion/react'\nimport Link from 'next/link'\nimport { useState } from 'react'\n\nexport const HoverEffect = ({\n items,\n className,\n}: {\n items: {\n title: string\n description: string\n link: string\n logoUrl: string\n }[]\n className?: string\n}) => {\n let [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n return (\n <div\n className={cn(\n 'flex flex-wrap justify-center items-center pb-10',\n className\n )}\n >\n {items.map((item, idx) => (\n <Link\n href={item?.link}\n key={item?.link}\n className=\"relative group block p-2 h-72 w-80\"\n onMouseEnter={() => setHoveredIndex(idx)}\n onMouseLeave={() => setHoveredIndex(null)}\n >\n <AnimatePresence>\n {hoveredIndex === idx && (\n <motion.span\n className=\"absolute inset-0 h-full w-full bg-neutral-400/[0.5] block rounded-3xl\"\n layoutId=\"hoverBackground\"\n initial={{ opacity: 0 }}\n animate={{\n opacity: 1,\n transition: { duration: 0.15 },\n }}\n exit={{\n opacity: 0,\n transition: { duration: 0.15, delay: 0.2 },\n }}\n />\n )}\n </AnimatePresence>\n <HoverCard logoUrl={item.logoUrl}>\n <HoverCardTitle>{item.title}</HoverCardTitle>\n <HoverCardDescription>{item.description}</HoverCardDescription>\n </HoverCard>\n </Link>\n ))}\n </div>\n )\n}\n\nexport const HoverCard = ({\n className,\n children,\n logoUrl,\n}: {\n className?: string\n children: React.ReactNode\n logoUrl: string\n}) => {\n return (\n <div\n className={cn(\n 'rounded-2xl h-full w-full p-4 overflow-hidden bg-black border border-white/[0.2] group-hover:border-[var(--timberwolf)] relative z-20',\n className\n )}\n >\n <div\n className=\"absolute bottom-[-3rem] left-[-5rem] h-56 w-56 opacity-50\"\n style={{\n backgroundImage: `url(${logoUrl})`,\n backgroundPosition: 'bottom left',\n backgroundSize: 'contain',\n backgroundRepeat: 'no-repeat',\n maskImage: 'linear-gradient(to bottom left, transparent, black)',\n }}\n />\n <div className=\"relative z-50\">\n <div className=\"p-4\">{children}</div>\n </div>\n </div>\n )\n}\nexport const HoverCardTitle = ({\n className,\n children,\n}: {\n className?: string\n children: React.ReactNode\n}) => {\n return (\n <h4 className={cn('text-zinc-100 font-bold tracking-wide mt-4', className)}>\n {children}\n </h4>\n )\n}\nexport const HoverCardDescription = ({\n className,\n children,\n}: {\n className?: string\n children: React.ReactNode\n}) => {\n return (\n <p\n className={cn(\n 'mt-8 text-zinc-400 tracking-wide leading-relaxed text-sm',\n className\n )}\n >\n {children}\n </p>\n )\n}\n","'use client'\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { AnimatePresence, motion, LayoutGroup } from 'motion/react'\nimport { cn } from '../utils/cn'\n\nexport const FlipWords = ({\n words,\n duration = 3000,\n className,\n}: {\n words: string[]\n duration?: number\n className?: string\n}) => {\n const [currentWord, setCurrentWord] = useState(words[0])\n const [isAnimating, setIsAnimating] = useState<boolean>(false)\n\n const startAnimation = useCallback(() => {\n const word = words[words.indexOf(currentWord) + 1] || words[0]\n setCurrentWord(word)\n setIsAnimating(true)\n }, [currentWord, words])\n\n useEffect(() => {\n if (!isAnimating)\n setTimeout(() => {\n startAnimation()\n }, duration)\n }, [isAnimating, duration, startAnimation])\n\n return (\n <AnimatePresence\n onExitComplete={() => {\n setIsAnimating(false)\n }}\n >\n <motion.div\n initial={{\n opacity: 0,\n y: 10,\n }}\n animate={{\n opacity: 1,\n y: 0,\n }}\n transition={{\n type: 'spring',\n stiffness: 100,\n damping: 10,\n }}\n exit={{\n opacity: 0,\n y: -40,\n x: 40,\n filter: 'blur(8px)',\n scale: 2,\n position: 'absolute',\n }}\n className={cn(\n 'z-10 inline-block relative text-left text-neutral-100 px-2',\n className\n )}\n key={currentWord}\n >\n {currentWord.split(' ').map((word, wordIndex) => (\n <motion.span\n key={word + wordIndex}\n initial={{ opacity: 0, y: 10, filter: 'blur(8px)' }}\n animate={{ opacity: 1, y: 0, filter: 'blur(0px)' }}\n transition={{\n delay: wordIndex * 0.3,\n duration: 0.3,\n }}\n className=\"inline-block whitespace-nowrap\"\n >\n {word.split('').map((letter, letterIndex) => (\n <motion.span\n key={word + letterIndex}\n initial={{ opacity: 0, y: 10, filter: 'blur(8px)' }}\n animate={{ opacity: 1, y: 0, filter: 'blur(0px)' }}\n transition={{\n delay: wordIndex * 0.3 + letterIndex * 0.05,\n duration: 0.2,\n }}\n className=\"inline-block\"\n >\n {letter}\n </motion.span>\n ))}\n <span className=\"inline-block\"> </span>\n </motion.span>\n ))}\n </motion.div>\n </AnimatePresence>\n )\n}\n","'use client'\n\nimport { cn } from '../utils/cn'\nimport {\n useMotionValue,\n motion,\n useMotionTemplate,\n animate,\n} from 'motion/react'\nimport React, { useEffect, useState } from 'react'\n\nexport const HeroHighlight = ({\n children,\n className,\n containerClassName,\n}: {\n children: React.ReactNode\n className?: string\n containerClassName?: string\n}) => {\n let mouseX = useMotionValue(0)\n let mouseY = useMotionValue(0)\n const [isHoverable, setIsHoverable] = useState(false)\n\n useEffect(() => {\n const mediaQuery = window.matchMedia('(pointer: fine)')\n setIsHoverable(mediaQuery.matches)\n\n const handleChange = (e: MediaQueryListEvent) => {\n setIsHoverable(e.matches)\n }\n\n mediaQuery.addEventListener('change', handleChange)\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange)\n }\n }, [])\n\n useEffect(() => {\n if (!isHoverable) {\n const updatePosition = () => {\n const randomX = Math.random() * window.innerWidth\n const randomY = Math.random() * window.innerHeight\n animate(mouseX, randomX, { duration: 2 })\n animate(mouseY, randomY, { duration: 2 })\n }\n\n const interval = setInterval(updatePosition, 2000)\n updatePosition()\n\n return () => clearInterval(interval)\n }\n }, [isHoverable, mouseX, mouseY])\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n if (!isHoverable || !event.currentTarget) return\n const { left, top } = event.currentTarget.getBoundingClientRect()\n mouseX.set(event.clientX - left)\n mouseY.set(event.clientY - top)\n }\n\n return (\n <div\n className={cn(\n 'relative h-[40rem] flex items-center bg-[var(--night)] justify-center w-full group',\n containerClassName\n )}\n onMouseMove={handleMouseMove}\n >\n <div className=\"absolute inset-0 bg-dot-thick-neutral-800 pointer-events-none\" />\n <motion.div\n className=\"pointer-events-none bg-dot-thick-gray-100 absolute inset-0 opacity-0 transition duration-300 group-hover:opacity-100\"\n style={{\n WebkitMaskImage: useMotionTemplate`\n radial-gradient(\n 200px circle at ${mouseX}px ${mouseY}px,\n black 0%,\n transparent 100%\n )\n `,\n maskImage: useMotionTemplate`\n radial-gradient(\n 200px circle at ${mouseX}px ${mouseY}px,\n black 0%,\n transparent 100%\n )\n `,\n }}\n />\n\n <div className={cn('relative z-20', className)}>{children}</div>\n </div>\n )\n}\n\nexport const Highlight = ({\n children,\n className,\n}: {\n children: React.ReactNode\n className?: string\n}) => {\n return (\n <motion.span\n initial={{\n backgroundSize: '0% 100%',\n }}\n animate={{\n backgroundSize: '100% 100%',\n }}\n transition={{\n duration: 2,\n ease: 'linear',\n delay: 0.5,\n }}\n style={{\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'left center',\n display: 'inline',\n }}\n className={cn(\n `relative inline-block pb-1 px-1 rounded-lg bg-gradient-to-r from-[var(--ash-grey)] to-[var(--timberwolf)]`,\n className\n )}\n >\n {children}\n </motion.span>\n )\n}\n"],"mappings":"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","names":["React","jsx","cva","jsx","cva","React","cva","jsx","cva","React","jsx","React","jsx","React","jsx","jsxs","useState","motion","useMotionValue","jsx","jsxs","AnimatePresence","motion","useState","jsx","jsxs","useState","AnimatePresence","motion","jsx","jsxs","useState","AnimatePresence","motion","useMotionValue","motion","useMotionTemplate","useEffect","useState","jsx","jsxs"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@braintwopoint0/playback-commons",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Shared UI components, auth utilities, and Supabase client for the PLAYBACK Sports ecosystem",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -21,6 +21,10 @@
|
|
|
21
21
|
"./supabase": {
|
|
22
22
|
"import": "./dist/supabase/index.js",
|
|
23
23
|
"types": "./dist/supabase/index.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./playerdata": {
|
|
26
|
+
"import": "./dist/playerdata/index.js",
|
|
27
|
+
"types": "./dist/playerdata/index.d.ts"
|
|
24
28
|
}
|
|
25
29
|
},
|
|
26
30
|
"files": [
|
|
@@ -28,37 +32,40 @@
|
|
|
28
32
|
],
|
|
29
33
|
"scripts": {
|
|
30
34
|
"build": "tsup",
|
|
31
|
-
"dev": "tsup --watch"
|
|
35
|
+
"dev": "tsup --watch",
|
|
36
|
+
"test": "vitest run"
|
|
32
37
|
},
|
|
33
38
|
"peerDependencies": {
|
|
34
|
-
"react": ">=18",
|
|
35
|
-
"react-dom": ">=18",
|
|
36
|
-
"next": ">=14",
|
|
37
39
|
"@supabase/ssr": ">=0.5",
|
|
38
|
-
"@supabase/supabase-js": "^2.50.0"
|
|
40
|
+
"@supabase/supabase-js": "^2.50.0",
|
|
41
|
+
"next": ">=14",
|
|
42
|
+
"react": ">=18",
|
|
43
|
+
"react-dom": ">=18"
|
|
39
44
|
},
|
|
40
45
|
"dependencies": {
|
|
41
|
-
"clsx": "^2.1.1",
|
|
42
|
-
"tailwind-merge": "^2.6.0",
|
|
43
|
-
"class-variance-authority": "^0.7.1",
|
|
44
|
-
"motion": "^12.23.22",
|
|
45
46
|
"@radix-ui/react-dialog": "^1.1.14",
|
|
46
47
|
"@radix-ui/react-icons": "^1.3.0",
|
|
47
48
|
"@radix-ui/react-label": "^2.0.2",
|
|
48
|
-
"@radix-ui/react-
|
|
49
|
+
"@radix-ui/react-select": "^2.2.6",
|
|
50
|
+
"@radix-ui/react-slot": "^1.2.3",
|
|
51
|
+
"class-variance-authority": "^0.7.1",
|
|
52
|
+
"clsx": "^2.1.1",
|
|
53
|
+
"motion": "^12.23.22",
|
|
54
|
+
"tailwind-merge": "^2.6.0"
|
|
49
55
|
},
|
|
50
56
|
"devDependencies": {
|
|
51
|
-
"tsup": "^8.4.0",
|
|
52
|
-
"typescript": "^5",
|
|
53
|
-
"react": "^19",
|
|
54
|
-
"react-dom": "^19",
|
|
55
|
-
"next": "^15",
|
|
56
57
|
"@supabase/ssr": "^0.6.1",
|
|
57
58
|
"@supabase/supabase-js": "^2.50.3",
|
|
58
59
|
"@types/react": "^19",
|
|
59
|
-
"@types/react-dom": "^19"
|
|
60
|
+
"@types/react-dom": "^19",
|
|
61
|
+
"next": "^15",
|
|
62
|
+
"react": "^19",
|
|
63
|
+
"react-dom": "^19",
|
|
64
|
+
"tsup": "^8.4.0",
|
|
65
|
+
"typescript": "^5",
|
|
66
|
+
"vitest": "^3.2.1"
|
|
60
67
|
},
|
|
61
68
|
"publishConfig": {
|
|
62
69
|
"access": "public"
|
|
63
70
|
}
|
|
64
|
-
}
|
|
71
|
+
}
|