decap-cms-core 3.10.0 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/decap-cms-core.js +20 -20
  2. package/dist/decap-cms-core.js.map +1 -1
  3. package/dist/esm/actions/deploys.js +3 -2
  4. package/dist/esm/backend.js +5 -1
  5. package/dist/esm/bootstrap.js +2 -2
  6. package/dist/esm/components/App/StatusBar.js +1 -1
  7. package/dist/esm/components/Collection/CollectionControls.js +3 -2
  8. package/dist/esm/components/Collection/ViewStyleControl.js +6 -3
  9. package/dist/esm/components/Editor/EditorControlPane/EditorControl.js +8 -5
  10. package/dist/esm/components/Editor/EditorNotesPane/AddNoteForm.js +5 -5
  11. package/dist/esm/components/Editor/EditorNotesPane/EditorNotesPane.js +75 -15
  12. package/dist/esm/components/Editor/EditorNotesPane/NoteItem.js +21 -24
  13. package/dist/esm/components/Editor/EditorNotesPane/NotesList.js +4 -4
  14. package/dist/esm/components/Editor/EditorToolbar.js +52 -34
  15. package/dist/esm/components/MediaLibrary/MediaLibraryHeader.js +5 -3
  16. package/dist/esm/components/MediaLibrary/MediaLibraryTop.js +5 -4
  17. package/dist/esm/components/UI/ErrorBoundary.js +9 -8
  18. package/dist/esm/components/UI/SettingsDropdown.js +9 -7
  19. package/dist/esm/constants/configSchema.js +9 -0
  20. package/dist/esm/reducers/deploys.js +8 -3
  21. package/index.d.ts +5 -0
  22. package/package.json +2 -2
  23. package/src/actions/deploys.ts +4 -3
  24. package/src/backend.ts +8 -1
  25. package/src/components/Collection/CollectionControls.js +1 -1
  26. package/src/components/Collection/ViewStyleControl.js +3 -1
  27. package/src/components/Editor/EditorControlPane/EditorControl.js +1 -0
  28. package/src/components/Editor/EditorToolbar.js +40 -3
  29. package/src/components/Editor/__tests__/EditorToolbar.spec.js +46 -0
  30. package/src/components/MediaLibrary/MediaLibraryHeader.js +2 -2
  31. package/src/components/MediaLibrary/MediaLibraryTop.js +1 -0
  32. package/src/components/UI/ErrorBoundary.js +4 -3
  33. package/src/components/UI/SettingsDropdown.js +1 -1
  34. package/src/constants/configSchema.js +6 -0
  35. package/src/reducers/__tests__/deploys.spec.ts +111 -0
  36. package/src/reducers/deploys.ts +5 -3
  37. package/src/types/redux.ts +5 -0
  38. package/dist/esm/components/Collection/Entries/Pagination.js +0 -132
  39. package/dist/esm/lib/entryCache.js +0 -145
  40. package/dist/esm/lib/entryHelpers.js +0 -102
  41. package/dist/esm/lib/immutableHelpers.js +0 -21
  42. package/dist/esm/lib/pagination.js +0 -68
@@ -28,16 +28,18 @@ const ViewControlsButton = styled.button`
28
28
  }
29
29
  `;
30
30
 
31
- function ViewStyleControl({ viewStyle, onChangeViewStyle }) {
31
+ function ViewStyleControl({ viewStyle, onChangeViewStyle, t }) {
32
32
  return (
33
33
  <ViewControlsSection>
34
34
  <ViewControlsButton
35
+ aria-label={t('collection.collectionTop.viewAsList')}
35
36
  isActive={viewStyle === VIEW_STYLE_LIST}
36
37
  onClick={() => onChangeViewStyle(VIEW_STYLE_LIST)}
37
38
  >
38
39
  <Icon type="list" />
39
40
  </ViewControlsButton>
40
41
  <ViewControlsButton
42
+ aria-label={t('collection.collectionTop.viewAsGrid')}
41
43
  isActive={viewStyle === VIEW_STYLE_GRID}
42
44
  onClick={() => onChangeViewStyle(VIEW_STYLE_GRID)}
43
45
  >
@@ -245,6 +245,7 @@ class EditorControl extends React.Component {
245
245
  {({ css, cx }) => (
246
246
  <ControlContainer
247
247
  className={className}
248
+ aria-label={t('editor.editorControl.field.widgetLabel', { widgetLabel: widgetName })}
248
249
  css={css`
249
250
  ${isHidden && styleStrings.hidden};
250
251
  `}
@@ -230,6 +230,24 @@ const RefreshPreviewButton = styled.button`
230
230
  span {
231
231
  margin-right: 6px;
232
232
  }
233
+
234
+ &:disabled {
235
+ cursor: default;
236
+ opacity: 0.6;
237
+ }
238
+
239
+ ${Icon} {
240
+ ${props => props.$spinning && `animation: spin 1s linear infinite;`}
241
+ }
242
+
243
+ @keyframes spin {
244
+ from {
245
+ transform: rotate(0deg);
246
+ }
247
+ to {
248
+ transform: rotate(360deg);
249
+ }
250
+ }
233
251
  `;
234
252
 
235
253
  const PreviewLink = RefreshPreviewButton.withComponent('a');
@@ -285,17 +303,32 @@ export class EditorToolbar extends React.Component {
285
303
 
286
304
  const { isNewEntry, loadDeployPreview } = this.props;
287
305
  if (!isNewEntry) {
288
- loadDeployPreview({ maxAttempts: 3 });
306
+ // 24 attempts × 5s interval = ~2 min polling window.
307
+ // With editorial workflow, saving remounts the component (navigates to
308
+ // the unpublished entry view), so componentDidMount is the primary
309
+ // polling trigger — not componentDidUpdate.
310
+ this._pollController = new AbortController();
311
+ loadDeployPreview({ maxAttempts: 24, signal: this._pollController.signal });
289
312
  }
290
313
  }
291
314
 
292
315
  componentDidUpdate(prevProps) {
293
316
  const { isNewEntry, isPersisting, loadDeployPreview } = this.props;
294
317
  if (!isNewEntry && prevProps.isPersisting && !isPersisting) {
295
- loadDeployPreview({ maxAttempts: 3 });
318
+ // Abort any in-flight poll before starting a new one.
319
+ this._pollController?.abort();
320
+ this._pollController = new AbortController();
321
+ // Fires on subsequent saves when the component survives (no remount).
322
+ // In editorial workflow the first save remounts, so this mainly
323
+ // covers the second-save-and-beyond case.
324
+ loadDeployPreview({ maxAttempts: 3, signal: this._pollController.signal });
296
325
  }
297
326
  }
298
327
 
328
+ componentWillUnmount() {
329
+ this._pollController?.abort();
330
+ }
331
+
299
332
  renderSimpleControls = () => {
300
333
  const { collection, hasChanged, isNewEntry, showDelete, onDelete, t } = this.props;
301
334
  const canCreate = collection.get('create');
@@ -331,7 +364,11 @@ export class EditorToolbar extends React.Component {
331
364
  <Icon type="new-tab" size="xsmall" />
332
365
  </PreviewLink>
333
366
  ) : (
334
- <RefreshPreviewButton onClick={loadDeployPreview}>
367
+ <RefreshPreviewButton
368
+ onClick={loadDeployPreview}
369
+ disabled={isFetching}
370
+ $spinning={isFetching}
371
+ >
335
372
  <span>{t('editor.editorToolbar.deployPreviewPendingButtonLabel')}</span>
336
373
  <Icon type="refresh" size="xsmall" />
337
374
  </RefreshPreviewButton>
@@ -117,4 +117,50 @@ describe('EditorToolbar', () => {
117
117
  expect(asFragment()).toMatchSnapshot();
118
118
  });
119
119
  });
120
+
121
+ describe('deploy preview polling', () => {
122
+ it('should poll with maxAttempts: 24 and an AbortSignal on mount for existing entries', () => {
123
+ render(<EditorToolbar {...props} isNewEntry={false} />);
124
+ expect(props.loadDeployPreview).toHaveBeenCalledTimes(1);
125
+ const opts = props.loadDeployPreview.mock.calls[0][0];
126
+ expect(opts.maxAttempts).toBe(24);
127
+ expect(opts.signal).toBeInstanceOf(AbortSignal);
128
+ });
129
+
130
+ it('should not poll on mount for new entries', () => {
131
+ render(<EditorToolbar {...props} isNewEntry={true} />);
132
+ expect(props.loadDeployPreview).not.toHaveBeenCalled();
133
+ });
134
+
135
+ it('should poll with maxAttempts: 3 after a save completes', () => {
136
+ const { rerender } = render(<EditorToolbar {...props} isPersisting={true} />);
137
+ props.loadDeployPreview.mockClear();
138
+ rerender(<EditorToolbar {...props} isPersisting={false} />);
139
+ expect(props.loadDeployPreview).toHaveBeenCalledTimes(1);
140
+ const opts = props.loadDeployPreview.mock.calls[0][0];
141
+ expect(opts.maxAttempts).toBe(3);
142
+ expect(opts.signal).toBeInstanceOf(AbortSignal);
143
+ });
144
+
145
+ it('should abort polling on unmount', () => {
146
+ const { unmount } = render(<EditorToolbar {...props} isNewEntry={false} />);
147
+ const signal = props.loadDeployPreview.mock.calls[0][0].signal;
148
+ expect(signal.aborted).toBe(false);
149
+ unmount();
150
+ expect(signal.aborted).toBe(true);
151
+ });
152
+
153
+ it('should abort previous poll when a new save triggers a new poll', () => {
154
+ const { rerender } = render(<EditorToolbar {...props} isPersisting={false} />);
155
+ const firstSignal = props.loadDeployPreview.mock.calls[0][0].signal;
156
+
157
+ // Simulate save completing
158
+ rerender(<EditorToolbar {...props} isPersisting={true} />);
159
+ rerender(<EditorToolbar {...props} isPersisting={false} />);
160
+
161
+ expect(firstSignal.aborted).toBe(true);
162
+ const secondSignal = props.loadDeployPreview.mock.calls[1][0].signal;
163
+ expect(secondSignal.aborted).toBe(false);
164
+ });
165
+ });
120
166
  });
@@ -28,10 +28,10 @@ const LibraryTitle = styled.h1`
28
28
  color: ${props => props.isPrivate && colors.textFieldBorder};
29
29
  `;
30
30
 
31
- function MediaLibraryHeader({ onClose, title, isPrivate }) {
31
+ function MediaLibraryHeader({ onClose, title, isPrivate, t }) {
32
32
  return (
33
33
  <div>
34
- <CloseButton onClick={onClose}>
34
+ <CloseButton aria-label={t('mediaLibrary.mediaLibraryModal.close')} onClick={onClose}>
35
35
  <Icon type="close" />
36
36
  </CloseButton>
37
37
  <LibraryTitle isPrivate={isPrivate}>{title}</LibraryTitle>
@@ -70,6 +70,7 @@ function MediaLibraryTop({
70
70
  : t('mediaLibrary.mediaLibraryModal.mediaAssets')
71
71
  }`}
72
72
  isPrivate={privateUpload}
73
+ t={t}
73
74
  />
74
75
  <ButtonsContainer>
75
76
  <CopyToClipBoardButton
@@ -8,7 +8,7 @@ import copyToClipboard from 'copy-text-to-clipboard';
8
8
  import { localForage } from 'decap-cms-lib-util';
9
9
  import { buttons, colors } from 'decap-cms-ui-default';
10
10
 
11
- const ISSUE_URL = 'https://github.com/decaporg/decap-cms/issues/new?';
11
+ const ISSUE_URL = 'https://github.com/decaporg/decap-cms/issues/new';
12
12
 
13
13
  function getIssueTemplate({ version, provider, browser, config }) {
14
14
  return `
@@ -52,6 +52,7 @@ function buildIssueTemplate({ config }) {
52
52
  }
53
53
 
54
54
  function buildIssueUrl({ title, config }) {
55
+ const issueUrl = config?.issue_reports?.url ?? ISSUE_URL;
55
56
  try {
56
57
  const body = buildIssueTemplate({ config });
57
58
 
@@ -60,10 +61,10 @@ function buildIssueUrl({ title, config }) {
60
61
  params.append('body', truncate(body, { length: 4000, omission: '\n...' }));
61
62
  params.append('labels', 'type: bug');
62
63
 
63
- return `${ISSUE_URL}${params.toString()}`;
64
+ return `${issueUrl}?${params.toString()}`;
64
65
  } catch (e) {
65
66
  console.log(e);
66
- return `${ISSUE_URL}template=bug_report.md`;
67
+ return `${issueUrl}?template=bug_report.md`;
67
68
  }
68
69
  }
69
70
 
@@ -81,7 +81,7 @@ function SettingsDropdown({ displayUrl, isTestRepo, imageUrl, onLogoutClick, t }
81
81
  dropdownWidth="100px"
82
82
  dropdownPosition="right"
83
83
  renderButton={() => (
84
- <AvatarDropdownButton>
84
+ <AvatarDropdownButton aria-label={t('ui.settingsDropdown.account')}>
85
85
  <Avatar imageUrl={imageUrl} />
86
86
  </AvatarDropdownButton>
87
87
  )}
@@ -193,6 +193,12 @@ function getConfigSchema() {
193
193
  clean_accents: { type: 'boolean' },
194
194
  },
195
195
  },
196
+ issue_reports: {
197
+ type: 'object',
198
+ properties: {
199
+ url: { type: 'string', examples: ['https://example.com/report-issue'] },
200
+ },
201
+ },
196
202
  collections: {
197
203
  type: 'array',
198
204
  minItems: 1,
@@ -0,0 +1,111 @@
1
+ import deploys, { selectDeployPreview } from '../deploys';
2
+ import {
3
+ DEPLOY_PREVIEW_REQUEST,
4
+ DEPLOY_PREVIEW_SUCCESS,
5
+ DEPLOY_PREVIEW_FAILURE,
6
+ } from '../../actions/deploys';
7
+
8
+ describe('deploys reducer', () => {
9
+ it('should return the default state', () => {
10
+ const result = deploys(undefined, { type: 'UNKNOWN' });
11
+ expect(result).toEqual({});
12
+ });
13
+
14
+ describe('DEPLOY_PREVIEW_REQUEST', () => {
15
+ it('should set isFetching to true and status to PENDING', () => {
16
+ const result = deploys(undefined, {
17
+ type: DEPLOY_PREVIEW_REQUEST,
18
+ payload: { collection: 'posts', slug: 'my-post' },
19
+ });
20
+ expect(result['posts.my-post']).toEqual({ isFetching: true, status: 'PENDING' });
21
+ });
22
+
23
+ it('should clear stale url and replace status with PENDING', () => {
24
+ const staleState = {
25
+ 'posts.my-post': {
26
+ isFetching: false,
27
+ url: 'https://production.example.com/posts/my-post',
28
+ status: 'SUCCESS',
29
+ },
30
+ };
31
+ const result = deploys(staleState, {
32
+ type: DEPLOY_PREVIEW_REQUEST,
33
+ payload: { collection: 'posts', slug: 'my-post' },
34
+ });
35
+ expect(result['posts.my-post']).toEqual({ isFetching: true, status: 'PENDING' });
36
+ expect(result['posts.my-post'].url).toBeUndefined();
37
+ });
38
+ });
39
+
40
+ describe('DEPLOY_PREVIEW_SUCCESS', () => {
41
+ it('should store the deploy preview url and status', () => {
42
+ const initialState = {
43
+ 'posts.my-post': { isFetching: true },
44
+ };
45
+ const result = deploys(initialState, {
46
+ type: DEPLOY_PREVIEW_SUCCESS,
47
+ payload: {
48
+ collection: 'posts',
49
+ slug: 'my-post',
50
+ url: 'https://preview.example.com/posts/my-post',
51
+ status: 'SUCCESS',
52
+ },
53
+ });
54
+ expect(result['posts.my-post']).toEqual({
55
+ isFetching: false,
56
+ url: 'https://preview.example.com/posts/my-post',
57
+ status: 'SUCCESS',
58
+ });
59
+ });
60
+ });
61
+
62
+ describe('DEPLOY_PREVIEW_FAILURE', () => {
63
+ it('should set isFetching to false and status to PENDING', () => {
64
+ const initialState = {
65
+ 'posts.my-post': { isFetching: true, status: 'PENDING' },
66
+ };
67
+ const result = deploys(initialState, {
68
+ type: DEPLOY_PREVIEW_FAILURE,
69
+ payload: { collection: 'posts', slug: 'my-post' },
70
+ });
71
+ expect(result['posts.my-post'].isFetching).toBe(false);
72
+ expect(result['posts.my-post'].status).toBe('PENDING');
73
+ });
74
+
75
+ it('should clear url and replace status with PENDING to prevent stale data', () => {
76
+ const initialState = {
77
+ 'posts.my-post': {
78
+ isFetching: true,
79
+ url: 'https://production.example.com/posts/my-post',
80
+ status: 'SUCCESS',
81
+ },
82
+ };
83
+ const result = deploys(initialState, {
84
+ type: DEPLOY_PREVIEW_FAILURE,
85
+ payload: { collection: 'posts', slug: 'my-post' },
86
+ });
87
+ expect(result['posts.my-post']).toEqual({
88
+ isFetching: false,
89
+ url: undefined,
90
+ status: 'PENDING',
91
+ });
92
+ });
93
+ });
94
+
95
+ describe('selectDeployPreview', () => {
96
+ it('should return the deploy preview for a given collection and slug', () => {
97
+ const state = {
98
+ 'posts.my-post': {
99
+ isFetching: false,
100
+ url: 'https://preview.example.com/posts/my-post',
101
+ status: 'SUCCESS',
102
+ },
103
+ };
104
+ expect(selectDeployPreview(state, 'posts', 'my-post')).toBe(state['posts.my-post']);
105
+ });
106
+
107
+ it('should return undefined for unknown collection/slug', () => {
108
+ expect(selectDeployPreview({}, 'posts', 'unknown')).toBeUndefined();
109
+ });
110
+ });
111
+ });
@@ -23,8 +23,7 @@ const deploys = produce((state: Deploys, action: DeploysAction) => {
23
23
  case DEPLOY_PREVIEW_REQUEST: {
24
24
  const { collection, slug } = action.payload;
25
25
  const key = `${collection}.${slug}`;
26
- state[key] = state[key] || {};
27
- state[key].isFetching = true;
26
+ state[key] = { isFetching: true, status: 'PENDING' };
28
27
  break;
29
28
  }
30
29
 
@@ -39,7 +38,10 @@ const deploys = produce((state: Deploys, action: DeploysAction) => {
39
38
 
40
39
  case DEPLOY_PREVIEW_FAILURE: {
41
40
  const { collection, slug } = action.payload;
42
- state[`${collection}.${slug}`].isFetching = false;
41
+ const key = `${collection}.${slug}`;
42
+ state[key].isFetching = false;
43
+ state[key].url = undefined;
44
+ state[key].status = 'PENDING';
43
45
  break;
44
46
  }
45
47
  }
@@ -399,6 +399,10 @@ export interface CmsLocalBackend {
399
399
  allowed_hosts?: string[];
400
400
  }
401
401
 
402
+ export interface CmsIssueReports {
403
+ url?: string;
404
+ }
405
+
402
406
  export interface CmsConfig {
403
407
  backend: CmsBackend;
404
408
  collections: CmsCollection[];
@@ -427,6 +431,7 @@ export interface CmsConfig {
427
431
  }[];
428
432
  slug?: CmsSlug;
429
433
  i18n?: CmsI18nConfig;
434
+ issue_reports?: CmsIssueReports;
430
435
  local_backend?: boolean | CmsLocalBackend;
431
436
  editor?: {
432
437
  preview?: boolean;
@@ -1,132 +0,0 @@
1
- import _styled from "@emotion/styled/base";
2
- function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
3
- import React from 'react';
4
- import PropTypes from 'prop-types';
5
- import { translate } from 'react-polyglot';
6
- import { Icon, colors } from 'decap-cms-ui-default';
7
- import { jsx as ___EmotionJSX } from "@emotion/react";
8
- const PaginationControls = /*#__PURE__*/_styled("div", {
9
- target: "e1h9cohn2",
10
- label: "PaginationControls"
11
- })(process.env.NODE_ENV === "production" ? {
12
- name: "dwn323",
13
- styles: "display:flex;align-items:center;justify-content:center;gap:0.5rem;margin:2rem"
14
- } : {
15
- name: "dwn323",
16
- styles: "display:flex;align-items:center;justify-content:center;gap:0.5rem;margin:2rem/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0NvbGxlY3Rpb24vRW50cmllcy9QYWdpbmF0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1xQyIsImZpbGUiOiIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Db2xsZWN0aW9uL0VudHJpZXMvUGFnaW5hdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAncmVhY3QtcG9seWdsb3QnO1xuaW1wb3J0IHsgSWNvbiwgY29sb3JzIH0gZnJvbSAnZGVjYXAtY21zLXVpLWRlZmF1bHQnO1xuXG5jb25zdCBQYWdpbmF0aW9uQ29udHJvbHMgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZ2FwOiAwLjVyZW07XG4gIG1hcmdpbjogMnJlbTtcbmA7XG5cbmNvbnN0IFBhZ2luYXRpb25JbmZvID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTJweDtcbmA7XG5cbmNvbnN0IFBhZ2luYXRpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uYFxuICBwYWRkaW5nOiA2cHggNnB4IDRweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuYnV0dG9ufTtcbiAgY29sb3I6ICR7Y29sb3JzLmJ1dHRvblRleHR9O1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY3Vyc29yOiAke3Byb3BzID0+IChwcm9wcy5kaXNhYmxlZCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcicpfTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG5cbiAgJjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzU1NWE2NTtcbiAgfVxuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNTtcbiAgfVxuYDtcblxuLyoqXG4gKiBQYWdpbmF0aW9uIGNvbXBvbmVudCBmb3IgZW50cnkgY29sbGVjdGlvbnMuXG4gKlxuICogUHJvdmlkZXMgYWNjZXNzaWJsZSBuYXZpZ2F0aW9uIGNvbnRyb2xzIGZvciBwYWdpbmF0ZWQgZW50cnkgbGlzdHMuXG4gKiBVc2VzIGh5YnJpZCBwYWdpbmF0aW9uIGFwcHJvYWNoIC0gc2VydmVyLXNpZGUgYnkgZGVmYXVsdCwgY2xpZW50LXNpZGVcbiAqIHdoZW4gc29ydGluZy9maWx0ZXJpbmcvZ3JvdXBpbmcgaXMgYWN0aXZlLlxuICpcbiAqIEFjY2Vzc2liaWxpdHkgZmVhdHVyZXM6XG4gKiAtIEFSSUEgbGFiZWxzIGFuZCByb2xlcyBmb3Igc2NyZWVuIHJlYWRlciBzdXBwb3J0XG4gKiAtIEtleWJvYXJkIG5hdmlnYXRpb24gc3VwcG9ydFxuICogLSBMaXZlIHJlZ2lvbiBhbm5vdW5jZW1lbnRzIGZvciBwYWdlIGNoYW5nZXNcbiAqIC0gUHJvcGVyIGRpc2FibGVkIHN0YXRlIGhhbmRsaW5nXG4gKi9cbmZ1bmN0aW9uIFBhZ2luYXRpb24oeyBjdXJyZW50UGFnZSwgcGFnZUNvdW50LCBwYWdlU2l6ZSwgdG90YWxDb3VudCwgb25QYWdlQ2hhbmdlLCB0IH0pIHtcbiAgY29uc3QgaGFzUHJldlBhZ2UgPSBjdXJyZW50UGFnZSA+IDE7XG4gIGNvbnN0IGhhc05leHRQYWdlID0gY3VycmVudFBhZ2UgPCBwYWdlQ291bnQ7XG5cbiAgY29uc3Qgc3RhcnRFbnRyeSA9IHRvdGFsQ291bnQgPT09IDAgPyAwIDogKGN1cnJlbnRQYWdlIC0gMSkgKiBwYWdlU2l6ZSArIDE7XG4gIGNvbnN0IGVuZEVudHJ5ID0gdG90YWxDb3VudCA9PT0gMCA/IDAgOiBNYXRoLm1pbihjdXJyZW50UGFnZSAqIHBhZ2VTaXplLCB0b3RhbENvdW50KTtcblxuICByZXR1cm4gKFxuICAgIDxuYXYgcm9sZT1cIm5hdmlnYXRpb25cIiBhcmlhLWxhYmVsPXt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ubmF2aWdhdGlvbicpfT5cbiAgICAgIDxQYWdpbmF0aW9uQ29udHJvbHM+XG4gICAgICAgIDxQYWdpbmF0aW9uQnV0dG9uXG4gICAgICAgICAgZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblBhZ2VDaGFuZ2UoMSl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmZpcnN0Jyl9XG4gICAgICAgICAgdGl0bGU9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5maXJzdCcpfVxuICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxJY29uIHR5cGU9XCJjaGV2cm9uLWRvdWJsZVwiIHNpemU9XCJzbWFsbFwiIGRpcmVjdGlvbj1cImxlZnRcIiAvPlxuICAgICAgICA8L1BhZ2luYXRpb25CdXR0b24+XG4gICAgICAgIDxQYWdpbmF0aW9uQnV0dG9uXG4gICAgICAgICAgZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblBhZ2VDaGFuZ2UoY3VycmVudFBhZ2UgLSAxKX1cbiAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ucHJldmlvdXMnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnByZXZpb3VzJyl9XG4gICAgICAgICAgYXJpYS1kaXNhYmxlZD17IWhhc1ByZXZQYWdlfVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gdHlwZT1cImNoZXZyb25cIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJsZWZ0XCIgLz5cbiAgICAgICAgPC9QYWdpbmF0aW9uQnV0dG9uPlxuXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgc3R5bGU9e3sgY29sb3I6IGNvbG9ycy50ZXh0LCBmb250U2l6ZTogJzE0cHgnLCBwYWRkaW5nOiAnMCA4cHgnIH19XG4gICAgICAgICAgYXJpYS1jdXJyZW50PVwicGFnZVwiXG4gICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ucGFnZScsIHsgY3VycmVudDogY3VycmVudFBhZ2UsIHRvdGFsOiBwYWdlQ291bnQgfSl9XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKGN1cnJlbnRQYWdlICsgMSl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLm5leHQnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLm5leHQnKX1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiB0eXBlPVwiY2hldnJvblwiIHNpemU9XCJzbWFsbFwiIGRpcmVjdGlvbj1cInJpZ2h0XCIgLz5cbiAgICAgICAgPC9QYWdpbmF0aW9uQnV0dG9uPlxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKHBhZ2VDb3VudCl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmxhc3QnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmxhc3QnKX1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiB0eXBlPVwiY2hldnJvbi1kb3VibGVcIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJyaWdodFwiIC8+XG4gICAgICAgIDwvUGFnaW5hdGlvbkJ1dHRvbj5cbiAgICAgIDwvUGFnaW5hdGlvbkNvbnRyb2xzPlxuXG4gICAgICA8UGFnaW5hdGlvbkluZm8gcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICB7dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnNob3dpbmcnLCB7XG4gICAgICAgICAgICBzdGFydDogc3RhcnRFbnRyeSxcbiAgICAgICAgICAgIGVuZDogZW5kRW50cnksXG4gICAgICAgICAgICB0b3RhbDogdG90YWxDb3VudCxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9QYWdpbmF0aW9uSW5mbz5cbiAgICA8L25hdj5cbiAgKTtcbn1cblxuUGFnaW5hdGlvbi5wcm9wVHlwZXMgPSB7XG4gIGN1cnJlbnRQYWdlOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHBhZ2VDb3VudDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBwYWdlU2l6ZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0b3RhbENvdW50OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIG9uUGFnZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRyYW5zbGF0ZSgpKFBhZ2luYXRpb24pO1xuIl19 */",
17
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
18
- });
19
- const PaginationInfo = /*#__PURE__*/_styled("div", {
20
- target: "e1h9cohn1",
21
- label: "PaginationInfo"
22
- })(process.env.NODE_ENV === "production" ? {
23
- name: "1crwq3a",
24
- styles: "display:flex;justify-content:center;align-items:center;gap:12px"
25
- } : {
26
- name: "1crwq3a",
27
- styles: "display:flex;justify-content:center;align-items:center;gap:12px/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0NvbGxlY3Rpb24vRW50cmllcy9QYWdpbmF0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWNpQyIsImZpbGUiOiIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Db2xsZWN0aW9uL0VudHJpZXMvUGFnaW5hdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAncmVhY3QtcG9seWdsb3QnO1xuaW1wb3J0IHsgSWNvbiwgY29sb3JzIH0gZnJvbSAnZGVjYXAtY21zLXVpLWRlZmF1bHQnO1xuXG5jb25zdCBQYWdpbmF0aW9uQ29udHJvbHMgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZ2FwOiAwLjVyZW07XG4gIG1hcmdpbjogMnJlbTtcbmA7XG5cbmNvbnN0IFBhZ2luYXRpb25JbmZvID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTJweDtcbmA7XG5cbmNvbnN0IFBhZ2luYXRpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uYFxuICBwYWRkaW5nOiA2cHggNnB4IDRweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuYnV0dG9ufTtcbiAgY29sb3I6ICR7Y29sb3JzLmJ1dHRvblRleHR9O1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY3Vyc29yOiAke3Byb3BzID0+IChwcm9wcy5kaXNhYmxlZCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcicpfTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG5cbiAgJjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzU1NWE2NTtcbiAgfVxuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNTtcbiAgfVxuYDtcblxuLyoqXG4gKiBQYWdpbmF0aW9uIGNvbXBvbmVudCBmb3IgZW50cnkgY29sbGVjdGlvbnMuXG4gKlxuICogUHJvdmlkZXMgYWNjZXNzaWJsZSBuYXZpZ2F0aW9uIGNvbnRyb2xzIGZvciBwYWdpbmF0ZWQgZW50cnkgbGlzdHMuXG4gKiBVc2VzIGh5YnJpZCBwYWdpbmF0aW9uIGFwcHJvYWNoIC0gc2VydmVyLXNpZGUgYnkgZGVmYXVsdCwgY2xpZW50LXNpZGVcbiAqIHdoZW4gc29ydGluZy9maWx0ZXJpbmcvZ3JvdXBpbmcgaXMgYWN0aXZlLlxuICpcbiAqIEFjY2Vzc2liaWxpdHkgZmVhdHVyZXM6XG4gKiAtIEFSSUEgbGFiZWxzIGFuZCByb2xlcyBmb3Igc2NyZWVuIHJlYWRlciBzdXBwb3J0XG4gKiAtIEtleWJvYXJkIG5hdmlnYXRpb24gc3VwcG9ydFxuICogLSBMaXZlIHJlZ2lvbiBhbm5vdW5jZW1lbnRzIGZvciBwYWdlIGNoYW5nZXNcbiAqIC0gUHJvcGVyIGRpc2FibGVkIHN0YXRlIGhhbmRsaW5nXG4gKi9cbmZ1bmN0aW9uIFBhZ2luYXRpb24oeyBjdXJyZW50UGFnZSwgcGFnZUNvdW50LCBwYWdlU2l6ZSwgdG90YWxDb3VudCwgb25QYWdlQ2hhbmdlLCB0IH0pIHtcbiAgY29uc3QgaGFzUHJldlBhZ2UgPSBjdXJyZW50UGFnZSA+IDE7XG4gIGNvbnN0IGhhc05leHRQYWdlID0gY3VycmVudFBhZ2UgPCBwYWdlQ291bnQ7XG5cbiAgY29uc3Qgc3RhcnRFbnRyeSA9IHRvdGFsQ291bnQgPT09IDAgPyAwIDogKGN1cnJlbnRQYWdlIC0gMSkgKiBwYWdlU2l6ZSArIDE7XG4gIGNvbnN0IGVuZEVudHJ5ID0gdG90YWxDb3VudCA9PT0gMCA/IDAgOiBNYXRoLm1pbihjdXJyZW50UGFnZSAqIHBhZ2VTaXplLCB0b3RhbENvdW50KTtcblxuICByZXR1cm4gKFxuICAgIDxuYXYgcm9sZT1cIm5hdmlnYXRpb25cIiBhcmlhLWxhYmVsPXt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ubmF2aWdhdGlvbicpfT5cbiAgICAgIDxQYWdpbmF0aW9uQ29udHJvbHM+XG4gICAgICAgIDxQYWdpbmF0aW9uQnV0dG9uXG4gICAgICAgICAgZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblBhZ2VDaGFuZ2UoMSl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmZpcnN0Jyl9XG4gICAgICAgICAgdGl0bGU9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5maXJzdCcpfVxuICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxJY29uIHR5cGU9XCJjaGV2cm9uLWRvdWJsZVwiIHNpemU9XCJzbWFsbFwiIGRpcmVjdGlvbj1cImxlZnRcIiAvPlxuICAgICAgICA8L1BhZ2luYXRpb25CdXR0b24+XG4gICAgICAgIDxQYWdpbmF0aW9uQnV0dG9uXG4gICAgICAgICAgZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblBhZ2VDaGFuZ2UoY3VycmVudFBhZ2UgLSAxKX1cbiAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ucHJldmlvdXMnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnByZXZpb3VzJyl9XG4gICAgICAgICAgYXJpYS1kaXNhYmxlZD17IWhhc1ByZXZQYWdlfVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gdHlwZT1cImNoZXZyb25cIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJsZWZ0XCIgLz5cbiAgICAgICAgPC9QYWdpbmF0aW9uQnV0dG9uPlxuXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgc3R5bGU9e3sgY29sb3I6IGNvbG9ycy50ZXh0LCBmb250U2l6ZTogJzE0cHgnLCBwYWRkaW5nOiAnMCA4cHgnIH19XG4gICAgICAgICAgYXJpYS1jdXJyZW50PVwicGFnZVwiXG4gICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ucGFnZScsIHsgY3VycmVudDogY3VycmVudFBhZ2UsIHRvdGFsOiBwYWdlQ291bnQgfSl9XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKGN1cnJlbnRQYWdlICsgMSl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLm5leHQnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLm5leHQnKX1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiB0eXBlPVwiY2hldnJvblwiIHNpemU9XCJzbWFsbFwiIGRpcmVjdGlvbj1cInJpZ2h0XCIgLz5cbiAgICAgICAgPC9QYWdpbmF0aW9uQnV0dG9uPlxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKHBhZ2VDb3VudCl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmxhc3QnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmxhc3QnKX1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiB0eXBlPVwiY2hldnJvbi1kb3VibGVcIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJyaWdodFwiIC8+XG4gICAgICAgIDwvUGFnaW5hdGlvbkJ1dHRvbj5cbiAgICAgIDwvUGFnaW5hdGlvbkNvbnRyb2xzPlxuXG4gICAgICA8UGFnaW5hdGlvbkluZm8gcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICB7dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnNob3dpbmcnLCB7XG4gICAgICAgICAgICBzdGFydDogc3RhcnRFbnRyeSxcbiAgICAgICAgICAgIGVuZDogZW5kRW50cnksXG4gICAgICAgICAgICB0b3RhbDogdG90YWxDb3VudCxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9QYWdpbmF0aW9uSW5mbz5cbiAgICA8L25hdj5cbiAgKTtcbn1cblxuUGFnaW5hdGlvbi5wcm9wVHlwZXMgPSB7XG4gIGN1cnJlbnRQYWdlOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHBhZ2VDb3VudDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBwYWdlU2l6ZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0b3RhbENvdW50OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIG9uUGFnZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRyYW5zbGF0ZSgpKFBhZ2luYXRpb24pO1xuIl19 */",
28
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
29
- });
30
- const PaginationButton = /*#__PURE__*/_styled("button", {
31
- target: "e1h9cohn0",
32
- label: "PaginationButton"
33
- })("padding:6px 6px 4px;background-color:", colors.button, ";color:", colors.buttonText, ";border:none;border-radius:4px;cursor:", props => props.disabled ? 'not-allowed' : 'pointer', ";font-size:12px;transition:background-color 0.2s;&:hover:not(:disabled){background-color:#555a65;}&:disabled{opacity:0.5;}" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0NvbGxlY3Rpb24vRW50cmllcy9QYWdpbmF0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCc0MiLCJmaWxlIjoiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvQ29sbGVjdGlvbi9FbnRyaWVzL1BhZ2luYXRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJ3JlYWN0LXBvbHlnbG90JztcbmltcG9ydCB7IEljb24sIGNvbG9ycyB9IGZyb20gJ2RlY2FwLWNtcy11aS1kZWZhdWx0JztcblxuY29uc3QgUGFnaW5hdGlvbkNvbnRyb2xzID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGdhcDogMC41cmVtO1xuICBtYXJnaW46IDJyZW07XG5gO1xuXG5jb25zdCBQYWdpbmF0aW9uSW5mbyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDEycHg7XG5gO1xuXG5jb25zdCBQYWdpbmF0aW9uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbmBcbiAgcGFkZGluZzogNnB4IDZweCA0cHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3JzLmJ1dHRvbn07XG4gIGNvbG9yOiAke2NvbG9ycy5idXR0b25UZXh0fTtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGN1cnNvcjogJHtwcm9wcyA9PiAocHJvcHMuZGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInKX07XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjJzO1xuXG4gICY6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM1NTVhNjU7XG4gIH1cblxuICAmOmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjU7XG4gIH1cbmA7XG5cbi8qKlxuICogUGFnaW5hdGlvbiBjb21wb25lbnQgZm9yIGVudHJ5IGNvbGxlY3Rpb25zLlxuICpcbiAqIFByb3ZpZGVzIGFjY2Vzc2libGUgbmF2aWdhdGlvbiBjb250cm9scyBmb3IgcGFnaW5hdGVkIGVudHJ5IGxpc3RzLlxuICogVXNlcyBoeWJyaWQgcGFnaW5hdGlvbiBhcHByb2FjaCAtIHNlcnZlci1zaWRlIGJ5IGRlZmF1bHQsIGNsaWVudC1zaWRlXG4gKiB3aGVuIHNvcnRpbmcvZmlsdGVyaW5nL2dyb3VwaW5nIGlzIGFjdGl2ZS5cbiAqXG4gKiBBY2Nlc3NpYmlsaXR5IGZlYXR1cmVzOlxuICogLSBBUklBIGxhYmVscyBhbmQgcm9sZXMgZm9yIHNjcmVlbiByZWFkZXIgc3VwcG9ydFxuICogLSBLZXlib2FyZCBuYXZpZ2F0aW9uIHN1cHBvcnRcbiAqIC0gTGl2ZSByZWdpb24gYW5ub3VuY2VtZW50cyBmb3IgcGFnZSBjaGFuZ2VzXG4gKiAtIFByb3BlciBkaXNhYmxlZCBzdGF0ZSBoYW5kbGluZ1xuICovXG5mdW5jdGlvbiBQYWdpbmF0aW9uKHsgY3VycmVudFBhZ2UsIHBhZ2VDb3VudCwgcGFnZVNpemUsIHRvdGFsQ291bnQsIG9uUGFnZUNoYW5nZSwgdCB9KSB7XG4gIGNvbnN0IGhhc1ByZXZQYWdlID0gY3VycmVudFBhZ2UgPiAxO1xuICBjb25zdCBoYXNOZXh0UGFnZSA9IGN1cnJlbnRQYWdlIDwgcGFnZUNvdW50O1xuXG4gIGNvbnN0IHN0YXJ0RW50cnkgPSB0b3RhbENvdW50ID09PSAwID8gMCA6IChjdXJyZW50UGFnZSAtIDEpICogcGFnZVNpemUgKyAxO1xuICBjb25zdCBlbmRFbnRyeSA9IHRvdGFsQ291bnQgPT09IDAgPyAwIDogTWF0aC5taW4oY3VycmVudFBhZ2UgKiBwYWdlU2l6ZSwgdG90YWxDb3VudCk7XG5cbiAgcmV0dXJuIChcbiAgICA8bmF2IHJvbGU9XCJuYXZpZ2F0aW9uXCIgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLm5hdmlnYXRpb24nKX0+XG4gICAgICA8UGFnaW5hdGlvbkNvbnRyb2xzPlxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzUHJldlBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKDEpfVxuICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5maXJzdCcpfVxuICAgICAgICAgIHRpdGxlPXt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24uZmlyc3QnKX1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXshaGFzUHJldlBhZ2V9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiB0eXBlPVwiY2hldnJvbi1kb3VibGVcIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJsZWZ0XCIgLz5cbiAgICAgICAgPC9QYWdpbmF0aW9uQnV0dG9uPlxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzUHJldlBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKGN1cnJlbnRQYWdlIC0gMSl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnByZXZpb3VzJyl9XG4gICAgICAgICAgdGl0bGU9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5wcmV2aW91cycpfVxuICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxJY29uIHR5cGU9XCJjaGV2cm9uXCIgc2l6ZT1cInNtYWxsXCIgZGlyZWN0aW9uPVwibGVmdFwiIC8+XG4gICAgICAgIDwvUGFnaW5hdGlvbkJ1dHRvbj5cblxuICAgICAgICA8c3BhblxuICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiBjb2xvcnMudGV4dCwgZm9udFNpemU6ICcxNHB4JywgcGFkZGluZzogJzAgOHB4JyB9fVxuICAgICAgICAgIGFyaWEtY3VycmVudD1cInBhZ2VcIlxuICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnBhZ2UnLCB7IGN1cnJlbnQ6IGN1cnJlbnRQYWdlLCB0b3RhbDogcGFnZUNvdW50IH0pfVxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPFBhZ2luYXRpb25CdXR0b25cbiAgICAgICAgICBkaXNhYmxlZD17IWhhc05leHRQYWdlfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uUGFnZUNoYW5nZShjdXJyZW50UGFnZSArIDEpfVxuICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5uZXh0Jyl9XG4gICAgICAgICAgdGl0bGU9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5uZXh0Jyl9XG4gICAgICAgICAgYXJpYS1kaXNhYmxlZD17IWhhc05leHRQYWdlfVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gdHlwZT1cImNoZXZyb25cIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJyaWdodFwiIC8+XG4gICAgICAgIDwvUGFnaW5hdGlvbkJ1dHRvbj5cbiAgICAgICAgPFBhZ2luYXRpb25CdXR0b25cbiAgICAgICAgICBkaXNhYmxlZD17IWhhc05leHRQYWdlfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uUGFnZUNoYW5nZShwYWdlQ291bnQpfVxuICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5sYXN0Jyl9XG4gICAgICAgICAgdGl0bGU9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5sYXN0Jyl9XG4gICAgICAgICAgYXJpYS1kaXNhYmxlZD17IWhhc05leHRQYWdlfVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gdHlwZT1cImNoZXZyb24tZG91YmxlXCIgc2l6ZT1cInNtYWxsXCIgZGlyZWN0aW9uPVwicmlnaHRcIiAvPlxuICAgICAgICA8L1BhZ2luYXRpb25CdXR0b24+XG4gICAgICA8L1BhZ2luYXRpb25Db250cm9scz5cblxuICAgICAgPFBhZ2luYXRpb25JbmZvIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWF0b21pYz1cInRydWVcIj5cbiAgICAgICAgPHNwYW4+XG4gICAgICAgICAge3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5zaG93aW5nJywge1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0RW50cnksXG4gICAgICAgICAgICBlbmQ6IGVuZEVudHJ5LFxuICAgICAgICAgICAgdG90YWw6IHRvdGFsQ291bnQsXG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvUGFnaW5hdGlvbkluZm8+XG4gICAgPC9uYXY+XG4gICk7XG59XG5cblBhZ2luYXRpb24ucHJvcFR5cGVzID0ge1xuICBjdXJyZW50UGFnZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBwYWdlQ291bnQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcGFnZVNpemU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdG90YWxDb3VudDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBvblBhZ2VDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB0cmFuc2xhdGUoKShQYWdpbmF0aW9uKTtcbiJdfQ== */"));
34
-
35
- /**
36
- * Pagination component for entry collections.
37
- *
38
- * Provides accessible navigation controls for paginated entry lists.
39
- * Uses hybrid pagination approach - server-side by default, client-side
40
- * when sorting/filtering/grouping is active.
41
- *
42
- * Accessibility features:
43
- * - ARIA labels and roles for screen reader support
44
- * - Keyboard navigation support
45
- * - Live region announcements for page changes
46
- * - Proper disabled state handling
47
- */
48
- function Pagination({
49
- currentPage,
50
- pageCount,
51
- pageSize,
52
- totalCount,
53
- onPageChange,
54
- t
55
- }) {
56
- const hasPrevPage = currentPage > 1;
57
- const hasNextPage = currentPage < pageCount;
58
- const startEntry = totalCount === 0 ? 0 : (currentPage - 1) * pageSize + 1;
59
- const endEntry = totalCount === 0 ? 0 : Math.min(currentPage * pageSize, totalCount);
60
- return ___EmotionJSX("nav", {
61
- role: "navigation",
62
- "aria-label": t('collection.pagination.navigation')
63
- }, ___EmotionJSX(PaginationControls, null, ___EmotionJSX(PaginationButton, {
64
- disabled: !hasPrevPage,
65
- onClick: () => onPageChange(1),
66
- "aria-label": t('collection.pagination.first'),
67
- title: t('collection.pagination.first'),
68
- "aria-disabled": !hasPrevPage
69
- }, ___EmotionJSX(Icon, {
70
- type: "chevron-double",
71
- size: "small",
72
- direction: "left"
73
- })), ___EmotionJSX(PaginationButton, {
74
- disabled: !hasPrevPage,
75
- onClick: () => onPageChange(currentPage - 1),
76
- "aria-label": t('collection.pagination.previous'),
77
- title: t('collection.pagination.previous'),
78
- "aria-disabled": !hasPrevPage
79
- }, ___EmotionJSX(Icon, {
80
- type: "chevron",
81
- size: "small",
82
- direction: "left"
83
- })), ___EmotionJSX("span", {
84
- style: {
85
- color: colors.text,
86
- fontSize: '14px',
87
- padding: '0 8px'
88
- },
89
- "aria-current": "page",
90
- "aria-live": "polite"
91
- }, t('collection.pagination.page', {
92
- current: currentPage,
93
- total: pageCount
94
- })), ___EmotionJSX(PaginationButton, {
95
- disabled: !hasNextPage,
96
- onClick: () => onPageChange(currentPage + 1),
97
- "aria-label": t('collection.pagination.next'),
98
- title: t('collection.pagination.next'),
99
- "aria-disabled": !hasNextPage
100
- }, ___EmotionJSX(Icon, {
101
- type: "chevron",
102
- size: "small",
103
- direction: "right"
104
- })), ___EmotionJSX(PaginationButton, {
105
- disabled: !hasNextPage,
106
- onClick: () => onPageChange(pageCount),
107
- "aria-label": t('collection.pagination.last'),
108
- title: t('collection.pagination.last'),
109
- "aria-disabled": !hasNextPage
110
- }, ___EmotionJSX(Icon, {
111
- type: "chevron-double",
112
- size: "small",
113
- direction: "right"
114
- }))), ___EmotionJSX(PaginationInfo, {
115
- role: "status",
116
- "aria-live": "polite",
117
- "aria-atomic": "true"
118
- }, ___EmotionJSX("span", null, t('collection.pagination.showing', {
119
- start: startEntry,
120
- end: endEntry,
121
- total: totalCount
122
- }))));
123
- }
124
- Pagination.propTypes = {
125
- currentPage: PropTypes.number.isRequired,
126
- pageCount: PropTypes.number.isRequired,
127
- pageSize: PropTypes.number.isRequired,
128
- totalCount: PropTypes.number.isRequired,
129
- onPageChange: PropTypes.func.isRequired,
130
- t: PropTypes.func.isRequired
131
- };
132
- export default translate()(Pagination);