@lifesg/react-design-system 3.5.0-canary.7 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_virtual/_tslib.js +1 -1
- package/accordion/accordion-item.js +1 -1
- package/accordion/accordion-item.js.map +1 -1
- package/accordion/types.d.ts +7 -0
- package/button/button.style.js +20 -19
- package/button/button.style.js.map +1 -1
- package/cjs/_virtual/_tslib.js +1 -1
- package/cjs/accordion/accordion-item.js +1 -1
- package/cjs/accordion/accordion-item.js.map +1 -1
- package/cjs/button/button.style.js +3 -2
- package/cjs/button/button.style.js.map +1 -1
- package/cjs/external/@govtechsg/sgds-web-component/base/sgds-element.js +2 -0
- package/cjs/external/@govtechsg/sgds-web-component/base/sgds-element.js.map +1 -0
- package/cjs/external/@govtechsg/sgds-web-component/base/sgds-element2.js +2 -0
- package/cjs/external/@govtechsg/sgds-web-component/base/sgds-element2.js.map +1 -0
- package/cjs/external/@govtechsg/sgds-web-component/components/Masthead/index.js +2 -0
- package/cjs/external/@govtechsg/sgds-web-component/components/Masthead/index.js.map +1 -0
- package/cjs/external/@govtechsg/sgds-web-component/components/Masthead/masthead.js +2 -0
- package/cjs/external/@govtechsg/sgds-web-component/components/Masthead/masthead.js.map +1 -0
- package/cjs/external/@govtechsg/sgds-web-component/components/Masthead/sgds-masthead.js +154 -0
- package/cjs/external/@govtechsg/sgds-web-component/components/Masthead/sgds-masthead.js.map +1 -0
- package/cjs/external/@govtechsg/sgds-web-component/styles/anchor.js +2 -0
- package/cjs/external/@govtechsg/sgds-web-component/styles/anchor.js.map +1 -0
- package/cjs/external/@govtechsg/sgds-web-component/styles/svg.js +2 -0
- package/cjs/external/@govtechsg/sgds-web-component/styles/svg.js.map +1 -0
- package/cjs/external/@govtechsg/sgds-web-component/themes/day.css.js +1 -1
- package/cjs/external/@govtechsg/sgds-web-component/themes/night.css.js +1 -1
- package/cjs/external/@govtechsg/sgds-web-component/utils/ce-registry.js +2 -0
- package/cjs/external/@govtechsg/sgds-web-component/utils/ce-registry.js.map +1 -0
- package/cjs/external/@lit/reactive-element/css-tag.js +7 -0
- package/cjs/external/@lit/reactive-element/css-tag.js.map +1 -0
- package/cjs/external/@lit/reactive-element/decorators/property.js +7 -0
- package/cjs/external/@lit/reactive-element/decorators/property.js.map +1 -0
- package/cjs/external/@lit/reactive-element/decorators/state.js +7 -0
- package/cjs/external/@lit/reactive-element/decorators/state.js.map +1 -0
- package/cjs/external/@lit/reactive-element/reactive-element.js +7 -0
- package/cjs/external/@lit/reactive-element/reactive-element.js.map +1 -0
- package/cjs/external/lit-element/lit-element.js +8 -0
- package/cjs/external/lit-element/lit-element.js.map +1 -0
- package/cjs/external/lit-html/lit-html.js +7 -0
- package/cjs/external/lit-html/lit-html.js.map +1 -0
- package/cjs/file-download/file-download.js +1 -1
- package/cjs/file-download/file-download.js.map +1 -1
- package/cjs/file-download/file-list-card/file-list-card.js +1 -1
- package/cjs/file-download/file-list-card/file-list-card.js.map +1 -1
- package/cjs/file-download/file-list-card/file-list-card.styles.js +75 -59
- package/cjs/file-download/file-list-card/file-list-card.styles.js.map +1 -1
- package/cjs/file-upload/helper.js +1 -1
- package/cjs/file-upload/helper.js.map +1 -1
- package/cjs/fullscreen-image-carousel/fullscreen-image-carousel.js +1 -1
- package/cjs/fullscreen-image-carousel/fullscreen-image-carousel.js.map +1 -1
- package/cjs/fullscreen-image-carousel/fullscreen-image-carousel.style.js +19 -19
- package/cjs/fullscreen-image-carousel/fullscreen-image-carousel.style.js.map +1 -1
- package/cjs/masthead/masthead.js +1 -1
- package/cjs/masthead/masthead.js.map +1 -1
- package/cjs/navbar/menu.js +1 -1
- package/cjs/navbar/menu.js.map +1 -1
- package/cjs/navbar/menu.styles.js +1 -1
- package/cjs/navbar/menu.styles.js.map +1 -1
- package/cjs/navbar/navbar-items.js +1 -1
- package/cjs/navbar/navbar-items.js.map +1 -1
- package/cjs/navbar/navbar-items.styles.js +20 -21
- package/cjs/navbar/navbar-items.styles.js.map +1 -1
- package/cjs/notification-banner/notification-banner-hoc.js +1 -1
- package/cjs/notification-banner/notification-banner-hoc.js.map +1 -1
- package/codemods/run-codemod.js +10 -3
- package/codemods/run-codemod.js.map +1 -1
- package/codemods/run-codemod.ts +12 -4
- package/external/@govtechsg/sgds-web-component/base/sgds-element.js +2 -0
- package/external/@govtechsg/sgds-web-component/base/sgds-element.js.map +1 -0
- package/external/@govtechsg/sgds-web-component/base/sgds-element2.js +2 -0
- package/external/@govtechsg/sgds-web-component/base/sgds-element2.js.map +1 -0
- package/external/@govtechsg/sgds-web-component/components/Masthead/index.js +2 -0
- package/external/@govtechsg/sgds-web-component/components/Masthead/index.js.map +1 -0
- package/external/@govtechsg/sgds-web-component/components/Masthead/masthead.js +2 -0
- package/external/@govtechsg/sgds-web-component/components/Masthead/masthead.js.map +1 -0
- package/external/@govtechsg/sgds-web-component/components/Masthead/sgds-masthead.js +154 -0
- package/external/@govtechsg/sgds-web-component/components/Masthead/sgds-masthead.js.map +1 -0
- package/external/@govtechsg/sgds-web-component/styles/anchor.js +2 -0
- package/external/@govtechsg/sgds-web-component/styles/anchor.js.map +1 -0
- package/external/@govtechsg/sgds-web-component/styles/svg.js +2 -0
- package/external/@govtechsg/sgds-web-component/styles/svg.js.map +1 -0
- package/external/@govtechsg/sgds-web-component/themes/day.css.js +1 -1
- package/external/@govtechsg/sgds-web-component/themes/night.css.js +1 -1
- package/external/@govtechsg/sgds-web-component/utils/ce-registry.js +2 -0
- package/external/@govtechsg/sgds-web-component/utils/ce-registry.js.map +1 -0
- package/external/@lit/reactive-element/css-tag.js +7 -0
- package/external/@lit/reactive-element/css-tag.js.map +1 -0
- package/external/@lit/reactive-element/decorators/property.js +7 -0
- package/external/@lit/reactive-element/decorators/property.js.map +1 -0
- package/external/@lit/reactive-element/decorators/state.js +7 -0
- package/external/@lit/reactive-element/decorators/state.js.map +1 -0
- package/external/@lit/reactive-element/reactive-element.js +7 -0
- package/external/@lit/reactive-element/reactive-element.js.map +1 -0
- package/external/lit-element/lit-element.js +7 -0
- package/external/lit-element/lit-element.js.map +1 -0
- package/external/lit-html/lit-html.js +7 -0
- package/external/lit-html/lit-html.js.map +1 -0
- package/file-download/file-download.d.ts +1 -1
- package/file-download/file-download.js +1 -1
- package/file-download/file-download.js.map +1 -1
- package/file-download/file-list-card/file-list-card.d.ts +1 -1
- package/file-download/file-list-card/file-list-card.js +1 -1
- package/file-download/file-list-card/file-list-card.js.map +1 -1
- package/file-download/file-list-card/file-list-card.styles.d.ts +8 -0
- package/file-download/file-list-card/file-list-card.styles.js +53 -37
- package/file-download/file-list-card/file-list-card.styles.js.map +1 -1
- package/file-download/file-list-card/types.d.ts +2 -1
- package/file-download/types.d.ts +7 -0
- package/file-upload/helper.d.ts +30 -0
- package/file-upload/helper.js +1 -1
- package/file-upload/helper.js.map +1 -1
- package/fullscreen-image-carousel/fullscreen-image-carousel.d.ts +1 -1
- package/fullscreen-image-carousel/fullscreen-image-carousel.js +1 -1
- package/fullscreen-image-carousel/fullscreen-image-carousel.js.map +1 -1
- package/fullscreen-image-carousel/fullscreen-image-carousel.style.d.ts +7 -0
- package/fullscreen-image-carousel/fullscreen-image-carousel.style.js +21 -21
- package/fullscreen-image-carousel/fullscreen-image-carousel.style.js.map +1 -1
- package/fullscreen-image-carousel/types.d.ts +16 -0
- package/masthead/masthead.js +1 -1
- package/masthead/masthead.js.map +1 -1
- package/navbar/menu.d.ts +2 -1
- package/navbar/menu.js +1 -1
- package/navbar/menu.js.map +1 -1
- package/navbar/menu.styles.js +3 -3
- package/navbar/menu.styles.js.map +1 -1
- package/navbar/navbar-items.js +1 -1
- package/navbar/navbar-items.js.map +1 -1
- package/navbar/navbar-items.styles.js +30 -31
- package/navbar/navbar-items.styles.js.map +1 -1
- package/notification-banner/notification-banner-hoc.js +1 -1
- package/notification-banner/notification-banner-hoc.js.map +1 -1
- package/package.json +1 -1
|
@@ -74,7 +74,7 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
74
74
|
`}
|
|
75
75
|
`,x=i(g)``,f=i(g)`
|
|
76
76
|
color: ${n["icon-error"]};
|
|
77
|
-
`,m=i(g)``,b=i(g)`
|
|
77
|
+
`,m=i(g)``,b=i(g)``,u=i(g)`
|
|
78
78
|
z-index: 4;
|
|
79
79
|
position: absolute;
|
|
80
80
|
top: 50%;
|
|
@@ -99,19 +99,19 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
99
99
|
);
|
|
100
100
|
}
|
|
101
101
|
`}
|
|
102
|
-
`,
|
|
102
|
+
`,w=i.div`
|
|
103
103
|
position: relative;
|
|
104
104
|
width: 100%;
|
|
105
105
|
height: 100dvh;
|
|
106
106
|
display: flex;
|
|
107
107
|
flex-direction: column;
|
|
108
|
-
`,
|
|
108
|
+
`,v=i.div`
|
|
109
109
|
display: flex;
|
|
110
110
|
flex-direction: column;
|
|
111
111
|
width: 100%;
|
|
112
112
|
flex: 1;
|
|
113
113
|
min-height: 0;
|
|
114
|
-
`,
|
|
114
|
+
`,y=i.div`
|
|
115
115
|
user-select: none;
|
|
116
116
|
position: relative;
|
|
117
117
|
display: block;
|
|
@@ -119,13 +119,13 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
119
119
|
width: 100%;
|
|
120
120
|
flex: 1;
|
|
121
121
|
min-height: 0;
|
|
122
|
-
`,
|
|
122
|
+
`,j=i.div`
|
|
123
123
|
display: block;
|
|
124
124
|
user-select: none;
|
|
125
125
|
height: 100%;
|
|
126
126
|
overflow: hidden;
|
|
127
127
|
touch-action: pan-y;
|
|
128
|
-
`,
|
|
128
|
+
`,k=i.div`
|
|
129
129
|
display: flex;
|
|
130
130
|
transition: all 450ms ease-out 0s;
|
|
131
131
|
position: relative;
|
|
@@ -133,7 +133,7 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
133
133
|
user-select: none;
|
|
134
134
|
width: 100%;
|
|
135
135
|
height: 100%;
|
|
136
|
-
`,
|
|
136
|
+
`,M=i.div`
|
|
137
137
|
flex: 0 0 100%;
|
|
138
138
|
box-sizing: border-box;
|
|
139
139
|
display: flex;
|
|
@@ -149,7 +149,7 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
149
149
|
height: 100%;
|
|
150
150
|
width: 100%;
|
|
151
151
|
}
|
|
152
|
-
`,
|
|
152
|
+
`,W=i.div`
|
|
153
153
|
height: 100%;
|
|
154
154
|
width: 100%;
|
|
155
155
|
outline: none;
|
|
@@ -162,17 +162,17 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
162
162
|
outline: ${s["width-020"]} solid ${n["border-selected"]};
|
|
163
163
|
outline-offset: -2px;
|
|
164
164
|
}
|
|
165
|
-
`,
|
|
165
|
+
`,z=i(h)`
|
|
166
166
|
height: 100%;
|
|
167
167
|
width: 100%;
|
|
168
168
|
border-radius: ${c.none};
|
|
169
|
-
`,
|
|
169
|
+
`,B=i(o)`
|
|
170
170
|
width: 60vw;
|
|
171
171
|
height: auto;
|
|
172
172
|
max-height: 100%;
|
|
173
173
|
border-radius: ${c.none};
|
|
174
174
|
aspect-ratio: 4 / 3;
|
|
175
|
-
`,
|
|
175
|
+
`,R=i.div`
|
|
176
176
|
display: flex;
|
|
177
177
|
justify-content: center;
|
|
178
178
|
padding: ${d["spacing-16"]};
|
|
@@ -183,7 +183,7 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
183
183
|
margin-left: auto;
|
|
184
184
|
margin-right: auto;
|
|
185
185
|
z-index: 3;
|
|
186
|
-
`,
|
|
186
|
+
`,L=i(p.BodyXS)`
|
|
187
187
|
display: inline-flex;
|
|
188
188
|
padding: ${d["spacing-4"]} ${d["spacing-16"]};
|
|
189
189
|
justify-content: center;
|
|
@@ -191,7 +191,7 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
191
191
|
border-radius: ${c.full};
|
|
192
192
|
background-color: ${n.bg};
|
|
193
193
|
text-align: center;
|
|
194
|
-
`,
|
|
194
|
+
`,T=i.div`
|
|
195
195
|
flex-shrink: 0;
|
|
196
196
|
display: flex;
|
|
197
197
|
overflow: auto;
|
|
@@ -204,7 +204,7 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
204
204
|
${d["spacing-16"]} ${d["spacing-20"]} calc(${d["spacing-16"]} + ${i.$insetBottom||0}px);
|
|
205
205
|
`};
|
|
206
206
|
}
|
|
207
|
-
`,
|
|
207
|
+
`,S=i.div`
|
|
208
208
|
box-sizing: border-box;
|
|
209
209
|
display: flex;
|
|
210
210
|
align-items: center;
|
|
@@ -212,7 +212,7 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
212
212
|
justify-content: center;
|
|
213
213
|
margin-left: auto;
|
|
214
214
|
margin-right: auto;
|
|
215
|
-
`,
|
|
215
|
+
`,C=i.div`
|
|
216
216
|
display: flex;
|
|
217
217
|
align-items: center;
|
|
218
218
|
justify-content: center;
|
|
@@ -223,7 +223,7 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
223
223
|
height: 64px;
|
|
224
224
|
width: 64px;
|
|
225
225
|
}
|
|
226
|
-
`,
|
|
226
|
+
`,D=i.div`
|
|
227
227
|
cursor: pointer;
|
|
228
228
|
background-color: ${n["bg-inverse"]};
|
|
229
229
|
border-radius: ${c.md};
|
|
@@ -261,10 +261,10 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
261
261
|
border-color: ${n["border-hover"]};
|
|
262
262
|
}
|
|
263
263
|
`};
|
|
264
|
-
`,
|
|
264
|
+
`,F=i(h)`
|
|
265
265
|
height: 100%;
|
|
266
266
|
width: 100%;
|
|
267
|
-
`,
|
|
267
|
+
`,I=i.div`
|
|
268
268
|
flex: 1;
|
|
269
269
|
display: flex;
|
|
270
270
|
flex-direction: column;
|
|
@@ -278,17 +278,17 @@ import i,{css as e}from"styled-components";import{ClickableIcon as t}from"../sha
|
|
|
278
278
|
${i=>i.$centerContent&&e`
|
|
279
279
|
justify-content: center;
|
|
280
280
|
`}
|
|
281
|
-
`,
|
|
281
|
+
`,X=i(p.BodyBL)`
|
|
282
282
|
color: ${n["text-inverse"]};
|
|
283
283
|
overflow: hidden;
|
|
284
284
|
text-overflow: ellipsis;
|
|
285
285
|
white-space: nowrap;
|
|
286
286
|
min-width: 0;
|
|
287
|
-
`,
|
|
287
|
+
`,Y=i(p.BodyMD)`
|
|
288
288
|
color: ${n["text-inverse"]};
|
|
289
289
|
overflow: hidden;
|
|
290
290
|
text-overflow: ellipsis;
|
|
291
291
|
white-space: nowrap;
|
|
292
292
|
min-width: 0;
|
|
293
|
-
`;export{
|
|
293
|
+
`;export{u as ArrowButton,R as BoxChip,w as CarouselModalContent,L as Chip,x as CloseButton,b as CustomActionButton,f as DeleteButton,X as FileInfoFileName,Y as FileInfoFileSize,I as FileInfoTextWrapper,W as FocusableImageRegion,v as ImageGalleryContainer,M as ImageGallerySlide,k as ImageGallerySlides,j as ImageGallerySwipe,y as ImageGalleryWrapper,m as MagnifierButton,z as SlideImage,B as SlidePlaceholderImage,T as ThumbnailContainer,F as ThumbnailImage,D as ThumbnailItem,C as ThumbnailItemContainer,S as ThumbnailWrapper,$ as TopActionButtons};
|
|
294
294
|
//# sourceMappingURL=fullscreen-image-carousel.style.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fullscreen-image-carousel.style.js","sources":["../../src/fullscreen-image-carousel/fullscreen-image-carousel.style.tsx"],"sourcesContent":["import styled, { css } from \"styled-components\";\nimport { ClickableIcon } from \"../shared/clickable-icon\";\nimport { ImagePlaceholder } from \"../shared/image-placeholder\";\nimport { InsetStyleProps } from \"../shared/types\";\nimport {\n Border,\n Colour,\n Font,\n MediaQuery,\n Radius,\n Shadow,\n Spacing,\n} from \"../theme\";\nimport { Typography } from \"../typography\";\nimport { StatefulImage } from \"./stateful-image\";\n\n// =============================================================================\n// STYLE INTERFACES\n// =============================================================================\ninterface ArrowButtonStyleProps extends InsetStyleProps {\n $position: \"left\" | \"right\";\n}\n\ninterface ThumbnailItemStyleProps {\n $active?: boolean;\n}\n\ninterface TopActionButtonsStyleProps extends InsetStyleProps {\n $hasFileInfo?: boolean | undefined;\n}\n\ninterface FileInfoTextWrapperStyleProps {\n $centerContent?: boolean | undefined;\n}\n\n// =============================================================================\n// STYLING\n// =============================================================================\nconst IconButton = styled(ClickableIcon)`\n padding: 0;\n border-radius: 100%;\n background: ${Colour[\"bg\"]};\n color: ${Colour[\"icon-primary\"]};\n height: 2.5rem;\n width: 2.5rem;\n box-shadow: ${Shadow[\"md-strong\"]};\n\n svg {\n height: 1.5rem;\n width: 1.5rem;\n }\n\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n outline: ${Border[\"width-020\"]} solid ${Colour[\"border-selected\"]};\n outline-offset: 2px;\n }\n`;\n\nexport const TopActionButtons = styled.div<TopActionButtonsStyleProps>`\n order: -1;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: ${Spacing[\"spacing-16\"]};\n\n ${(props) =>\n props.$hasFileInfo\n ? css`\n flex-shrink: 0;\n background-color: ${Colour[\"bg-inverse\"]};\n padding-top: calc(\n ${Spacing[\"spacing-24\"]} + ${props.$insetTop || 0}px\n );\n padding-bottom: ${Spacing[\"spacing-24\"]};\n padding-left: calc(\n ${Spacing[\"spacing-32\"]} + ${props.$insetLeft || 0}px\n );\n padding-right: calc(\n ${Spacing[\"spacing-32\"]} + ${props.$insetRight || 0}px\n );\n\n ${MediaQuery.MaxWidth.sm} {\n padding-top: calc(\n ${Spacing[\"spacing-16\"]} + ${props.$insetTop || 0}px\n );\n padding-bottom: ${Spacing[\"spacing-16\"]};\n padding-left: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetLeft || 0}px\n );\n padding-right: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetRight || 0}px\n );\n }\n `\n : css`\n position: absolute;\n top: calc(\n ${Spacing[\"spacing-48\"]} + ${props.$insetTop || 0}px\n );\n right: calc(\n ${Spacing[\"spacing-48\"]} + ${props.$insetRight || 0}px\n );\n z-index: 5;\n\n ${MediaQuery.MaxWidth.sm} {\n top: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetTop || 0}px\n );\n right: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetRight || 0}px\n );\n }\n `}\n`;\n\nexport const CloseButton = styled(IconButton)``;\n\nexport const DeleteButton = styled(IconButton)`\n color: ${Colour[\"icon-error\"]};\n`;\n\nexport const MagnifierButton = styled(IconButton)``;\n\nexport const ArrowButton = styled(IconButton)<ArrowButtonStyleProps>`\n z-index: 4;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n\n ${(props) =>\n props.$position === \"left\" &&\n css`\n left: calc(${Spacing[\"spacing-48\"]} + ${props.$insetLeft || 0}px);\n\n ${MediaQuery.MaxWidth.sm} {\n left: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetLeft || 0}px\n );\n }\n `}\n\n ${(props) =>\n props.$position === \"right\" &&\n css`\n right: calc(${Spacing[\"spacing-48\"]} + ${props.$insetRight || 0}px);\n\n ${MediaQuery.MaxWidth.sm} {\n right: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetRight || 0}px\n );\n }\n `}\n`;\n\nexport const CarouselModalContent = styled.div`\n position: relative;\n width: 100%;\n height: 100dvh;\n display: flex;\n flex-direction: column;\n`;\n\nexport const ImageGalleryContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n flex: 1;\n min-height: 0;\n`;\n\nexport const ImageGalleryWrapper = styled.div`\n user-select: none;\n position: relative;\n display: block;\n overflow: hidden;\n width: 100%;\n flex: 1;\n min-height: 0;\n`;\n\nexport const ImageGallerySwipe = styled.div`\n display: block;\n user-select: none;\n height: 100%;\n overflow: hidden;\n touch-action: pan-y;\n`;\n\nexport const ImageGallerySlides = styled.div`\n display: flex;\n transition: all 450ms ease-out 0s;\n position: relative;\n text-align: center;\n user-select: none;\n width: 100%;\n height: 100%;\n`;\n\nexport const ImageGallerySlide = styled.div`\n flex: 0 0 100%;\n box-sizing: border-box;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .react-transform-wrapper {\n height: 100%;\n width: 100%;\n }\n\n .react-transform-component {\n height: 100%;\n width: 100%;\n }\n`;\n\nexport const FocusableImageRegion = styled.div`\n height: 100%;\n width: 100%;\n outline: none;\n\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n outline: ${Border[\"width-020\"]} solid ${Colour[\"border-selected\"]};\n outline-offset: -2px;\n }\n`;\n\nexport const SlideImage = styled(StatefulImage)`\n height: 100%;\n width: 100%;\n border-radius: ${Radius[\"none\"]};\n`;\n\nexport const SlidePlaceholderImage = styled(ImagePlaceholder)`\n width: 60vw;\n height: auto;\n max-height: 100%;\n border-radius: ${Radius[\"none\"]};\n aspect-ratio: 4 / 3;\n`;\n\nexport const BoxChip = styled.div`\n display: flex;\n justify-content: center;\n padding: ${Spacing[\"spacing-16\"]};\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n margin-left: auto;\n margin-right: auto;\n z-index: 3;\n`;\n\nexport const Chip = styled(Typography.BodyXS)`\n display: inline-flex;\n padding: ${Spacing[\"spacing-4\"]} ${Spacing[\"spacing-16\"]};\n justify-content: center;\n align-items: center;\n border-radius: ${Radius[\"full\"]};\n background-color: ${Colour[\"bg\"]};\n text-align: center;\n`;\n\n// -----------------------------------------------------------------------------\n// THUMBNAIL STYLING\n// -----------------------------------------------------------------------------\n\nexport const ThumbnailContainer = styled.div<InsetStyleProps>`\n flex-shrink: 0;\n display: flex;\n overflow: auto;\n background-color: ${Colour[\"bg-inverse\"]};\n padding: ${(props) =>\n css`\n ${Spacing[\"spacing-24\"]} ${Spacing[\n \"spacing-16\"\n ]} calc(${Spacing[\"spacing-24\"]} + ${props.$insetBottom ||\n 0}px);\n `}\n ${MediaQuery.MaxWidth.sm} {\n padding: ${(props) =>\n css`\n ${Spacing[\"spacing-16\"]} ${Spacing[\n \"spacing-20\"\n ]} calc(${Spacing[\"spacing-16\"]} + ${props.$insetBottom ||\n 0}px);\n `};\n }\n`;\n\nexport const ThumbnailWrapper = styled.div`\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: ${Spacing[\"spacing-16\"]};\n justify-content: center;\n margin-left: auto;\n margin-right: auto;\n`;\n\nexport const ThumbnailItemContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100px;\n width: 100px;\n\n ${MediaQuery.MaxWidth.sm} {\n height: 64px;\n width: 64px;\n }\n`;\n\nexport const ThumbnailItem = styled.div<ThumbnailItemStyleProps>`\n cursor: pointer;\n background-color: ${Colour[\"bg-inverse\"]};\n border-radius: ${Radius[\"md\"]};\n border: ${Border[\"solid\"]} transparent;\n box-sizing: content-box;\n\n flex-shrink: 0;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 92px;\n width: 92px;\n\n ${MediaQuery.MaxWidth.sm} {\n height: 60px;\n width: 60px;\n }\n\n ${(props) =>\n props.$active\n ? css`\n border-width: ${Border[\"width-040\"]};\n border-color: ${Colour[\"border-selected\"]};\n\n ${MediaQuery.MaxWidth.sm} {\n border-width: ${Border[\"width-020\"]};\n }\n\n &:hover {\n border-color: ${Colour[\"border-selected-hover\"]};\n }\n `\n : css`\n border-width: ${Border[\"width-010\"]};\n\n &:hover {\n border-color: ${Colour[\"border-hover\"]};\n }\n `};\n`;\n\nexport const ThumbnailImage = styled(StatefulImage)`\n height: 100%;\n width: 100%;\n`;\n\n// -----------------------------------------------------------------------------\n// FILE INFO BAR STYLING\n// -----------------------------------------------------------------------------\n\nexport const FileInfoTextWrapper = styled.div<FileInfoTextWrapperStyleProps>`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: ${Spacing[\"spacing-8\"]};\n overflow: hidden;\n min-width: 0;\n min-height: calc(\n ${Font.Spec[\"body-lh-baseline\"]} + ${Spacing[\"spacing-8\"]} +\n ${Font.Spec[\"body-lh-md\"]}\n );\n ${(props) =>\n props.$centerContent &&\n css`\n justify-content: center;\n `}\n`;\n\nexport const FileInfoFileName = styled(Typography.BodyBL)`\n color: ${Colour[\"text-inverse\"]};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n`;\n\nexport const FileInfoFileSize = styled(Typography.BodyMD)`\n color: ${Colour[\"text-inverse\"]};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n`;\n"],"names":["IconButton","styled","ClickableIcon","Colour","Shadow","Border","TopActionButtons","div","Spacing","props","$hasFileInfo","css","$insetTop","$insetLeft","$insetRight","MediaQuery","MaxWidth","sm","CloseButton","DeleteButton","MagnifierButton","ArrowButton","$position","CarouselModalContent","ImageGalleryContainer","ImageGalleryWrapper","ImageGallerySwipe","ImageGallerySlides","ImageGallerySlide","FocusableImageRegion","SlideImage","StatefulImage","Radius","SlidePlaceholderImage","ImagePlaceholder","BoxChip","Chip","Typography","BodyXS","ThumbnailContainer","$insetBottom","ThumbnailWrapper","ThumbnailItemContainer","ThumbnailItem","$active","ThumbnailImage","FileInfoTextWrapper","Font","Spec","$centerContent","FileInfoFileName","BodyBL","FileInfoFileSize","BodyMD"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fullscreen-image-carousel.style.js","sources":["../../src/fullscreen-image-carousel/fullscreen-image-carousel.style.tsx"],"sourcesContent":["import styled, { css } from \"styled-components\";\nimport { ClickableIcon } from \"../shared/clickable-icon\";\nimport { ImagePlaceholder } from \"../shared/image-placeholder\";\nimport { InsetStyleProps } from \"../shared/types\";\nimport {\n Border,\n Colour,\n Font,\n MediaQuery,\n Radius,\n Shadow,\n Spacing,\n} from \"../theme\";\nimport { Typography } from \"../typography\";\nimport { StatefulImage } from \"./stateful-image\";\n\n// =============================================================================\n// STYLE INTERFACES\n// =============================================================================\ninterface ArrowButtonStyleProps extends InsetStyleProps {\n $position: \"left\" | \"right\";\n}\n\ninterface ThumbnailItemStyleProps {\n $active?: boolean;\n}\n\ninterface TopActionButtonsStyleProps extends InsetStyleProps {\n $hasFileInfo?: boolean | undefined;\n}\n\ninterface FileInfoTextWrapperStyleProps {\n $centerContent?: boolean | undefined;\n}\n\n// =============================================================================\n// STYLING\n// =============================================================================\nconst IconButton = styled(ClickableIcon)`\n padding: 0;\n border-radius: 100%;\n background: ${Colour[\"bg\"]};\n color: ${Colour[\"icon-primary\"]};\n height: 2.5rem;\n width: 2.5rem;\n box-shadow: ${Shadow[\"md-strong\"]};\n\n svg {\n height: 1.5rem;\n width: 1.5rem;\n }\n\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n outline: ${Border[\"width-020\"]} solid ${Colour[\"border-selected\"]};\n outline-offset: 2px;\n }\n`;\n\nexport const TopActionButtons = styled.div<TopActionButtonsStyleProps>`\n order: -1;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: ${Spacing[\"spacing-16\"]};\n\n ${(props) =>\n props.$hasFileInfo\n ? css`\n flex-shrink: 0;\n background-color: ${Colour[\"bg-inverse\"]};\n padding-top: calc(\n ${Spacing[\"spacing-24\"]} + ${props.$insetTop || 0}px\n );\n padding-bottom: ${Spacing[\"spacing-24\"]};\n padding-left: calc(\n ${Spacing[\"spacing-32\"]} + ${props.$insetLeft || 0}px\n );\n padding-right: calc(\n ${Spacing[\"spacing-32\"]} + ${props.$insetRight || 0}px\n );\n\n ${MediaQuery.MaxWidth.sm} {\n padding-top: calc(\n ${Spacing[\"spacing-16\"]} + ${props.$insetTop || 0}px\n );\n padding-bottom: ${Spacing[\"spacing-16\"]};\n padding-left: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetLeft || 0}px\n );\n padding-right: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetRight || 0}px\n );\n }\n `\n : css`\n position: absolute;\n top: calc(\n ${Spacing[\"spacing-48\"]} + ${props.$insetTop || 0}px\n );\n right: calc(\n ${Spacing[\"spacing-48\"]} + ${props.$insetRight || 0}px\n );\n z-index: 5;\n\n ${MediaQuery.MaxWidth.sm} {\n top: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetTop || 0}px\n );\n right: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetRight || 0}px\n );\n }\n `}\n`;\n\nexport const CloseButton = styled(IconButton)``;\n\nexport const DeleteButton = styled(IconButton)`\n color: ${Colour[\"icon-error\"]};\n`;\n\nexport const MagnifierButton = styled(IconButton)``;\n\nexport const CustomActionButton = styled(IconButton)``;\n\nexport const ArrowButton = styled(IconButton)<ArrowButtonStyleProps>`\n z-index: 4;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n\n ${(props) =>\n props.$position === \"left\" &&\n css`\n left: calc(${Spacing[\"spacing-48\"]} + ${props.$insetLeft || 0}px);\n\n ${MediaQuery.MaxWidth.sm} {\n left: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetLeft || 0}px\n );\n }\n `}\n\n ${(props) =>\n props.$position === \"right\" &&\n css`\n right: calc(${Spacing[\"spacing-48\"]} + ${props.$insetRight || 0}px);\n\n ${MediaQuery.MaxWidth.sm} {\n right: calc(\n ${Spacing[\"spacing-20\"]} + ${props.$insetRight || 0}px\n );\n }\n `}\n`;\n\nexport const CarouselModalContent = styled.div`\n position: relative;\n width: 100%;\n height: 100dvh;\n display: flex;\n flex-direction: column;\n`;\n\nexport const ImageGalleryContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n flex: 1;\n min-height: 0;\n`;\n\nexport const ImageGalleryWrapper = styled.div`\n user-select: none;\n position: relative;\n display: block;\n overflow: hidden;\n width: 100%;\n flex: 1;\n min-height: 0;\n`;\n\nexport const ImageGallerySwipe = styled.div`\n display: block;\n user-select: none;\n height: 100%;\n overflow: hidden;\n touch-action: pan-y;\n`;\n\nexport const ImageGallerySlides = styled.div`\n display: flex;\n transition: all 450ms ease-out 0s;\n position: relative;\n text-align: center;\n user-select: none;\n width: 100%;\n height: 100%;\n`;\n\nexport const ImageGallerySlide = styled.div`\n flex: 0 0 100%;\n box-sizing: border-box;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .react-transform-wrapper {\n height: 100%;\n width: 100%;\n }\n\n .react-transform-component {\n height: 100%;\n width: 100%;\n }\n`;\n\nexport const FocusableImageRegion = styled.div`\n height: 100%;\n width: 100%;\n outline: none;\n\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n outline: ${Border[\"width-020\"]} solid ${Colour[\"border-selected\"]};\n outline-offset: -2px;\n }\n`;\n\nexport const SlideImage = styled(StatefulImage)`\n height: 100%;\n width: 100%;\n border-radius: ${Radius[\"none\"]};\n`;\n\nexport const SlidePlaceholderImage = styled(ImagePlaceholder)`\n width: 60vw;\n height: auto;\n max-height: 100%;\n border-radius: ${Radius[\"none\"]};\n aspect-ratio: 4 / 3;\n`;\n\nexport const BoxChip = styled.div`\n display: flex;\n justify-content: center;\n padding: ${Spacing[\"spacing-16\"]};\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n margin-left: auto;\n margin-right: auto;\n z-index: 3;\n`;\n\nexport const Chip = styled(Typography.BodyXS)`\n display: inline-flex;\n padding: ${Spacing[\"spacing-4\"]} ${Spacing[\"spacing-16\"]};\n justify-content: center;\n align-items: center;\n border-radius: ${Radius[\"full\"]};\n background-color: ${Colour[\"bg\"]};\n text-align: center;\n`;\n\n// -----------------------------------------------------------------------------\n// THUMBNAIL STYLING\n// -----------------------------------------------------------------------------\n\nexport const ThumbnailContainer = styled.div<InsetStyleProps>`\n flex-shrink: 0;\n display: flex;\n overflow: auto;\n background-color: ${Colour[\"bg-inverse\"]};\n padding: ${(props) =>\n css`\n ${Spacing[\"spacing-24\"]} ${Spacing[\n \"spacing-16\"\n ]} calc(${Spacing[\"spacing-24\"]} + ${props.$insetBottom ||\n 0}px);\n `}\n ${MediaQuery.MaxWidth.sm} {\n padding: ${(props) =>\n css`\n ${Spacing[\"spacing-16\"]} ${Spacing[\n \"spacing-20\"\n ]} calc(${Spacing[\"spacing-16\"]} + ${props.$insetBottom ||\n 0}px);\n `};\n }\n`;\n\nexport const ThumbnailWrapper = styled.div`\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: ${Spacing[\"spacing-16\"]};\n justify-content: center;\n margin-left: auto;\n margin-right: auto;\n`;\n\nexport const ThumbnailItemContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100px;\n width: 100px;\n\n ${MediaQuery.MaxWidth.sm} {\n height: 64px;\n width: 64px;\n }\n`;\n\nexport const ThumbnailItem = styled.div<ThumbnailItemStyleProps>`\n cursor: pointer;\n background-color: ${Colour[\"bg-inverse\"]};\n border-radius: ${Radius[\"md\"]};\n border: ${Border[\"solid\"]} transparent;\n box-sizing: content-box;\n\n flex-shrink: 0;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 92px;\n width: 92px;\n\n ${MediaQuery.MaxWidth.sm} {\n height: 60px;\n width: 60px;\n }\n\n ${(props) =>\n props.$active\n ? css`\n border-width: ${Border[\"width-040\"]};\n border-color: ${Colour[\"border-selected\"]};\n\n ${MediaQuery.MaxWidth.sm} {\n border-width: ${Border[\"width-020\"]};\n }\n\n &:hover {\n border-color: ${Colour[\"border-selected-hover\"]};\n }\n `\n : css`\n border-width: ${Border[\"width-010\"]};\n\n &:hover {\n border-color: ${Colour[\"border-hover\"]};\n }\n `};\n`;\n\nexport const ThumbnailImage = styled(StatefulImage)`\n height: 100%;\n width: 100%;\n`;\n\n// -----------------------------------------------------------------------------\n// FILE INFO BAR STYLING\n// -----------------------------------------------------------------------------\n\nexport const FileInfoTextWrapper = styled.div<FileInfoTextWrapperStyleProps>`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: ${Spacing[\"spacing-8\"]};\n overflow: hidden;\n min-width: 0;\n min-height: calc(\n ${Font.Spec[\"body-lh-baseline\"]} + ${Spacing[\"spacing-8\"]} +\n ${Font.Spec[\"body-lh-md\"]}\n );\n ${(props) =>\n props.$centerContent &&\n css`\n justify-content: center;\n `}\n`;\n\nexport const FileInfoFileName = styled(Typography.BodyBL)`\n color: ${Colour[\"text-inverse\"]};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n`;\n\nexport const FileInfoFileSize = styled(Typography.BodyMD)`\n color: ${Colour[\"text-inverse\"]};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n`;\n"],"names":["IconButton","styled","ClickableIcon","Colour","Shadow","Border","TopActionButtons","div","Spacing","props","$hasFileInfo","css","$insetTop","$insetLeft","$insetRight","MediaQuery","MaxWidth","sm","CloseButton","DeleteButton","MagnifierButton","CustomActionButton","ArrowButton","$position","CarouselModalContent","ImageGalleryContainer","ImageGalleryWrapper","ImageGallerySwipe","ImageGallerySlides","ImageGallerySlide","FocusableImageRegion","SlideImage","StatefulImage","Radius","SlidePlaceholderImage","ImagePlaceholder","BoxChip","Chip","Typography","BodyXS","ThumbnailContainer","$insetBottom","ThumbnailWrapper","ThumbnailItemContainer","ThumbnailItem","$active","ThumbnailImage","FileInfoTextWrapper","Font","Spec","$centerContent","FileInfoFileName","BodyBL","FileInfoFileSize","BodyMD"],"mappings":"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"}
|
|
@@ -6,6 +6,16 @@ export interface FullscreenImageCarouselRef {
|
|
|
6
6
|
goToPrevItem: () => void;
|
|
7
7
|
goToNextItem: () => void;
|
|
8
8
|
}
|
|
9
|
+
/** Custom button rendered in the carousel's top bar */
|
|
10
|
+
export interface FullscreenImageCarouselCustomAction {
|
|
11
|
+
/** Icon element rendered inside the button */
|
|
12
|
+
icon: JSX.Element;
|
|
13
|
+
/** Accessible name for the button */
|
|
14
|
+
ariaLabel: string;
|
|
15
|
+
/** Called when the action is activated */
|
|
16
|
+
onClick: (item: FullscreenImageCarouselItemProps, index: number) => void;
|
|
17
|
+
"data-testid"?: string | undefined;
|
|
18
|
+
}
|
|
9
19
|
export interface FullscreenImageCarouselProps extends Pick<ModalProps, "show" | "rootComponentId" | "animationFrom" | "zIndex"> {
|
|
10
20
|
items: FullscreenImageCarouselItemProps[];
|
|
11
21
|
/** The index of the visible item, starts from 0 */
|
|
@@ -14,13 +24,19 @@ export interface FullscreenImageCarouselProps extends Pick<ModalProps, "show" |
|
|
|
14
24
|
hideNavigation?: boolean | undefined;
|
|
15
25
|
hideCounter?: boolean | undefined;
|
|
16
26
|
hideMagnifier?: boolean | undefined;
|
|
27
|
+
/** Additional icon buttons rendered in the top bar, before the default buttons. An item's own `customActions` replaces this list for that item */
|
|
28
|
+
customActions?: FullscreenImageCarouselCustomAction[] | undefined;
|
|
17
29
|
onDelete?: ((item: FullscreenImageCarouselItemProps, index: number) => void) | undefined;
|
|
18
30
|
onClose?: (() => void) | undefined;
|
|
19
31
|
insets?: Insets | undefined;
|
|
32
|
+
/** Ref to the top bar element, which holds the file info and the action buttons */
|
|
33
|
+
topBarRef?: React.Ref<HTMLDivElement> | undefined;
|
|
20
34
|
}
|
|
21
35
|
interface FullscreenImageCarouselBaseItemProps {
|
|
22
36
|
fileName?: string | undefined;
|
|
23
37
|
fileSize?: string | undefined;
|
|
38
|
+
/** Replaces the component-level `customActions` while this item is active. Leave `undefined` to inherit the component-level list; pass `[]` to render none */
|
|
39
|
+
customActions?: FullscreenImageCarouselCustomAction[] | undefined;
|
|
24
40
|
}
|
|
25
41
|
export interface FullscreenImageCarouselImageItemProps extends FullscreenImageCarouselBaseItemProps {
|
|
26
42
|
type?: "image" | undefined;
|
package/masthead/masthead.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e}from"react/jsx-runtime";import"../external/@govtechsg/sgds-web-component/themes/day.css.js";import"../external/@govtechsg/sgds-web-component/themes/night.css.js";import{memo as t,useContext as s,useEffect as o}from"react";import{ThemeContext as
|
|
1
|
+
import{jsx as e}from"react/jsx-runtime";import"../external/@govtechsg/sgds-web-component/themes/day.css.js";import"../external/@govtechsg/sgds-web-component/themes/night.css.js";import{memo as t,useContext as s,useEffect as o}from"react";import{ThemeContext as m}from"styled-components";import{Wrapper as n}from"./masthead.style.js";const r=t((({stretch:t=!1})=>{const r=s(m),d="dark"===(null==r?void 0:r.colourMode);o((()=>{import("../external/@govtechsg/sgds-web-component/components/Masthead/index.js")}),[]),o((()=>{d?document.documentElement.classList.add(c):document.documentElement.classList.remove(c)}),[d]);return e(n,{dangerouslySetInnerHTML:{__html:"<sgds-masthead></sgds-masthead>"},$stretch:t})})),c="sgds-night-theme";export{r as Masthead};
|
|
2
2
|
//# sourceMappingURL=masthead.js.map
|
package/masthead/masthead.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masthead.js","sources":["../../src/masthead/masthead.tsx"],"sourcesContent":["import \"@govtechsg/sgds-web-component/themes/day.css\";\nimport \"@govtechsg/sgds-web-component/themes/night.css\";\nimport { memo, useContext, useEffect } from \"react\";\nimport { ThemeContext } from \"styled-components\";\nimport { Wrapper } from \"./masthead.style\";\nimport { MastheadProps } from \"./types\";\n\nconst MastheadComponent = ({ stretch = false }: MastheadProps): JSX.Element => {\n const theme = useContext(ThemeContext);\n const isDarkMode = theme?.colourMode === \"dark\";\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n
|
|
1
|
+
{"version":3,"file":"masthead.js","sources":["../../src/masthead/masthead.tsx"],"sourcesContent":["import \"@govtechsg/sgds-web-component/themes/day.css\";\nimport \"@govtechsg/sgds-web-component/themes/night.css\";\nimport { memo, useContext, useEffect } from \"react\";\nimport { ThemeContext } from \"styled-components\";\nimport { Wrapper } from \"./masthead.style\";\nimport { MastheadProps } from \"./types\";\n\nconst MastheadComponent = ({ stretch = false }: MastheadProps): JSX.Element => {\n const theme = useContext(ThemeContext);\n const isDarkMode = theme?.colourMode === \"dark\";\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n import(\"@govtechsg/sgds-web-component/components/Masthead/index.js\");\n }, []);\n\n useEffect(() => {\n // SGDS dark mode only takes effect when this class is set on the :root element\n if (isDarkMode) {\n document.documentElement.classList.add(SGDS_THEME_NIGHT_CLASSNAME);\n } else {\n document.documentElement.classList.remove(\n SGDS_THEME_NIGHT_CLASSNAME\n );\n }\n }, [isDarkMode]);\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const createContent = () => {\n /**\n * Note: Had to use this method because we had to create a\n * custom type to handle Web Components (refer to this guide\n * https://blog.devgenius.io/how-to-use-web-components-in-react-54c951399bfd)\n * But we are having troubles exporting the custom type definition\n * via rollup\n */\n return { __html: \"<sgds-masthead></sgds-masthead>\" };\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n\n return (\n <Wrapper dangerouslySetInnerHTML={createContent()} $stretch={stretch} />\n );\n};\n\nexport const Masthead = memo(MastheadComponent);\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\nconst SGDS_THEME_NIGHT_CLASSNAME = \"sgds-night-theme\";\n"],"names":["Masthead","memo","stretch","theme","useContext","ThemeContext","isDarkMode","colourMode","useEffect","import","document","documentElement","classList","add","SGDS_THEME_NIGHT_CLASSNAME","remove","_jsx","Wrapper","dangerouslySetInnerHTML","__html","$stretch"],"mappings":"6UAOA,MA6CaA,EAAWC,GA7CE,EAAGC,WAAU,MACnC,MAAMC,EAAQC,EAAWC,GACnBC,EAAmC,UAAtBH,aAAK,EAALA,EAAOI,YAK1BC,GAAU,KACNC,OAAO,yEAA6D,GACrE,IAEHD,GAAU,KAEFF,EACAI,SAASC,gBAAgBC,UAAUC,IAAIC,GAEvCJ,SAASC,gBAAgBC,UAAUG,OAC/BD,EAER,GACD,CAACR,IAoBJ,OACIU,EAACC,EAAO,CAACC,wBARF,CAAEC,OAAQ,mCAQgCC,SAAYlB,GAAW,IAS1EY,EAA6B"}
|
package/navbar/menu.d.ts
CHANGED
|
@@ -2,7 +2,8 @@ import React from "react";
|
|
|
2
2
|
import { NavItemCommonProps } from "./types";
|
|
3
3
|
interface Props<T> {
|
|
4
4
|
items: NavItemCommonProps<T>[];
|
|
5
|
+
selectedId?: string | undefined;
|
|
5
6
|
onItemClick: (event: React.MouseEvent<HTMLAnchorElement>, item: NavItemCommonProps<T>) => void;
|
|
6
7
|
}
|
|
7
|
-
export declare const Menu: <T>({ items, onItemClick }: Props<T>) => JSX.Element;
|
|
8
|
+
export declare const Menu: <T>({ items, selectedId, onItemClick, }: Props<T>) => JSX.Element;
|
|
8
9
|
export {};
|
package/navbar/menu.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{__rest as
|
|
1
|
+
import{__rest as e}from"../_virtual/_tslib.js";import{jsx as t,Fragment as i}from"react/jsx-runtime";import{MobileWrapper as n,MenuItem as o,Link as r}from"./menu.styles.js";const l=({items:l,selectedId:s,onItemClick:c})=>{const d=e=>t=>{t.stopPropagation(),c(t,e)};return(null==l?void 0:l.length)?t(n,{children:l.map(((i,n)=>{const{children:l,options:c,weight:m}=i,a=e(i,["children","options","weight"]),p=`menu__mobile-${n+1}`,h=i.id===s;return t(o,{children:t(r,Object.assign({"data-testid":p},a,c,{weight:h?"bold":m,"aria-current":h?"page":void 0,onClick:d(i),underlineStyle:"none",children:l}))},n)}))}):t(i,{})};export{l as Menu};
|
|
2
2
|
//# sourceMappingURL=menu.js.map
|
package/navbar/menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sources":["../../src/navbar/menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { Link, MenuItem, MobileWrapper } from \"./menu.styles\";\nimport { NavItemCommonProps } from \"./types\";\n\ninterface Props<T> {\n items: NavItemCommonProps<T>[];\n onItemClick: (\n event: React.MouseEvent<HTMLAnchorElement>,\n item: NavItemCommonProps<T>\n ) => void;\n}\n\nexport const Menu = <T,>({
|
|
1
|
+
{"version":3,"file":"menu.js","sources":["../../src/navbar/menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { Link, MenuItem, MobileWrapper } from \"./menu.styles\";\nimport { NavItemCommonProps } from \"./types\";\n\ninterface Props<T> {\n items: NavItemCommonProps<T>[];\n selectedId?: string | undefined;\n onItemClick: (\n event: React.MouseEvent<HTMLAnchorElement>,\n item: NavItemCommonProps<T>\n ) => void;\n}\n\nexport const Menu = <T,>({\n items,\n selectedId,\n onItemClick,\n}: Props<T>): JSX.Element => {\n const handleLinkClick = (item: NavItemCommonProps<T>) => {\n return (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.stopPropagation(); // in mobile, this prevents the drawer from intercepting event\n onItemClick(event, item);\n };\n };\n\n if (!items?.length) return <></>;\n\n return (\n <MobileWrapper>\n {items.map((item, index) => {\n const { children, options, weight, ...otherItemAttrs } = item;\n const testId = `menu__mobile-${index + 1}`;\n const selected = item.id === selectedId;\n\n return (\n <MenuItem key={index}>\n <Link\n data-testid={testId}\n {...otherItemAttrs}\n {...options}\n weight={selected ? \"bold\" : weight}\n aria-current={selected ? \"page\" : undefined}\n onClick={handleLinkClick(item)}\n underlineStyle=\"none\"\n >\n {children}\n </Link>\n </MenuItem>\n );\n })}\n </MobileWrapper>\n );\n};\n"],"names":["Menu","items","selectedId","onItemClick","handleLinkClick","item","event","stopPropagation","length","_jsx","MobileWrapper","children","map","index","options","weight","otherItemAttrs","__rest","testId","selected","id","MenuItem","Link","Object","assign","undefined","onClick","underlineStyle"],"mappings":"8KAaO,MAAMA,EAAO,EAChBC,QACAC,aACAC,kBAEA,MAAMC,EAAmBC,GACbC,IACJA,EAAMC,kBACNJ,EAAYG,EAAOD,EAAK,EAIhC,OAAKJ,aAAK,EAALA,EAAOO,QAGRC,EAACC,EAAa,CAAAC,SACTV,EAAMW,KAAI,CAACP,EAAMQ,KACd,MAAMF,SAAEA,EAAQG,QAAEA,EAAOC,OAAEA,GAA8BV,EAAnBW,EAAcC,EAAKZ,EAAnD,CAAA,WAAA,UAAA,WACAa,EAAS,gBAAgBL,EAAQ,IACjCM,EAAWd,EAAKe,KAAOlB,EAE7B,OACIO,EAACY,EAAQ,CAAAV,SACLF,EAACa,EAAIC,OAAAC,OAAA,CAAA,cACYN,GACTF,EACAF,GACJC,OAAQI,EAAW,OAASJ,EAAM,eACpBI,EAAW,YAASM,EAClCC,QAAStB,EAAgBC,GACzBsB,eAAe,OAAMhB,SAEpBA,MAVME,EAYJ,MAtBAJ,OAyBP"}
|
package/navbar/menu.styles.js
CHANGED
|
@@ -10,7 +10,7 @@ import e from"styled-components";import{lineClampCss as r}from"../shared/styles/
|
|
|
10
10
|
`,a=e.li`
|
|
11
11
|
width: 100%;
|
|
12
12
|
display: flex;
|
|
13
|
-
`,
|
|
13
|
+
`,p=e(d.LinkBL)`
|
|
14
14
|
width: 100%;
|
|
15
15
|
text-align: left;
|
|
16
16
|
color: ${t.text};
|
|
@@ -19,7 +19,7 @@ import e from"styled-components";import{lineClampCss as r}from"../shared/styles/
|
|
|
19
19
|
|
|
20
20
|
// use border, as padding still shows an extra line after the ellipsis
|
|
21
21
|
border: ${o.solid} transparent;
|
|
22
|
-
border-width: ${i["spacing-
|
|
22
|
+
border-width: 10px ${i["spacing-16"]} 10px ${i["spacing-24"]};
|
|
23
23
|
border-radius: ${s.md};
|
|
24
24
|
|
|
25
25
|
${r(2)}
|
|
@@ -31,5 +31,5 @@ import e from"styled-components";import{lineClampCss as r}from"../shared/styles/
|
|
|
31
31
|
background-color: ${t["bg-hover"]};
|
|
32
32
|
color: ${t.text};
|
|
33
33
|
}
|
|
34
|
-
`;export{
|
|
34
|
+
`;export{p as Link,a as MenuItem,l as MobileWrapper};
|
|
35
35
|
//# sourceMappingURL=menu.styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.styles.js","sources":["../../src/navbar/menu.styles.tsx"],"sourcesContent":["import styled from \"styled-components\";\nimport { lineClampCss } from \"../shared/styles\";\nimport { Border, Colour, Radius, Spacing } from \"../theme\";\nimport { Typography } from \"../typography\";\n\nexport const MobileWrapper = styled.ul`\n list-style: none;\n display: flex;\n flex-direction: column;\n\n margin: 0;\n padding: 0;\n\n border-left: ${Border[\"width-040\"]} solid ${Colour[\"border-selected\"]};\n`;\n\nexport const MenuItem = styled.li`\n width: 100%;\n display: flex;\n`;\n\nexport const Link = styled(Typography.LinkBL)`\n width: 100%;\n text-align: left;\n color: ${Colour[\"text\"]};\n\n margin: 0 ${Spacing[\"spacing-8\"]};\n\n // use border, as padding still shows an extra line after the ellipsis\n border: ${Border[\"solid\"]} transparent;\n border-width: ${Spacing[\"spacing-
|
|
1
|
+
{"version":3,"file":"menu.styles.js","sources":["../../src/navbar/menu.styles.tsx"],"sourcesContent":["import styled from \"styled-components\";\nimport { lineClampCss } from \"../shared/styles\";\nimport { Border, Colour, Radius, Spacing } from \"../theme\";\nimport { Typography } from \"../typography\";\n\nexport const MobileWrapper = styled.ul`\n list-style: none;\n display: flex;\n flex-direction: column;\n\n margin: 0;\n padding: 0;\n\n border-left: ${Border[\"width-040\"]} solid ${Colour[\"border-selected\"]};\n`;\n\nexport const MenuItem = styled.li`\n width: 100%;\n display: flex;\n`;\n\nexport const Link = styled(Typography.LinkBL)`\n width: 100%;\n text-align: left;\n color: ${Colour[\"text\"]};\n\n margin: 0 ${Spacing[\"spacing-8\"]};\n\n // use border, as padding still shows an extra line after the ellipsis\n border: ${Border[\"solid\"]} transparent;\n border-width: 10px ${Spacing[\"spacing-16\"]} 10px ${Spacing[\"spacing-24\"]};\n border-radius: ${Radius[\"md\"]};\n\n ${lineClampCss(2)}\n white-space: pre-wrap;\n\n &:hover,\n &:active,\n &:focus {\n background-color: ${Colour[\"bg-hover\"]};\n color: ${Colour[\"text\"]};\n }\n`;\n"],"names":["MobileWrapper","styled","ul","Border","Colour","MenuItem","li","Link","Typography","LinkBL","Spacing","Radius","lineClampCss"],"mappings":"mOAKO,MAAMA,EAAgBC,EAAOC,EAAE;;;;;;;;mBAQnBC,EAAO,sBAAsBC,EAAO;EAG1CC,EAAWJ,EAAOK,EAAE;;;EAKpBC,EAAON,EAAOO,EAAWC,OAAO;;;aAGhCL,EAAa;;gBAEVM,EAAQ;;;cAGVP,EAAc;yBACHO,EAAQ,sBAAsBA,EAAQ;qBAC1CC,EAAW;;MAE1BC,EAAa;;;;;;4BAMSR,EAAO;iBAClBA,EAAa;;"}
|
package/navbar/navbar-items.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{__rest as e}from"../_virtual/_tslib.js";import{jsx as n,Fragment as t,jsxs as i}from"react/jsx-runtime";import{useState as r,useRef as l,useEffect as o}from"react";import{Menu as d}from"../menu/menu.js";import{Menu as a}from"./menu.js";import"../util/calendar-helper.js";import"../util/date-helper.js";import"../util/date-input-helper.js";import{useId as s}from"../util/simple-id-generator.js";import"../util/string-helper.js";import"@react-aria/live-announcer";import{MobileWrapper as c,Wrapper as u,LinkItem as p,Link as m,LinkLabel as h,LinkButton as g,ChevronIconDesktop as b,LinkIndicator as v,LinkIconContainer as $,ExpandCollapseButton as f,ChevronIcon as j}from"./navbar-items.styles.js";const
|
|
1
|
+
import{__rest as e}from"../_virtual/_tslib.js";import{jsx as n,Fragment as t,jsxs as i}from"react/jsx-runtime";import{useState as r,useRef as l,useEffect as o}from"react";import{Menu as d}from"../menu/menu.js";import{Menu as a}from"./menu.js";import"../util/calendar-helper.js";import"../util/date-helper.js";import"../util/date-input-helper.js";import{useId as s}from"../util/simple-id-generator.js";import"../util/string-helper.js";import"@react-aria/live-announcer";import{MobileWrapper as c,Wrapper as u,LinkItem as p,Link as m,LinkLabel as h,LinkButton as g,ChevronIconDesktop as b,LinkIndicator as v,LinkIconContainer as $,ExpandCollapseButton as f,ChevronIcon as j}from"./navbar-items.styles.js";const x=({items:x,selectedId:k,mobile:I=!1,hideNavBranding:C,hideLinkIndicator:M=!1,onItemClick:O})=>{const[_,w]=r(null),L=l(null),y=s(),P=e=>{var n;return!!(null===(n=e.subMenu)||void 0===n?void 0:n.some((e=>e.id===k)))},E=I?x.findIndex((e=>"component"!==e.itemType&&P(e))):-1,B=E<0?null:E;o((()=>{I&&w(B)}),[I,B]),o((()=>{if(I)return;const e=e=>{L.current&&!L.current.contains(e.target)&&w(null)};return document.addEventListener("click",e,!0),()=>{document.removeEventListener("click",e,!0)}}),[I]);const D=(e,n)=>t=>{t.stopPropagation(),I&&w((t=>{var i;return(null===(i=e.subMenu)||void 0===i?void 0:i.length)&&t!==n?n:null})),O(t,e)},T=(e,n)=>{e.stopPropagation(),O(e,n)},A=(e,t)=>n(d.Content,{id:t,children:n(d.Section,{showDivider:!1,children:e.map(((e,t)=>n(d.Link,{href:e.href,children:e.children},`${e.id}-${t}`)))})}),F=e=>n(a,{items:e,selectedId:k,onItemClick:T}),H=(r,l)=>{const{children:o,options:a,subMenu:s}=r,c=e(r,["children","options","subMenu"]),u=!!(null==s?void 0:s.length),O=(e=>e.id===k||P(e))(r),L=I&&u&&_===l,E=!I&&u&&_===l||L,B=I||null===_?O:_===l,T=!M&&B,H=B?I?"bold":"semibold":"regular",N=I?`link__mobile-${l+1}`:`link__${l+1}`,S=()=>T?n(v,{"data-testid":`${N}-indicator`,$selected:B}):null;return n(p,{$hiddenBranding:C,children:u?(e=>{const p=`navbar-submenu-${y}-${r.id}`;return I?i(t,{children:[i(m,Object.assign({"data-testid":N,$weight:H,$selected:B},c,{"aria-current":O?"page":void 0,"aria-haspopup":"menu","aria-expanded":E,onClick:D(r,l)},a,{children:[n(h,{children:o}),S(),I&&u?n($,{children:n(f,{"data-testid":`${N}-expand-collapse-button`,$selected:B,$expanded:E,focusHighlight:!1,focusOutline:"browser","aria-label":E?"Collapse":"Expand",children:n(j,{$selected:B})})}):null]})),L&&F(s)]}):n(d,{position:e?"bottom-end":"bottom",customOffset:0,menuContent:A(s,p),triggerOnFocus:!0,isModal:!1,onPopoverAppear:()=>{w(l)},onPopoverDismiss:()=>{w((e=>e===l?null:e))},children:i(g,Object.assign({type:"button",tabIndex:0,"data-testid":N,$weight:H,$selected:B,"aria-haspopup":"menu","aria-expanded":E},a,{children:[n(h,{children:o}),S(),n(b,{$selected:B,$expanded:E})]}))})})(l===x.length-1):i(m,Object.assign({tabIndex:0,"data-testid":N,$weight:H,$selected:B},c,{"aria-current":O?"page":void 0,onClick:D(r,l)},a,{children:[n(h,{children:o}),S()]}))},l)},N=()=>x.map(((e,t)=>{var i;return"component"===e.itemType?n("li",{children:null!==(i=e.children)&&void 0!==i?i:null},t):H(e,t)}));return x&&x.length>0?I?n(c,{ref:L,children:N()}):n(u,{ref:L,$alignLeft:C,children:N()}):n(t,{})};export{x as NavbarItems};
|
|
2
2
|
//# sourceMappingURL=navbar-items.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navbar-items.js","sources":["../../src/navbar/navbar-items.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { Menu as DesktopMenu } from \"../menu\";\nimport { TypographyWeight } from \"../typography\";\nimport { Menu as MobileMenu } from \"./menu\";\n\nimport { useId } from \"../util\";\nimport {\n ChevronIcon,\n ChevronIconDesktop,\n ExpandCollapseButton,\n Link,\n LinkButton,\n LinkIconContainer,\n LinkIndicator,\n LinkItem,\n LinkLabel,\n MobileWrapper,\n Wrapper,\n} from \"./navbar-items.styles\";\nimport { NavItemCommonProps, NavItemLinkProps, NavItemProps } from \"./types\";\n\ninterface Props<T> {\n items: NavItemProps<T>[];\n selectedId?: string | undefined;\n /** toggle for mobile or desktop view */\n mobile?: boolean | undefined;\n hideNavBranding?: boolean | undefined;\n /** hide the selected LinkIndicator */\n hideLinkIndicator?: boolean | undefined;\n onItemClick: (\n event: React.MouseEvent<HTMLAnchorElement>,\n item: NavItemProps<T> | NavItemCommonProps<T>\n ) => void;\n}\n\nexport const NavbarItems = <T,>({\n items,\n selectedId,\n mobile = false,\n hideNavBranding,\n hideLinkIndicator = false,\n onItemClick,\n}: Props<T>): JSX.Element => {\n // =============================================================================\n // CONST, STATE, REFS\n // =============================================================================\n const [selectedIndex, setSelectedIndex] = useState<number>(-1);\n const [showSubMenu, setShowSubMenu] = useState<boolean>(false);\n const [openSubMenuIndex, setOpenSubMenuIndex] = useState<number | null>(\n null\n );\n const listRef = useRef<HTMLUListElement>(null);\n const instanceId = useId();\n\n // =============================================================================\n // HELPERS\n // =============================================================================\n const resetAll = () => {\n setShowSubMenu(false);\n setSelectedIndex(-1);\n setOpenSubMenuIndex(null);\n };\n\n const closeMobileSubMenu = () => {\n setShowSubMenu(false);\n setSelectedIndex(-1);\n };\n\n const checkSelected = (item: NavItemLinkProps<T>): boolean => {\n if (item.id === selectedId) return true;\n if (item.subMenu?.length) {\n return !!item.subMenu.find((s) => s.id === selectedId);\n }\n return false;\n };\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n listRef.current &&\n !listRef.current.contains(event.target as Node)\n ) {\n resetAll();\n }\n };\n document.addEventListener(\"click\", handleClickOutside, true);\n return () => {\n document.removeEventListener(\"click\", handleClickOutside, true);\n };\n }, []);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleLinkClick = (item: NavItemLinkProps<T>, index: number) => {\n return (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.stopPropagation();\n\n // mobile expands inline when link has submenu\n if (mobile && item.subMenu?.length) {\n const nextExpanded = !(selectedIndex === index && showSubMenu);\n setSelectedIndex(index);\n setShowSubMenu(nextExpanded);\n }\n\n onItemClick(event, item);\n };\n };\n\n const handleMobileSubLinkClick = (\n event: React.MouseEvent<HTMLAnchorElement>,\n item: NavItemCommonProps<T>\n ) => {\n event.stopPropagation();\n onItemClick(event, item);\n closeMobileSubMenu();\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderDesktopSubMenu = (\n subMenu: NavItemCommonProps<T>[],\n subMenuId: string\n ) => (\n <DesktopMenu.Content id={subMenuId}>\n <DesktopMenu.Section showDivider={false}>\n {subMenu.map((item, subIndex) => (\n <DesktopMenu.Link\n key={`${item.id}-${subIndex}`}\n href={item.href}\n >\n {item.children}\n </DesktopMenu.Link>\n ))}\n </DesktopMenu.Section>\n </DesktopMenu.Content>\n );\n\n const renderMobileSubMenu = (subMenu: NavItemCommonProps<T>[]) => (\n <MobileMenu items={subMenu} onItemClick={handleMobileSubLinkClick} />\n );\n\n const renderLinkItem = (item: NavItemLinkProps<T>, index: number) => {\n const { children, options, subMenu, ...otherItemAttrs } = item;\n\n const hasSubMenu = !!subMenu?.length;\n\n const isRouteSelected = checkSelected(item);\n\n // desktop popover open state\n const isDesktopExpanded =\n !mobile && hasSubMenu && openSubMenuIndex === index;\n\n // mobile inline expanded state\n const isMobileExpanded =\n mobile && hasSubMenu && selectedIndex === index && showSubMenu;\n\n const isExpanded = isDesktopExpanded || isMobileExpanded;\n\n const selected =\n openSubMenuIndex !== null\n ? openSubMenuIndex === index\n : isRouteSelected;\n\n const showIndicator = !hideLinkIndicator && selected;\n\n const textWeight: TypographyWeight = selected\n ? mobile\n ? \"bold\"\n : \"semibold\"\n : \"regular\";\n\n const testId = mobile\n ? `link__mobile-${index + 1}`\n : `link__${index + 1}`;\n\n const renderIndicator = () =>\n showIndicator ? (\n <LinkIndicator\n data-testid={`${testId}-indicator`}\n $selected={selected}\n />\n ) : null;\n\n const renderMobileChevron = () =>\n mobile && hasSubMenu ? (\n <LinkIconContainer>\n <ExpandCollapseButton\n data-testid={`${testId}-expand-collapse-button`}\n $selected={selected}\n $expanded={isExpanded}\n focusHighlight={false}\n focusOutline=\"browser\"\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n >\n <ChevronIcon $selected={selected} />\n </ExpandCollapseButton>\n </LinkIconContainer>\n ) : null;\n\n const renderLink = () => (\n <Link\n tabIndex={0}\n data-testid={testId}\n $weight={textWeight}\n $selected={selected}\n {...otherItemAttrs}\n aria-current={isRouteSelected ? \"page\" : undefined}\n onClick={handleLinkClick(item, index)}\n {...options}\n >\n <LinkLabel>{children}</LinkLabel>\n {renderIndicator()}\n </Link>\n );\n\n const renderLinkWithSubmenu = (isLastItem: boolean) => {\n const subMenuId = `navbar-submenu-${instanceId}-${item.id}`;\n\n if (mobile) {\n return (\n <>\n <Link\n data-testid={testId}\n $weight={textWeight}\n $selected={selected}\n {...otherItemAttrs}\n aria-current={isRouteSelected ? \"page\" : undefined}\n aria-haspopup=\"menu\"\n aria-expanded={isExpanded}\n onClick={handleLinkClick(item, index)}\n {...options}\n >\n <LinkLabel>{children}</LinkLabel>\n {renderIndicator()}\n {renderMobileChevron()}\n </Link>\n\n {isMobileExpanded && renderMobileSubMenu(subMenu!)}\n </>\n );\n }\n\n return (\n <DesktopMenu\n position={isLastItem ? \"bottom-end\" : \"bottom\"}\n customOffset={0}\n menuContent={renderDesktopSubMenu(subMenu!, subMenuId)}\n triggerOnFocus\n isModal={false}\n onPopoverAppear={() => setOpenSubMenuIndex(index)}\n onPopoverDismiss={() => {\n setOpenSubMenuIndex((prev) =>\n prev === index ? null : prev\n );\n }}\n >\n <LinkButton\n type=\"button\"\n tabIndex={0}\n data-testid={testId}\n $weight={textWeight}\n $selected={selected}\n aria-haspopup=\"menu\"\n aria-expanded={isExpanded}\n {...options}\n >\n <LinkLabel>{children}</LinkLabel>\n {renderIndicator()}\n <ChevronIconDesktop\n $selected={selected}\n $expanded={isExpanded}\n />\n </LinkButton>\n </DesktopMenu>\n );\n };\n\n return (\n <LinkItem key={index} $hiddenBranding={hideNavBranding}>\n {hasSubMenu\n ? renderLinkWithSubmenu(index === items.length - 1)\n : renderLink()}\n </LinkItem>\n );\n };\n\n const renderItems = () =>\n items.map((item, index) => {\n switch (item.itemType) {\n case \"component\": {\n return <li key={index}>{item.children ?? null}</li>;\n }\n case \"link\":\n default: {\n return renderLinkItem(item as NavItemLinkProps<T>, index);\n }\n }\n });\n\n if (items && items.length > 0) {\n return mobile ? (\n <MobileWrapper ref={listRef}>{renderItems()}</MobileWrapper>\n ) : (\n <Wrapper ref={listRef} $alignLeft={hideNavBranding}>\n {renderItems()}\n </Wrapper>\n );\n }\n\n return <></>;\n};\n"],"names":["NavbarItems","items","selectedId","mobile","hideNavBranding","hideLinkIndicator","onItemClick","selectedIndex","setSelectedIndex","useState","showSubMenu","setShowSubMenu","openSubMenuIndex","setOpenSubMenuIndex","listRef","useRef","instanceId","useId","useEffect","handleClickOutside","event","current","contains","target","document","addEventListener","removeEventListener","handleLinkClick","item","index","stopPropagation","_a","subMenu","length","nextExpanded","handleMobileSubLinkClick","renderDesktopSubMenu","subMenuId","_jsx","DesktopMenu","Content","id","children","Section","showDivider","map","subIndex","Link","href","renderMobileSubMenu","MobileMenu","renderLinkItem","options","otherItemAttrs","__rest","hasSubMenu","isRouteSelected","find","s","checkSelected","isMobileExpanded","isExpanded","selected","showIndicator","textWeight","testId","renderIndicator","LinkIndicator","$selected","LinkItem","$hiddenBranding","isLastItem","_jsxs","_Fragment","Object","assign","$weight","undefined","onClick","LinkLabel","LinkIconContainer","ExpandCollapseButton","$expanded","focusHighlight","focusOutline","ChevronIcon","position","customOffset","menuContent","triggerOnFocus","isModal","onPopoverAppear","onPopoverDismiss","prev","LinkButton","type","tabIndex","ChevronIconDesktop","renderLinkWithSubmenu","renderItems","itemType","MobileWrapper","ref","Wrapper","$alignLeft"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"navbar-items.js","sources":["../../src/navbar/navbar-items.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { Menu as DesktopMenu } from \"../menu\";\nimport { TypographyWeight } from \"../typography\";\nimport { Menu as MobileMenu } from \"./menu\";\n\nimport { useId } from \"../util\";\nimport {\n ChevronIcon,\n ChevronIconDesktop,\n ExpandCollapseButton,\n Link,\n LinkButton,\n LinkIconContainer,\n LinkIndicator,\n LinkItem,\n LinkLabel,\n MobileWrapper,\n Wrapper,\n} from \"./navbar-items.styles\";\nimport { NavItemCommonProps, NavItemLinkProps, NavItemProps } from \"./types\";\n\ninterface Props<T> {\n items: NavItemProps<T>[];\n selectedId?: string | undefined;\n /** toggle for mobile or desktop view */\n mobile?: boolean | undefined;\n hideNavBranding?: boolean | undefined;\n /** hide the selected LinkIndicator */\n hideLinkIndicator?: boolean | undefined;\n onItemClick: (\n event: React.MouseEvent<HTMLAnchorElement>,\n item: NavItemProps<T> | NavItemCommonProps<T>\n ) => void;\n}\n\nexport const NavbarItems = <T,>({\n items,\n selectedId,\n mobile = false,\n hideNavBranding,\n hideLinkIndicator = false,\n onItemClick,\n}: Props<T>): JSX.Element => {\n // =============================================================================\n // CONST, STATE, REFS\n // =============================================================================\n const [selectedIndex, setSelectedIndex] = useState<number | null>(null);\n const listRef = useRef<HTMLUListElement>(null);\n const instanceId = useId();\n\n // =============================================================================\n // HELPERS\n // =============================================================================\n const hasSelectedSubMenuItem = (item: NavItemLinkProps<T>): boolean =>\n !!item.subMenu?.some((subItem) => subItem.id === selectedId);\n\n const checkSelected = (item: NavItemLinkProps<T>): boolean =>\n item.id === selectedId || hasSelectedSubMenuItem(item);\n\n const itemIndexWithSelectedSubItem = mobile\n ? items.findIndex(\n (item) =>\n item.itemType !== \"component\" &&\n hasSelectedSubMenuItem(item as NavItemLinkProps<T>)\n )\n : -1;\n const initialExpandedItemIndex =\n itemIndexWithSelectedSubItem < 0 ? null : itemIndexWithSelectedSubItem;\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n\n useEffect(() => {\n if (!mobile) return;\n\n setSelectedIndex(initialExpandedItemIndex);\n }, [mobile, initialExpandedItemIndex]);\n\n useEffect(() => {\n if (mobile) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n listRef.current &&\n !listRef.current.contains(event.target as Node)\n ) {\n setSelectedIndex(null);\n }\n };\n document.addEventListener(\"click\", handleClickOutside, true);\n return () => {\n document.removeEventListener(\"click\", handleClickOutside, true);\n };\n }, [mobile]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleLinkClick = (item: NavItemLinkProps<T>, index: number) => {\n return (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.stopPropagation();\n\n // mobile expands inline when link has submenu\n if (mobile) {\n setSelectedIndex((prev) =>\n item.subMenu?.length && prev !== index ? index : null\n );\n }\n\n onItemClick(event, item);\n };\n };\n\n const handleMobileSubLinkClick = (\n event: React.MouseEvent<HTMLAnchorElement>,\n item: NavItemCommonProps<T>\n ) => {\n event.stopPropagation();\n onItemClick(event, item);\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderDesktopSubMenu = (\n subMenu: NavItemCommonProps<T>[],\n subMenuId: string\n ) => (\n <DesktopMenu.Content id={subMenuId}>\n <DesktopMenu.Section showDivider={false}>\n {subMenu.map((item, subIndex) => (\n <DesktopMenu.Link\n key={`${item.id}-${subIndex}`}\n href={item.href}\n >\n {item.children}\n </DesktopMenu.Link>\n ))}\n </DesktopMenu.Section>\n </DesktopMenu.Content>\n );\n\n const renderMobileSubMenu = (subMenu: NavItemCommonProps<T>[]) => (\n <MobileMenu\n items={subMenu}\n selectedId={selectedId}\n onItemClick={handleMobileSubLinkClick}\n />\n );\n\n const renderLinkItem = (item: NavItemLinkProps<T>, index: number) => {\n const { children, options, subMenu, ...otherItemAttrs } = item;\n\n const hasSubMenu = !!subMenu?.length;\n\n const isRouteSelected = checkSelected(item);\n\n // desktop popover open state\n const isDesktopExpanded =\n !mobile && hasSubMenu && selectedIndex === index;\n\n // mobile inline expanded state\n const isMobileExpanded =\n mobile && hasSubMenu && selectedIndex === index;\n\n const isExpanded = isDesktopExpanded || isMobileExpanded;\n\n const selected =\n !mobile && selectedIndex !== null\n ? selectedIndex === index\n : isRouteSelected;\n\n const showIndicator = !hideLinkIndicator && selected;\n\n const textWeight: TypographyWeight = selected\n ? mobile\n ? \"bold\"\n : \"semibold\"\n : \"regular\";\n\n const testId = mobile\n ? `link__mobile-${index + 1}`\n : `link__${index + 1}`;\n\n const renderIndicator = () =>\n showIndicator ? (\n <LinkIndicator\n data-testid={`${testId}-indicator`}\n $selected={selected}\n />\n ) : null;\n\n const renderMobileChevron = () =>\n mobile && hasSubMenu ? (\n <LinkIconContainer>\n <ExpandCollapseButton\n data-testid={`${testId}-expand-collapse-button`}\n $selected={selected}\n $expanded={isExpanded}\n focusHighlight={false}\n focusOutline=\"browser\"\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n >\n <ChevronIcon $selected={selected} />\n </ExpandCollapseButton>\n </LinkIconContainer>\n ) : null;\n\n const renderLink = () => (\n <Link\n tabIndex={0}\n data-testid={testId}\n $weight={textWeight}\n $selected={selected}\n {...otherItemAttrs}\n aria-current={isRouteSelected ? \"page\" : undefined}\n onClick={handleLinkClick(item, index)}\n {...options}\n >\n <LinkLabel>{children}</LinkLabel>\n {renderIndicator()}\n </Link>\n );\n\n const renderLinkWithSubmenu = (isLastItem: boolean) => {\n const subMenuId = `navbar-submenu-${instanceId}-${item.id}`;\n\n if (mobile) {\n return (\n <>\n <Link\n data-testid={testId}\n $weight={textWeight}\n $selected={selected}\n {...otherItemAttrs}\n aria-current={isRouteSelected ? \"page\" : undefined}\n aria-haspopup=\"menu\"\n aria-expanded={isExpanded}\n onClick={handleLinkClick(item, index)}\n {...options}\n >\n <LinkLabel>{children}</LinkLabel>\n {renderIndicator()}\n {renderMobileChevron()}\n </Link>\n\n {isMobileExpanded && renderMobileSubMenu(subMenu!)}\n </>\n );\n }\n\n return (\n <DesktopMenu\n position={isLastItem ? \"bottom-end\" : \"bottom\"}\n customOffset={0}\n menuContent={renderDesktopSubMenu(subMenu!, subMenuId)}\n triggerOnFocus\n isModal={false}\n onPopoverAppear={() => {\n setSelectedIndex(index);\n }}\n onPopoverDismiss={() => {\n setSelectedIndex((prev) =>\n prev === index ? null : prev\n );\n }}\n >\n <LinkButton\n type=\"button\"\n tabIndex={0}\n data-testid={testId}\n $weight={textWeight}\n $selected={selected}\n aria-haspopup=\"menu\"\n aria-expanded={isExpanded}\n {...options}\n >\n <LinkLabel>{children}</LinkLabel>\n {renderIndicator()}\n <ChevronIconDesktop\n $selected={selected}\n $expanded={isExpanded}\n />\n </LinkButton>\n </DesktopMenu>\n );\n };\n\n return (\n <LinkItem key={index} $hiddenBranding={hideNavBranding}>\n {hasSubMenu\n ? renderLinkWithSubmenu(index === items.length - 1)\n : renderLink()}\n </LinkItem>\n );\n };\n\n const renderItems = () =>\n items.map((item, index) => {\n switch (item.itemType) {\n case \"component\": {\n return <li key={index}>{item.children ?? null}</li>;\n }\n case \"link\":\n default: {\n return renderLinkItem(item as NavItemLinkProps<T>, index);\n }\n }\n });\n\n if (items && items.length > 0) {\n return mobile ? (\n <MobileWrapper ref={listRef}>{renderItems()}</MobileWrapper>\n ) : (\n <Wrapper ref={listRef} $alignLeft={hideNavBranding}>\n {renderItems()}\n </Wrapper>\n );\n }\n\n return <></>;\n};\n"],"names":["NavbarItems","items","selectedId","mobile","hideNavBranding","hideLinkIndicator","onItemClick","selectedIndex","setSelectedIndex","useState","listRef","useRef","instanceId","useId","hasSelectedSubMenuItem","item","_a","subMenu","some","subItem","id","itemIndexWithSelectedSubItem","findIndex","itemType","initialExpandedItemIndex","useEffect","handleClickOutside","event","current","contains","target","document","addEventListener","removeEventListener","handleLinkClick","index","stopPropagation","prev","length","handleMobileSubLinkClick","renderDesktopSubMenu","subMenuId","_jsx","DesktopMenu","Content","children","Section","showDivider","map","subIndex","Link","href","renderMobileSubMenu","MobileMenu","renderLinkItem","options","otherItemAttrs","__rest","hasSubMenu","isRouteSelected","checkSelected","isMobileExpanded","isExpanded","selected","showIndicator","textWeight","testId","renderIndicator","LinkIndicator","$selected","LinkItem","$hiddenBranding","isLastItem","_jsxs","_Fragment","Object","assign","$weight","undefined","onClick","LinkLabel","LinkIconContainer","ExpandCollapseButton","$expanded","focusHighlight","focusOutline","ChevronIcon","position","customOffset","menuContent","triggerOnFocus","isModal","onPopoverAppear","onPopoverDismiss","LinkButton","type","tabIndex","ChevronIconDesktop","renderLinkWithSubmenu","renderItems","MobileWrapper","ref","Wrapper","$alignLeft"],"mappings":"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"}
|