@conduction/components 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/.prettierrc +29 -0
  2. package/README.md +1 -0
  3. package/lib/components/card/HorizontalImageCard/HorizontalImageCard.d.ts +13 -0
  4. package/lib/components/card/HorizontalImageCard/HorizontalImageCard.js +9 -0
  5. package/lib/components/card/HorizontalImageCard/HorizontalImageCard.module.css +26 -0
  6. package/lib/components/card/RichContentCard/RichContentCard.d.ts +19 -0
  7. package/lib/components/card/RichContentCard/RichContentCard.js +17 -0
  8. package/lib/components/card/RichContentCard/RichContentCard.module.css +100 -0
  9. package/lib/components/card/downloadCard/DownloadCard.d.ts +9 -0
  10. package/lib/components/card/downloadCard/DownloadCard.js +10 -0
  11. package/lib/components/card/downloadCard/DownloadCard.module.css +23 -0
  12. package/lib/components/card/imageAndDetailsCard/ImageAndDetailsCard.d.ts +14 -0
  13. package/lib/components/card/imageAndDetailsCard/ImageAndDetailsCard.js +9 -0
  14. package/lib/components/card/imageAndDetailsCard/ImageAndDetailsCard.module.css +54 -0
  15. package/lib/components/card/index.d.ts +5 -0
  16. package/lib/components/card/index.js +5 -0
  17. package/lib/components/casesTable/CasesTable.d.ts +6 -0
  18. package/lib/components/casesTable/CasesTable.js +11 -0
  19. package/lib/components/casesTable/CasesTable.module.css +4 -0
  20. package/lib/components/container/Container.d.ts +2 -0
  21. package/lib/components/container/Container.js +3 -0
  22. package/lib/components/container/Container.module.css +5 -0
  23. package/lib/components/denhaag-wrappers/breadcrumbs/Breadcrumbs.css +222 -0
  24. package/lib/components/denhaag-wrappers/breadcrumbs/Breadcrumbs.d.ts +17 -0
  25. package/lib/components/denhaag-wrappers/breadcrumbs/Breadcrumbs.js +20 -0
  26. package/lib/components/editableTableRow/EditableTableRow.d.ts +11 -0
  27. package/lib/components/editableTableRow/EditableTableRow.js +34 -0
  28. package/lib/components/editableTableRow/EditableTableRow.module.css +25 -0
  29. package/lib/components/formFields/checkbox.d.ts +3 -0
  30. package/lib/components/formFields/checkbox.js +3 -0
  31. package/lib/components/formFields/index.d.ts +4 -0
  32. package/lib/components/formFields/index.js +4 -0
  33. package/lib/components/formFields/input.d.ts +7 -0
  34. package/lib/components/formFields/input.js +12 -0
  35. package/lib/components/formFields/textarea.d.ts +3 -0
  36. package/lib/components/formFields/textarea.js +3 -0
  37. package/lib/components/formFields/types.d.ts +20 -0
  38. package/lib/components/formFields/types.js +1 -0
  39. package/lib/components/imageDivider/ImageDivider.d.ts +7 -0
  40. package/lib/components/imageDivider/ImageDivider.js +6 -0
  41. package/lib/components/imageDivider/imageDivider.module.css +5 -0
  42. package/lib/components/logo/Logo.d.ts +8 -0
  43. package/lib/components/logo/Logo.js +10 -0
  44. package/lib/components/logo/Logo.module.css +15 -0
  45. package/lib/components/messageForm/MessageForm.d.ts +2 -0
  46. package/lib/components/messageForm/MessageForm.js +12 -0
  47. package/lib/components/messagesTable/MessagesTable.d.ts +11 -0
  48. package/lib/components/messagesTable/MessagesTable.js +11 -0
  49. package/lib/components/messagesTable/MessagesTable.module.css +4 -0
  50. package/lib/components/metaIcon/MetaIcon.d.ts +7 -0
  51. package/lib/components/metaIcon/MetaIcon.js +3 -0
  52. package/lib/components/metaIcon/MetaIcon.module.css +17 -0
  53. package/lib/components/privateRoute/PrivateRoute.d.ts +6 -0
  54. package/lib/components/privateRoute/PrivateRoute.js +15 -0
  55. package/lib/components/statusSteps/StatusSteps.d.ts +13 -0
  56. package/lib/components/statusSteps/StatusSteps.js +5 -0
  57. package/lib/components/topNav/TopNav.d.ts +12 -0
  58. package/lib/components/topNav/TopNav.js +10 -0
  59. package/lib/components/topNav/TopNav.module.css +22 -0
  60. package/lib/index.d.ts +15 -0
  61. package/lib/index.js +15 -0
  62. package/package.json +56 -0
  63. package/src/components/card/HorizontalImageCard/HorizontalImageCard.js +9 -0
  64. package/src/components/card/HorizontalImageCard/HorizontalImageCard.module.css +26 -0
  65. package/src/components/card/HorizontalImageCard/HorizontalImageCard.tsx +37 -0
  66. package/src/components/card/RichContentCard/RichContentCard.js +17 -0
  67. package/src/components/card/RichContentCard/RichContentCard.module.css +100 -0
  68. package/src/components/card/RichContentCard/RichContentCard.tsx +105 -0
  69. package/src/components/card/downloadCard/DownloadCard.js +10 -0
  70. package/src/components/card/downloadCard/DownloadCard.module.css +23 -0
  71. package/src/components/card/downloadCard/DownloadCard.tsx +33 -0
  72. package/src/components/card/imageAndDetailsCard/ImageAndDetailsCard.js +9 -0
  73. package/src/components/card/imageAndDetailsCard/ImageAndDetailsCard.module.css +54 -0
  74. package/src/components/card/imageAndDetailsCard/ImageAndDetailsCard.tsx +49 -0
  75. package/src/components/card/index.js +5 -0
  76. package/src/components/card/index.tsx +6 -0
  77. package/src/components/casesTable/CasesTable.js +11 -0
  78. package/src/components/casesTable/CasesTable.module.css +4 -0
  79. package/src/components/casesTable/CasesTable.tsx +41 -0
  80. package/src/components/container/Container.js +3 -0
  81. package/src/components/container/Container.module.css +5 -0
  82. package/src/components/container/Container.tsx +4 -0
  83. package/src/components/denhaag-wrappers/breadcrumbs/Breadcrumbs.css +222 -0
  84. package/src/components/denhaag-wrappers/breadcrumbs/Breadcrumbs.js +20 -0
  85. package/src/components/denhaag-wrappers/breadcrumbs/Breadcrumbs.tsx +89 -0
  86. package/src/components/editableTableRow/EditableTableRow.js +34 -0
  87. package/src/components/editableTableRow/EditableTableRow.module.css +25 -0
  88. package/src/components/editableTableRow/EditableTableRow.tsx +130 -0
  89. package/src/components/formFields/checkbox.js +3 -0
  90. package/src/components/formFields/checkbox.tsx +9 -0
  91. package/src/components/formFields/index.js +4 -0
  92. package/src/components/formFields/index.tsx +5 -0
  93. package/src/components/formFields/input.js +12 -0
  94. package/src/components/formFields/input.tsx +88 -0
  95. package/src/components/formFields/textarea.js +3 -0
  96. package/src/components/formFields/textarea.tsx +7 -0
  97. package/src/components/formFields/types.js +1 -0
  98. package/src/components/formFields/types.ts +24 -0
  99. package/src/components/imageDivider/ImageDivider.js +6 -0
  100. package/src/components/imageDivider/ImageDivider.tsx +12 -0
  101. package/src/components/imageDivider/imageDivider.module.css +5 -0
  102. package/src/components/logo/Logo.js +10 -0
  103. package/src/components/logo/Logo.module.css +15 -0
  104. package/src/components/logo/Logo.tsx +25 -0
  105. package/src/components/messageForm/MessageForm.js +12 -0
  106. package/src/components/messageForm/MessageForm.tsx +32 -0
  107. package/src/components/messagesTable/MessagesTable.js +11 -0
  108. package/src/components/messagesTable/MessagesTable.module.css +4 -0
  109. package/src/components/messagesTable/MessagesTable.tsx +45 -0
  110. package/src/components/metaIcon/MetaIcon.js +3 -0
  111. package/src/components/metaIcon/MetaIcon.module.css +17 -0
  112. package/src/components/metaIcon/MetaIcon.tsx +18 -0
  113. package/src/components/privateRoute/PrivateRoute.js +15 -0
  114. package/src/components/privateRoute/PrivateRoute.tsx +22 -0
  115. package/src/components/statusSteps/StatusSteps.js +5 -0
  116. package/src/components/statusSteps/StatusSteps.tsx +54 -0
  117. package/src/components/topNav/TopNav.js +10 -0
  118. package/src/components/topNav/TopNav.module.css +22 -0
  119. package/src/components/topNav/TopNav.tsx +46 -0
  120. package/src/custom.d.ts +5 -0
  121. package/src/index.js +14 -0
  122. package/src/index.ts +50 -0
  123. package/tsconfig.json +18 -0
@@ -0,0 +1,222 @@
1
+ .denhaag-breadcrumb {
2
+ --denhaag-breadcrumb-chevron-display: none;
3
+ --denhaag-breadcrumb-link-background-color: transparent;
4
+ --denhaag-breadcrumb-link-icon-content: "";
5
+ --denhaag-breadcrumb-link-pointer-events: bounding-box;
6
+ --denhaag-breadcrumb-item-display: none;
7
+
8
+ background-color: var(--denhaag-breadcrumb-background-color, transparent);
9
+ color: var(--denhaag-breadcrumb-color, inherit);
10
+ padding-block-end: var(--denhaag-breadcrumb-padding-block);
11
+ padding-block-start: var(--denhaag-breadcrumb-padding-block);
12
+ padding-inline-end: var(--denhaag-breadcrumb-padding-inline);
13
+ padding-inline-start: var(--denhaag-breadcrumb-padding-inline);
14
+ }
15
+
16
+ .denhaag-breadcrumb__list {
17
+ block-size: 100%;
18
+ display: flex;
19
+ margin-block-end: 0;
20
+ margin-block-start: 0;
21
+ margin-inline-end: auto;
22
+ margin-inline-start: auto;
23
+ max-width: var(--denhaag-breadcrumb-list-max-width, 100%);
24
+ }
25
+
26
+ ol.denhaag-breadcrumb__list {
27
+ list-style: none;
28
+ padding-inline-start: 0;
29
+ }
30
+
31
+ .denhaag-breadcrumb__item {
32
+ align-items: center;
33
+ display: var(--denhaag-breadcrumb-item-display);
34
+ }
35
+
36
+ .denhaag-breadcrumb__item:nth-last-child(2) {
37
+ --denhaag-breadcrumb-item-display: flex;
38
+ }
39
+
40
+ .denhaag-breadcrumb__item:nth-last-child(2)
41
+ > .denhaag-breadcrumb__link::before {
42
+ background: var(--denhaag-breadcrumb-link-color);
43
+ clip-path: path(
44
+ "M6.756 12.0899C6.43057 12.4153 5.90293 12.4153 5.57749 12.0899L0.577491 7.0899C0.421212 6.93362 0.333414 6.72166 0.333414 6.50065C0.333414 6.27964 0.421212 6.06767 0.577491 5.91139L5.57749 0.911394C5.90293 0.585957 6.43057 0.585957 6.756 0.911394C7.08144 1.23683 7.08144 1.76447 6.756 2.08991L3.17859 5.66732L12.8334 5.66732C13.2937 5.66732 13.6667 6.04041 13.6667 6.50065C13.6667 6.96089 13.2937 7.33398 12.8334 7.33398L3.17859 7.33398L6.756 10.9114C7.08144 11.2368 7.08144 11.7645 6.756 12.0899Z"
45
+ );
46
+ content: var(--denhaag-breadcrumb-link-icon-content);
47
+ height: var(
48
+ --denhaag-breadcrumb-link-icon-height,
49
+ var(--denhaag-breadcrumb-link-icon-width)
50
+ );
51
+ margin-inline-end: var(
52
+ --denhaag-breadcrumb-link-icon-margin-inline,
53
+ var(--denhaag-breadcrumb-link-icon-width)
54
+ );
55
+ width: var(--denhaag-breadcrumb-link-icon-width);
56
+ }
57
+
58
+ .denhaag-breadcrumb__item:not(:first-child):not(:nth-last-child(2)):not(:last-child) {
59
+ --denhaag-breadcrumb-link-background-color: var(
60
+ --denhaag-breadcrumb-dots-background-color,
61
+ inherit
62
+ );
63
+ }
64
+
65
+ .denhaag-breadcrumb__item:not(:first-child):not(:nth-last-child(2)):not(:last-child):hover {
66
+ --denhaag-breadcrumb-link-background-color: var(
67
+ --denhaag-breadcrumb-dots-hover-background-color,
68
+ inherit
69
+ );
70
+ }
71
+
72
+ .denhaag-breadcrumb__link {
73
+ align-items: center;
74
+ color: var(--denhaag-breadcrumb-link-color, inherit);
75
+ display: flex;
76
+ padding-block-start: var(--denhaag-breadcrumb-spacing, 8px);
77
+ padding-block-end: var(--denhaag-breadcrumb-spacing, 8px);
78
+ padding-inline-start: var(--denhaag-breadcrumb-spacing, 8px);
79
+ padding-inline-end: var(--denhaag-breadcrumb-spacing, 8px);
80
+ pointer-events: var(--denhaag-breadcrumb-link-pointer-events);
81
+ position: relative;
82
+ }
83
+
84
+ .denhaag-breadcrumb__link:hover,
85
+ .denhaag-breadcrumb__link--hover {
86
+ --denhaag-breadcrumb-link-color: var(
87
+ --denhaag-breadcrumb-link-hover-color,
88
+ inherit
89
+ );
90
+ }
91
+
92
+ .denhaag-breadcrumb__link:focus,
93
+ .denhaag-breadcrumb__link--focus {
94
+ --denhaag-breadcrumb-link-color: var(
95
+ --denhaag-breadcrumb-link-focus-color,
96
+ inherit
97
+ );
98
+
99
+ outline: var(
100
+ --denhaag-breadcrumb-link-focus-outline,
101
+ var(--denhaag-link-focus-outline)
102
+ );
103
+ }
104
+
105
+ .denhaag-breadcrumb__link--current,
106
+ .denhaag-breadcrumb__link.denhaag-link--current,
107
+ .denhaag-breadcrumb__item:last-child > .denhaag-breadcrumb__link {
108
+ --denhaag-breadcrumb-link-color: var(
109
+ --denhaag-breadcrumb-current-color,
110
+ var(--denhaag-breadcrumb-color, inherit)
111
+ );
112
+
113
+ text-decoration: none;
114
+ }
115
+
116
+ .denhaag-breadcrumb__link:not(.denhaag-breadcrumb__link--current):not(.denhaag-breadcrumb__link.denhaag-link--current):not(:last-child
117
+ > .denhaag-breadcrumb__link)
118
+ > :first-child {
119
+ pointer-events: bounding-box;
120
+ }
121
+
122
+ /* SVG for the separator */
123
+ .denhaag-breadcrumb__link > .denhaag-icon + .denhaag-icon,
124
+ .denhaag-breadcrumb__link > .denhaag-breadcrumb__text + .denhaag-icon {
125
+ color: initial;
126
+ font-size: inherit;
127
+ display: var(--denhaag-breadcrumb-chevron-display);
128
+ margin-inline-start: var(--denhaag-breadcrumb-spacing, 8px);
129
+ margin-inline-end: calc(-1 * var(--denhaag-breadcrumb-spacing, 8px));
130
+ }
131
+
132
+ [dir="rtl"]
133
+ .denhaag-breadcrumb__link
134
+ > .denhaag-breadcrumb__text
135
+ + .denhaag-icon,
136
+ [dir="rtl"]
137
+ .denhaag-breadcrumb__item:nth-last-child(2)
138
+ > .denhaag-breadcrumb__link::before {
139
+ transform: scaleX(-1);
140
+ }
141
+
142
+ .denhaag-breadcrumb__text {
143
+ background-color: var(--denhaag-breadcrumb-link-background-color);
144
+ overflow: hidden;
145
+ position: relative;
146
+ text-overflow: ellipsis;
147
+ }
148
+
149
+ .denhaag-breadcrumb__item:not(:first-child):not(:nth-last-child(2)):not(:last-child)
150
+ .denhaag-breadcrumb__text {
151
+ aspect-ratio: 24/16;
152
+ border-radius: var(
153
+ --denhaag-breadcrumb-dots-border-radius,
154
+ var(--denhaag-border-radius)
155
+ );
156
+ max-width: calc(var(--denhaag-breadcrumb-spacing, 8px) * 3);
157
+ text-indent: calc(var(--denhaag-breadcrumb-spacing, 8px) * 3);
158
+ }
159
+
160
+ .denhaag-breadcrumb__item:not(:first-child):not(:nth-last-child(2)):not(:last-child)
161
+ .denhaag-breadcrumb__text::before {
162
+ color: var(--denhaag-breadcrumb-dots-color, inherit);
163
+ content: "...";
164
+ left: calc(50% - 7px);
165
+ line-height: 0;
166
+ position: absolute;
167
+ text-indent: 0;
168
+ top: calc(50% - 5px);
169
+ vertical-align: baseline;
170
+ }
171
+
172
+ @media (min-width: 481px) {
173
+ .denhaag-breadcrumb {
174
+ --denhaag-breadcrumb-chevron-display: inline-block;
175
+ --denhaag-breadcrumb-link-icon-content: unset;
176
+ --denhaag-breadcrumb-link-pointer-events: none;
177
+ --denhaag-breadcrumb-padding-block: var(
178
+ --denhaag-breadcrumb-padding-block-md
179
+ );
180
+ }
181
+
182
+ .denhaag-breadcrumb__item:not(:nth-last-child(2)) {
183
+ --denhaag-breadcrumb-item-display: flex;
184
+ }
185
+ }
186
+
187
+ @media (min-width: 1124px) {
188
+ .denhaag-breadcrumb {
189
+ --denhaag-breadcrumb-padding-inline: 0;
190
+ }
191
+ }
192
+
193
+ :root {
194
+ --denhaag-breadcrumb-link-hover-color: var(--denhaag-color-blue-4);
195
+ --denhaag-breadcrumb-link-focus-color: var(--denhaag-color-blue-4);
196
+ --denhaag-breadcrumb-link-color: var(--denhaag-color-blue-3);
197
+ --denhaag-breadcrumb-dots-hover-background-color: var(--denhaag-color-grey-2);
198
+ --denhaag-breadcrumb-dots-color: var(--denhaag-color-grey-3);
199
+ --denhaag-breadcrumb-dots-border-radius: var(--denhaag-border-radius);
200
+ --denhaag-breadcrumb-dots-background-color: var(--denhaag-color-grey-1);
201
+ --denhaag-breadcrumb-current-color: var(--denhaag-color-grey-4);
202
+ --denhaag-breadcrumb-spacing: var(--denhaag-space-inline-xs);
203
+ --denhaag-breadcrumb-color: var(--denhaag-color-grey-4);
204
+ --denhaag-breadcrumb-background-color: var(--denhaag-color-warmgrey-1);
205
+ --denhaag-breadcrumb-link-focus-outline: var(--denhaag-focus-border);
206
+ --utrecht-breadcrumb-item-padding-inline-start: 14px;
207
+ --utrecht-breadcrumb-item-padding-inline-end: 14px;
208
+ --utrecht-breadcrumb-divider-inline-size: 24px;
209
+ --utrecht-breadcrumb-divider-content: ›;
210
+ --denhaag-breadcrumb-list-max-width: 67.5rem;
211
+ --denhaag-breadcrumb-link-icon-margin-inline: 0.75rem;
212
+ --denhaag-breadcrumb-link-icon-width: 0.875rem;
213
+ --denhaag-breadcrumb-link-icon-height: 0.875rem;
214
+ --denhaag-breadcrumb-padding-inline: 0.75rem;
215
+ --denhaag-breadcrumb-padding-block-md: 0.75rem;
216
+ --denhaag-breadcrumb-padding-block: 1rem;
217
+ --utrecht-breadcrumb-link-focus-color: var(--denhaag-color-blue-3);
218
+ --utrecht-breadcrumb-link-color: var(--denhaag-color-blue-4);
219
+ --utrecht-breadcrumb-font-size: var(
220
+ --denhaag-typography-scale-base-font-size
221
+ );
222
+ }
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * This is a wrapper element based on https://nl-design-system.github.io/denhaag/?path=/docs/css-navigation-breadcrumb--default-story
4
+ *
5
+ * IMPORTANT: DO NOT MAKE CHANGES TO THIS FILE, AS ALL CHANGES WILL BE LOST UPON PACKAGE IMPLEMENTATION
6
+ *
7
+ * Note: we do not use css modules here due to this component being a wrapper
8
+ */
9
+ import { Link } from "gatsby";
10
+ import "./Breadcrumbs.css";
11
+ export const Breadcrumbs = ({ crumbs }) => {
12
+ return (_jsx("nav", { "aria-label": "Breadcrumb", className: "denhaag-breadcrumb", children: _jsx("ol", { className: "denhaag-breadcrumb__list", itemScope: true, itemType: "https://schema.org/BreadcrumbList", children: crumbs.map((crumb, idx) => {
13
+ if (crumbs.length !== idx + 1) {
14
+ return _jsx(CrumbItem, { ...crumb, ...{ idx } }, idx);
15
+ }
16
+ return _jsx(LastCrumbItem, { ...crumb, ...{ idx } }, idx);
17
+ }) }) }));
18
+ };
19
+ const CrumbItem = ({ pathname, crumbLabel, idx }) => (_jsx("li", { className: "denhaag-breadcrumb__item", itemProp: "itemListElement", itemScope: true, itemType: "https://schema.org/ListItem", children: _jsxs(Link, { className: "denhaag-breadcrumb__link", to: pathname, itemProp: "item", children: [_jsx("span", { className: "denhaag-breadcrumb__text", itemProp: "name", children: crumbLabel }), _jsx("svg", { "aria-hidden": "true", className: "denhaag-icon", fill: "none", focusable: "false", height: "1em", "shape-rendering": "auto", viewBox: "0 0 24 24", width: "1em", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M9.293 18.707a1 1 0 010-1.414L14.586 12 9.293 6.707a1 1 0 011.414-1.414l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414 0z", fill: "currentColor" }) }), _jsx("meta", { content: idx.toString(), itemProp: "position" })] }) }));
20
+ const LastCrumbItem = ({ pathname, crumbLabel, idx }) => (_jsx("li", { "aria-current": "page", className: "denhaag-breadcrumb__item", itemProp: "itemListElement", itemScope: true, itemType: "https://schema.org/ListItem", children: _jsxs(Link, { "aria-current": "page", className: "denhaag-breadcrumb__link denhaag-breadcrumb__link--current", to: pathname, itemProp: "item", children: [_jsx("span", { className: "denhaag-breadcrumb__text", itemProp: "name", children: crumbLabel }), _jsx("meta", { content: idx.toString(), itemProp: "position" })] }) }));
@@ -0,0 +1,89 @@
1
+ /**
2
+ * This is a wrapper element based on https://nl-design-system.github.io/denhaag/?path=/docs/css-navigation-breadcrumb--default-story
3
+ *
4
+ * IMPORTANT: DO NOT MAKE CHANGES TO THIS FILE, AS ALL CHANGES WILL BE LOST UPON PACKAGE IMPLEMENTATION
5
+ *
6
+ * Note: we do not use css modules here due to this component being a wrapper
7
+ */
8
+
9
+ import { Link } from "gatsby";
10
+ import * as React from "react";
11
+ import "./Breadcrumbs.css";
12
+
13
+ interface BreadcrumbsProps {
14
+ crumbs: {
15
+ pathname: string;
16
+ crumbLabel: string;
17
+ }[];
18
+ }
19
+
20
+ export const Breadcrumbs: React.FC<BreadcrumbsProps> = ({ crumbs }) => {
21
+ return (
22
+ <nav aria-label="Breadcrumb" className="denhaag-breadcrumb">
23
+ <ol className="denhaag-breadcrumb__list" itemScope itemType="https://schema.org/BreadcrumbList">
24
+ {crumbs.map((crumb, idx) => {
25
+ if (crumbs.length !== idx + 1) {
26
+ return <CrumbItem key={idx} {...crumb} {...{ idx }} />;
27
+ }
28
+
29
+ return <LastCrumbItem key={idx} {...crumb} {...{ idx }} />;
30
+ })}
31
+ </ol>
32
+ </nav>
33
+ );
34
+ };
35
+
36
+ interface CrumbItemProps {
37
+ pathname: string;
38
+ crumbLabel: string;
39
+ idx: number;
40
+ }
41
+
42
+ const CrumbItem: React.FC<CrumbItemProps> = ({ pathname, crumbLabel, idx }) => (
43
+ <li className="denhaag-breadcrumb__item" itemProp="itemListElement" itemScope itemType="https://schema.org/ListItem">
44
+ <Link className="denhaag-breadcrumb__link" to={pathname} itemProp="item">
45
+ <span className="denhaag-breadcrumb__text" itemProp="name">
46
+ {crumbLabel}
47
+ </span>
48
+ <svg
49
+ aria-hidden="true"
50
+ className="denhaag-icon"
51
+ fill="none"
52
+ focusable="false"
53
+ height="1em"
54
+ shape-rendering="auto"
55
+ viewBox="0 0 24 24"
56
+ width="1em"
57
+ xmlns="http://www.w3.org/2000/svg"
58
+ >
59
+ <path
60
+ d="M9.293 18.707a1 1 0 010-1.414L14.586 12 9.293 6.707a1 1 0 011.414-1.414l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414 0z"
61
+ fill="currentColor"
62
+ />
63
+ </svg>
64
+ <meta content={idx.toString()} itemProp="position" />
65
+ </Link>
66
+ </li>
67
+ );
68
+
69
+ const LastCrumbItem: React.FC<CrumbItemProps> = ({ pathname, crumbLabel, idx }) => (
70
+ <li
71
+ aria-current="page"
72
+ className="denhaag-breadcrumb__item"
73
+ itemProp="itemListElement"
74
+ itemScope
75
+ itemType="https://schema.org/ListItem"
76
+ >
77
+ <Link
78
+ aria-current="page"
79
+ className="denhaag-breadcrumb__link denhaag-breadcrumb__link--current"
80
+ to={pathname}
81
+ itemProp="item"
82
+ >
83
+ <span className="denhaag-breadcrumb__text" itemProp="name">
84
+ {crumbLabel}
85
+ </span>
86
+ <meta content={idx.toString()} itemProp="position" />
87
+ </Link>
88
+ </li>
89
+ );
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { TableCell, TableHeader, TableRow } from "@gemeente-denhaag/table";
3
+ import * as styles from "./EditableTableRow.module.css";
4
+ import * as React from "react";
5
+ import { useTranslation } from "react-i18next";
6
+ import { Link } from "@gemeente-denhaag/components-react";
7
+ import { CheckedIcon, CloseIcon, EditIcon } from "@gemeente-denhaag/icons";
8
+ import { useForm } from "react-hook-form";
9
+ import { InputEmail, InputText } from "../formFields";
10
+ export const EditableTableRow = ({ thead, value, inputType, handleSave, }) => {
11
+ const [editing, setEditing] = React.useState(false);
12
+ return (_jsxs(TableRow, { children: [_jsx(TableHeader, { className: styles.th, children: thead }), editing && _jsx(EditingTableRow, { ...{ value, inputType, handleSave, setEditing } }), !editing && _jsx(RegularTableRow, { ...{ value, setEditing } })] }));
13
+ };
14
+ const RegularTableRow = ({ value, setEditing }) => {
15
+ const { t } = useTranslation();
16
+ return (_jsxs(_Fragment, { children: [_jsx(TableCell, { children: value }), _jsx(TableCell, { children: _jsx("div", { className: styles.editButton, onClick: () => setEditing(true), children: _jsx(Link, { icon: _jsx(EditIcon, {}), iconAlign: "start", children: t("Edit") }) }) })] }));
17
+ };
18
+ const EditingTableRow = ({ value, setEditing, handleSave, inputType, }) => {
19
+ const { t } = useTranslation();
20
+ const { register, handleSubmit, formState: { errors }, } = useForm();
21
+ const onSubmit = (data) => {
22
+ handleSave(data.value);
23
+ setEditing(false);
24
+ };
25
+ return (_jsxs(_Fragment, { children: [_jsx(TableCell, { children: _jsxs("form", { onSubmit: handleSubmit(onSubmit), children: [_jsx(FormField, { ...{ inputType, value, register, errors } }), _jsxs("div", { className: styles.editButtonsContainer, children: [_jsx("button", { type: "submit", className: styles.submit, children: _jsx(Link, { icon: _jsx(CheckedIcon, {}), iconAlign: "start", children: t("Save") }) }), _jsx("div", { onClick: () => setEditing(false), children: _jsx(Link, { icon: _jsx(CloseIcon, {}), iconAlign: "start", className: styles.cancel, children: t("Cancel") }) })] })] }) }), _jsx(TableCell, {})] }));
26
+ };
27
+ const FormField = ({ inputType, value, register, errors }) => {
28
+ switch (inputType) {
29
+ case "email":
30
+ return _jsx(InputEmail, { defaultValue: value, ...{ register, errors }, name: "value", validation: { required: true } });
31
+ case "text":
32
+ return _jsx(InputText, { defaultValue: value, ...{ register, errors }, name: "value", validation: { required: true } });
33
+ }
34
+ };
@@ -0,0 +1,25 @@
1
+ .th {
2
+ width: 35%;
3
+ }
4
+
5
+ .cancel {
6
+ color: var(--denhaag-color-grey-3) !important;
7
+ }
8
+
9
+ .editButtonsContainer {
10
+ display: flex;
11
+ margin-block-start: var(--nlportal-space-block-xs);
12
+ }
13
+
14
+ .editButtonsContainer > *:not(:last-child) {
15
+ margin-inline-end: var(--nlportal-space-inline-md);
16
+ }
17
+
18
+ .submit {
19
+ all: unset;
20
+ }
21
+
22
+ .editButton {
23
+ display: flex;
24
+ justify-content: flex-end;
25
+ }
@@ -0,0 +1,130 @@
1
+ import { TableCell, TableHeader, TableRow } from "@gemeente-denhaag/table";
2
+ import * as styles from "./EditableTableRow.module.css";
3
+ import * as React from "react";
4
+ import { useTranslation } from "react-i18next";
5
+ import { Link } from "@gemeente-denhaag/components-react";
6
+ import { CheckedIcon, CloseIcon, EditIcon } from "@gemeente-denhaag/icons";
7
+ import { FieldValues, useForm, UseFormRegister } from "react-hook-form";
8
+ import { InputEmail, InputText } from "../formFields";
9
+
10
+ interface InputTypes {
11
+ inputType: "text" | "email";
12
+ }
13
+
14
+ interface EditableTableRowProps {
15
+ thead: string;
16
+ value: string;
17
+ handleSave: (value: any) => void;
18
+ }
19
+
20
+ export const EditableTableRow: React.FC<EditableTableRowProps & InputTypes> = ({
21
+ thead,
22
+ value,
23
+ inputType,
24
+ handleSave,
25
+ }) => {
26
+ const [editing, setEditing] = React.useState<boolean>(false);
27
+
28
+ return (
29
+ <TableRow>
30
+ <TableHeader className={styles.th}>{thead}</TableHeader>
31
+
32
+ {editing && <EditingTableRow {...{ value, inputType, handleSave, setEditing }} />}
33
+ {!editing && <RegularTableRow {...{ value, setEditing }} />}
34
+ </TableRow>
35
+ );
36
+ };
37
+
38
+ /**
39
+ * Specific rows based on editing (Regular: not editing & Editing: editing)
40
+ */
41
+
42
+ interface SpecificRowsProps {
43
+ value: string;
44
+ setEditing: React.Dispatch<React.SetStateAction<boolean>>;
45
+ }
46
+
47
+ const RegularTableRow: React.FC<SpecificRowsProps> = ({ value, setEditing }) => {
48
+ const { t } = useTranslation();
49
+
50
+ return (
51
+ <>
52
+ <TableCell>{value}</TableCell>
53
+
54
+ <TableCell>
55
+ <div className={styles.editButton} onClick={() => setEditing(true)}>
56
+ <Link icon={<EditIcon />} iconAlign="start">
57
+ {t("Edit")}
58
+ </Link>
59
+ </div>
60
+ </TableCell>
61
+ </>
62
+ );
63
+ };
64
+
65
+ interface EditingTableRowProps {
66
+ handleSave: (value: any) => void;
67
+ }
68
+
69
+ const EditingTableRow: React.FC<SpecificRowsProps & EditingTableRowProps & InputTypes> = ({
70
+ value,
71
+ setEditing,
72
+ handleSave,
73
+ inputType,
74
+ }) => {
75
+ const { t } = useTranslation();
76
+
77
+ const {
78
+ register,
79
+ handleSubmit,
80
+ formState: { errors },
81
+ } = useForm();
82
+
83
+ const onSubmit = (data: any): void => {
84
+ handleSave(data.value);
85
+ setEditing(false);
86
+ };
87
+
88
+ return (
89
+ <>
90
+ <TableCell>
91
+ <form onSubmit={handleSubmit(onSubmit)}>
92
+ <FormField {...{ inputType, value, register, errors }} />
93
+
94
+ <div className={styles.editButtonsContainer}>
95
+ <button type="submit" className={styles.submit}>
96
+ <Link icon={<CheckedIcon />} iconAlign="start">
97
+ {t("Save")}
98
+ </Link>
99
+ </button>
100
+
101
+ <div onClick={() => setEditing(false)}>
102
+ <Link icon={<CloseIcon />} iconAlign="start" className={styles.cancel}>
103
+ {t("Cancel")}
104
+ </Link>
105
+ </div>
106
+ </div>
107
+ </form>
108
+ </TableCell>
109
+
110
+ <TableCell />
111
+ </>
112
+ );
113
+ };
114
+
115
+ interface FormFieldProps {
116
+ value: string;
117
+ register: UseFormRegister<FieldValues>;
118
+ errors: {
119
+ [x: string]: any;
120
+ };
121
+ }
122
+
123
+ const FormField: React.FC<FormFieldProps & InputTypes> = ({ inputType, value, register, errors }) => {
124
+ switch (inputType) {
125
+ case "email":
126
+ return <InputEmail defaultValue={value} {...{ register, errors }} name="value" validation={{ required: true }} />;
127
+ case "text":
128
+ return <InputText defaultValue={value} {...{ register, errors }} name="value" validation={{ required: true }} />;
129
+ }
130
+ };
@@ -0,0 +1,3 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { FormControlLabel } from "@gemeente-denhaag/components-react";
3
+ export const InputCheckbox = ({ name, validation, register, label, }) => _jsx(FormControlLabel, { input: _jsx("input", { type: "checkbox", ...register(name, { ...validation }) }), ...{ label } });
@@ -0,0 +1,9 @@
1
+ import { FormControlLabel } from "@gemeente-denhaag/components-react";
2
+ import { ICheckboxProps, IReactHookFormProps } from "./types";
3
+
4
+ export const InputCheckbox: React.FC<ICheckboxProps & IReactHookFormProps> = ({
5
+ name,
6
+ validation,
7
+ register,
8
+ label,
9
+ }) => <FormControlLabel input={<input type="checkbox" {...register(name, { ...validation })} />} {...{ label }} />;
@@ -0,0 +1,4 @@
1
+ import { InputText, InputPassword, InputEmail, InputDate, InputNumber } from "./input";
2
+ import { Textarea } from "./textarea";
3
+ import { InputCheckbox } from "./checkbox";
4
+ export { InputText, InputPassword, InputEmail, InputDate, InputNumber, InputCheckbox, Textarea };
@@ -0,0 +1,5 @@
1
+ import { InputText, InputPassword, InputEmail, InputDate, InputNumber } from "./input";
2
+ import { Textarea } from "./textarea";
3
+ import { InputCheckbox } from "./checkbox";
4
+
5
+ export { InputText, InputPassword, InputEmail, InputDate, InputNumber, InputCheckbox, Textarea };
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { TextField } from "@gemeente-denhaag/components-react";
4
+ import { ShowIcon, HideIcon } from "@gemeente-denhaag/icons";
5
+ export const InputPassword = ({ disabled, name, validation, register, errors, }) => {
6
+ const [showPassword, setShowPassword] = React.useState(false);
7
+ return (_jsx(TextField, { type: showPassword ? "text" : "password", ...{ disabled }, ...register(name, { ...validation }), invalid: errors[name], icon: _jsx("span", { onClick: () => setShowPassword(!showPassword), children: showPassword ? _jsx(HideIcon, {}) : _jsx(ShowIcon, {}) }) }));
8
+ };
9
+ export const InputText = ({ disabled, name, defaultValue, validation, register, errors, }) => (_jsx(TextField, { type: "text", ...{ defaultValue, disabled }, ...register(name, { ...validation }), invalid: errors[name] }));
10
+ export const InputEmail = ({ disabled, name, defaultValue, validation, register, errors, }) => (_jsx(TextField, { type: "email", ...{ defaultValue, disabled }, ...register(name, { ...validation }), invalid: errors[name] }));
11
+ export const InputDate = ({ disabled, name, defaultValue, validation, register, errors, }) => (_jsx(TextField, { type: "date", ...{ defaultValue, disabled }, ...register(name, { ...validation }), invalid: errors[name] }));
12
+ export const InputNumber = ({ disabled, name, defaultValue, validation, register, errors, }) => (_jsx(TextField, { type: "number", ...{ defaultValue, disabled }, ...register(name, { ...validation }), invalid: errors[name] }));
@@ -0,0 +1,88 @@
1
+ import * as React from "react";
2
+ import { TextField } from "@gemeente-denhaag/components-react";
3
+ import { ShowIcon, HideIcon } from "@gemeente-denhaag/icons";
4
+ import { IInputProps, IReactHookFormProps } from "./types";
5
+
6
+ export const InputPassword: React.FC<IInputProps & IReactHookFormProps> = ({
7
+ disabled,
8
+ name,
9
+ validation,
10
+ register,
11
+ errors,
12
+ }) => {
13
+ const [showPassword, setShowPassword] = React.useState<boolean>(false);
14
+
15
+ return (
16
+ <TextField
17
+ type={showPassword ? "text" : "password"}
18
+ {...{ disabled }}
19
+ {...register(name, { ...validation })}
20
+ invalid={errors[name]}
21
+ icon={<span onClick={() => setShowPassword(!showPassword)}>{showPassword ? <HideIcon /> : <ShowIcon />}</span>}
22
+ />
23
+ );
24
+ };
25
+
26
+ export const InputText: React.FC<IInputProps & IReactHookFormProps> = ({
27
+ disabled,
28
+ name,
29
+ defaultValue,
30
+ validation,
31
+ register,
32
+ errors,
33
+ }) => (
34
+ <TextField
35
+ type="text"
36
+ {...{ defaultValue, disabled }}
37
+ {...register(name, { ...validation })}
38
+ invalid={errors[name]}
39
+ />
40
+ );
41
+
42
+ export const InputEmail: React.FC<IInputProps & IReactHookFormProps> = ({
43
+ disabled,
44
+ name,
45
+ defaultValue,
46
+ validation,
47
+ register,
48
+ errors,
49
+ }) => (
50
+ <TextField
51
+ type="email"
52
+ {...{ defaultValue, disabled }}
53
+ {...register(name, { ...validation })}
54
+ invalid={errors[name]}
55
+ />
56
+ );
57
+
58
+ export const InputDate: React.FC<IInputProps & IReactHookFormProps> = ({
59
+ disabled,
60
+ name,
61
+ defaultValue,
62
+ validation,
63
+ register,
64
+ errors,
65
+ }) => (
66
+ <TextField
67
+ type="date"
68
+ {...{ defaultValue, disabled }}
69
+ {...register(name, { ...validation })}
70
+ invalid={errors[name]}
71
+ />
72
+ );
73
+
74
+ export const InputNumber: React.FC<IInputProps & IReactHookFormProps> = ({
75
+ disabled,
76
+ name,
77
+ defaultValue,
78
+ validation,
79
+ register,
80
+ errors,
81
+ }) => (
82
+ <TextField
83
+ type="number"
84
+ {...{ defaultValue, disabled }}
85
+ {...register(name, { ...validation })}
86
+ invalid={errors[name]}
87
+ />
88
+ );
@@ -0,0 +1,3 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { TextArea } from "@gemeente-denhaag/textarea";
3
+ export const Textarea = ({ name, validation, register, errors }) => (_jsx(TextArea, { ...register(name, { ...validation }), invalid: errors[name] }));
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ import { TextArea } from "@gemeente-denhaag/textarea";
3
+ import { ITextAreaProps, IReactHookFormProps } from "./types";
4
+
5
+ export const Textarea: React.FC<ITextAreaProps & IReactHookFormProps> = ({ name, validation, register, errors }) => (
6
+ <TextArea {...register(name, { ...validation })} invalid={errors[name]} />
7
+ );
@@ -0,0 +1 @@
1
+ export {};