@nd-storybook/storybook 0.3.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.
@@ -0,0 +1,450 @@
1
+ /* DataFrame.css - COMPLETE */
2
+
3
+ /* Main Container */
4
+ .dataframe {
5
+ border: var(--border-width-s) solid var(--color-border-accent-gray);
6
+ padding: var(--spacing-s);
7
+ margin-bottom: var(--spacing-m);
8
+ display: flex;
9
+ flex-direction: column;
10
+ background-color: var(--color-background-default);
11
+ max-width: 799px;
12
+ width: 100%;
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ @media only screen and (min-width: 799px) {
17
+ .dataframe {
18
+ padding: var(--spacing-m);
19
+ }
20
+ }
21
+
22
+ /* Header */
23
+ .dataframe__header {
24
+ display: flex;
25
+ flex-direction: row;
26
+ align-items: center;
27
+ justify-content: space-between;
28
+ gap: var(--spacing-s);
29
+ align-self: stretch;
30
+ margin-bottom: var(--spacing-s);
31
+ flex-wrap: wrap;
32
+ }
33
+
34
+ .dataframe--collapsible .dataframe__header {
35
+ cursor: pointer;
36
+ }
37
+
38
+ .dataframe--collapsible .dataframe__header:hover .dataframe__title {
39
+ text-decoration: underline;
40
+ text-underline-offset: 0.3rem;
41
+ text-decoration-thickness: var(--border-width-s);
42
+ }
43
+
44
+ /* Title */
45
+ .dataframe__title {
46
+ margin: var(--spacing-0);
47
+ color: var(--color-text-default);
48
+ font-family: var(--mijn-nd-heading-fontFamily);
49
+ font-size: var(--mijn-nd-heading-fontSize);
50
+ font-weight: var(--mijn-nd-heading-fontWeight);
51
+ letter-spacing: var(--mijn-nd-heading-letterSpacing);
52
+ line-height: var(--mijn-nd-heading-lineHeight);
53
+ }
54
+
55
+ .dataframe__header-actions {
56
+ display: flex;
57
+ gap: var(--spacing-m);
58
+ align-items: center;
59
+ }
60
+
61
+ /* Edit Button */
62
+ .dataframe__edit-button {
63
+ display: inline-flex;
64
+ align-items: center;
65
+ gap: var(--spacing-xs);
66
+ padding: var(--spacing-xs) var(--spacing-s);
67
+ background-color: var(--color-button-background-pill-default);
68
+ border: var(--border-width-s) solid var(--color-button-border-pill-default);
69
+ border-radius: var(--border-radius-pill);
70
+ color: var(--color-button-text-pill-default);
71
+ font-family: var(--meta-regular-fontFamily);
72
+ font-size: var(--meta-regular-fontSize);
73
+ font-weight: var(--meta-regular-fontWeight);
74
+ letter-spacing: var(--meta-regular-letterSpacing);
75
+ cursor: pointer;
76
+ transition: all 0.2s ease;
77
+ }
78
+
79
+ .dataframe__edit-button:hover {
80
+ background-color: var(--color-button-background-pill-hover);
81
+ border-color: var(--color-button-border-pill-hover);
82
+ color: var(--color-button-text-pill-hover);
83
+ }
84
+
85
+ .dataframe__edit-button svg {
86
+ width: var(--spacing-s);
87
+ height: var(--spacing-s);
88
+ stroke: currentColor;
89
+ }
90
+
91
+ /* Toggle Button */
92
+ .dataframe__toggle-button {
93
+ display: inline-flex;
94
+ align-items: center;
95
+ justify-content: center;
96
+ width: 32px;
97
+ height: 32px;
98
+ background-color: transparent;
99
+ border: none;
100
+ cursor: pointer;
101
+ color: var(--color-icons-gray);
102
+ }
103
+
104
+ .dataframe__toggle-button svg {
105
+ width: var(--spacing-m);
106
+ height: var(--spacing-m);
107
+ }
108
+
109
+ /* Edit Mode Actions */
110
+ .dataframe__edit-actions {
111
+ display: flex;
112
+ gap: var(--spacing-m);
113
+ align-items: center;
114
+ }
115
+
116
+ /* Cancel Button */
117
+ .dataframe__cancel-button {
118
+ background-color: transparent;
119
+ border: none;
120
+ color: var(--color-link-text-default-default);
121
+ font-family: var(--meta-bold-fontFamily);
122
+ font-size: var(--meta-bold-fontSize);
123
+ font-weight: var(--meta-bold-fontWeight);
124
+ letter-spacing: var(--meta-bold-letterSpacing);
125
+ cursor: pointer;
126
+ padding: var(--spacing-0);
127
+ }
128
+
129
+ .dataframe__cancel-button:hover {
130
+ color: var(--color-link-text-default-hover);
131
+ text-decoration: underline;
132
+ }
133
+
134
+ /* Save Button */
135
+ .dataframe__save-button {
136
+ display: flex;
137
+ flex-direction: row;
138
+ align-items: center;
139
+ gap: var(--spacing-xs);
140
+ padding: var(--spacing-xs) var(--spacing-s);
141
+ background-color: var(--color-button-background-primary-default);
142
+ border: var(--border-width-s) solid var(--color-button-background-primary-default);
143
+ color: var(--color-button-text-primary-default);
144
+ font-family: var(--meta-bold-fontFamily);
145
+ font-size: var(--meta-bold-fontSize);
146
+ font-weight: var(--meta-bold-fontWeight);
147
+ letter-spacing: var(--meta-bold-letterSpacing);
148
+ cursor: pointer;
149
+ transition: background-color 0.2s ease, border-color 0.2s ease;
150
+ }
151
+
152
+ .dataframe__save-button:hover:not(:disabled) {
153
+ background-color: var(--color-button-background-primary-hover);
154
+ border-color: var(--color-button-background-primary-hover);
155
+ color: var(--color-button-text-primary-hover);
156
+ }
157
+
158
+ .dataframe__save-button:disabled {
159
+ background-color: var(--color-button-background-primary-disabled);
160
+ border-color: var(--color-button-background-primary-disabled);
161
+ color: var(--color-button-text-primary-disabled);
162
+ cursor: not-allowed;
163
+ opacity: 0.6;
164
+ }
165
+
166
+ .dataframe__save-button svg {
167
+ width: var(--spacing-s);
168
+ height: var(--spacing-s);
169
+ fill: currentColor;
170
+ }
171
+
172
+ /* Content Container - View Mode */
173
+ .dataframe__content {
174
+ display: flex;
175
+ flex-direction: column;
176
+ gap: var(--spacing-s);
177
+ width: 100%;
178
+ }
179
+
180
+ /* DataFrame Item - View Mode */
181
+ .dataframe-item {
182
+ display: flex;
183
+ flex-direction: column;
184
+ gap: var(--spacing-xxs);
185
+ }
186
+
187
+ @media only screen and (min-width: 799px) {
188
+ .dataframe-item {
189
+ flex-direction: row;
190
+ align-items: flex-start;
191
+ gap: var(--spacing-m);
192
+ }
193
+ }
194
+
195
+ /* Labels */
196
+ .dataframe-item__label {
197
+ font-family: var(--mijn-nd-description-fontFamily);
198
+ font-size: var(--mijn-nd-description-fontSize);
199
+ font-weight: var(--mijn-nd-description-fontWeight);
200
+ letter-spacing: var(--mijn-nd-description-letterSpacing);
201
+ line-height: var(--mijn-nd-description-lineHeight);
202
+ color: var(--color-text-default);
203
+ }
204
+
205
+ @media only screen and (min-width: 799px) {
206
+ .dataframe-item__label {
207
+ width: 35%;
208
+ min-width: 10rem;
209
+ flex-shrink: 0;
210
+ }
211
+ }
212
+
213
+ /* Values */
214
+ .dataframe-item__value {
215
+ font-family: var(--body-regular-fontFamily);
216
+ font-size: var(--body-regular-fontSize);
217
+ font-weight: var(--body-regular-fontWeight);
218
+ letter-spacing: var(--body-regular-letterSpacing);
219
+ line-height: var(--body-regular-lineHeight);
220
+ color: var(--color-text-default);
221
+ word-break: break-word;
222
+ }
223
+
224
+ @media only screen and (min-width: 799px) {
225
+ .dataframe-item__value {
226
+ flex: 1;
227
+ min-width: 0;
228
+ }
229
+ }
230
+
231
+ /* Multiline values */
232
+ .dataframe-item__value--multiline {
233
+ white-space: pre-line;
234
+ }
235
+
236
+ /* Edit Mode Content */
237
+ .dataframe__edit-content {
238
+ display: grid;
239
+ grid-template-columns: repeat(12, minmax(0, 1fr));
240
+ gap: var(--spacing-s);
241
+ width: 100%;
242
+ }
243
+
244
+ /* Input Row */
245
+ .dataframe__input-row {
246
+ display: contents;
247
+ }
248
+
249
+ /* Input Container */
250
+ .dataframe__input-container {
251
+ display: flex;
252
+ flex-direction: column;
253
+ gap: var(--spacing-xs);
254
+ grid-column: span 12;
255
+ }
256
+
257
+ /* Desktop grid spans */
258
+ @media only screen and (min-width: 799px) {
259
+ .dataframe__input-container[style*="flex: 1"] {
260
+ grid-column: span 12;
261
+ }
262
+
263
+ .dataframe__input-container[style*="flex: 0 0 50%"] {
264
+ grid-column: span 6;
265
+ }
266
+
267
+ .dataframe__input-container[style*="flex: 0 0 33.333%"] {
268
+ grid-column: span 4;
269
+ }
270
+ }
271
+
272
+ /* Input Label */
273
+ .dataframe__input-label {
274
+ font-family: var(--mijn-nd-description-fontFamily);
275
+ font-size: var(--mijn-nd-description-fontSize);
276
+ font-weight: var(--mijn-nd-description-fontWeight);
277
+ letter-spacing: var(--mijn-nd-description-letterSpacing);
278
+ line-height: var(--mijn-nd-description-lineHeight);
279
+ color: var(--color-text-default);
280
+ }
281
+
282
+ /* Input Fields */
283
+ .dataframe__input {
284
+ font-family: var(--body-regular-fontFamily);
285
+ font-size: var(--body-regular-fontSize);
286
+ font-weight: var(--body-regular-fontWeight);
287
+ border: var(--border-width-s) solid var(--color-form-border-input-field-default);
288
+ border-radius: var(--border-radius-0);
289
+ padding: var(--spacing-xs) var(--spacing-s);
290
+ background-color: var(--color-form-background-input-field-default);
291
+ color: var(--color-text-default);
292
+ line-height: var(--body-regular-lineHeight);
293
+ min-height: 42px;
294
+ width: 100%;
295
+ transition: background-color 0.2s ease, border-color 0.2s ease;
296
+ }
297
+
298
+ .dataframe__input:hover {
299
+ cursor: text;
300
+ background-color: var(--color-form-background-input-field-hover);
301
+ border-color: var(--color-form-border-input-field-hover);
302
+ }
303
+
304
+ .dataframe__input:focus {
305
+ outline: none;
306
+ border-color: var(--color-form-border-input-field-active);
307
+ background-color: var(--color-form-background-input-field-active);
308
+ }
309
+
310
+ .dataframe__input:disabled {
311
+ background-color: var(--color-form-background-input-field-disabled);
312
+ border-color: var(--color-form-border-input-field-disabled);
313
+ color: var(--color-text-disabled);
314
+ cursor: not-allowed;
315
+ }
316
+
317
+ /* Skeleton Loading */
318
+ .dataframe-item__skeleton-container {
319
+ display: flex;
320
+ flex-direction: row;
321
+ flex-wrap: wrap;
322
+ gap: var(--spacing-s);
323
+ row-gap: var(--spacing-xs);
324
+ }
325
+
326
+ .dataframe-item__skeleton {
327
+ display: block;
328
+ background-color: var(--color-background-accent-gray);
329
+ width: 12rem;
330
+ height: 22px;
331
+ position: relative;
332
+ overflow: hidden;
333
+ }
334
+
335
+ .dataframe-item__skeleton::after {
336
+ content: "";
337
+ position: absolute;
338
+ top: 0;
339
+ right: 0;
340
+ bottom: 0;
341
+ left: 0;
342
+ background-image: linear-gradient(
343
+ 90deg,
344
+ var(--color-neutral-white-30) 0,
345
+ rgba(255, 255, 255, 0.2) 20%,
346
+ rgba(255, 255, 255, 0.5) 60%,
347
+ var(--color-neutral-white-30)
348
+ );
349
+ animation: shimmer 20s infinite linear;
350
+ }
351
+
352
+ @keyframes shimmer {
353
+ 0% {
354
+ background-position: -1000px 0;
355
+ }
356
+ 100% {
357
+ background-position: 1000px 0;
358
+ }
359
+ }
360
+
361
+ /* Skeleton size variations */
362
+ .dataframe-item__skeleton--sm {
363
+ width: 4rem;
364
+ }
365
+
366
+ .dataframe-item__skeleton--md {
367
+ width: 8rem;
368
+ }
369
+
370
+ .dataframe-item__skeleton--lg {
371
+ width: 15rem;
372
+ }
373
+
374
+ /* Actions Section */
375
+ .dataframe__actions {
376
+ display: flex;
377
+ gap: var(--spacing-s);
378
+ margin-top: var(--spacing-s);
379
+ flex-direction: column;
380
+ }
381
+
382
+ @media only screen and (min-width: 799px) {
383
+ .dataframe__actions {
384
+ flex-direction: row;
385
+ margin-top: var(--spacing-m);
386
+ }
387
+ }
388
+
389
+ /* Action Buttons */
390
+ .dataframe__action-button {
391
+ display: inline-flex;
392
+ align-items: center;
393
+ gap: var(--spacing-xs);
394
+ padding: var(--spacing-xs) var(--spacing-s);
395
+ background-color: var(--color-button-background-pill-default);
396
+ border: var(--border-width-s) solid var(--color-button-border-pill-default);
397
+ border-radius: var(--border-radius-pill);
398
+ color: var(--color-button-text-pill-default);
399
+ font-family: var(--meta-regular-fontFamily);
400
+ font-size: var(--meta-regular-fontSize);
401
+ font-weight: var(--meta-regular-fontWeight);
402
+ letter-spacing: var(--meta-regular-letterSpacing);
403
+ cursor: pointer;
404
+ transition: all 0.2s ease;
405
+ }
406
+
407
+ .dataframe__action-button:hover {
408
+ background-color: var(--color-button-background-pill-hover);
409
+ border-color: var(--color-button-border-pill-hover);
410
+ color: var(--color-button-text-pill-hover);
411
+ }
412
+
413
+ .dataframe__action-button svg {
414
+ width: var(--spacing-s);
415
+ height: var(--spacing-s);
416
+ stroke: currentColor;
417
+ }
418
+
419
+ /* DataFrames Container */
420
+ .dataframes {
421
+ display: flex;
422
+ flex-direction: column;
423
+ gap: var(--spacing-m);
424
+ max-width: 799px;
425
+ width: 100%;
426
+ }
427
+
428
+ /* Alert inside DataFrame */
429
+ .dataframe .alert {
430
+ margin-bottom: var(--spacing-m);
431
+ width: 100%;
432
+ }
433
+
434
+ /* Dark mode support */
435
+ @media (prefers-color-scheme: dark) {
436
+ .dataframe {
437
+ background-color: var(--color-background-default);
438
+ border-color: var(--color-border-accent-gray);
439
+ }
440
+
441
+ .dataframe__input {
442
+ background-color: var(--color-background-dark);
443
+ border-color: var(--color-border-accent-gray);
444
+ color: var(--color-text-inverse);
445
+ }
446
+
447
+ .dataframe-item__skeleton {
448
+ background-color: var(--color-background-accent-gray);
449
+ }
450
+ }
@@ -0,0 +1,37 @@
1
+ @layer components {
2
+ .description-list-container {
3
+ @apply flex flex-col w-full mb-4 border border-gray-200 p-5 bg-white shadow-sm font-fira-sans;
4
+ }
5
+
6
+ .description-list-header {
7
+ @apply flex justify-between items-center mb-5;
8
+ }
9
+
10
+ .description-list-title {
11
+ @apply text-heading-2;
12
+ }
13
+
14
+ .description-list-actions {
15
+ @apply flex gap-2;
16
+ }
17
+
18
+ .description-list {
19
+ @apply grid w-full gap-y-4 gap-x-4 grid-cols-1 md:grid-cols-3 md:w-1/2;
20
+ }
21
+
22
+ .description-list-item {
23
+ @apply contents; /* Use 'contents' to keep dt and dd in the parent grid */
24
+ }
25
+
26
+ .description-list-term {
27
+ @apply text-lg text-gray-500 font-light md:col-span-1;
28
+ }
29
+
30
+ .description-list-description {
31
+ @apply text-lg leading-snug text-gray-900 m-0 md:col-span-2;
32
+ }
33
+
34
+ .description-list-footer {
35
+ @apply mt-5 pt-4 pb-2 border-t border-gray-200 text-sm font-normal leading-snug text-gray-500;
36
+ }
37
+ }
@@ -0,0 +1,93 @@
1
+ /* Menu Item Component Styles - Using Design System Tokens */
2
+
3
+ .menu-item {
4
+ position: relative;
5
+ padding: 0;
6
+ background: transparent;
7
+ border: none;
8
+ text-decoration: none;
9
+ min-width: fit-content;
10
+ }
11
+
12
+ /* Text styling - inherits from text-menu-menu-primary utility class */
13
+ .menu-item span {
14
+ /* Typography is applied via text-menu-menu-primary class which includes:
15
+ - font-family: Fira Sans
16
+ - font-size: 22px
17
+ - font-weight: 400
18
+ - line-height: 140%
19
+ - letter-spacing: 0
20
+ - font-variant: all-small-caps
21
+ */
22
+ color: var(--color-text-default);
23
+ display: block;
24
+ white-space: nowrap;
25
+ }
26
+
27
+ /* Underline element */
28
+ .menu-item__underline {
29
+ height: var(--border-width-s); /* Using your border-width-medium token (2px) */
30
+ width: 100%;
31
+ margin-top: var(--spacing-xxs);
32
+ background-color: transparent;
33
+ transition: background-color 200ms ease-in-out;
34
+ }
35
+
36
+ /* States */
37
+ .menu-item[data-state="default"] .menu-item__underline {
38
+ background-color: transparent;
39
+ }
40
+
41
+ .menu-item[data-state="hover"] .menu-item__underline,
42
+ .menu-item:hover .menu-item__underline {
43
+ background-color: var(--color-border-accent-gray);
44
+ }
45
+
46
+ .menu-item[data-state="active"] .menu-item__underline,
47
+ .menu-item.active .menu-item__underline {
48
+ background-color: var(--color-border-brand);
49
+ }
50
+
51
+ /* Focus styles for accessibility */
52
+ .menu-item:focus {
53
+ outline: 2px solid var(--color-border-brand);
54
+ outline-offset: 4px;
55
+ }
56
+
57
+ .menu-item:focus:not(:focus-visible) {
58
+ outline: none;
59
+ }
60
+
61
+ /* Container styles */
62
+ .menu-items {
63
+ display: flex;
64
+ align-items: flex-start;
65
+ }
66
+
67
+ /* Horizontal menu layout */
68
+ .menu-items.horizontal {
69
+ flex-direction: row;
70
+ gap: var(--spacing-l); /* Using your spacing-l token (40px) */
71
+ }
72
+
73
+ /* Vertical menu layout */
74
+ .menu-items.vertical {
75
+ flex-direction: column;
76
+ gap: var(--spacing-xs); /* Using your spacing-xs token (8px) */
77
+ }
78
+
79
+ .menu-items.vertical .menu-item {
80
+ width: 100%;
81
+ text-align: left;
82
+ }
83
+
84
+ .menu-items.vertical .menu-item span {
85
+ text-align: left;
86
+ }
87
+
88
+ /* Responsive behavior */
89
+ @media (max-width: 768px) {
90
+ .menu-items.horizontal {
91
+ gap: var(--spacing-m); /* Smaller gap on mobile */
92
+ }
93
+ }
@@ -0,0 +1,86 @@
1
+ /* Navigation Cards Component Styles - Using Only Design System Tokens */
2
+
3
+ .navigation-cards {
4
+ display: grid;
5
+ grid-template-columns: 1fr;
6
+ grid-gap: var(--spacing-m); /* 16px based on your tokens */
7
+ gap: var(--spacing-m);
8
+ }
9
+
10
+ @media (min-width: 768px) {
11
+ .navigation-cards {
12
+ grid-template-columns: repeat(3, 1fr);
13
+ }
14
+ }
15
+
16
+ .navigation-card {
17
+ display: flex;
18
+ flex-direction: row;
19
+ align-items: center;
20
+ gap: var(--spacing-m); /* Space between icon and content */
21
+ padding-left: var(--spacing-l);
22
+ padding-right: var(--spacing-l);
23
+ padding-top: 29px;
24
+ padding-bottom: 29px;
25
+
26
+ /* Using your border tokens */
27
+ border-width: var(--border-width-s);
28
+ border-style: solid;
29
+ border-color: var(--color-border-accent-gray-subtle);
30
+ background-color: var(--color-background-default);
31
+
32
+ /* Transition */
33
+ transition: border-color 200ms ease-in-out;
34
+ text-decoration: none;
35
+ display: flex; /* Ensure it's a flex container */
36
+ }
37
+
38
+ .navigation-card:hover {
39
+ border-color: var(--color-border-brand);
40
+ }
41
+
42
+ .navigation-card__icon {
43
+ flex-shrink: 0;
44
+ width: 16px;
45
+ height: 16px;
46
+ color: var(--color-icons-default);
47
+ }
48
+
49
+ .navigation-card__content {
50
+ display: flex;
51
+ flex-direction: column;
52
+ align-items: flex-start;
53
+ justify-content: flex-start;
54
+ min-width: 0;
55
+ flex: 1;
56
+ gap: var(--spacing-xs); /* Space between title and description */
57
+ }
58
+
59
+ .navigation-card__title {
60
+ /* Using MijnND heading tokens */
61
+ font-family: var(--mijn-nd-heading-fontFamily);
62
+ font-size: var(--mijn-nd-heading-fontSize);
63
+ font-weight: var(--mijn-nd-heading-fontWeight);
64
+ line-height: var(--mijn-nd-heading-lineHeight);
65
+ letter-spacing: var(--mijn-nd-heading-letterSpacing);
66
+ text-decoration: none;
67
+ color: var(--color-text-default);
68
+ margin: 0;
69
+ }
70
+
71
+ .navigation-card:hover .navigation-card__title {
72
+ text-decoration: underline;
73
+ text-underline-offset: 25%;
74
+ }
75
+
76
+ .navigation-card__description {
77
+ /* Using MijnND description tokens */
78
+ font-family: var(--mijn-nd-description-fontFamily);
79
+ font-size: var(--mijn-nd-description-fontSize);
80
+ font-weight: var(--mijn-nd-description-fontWeight);
81
+ line-height: var(--mijn-nd-description-lineHeight);
82
+ letter-spacing: var(--mijn-nd-description-letterSpacing);
83
+ text-decoration: none;
84
+ color: var(--color-text-default);
85
+ margin: 0;
86
+ }
@@ -0,0 +1,45 @@
1
+ @layer components {
2
+ .portal-nav {
3
+ @apply flex flex-row gap-10 font-gulliver text-xl;
4
+ }
5
+
6
+ .portal-nav a {
7
+ @apply no-underline text-black hover:underline dark:text-white;
8
+ }
9
+
10
+ .portal-nav a .icon {
11
+ @apply hidden;
12
+ }
13
+
14
+ .portal-nav a.is-active {
15
+ @apply font-bold underline text-blue-400 underline-offset-[0.3rem] decoration-[0.05rem];
16
+ }
17
+
18
+ .portal-nav-mobile {
19
+ @apply flex-col gap-0;
20
+ }
21
+
22
+ .portal-nav-mobile li {
23
+ @apply w-full flex border-b border-black dark:border-white;
24
+ }
25
+
26
+ .portal-nav-mobile li a {
27
+ @apply flex flex-row justify-between items-center w-full pt-5 pb-5;
28
+ }
29
+
30
+ .portal-nav-mobile li:first-child a {
31
+ @apply pt-0;
32
+ }
33
+
34
+ .portal-nav-mobile li a .icon {
35
+ @apply flex;
36
+ }
37
+
38
+ .portal-nav-mobile-header {
39
+ @apply flex flex-row items-center gap-2;
40
+ }
41
+
42
+ .portal-nav-mobile-title {
43
+ @apply font-sans text-xl font-bold underline text-blue-400 underline-offset-[0.3rem] decoration-[0.05rem];
44
+ }
45
+ }