@pitvox/partner-react 0.7.22 → 0.7.24

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/styles.css CHANGED
@@ -2854,3 +2854,469 @@
2854
2854
  width: 100%;
2855
2855
  height: 100%;
2856
2856
  }
2857
+
2858
+ /* ═══════════════════════════════════════════════════════════════════════════
2859
+ Promotions (giveaways)
2860
+ ═══════════════════════════════════════════════════════════════════════════ */
2861
+
2862
+ .pvx-promo-explorer-title {
2863
+ font-size: 1.5rem;
2864
+ font-weight: 700;
2865
+ color: var(--pvx-text-primary);
2866
+ margin: 0 0 1.5rem;
2867
+ }
2868
+
2869
+ /* ─── Card grid ─── */
2870
+
2871
+ .pvx-promo-grid {
2872
+ display: grid;
2873
+ grid-template-columns: 1fr;
2874
+ gap: 1.5rem;
2875
+ }
2876
+
2877
+ @media (min-width: 640px) {
2878
+ .pvx-promo-grid { grid-template-columns: repeat(2, 1fr); }
2879
+ }
2880
+
2881
+ @media (min-width: 1024px) {
2882
+ .pvx-promo-grid { grid-template-columns: repeat(3, 1fr); }
2883
+ }
2884
+
2885
+ /* Count-adaptive layouts (set by PromotionCards): a lone card renders wide
2886
+ and centred; a pair caps at two columns. */
2887
+ .pvx-promo-grid--single {
2888
+ grid-template-columns: 1fr;
2889
+ max-width: 42rem;
2890
+ margin-inline: auto;
2891
+ }
2892
+
2893
+ @media (min-width: 640px) {
2894
+ .pvx-promo-grid--single { grid-template-columns: 1fr; }
2895
+ .pvx-promo-grid--pair { grid-template-columns: repeat(2, 1fr); }
2896
+ }
2897
+
2898
+ @media (min-width: 1024px) {
2899
+ .pvx-promo-grid--single { grid-template-columns: 1fr; }
2900
+ .pvx-promo-grid--pair { grid-template-columns: repeat(2, 1fr); }
2901
+ }
2902
+
2903
+ .pvx-promo-card {
2904
+ border-radius: var(--pvx-radius);
2905
+ border: 1px solid var(--pvx-border);
2906
+ background: var(--pvx-bg-card);
2907
+ overflow: hidden;
2908
+ cursor: pointer;
2909
+ transition: border-color 200ms, box-shadow 200ms;
2910
+ display: flex;
2911
+ flex-direction: column;
2912
+ }
2913
+
2914
+ .pvx-promo-card:hover {
2915
+ border-color: var(--pvx-accent);
2916
+ box-shadow: 0 0 0 1px var(--pvx-accent);
2917
+ }
2918
+
2919
+ .pvx-promo-card:focus-visible {
2920
+ outline: 2px solid var(--pvx-accent);
2921
+ outline-offset: 2px;
2922
+ }
2923
+
2924
+ .pvx-promo-card-poster {
2925
+ aspect-ratio: 16 / 9;
2926
+ background: #0d1117;
2927
+ overflow: hidden;
2928
+ }
2929
+
2930
+ .pvx-promo-card-poster-img {
2931
+ width: 100%;
2932
+ height: 100%;
2933
+ object-fit: cover;
2934
+ }
2935
+
2936
+ .pvx-promo-card-poster-placeholder {
2937
+ width: 100%;
2938
+ height: 100%;
2939
+ display: flex;
2940
+ align-items: center;
2941
+ justify-content: center;
2942
+ }
2943
+
2944
+ .pvx-promo-gift-icon {
2945
+ width: 3rem;
2946
+ height: 3rem;
2947
+ color: var(--pvx-text-dimmed);
2948
+ }
2949
+
2950
+ .pvx-promo-card-body {
2951
+ padding: 1rem;
2952
+ display: flex;
2953
+ flex-direction: column;
2954
+ gap: 0.5rem;
2955
+ flex: 1;
2956
+ }
2957
+
2958
+ .pvx-promo-card-badges {
2959
+ display: flex;
2960
+ align-items: center;
2961
+ gap: 0.375rem;
2962
+ flex-wrap: wrap;
2963
+ }
2964
+
2965
+ .pvx-promo-card-title {
2966
+ font-size: 1.125rem;
2967
+ font-weight: 600;
2968
+ color: var(--pvx-text-primary);
2969
+ margin: 0;
2970
+ overflow: hidden;
2971
+ text-overflow: ellipsis;
2972
+ white-space: nowrap;
2973
+ }
2974
+
2975
+ .pvx-promo-card-prize {
2976
+ font-size: 0.875rem;
2977
+ color: var(--pvx-text);
2978
+ margin: 0;
2979
+ display: -webkit-box;
2980
+ -webkit-line-clamp: 2;
2981
+ -webkit-box-orient: vertical;
2982
+ overflow: hidden;
2983
+ }
2984
+
2985
+ .pvx-promo-card-meta {
2986
+ display: flex;
2987
+ flex-direction: column;
2988
+ gap: 0.25rem;
2989
+ margin-top: auto;
2990
+ font-size: 0.75rem;
2991
+ color: var(--pvx-text-muted);
2992
+ }
2993
+
2994
+ /* ─── Badges ─── */
2995
+
2996
+ .pvx-promo-status,
2997
+ .pvx-promo-type,
2998
+ .pvx-promo-game {
2999
+ display: inline-block;
3000
+ padding: 0.125rem 0.5rem;
3001
+ border-radius: 9999px;
3002
+ font-size: 0.6875rem;
3003
+ font-weight: 600;
3004
+ text-transform: uppercase;
3005
+ letter-spacing: 0.03em;
3006
+ }
3007
+
3008
+ .pvx-promo-status--upcoming {
3009
+ background: rgba(99, 102, 241, 0.2);
3010
+ color: #818cf8;
3011
+ }
3012
+
3013
+ .pvx-promo-status--open {
3014
+ background: rgba(34, 197, 94, 0.2);
3015
+ color: #4ade80;
3016
+ }
3017
+
3018
+ .pvx-promo-status--closed {
3019
+ background: rgba(245, 158, 11, 0.2);
3020
+ color: #fbbf24;
3021
+ }
3022
+
3023
+ .pvx-promo-status--winners {
3024
+ background: rgba(234, 179, 8, 0.25);
3025
+ color: #facc15;
3026
+ }
3027
+
3028
+ .pvx-promo-type {
3029
+ background: rgba(99, 102, 241, 0.2);
3030
+ color: #818cf8;
3031
+ }
3032
+
3033
+ .pvx-promo-game {
3034
+ background: var(--pvx-tag-bg);
3035
+ color: var(--pvx-tag-text);
3036
+ }
3037
+
3038
+ /* ─── Detail view ─── */
3039
+
3040
+ .pvx-promo-detail {
3041
+ display: flex;
3042
+ flex-direction: column;
3043
+ gap: 1.25rem;
3044
+ }
3045
+
3046
+ .pvx-promo-back {
3047
+ align-self: flex-start;
3048
+ background: none;
3049
+ border: none;
3050
+ padding: 0;
3051
+ font-size: 0.875rem;
3052
+ color: var(--pvx-text-muted);
3053
+ cursor: pointer;
3054
+ }
3055
+
3056
+ .pvx-promo-back:hover {
3057
+ color: var(--pvx-accent);
3058
+ }
3059
+
3060
+ .pvx-promo-detail-poster {
3061
+ border-radius: var(--pvx-radius);
3062
+ overflow: hidden;
3063
+ background: #0d1117;
3064
+ /* Match the card's 16:9 crop so the framing is identical between the
3065
+ grid and the opened detail view. */
3066
+ aspect-ratio: 16 / 9;
3067
+ }
3068
+
3069
+ .pvx-promo-detail-poster img {
3070
+ width: 100%;
3071
+ height: 100%;
3072
+ object-fit: cover;
3073
+ display: block;
3074
+ }
3075
+
3076
+ .pvx-promo-detail-header {
3077
+ display: flex;
3078
+ flex-direction: column;
3079
+ gap: 0.5rem;
3080
+ }
3081
+
3082
+ .pvx-promo-detail-title {
3083
+ font-size: 1.5rem;
3084
+ font-weight: 700;
3085
+ color: var(--pvx-text-primary);
3086
+ margin: 0;
3087
+ }
3088
+
3089
+ .pvx-promo-detail-prize {
3090
+ font-size: 1rem;
3091
+ color: var(--pvx-text);
3092
+ margin: 0;
3093
+ }
3094
+
3095
+ .pvx-promo-detail-meta {
3096
+ display: flex;
3097
+ gap: 1rem;
3098
+ flex-wrap: wrap;
3099
+ font-size: 0.8125rem;
3100
+ color: var(--pvx-text-muted);
3101
+ }
3102
+
3103
+ .pvx-promo-section-title {
3104
+ font-size: 1rem;
3105
+ font-weight: 600;
3106
+ color: var(--pvx-text-primary);
3107
+ margin: 0 0 0.75rem;
3108
+ }
3109
+
3110
+ .pvx-promo-section-count {
3111
+ font-weight: 400;
3112
+ color: var(--pvx-text-muted);
3113
+ }
3114
+
3115
+ /* ─── Winners panel ─── */
3116
+
3117
+ .pvx-promo-winners {
3118
+ border-radius: var(--pvx-radius);
3119
+ border: 1px solid rgba(234, 179, 8, 0.4);
3120
+ background: rgba(234, 179, 8, 0.06);
3121
+ padding: 1rem;
3122
+ }
3123
+
3124
+ .pvx-promo-winners-list {
3125
+ display: flex;
3126
+ gap: 1.25rem;
3127
+ flex-wrap: wrap;
3128
+ }
3129
+
3130
+ .pvx-promo-winner {
3131
+ display: flex;
3132
+ align-items: center;
3133
+ gap: 0.5rem;
3134
+ }
3135
+
3136
+ .pvx-promo-winner-name {
3137
+ font-weight: 600;
3138
+ color: var(--pvx-text-primary);
3139
+ }
3140
+
3141
+ /* ─── Entry action ─── */
3142
+
3143
+ .pvx-promo-action {
3144
+ border-radius: var(--pvx-radius);
3145
+ border: 1px solid var(--pvx-border);
3146
+ background: var(--pvx-bg-card);
3147
+ padding: 1rem;
3148
+ }
3149
+
3150
+ .pvx-promo-action-row {
3151
+ display: flex;
3152
+ align-items: center;
3153
+ justify-content: space-between;
3154
+ gap: 1rem;
3155
+ flex-wrap: wrap;
3156
+ }
3157
+
3158
+ .pvx-promo-action-note {
3159
+ font-size: 0.9375rem;
3160
+ color: var(--pvx-text-primary);
3161
+ margin: 0;
3162
+ }
3163
+
3164
+ .pvx-promo-disclosure {
3165
+ font-size: 0.75rem;
3166
+ color: var(--pvx-text-dimmed);
3167
+ margin: 0.25rem 0 0;
3168
+ }
3169
+
3170
+ .pvx-promo-error {
3171
+ font-size: 0.8125rem;
3172
+ color: #f87171;
3173
+ margin: 0 0 0.25rem;
3174
+ }
3175
+
3176
+ .pvx-promo-enter-btn,
3177
+ .pvx-promo-withdraw-btn,
3178
+ .pvx-promo-enter-link {
3179
+ display: inline-block;
3180
+ padding: 0.5rem 1.25rem;
3181
+ border-radius: 0.5rem;
3182
+ font-size: 0.875rem;
3183
+ font-weight: 600;
3184
+ cursor: pointer;
3185
+ text-decoration: none;
3186
+ transition: background-color 150ms, opacity 150ms;
3187
+ border: none;
3188
+ }
3189
+
3190
+ .pvx-promo-enter-btn,
3191
+ .pvx-promo-enter-link {
3192
+ background: var(--pvx-accent);
3193
+ color: #fff;
3194
+ }
3195
+
3196
+ .pvx-promo-enter-btn:hover:not(:disabled),
3197
+ .pvx-promo-enter-link:hover {
3198
+ opacity: 0.9;
3199
+ }
3200
+
3201
+ .pvx-promo-enter-btn:disabled {
3202
+ opacity: 0.5;
3203
+ cursor: not-allowed;
3204
+ }
3205
+
3206
+ .pvx-promo-withdraw-btn {
3207
+ background: transparent;
3208
+ border: 1px solid var(--pvx-border);
3209
+ color: var(--pvx-text-muted);
3210
+ }
3211
+
3212
+ .pvx-promo-withdraw-btn:hover:not(:disabled) {
3213
+ border-color: #f87171;
3214
+ color: #f87171;
3215
+ }
3216
+
3217
+ /* ─── Description (markdown) ─── */
3218
+
3219
+ .pvx-promo-description {
3220
+ border-radius: var(--pvx-radius);
3221
+ border: 1px solid var(--pvx-border);
3222
+ background: var(--pvx-bg-card);
3223
+ padding: 1.25rem;
3224
+ color: var(--pvx-text-primary);
3225
+ font-size: 0.9375rem;
3226
+ line-height: 1.6;
3227
+ }
3228
+
3229
+ .pvx-promo-description h1,
3230
+ .pvx-promo-description h2,
3231
+ .pvx-promo-description h3 {
3232
+ color: var(--pvx-text-primary);
3233
+ margin: 1rem 0 0.5rem;
3234
+ }
3235
+
3236
+ .pvx-promo-description h1:first-child,
3237
+ .pvx-promo-description h2:first-child,
3238
+ .pvx-promo-description h3:first-child,
3239
+ .pvx-promo-description p:first-child {
3240
+ margin-top: 0;
3241
+ }
3242
+
3243
+ .pvx-promo-description p,
3244
+ .pvx-promo-description ul,
3245
+ .pvx-promo-description ol {
3246
+ margin: 0.5rem 0;
3247
+ }
3248
+
3249
+ .pvx-promo-description a {
3250
+ color: var(--pvx-accent);
3251
+ }
3252
+
3253
+ .pvx-promo-description code {
3254
+ background: var(--pvx-tag-bg);
3255
+ border-radius: 0.25rem;
3256
+ padding: 0.125rem 0.25rem;
3257
+ font-size: 0.85em;
3258
+ }
3259
+
3260
+ /* ─── Entrants grid ─── */
3261
+
3262
+ .pvx-promo-entrants {
3263
+ border-radius: var(--pvx-radius);
3264
+ border: 1px solid var(--pvx-border);
3265
+ background: var(--pvx-bg-card);
3266
+ padding: 1.25rem;
3267
+ }
3268
+
3269
+ .pvx-promo-entrants-grid {
3270
+ display: grid;
3271
+ grid-template-columns: repeat(2, 1fr);
3272
+ gap: 0.75rem;
3273
+ }
3274
+
3275
+ @media (min-width: 640px) {
3276
+ .pvx-promo-entrants-grid { grid-template-columns: repeat(3, 1fr); }
3277
+ }
3278
+
3279
+ @media (min-width: 1024px) {
3280
+ .pvx-promo-entrants-grid { grid-template-columns: repeat(4, 1fr); }
3281
+ }
3282
+
3283
+ .pvx-promo-entrant {
3284
+ display: flex;
3285
+ align-items: center;
3286
+ gap: 0.5rem;
3287
+ min-width: 0;
3288
+ }
3289
+
3290
+ .pvx-promo-entrant-name {
3291
+ font-size: 0.875rem;
3292
+ color: var(--pvx-text-primary);
3293
+ overflow: hidden;
3294
+ text-overflow: ellipsis;
3295
+ white-space: nowrap;
3296
+ }
3297
+
3298
+ .pvx-promo-avatar {
3299
+ width: 1.75rem;
3300
+ height: 1.75rem;
3301
+ border-radius: 9999px;
3302
+ flex-shrink: 0;
3303
+ object-fit: cover;
3304
+ }
3305
+
3306
+ .pvx-promo-avatar--lg {
3307
+ width: 2.5rem;
3308
+ height: 2.5rem;
3309
+ }
3310
+
3311
+ .pvx-promo-avatar--placeholder {
3312
+ background: var(--pvx-tag-bg);
3313
+ display: flex;
3314
+ align-items: center;
3315
+ justify-content: center;
3316
+ }
3317
+
3318
+ .pvx-promo-avatar-glyph {
3319
+ width: 55%;
3320
+ height: 55%;
3321
+ color: var(--pvx-text-dimmed);
3322
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pitvox/partner-react",
3
- "version": "0.7.22",
3
+ "version": "0.7.24",
4
4
  "description": "React hooks and styled components for PitVox partner websites — leaderboards, competitions, driver dashboards",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -26,6 +26,9 @@
26
26
  "react": "^18.0.0 || ^19.0.0",
27
27
  "react-dom": "^18.0.0 || ^19.0.0"
28
28
  },
29
+ "dependencies": {
30
+ "react-markdown": "^10.1.0"
31
+ },
29
32
  "devDependencies": {
30
33
  "@release-it/conventional-changelog": "^10.0.6",
31
34
  "@tanstack/react-query": "^5.0.0",