@windstream/react-shared-components 0.1.35 → 0.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +635 -635
  2. package/dist/contentful/index.d.ts +1 -0
  3. package/dist/contentful/index.esm.js +1 -1
  4. package/dist/contentful/index.esm.js.map +1 -1
  5. package/dist/contentful/index.js +1 -1
  6. package/dist/contentful/index.js.map +1 -1
  7. package/dist/core.d.ts +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/package.json +182 -182
  10. package/src/components/accordion/Accordion.stories.tsx +230 -230
  11. package/src/components/accordion/index.tsx +70 -70
  12. package/src/components/accordion/types.ts +12 -12
  13. package/src/components/alert-card/AlertCard.stories.tsx +171 -171
  14. package/src/components/alert-card/index.tsx +41 -41
  15. package/src/components/alert-card/types.ts +13 -13
  16. package/src/components/brand-button/BrandButton.stories.tsx +223 -223
  17. package/src/components/brand-button/helpers.ts +35 -35
  18. package/src/components/brand-button/index.tsx +114 -114
  19. package/src/components/brand-button/types.ts +37 -37
  20. package/src/components/button/Button.stories.tsx +108 -108
  21. package/src/components/button/index.tsx +27 -27
  22. package/src/components/button/types.ts +14 -14
  23. package/src/components/call-button/CallButton.stories.tsx +324 -324
  24. package/src/components/call-button/index.tsx +86 -86
  25. package/src/components/call-button/types.ts +11 -11
  26. package/src/components/checkbox/Checkbox.stories.tsx +247 -247
  27. package/src/components/checkbox/index.tsx +197 -197
  28. package/src/components/checkbox/types.ts +27 -27
  29. package/src/components/checklist/Checklist.stories.tsx +150 -150
  30. package/src/components/checklist/index.tsx +61 -61
  31. package/src/components/checklist/types.ts +17 -17
  32. package/src/components/collapse/Collapse.stories.tsx +255 -255
  33. package/src/components/collapse/index.tsx +46 -46
  34. package/src/components/collapse/types.ts +6 -6
  35. package/src/components/divider/Divider.stories.tsx +205 -205
  36. package/src/components/divider/index.tsx +22 -22
  37. package/src/components/divider/type.ts +3 -3
  38. package/src/components/image/Image.stories.tsx +113 -113
  39. package/src/components/image/index.tsx +25 -25
  40. package/src/components/image/types.ts +40 -40
  41. package/src/components/input/Input.stories.tsx +325 -325
  42. package/src/components/input/index.tsx +177 -177
  43. package/src/components/input/types.ts +37 -37
  44. package/src/components/link/Link.stories.tsx +163 -163
  45. package/src/components/link/types.ts +25 -25
  46. package/src/components/list/List.stories.tsx +272 -272
  47. package/src/components/list/index.tsx +88 -88
  48. package/src/components/list/list-item/index.tsx +38 -38
  49. package/src/components/list/list-item/types.ts +13 -13
  50. package/src/components/list/types.ts +29 -29
  51. package/src/components/material-icon/MaterialIcon.stories.tsx +322 -322
  52. package/src/components/material-icon/constants.ts +98 -98
  53. package/src/components/material-icon/index.tsx +47 -47
  54. package/src/components/material-icon/types.ts +31 -31
  55. package/src/components/modal/Modal.stories.tsx +171 -171
  56. package/src/components/modal/index.tsx +164 -164
  57. package/src/components/modal/types.ts +24 -24
  58. package/src/components/next-image/index.tsx +54 -54
  59. package/src/components/next-image/types.ts +1 -1
  60. package/src/components/pagination/index.tsx +100 -100
  61. package/src/components/pagination/types.ts +6 -6
  62. package/src/components/radio-button/RadioButton.stories.tsx +307 -307
  63. package/src/components/radio-button/index.tsx +75 -75
  64. package/src/components/radio-button/types.ts +21 -21
  65. package/src/components/see-more/SeeMore.stories.tsx +181 -181
  66. package/src/components/see-more/index.tsx +44 -44
  67. package/src/components/see-more/types.ts +4 -4
  68. package/src/components/select/Select.stories.tsx +411 -411
  69. package/src/components/select/index.tsx +155 -155
  70. package/src/components/select/types.ts +36 -36
  71. package/src/components/select-plan-button/SelectPlanButton.stories.tsx +184 -184
  72. package/src/components/select-plan-button/index.tsx +63 -63
  73. package/src/components/select-plan-button/types.ts +17 -17
  74. package/src/components/skeleton/Skeleton.stories.tsx +179 -179
  75. package/src/components/skeleton/index.tsx +61 -61
  76. package/src/components/skeleton/types.ts +4 -4
  77. package/src/components/spinner/Spinner.stories.tsx +335 -335
  78. package/src/components/spinner/index.tsx +44 -44
  79. package/src/components/spinner/types.ts +5 -5
  80. package/src/components/text/Text.stories.tsx +321 -321
  81. package/src/components/text/index.tsx +25 -25
  82. package/src/components/text/types.ts +45 -45
  83. package/src/components/tooltip/Tooltip.stories.tsx +219 -219
  84. package/src/components/tooltip/index.tsx +74 -74
  85. package/src/components/tooltip/types.ts +7 -7
  86. package/src/components/view-cart-button/ViewCartButton.stories.tsx +252 -252
  87. package/src/components/view-cart-button/index.tsx +42 -42
  88. package/src/components/view-cart-button/types.ts +5 -5
  89. package/src/contentful/blocks/accordion/index.tsx +62 -62
  90. package/src/contentful/blocks/address-input-banner/index.tsx +52 -52
  91. package/src/contentful/blocks/address-input-banner/types.ts +14 -14
  92. package/src/contentful/blocks/anchored-bottom-banner/index.tsx +70 -65
  93. package/src/contentful/blocks/anchored-bottom-banner/types.ts +10 -9
  94. package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
  95. package/src/contentful/blocks/blogs-grid/types.ts +26 -26
  96. package/src/contentful/blocks/button/Button.stories.tsx +40 -40
  97. package/src/contentful/blocks/button/index.tsx +129 -129
  98. package/src/contentful/blocks/button/types.ts +39 -39
  99. package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
  100. package/src/contentful/blocks/callout/index.tsx +88 -88
  101. package/src/contentful/blocks/callout/types.ts +15 -15
  102. package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
  103. package/src/contentful/blocks/cards/blog-card/index.tsx +110 -110
  104. package/src/contentful/blocks/cards/blog-card/types.ts +18 -18
  105. package/src/contentful/blocks/cards/index.tsx +13 -13
  106. package/src/contentful/blocks/cards/product-card/index.tsx +251 -251
  107. package/src/contentful/blocks/cards/product-card/types.ts +28 -28
  108. package/src/contentful/blocks/cards/simple-card/index.tsx +89 -89
  109. package/src/contentful/blocks/cards/testimonial-card/index.tsx +90 -90
  110. package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
  111. package/src/contentful/blocks/cards/types.ts +1 -1
  112. package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
  113. package/src/contentful/blocks/carousel/helper.tsx +440 -440
  114. package/src/contentful/blocks/carousel/index.tsx +85 -85
  115. package/src/contentful/blocks/carousel/types.ts +144 -144
  116. package/src/contentful/blocks/cookiebanner/index.tsx +146 -146
  117. package/src/contentful/blocks/cookiebanner/type.ts +7 -7
  118. package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
  119. package/src/contentful/blocks/cta-callout/index.tsx +60 -60
  120. package/src/contentful/blocks/cta-callout/types.ts +26 -26
  121. package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
  122. package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
  123. package/src/contentful/blocks/find-kinetic/index.tsx +130 -130
  124. package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
  125. package/src/contentful/blocks/floating-banner/index.tsx +97 -97
  126. package/src/contentful/blocks/floating-banner/types.ts +22 -22
  127. package/src/contentful/blocks/footer/Footer.stories.tsx +30 -30
  128. package/src/contentful/blocks/footer/index.tsx +90 -90
  129. package/src/contentful/blocks/image-promo-bar/ImagePromoBar.stories.tsx +23 -23
  130. package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -28
  131. package/src/contentful/blocks/image-promo-bar/index.tsx +240 -240
  132. package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
  133. package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
  134. package/src/contentful/blocks/image-promo-bar/youtube-embed.tsx +46 -46
  135. package/src/contentful/blocks/modal/constants.ts +53 -53
  136. package/src/contentful/blocks/modal/index.tsx +103 -103
  137. package/src/contentful/blocks/modal/types.ts +12 -12
  138. package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +113 -113
  139. package/src/contentful/blocks/navigation/index.tsx +394 -394
  140. package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +82 -82
  141. package/src/contentful/blocks/navigation/types.ts +41 -41
  142. package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
  143. package/src/contentful/blocks/primary-hero/index.tsx +234 -234
  144. package/src/contentful/blocks/primary-hero/types.ts +35 -35
  145. package/src/contentful/blocks/search-block/index.tsx +90 -90
  146. package/src/contentful/blocks/shape-background-wrapper/ShapeBackgroundWrapper.stories.tsx +26 -26
  147. package/src/contentful/blocks/shape-background-wrapper/index.tsx +124 -124
  148. package/src/contentful/blocks/shape-background-wrapper/types.ts +36 -36
  149. package/src/contentful/blocks/text/Text.stories.tsx +23 -23
  150. package/src/contentful/blocks/text/index.tsx +12 -12
  151. package/src/contentful/blocks/text/types.ts +1 -1
  152. package/src/contentful/index.ts +81 -81
  153. package/src/hooks/use-body-scroll-lock.ts +34 -34
  154. package/src/hooks/use-carousel-swipe.ts +264 -264
  155. package/src/hooks/use-outside-click.ts +17 -17
  156. package/src/index.ts +101 -101
  157. package/src/next/index.ts +5 -5
  158. package/src/setupTests.ts +46 -46
  159. package/src/stories/DocsTemplate.tsx +24 -24
  160. package/src/styles/globals.css +343 -343
  161. package/src/types/global.d.ts +9 -9
  162. package/src/types/micro-components.ts +99 -99
  163. package/src/types/utm.ts +49 -49
  164. package/src/utils/cookie.ts +80 -80
  165. package/src/utils/index.ts +65 -65
  166. package/src/utils/utm.ts +221 -221
@@ -1,39 +1,39 @@
1
- import React from "react";
2
-
3
- import { ResponsiveSize } from "@shared/components/brand-button/types";
4
- import { Fill, Size } from "@shared/components/material-icon/types";
5
- import { CheckPlansProps } from "@shared/types/micro-components";
6
-
7
- export type ButtonProps = {
8
- showButtonAs?: "solid" | "text" | "unstyled";
9
- buttonVariant?: "primary_brand" | "secondary" | "primary_inverse";
10
- buttonLabel?: string;
11
- buttonPrefix?: string;
12
- badge?: string;
13
- badgeIcon?: string;
14
- buttonIcon?: string;
15
- buttonIconPosition?: "left" | "right";
16
- href?: string;
17
- target?: "_self" | "_blank";
18
- anchorId?: string;
19
- preserveQueryParameters?: boolean;
20
- clickToOpen?: string;
21
- tabmodalNameToOpen?: string;
22
- preDefinedFunctionExecution?: string;
23
- renderCheckPlans?: (overrides?: CheckPlansProps) => React.ReactNode;
24
- linkClassName?: string;
25
- buttonClassName?: string;
26
- linkVariant?: "unstyled" | "default";
27
- fullWidth?: boolean;
28
- size?: ResponsiveSize;
29
- onClick?: (
30
- event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>
31
- ) => void;
32
- children?: React.ReactNode;
33
- modalTitle?: string;
34
- modalSubtitle?: string;
35
- onModalButtonClick?: (id?: string) => void;
36
- iconName?: string;
37
- iconFill?: Fill;
38
- iconSize?: Size;
39
- };
1
+ import React from "react";
2
+
3
+ import { ResponsiveSize } from "@shared/components/brand-button/types";
4
+ import { Fill, Size } from "@shared/components/material-icon/types";
5
+ import { CheckPlansProps } from "@shared/types/micro-components";
6
+
7
+ export type ButtonProps = {
8
+ showButtonAs?: "solid" | "text" | "unstyled";
9
+ buttonVariant?: "primary_brand" | "secondary" | "primary_inverse";
10
+ buttonLabel?: string;
11
+ buttonPrefix?: string;
12
+ badge?: string;
13
+ badgeIcon?: string;
14
+ buttonIcon?: string;
15
+ buttonIconPosition?: "left" | "right";
16
+ href?: string;
17
+ target?: "_self" | "_blank";
18
+ anchorId?: string;
19
+ preserveQueryParameters?: boolean;
20
+ clickToOpen?: string;
21
+ tabmodalNameToOpen?: string;
22
+ preDefinedFunctionExecution?: string;
23
+ renderCheckPlans?: (overrides?: CheckPlansProps) => React.ReactNode;
24
+ linkClassName?: string;
25
+ buttonClassName?: string;
26
+ linkVariant?: "unstyled" | "default";
27
+ fullWidth?: boolean;
28
+ size?: ResponsiveSize;
29
+ onClick?: (
30
+ event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>
31
+ ) => void;
32
+ children?: React.ReactNode;
33
+ modalTitle?: string;
34
+ modalSubtitle?: string;
35
+ onModalButtonClick?: (id?: string) => void;
36
+ iconName?: string;
37
+ iconFill?: Fill;
38
+ iconSize?: Size;
39
+ };
@@ -1,23 +1,23 @@
1
- import { Callout } from "./index";
2
-
3
- import { DocsPage } from "@shared/stories/DocsTemplate";
4
- import type { Meta, StoryObj } from "@storybook/react";
5
-
6
- const meta: Meta<typeof Callout> = {
7
- title: "Contentful Blocks/Callout",
8
- component: Callout,
9
- tags: ["autodocs"],
10
- parameters: {
11
- layout: "centered",
12
- docs: {
13
- page: DocsPage,
14
- description: {
15
- component: "Contentful callout block.",
16
- },
17
- },
18
- },
19
- args: {},
20
- };
21
- export default meta;
22
- type Story = StoryObj<typeof meta>;
23
- export const Default: Story = {};
1
+ import { Callout } from "./index";
2
+
3
+ import { DocsPage } from "@shared/stories/DocsTemplate";
4
+ import type { Meta, StoryObj } from "@storybook/react";
5
+
6
+ const meta: Meta<typeof Callout> = {
7
+ title: "Contentful Blocks/Callout",
8
+ component: Callout,
9
+ tags: ["autodocs"],
10
+ parameters: {
11
+ layout: "centered",
12
+ docs: {
13
+ page: DocsPage,
14
+ description: {
15
+ component: "Contentful callout block.",
16
+ },
17
+ },
18
+ },
19
+ args: {},
20
+ };
21
+ export default meta;
22
+ type Story = StoryObj<typeof meta>;
23
+ export const Default: Story = {};
@@ -1,88 +1,88 @@
1
- import React from "react";
2
- import BlogCard from "../cards/blog-card";
3
- import SimpleCard from "../cards/simple-card";
4
- import { CalloutProps } from "./types";
5
-
6
- import { Text } from "@shared/components/text";
7
-
8
- export const Callout: React.FC<CalloutProps> = ({
9
- title,
10
- items,
11
- enableHeading = false,
12
- subtitle,
13
- color = "dark",
14
- maxWidth = true,
15
- maxCardsPerRow,
16
- cardType = "simple",
17
- }) => {
18
- const lgWidth =
19
- {
20
- 1: " lg:w-full",
21
- 2: " lg:w-[calc(50%-0.75rem)]",
22
- 3: " lg:w-[calc(33.3333%-1rem)]",
23
- 4: " lg:w-[calc(25%-1.125rem)]",
24
- }[maxCardsPerRow || 4] || " lg:w-[calc(25%-1.125rem)]";
25
-
26
- const mdWidth = items.length === 1 ? " md:w-full" : " md:w-[calc(50%-1rem)]";
27
-
28
- const renderCard = (item: CalloutProps["items"][number], index: number) => {
29
- if (cardType === "blog") {
30
- const blogItem = item as any;
31
- return (
32
- <BlogCard
33
- title={blogItem.title}
34
- href={blogItem.slug}
35
- description={blogItem.shortDescription}
36
- date={blogItem.blogCreationDate}
37
- category={blogItem.category}
38
- image={blogItem.cover}
39
- asGrid={false}
40
- lgWidth={lgWidth}
41
- mdWidth={mdWidth}
42
- />
43
- );
44
- }
45
- return (
46
- <SimpleCard
47
- key={index}
48
- card={item as any}
49
- lgWidth={lgWidth}
50
- mdWidth={mdWidth}
51
- />
52
- );
53
- };
54
-
55
- return (
56
- <div className="component-container">
57
- <div
58
- className={`mx-5 mb-5 mt-12 ${maxWidth ? "max-w-120 xl:mx-auto" : ""} ${color == "dark" ? "text-text" : "text-white"}`}
59
- >
60
- <div className="callout-container flex flex-col gap-10 md:gap-16">
61
- <div className="title-holder">
62
- {title && (
63
- <Text
64
- as={enableHeading ? "h1" : "h2"}
65
- className="heading2 md:heading1 md:text-center"
66
- >
67
- {title}
68
- </Text>
69
- )}
70
- {subtitle && (
71
- <Text
72
- as={enableHeading ? "h2" : "h3"}
73
- className="subheading3 mt-3 md:subheading1 md:text-center"
74
- >
75
- {subtitle}
76
- </Text>
77
- )}
78
- </div>
79
- <div className="card-holder flex flex-wrap items-stretch justify-center gap-6 self-stretch md:gap-6">
80
- {items.map((item, index: number) => renderCard(item, index))}
81
- </div>
82
- </div>
83
- </div>
84
- </div>
85
- );
86
- };
87
-
88
- export default Callout;
1
+ import React from "react";
2
+ import BlogCard from "../cards/blog-card";
3
+ import SimpleCard from "../cards/simple-card";
4
+ import { CalloutProps } from "./types";
5
+
6
+ import { Text } from "@shared/components/text";
7
+
8
+ export const Callout: React.FC<CalloutProps> = ({
9
+ title,
10
+ items,
11
+ enableHeading = false,
12
+ subtitle,
13
+ color = "dark",
14
+ maxWidth = true,
15
+ maxCardsPerRow,
16
+ cardType = "simple",
17
+ }) => {
18
+ const lgWidth =
19
+ {
20
+ 1: " lg:w-full",
21
+ 2: " lg:w-[calc(50%-0.75rem)]",
22
+ 3: " lg:w-[calc(33.3333%-1rem)]",
23
+ 4: " lg:w-[calc(25%-1.125rem)]",
24
+ }[maxCardsPerRow || 4] || " lg:w-[calc(25%-1.125rem)]";
25
+
26
+ const mdWidth = items.length === 1 ? " md:w-full" : " md:w-[calc(50%-1rem)]";
27
+
28
+ const renderCard = (item: CalloutProps["items"][number], index: number) => {
29
+ if (cardType === "blog") {
30
+ const blogItem = item as any;
31
+ return (
32
+ <BlogCard
33
+ title={blogItem.title}
34
+ href={blogItem.slug}
35
+ description={blogItem.shortDescription}
36
+ date={blogItem.blogCreationDate}
37
+ category={blogItem.category}
38
+ image={blogItem.cover}
39
+ asGrid={false}
40
+ lgWidth={lgWidth}
41
+ mdWidth={mdWidth}
42
+ />
43
+ );
44
+ }
45
+ return (
46
+ <SimpleCard
47
+ key={index}
48
+ card={item as any}
49
+ lgWidth={lgWidth}
50
+ mdWidth={mdWidth}
51
+ />
52
+ );
53
+ };
54
+
55
+ return (
56
+ <div className="component-container">
57
+ <div
58
+ className={`mx-5 mb-5 mt-12 ${maxWidth ? "max-w-120 xl:mx-auto" : ""} ${color == "dark" ? "text-text" : "text-white"}`}
59
+ >
60
+ <div className="callout-container flex flex-col gap-10 md:gap-16">
61
+ <div className="title-holder">
62
+ {title && (
63
+ <Text
64
+ as={enableHeading ? "h1" : "h2"}
65
+ className="heading2 md:heading1 md:text-center"
66
+ >
67
+ {title}
68
+ </Text>
69
+ )}
70
+ {subtitle && (
71
+ <Text
72
+ as={enableHeading ? "h2" : "h3"}
73
+ className="subheading3 mt-3 md:subheading1 md:text-center"
74
+ >
75
+ {subtitle}
76
+ </Text>
77
+ )}
78
+ </div>
79
+ <div className="card-holder flex flex-wrap items-stretch justify-center gap-6 self-stretch md:gap-6">
80
+ {items.map((item, index: number) => renderCard(item, index))}
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </div>
85
+ );
86
+ };
87
+
88
+ export default Callout;
@@ -1,15 +1,15 @@
1
- export type CalloutProps = {
2
- title?: string;
3
- enableHeading?: boolean;
4
- subtitle?: string;
5
- applyBoxShadow?: boolean;
6
- cardStackingMobile?: boolean;
7
- bottomText?: string;
8
- color?: "dark" | "light";
9
- cardsWidth?: string;
10
- maxCardsPerRow?: number;
11
- noGutter?: boolean;
12
- items: any[];
13
- maxWidth?: boolean;
14
- cardType?: "simple" | "blog";
15
- };
1
+ export type CalloutProps = {
2
+ title?: string;
3
+ enableHeading?: boolean;
4
+ subtitle?: string;
5
+ applyBoxShadow?: boolean;
6
+ cardStackingMobile?: boolean;
7
+ bottomText?: string;
8
+ color?: "dark" | "light";
9
+ cardsWidth?: string;
10
+ maxCardsPerRow?: number;
11
+ noGutter?: boolean;
12
+ items: any[];
13
+ maxWidth?: boolean;
14
+ cardType?: "simple" | "blog";
15
+ };
@@ -1,23 +1,23 @@
1
- import { Cards } from "./index";
2
-
3
- import { DocsPage } from "@shared/stories/DocsTemplate";
4
- import type { Meta, StoryObj } from "@storybook/react";
5
-
6
- const meta: Meta<typeof Cards> = {
7
- title: "Contentful Blocks/Cards",
8
- component: Cards,
9
- tags: ["autodocs"],
10
- parameters: {
11
- layout: "centered",
12
- docs: {
13
- page: DocsPage,
14
- description: {
15
- component: "Contentful cards block.",
16
- },
17
- },
18
- },
19
- args: { fields: {} },
20
- };
21
- export default meta;
22
- type Story = StoryObj<typeof meta>;
23
- export const Default: Story = {};
1
+ import { Cards } from "./index";
2
+
3
+ import { DocsPage } from "@shared/stories/DocsTemplate";
4
+ import type { Meta, StoryObj } from "@storybook/react";
5
+
6
+ const meta: Meta<typeof Cards> = {
7
+ title: "Contentful Blocks/Cards",
8
+ component: Cards,
9
+ tags: ["autodocs"],
10
+ parameters: {
11
+ layout: "centered",
12
+ docs: {
13
+ page: DocsPage,
14
+ description: {
15
+ component: "Contentful cards block.",
16
+ },
17
+ },
18
+ },
19
+ args: { fields: {} },
20
+ };
21
+ export default meta;
22
+ type Story = StoryObj<typeof meta>;
23
+ export const Default: Story = {};
@@ -1,110 +1,110 @@
1
- import React from "react";
2
- import { BlogCardProps } from "./types";
3
- import Image from "next/image";
4
- import Link from "next/link";
5
-
6
- // import { Button } from "@shared/components/button";
7
- import { MaterialIcon } from "@shared/components/material-icon";
8
- import { Text } from "@shared/components/text";
9
-
10
- export const BlogCard: React.FC<BlogCardProps> = ({
11
- href,
12
- title,
13
- description,
14
- date,
15
- category,
16
- image,
17
- readMoreText = "Read more",
18
- asGrid = true,
19
- lgWidth,
20
- mdWidth,
21
- index,
22
- }: BlogCardProps) => {
23
- const basehwClass = "lg:w-[calc(33.3333%-1rem)] md:w-[calc(50%-1rem)]";
24
- const parentClassName = asGrid
25
- ? "flex h-full flex-col overflow-hidden rounded-card-lg bg-white shadow-drop transition-all duration-200 hover:-translate-y-0.5 hover:shadow-cardDrop"
26
- : `callout-card ${basehwClass} ${lgWidth} ${mdWidth} w-full overflow-hidden rounded-card-lg bg-white shadow-drop transition-all duration-200 hover:-translate-y-0.5 hover:shadow-cardDrop`;
27
-
28
- return (
29
- <article
30
- className={parentClassName}
31
- data-section-type={"blog-card"}
32
- data-section-index={index}
33
- >
34
- {/* Image */}
35
- <Link href={href} tabIndex={-1} aria-hidden="true" className="block">
36
- <div className="h-[232px] w-full flex-shrink-0 overflow-hidden bg-gray-100">
37
- {image ? (
38
- <Image
39
- src={image.src}
40
- alt={image.alt}
41
- width={image.width}
42
- height={image.height}
43
- className="h-full w-full object-cover transition-transform duration-300 hover:scale-[1.03]"
44
- sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
45
- />
46
- ) : (
47
- <div
48
- className="h-full w-full bg-gradient-to-br from-gray-200 to-gray-100"
49
- aria-hidden="true"
50
- />
51
- )}
52
- </div>
53
- </Link>
54
-
55
- {/* Body */}
56
- <div className="flex flex-1 flex-col gap-5 p-6 md:p-8">
57
- {/* Meta: category + date */}
58
- <div className="flex items-center gap-2 text-[13px]">
59
- <span className="body2 text-text-brand">{category}</span>
60
- {date && (
61
- <>
62
- <span className="footnote text-text" aria-hidden="true">
63
-
64
- </span>
65
- <time className="body2 text-text">{date}</time>
66
- </>
67
- )}
68
- </div>
69
-
70
- {/* Title */}
71
- {title && (
72
- <Link
73
- href={href}
74
- className="heading6 m-0 line-clamp-3 font-black transition-colors duration-150 hover:text-text-brand"
75
- >
76
- {title}
77
- </Link>
78
- )}
79
-
80
- {/* Excerpt */}
81
- {description && (
82
- <Text className="body1 m-0 line-clamp-3 flex-1 text-text">
83
- {description}
84
- </Text>
85
- )}
86
-
87
- {/* Read more */}
88
- <Link
89
- href={href}
90
- className="group mt-auto inline-flex items-center justify-start gap-2 pt-3 text-sm text-text-brand no-underline"
91
- aria-label={`${readMoreText} about ${title || "this article"}`}
92
- >
93
- <Text
94
- aria-label={`${readMoreText} about ${title || "this article"}`}
95
- className="label1 text-nowrap"
96
- >
97
- {readMoreText}
98
- </Text>
99
- <MaterialIcon
100
- name="expand_circle_right"
101
- fill={1}
102
- size={24}
103
- weight="200"
104
- />
105
- </Link>
106
- </div>
107
- </article>
108
- );
109
- };
110
- export default BlogCard;
1
+ import React from "react";
2
+ import { BlogCardProps } from "./types";
3
+ import Image from "next/image";
4
+ import Link from "next/link";
5
+
6
+ // import { Button } from "@shared/components/button";
7
+ import { MaterialIcon } from "@shared/components/material-icon";
8
+ import { Text } from "@shared/components/text";
9
+
10
+ export const BlogCard: React.FC<BlogCardProps> = ({
11
+ href,
12
+ title,
13
+ description,
14
+ date,
15
+ category,
16
+ image,
17
+ readMoreText = "Read more",
18
+ asGrid = true,
19
+ lgWidth,
20
+ mdWidth,
21
+ index,
22
+ }: BlogCardProps) => {
23
+ const basehwClass = "lg:w-[calc(33.3333%-1rem)] md:w-[calc(50%-1rem)]";
24
+ const parentClassName = asGrid
25
+ ? "flex h-full flex-col overflow-hidden rounded-card-lg bg-white shadow-drop transition-all duration-200 hover:-translate-y-0.5 hover:shadow-cardDrop"
26
+ : `callout-card ${basehwClass} ${lgWidth} ${mdWidth} w-full overflow-hidden rounded-card-lg bg-white shadow-drop transition-all duration-200 hover:-translate-y-0.5 hover:shadow-cardDrop`;
27
+
28
+ return (
29
+ <article
30
+ className={parentClassName}
31
+ data-section-type={"blog-card"}
32
+ data-section-index={index}
33
+ >
34
+ {/* Image */}
35
+ <Link href={href} tabIndex={-1} aria-hidden="true" className="block">
36
+ <div className="h-[232px] w-full flex-shrink-0 overflow-hidden bg-gray-100">
37
+ {image ? (
38
+ <Image
39
+ src={image.src}
40
+ alt={image.alt}
41
+ width={image.width}
42
+ height={image.height}
43
+ className="h-full w-full object-cover transition-transform duration-300 hover:scale-[1.03]"
44
+ sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
45
+ />
46
+ ) : (
47
+ <div
48
+ className="h-full w-full bg-gradient-to-br from-gray-200 to-gray-100"
49
+ aria-hidden="true"
50
+ />
51
+ )}
52
+ </div>
53
+ </Link>
54
+
55
+ {/* Body */}
56
+ <div className="flex flex-1 flex-col gap-5 p-6 md:p-8">
57
+ {/* Meta: category + date */}
58
+ <div className="flex items-center gap-2 text-[13px]">
59
+ <span className="body2 text-text-brand">{category}</span>
60
+ {date && (
61
+ <>
62
+ <span className="footnote text-text" aria-hidden="true">
63
+
64
+ </span>
65
+ <time className="body2 text-text">{date}</time>
66
+ </>
67
+ )}
68
+ </div>
69
+
70
+ {/* Title */}
71
+ {title && (
72
+ <Link
73
+ href={href}
74
+ className="heading6 m-0 line-clamp-3 font-black transition-colors duration-150 hover:text-text-brand"
75
+ >
76
+ {title}
77
+ </Link>
78
+ )}
79
+
80
+ {/* Excerpt */}
81
+ {description && (
82
+ <Text className="body1 m-0 line-clamp-3 flex-1 text-text">
83
+ {description}
84
+ </Text>
85
+ )}
86
+
87
+ {/* Read more */}
88
+ <Link
89
+ href={href}
90
+ className="group mt-auto inline-flex items-center justify-start gap-2 pt-3 text-sm text-text-brand no-underline"
91
+ aria-label={`${readMoreText} about ${title || "this article"}`}
92
+ >
93
+ <Text
94
+ aria-label={`${readMoreText} about ${title || "this article"}`}
95
+ className="label1 text-nowrap"
96
+ >
97
+ {readMoreText}
98
+ </Text>
99
+ <MaterialIcon
100
+ name="expand_circle_right"
101
+ fill={1}
102
+ size={24}
103
+ weight="200"
104
+ />
105
+ </Link>
106
+ </div>
107
+ </article>
108
+ );
109
+ };
110
+ export default BlogCard;
@@ -1,18 +1,18 @@
1
- export interface BlogCardProps {
2
- href: string;
3
- title?: string;
4
- description?: string;
5
- date?: string;
6
- category?: string;
7
- image?: {
8
- src: string;
9
- alt: string;
10
- width: number;
11
- height: number;
12
- };
13
- readMoreText?: string;
14
- asGrid?: boolean;
15
- lgWidth?: string;
16
- mdWidth?: string;
17
- index?: number;
18
- }
1
+ export interface BlogCardProps {
2
+ href: string;
3
+ title?: string;
4
+ description?: string;
5
+ date?: string;
6
+ category?: string;
7
+ image?: {
8
+ src: string;
9
+ alt: string;
10
+ width: number;
11
+ height: number;
12
+ };
13
+ readMoreText?: string;
14
+ asGrid?: boolean;
15
+ lgWidth?: string;
16
+ mdWidth?: string;
17
+ index?: number;
18
+ }
@@ -1,13 +1,13 @@
1
- import { CardsProps } from "./types";
2
-
3
- import { Text } from "@shared/components/text";
4
-
5
- export const Cards: React.FC<{ fields: CardsProps }> = ({ fields }) => {
6
- return (
7
- <div>
8
- <Text>Cards</Text>
9
- </div>
10
- );
11
- };
12
-
13
- export default Cards;
1
+ import { CardsProps } from "./types";
2
+
3
+ import { Text } from "@shared/components/text";
4
+
5
+ export const Cards: React.FC<{ fields: CardsProps }> = ({ fields }) => {
6
+ return (
7
+ <div>
8
+ <Text>Cards</Text>
9
+ </div>
10
+ );
11
+ };
12
+
13
+ export default Cards;