newspack-components 4.3.0 → 4.4.0-alpha.1

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 (263) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/DEVELOPMENT.md +868 -0
  3. package/colors/colors.module.scss +52 -2
  4. package/copy-styles.js +3 -2
  5. package/dist/cjs/accordion/index.js +17 -12
  6. package/dist/cjs/action-card/index.js +176 -139
  7. package/dist/cjs/autocomplete-tokenfield/index.js +254 -234
  8. package/dist/cjs/autocomplete-with-latest-posts/index.js +172 -110
  9. package/dist/cjs/autocomplete-with-suggestions/index.js +229 -126
  10. package/dist/cjs/badge/index.js +7 -7
  11. package/dist/cjs/box-contrast/index.js +19 -15
  12. package/dist/cjs/button/index.js +41 -26
  13. package/dist/cjs/button-props/button-props.js +5 -5
  14. package/dist/cjs/button-props/index.js +2 -2
  15. package/dist/cjs/card/core-card.js +110 -52
  16. package/dist/cjs/card/index.js +74 -67
  17. package/dist/cjs/card/style-core.scss +93 -25
  18. package/dist/cjs/card/style.scss +2 -2
  19. package/dist/cjs/card-feature/index.js +141 -0
  20. package/dist/cjs/card-feature/style.scss +75 -0
  21. package/dist/cjs/card-form/index.js +144 -0
  22. package/dist/cjs/card-form/style.scss +20 -0
  23. package/dist/cjs/card-settings-group/index.js +36 -16
  24. package/dist/cjs/card-sortable-list/index.js +176 -140
  25. package/dist/cjs/category-autocomplete/index.js +175 -155
  26. package/dist/cjs/color-picker/index.js +41 -23
  27. package/dist/cjs/color-picker/index.test.js +82 -0
  28. package/dist/cjs/color-picker/style.scss +11 -13
  29. package/dist/cjs/confirm-dialog/index.js +86 -22
  30. package/dist/cjs/consts.js +1 -1
  31. package/dist/cjs/custom-select-control/index.js +39 -28
  32. package/dist/cjs/dataviews/index.js +38 -0
  33. package/dist/cjs/dataviews/style.scss +9 -0
  34. package/dist/cjs/divider/index.js +26 -21
  35. package/dist/cjs/footer/index.js +36 -30
  36. package/dist/cjs/form-token-field/index.js +51 -40
  37. package/dist/cjs/global-notices/index.js +5 -5
  38. package/dist/cjs/grid/index.js +25 -19
  39. package/dist/cjs/grid/style.scss +6 -1
  40. package/dist/cjs/handoff/index.js +204 -156
  41. package/dist/cjs/handoff-message/index.js +12 -7
  42. package/dist/cjs/hooks/index.js +10 -8
  43. package/dist/cjs/hooks/use-confirm-dialog.js +79 -0
  44. package/dist/cjs/hooks/use-unsaved-changes-dialog.js +144 -0
  45. package/dist/cjs/hooks/useObjectState.js +21 -12
  46. package/dist/cjs/hooks/useObjectState.test.js +55 -33
  47. package/dist/cjs/hooks/useOnClickOutside.js +6 -6
  48. package/dist/cjs/hooks/usePrompt.js +10 -13
  49. package/dist/cjs/image-upload/index.js +114 -123
  50. package/dist/cjs/image-upload/index.test.js +11 -13
  51. package/dist/cjs/image-upload/style.scss +12 -40
  52. package/dist/cjs/index.js +136 -104
  53. package/dist/cjs/info-button/index.js +43 -32
  54. package/dist/cjs/integration-icons/active-campaign.js +22 -0
  55. package/dist/cjs/integration-icons/constant-contact.js +28 -0
  56. package/dist/cjs/integration-icons/fundraise-up.js +25 -0
  57. package/dist/cjs/integration-icons/index.js +48 -0
  58. package/dist/cjs/integration-icons/mailchimp.js +19 -0
  59. package/dist/cjs/integration-icons/salesforce.js +17 -0
  60. package/dist/cjs/integration-icons/wisepops.js +20 -0
  61. package/dist/cjs/modal/index.js +22 -19
  62. package/dist/cjs/modal/style.scss +4 -0
  63. package/dist/cjs/newspack-icon/index.js +45 -38
  64. package/dist/cjs/notice/index.js +64 -55
  65. package/dist/cjs/plugin-installer/index.js +259 -253
  66. package/dist/cjs/plugin-settings/SettingsSection.js +66 -60
  67. package/dist/cjs/plugin-settings/index.js +217 -200
  68. package/dist/cjs/plugin-toggle/index.js +192 -199
  69. package/dist/cjs/popover/index.js +41 -28
  70. package/dist/cjs/position-control/index.js +24 -23
  71. package/dist/cjs/progress-bar/index.js +71 -59
  72. package/dist/cjs/progress-bar/index.test.js +62 -68
  73. package/dist/cjs/proxied-imports/router.js +3 -3
  74. package/dist/cjs/radio-control/index.js +40 -27
  75. package/dist/cjs/section-header/index.js +103 -58
  76. package/dist/cjs/section-header/style.scss +31 -11
  77. package/dist/cjs/select-control/ButtonGroupControl.js +26 -21
  78. package/dist/cjs/select-control/GroupedSelectControl.js +41 -35
  79. package/dist/cjs/select-control/index.js +52 -40
  80. package/dist/cjs/settings/MinMaxSetting.js +30 -20
  81. package/dist/cjs/settings/SettingsCard.js +20 -17
  82. package/dist/cjs/settings/SettingsSection.js +22 -21
  83. package/dist/cjs/settings/index.js +5 -5
  84. package/dist/cjs/sortable-newsletter-list-control/index.js +78 -57
  85. package/dist/cjs/steps-list/index.js +44 -34
  86. package/dist/cjs/steps-list-item/index.js +47 -39
  87. package/dist/cjs/style-card/index.js +70 -63
  88. package/dist/cjs/tabbed-navigation/index.js +38 -36
  89. package/dist/cjs/text-control/index.js +27 -25
  90. package/dist/cjs/utils/color.js +4 -4
  91. package/dist/cjs/utils/editor-toolbar-back-button.js +61 -0
  92. package/dist/cjs/utils/index.js +31 -19
  93. package/dist/cjs/utils/style.scss +8 -0
  94. package/dist/cjs/waiting/index.js +48 -37
  95. package/dist/cjs/web-preview/index.js +217 -211
  96. package/dist/cjs/with-wizard/index.js +362 -364
  97. package/dist/cjs/with-wizard/style.scss +4 -54
  98. package/dist/cjs/with-wizard-screen/index.js +54 -58
  99. package/dist/cjs/with-wizard-screen/style.scss +41 -3
  100. package/dist/cjs/wizard/components/WizardError.js +20 -18
  101. package/dist/cjs/wizard/components/WizardSnackbar.js +26 -23
  102. package/dist/cjs/wizard/index.js +176 -114
  103. package/dist/cjs/wizard/store/index.js +171 -123
  104. package/dist/cjs/wizard/store/utils.js +13 -8
  105. package/dist/esm/accordion/index.js +14 -9
  106. package/dist/esm/action-card/index.js +168 -123
  107. package/dist/esm/autocomplete-tokenfield/index.js +248 -222
  108. package/dist/esm/autocomplete-with-latest-posts/index.js +169 -103
  109. package/dist/esm/autocomplete-with-suggestions/index.js +226 -119
  110. package/dist/esm/badge/index.js +5 -5
  111. package/dist/esm/box-contrast/index.js +15 -11
  112. package/dist/esm/button/index.js +39 -21
  113. package/dist/esm/button-props/button-props.js +1 -1
  114. package/dist/esm/card/core-card.js +109 -47
  115. package/dist/esm/card/index.js +69 -54
  116. package/dist/esm/card/style-core.scss +93 -25
  117. package/dist/esm/card/style.scss +2 -2
  118. package/dist/esm/card-feature/index.js +131 -0
  119. package/dist/esm/card-feature/style.scss +75 -0
  120. package/dist/esm/card-form/index.js +134 -0
  121. package/dist/esm/card-form/style.scss +20 -0
  122. package/dist/esm/card-settings-group/index.js +33 -14
  123. package/dist/esm/card-sortable-list/index.js +170 -126
  124. package/dist/esm/category-autocomplete/index.js +168 -140
  125. package/dist/esm/color-picker/index.js +39 -21
  126. package/dist/esm/color-picker/index.test.js +78 -0
  127. package/dist/esm/color-picker/style.scss +11 -13
  128. package/dist/esm/confirm-dialog/index.js +85 -18
  129. package/dist/esm/consts.js +1 -1
  130. package/dist/esm/custom-select-control/index.js +34 -15
  131. package/dist/esm/dataviews/index.js +34 -0
  132. package/dist/esm/dataviews/style.scss +9 -0
  133. package/dist/esm/divider/index.js +24 -16
  134. package/dist/esm/footer/index.js +34 -28
  135. package/dist/esm/form-token-field/index.js +46 -27
  136. package/dist/esm/global-notices/index.js +3 -3
  137. package/dist/esm/grid/index.js +23 -14
  138. package/dist/esm/grid/style.scss +6 -1
  139. package/dist/esm/handoff/index.js +199 -143
  140. package/dist/esm/handoff-message/index.js +10 -6
  141. package/dist/esm/hooks/index.js +8 -6
  142. package/dist/esm/hooks/use-confirm-dialog.js +73 -0
  143. package/dist/esm/hooks/use-unsaved-changes-dialog.js +136 -0
  144. package/dist/esm/hooks/useObjectState.js +19 -9
  145. package/dist/esm/hooks/useObjectState.test.js +54 -32
  146. package/dist/esm/hooks/useOnClickOutside.js +4 -4
  147. package/dist/esm/hooks/usePrompt.js +9 -11
  148. package/dist/esm/image-upload/index.js +110 -111
  149. package/dist/esm/image-upload/index.test.js +11 -13
  150. package/dist/esm/image-upload/style.scss +12 -40
  151. package/dist/esm/index.js +7 -1
  152. package/dist/esm/info-button/index.js +38 -19
  153. package/dist/esm/integration-icons/active-campaign.js +16 -0
  154. package/dist/esm/integration-icons/constant-contact.js +22 -0
  155. package/dist/esm/integration-icons/fundraise-up.js +19 -0
  156. package/dist/esm/integration-icons/index.js +6 -0
  157. package/dist/esm/integration-icons/mailchimp.js +13 -0
  158. package/dist/esm/integration-icons/salesforce.js +11 -0
  159. package/dist/esm/integration-icons/wisepops.js +14 -0
  160. package/dist/esm/modal/index.js +20 -13
  161. package/dist/esm/modal/style.scss +4 -0
  162. package/dist/esm/newspack-icon/index.js +40 -25
  163. package/dist/esm/notice/index.js +59 -42
  164. package/dist/esm/plugin-installer/index.js +255 -243
  165. package/dist/esm/plugin-settings/SettingsSection.js +61 -50
  166. package/dist/esm/plugin-settings/index.js +212 -189
  167. package/dist/esm/plugin-toggle/index.js +187 -190
  168. package/dist/esm/popover/index.js +35 -16
  169. package/dist/esm/position-control/index.js +22 -18
  170. package/dist/esm/progress-bar/index.js +66 -49
  171. package/dist/esm/progress-bar/index.test.js +61 -67
  172. package/dist/esm/radio-control/index.js +34 -15
  173. package/dist/esm/section-header/index.js +102 -57
  174. package/dist/esm/section-header/style.scss +31 -11
  175. package/dist/esm/select-control/ButtonGroupControl.js +23 -18
  176. package/dist/esm/select-control/GroupedSelectControl.js +38 -30
  177. package/dist/esm/select-control/index.js +47 -27
  178. package/dist/esm/settings/MinMaxSetting.js +27 -16
  179. package/dist/esm/settings/SettingsCard.js +18 -13
  180. package/dist/esm/settings/SettingsSection.js +20 -19
  181. package/dist/esm/settings/index.js +3 -3
  182. package/dist/esm/sortable-newsletter-list-control/index.js +74 -53
  183. package/dist/esm/steps-list/index.js +39 -21
  184. package/dist/esm/steps-list-item/index.js +42 -26
  185. package/dist/esm/style-card/index.js +65 -50
  186. package/dist/esm/tabbed-navigation/index.js +35 -33
  187. package/dist/esm/text-control/index.js +25 -19
  188. package/dist/esm/utils/color.js +4 -4
  189. package/dist/esm/utils/editor-toolbar-back-button.js +53 -0
  190. package/dist/esm/utils/index.js +29 -16
  191. package/dist/esm/utils/style.scss +8 -0
  192. package/dist/esm/waiting/index.js +43 -24
  193. package/dist/esm/web-preview/index.js +213 -201
  194. package/dist/esm/with-wizard/index.js +360 -358
  195. package/dist/esm/with-wizard/style.scss +4 -54
  196. package/dist/esm/with-wizard-screen/index.js +48 -46
  197. package/dist/esm/with-wizard-screen/style.scss +41 -3
  198. package/dist/esm/wizard/components/WizardError.js +18 -16
  199. package/dist/esm/wizard/components/WizardSnackbar.js +23 -17
  200. package/dist/esm/wizard/index.js +171 -103
  201. package/dist/esm/wizard/store/index.js +169 -116
  202. package/dist/esm/wizard/store/utils.js +13 -6
  203. package/package.json +30 -16
  204. package/release.config.js +1 -0
  205. package/shared/hooks/use-coauthors.js +195 -27
  206. package/shared/hooks/use-coauthors.test.js +232 -6
  207. package/shared/scss/_mixins.scss +13 -5
  208. package/src/accordion/index.js +8 -7
  209. package/src/action-card/index.js +15 -1
  210. package/src/badge/index.tsx +3 -1
  211. package/src/card/core-card.js +95 -18
  212. package/src/card/index.js +1 -0
  213. package/src/card/style-core.scss +93 -25
  214. package/src/card/style.scss +2 -2
  215. package/src/card-feature/README.md +188 -0
  216. package/src/card-feature/index.tsx +186 -0
  217. package/src/card-feature/style.scss +75 -0
  218. package/src/card-form/README.md +113 -0
  219. package/src/card-form/index.tsx +128 -0
  220. package/src/card-form/style.scss +20 -0
  221. package/src/card-settings-group/index.tsx +28 -3
  222. package/src/card-sortable-list/index.tsx +27 -4
  223. package/src/color-picker/index.js +15 -8
  224. package/src/color-picker/index.test.js +52 -0
  225. package/src/color-picker/style.scss +11 -13
  226. package/src/confirm-dialog/README.md +128 -0
  227. package/src/confirm-dialog/index.tsx +74 -6
  228. package/src/dataviews/index.tsx +34 -0
  229. package/src/dataviews/style.scss +9 -0
  230. package/src/grid/style.scss +6 -1
  231. package/src/handoff/README.md +93 -0
  232. package/src/handoff/index.js +46 -8
  233. package/src/hooks/index.ts +2 -1
  234. package/src/hooks/use-confirm-dialog.tsx +80 -0
  235. package/src/hooks/use-unsaved-changes-dialog.tsx +140 -0
  236. package/src/image-upload/index.js +10 -15
  237. package/src/image-upload/style.scss +12 -40
  238. package/src/index.js +7 -1
  239. package/src/integration-icons/active-campaign.js +14 -0
  240. package/src/integration-icons/constant-contact.js +22 -0
  241. package/src/integration-icons/fundraise-up.js +18 -0
  242. package/src/integration-icons/index.js +6 -0
  243. package/src/integration-icons/mailchimp.js +10 -0
  244. package/src/integration-icons/salesforce.js +10 -0
  245. package/src/integration-icons/wisepops.js +14 -0
  246. package/src/modal/style.scss +4 -0
  247. package/src/plugin-installer/index.js +30 -19
  248. package/src/section-header/index.js +56 -24
  249. package/src/section-header/style.scss +31 -11
  250. package/src/select-control/index.js +4 -0
  251. package/src/utils/editor-toolbar-back-button.tsx +48 -0
  252. package/src/utils/index.js +6 -0
  253. package/src/utils/style.scss +8 -0
  254. package/src/with-wizard/style.scss +4 -54
  255. package/src/with-wizard-screen/style.scss +41 -3
  256. package/src/wizard/index.js +90 -53
  257. package/src/wizard/store/index.js +2 -2
  258. package/dist/cjs/button-card/index.js +0 -72
  259. package/dist/cjs/button-card/style.scss +0 -180
  260. package/dist/esm/button-card/index.js +0 -64
  261. package/dist/esm/button-card/style.scss +0 -180
  262. package/src/button-card/index.js +0 -52
  263. package/src/button-card/style.scss +0 -180
@@ -3,26 +3,27 @@
3
3
  */
4
4
 
5
5
  @use "~@wordpress/base-styles/colors" as wp-colors;
6
+ @use "~@wordpress/base-styles/variables" as wp-vars;
6
7
  @use "../../../colors/colors.module" as colors;
7
8
 
8
9
  .newspack-card--core,
9
10
  .newspack-wizard .newspack-card--core {
10
- background: white;
11
+ background: wp-colors.$white;
11
12
  position: relative;
12
13
  transition: background-color 125ms ease-in-out, box-shadow 125ms ease-in-out, color 125ms ease-in-out;
13
14
  svg {
14
15
  transition: fill 125ms ease-in-out;
15
16
  }
16
17
  &__icon {
17
- border-radius: 50%;
18
+ border-radius: wp-vars.$radius-round;
18
19
  display: grid;
19
- height: 48px;
20
+ height: wp-vars.$grid-unit-60;
20
21
  place-items: center;
21
- width: 48px;
22
+ width: wp-vars.$grid-unit-60;
22
23
  svg {
23
24
  fill: var(--wp-admin-theme-color);
24
- height: 40px;
25
- width: 40px;
25
+ height: wp-vars.$grid-unit-50;
26
+ width: wp-vars.$grid-unit-50;
26
27
  }
27
28
  .newspack-card--core__has-icon-background-color & {
28
29
  background: var(--wp-admin-theme-color-lighter-10);
@@ -35,24 +36,37 @@
35
36
  h4,
36
37
  h5,
37
38
  h6 {
38
- font-size: 14px;
39
- font-weight: 500;
39
+ font-size: wp-vars.$font-size-large;
40
40
  }
41
- .newspack-card--core__icon {
42
- height: 40px;
43
- width: 40px;
44
- svg {
45
- height: 24px;
46
- width: 24px;
41
+ .newspack-card--core {
42
+ &__header-content {
43
+ * {
44
+ line-height: wp-vars.$font-line-height-small;
45
+ }
46
+ }
47
+ &__icon {
48
+ height: wp-vars.$grid-unit-50;
49
+ width: wp-vars.$grid-unit-50;
50
+ svg {
51
+ height: wp-vars.$grid-unit-30;
52
+ width: wp-vars.$grid-unit-30;
53
+ }
47
54
  }
48
55
  }
49
56
  }
50
57
  &__no-margin .components-card__body {
51
58
  padding: 0 !important;
52
59
  }
60
+ &__is-disabled {
61
+ cursor: not-allowed;
62
+ opacity: 0.5;
63
+ .newspack-card--core__header {
64
+ pointer-events: none;
65
+ }
66
+ }
53
67
  &__header {
54
68
  color: wp-colors.$gray-700;
55
- column-gap: 16px;
69
+ flex-wrap: wrap;
56
70
  position: relative;
57
71
  .newspack-card--core__action {
58
72
  margin: 0;
@@ -68,22 +82,26 @@
68
82
  word-wrap: normal !important;
69
83
  }
70
84
  }
71
- .components-dropdown-menu {
85
+ > .components-dropdown-menu {
72
86
  aspect-ratio: 1;
73
87
  border-left: 1px solid wp-colors.$gray-200;
74
88
  display: grid;
75
89
  height: 100%;
90
+ max-width: 50px;
76
91
  padding: 4px;
77
92
  place-items: center;
78
93
  position: absolute;
79
94
  right: 0;
80
95
  top: 0;
81
96
  }
97
+ &__action {
98
+ background-color: wp-colors.$white;
99
+ flex: 1 100%;
100
+ justify-content: center !important;
101
+ }
82
102
  }
83
103
  &__header--is-draggable {
84
- .newspack-card--core__header-content {
85
- padding-left: 65px;
86
- }
104
+ padding-left: 80px !important;
87
105
  .newspack-card--core__header__draggable-controls {
88
106
  align-items: center;
89
107
  border-right: 1px solid wp-colors.$gray-200;
@@ -110,6 +128,21 @@
110
128
  }
111
129
  }
112
130
  }
131
+ // Two classes beat the single-class .components-card__header border-bottom
132
+ // rule from WP Core without needing !important.
133
+ &__header.newspack-card--core__header--no-border {
134
+ border-bottom: none;
135
+ }
136
+ &__body.newspack-card--core__body--no-header-border {
137
+ > div:not(.components-card__body):not(.components-card__media):not(.components-card__divider) {
138
+ padding-top: 0;
139
+ }
140
+ }
141
+ &__header--has-actions {
142
+ .newspack-card--core__header {
143
+ padding-right: 70px;
144
+ }
145
+ }
113
146
  button.newspack-card--core__header {
114
147
  appearance: none;
115
148
  background-color: white;
@@ -140,18 +173,25 @@
140
173
  h6 {
141
174
  align-items: center;
142
175
  color: wp-colors.$gray-900;
143
- font-weight: 500;
176
+ font-weight: 600;
144
177
  display: flex;
145
178
  gap: 8px;
179
+ a {
180
+ color: inherit;
181
+ text-decoration: none;
182
+ &:hover {
183
+ text-decoration: underline;
184
+ }
185
+ }
146
186
  .newspack-badge {
147
187
  font-weight: 400;
148
188
  }
149
189
  }
150
190
  }
151
- &__is-active {
191
+ &__is-active:not(.newspack-card--core__is-draggable) {
152
192
  border-color: var(--wp-admin-theme-color);
153
193
  box-shadow: var(--wp-admin-theme-color) 0 0 0 1px;
154
- button.newspack-card--core__header {
194
+ .newspack-card--core__header {
155
195
  background-color: rgba( var(--wp-admin-theme-color--rgb), 0.04 );
156
196
  color: var(--wp-admin-theme-color);
157
197
  h1,
@@ -168,7 +208,7 @@
168
208
  }
169
209
 
170
210
  &.newspack-card--core__has-children {
171
- button.newspack-card--core__header {
211
+ .newspack-card--core__header {
172
212
  border-bottom-left-radius: 0;
173
213
  border-bottom-right-radius: 0;
174
214
  }
@@ -203,14 +243,39 @@
203
243
  }
204
244
  }
205
245
  }
246
+ &.is-destructive {
247
+ .newspack-card--core__header {
248
+ h1,
249
+ h2,
250
+ h3,
251
+ h4,
252
+ h5,
253
+ h6 {
254
+ color: wp-colors.$alert-red;
255
+ }
256
+ &:hover,
257
+ &:focus {
258
+ background-color: wp-colors.$gray-100;
259
+ }
260
+ }
261
+ .newspack-card--core__action,
262
+ .newspack-card--core__action svg {
263
+ fill: wp-colors.$alert-red;
264
+ }
265
+ }
206
266
  hr.components-card__divider {
207
267
  margin: 0;
208
268
  }
209
269
  &__is-narrow {
210
270
  margin-left: auto;
211
271
  margin-right: auto;
212
- @media screen and ( min-width: 608px ) {
213
- max-width: 576px;
272
+ @media screen and ( min-width: 615px ) {
273
+ max-width: 583px;
274
+ }
275
+ }
276
+ &__has-grey-header {
277
+ .newspack-card--core__header {
278
+ background-color: rgba(black, 0.025);
214
279
  }
215
280
  }
216
281
  &__body {
@@ -223,5 +288,8 @@
223
288
  padding: 0;
224
289
  }
225
290
  }
291
+ > .components-card__media {
292
+ border-radius: 0 !important;
293
+ }
226
294
  }
227
295
  }
@@ -52,8 +52,8 @@
52
52
  margin-left: auto;
53
53
  margin-right: auto;
54
54
 
55
- @media screen and ( min-width: 608px ) {
56
- max-width: 576px;
55
+ @media screen and ( min-width: 615px ) {
56
+ max-width: 583px;
57
57
  }
58
58
  }
59
59
 
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _classnames = _interopRequireDefault(require("classnames"));
9
+ var _i18n = require("@wordpress/i18n");
10
+ var _components = require("@wordpress/components");
11
+ var _icons = require("@wordpress/icons");
12
+ var _badge = _interopRequireDefault(require("../badge"));
13
+ var _button = _interopRequireDefault(require("../button"));
14
+ var _card = _interopRequireDefault(require("../card"));
15
+ require("./style.scss");
16
+ var _jsxRuntime = require("react/jsx-runtime");
17
+ /**
18
+ * External dependencies
19
+ */
20
+
21
+ /**
22
+ * WordPress dependencies
23
+ */
24
+
25
+ // eslint-disable-line @wordpress/no-unsafe-wp-apis
26
+
27
+ /**
28
+ * Internal dependencies
29
+ */
30
+
31
+ /**
32
+ * CardFeature component.
33
+ *
34
+ * A card for presenting a named feature or setting with a predictable
35
+ * action model: a primary button, an optional "More" dropdown when enabled,
36
+ * and an automatic badge reflecting the current state.
37
+ */
38
+ var CardFeature = function CardFeature(_ref) {
39
+ var title = _ref.title,
40
+ description = _ref.description,
41
+ icon = _ref.icon,
42
+ _ref$enabled = _ref.enabled,
43
+ enabled = _ref$enabled === void 0 ? false : _ref$enabled,
44
+ requirements = _ref.requirements,
45
+ _ref$requirementsActi = _ref.requirementsActionable,
46
+ requirementsActionable = _ref$requirementsActi === void 0 ? false : _ref$requirementsActi,
47
+ enableLabel = _ref.enableLabel,
48
+ configureLabel = _ref.configureLabel,
49
+ onEnable = _ref.onEnable,
50
+ onConfigure = _ref.onConfigure,
51
+ moreControls = _ref.moreControls,
52
+ badgeText = _ref.badgeText,
53
+ _ref$badgeLevel = _ref.badgeLevel,
54
+ badgeLevel = _ref$badgeLevel === void 0 ? 'success' : _ref$badgeLevel,
55
+ className = _ref.className;
56
+ var isMuted = !!requirements;
57
+ var classes = (0, _classnames["default"])('newspack-card-feature', className, {
58
+ 'newspack-card-feature--muted': isMuted
59
+ });
60
+ var badge;
61
+ if (requirements) {
62
+ badge = {
63
+ text: requirements,
64
+ level: 'error'
65
+ };
66
+ } else if (enabled) {
67
+ badge = {
68
+ text: badgeText !== null && badgeText !== void 0 ? badgeText : (0, _i18n.__)('Enabled', 'newspack-plugin'),
69
+ level: badgeLevel
70
+ };
71
+ }
72
+ var isConfigureState = enabled && !requirements;
73
+ var buttonLabel = isConfigureState ? configureLabel !== null && configureLabel !== void 0 ? configureLabel : (0, _i18n.__)('Configure', 'newspack-plugin') : enableLabel !== null && enableLabel !== void 0 ? enableLabel : (0, _i18n.__)('Enable', 'newspack-plugin');
74
+ var handleButtonClick = function handleButtonClick() {
75
+ if (isConfigureState) {
76
+ onConfigure === null || onConfigure === void 0 || onConfigure();
77
+ } else {
78
+ onEnable === null || onEnable === void 0 || onEnable();
79
+ }
80
+ };
81
+ var iconClasses = icon ? (0, _classnames["default"])('newspack-card-feature__icon', {
82
+ 'newspack-card-feature__icon--radius-small': !!icon.backgroundColor && icon.radius !== 'full',
83
+ 'newspack-card-feature__icon--radius-full': icon.radius === 'full'
84
+ }) : undefined;
85
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_card["default"], {
86
+ className: classes,
87
+ __experimentalCoreCard: true,
88
+ __experimentalCoreProps: {
89
+ headerStyle: {
90
+ padding: 32
91
+ },
92
+ header: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
93
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.__experimentalHStack, {
94
+ alignment: "top",
95
+ spacing: 4,
96
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
97
+ className: "newspack-card-feature__content",
98
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h2", {
99
+ className: "newspack-card-feature__title",
100
+ children: title
101
+ }), description && /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
102
+ className: "newspack-card-feature__description",
103
+ children: description
104
+ })]
105
+ }), icon && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
106
+ className: iconClasses,
107
+ style: {
108
+ backgroundColor: icon.backgroundColor,
109
+ color: icon.fill
110
+ },
111
+ children: icon.node
112
+ })]
113
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.__experimentalHStack, {
114
+ alignment: "edge",
115
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.__experimentalHStack, {
116
+ expanded: false,
117
+ spacing: "8px",
118
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_button["default"], {
119
+ variant: isConfigureState ? 'tertiary' : 'secondary',
120
+ disabled: isMuted && !requirementsActionable,
121
+ onClick: handleButtonClick,
122
+ size: "compact",
123
+ children: buttonLabel
124
+ }), isConfigureState && !!(moreControls !== null && moreControls !== void 0 && moreControls.length) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.DropdownMenu, {
125
+ icon: _icons.moreVertical,
126
+ label: (0, _i18n.__)('More', 'newspack-plugin'),
127
+ controls: moreControls,
128
+ toggleProps: {
129
+ size: 'compact'
130
+ }
131
+ })]
132
+ }), badge && /*#__PURE__*/(0, _jsxRuntime.jsx)(_badge["default"], {
133
+ text: badge.text,
134
+ level: badge.level
135
+ })]
136
+ })]
137
+ })
138
+ }
139
+ });
140
+ };
141
+ var _default = exports["default"] = CardFeature;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * CardFeature
3
+ */
4
+
5
+ @use "~@wordpress/base-styles/colors" as wp-colors;
6
+ @use "~@wordpress/base-styles/variables" as wp-vars;
7
+
8
+ .newspack-card-feature {
9
+ height: 100%;
10
+
11
+ .newspack-card--core__header {
12
+ height: 100%;
13
+ }
14
+
15
+ .newspack-card--core__header-content {
16
+ gap: 16px;
17
+ display: flex;
18
+ flex-direction: column;
19
+ height: 100%;
20
+
21
+ // Push the action row (buttons + badge) to the bottom.
22
+ > :last-child {
23
+ margin-top: auto;
24
+ }
25
+ }
26
+
27
+ &__content {
28
+ flex: 1;
29
+ min-width: 0; // prevent flex blowout on long words
30
+ }
31
+
32
+ &__title {
33
+ font-size: wp-vars.$font-size-x-large;
34
+ line-height: wp-vars.$font-line-height-x-large;
35
+ text-align: left;
36
+ }
37
+
38
+ &__description {
39
+ text-align: left;
40
+ }
41
+
42
+ &__icon {
43
+ align-items: center;
44
+ display: flex;
45
+ flex: 0 0 40px;
46
+ height: 40px;
47
+ justify-content: center;
48
+
49
+ svg {
50
+ display: block;
51
+ fill: currentcolor;
52
+ height: 24px;
53
+ width: 24px;
54
+ }
55
+
56
+ &--radius-small {
57
+ border-radius: wp-vars.$radius-small;
58
+ }
59
+
60
+ &--radius-full {
61
+ border-radius: wp-vars.$radius-round;
62
+ }
63
+ }
64
+
65
+ // Unmet requirements state: lighter border, muted content.
66
+ &.newspack-card-feature--muted {
67
+ border-color: wp-colors.$gray-100;
68
+ box-shadow: wp-colors.$gray-100 0 0 0 1px;
69
+
70
+ .newspack-card-feature__title,
71
+ .newspack-card-feature__description {
72
+ color: wp-colors.$gray-700;
73
+ }
74
+ }
75
+ }
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _classnames = _interopRequireDefault(require("classnames"));
9
+ var _element = require("@wordpress/element");
10
+ var _compose = require("@wordpress/compose");
11
+ var _components = require("@wordpress/components");
12
+ var _badge = _interopRequireDefault(require("../badge"));
13
+ var _card = _interopRequireDefault(require("../card"));
14
+ require("./style.scss");
15
+ var _jsxRuntime = require("react/jsx-runtime");
16
+ /**
17
+ * Card Form component.
18
+ *
19
+ * A card with an expandable inline form — title, description, optional badge,
20
+ * and an actions slot in the header. When `isOpen` is true, children are
21
+ * rendered in the card body and the header border is removed for a seamless look.
22
+ */
23
+
24
+ /**
25
+ * External dependencies
26
+ */
27
+
28
+ /**
29
+ * WordPress dependencies
30
+ */
31
+
32
+ // eslint-disable-line @wordpress/no-unsafe-wp-apis
33
+
34
+ /**
35
+ * Internal dependencies
36
+ */
37
+
38
+ var _CardForm = function CardForm(_ref) {
39
+ var _badge$level;
40
+ var title = _ref.title,
41
+ description = _ref.description,
42
+ badge = _ref.badge,
43
+ actions = _ref.actions,
44
+ _ref$isOpen = _ref.isOpen,
45
+ isOpen = _ref$isOpen === void 0 ? false : _ref$isOpen,
46
+ onRequestClose = _ref.onRequestClose,
47
+ _ref$titleLevel = _ref.titleLevel,
48
+ titleLevel = _ref$titleLevel === void 0 ? 3 : _ref$titleLevel,
49
+ className = _ref.className,
50
+ children = _ref.children;
51
+ var bodyRef = (0, _element.useRef)(null);
52
+ var previousActiveRef = (0, _element.useRef)(null);
53
+ var instanceId = (0, _compose.useInstanceId)(_CardForm, 'newspack-card-form');
54
+ var titleId = "".concat(instanceId, "__title");
55
+ var bodyId = "".concat(instanceId, "__body");
56
+
57
+ // Scope Escape handling to the open form's body, so multiple open CardForms
58
+ // don't all close on a single keypress, and callers can preventDefault from
59
+ // inner controls (e.g. select menus) without tripping the close.
60
+ (0, _element.useEffect)(function () {
61
+ if (!isOpen || !onRequestClose) {
62
+ return;
63
+ }
64
+ var node = bodyRef.current;
65
+ if (!node) {
66
+ return;
67
+ }
68
+ var handleKeyDown = function handleKeyDown(event) {
69
+ if (event.key === 'Escape' && !event.defaultPrevented) {
70
+ onRequestClose();
71
+ }
72
+ };
73
+ node.addEventListener('keydown', handleKeyDown);
74
+ return function () {
75
+ return node.removeEventListener('keydown', handleKeyDown);
76
+ };
77
+ }, [isOpen, onRequestClose]);
78
+
79
+ // Move focus into the body on open and restore it to the trigger on close.
80
+ (0, _element.useEffect)(function () {
81
+ if (!isOpen) {
82
+ return;
83
+ }
84
+ var node = bodyRef.current;
85
+ if (node) {
86
+ var _node$ownerDocument$a, _node$ownerDocument;
87
+ previousActiveRef.current = (_node$ownerDocument$a = (_node$ownerDocument = node.ownerDocument) === null || _node$ownerDocument === void 0 ? void 0 : _node$ownerDocument.activeElement) !== null && _node$ownerDocument$a !== void 0 ? _node$ownerDocument$a : null;
88
+ var focusable = node.querySelector('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])');
89
+ (focusable !== null && focusable !== void 0 ? focusable : node).focus();
90
+ }
91
+ return function () {
92
+ var _previousActiveRef$cu, _previousActiveRef$cu2;
93
+ (_previousActiveRef$cu = previousActiveRef.current) === null || _previousActiveRef$cu === void 0 || (_previousActiveRef$cu2 = _previousActiveRef$cu.focus) === null || _previousActiveRef$cu2 === void 0 || _previousActiveRef$cu2.call(_previousActiveRef$cu);
94
+ };
95
+ }, [isOpen]);
96
+ var titleTag = "h".concat(titleLevel);
97
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_card["default"], {
98
+ className: (0, _classnames["default"])('newspack-card-form', className, {
99
+ 'newspack-card-form--open': isOpen
100
+ }),
101
+ __experimentalCoreCard: true,
102
+ isSmall: true,
103
+ __experimentalCoreProps: {
104
+ hasHeaderBorder: !isOpen,
105
+ header: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.__experimentalHStack, {
106
+ justify: "space-between",
107
+ style: {
108
+ width: '100%'
109
+ },
110
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.__experimentalVStack, {
111
+ spacing: 0,
112
+ style: {
113
+ flex: 1,
114
+ minWidth: 0
115
+ },
116
+ children: [(0, _element.createElement)(titleTag, {
117
+ id: titleId,
118
+ className: 'newspack-card-form__title'
119
+ }, title), description && /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
120
+ className: "newspack-card-form__description",
121
+ children: description
122
+ })]
123
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.__experimentalHStack, {
124
+ spacing: 2,
125
+ expanded: false,
126
+ children: [badge && /*#__PURE__*/(0, _jsxRuntime.jsx)(_badge["default"], {
127
+ text: badge.text,
128
+ level: (_badge$level = badge.level) !== null && _badge$level !== void 0 ? _badge$level : 'success'
129
+ }), actions]
130
+ })]
131
+ })
132
+ },
133
+ children: isOpen && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
134
+ ref: bodyRef,
135
+ id: bodyId,
136
+ role: "region",
137
+ "aria-labelledby": titleId,
138
+ tabIndex: -1,
139
+ className: "newspack-card-form__body",
140
+ children: children
141
+ })
142
+ });
143
+ };
144
+ var _default = exports["default"] = _CardForm;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * CardForm
3
+ */
4
+
5
+ @use "~@wordpress/base-styles/colors" as wp-colors;
6
+ @use "~@wordpress/base-styles/variables" as wp;
7
+
8
+ .newspack-card-form {
9
+ &__title {
10
+ font-size: wp.$font-size-large;
11
+ font-weight: 600;
12
+ line-height: wp.$font-line-height-large;
13
+ }
14
+
15
+ &__description {
16
+ color: wp-colors.$gray-700;
17
+ font-size: wp.$font-size-medium;
18
+ line-height: wp.$font-line-height-medium;
19
+ }
20
+ }
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.default = void 0;
7
+ exports["default"] = void 0;
8
+ var _classnames = _interopRequireDefault(require("classnames"));
7
9
  var _ = require("../");
8
10
  require("./style.scss");
9
11
  var _jsxRuntime = require("react/jsx-runtime");
@@ -11,21 +13,36 @@ var _jsxRuntime = require("react/jsx-runtime");
11
13
  * Card - Settings group component.
12
14
  */
13
15
 
16
+ /**
17
+ * External dependencies
18
+ */
19
+
14
20
  /**
15
21
  * Internal dependencies
16
22
  */
17
23
 
18
- const CardSettingsGroup = ({
19
- actionType = 'chevron',
20
- children,
21
- icon = null,
22
- title = '',
23
- description = '',
24
- isActive = false,
25
- onEnable = () => {}
26
- }) => {
24
+ var CardSettingsGroup = function CardSettingsGroup(_ref) {
25
+ var _ref$actionType = _ref.actionType,
26
+ actionType = _ref$actionType === void 0 ? 'none' : _ref$actionType,
27
+ children = _ref.children,
28
+ className = _ref.className,
29
+ _ref$disabled = _ref.disabled,
30
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
31
+ _ref$icon = _ref.icon,
32
+ icon = _ref$icon === void 0 ? null : _ref$icon,
33
+ headerAction = _ref.headerAction,
34
+ _ref$title = _ref.title,
35
+ title = _ref$title === void 0 ? '' : _ref$title,
36
+ _ref$description = _ref.description,
37
+ description = _ref$description === void 0 ? '' : _ref$description,
38
+ _ref$isActive = _ref.isActive,
39
+ isActive = _ref$isActive === void 0 ? false : _ref$isActive,
40
+ _ref$onEnable = _ref.onEnable,
41
+ onEnable = _ref$onEnable === void 0 ? function () {} : _ref$onEnable,
42
+ _ref$onHeaderClick = _ref.onHeaderClick,
43
+ onHeaderClick = _ref$onHeaderClick === void 0 ? function () {} : _ref$onHeaderClick;
27
44
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Card, {
28
- className: "newspack-card--core--settings-group",
45
+ className: (0, _classnames["default"])('newspack-card--core--settings-group', className),
29
46
  actionType: actionType,
30
47
  isSmall: true,
31
48
  __experimentalCoreCard: true,
@@ -37,13 +54,16 @@ const CardSettingsGroup = ({
37
54
  children: description
38
55
  })]
39
56
  }),
40
- onHeaderClick: onEnable,
41
- icon,
57
+ headerAction: headerAction,
58
+ onHeaderClick: onHeaderClick,
59
+ onToggle: onEnable,
60
+ disabled: disabled,
61
+ icon: icon,
42
62
  iconBackgroundColor: true,
43
- isActive,
44
- title
63
+ isActive: isActive,
64
+ title: title
45
65
  },
46
66
  children: isActive && children
47
67
  });
48
68
  };
49
- var _default = exports.default = CardSettingsGroup;
69
+ var _default = exports["default"] = CardSettingsGroup;