@plone/volto 17.0.0-alpha.24 → 17.0.0-alpha.26

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 (130) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/CHANGELOG.md +92 -4
  3. package/CONTRIBUTING.md +5 -1
  4. package/README.md +9 -7
  5. package/cypress/support/commands.js +12 -9
  6. package/cypress.config.js +1 -0
  7. package/locales/ca/LC_MESSAGES/volto.po +41 -15
  8. package/locales/ca.json +1 -1
  9. package/locales/de/LC_MESSAGES/volto.po +41 -15
  10. package/locales/de.json +1 -1
  11. package/locales/en/LC_MESSAGES/volto.po +40 -14
  12. package/locales/en.json +1 -1
  13. package/locales/es/LC_MESSAGES/volto.po +69 -43
  14. package/locales/es.json +1 -1
  15. package/locales/eu/LC_MESSAGES/volto.po +40 -14
  16. package/locales/eu.json +1 -1
  17. package/locales/fi/LC_MESSAGES/volto.po +40 -14
  18. package/locales/fi.json +1 -1
  19. package/locales/fr/LC_MESSAGES/volto.po +41 -15
  20. package/locales/fr.json +1 -1
  21. package/locales/it/LC_MESSAGES/volto.po +40 -14
  22. package/locales/it.json +1 -1
  23. package/locales/ja/LC_MESSAGES/volto.po +40 -14
  24. package/locales/ja.json +1 -1
  25. package/locales/nl/LC_MESSAGES/volto.po +41 -15
  26. package/locales/nl.json +1 -1
  27. package/locales/pt/LC_MESSAGES/volto.po +41 -15
  28. package/locales/pt.json +1 -1
  29. package/locales/pt_BR/LC_MESSAGES/volto.po +40 -14
  30. package/locales/pt_BR.json +1 -1
  31. package/locales/ro/LC_MESSAGES/volto.po +41 -15
  32. package/locales/ro.json +1 -1
  33. package/locales/volto.pot +41 -15
  34. package/locales/zh_CN/LC_MESSAGES/volto.po +41 -15
  35. package/locales/zh_CN.json +1 -1
  36. package/package.json +4 -4
  37. package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +90 -0
  38. package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +6 -0
  39. package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +6 -0
  40. package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +6 -0
  41. package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +10 -0
  42. package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +10 -0
  43. package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +30 -0
  44. package/packages/volto-slate/build/messages/src/elementEditor/messages.json +10 -0
  45. package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +6 -0
  46. package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +6 -0
  47. package/packages/volto-slate/package.json +1 -1
  48. package/packages/volto-slate/src/editor/render.jsx +2 -3
  49. package/src/actions/index.js +4 -0
  50. package/src/actions/navroot/navroot.js +16 -0
  51. package/src/actions/navroot/navroot.test.js +15 -0
  52. package/src/actions/relations/relations.js +17 -0
  53. package/src/actions/site/site.js +16 -0
  54. package/src/actions/site/site.test.js +15 -0
  55. package/src/actions/userSession/userSession.js +17 -1
  56. package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
  57. package/src/components/manage/Blocks/Block/Settings.test.jsx +90 -0
  58. package/src/components/manage/Blocks/Image/schema.js +5 -1
  59. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +18 -11
  60. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +42 -25
  61. package/src/components/manage/Blocks/ToC/View.jsx +75 -13
  62. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +4 -13
  63. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
  64. package/src/components/manage/Contents/Contents.jsx +27 -0
  65. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
  66. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +11 -9
  67. package/src/components/manage/Controlpanels/Relations/Relations.jsx +3 -3
  68. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +8 -7
  69. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +15 -9
  70. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +1 -1
  71. package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
  72. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +95 -5
  73. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
  74. package/src/components/manage/Diff/DiffField.jsx +25 -1
  75. package/src/components/manage/Form/BlockDataForm.jsx +3 -2
  76. package/src/components/manage/Form/BlockDataForm.test.jsx +34 -2
  77. package/src/components/manage/LinksToItem/LinksToItem.jsx +1 -1
  78. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +5 -2
  79. package/src/components/manage/Messages/Messages.jsx +32 -99
  80. package/src/components/manage/Messages/Messages.test.jsx +0 -1
  81. package/src/components/manage/Sharing/Sharing.jsx +50 -21
  82. package/src/components/manage/UniversalLink/UniversalLink.jsx +4 -6
  83. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  84. package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
  85. package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
  86. package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
  87. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
  88. package/src/components/manage/Widgets/SelectWidget.jsx +15 -1
  89. package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
  90. package/src/components/theme/Comments/Comment.stories.jsx +84 -0
  91. package/src/components/theme/Comments/Comments.jsx +273 -378
  92. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +37 -3
  93. package/src/components/theme/Login/Login.jsx +159 -241
  94. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
  95. package/src/components/theme/Logo/Logo.jsx +35 -29
  96. package/src/components/theme/Logo/Logo.test.jsx +135 -1
  97. package/src/components/theme/Logout/Logout.jsx +36 -83
  98. package/src/components/theme/Navigation/Navigation.jsx +86 -171
  99. package/src/components/theme/Search/SearchTags.jsx +30 -60
  100. package/src/components/theme/SearchWidget/SearchWidget.jsx +15 -3
  101. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  102. package/src/components/theme/Sitemap/Sitemap.jsx +24 -13
  103. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  104. package/src/components/theme/View/View.jsx +2 -0
  105. package/src/config/ControlPanels.js +0 -1
  106. package/src/config/Widgets.jsx +2 -0
  107. package/src/config/index.js +15 -3
  108. package/src/constants/ActionTypes.js +4 -0
  109. package/src/express-middleware/images.js +1 -0
  110. package/src/helpers/MessageLabels/MessageLabels.js +26 -4
  111. package/src/helpers/Site/index.js +21 -0
  112. package/src/helpers/index.js +1 -0
  113. package/src/reducers/index.js +4 -0
  114. package/src/reducers/navroot/navroot.js +79 -0
  115. package/src/reducers/navroot/navroot.test.js +110 -0
  116. package/src/reducers/relations/relations.js +74 -46
  117. package/src/reducers/site/site.js +51 -0
  118. package/src/reducers/site/site.test.js +67 -0
  119. package/src/reducers/userSession/userSession.js +15 -1
  120. package/src/server.jsx +9 -0
  121. package/test-setup-config.js +1 -0
  122. package/theme/themes/pastanaga/collections/form.overrides +46 -0
  123. package/theme/themes/pastanaga/elements/input.overrides +10 -0
  124. package/theme/themes/pastanaga/elements/label.overrides +10 -0
  125. package/theme/themes/pastanaga/extras/login.less +3 -0
  126. package/webpack-plugins/webpack-less-plugin.js +19 -0
  127. package/.gitignore~ +0 -71
  128. package/news/4547.breaking~ +0 -1
  129. package/package.json~ +0 -444
  130. package/src/config/index.js~ +0 -223
@@ -7,23 +7,29 @@ import {
7
7
  CREATE_RELATIONS,
8
8
  DELETE_RELATIONS,
9
9
  LIST_RELATIONS,
10
+ STATS_RELATIONS,
10
11
  REBUILD_RELATIONS,
11
12
  } from '@plone/volto/constants/ActionTypes';
12
13
 
13
14
  const initialState = {
14
- relations: null,
15
- stats: null,
16
- create: {
15
+ relations: {
17
16
  error: null,
18
17
  loaded: false,
19
18
  loading: false,
19
+ data: null,
20
20
  },
21
- delete: {
21
+ stats: {
22
+ error: null,
23
+ loaded: false,
24
+ loading: false,
25
+ data: null,
26
+ },
27
+ create: {
22
28
  error: null,
23
29
  loaded: false,
24
30
  loading: false,
25
31
  },
26
- list: {
32
+ delete: {
27
33
  error: null,
28
34
  loaded: false,
29
35
  loading: false,
@@ -55,17 +61,6 @@ function getRequestKey(actionType) {
55
61
  */
56
62
  export default function relations(state = initialState, action = {}) {
57
63
  switch (action.type) {
58
- case `${CREATE_RELATIONS}_PENDING`:
59
- case `${DELETE_RELATIONS}_PENDING`:
60
- case `${REBUILD_RELATIONS}_PENDING`:
61
- return {
62
- ...state,
63
- [getRequestKey(action.type)]: {
64
- loading: true,
65
- loaded: false,
66
- error: null,
67
- },
68
- };
69
64
  case `${LIST_RELATIONS}_PENDING`:
70
65
  return action.subrequest
71
66
  ? {
@@ -73,10 +68,7 @@ export default function relations(state = initialState, action = {}) {
73
68
  subrequests: {
74
69
  ...state.subrequests,
75
70
  [action.subrequest]: {
76
- ...(state.subrequests[action.subrequest] || {
77
- relations: null,
78
- stats: null,
79
- }),
71
+ data: null,
80
72
  loaded: false,
81
73
  loading: true,
82
74
  error: null,
@@ -85,7 +77,8 @@ export default function relations(state = initialState, action = {}) {
85
77
  }
86
78
  : {
87
79
  ...state,
88
- [getRequestKey(action.type)]: {
80
+ relations: {
81
+ data: null,
89
82
  loading: true,
90
83
  loaded: false,
91
84
  error: null,
@@ -98,39 +91,22 @@ export default function relations(state = initialState, action = {}) {
98
91
  subrequests: {
99
92
  ...state.subrequests,
100
93
  [action.subrequest]: {
94
+ data: action.result.relations,
101
95
  loading: false,
102
96
  loaded: true,
103
97
  error: null,
104
- relations: action.result.relations
105
- ? action.result.relations
106
- : [],
107
- stats: null,
108
98
  },
109
99
  },
110
100
  }
111
101
  : {
112
102
  ...state,
113
- relations: action.result.relations
114
- ? action.result.relations
115
- : state.relations,
116
- stats: action.result.stats ? action.result : state.stats,
117
- [getRequestKey(action.type)]: {
103
+ relations: {
104
+ data: action.result.relations,
118
105
  loading: false,
119
106
  loaded: true,
120
107
  error: null,
121
108
  },
122
109
  };
123
- case `${CREATE_RELATIONS}_SUCCESS`:
124
- case `${DELETE_RELATIONS}_SUCCESS`:
125
- case `${REBUILD_RELATIONS}_SUCCESS`:
126
- return {
127
- ...state,
128
- [getRequestKey(action.type)]: {
129
- loading: false,
130
- loaded: true,
131
- error: null,
132
- },
133
- };
134
110
  case `${LIST_RELATIONS}_FAIL`:
135
111
  return action.subrequest
136
112
  ? {
@@ -138,8 +114,7 @@ export default function relations(state = initialState, action = {}) {
138
114
  subrequests: {
139
115
  ...state.subrequests,
140
116
  [action.subrequest]: {
141
- relations: null,
142
- stats: null,
117
+ data: null,
143
118
  loading: false,
144
119
  loaded: false,
145
120
  error: action.error,
@@ -148,14 +123,67 @@ export default function relations(state = initialState, action = {}) {
148
123
  }
149
124
  : {
150
125
  ...state,
151
- relations: null,
152
- stats: null,
153
- [getRequestKey(action.type)]: {
126
+ relations: {
127
+ data: null,
154
128
  loading: false,
155
129
  loaded: false,
156
130
  error: action.error,
157
131
  },
158
132
  };
133
+
134
+ case `${STATS_RELATIONS}_PENDING`:
135
+ return {
136
+ ...state,
137
+ [getRequestKey(action.type)]: {
138
+ loading: true,
139
+ loaded: false,
140
+ error: null,
141
+ data: null,
142
+ },
143
+ };
144
+ case `${STATS_RELATIONS}_SUCCESS`:
145
+ return {
146
+ ...state,
147
+ [getRequestKey(action.type)]: {
148
+ loading: false,
149
+ loaded: true,
150
+ error: null,
151
+ data: action.result,
152
+ },
153
+ };
154
+ case `${STATS_RELATIONS}_FAIL`:
155
+ return {
156
+ ...state,
157
+ [getRequestKey(action.type)]: {
158
+ loading: false,
159
+ loaded: false,
160
+ error: action.error,
161
+ data: null,
162
+ },
163
+ };
164
+
165
+ case `${CREATE_RELATIONS}_PENDING`:
166
+ case `${DELETE_RELATIONS}_PENDING`:
167
+ case `${REBUILD_RELATIONS}_PENDING`:
168
+ return {
169
+ ...state,
170
+ [getRequestKey(action.type)]: {
171
+ loading: true,
172
+ loaded: false,
173
+ error: null,
174
+ },
175
+ };
176
+ case `${CREATE_RELATIONS}_SUCCESS`:
177
+ case `${DELETE_RELATIONS}_SUCCESS`:
178
+ case `${REBUILD_RELATIONS}_SUCCESS`:
179
+ return {
180
+ ...state,
181
+ [getRequestKey(action.type)]: {
182
+ loading: false,
183
+ loaded: true,
184
+ error: null,
185
+ },
186
+ };
159
187
  case `${CREATE_RELATIONS}_FAIL`:
160
188
  case `${DELETE_RELATIONS}_FAIL`:
161
189
  case `${REBUILD_RELATIONS}_FAIL`:
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Site reducer.
3
+ * @module reducers/site/site
4
+ */
5
+
6
+ import { GET_SITE } from '@plone/volto/constants/ActionTypes';
7
+
8
+ const initialState = {
9
+ error: null,
10
+ loaded: false,
11
+ loading: false,
12
+ data: {},
13
+ };
14
+
15
+ /**
16
+ * Site reducer.
17
+ * @function site
18
+ * @param {Object} state Current state.
19
+ * @param {Object} action Action to be handled.
20
+ * @returns {Object} New state.
21
+ */
22
+ export default function site(state = initialState, action = {}) {
23
+ switch (action.type) {
24
+ case `${GET_SITE}_PENDING`:
25
+ return {
26
+ ...state,
27
+ error: null,
28
+ loaded: false,
29
+ loading: true,
30
+ data: {},
31
+ };
32
+ case `${GET_SITE}_SUCCESS`:
33
+ return {
34
+ ...state,
35
+ error: null,
36
+ loaded: true,
37
+ loading: false,
38
+ data: action.result,
39
+ };
40
+ case `${GET_SITE}_FAIL`:
41
+ return {
42
+ ...state,
43
+ error: action.result,
44
+ loaded: false,
45
+ loading: false,
46
+ data: {},
47
+ };
48
+ default:
49
+ return state;
50
+ }
51
+ }
@@ -0,0 +1,67 @@
1
+ import { GET_SITE } from '@plone/volto/constants/ActionTypes';
2
+ import config from '@plone/volto/registry';
3
+ import site from './site';
4
+
5
+ const { settings } = config;
6
+
7
+ describe('Site reducer', () => {
8
+ it('should return the initial state', () => {
9
+ expect(site()).toEqual({
10
+ error: null,
11
+ data: {},
12
+ loaded: false,
13
+ loading: false,
14
+ });
15
+ });
16
+
17
+ it('should handle GET_SITE_PENDING', () => {
18
+ expect(
19
+ site(undefined, {
20
+ type: `${GET_SITE}_PENDING`,
21
+ }),
22
+ ).toEqual({
23
+ error: null,
24
+ data: {},
25
+ loaded: false,
26
+ loading: true,
27
+ });
28
+ });
29
+
30
+ it('should handle GET_SITE_SUCCESS', () => {
31
+ expect(
32
+ site(undefined, {
33
+ type: `${GET_SITE}_SUCCESS`,
34
+ result: {
35
+ title: 'Welcome to Plone!',
36
+ description:
37
+ 'Congratulations! You have successfully installed Plone.',
38
+ '@id': `${settings.apiPath}/front-page`,
39
+ },
40
+ }),
41
+ ).toEqual({
42
+ error: null,
43
+ data: {
44
+ '@id': `${settings.apiPath}/front-page`,
45
+ title: 'Welcome to Plone!',
46
+ description: 'Congratulations! You have successfully installed Plone.',
47
+ },
48
+
49
+ loaded: true,
50
+ loading: false,
51
+ });
52
+ });
53
+
54
+ it('should handle GET_SITE_FAIL', () => {
55
+ expect(
56
+ site(undefined, {
57
+ type: `${GET_SITE}_FAIL`,
58
+ error: 'failed',
59
+ }),
60
+ ).toEqual({
61
+ error: undefined,
62
+ data: {},
63
+ loaded: false,
64
+ loading: false,
65
+ });
66
+ });
67
+ });
@@ -3,7 +3,12 @@
3
3
  * @module reducers/userSession/userSession
4
4
  */
5
5
 
6
- import { LOGIN, LOGIN_RENEW, LOGOUT } from '@plone/volto/constants/ActionTypes';
6
+ import {
7
+ LOGIN,
8
+ LOGIN_RENEW,
9
+ LOGOUT,
10
+ RESET_LOGIN_REQUEST,
11
+ } from '@plone/volto/constants/ActionTypes';
7
12
 
8
13
  const initialState = {
9
14
  token: null,
@@ -61,6 +66,15 @@ export default function userSession(state = initialState, action = {}) {
61
66
  ...state,
62
67
  token: null,
63
68
  };
69
+ case `${RESET_LOGIN_REQUEST}`:
70
+ return {
71
+ ...state,
72
+ login: {
73
+ loading: false,
74
+ loaded: false,
75
+ error: null,
76
+ },
77
+ };
64
78
  default:
65
79
  return state;
66
80
  }
package/src/server.jsx CHANGED
@@ -263,6 +263,15 @@ server.get('/*', (req, res) => {
263
263
  const readCriticalCss =
264
264
  config.settings.serverConfig.readCriticalCss || defaultReadCriticalCss;
265
265
 
266
+ // If we are showing an "old browser" warning,
267
+ // make sure it doesn't get cached in a shared cache
268
+ const browserdetect = store.getState().browserdetect;
269
+ if (config.settings.notSupportedBrowsers.includes(browserdetect?.name)) {
270
+ res.set({
271
+ 'Cache-Control': 'private',
272
+ });
273
+ }
274
+
266
275
  if (context.url) {
267
276
  res.redirect(flattenToAppURL(context.url));
268
277
  } else if (context.error_code) {
@@ -54,6 +54,7 @@ const richtextViewSettings = {
54
54
 
55
55
  config.set('settings', {
56
56
  apiPath: 'http://localhost:8080/Plone',
57
+ publicURL: 'http://localhost:3000',
57
58
  defaultLanguage: 'en',
58
59
  supportedLanguages: ['en'],
59
60
  defaultPageSize: 25,
@@ -49,6 +49,52 @@
49
49
  }
50
50
  }
51
51
 
52
+ .ui.form .fields.error .field textarea,
53
+ .ui.form .fields.error .field select,
54
+ .ui.form .fields.error .field input:not([type]),
55
+ .ui.form .fields.error .field input[type='date'],
56
+ .ui.form .fields.error .field input[type='datetime-local'],
57
+ .ui.form .fields.error .field input[type='email'],
58
+ .ui.form .fields.error .field input[type='number'],
59
+ .ui.form .fields.error .field input[type='password'],
60
+ .ui.form .fields.error .field input[type='search'],
61
+ .ui.form .fields.error .field input[type='tel'],
62
+ .ui.form .fields.error .field input[type='time'],
63
+ .ui.form .fields.error .field input[type='text'],
64
+ .ui.form .fields.error .field input[type='file'],
65
+ .ui.form .fields.error .field input[type='url'],
66
+ .ui.form .field.error textarea,
67
+ .ui.form .field.error select,
68
+ .ui.form .field.error input:not([type]),
69
+ .ui.form .field.error input[type='date'],
70
+ .ui.form .field.error input[type='datetime-local'],
71
+ .ui.form .field.error input[type='email'],
72
+ .ui.form .field.error input[type='number'],
73
+ .ui.form .field.error input[type='password'],
74
+ .ui.form .field.error input[type='search'],
75
+ .ui.form .field.error input[type='tel'],
76
+ .ui.form .field.error input[type='time'],
77
+ .ui.form .field.error input[type='text'],
78
+ .ui.form .field.error input[type='file'],
79
+ .ui.form .field.error input[type='url'],
80
+ .ui.form .field.error textarea:focus,
81
+ .ui.form .field.error select:focus,
82
+ .ui.form .field.error input:not([type]):focus,
83
+ .ui.form .field.error input[type='date']:focus,
84
+ .ui.form .field.error input[type='datetime-local']:focus,
85
+ .ui.form .field.error input[type='email']:focus,
86
+ .ui.form .field.error input[type='number']:focus,
87
+ .ui.form .field.error input[type='password']:focus,
88
+ .ui.form .field.error input[type='search']:focus,
89
+ .ui.form .field.error input[type='tel']:focus,
90
+ .ui.form .field.error input[type='time']:focus,
91
+ .ui.form .field.error input[type='text']:focus,
92
+ .ui.form .field.error input[type='file']:focus,
93
+ .ui.form .field.error input[type='url']:focus {
94
+ border-color: #d01157;
95
+ background: none;
96
+ }
97
+
52
98
  .ui.form .field > .selection.dropdown {
53
99
  height: 60px;
54
100
  }
@@ -6,6 +6,16 @@
6
6
  font-weight: @inputFontWeight;
7
7
  }
8
8
 
9
+ /* This aligns the height of the field name label to the other side in case
10
+ of an error is present, it overrides a default from SemanticUI grid definitions. */
11
+ .inline.field .ui.grid > .stretched.row > .column > .wrapper {
12
+ flex-grow: 0;
13
+ }
14
+ /* Exception - Toolbar */
15
+ #toolbar .inline.field .ui.grid > .stretched.row > .column > .wrapper {
16
+ flex-grow: 1;
17
+ }
18
+
9
19
  .inline.field {
10
20
  .wrapper {
11
21
  display: flex;
@@ -6,3 +6,13 @@
6
6
  margin: 0em 0em 0em 0.75em;
7
7
  }
8
8
  }
9
+
10
+ .ui.form {
11
+ .ui.basic.red.label.form-error-label {
12
+ padding-left: 0;
13
+ border: none;
14
+ margin-top: 0;
15
+ color: #d01157 !important;
16
+ font-weight: normal;
17
+ }
18
+ }
@@ -1,4 +1,7 @@
1
1
  #page-login {
2
+ display: flex;
3
+ justify-content: center;
4
+
2
5
  .help {
3
6
  a {
4
7
  &:hover,
@@ -4,6 +4,24 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin');
4
4
  const PostCssFlexBugFixes = require('postcss-flexbugs-fixes');
5
5
  const postcssLoadConfig = require('postcss-load-config');
6
6
 
7
+ const interpolateName = require('loader-utils').interpolateName;
8
+
9
+ function normalizePath(file) {
10
+ return path.sep === '\\' ? file.replace(/\\/g, '/') : file;
11
+ }
12
+
13
+ // Custom function to not use 'loaderContext._module.matchResource' in hashing CSS class name.
14
+ function getLocalIdent(loaderContext, localIdentName, localName, options) {
15
+ const relativeResourcePath = normalizePath(
16
+ path.relative(options.context, loaderContext.resourcePath),
17
+ );
18
+
19
+ // eslint-disable-next-line no-param-reassign
20
+ options.content = `${options.hashPrefix}${relativeResourcePath}\x00${localName}`;
21
+
22
+ return interpolateName(loaderContext, localIdentName, options);
23
+ }
24
+
7
25
  const hasPostCssConfig = () => {
8
26
  try {
9
27
  return !!postcssLoadConfig.sync();
@@ -52,6 +70,7 @@ const defaultOptions = {
52
70
  modules: {
53
71
  auto: true,
54
72
  localIdentName: '[name]__[local]___[hash:base64:5]',
73
+ getLocalIdent: getLocalIdent,
55
74
  },
56
75
  },
57
76
  },
package/.gitignore~ DELETED
@@ -1,71 +0,0 @@
1
- # Node
2
- node_modules
3
- coverage
4
- jsdoc
5
- webpack-assets.json
6
- webpack-stats.json
7
- npm-debug.log
8
- junit.xml
9
- eslint.xml
10
- yarn-error.log
11
- build
12
-
13
- # Other
14
- .DS_Store
15
- .idea
16
- lighthouse-report.html
17
- .vscode/
18
- .#*
19
- *~
20
-
21
- # Python
22
- /api/.installed.cfg
23
- /api/.mr.developer.cfg
24
- /api/bin/
25
- /api/develop-eggs/
26
- /api/eggs/
27
- /api/include/
28
- /api/lib/
29
- /api/lib64/
30
- /api/notebook/env/
31
- /api/parts/
32
- /api/share/python-wheels/
33
- /api/src/
34
- /api/test/
35
- /api/var/
36
- /api/venv/
37
- /bin/
38
- /lib/
39
- .Python
40
- include
41
- pip-selfcheck.json
42
- pyvenv.cfg
43
- share
44
- /api/lib64
45
- lib64
46
-
47
- # locales
48
- locales/*.json
49
-
50
- # Tests
51
- /tests/bin
52
- /tests/develop-eggs
53
- /tests/parts
54
- /tests/.installed.cfg
55
- *.pyc
56
- geckodriver.log
57
- log.html
58
- output.xml
59
- report.html
60
- selenium-screenshot-*.png
61
- /selenium/
62
- cypress/videos/
63
- cypress/screenshots
64
-
65
- # Local environment setup
66
- .env
67
- public/critical.css
68
-
69
- # Sphinx and MyST
70
- docs/_build/
71
- /.python-version
@@ -1 +0,0 @@
1
- Update parse-url and release-it libraries. @davisagli