@rileybathurst/paddle 1.9.30 → 1.9.32

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rileybathurst/paddle",
3
3
  "private": false,
4
- "version": "1.9.30",
4
+ "version": "1.9.32",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "tsc --noEmit && stay-gold && vite",
@@ -10,6 +10,7 @@
10
10
  "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
11
11
  "preview": "vite preview",
12
12
  "storybook": "tsc --noEmit && stay-gold && storybook dev -p 6006",
13
+ "storybook-dirty": "storybook dev -p 6006",
13
14
  "build-storybook": "storybook build",
14
15
  "release": "npm version patch && npm login && npm publish",
15
16
  "stay-gold": "stay-gold"
package/src/index.tsx CHANGED
@@ -19,6 +19,7 @@ export * from "./paddle-testimonial";
19
19
  export * from "./paddle-purchase";
20
20
  export * from "./paddle-pricing-chart";
21
21
  export * from "./paddle-texture-backgrounds";
22
+ export * from "./paddle-compare";
22
23
 
23
24
  // Organisms
24
25
  export * from "./paddle-location-deck";
@@ -42,4 +43,5 @@ export * from "./types/paddle-purchase-types";
42
43
  export * from "./types/paddle-purchase-image-types";
43
44
  export * from "./types/paddle-brand-list-types";
44
45
  export * from "./types/paddle-book-now-types";
45
- export * from "./types/paddle-testimonial-types";
46
+ export * from "./types/paddle-testimonial-types";
47
+ export * from "./types/paddle-compare-types";
@@ -1,10 +1,10 @@
1
- // TODO: this is not ready dont use it
2
- // Vite runs so I feel like I can pull this into it for testing itll be abit of a thing that might not be used but I think easier than storybook
1
+ // ! this is the next fix
3
2
 
4
3
  import React from 'react';
5
4
 
6
5
  // import { PaddleTime } from './paddle-time';
7
6
  import { PaddleBookNow } from './paddle-book-now';
7
+ import type { PaddleCompareTypes } from './types/paddle-compare-types';
8
8
 
9
9
  type CompareDetailsProps = {
10
10
  title: string;
@@ -22,9 +22,26 @@ type CompareDetailsProps = {
22
22
  peeks?: string;
23
23
  peek_base: string;
24
24
  strapiBranchName: string;
25
+
26
+ // ? this can maybe loop from itself?
27
+ tours: {
28
+ id: React.Key;
29
+ name: string;
30
+ slug: string;
31
+ sport: string;
32
+ duration?: string;
33
+ timeframe?: string;
34
+ start?: string;
35
+ finish?: string;
36
+ excerpt?: string;
37
+ minimum?: number;
38
+ price?: number;
39
+ peek?: string;
40
+ fitness?: string;
41
+ }[];
25
42
  };
26
43
 
27
- const CompareDetails = ({
44
+ const CompareDetails = ({
28
45
  title,
29
46
  link,
30
47
  sport,
@@ -39,30 +56,33 @@ const CompareDetails = ({
39
56
  price,
40
57
  peeks,
41
58
  peek_base,
42
- strapiBranchName }: CompareDetailsProps) => {
59
+ strapiBranchName,
60
+ tours
61
+ }: CompareDetailsProps) => {
43
62
  return (
44
63
  <section>
45
- {/* <select
64
+ <select
46
65
  name="tour1"
47
66
  id={title}
48
67
  className="comparesheet_select"
49
68
  aria-label="Select first tour or lesson"
50
69
  >
51
- {Array.from({ length: faker.number.int({ min: 1, max: 10 }) }).map(() => (
70
+ {tours.map((tour) => (
52
71
  <option
53
- key={faker.string.uuid()}
54
- value={faker.food.dish()}
72
+ key={tour.id}
73
+ value={tour.name}
55
74
  >
56
- {faker.food.dish()}
75
+ {tour.name}
57
76
  </option>
58
77
  ))}
59
- </select> */}
78
+ </select>
60
79
  <h2 className="kilimanjaro">
61
80
  <a href={link}>{title}</a>
62
81
  </h2>
63
82
 
64
83
  <h4 className="capitalize">{sport}</h4>
65
84
 
85
+ {/* // TODO: time is more complex so just get it running first */}
66
86
  {/* <p>
67
87
  <PaddleTime
68
88
  start={start}
@@ -97,71 +117,17 @@ const CompareDetails = ({
97
117
  )
98
118
  }
99
119
 
100
- type PaddleCompareTypes = {
101
- tours: {
102
- id: number;
103
- name: string;
104
- slug: string;
105
- sport: string;
106
- duration?: string;
107
- timeframe?: string;
108
- start?: string;
109
- finish?: string;
110
- fitness?: string;
111
- location: string;
112
- excerpt: string;
113
- minimum: number;
114
- price: number;
115
- peek?: string;
116
- }[];
117
- strapiBranchName: string;
118
- peek_base: string;
119
- };
120
- export const PaddleCompare = ({ tours, strapiBranchName, peek_base }: PaddleCompareTypes) => {
121
-
122
- /* const [id1, setID1] = useState(tours[0].id);
123
- const [id2, setID2] = useState(tours[1].id);
124
-
125
- const [tour1, setTour1] = useState(tours[0].name);
126
- const [tour2, setTour2] = useState(tours[1].name);
127
-
128
- const [link1, setLink1] = useState(tours[0].slug);
129
- const [link2, setLink2] = useState(tours[1].slug);
130
-
131
- const [sport1, setSport1] = useState(tours[0].sport);
132
- const [sport2, setSport2] = useState(tours[1].sport);
133
-
134
- const [duration1, setDuration1] = useState(tours[0].duration || 'not set');
135
- const [duration2, setDuration2] = useState(tours[1].duration || 'not set');
136
-
137
- const [timeframe1, setTimeframe1] = useState(tours[0].timeframe || 'not set');
138
- const [timeframe2, setTimeframe2] = useState(tours[1].timeframe || 'not set');
139
-
140
- const [start1, setStart1] = useState(tours[0].start || 'not set');
141
- const [start2, setStart2] = useState(tours[1].start || 'not set');
142
-
143
- const [finish1, setFinish1] = useState(tours[0].finish || 'not set');
144
- const [finish2, setFinish2] = useState(tours[1].finish || 'not set');
145
120
 
146
- const [excerpt1, setExcerpt1] = useState(tours[0].excerpt || 'not set');
147
- const [excerpt2, setExcerpt2] = useState(tours[1].excerpt || 'not set');
148
-
149
- const [minimum1, setMinimum1] = useState(tours[0].minimum || 0);
150
- const [minimum2, setMinimum2] = useState(tours[1].minimum || 0);
151
-
152
- const [price1, setPrice1] = useState(tours[0].price || 0);
153
- const [price2, setPrice2] = useState(tours[1].price || 0);
154
-
155
- const [peeks1, setPeeks1] = useState(tours[0].peek || 'not set');
156
- const [peeks2, setPeeks2] = useState(tours[1].peek || 'not set');
121
+ export const PaddleCompare = ({ tours, strapiBranchName, peek_base }: PaddleCompareTypes) => {
157
122
 
158
- const [fitness1, setFitness1] = useState(tours[0].fitness || 'fitness');
159
- const [fitness2, setFitness2] = useState(tours[1].fitness || 'fitness'); */
123
+ // TODO: testing
124
+ console.log(tours);
125
+ console.log(strapiBranchName);
126
+ console.log(peek_base);
160
127
 
161
- // I dont know if this works as a state but I need to slowly build it all back out as its a mess
162
128
  let id1 = tours[0].id;
163
129
  let id2 = tours[1].id;
164
-
130
+
165
131
  let tour1 = tours[0].name;
166
132
  let tour2 = tours[1].name;
167
133
  let link1 = tours[0].slug;
@@ -206,22 +172,6 @@ export const PaddleCompare = ({ tours, strapiBranchName, peek_base }: PaddleComp
206
172
  <p className='button-drop'>Book Now</p>
207
173
  </div>
208
174
 
209
- <select
210
- name="tour1"
211
- // id={id1}
212
- className="comparesheet_select"
213
- aria-label="Select first tour or lesson"
214
- >
215
- {tours.map((tour) => (
216
- <option
217
- key={tour.id}
218
- value={tour.id}
219
- >
220
- {tour.name}
221
- </option>
222
- ))}
223
- </select>
224
-
225
175
  <CompareDetails
226
176
  key={id1}
227
177
  title={tour1}
@@ -237,8 +187,11 @@ export const PaddleCompare = ({ tours, strapiBranchName, peek_base }: PaddleComp
237
187
  price={price1}
238
188
  peeks={peeks1}
239
189
  fitness={fitness1}
190
+
240
191
  strapiBranchName={strapiBranchName}
241
192
  peek_base={peek_base}
193
+
194
+ tours={tours}
242
195
  />
243
196
  <CompareDetails
244
197
  key={id2}
@@ -255,8 +208,12 @@ export const PaddleCompare = ({ tours, strapiBranchName, peek_base }: PaddleComp
255
208
  price={price2}
256
209
  peeks={peeks2}
257
210
  fitness={fitness2}
211
+
258
212
  strapiBranchName={strapiBranchName}
259
213
  peek_base={peek_base}
214
+
215
+ tours={tours}
216
+
260
217
  />
261
218
 
262
219
  </div>
@@ -5,41 +5,41 @@ import { PaddleInchesRemainder } from "./paddle-inches-remainder";
5
5
  import { PaddleTextureBackgrounds } from "./paddle-texture-backgrounds";
6
6
  import { PaddlePurchaseAndImageTypes } from "./types/paddle-purchase-image-types";
7
7
 
8
- function Name({ name }: { name: string }) {
9
- return (
10
- <div className="badge">
11
- <h5 className="capitalize">{name}</h5>
12
- </div>
13
- );
14
- }
8
+ type BadgeTypes = Record<string, boolean | number | undefined>;
15
9
 
16
- interface BadgeTypes {
17
- inflatable: boolean;
18
- demo: boolean;
19
- discount?: number;
20
- }
10
+ type BadgesProps = {
11
+ badges: BadgeTypes;
12
+ };
13
+ const Badges = ({ badges }: BadgesProps) => {
14
+ return (
15
+ <>
16
+ {Object.entries(badges).map(([key, value]) => {
21
17
 
22
- // TODO: use the way I do specs for this
23
- // TODO: deal with multiple
24
- const Badges = ({ inflatable, demo, discount }: BadgeTypes) => {
25
- if (discount) {
26
- return (
27
- <div className="badge">
28
- <h5 className="capitalize">{discount}% off</h5>
29
- </div>
30
- );
31
- }
18
+ if (!value) {
19
+ return null;
20
+ }
32
21
 
33
- if (inflatable) {
34
- return <Name name="inflatable" />;
35
- }
22
+ if (key === "discount" && typeof value === "number") {
23
+ return (
24
+ <div className="badge" key={key}>
25
+ <h5 className="capitalize">{value}% off</h5>
26
+ </div>
27
+ );
28
+ }
36
29
 
37
- if (demo) {
38
- return <Name name="demo" />;
39
- }
30
+ if (value === true) {
31
+ return (
32
+ <div className="badge" key={key}>
33
+ <h5 className="capitalize">{key}</h5>
34
+ </div>
35
+ );
36
+ }
40
37
 
41
- return null;
42
- }
38
+ return null;
39
+ })}
40
+ </>
41
+ );
42
+ };
43
43
 
44
44
 
45
45
  export const PaddlePurchase = ({
@@ -88,11 +88,19 @@ export const PaddlePurchase = ({
88
88
  />
89
89
  )}
90
90
  </Link>
91
- <Badges
92
- inflatable={inflatable}
93
- demo={demo}
94
- discount={discount}
95
- />
91
+
92
+ {inflatable || demo || discount ? (
93
+ <div className="badges">
94
+ <Badges
95
+ badges={{
96
+ inflatable: inflatable,
97
+ demo: demo,
98
+ discount: discount
99
+ }}
100
+ />
101
+ </div>
102
+ ) : null}
103
+
96
104
  </div>
97
105
  <h4 className="purchase__title">
98
106
  <Link to={`/retail/${sport.slug}/${brand.slug}/${slug}`}>{title}</Link>
@@ -8,6 +8,8 @@
8
8
  @import "nav";
9
9
  @import "layout";
10
10
  @import "cards";
11
+ @import "purchase";
12
+ @import "ticket";
11
13
  @import "media";
12
14
  @import "color";
13
15
  @import "links";
@@ -227,5 +227,5 @@ menu button {
227
227
 
228
228
  footer .book-now {
229
229
  margin-block-start: 0;
230
- margin-block-end: var(--baseline);
230
+ margin-block-end: var(--vinson);
231
231
  }
@@ -1,163 +1,26 @@
1
1
  /*------------------*/
2
- /* #CARDS / PURCHASE / TICKET */
2
+ /* #CARDS */
3
3
  /*------------------*/
4
4
 
5
- /* was deck */
6
- .bag {
7
- margin-block-end: var(--aconcagua);
8
-
9
- display: grid;
10
- grid-template-columns: repeat(auto-fill, minmax(var(--condor), 1fr));
11
-
12
- /* TODO: clamp */
13
- gap: var(--kosciuszko);
14
- }
15
-
16
- /* was card */
17
- .purchase {
18
- padding: 0;
19
- display: flex;
20
- flex-direction: column;
21
- justify-content: space-between;
22
- border: 1px solid transparent;
23
- border-radius: var(--card-radius);
24
- /* needed to control nested elements */
25
- text-decoration: none;
26
- box-shadow: var(--penumbra);
27
- max-width: calc(100vw - 2rem);
5
+ .purchase,
6
+ .ticket {
28
7
  background-color: white;
8
+ border: 1px solid var(--neutral-200);
9
+ border-radius: var(--card-radius);
10
+ padding: var(--kosciuszko);
29
11
 
30
- .purchase-collage {
31
- display: grid;
32
- width: 100%;
33
-
34
- > * {
35
- grid-row: 1;
36
- grid-column: 1;
37
- }
38
-
39
- .texture-slice {
40
- width: calc(100% - var(--elbrus));
41
- aspect-ratio: 16/9;
42
- height: 100%;
43
- align-self: center;
44
- margin: calc(var(--elbrus) / 2);
45
- border-radius: 0.25rem;
46
- box-shadow: var(--penumbra);
47
- border: 1px solid whitesmoke;
48
- stroke: whitesmoke;
49
-
50
- @media (prefers-color-scheme: dark) {
51
- border-color: var(--neutral-100);
52
- stroke: var(--neutral-100);
53
- }
54
- }
55
-
56
- .cutout {
57
- object-fit: contain;
58
- place-self: center;
59
- z-index: var(--understory);
60
- grid-row: 1/1;
61
- filter: drop-shadow(5px 5px 5px var(--neutral-700));
62
- aspect-ratio: 16/9;
63
- width: 100%;
64
- }
65
-
66
- svg {
67
- z-index: var(--floor);
68
- max-height: 100%; /* overwrite the default */
69
- margin: calc(var(--elbrus) / 2);
70
- width: calc(100% - var(--elbrus));
71
- stroke: whitesmoke;
72
-
73
- @media (prefers-color-scheme: dark) {
74
- stroke: var(--neutral-100);
75
- }
76
- }
77
- }
78
-
79
- .image-link {
80
- transition: var(--fade);
81
- transform: scale(1);
82
- z-index: var(--floor);
83
- }
84
-
85
- .image-link:where(:hover, :focus) {
86
- transform: scale(1.05);
87
- }
88
-
89
- .purchase__title {
90
- font-size: var(--denali);
91
- margin-inline: var(--kosciuszko);
92
- line-height: 2.5;
93
- }
94
-
95
- hr,
96
- p {
97
- margin-inline: var(--kosciuszko);
98
- }
99
-
100
- /* img {
101
- width: 100%;
102
- } */
103
-
104
- .purchase__details {
105
- display: flex;
106
- gap: var(--vinson);
107
- width: calc(100% - var(--kilimanjaro));
108
- margin-inline: var(--kosciuszko);
109
- margin-block-end: var(--elbrus);
110
- justify-content: space-between;
111
-
112
- > * {
113
- flex: 1 1;
114
- margin: 0;
115
- }
116
-
117
- h2,
118
- h3,
119
- h4,
120
- h5,
121
- h6 {
122
- font-size: clamp(var(--vinson), 1.667vw, var(--denali));
123
- font-weight: normal;
124
- line-height: 3;
125
- }
126
-
127
- button {
128
- line-height: 2;
129
- }
12
+ @media (prefers-color-scheme: light) {
13
+ box-shadow: var(--penumbra);
130
14
  }
131
15
 
132
- .badge {
133
- z-index: var(--floor);
134
- justify-self: end;
135
- align-self: start;
136
- padding: var(--kosciuszko);
137
- margin: var(--kosciuszko);
138
- border-radius: var(--card-radius);
139
-
140
- background-color: var(--neutral-200);
141
- border: 1px solid var(--neutral-100);
142
- opacity: 0.9;
143
-
144
- h5 {
145
- margin: 0;
146
- opacity: 1;
147
- font-weight: normal;
148
- }
16
+ @media (prefers-color-scheme: dark) {
17
+ background-color: var(--neutral-700);
18
+ border-color: var(--neutral-600);
149
19
  }
150
- }
151
20
 
152
- .tahoe-city .purchase {
153
- background-color: var(--sand-100);
154
21
 
155
- hr {
156
- border-color: var(--sand-400);
157
- }
158
22
  }
159
23
 
160
- /* south-tahoe currently does not have a purchase */
161
24
 
162
25
  .purchase:hover,
163
26
  .ticket:hover {
@@ -165,27 +28,11 @@
165
28
  text-decoration: underline;
166
29
  }
167
30
 
168
- /* TODO: v1.2 this could use more */
169
31
  img {
170
32
  filter: brightness(80%);
171
33
  }
172
34
  }
173
35
 
174
- .bag:empty {
175
- display: none;
176
- }
177
-
178
- .bag__more {
179
- max-width: var(--pelican);
180
- margin-inline: auto;
181
- padding-inline: var(--kosciuszko);
182
-
183
- button {
184
- margin-block-start: var(--kilimanjaro);
185
- margin-inline: auto;
186
- }
187
- }
188
-
189
36
  /*------------------*/
190
37
  /* #RETAIL LOGO */
191
38
  /*------------------*/
@@ -210,99 +57,3 @@
210
57
  margin-block-end: var(--kosciuszko);
211
58
  }
212
59
  }
213
-
214
- /*------------------------------------*/
215
- /* #TICKET */
216
- /*------------------------------------*/
217
-
218
- .flight {
219
- margin-block-end: var(--aconcagua);
220
-
221
- display: grid;
222
-
223
- /* * iPhone size breaks without this */
224
- grid-template-columns: 1fr;
225
-
226
- /* * guess and check */
227
- @media (min-width: 29rem) {
228
- grid-template-columns: repeat(auto-fill, minmax(var(--condor), 1fr));
229
- }
230
- }
231
-
232
- .flight:empty {
233
- display: none;
234
- }
235
-
236
- .ticket {
237
- width: calc(100% - 2 * var(--kosciuszko));
238
- height: calc(100% - 2 * var(--kosciuszko));
239
- background-color: white;
240
- border: 1px solid var(--neutral-300);
241
- border-radius: var(--card-radius);
242
- padding: var(--kosciuszko);
243
-
244
- @media (prefers-color-scheme: dark) {
245
- background-color: var(--neutral-700);
246
- border-color: var(--neutral-600);
247
- }
248
-
249
- img {
250
- width: 100%;
251
- aspect-ratio: 16 / 9;
252
- }
253
-
254
- > a {
255
- display: block;
256
- }
257
-
258
- .ticket__header,
259
- .ticket__money,
260
- .ticket__specs {
261
- display: flex;
262
- flex-flow: row wrap;
263
- justify-content: space-between;
264
- align-items: baseline;
265
- gap: var(--vinson);
266
- }
267
-
268
- .ticket__header,
269
- .ticket__specs {
270
- padding-inline: var(--vinson);
271
- }
272
- }
273
-
274
- .tahoe-city .ticket {
275
- border-color: var(--sand-400);
276
-
277
- @media (prefers-color-scheme: dark) {
278
- border-color: var(--neutral-700);
279
- }
280
- }
281
-
282
- .south-tahoe .ticket {
283
- background-color: var(--lake-200);
284
- border: 1px solid var(--lake-300);
285
- box-shadow: var(--penumbra);
286
- color: var(--lake-600);
287
-
288
- .book-now {
289
- background-color: var(--neutral-100);
290
- color: var(--lake-700);
291
- }
292
-
293
- @media (prefers-color-scheme: dark) {
294
- background-color: var(--lake-700);
295
- border-color: var(--lake-600);
296
- color: var(--lake-200);
297
-
298
- .book-now {
299
- background-color: var(--lake-400);
300
- color: var(--lake-700);
301
- border-color: var(--lake-500);
302
- }
303
-
304
- a:not(.book-now) {
305
- color: var(--lake-200);
306
- }
307
- }
308
- }
@@ -25,16 +25,17 @@ body:has(#storybook-root) {
25
25
  #storybook-root {
26
26
  min-height: 100vh;
27
27
  }
28
+ }
28
29
 
29
- #storybook-root:has(.tahoe-city) {
30
- background-color: var(--sand-100);
30
+ /* * storybook body */
31
+ .tahoe-city #storybook-root {
32
+ background-color: var(--sand-100);
31
33
 
32
- @media (prefers-color-scheme: dark) {
33
- background-color: var(--lake-300);
34
- }
34
+ @media (prefers-color-scheme: dark) {
35
+ background-color: var(--lake-300);
35
36
  }
36
37
  }
37
-
38
+
38
39
  body.tahoe-city {
39
40
  @media (prefers-color-scheme: dark) {
40
41
  background-color: var(--navy-300);
@@ -143,13 +144,42 @@ hr {
143
144
 
144
145
 
145
146
  .location {
147
+ transition: var(--slow);
146
148
  background-color: white;
149
+
150
+ @media (prefers-color-scheme: light) {
151
+ box-shadow: var(--penumbra);
152
+ }
147
153
 
148
154
  @media (prefers-color-scheme: dark) {
149
155
  background-color: var(--neutral-800);
150
156
  }
151
157
  }
152
158
 
159
+ .location:hover {
160
+ background-color: var(--neutral-200);
161
+
162
+ @media (prefers-color-scheme: dark) {
163
+ background-color: var(--neutral-600);
164
+ }
165
+ }
166
+
167
+ .tahoe-city .location:hover {
168
+ background-color: var(--sand-300);
169
+
170
+ @media (prefers-color-scheme: dark) {
171
+ background-color: var(--lake-700);
172
+ }
173
+ }
174
+
175
+ .location:active {
176
+ background-color: var(--neutral-300);
177
+
178
+ @media (prefers-color-scheme: dark) {
179
+ background-color: var(--neutral-500);
180
+ }
181
+ }
182
+
153
183
  /*------------------------------------*/
154
184
  /* #SPECS */
155
185
  /*------------------------------------*/
@@ -15,7 +15,7 @@ ol {
15
15
 
16
16
  li {
17
17
  display: block;
18
- margin-block-end: var(--baseline);
18
+ margin-block-end: var(--vinson);
19
19
  padding-inline-start: 0;
20
20
  line-height: 1.5;
21
21
  }
@@ -175,7 +175,7 @@ ol {
175
175
 
176
176
  svg {
177
177
  transition: var(--fade);
178
- margin-block: var(--baseline);
178
+ margin-block: var(--vinson);
179
179
  margin-inline: auto;
180
180
  min-width: var(--everest); /* guess and check */
181
181
 
@@ -216,6 +216,6 @@ ol {
216
216
  } */
217
217
 
218
218
  .time {
219
- border-radius: var(--border-radius);
219
+ border-radius: var(--card-radius);
220
220
  }
221
221
  }
@@ -0,0 +1,172 @@
1
+ /*------------------------------------*/
2
+ /* #PURCHASE */
3
+ /*------------------------------------*/
4
+
5
+ .bag {
6
+ margin-block-end: var(--aconcagua);
7
+
8
+ display: grid;
9
+ grid-template-columns: repeat(auto-fill, minmax(var(--condor), 1fr));
10
+
11
+ /* TODO: clamp */
12
+ gap: var(--kosciuszko);
13
+ }
14
+
15
+ /* * specific type of a card */
16
+ .purchase {
17
+ padding: 0;
18
+ display: flex;
19
+ flex-direction: column;
20
+ justify-content: space-between;
21
+ border: 1px solid transparent;
22
+ border-radius: var(--card-radius);
23
+ /* needed to control nested elements */
24
+ text-decoration: none;
25
+ box-shadow: var(--penumbra);
26
+ max-width: calc(100vw - 2rem);
27
+ background-color: white;
28
+
29
+ .purchase-collage {
30
+ display: grid;
31
+ width: 100%;
32
+
33
+ >* {
34
+ grid-row: 1;
35
+ grid-column: 1;
36
+ }
37
+
38
+ .texture-slice {
39
+ width: calc(100% - var(--elbrus));
40
+ aspect-ratio: 16/9;
41
+ height: 100%;
42
+ align-self: center;
43
+ margin: calc(var(--elbrus) / 2);
44
+ border-radius: 0.25rem;
45
+ box-shadow: var(--penumbra);
46
+ border: 1px solid whitesmoke;
47
+ stroke: whitesmoke;
48
+
49
+ @media (prefers-color-scheme: dark) {
50
+ border-color: var(--neutral-100);
51
+ stroke: var(--neutral-100);
52
+ }
53
+ }
54
+
55
+ .cutout {
56
+ object-fit: contain;
57
+ place-self: center;
58
+ z-index: var(--understory);
59
+ grid-row: 1/1;
60
+ filter: drop-shadow(5px 5px 5px var(--neutral-700));
61
+ aspect-ratio: 16/9;
62
+ width: 100%;
63
+ }
64
+
65
+ svg {
66
+ z-index: var(--floor);
67
+ max-height: 100%;
68
+ /* overwrite the default */
69
+ margin: calc(var(--elbrus) / 2);
70
+ width: calc(100% - var(--elbrus));
71
+ stroke: whitesmoke;
72
+
73
+ @media (prefers-color-scheme: dark) {
74
+ stroke: var(--neutral-100);
75
+ }
76
+ }
77
+ }
78
+
79
+ .image-link {
80
+ transition: var(--fade);
81
+ transform: scale(1);
82
+ z-index: var(--floor);
83
+ }
84
+
85
+ .image-link:where(:hover, :focus) {
86
+ transform: scale(1.05);
87
+ }
88
+
89
+ .purchase__title {
90
+ font-size: var(--denali);
91
+ margin-inline: var(--kosciuszko);
92
+ line-height: 2.5;
93
+ }
94
+
95
+ hr,
96
+ p {
97
+ margin-inline: var(--kosciuszko);
98
+ }
99
+
100
+ /* img {
101
+ width: 100%;
102
+ } */
103
+
104
+ .purchase__details {
105
+ display: flex;
106
+ gap: var(--vinson);
107
+ width: calc(100% - var(--kilimanjaro));
108
+ margin-inline: var(--kosciuszko);
109
+ margin-block-end: var(--elbrus);
110
+ justify-content: space-between;
111
+
112
+ >* {
113
+ flex: 1 1;
114
+ margin: 0;
115
+ }
116
+
117
+ h2,
118
+ h3,
119
+ h4,
120
+ h5,
121
+ h6 {
122
+ font-size: clamp(var(--vinson), 1.667vw, var(--denali));
123
+ font-weight: normal;
124
+ line-height: 3;
125
+ }
126
+
127
+ button {
128
+ line-height: 2;
129
+ }
130
+ }
131
+
132
+ .badges {
133
+ z-index: var(--floor);
134
+ justify-self: end;
135
+ align-self: start;
136
+ display: flex;
137
+ flex-flow: row wrap;
138
+ gap: var(--kosciuszko);
139
+ margin: var(--kosciuszko);
140
+ }
141
+
142
+ .badge {
143
+ padding: var(--kosciuszko);
144
+ border-radius: var(--card-radius);
145
+ background-color: var(--neutral-200);
146
+ border: 1px solid var(--neutral-100);
147
+ opacity: 0.9;
148
+
149
+ h5 {
150
+ margin: 0;
151
+ opacity: 1;
152
+ font-weight: normal;
153
+ }
154
+ }
155
+ }
156
+
157
+ /* * south-tahoe currently does not have a purchase */
158
+
159
+ .bag:empty {
160
+ display: none;
161
+ }
162
+
163
+ .bag__more {
164
+ max-width: var(--pelican);
165
+ margin-inline: auto;
166
+ padding-inline: var(--kosciuszko);
167
+
168
+ button {
169
+ margin-block-start: var(--kilimanjaro);
170
+ margin-inline: auto;
171
+ }
172
+ }
@@ -0,0 +1,86 @@
1
+ /*------------------------------------*/
2
+ /* #TICKET */
3
+ /*------------------------------------*/
4
+
5
+ .flight {
6
+ margin-block-end: var(--aconcagua);
7
+
8
+ display: grid;
9
+
10
+ /* * iPhone size breaks without this */
11
+ grid-template-columns: 1fr;
12
+
13
+ /* * guess and check */
14
+ @media (min-width: 29rem) {
15
+ grid-template-columns: repeat(auto-fill, minmax(var(--condor), 1fr));
16
+ }
17
+ }
18
+
19
+ .flight:empty {
20
+ display: none;
21
+ }
22
+
23
+ .ticket {
24
+ width: calc(100% - 2 * var(--kosciuszko));
25
+ height: calc(100% - 2 * var(--kosciuszko));
26
+
27
+ img {
28
+ width: 100%;
29
+ aspect-ratio: 16 / 9;
30
+ }
31
+
32
+ > a {
33
+ display: block;
34
+ }
35
+
36
+ .ticket__header,
37
+ .ticket__money,
38
+ .ticket__specs {
39
+ display: flex;
40
+ flex-flow: row wrap;
41
+ justify-content: space-between;
42
+ align-items: baseline;
43
+ gap: var(--vinson);
44
+ }
45
+
46
+ .ticket__header,
47
+ .ticket__specs {
48
+ padding-inline: var(--vinson);
49
+ }
50
+ }
51
+
52
+ .tahoe-city .ticket {
53
+ border-color: var(--sand-400);
54
+
55
+ @media (prefers-color-scheme: dark) {
56
+ border-color: var(--neutral-700);
57
+ }
58
+ }
59
+
60
+ .south-tahoe .ticket {
61
+ background-color: var(--lake-200);
62
+ border: 1px solid var(--lake-300);
63
+ box-shadow: var(--penumbra);
64
+ color: var(--lake-600);
65
+
66
+ .book-now {
67
+ background-color: var(--neutral-100);
68
+ color: var(--lake-700);
69
+ }
70
+
71
+ @media (prefers-color-scheme: dark) {
72
+ background-color: var(--lake-700);
73
+ border-color: var(--lake-600);
74
+ color: var(--lake-200);
75
+
76
+ .book-now {
77
+ background-color: var(--lake-400);
78
+ color: var(--lake-700);
79
+ border-color: var(--lake-500);
80
+ }
81
+
82
+ a:not(.book-now) {
83
+ color: var(--lake-200);
84
+ }
85
+ }
86
+ }
@@ -0,0 +1,20 @@
1
+ export type PaddleCompareTypes = {
2
+ tours: {
3
+ id: number;
4
+ name: string;
5
+ slug: string;
6
+ sport: string;
7
+ duration?: string;
8
+ timeframe?: string;
9
+ start?: string;
10
+ finish?: string;
11
+ fitness?: string;
12
+ location: string;
13
+ excerpt: string;
14
+ minimum: number;
15
+ price: number;
16
+ peek?: string;
17
+ }[];
18
+ strapiBranchName: string;
19
+ peek_base: string;
20
+ };
@@ -7,10 +7,15 @@ export type PaddlePurchaseTypes = {
7
7
  excerpt: string;
8
8
  length: number;
9
9
  width: number;
10
- inflatable: boolean;
11
10
  capacity: number;
11
+
12
+ // badge variables
13
+ inflatable: boolean;
12
14
  demo: boolean;
13
15
  discount?: number;
16
+
17
+ badges?: Record<string, boolean | number>;
18
+
14
19
  cutout: PaddleGatsbyImageType;
15
20
 
16
21
  sport: {