@placeholderco/placeholder-ui 1.0.3 → 1.0.6
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.
- package/LICENSE +26 -26
- package/README.md +179 -179
- package/dist/display/Alert.svelte +179 -179
- package/dist/display/Avatar.svelte +166 -166
- package/dist/display/LinkCollection.svelte +161 -161
- package/dist/display/Paper.svelte +118 -118
- package/dist/form/Autocomplete.svelte +223 -191
- package/dist/form/Autocomplete.svelte.d.ts +3 -1
- package/dist/form/AutocompleteMulti.svelte +356 -0
- package/dist/form/AutocompleteMulti.svelte.d.ts +28 -0
- package/dist/form/Checkbox.svelte +201 -201
- package/dist/form/Chips.svelte +128 -128
- package/dist/form/ComboBox.svelte +158 -158
- package/dist/form/ComboBox.svelte.d.ts +1 -1
- package/dist/form/ComboBoxItemBuilder.svelte +460 -460
- package/dist/form/ComboBoxMulti.svelte +197 -197
- package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
- package/dist/form/CronBuilder.svelte +693 -693
- package/dist/form/DatePicker.svelte +672 -672
- package/dist/form/DateTimePicker.svelte +712 -712
- package/dist/form/FileInput.svelte +235 -235
- package/dist/form/FormGroup.svelte +68 -68
- package/dist/form/Number.svelte +238 -238
- package/dist/form/PasswordInput.svelte +252 -252
- package/dist/form/RadioGroup.svelte +210 -210
- package/dist/form/Rating.svelte +235 -235
- package/dist/form/SegmentedControl.svelte +149 -149
- package/dist/form/Select.svelte +590 -590
- package/dist/form/Select.svelte.d.ts +1 -1
- package/dist/form/SelectMulti.svelte +613 -613
- package/dist/form/SelectMulti.svelte.d.ts +1 -1
- package/dist/form/Slider.svelte +358 -358
- package/dist/form/Switch.svelte +147 -147
- package/dist/form/TextArea.svelte +148 -148
- package/dist/form/Textbox.svelte +228 -228
- package/dist/form/TimePicker.svelte +267 -267
- package/dist/icon/Icon.svelte +52 -52
- package/dist/icon/alert-octagon.svg +5 -5
- package/dist/icon/alert-triangle.svg +5 -5
- package/dist/icon/archive.svg +1 -1
- package/dist/icon/arrow-down.svg +1 -1
- package/dist/icon/arrow-left.svg +1 -1
- package/dist/icon/arrow-right.svg +1 -1
- package/dist/icon/arrow-up.svg +1 -1
- package/dist/icon/at.svg +1 -1
- package/dist/icon/bell.svg +1 -1
- package/dist/icon/bookmark.svg +1 -1
- package/dist/icon/calendar.svg +1 -1
- package/dist/icon/camera.svg +1 -1
- package/dist/icon/chart-bar.svg +1 -1
- package/dist/icon/chart-line.svg +1 -1
- package/dist/icon/chart-pie.svg +1 -1
- package/dist/icon/checkbox.svg +1 -1
- package/dist/icon/checklist.svg +1 -1
- package/dist/icon/circle-check.svg +1 -1
- package/dist/icon/circle-x.svg +1 -1
- package/dist/icon/clock.svg +1 -1
- package/dist/icon/credit-card.svg +1 -1
- package/dist/icon/dots-vertical.svg +1 -1
- package/dist/icon/dots.svg +1 -1
- package/dist/icon/external-link.svg +1 -1
- package/dist/icon/eye-off.svg +1 -1
- package/dist/icon/eye.svg +1 -1
- package/dist/icon/filter.svg +1 -1
- package/dist/icon/fingerprint.svg +1 -1
- package/dist/icon/flag.svg +1 -1
- package/dist/icon/heart.svg +1 -1
- package/dist/icon/home.svg +1 -1
- package/dist/icon/key.svg +1 -1
- package/dist/icon/list-check.svg +1 -1
- package/dist/icon/login.svg +1 -1
- package/dist/icon/logout.svg +1 -1
- package/dist/icon/map-pin.svg +1 -1
- package/dist/icon/maximize.svg +1 -1
- package/dist/icon/microphone.svg +1 -1
- package/dist/icon/minimize.svg +1 -1
- package/dist/icon/note.svg +1 -1
- package/dist/icon/player-pause.svg +1 -1
- package/dist/icon/printer.svg +1 -1
- package/dist/icon/qrcode.svg +1 -1
- package/dist/icon/send.svg +1 -1
- package/dist/icon/settings.svg +1 -1
- package/dist/icon/share.svg +1 -1
- package/dist/icon/shopping-cart.svg +1 -1
- package/dist/icon/sort-ascending.svg +1 -1
- package/dist/icon/sort-descending.svg +1 -1
- package/dist/icon/star.svg +1 -1
- package/dist/icon/tag.svg +1 -1
- package/dist/icon/trending-down.svg +1 -1
- package/dist/icon/trending-up.svg +1 -1
- package/dist/icon/upload.svg +1 -1
- package/dist/icon/volume-off.svg +1 -1
- package/dist/icon/volume.svg +1 -1
- package/dist/icon/world.svg +1 -1
- package/dist/icon/zoom-in.svg +1 -1
- package/dist/icon/zoom-out.svg +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/layout/AppShell.svelte +169 -169
- package/dist/layout/CustomNavbar.svelte +61 -61
- package/dist/layout/Navbar.svelte +206 -206
- package/dist/layout/NavbarItemDisplay.svelte +29 -29
- package/dist/layout/Sidenav.svelte +712 -712
- package/dist/styles/components.css +199 -199
- package/dist/styles/dark.css +146 -146
- package/dist/styles/index.css +116 -116
- package/dist/styles/reset.css +110 -110
- package/dist/styles/semantic.css +86 -86
- package/dist/styles/tokens.css +203 -197
- package/dist/styles/utilities.css +523 -523
- package/dist/ui/Accordion.svelte +289 -289
- package/dist/ui/ActionIcon.svelte +76 -76
- package/dist/ui/Badge.svelte +329 -279
- package/dist/ui/Breadcrumbs.svelte +131 -131
- package/dist/ui/Button.svelte +432 -370
- package/dist/ui/ButtonVariant.d.ts +1 -1
- package/dist/ui/Dialog.svelte +307 -307
- package/dist/ui/Drawer.svelte +524 -524
- package/dist/ui/Dropdown.svelte +97 -97
- package/dist/ui/Dropzone.svelte +122 -122
- package/dist/ui/Link.svelte +32 -32
- package/dist/ui/Loader.svelte +70 -70
- package/dist/ui/LoadingOverlay.svelte +53 -53
- package/dist/ui/Pagination.svelte +135 -135
- package/dist/ui/Popover.svelte +225 -225
- package/dist/ui/Progress.svelte +191 -191
- package/dist/ui/RingProgress.svelte +141 -141
- package/dist/ui/Skeleton.svelte +85 -85
- package/dist/ui/Stepper.svelte +355 -355
- package/dist/ui/Table.svelte +345 -345
- package/dist/ui/Tabs.svelte +146 -146
- package/dist/ui/ThemeSwitcher.svelte +39 -39
- package/dist/ui/Timeline.svelte +225 -225
- package/dist/ui/Toaster.svelte +6 -6
- package/dist/ui/Tooltip.svelte +434 -434
- package/package.json +14 -14
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import Loader from './Loader.svelte';
|
|
3
|
-
|
|
4
|
-
interface Props {
|
|
5
|
-
visible?: boolean;
|
|
6
|
-
loaderSize?: string;
|
|
7
|
-
overlayOpacity?: number;
|
|
8
|
-
blur?: number;
|
|
9
|
-
zIndex?: number;
|
|
10
|
-
class?: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
let {
|
|
14
|
-
visible = false,
|
|
15
|
-
loaderSize = '40px',
|
|
16
|
-
overlayOpacity = 0.75,
|
|
17
|
-
blur = 0,
|
|
18
|
-
zIndex = 30,
|
|
19
|
-
class: classes = ''
|
|
20
|
-
}: Props = $props();
|
|
21
|
-
</script>
|
|
22
|
-
|
|
23
|
-
{#if visible}
|
|
24
|
-
<div
|
|
25
|
-
class="loading-overlay {classes}"
|
|
26
|
-
style="--overlay-opacity: {overlayOpacity}; --overlay-blur: {blur}px; --overlay-z-index: {zIndex};"
|
|
27
|
-
aria-busy="true"
|
|
28
|
-
aria-live="polite"
|
|
29
|
-
>
|
|
30
|
-
<Loader sizeOverride={loaderSize} />
|
|
31
|
-
</div>
|
|
32
|
-
{/if}
|
|
33
|
-
|
|
34
|
-
<style>
|
|
35
|
-
.loading-overlay {
|
|
36
|
-
position: absolute;
|
|
37
|
-
top: 0;
|
|
38
|
-
left: 0;
|
|
39
|
-
right: 0;
|
|
40
|
-
bottom: 0;
|
|
41
|
-
display: flex;
|
|
42
|
-
align-items: center;
|
|
43
|
-
justify-content: center;
|
|
44
|
-
background-color: rgba(255, 255, 255, var(--overlay-opacity, 0.75));
|
|
45
|
-
backdrop-filter: blur(var(--overlay-blur, 0));
|
|
46
|
-
z-index: var(--overlay-z-index, 30);
|
|
47
|
-
border-radius: inherit;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
:global(.dark) .loading-overlay {
|
|
51
|
-
background-color: rgba(0, 0, 0, var(--overlay-opacity, 0.75));
|
|
52
|
-
}
|
|
53
|
-
</style>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Loader from './Loader.svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
visible?: boolean;
|
|
6
|
+
loaderSize?: string;
|
|
7
|
+
overlayOpacity?: number;
|
|
8
|
+
blur?: number;
|
|
9
|
+
zIndex?: number;
|
|
10
|
+
class?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
visible = false,
|
|
15
|
+
loaderSize = '40px',
|
|
16
|
+
overlayOpacity = 0.75,
|
|
17
|
+
blur = 0,
|
|
18
|
+
zIndex = 30,
|
|
19
|
+
class: classes = ''
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
{#if visible}
|
|
24
|
+
<div
|
|
25
|
+
class="loading-overlay {classes}"
|
|
26
|
+
style="--overlay-opacity: {overlayOpacity}; --overlay-blur: {blur}px; --overlay-z-index: {zIndex};"
|
|
27
|
+
aria-busy="true"
|
|
28
|
+
aria-live="polite"
|
|
29
|
+
>
|
|
30
|
+
<Loader sizeOverride={loaderSize} />
|
|
31
|
+
</div>
|
|
32
|
+
{/if}
|
|
33
|
+
|
|
34
|
+
<style>
|
|
35
|
+
.loading-overlay {
|
|
36
|
+
position: absolute;
|
|
37
|
+
top: 0;
|
|
38
|
+
left: 0;
|
|
39
|
+
right: 0;
|
|
40
|
+
bottom: 0;
|
|
41
|
+
display: flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
justify-content: center;
|
|
44
|
+
background-color: rgba(255, 255, 255, var(--overlay-opacity, 0.75));
|
|
45
|
+
backdrop-filter: blur(var(--overlay-blur, 0));
|
|
46
|
+
z-index: var(--overlay-z-index, 30);
|
|
47
|
+
border-radius: inherit;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
:global(.dark) .loading-overlay {
|
|
51
|
+
background-color: rgba(0, 0, 0, var(--overlay-opacity, 0.75));
|
|
52
|
+
}
|
|
53
|
+
</style>
|
|
@@ -1,135 +1,135 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import Button from './Button.svelte';
|
|
3
|
-
import chevronRight from '../icon/chevron-right.svg?raw';
|
|
4
|
-
import ActionIcon from './ActionIcon.svelte';
|
|
5
|
-
import { iconChevronLeft } from '../icon/index.js';
|
|
6
|
-
|
|
7
|
-
interface Props {
|
|
8
|
-
selectedPage?: number;
|
|
9
|
-
totalPages?: number;
|
|
10
|
-
onPageChange?: (page: number) => void;
|
|
11
|
-
maxPageButtons?: number;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
let {
|
|
15
|
-
selectedPage = $bindable(1),
|
|
16
|
-
totalPages,
|
|
17
|
-
onPageChange = (page: number) => {},
|
|
18
|
-
maxPageButtons = 8
|
|
19
|
-
}: Props = $props();
|
|
20
|
-
|
|
21
|
-
type Page = { page: number | undefined; isSelected: boolean };
|
|
22
|
-
|
|
23
|
-
function setPage(page: number) {
|
|
24
|
-
if (selectedPage === page) return;
|
|
25
|
-
|
|
26
|
-
selectedPage = page;
|
|
27
|
-
onPageChange(page);
|
|
28
|
-
} function determinePages(selectedPage: number, totalPages?: number) {
|
|
29
|
-
let pages: Page[] = [];
|
|
30
|
-
|
|
31
|
-
function push(page: number | undefined) {
|
|
32
|
-
pages.push({ page, isSelected: page === selectedPage });
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (totalPages === undefined) return pages;
|
|
36
|
-
|
|
37
|
-
if (totalPages <= maxPageButtons) {
|
|
38
|
-
for (let i = 1; i <= totalPages; i++) push(i);
|
|
39
|
-
return pages;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// For maxPageButtons, we need to fit: first, last, and some middle pages + ellipsis
|
|
43
|
-
// Reserve 2 slots for first and last pages, leaving maxPageButtons - 2 for middle + ellipsis
|
|
44
|
-
const middleSlots = maxPageButtons - 2;
|
|
45
|
-
|
|
46
|
-
// Calculate how many pages we can show around the selected page
|
|
47
|
-
const sidePages = Math.floor((middleSlots - 1) / 2); // -1 to account for potential ellipsis
|
|
48
|
-
|
|
49
|
-
let startPage = Math.max(2, selectedPage - sidePages);
|
|
50
|
-
let endPage = Math.min(totalPages - 1, selectedPage + sidePages);
|
|
51
|
-
|
|
52
|
-
// Adjust if we're too close to the beginning or end
|
|
53
|
-
if (startPage <= 3) {
|
|
54
|
-
// Close to start, show consecutive pages from 2
|
|
55
|
-
startPage = 2;
|
|
56
|
-
endPage = Math.min(totalPages - 1, startPage + middleSlots - 1);
|
|
57
|
-
} else if (endPage >= totalPages - 2) {
|
|
58
|
-
// Close to end, show consecutive pages to totalPages - 1
|
|
59
|
-
endPage = totalPages - 1;
|
|
60
|
-
startPage = Math.max(2, endPage - middleSlots + 1);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Always show first page
|
|
64
|
-
push(1);
|
|
65
|
-
|
|
66
|
-
// Show ellipsis if there's a gap after first page
|
|
67
|
-
if (startPage > 2) {
|
|
68
|
-
push(undefined); // ellipsis
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Show middle pages
|
|
72
|
-
for (let i = startPage; i <= endPage; i++) {
|
|
73
|
-
push(i);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Show ellipsis if there's a gap before last page
|
|
77
|
-
if (endPage < totalPages - 1) {
|
|
78
|
-
push(undefined); // ellipsis
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Always show last page (if it's different from first)
|
|
82
|
-
if (totalPages > 1) {
|
|
83
|
-
push(totalPages);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return pages;
|
|
87
|
-
}
|
|
88
|
-
</script>
|
|
89
|
-
|
|
90
|
-
<div class="pagination-container">
|
|
91
|
-
<ActionIcon
|
|
92
|
-
svg={iconChevronLeft}
|
|
93
|
-
variant="secondary"
|
|
94
|
-
onclick={() => setPage(selectedPage - 1)}
|
|
95
|
-
disabled={selectedPage <= 1}
|
|
96
|
-
/>
|
|
97
|
-
|
|
98
|
-
{#each determinePages(selectedPage, totalPages) as page}
|
|
99
|
-
{#if page.page}
|
|
100
|
-
<Button
|
|
101
|
-
variant={page.isSelected ? 'secondary-selected' : 'secondary'}
|
|
102
|
-
class="paginate-button"
|
|
103
|
-
onclick={() => setPage(page.page!)}>{page.page}</Button
|
|
104
|
-
>
|
|
105
|
-
{:else}
|
|
106
|
-
<span class="paginate-button">…</span>
|
|
107
|
-
{/if}
|
|
108
|
-
{/each}
|
|
109
|
-
|
|
110
|
-
<ActionIcon
|
|
111
|
-
svg={chevronRight}
|
|
112
|
-
variant="secondary"
|
|
113
|
-
disabled={totalPages === undefined || selectedPage >= totalPages}
|
|
114
|
-
onclick={() => setPage(selectedPage + 1)}
|
|
115
|
-
/>
|
|
116
|
-
</div>
|
|
117
|
-
|
|
118
|
-
<style>
|
|
119
|
-
.pagination-container {
|
|
120
|
-
display: flex;
|
|
121
|
-
align-items: center;
|
|
122
|
-
gap: var(--pui-spacing-2);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
.pagination-container :global(.paginate-button) {
|
|
126
|
-
width: 33.6px;
|
|
127
|
-
height: 29.6px;
|
|
128
|
-
display: flex;
|
|
129
|
-
justify-content: center;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
:global(.dark) .pagination-container :global(.paginate-button.secondary-selected) {
|
|
133
|
-
color: var(--pui-color-black);
|
|
134
|
-
}
|
|
135
|
-
</style>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Button from './Button.svelte';
|
|
3
|
+
import chevronRight from '../icon/chevron-right.svg?raw';
|
|
4
|
+
import ActionIcon from './ActionIcon.svelte';
|
|
5
|
+
import { iconChevronLeft } from '../icon/index.js';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
selectedPage?: number;
|
|
9
|
+
totalPages?: number;
|
|
10
|
+
onPageChange?: (page: number) => void;
|
|
11
|
+
maxPageButtons?: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
selectedPage = $bindable(1),
|
|
16
|
+
totalPages,
|
|
17
|
+
onPageChange = (page: number) => {},
|
|
18
|
+
maxPageButtons = 8
|
|
19
|
+
}: Props = $props();
|
|
20
|
+
|
|
21
|
+
type Page = { page: number | undefined; isSelected: boolean };
|
|
22
|
+
|
|
23
|
+
function setPage(page: number) {
|
|
24
|
+
if (selectedPage === page) return;
|
|
25
|
+
|
|
26
|
+
selectedPage = page;
|
|
27
|
+
onPageChange(page);
|
|
28
|
+
} function determinePages(selectedPage: number, totalPages?: number) {
|
|
29
|
+
let pages: Page[] = [];
|
|
30
|
+
|
|
31
|
+
function push(page: number | undefined) {
|
|
32
|
+
pages.push({ page, isSelected: page === selectedPage });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (totalPages === undefined) return pages;
|
|
36
|
+
|
|
37
|
+
if (totalPages <= maxPageButtons) {
|
|
38
|
+
for (let i = 1; i <= totalPages; i++) push(i);
|
|
39
|
+
return pages;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// For maxPageButtons, we need to fit: first, last, and some middle pages + ellipsis
|
|
43
|
+
// Reserve 2 slots for first and last pages, leaving maxPageButtons - 2 for middle + ellipsis
|
|
44
|
+
const middleSlots = maxPageButtons - 2;
|
|
45
|
+
|
|
46
|
+
// Calculate how many pages we can show around the selected page
|
|
47
|
+
const sidePages = Math.floor((middleSlots - 1) / 2); // -1 to account for potential ellipsis
|
|
48
|
+
|
|
49
|
+
let startPage = Math.max(2, selectedPage - sidePages);
|
|
50
|
+
let endPage = Math.min(totalPages - 1, selectedPage + sidePages);
|
|
51
|
+
|
|
52
|
+
// Adjust if we're too close to the beginning or end
|
|
53
|
+
if (startPage <= 3) {
|
|
54
|
+
// Close to start, show consecutive pages from 2
|
|
55
|
+
startPage = 2;
|
|
56
|
+
endPage = Math.min(totalPages - 1, startPage + middleSlots - 1);
|
|
57
|
+
} else if (endPage >= totalPages - 2) {
|
|
58
|
+
// Close to end, show consecutive pages to totalPages - 1
|
|
59
|
+
endPage = totalPages - 1;
|
|
60
|
+
startPage = Math.max(2, endPage - middleSlots + 1);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Always show first page
|
|
64
|
+
push(1);
|
|
65
|
+
|
|
66
|
+
// Show ellipsis if there's a gap after first page
|
|
67
|
+
if (startPage > 2) {
|
|
68
|
+
push(undefined); // ellipsis
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Show middle pages
|
|
72
|
+
for (let i = startPage; i <= endPage; i++) {
|
|
73
|
+
push(i);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Show ellipsis if there's a gap before last page
|
|
77
|
+
if (endPage < totalPages - 1) {
|
|
78
|
+
push(undefined); // ellipsis
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Always show last page (if it's different from first)
|
|
82
|
+
if (totalPages > 1) {
|
|
83
|
+
push(totalPages);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return pages;
|
|
87
|
+
}
|
|
88
|
+
</script>
|
|
89
|
+
|
|
90
|
+
<div class="pagination-container">
|
|
91
|
+
<ActionIcon
|
|
92
|
+
svg={iconChevronLeft}
|
|
93
|
+
variant="secondary"
|
|
94
|
+
onclick={() => setPage(selectedPage - 1)}
|
|
95
|
+
disabled={selectedPage <= 1}
|
|
96
|
+
/>
|
|
97
|
+
|
|
98
|
+
{#each determinePages(selectedPage, totalPages) as page}
|
|
99
|
+
{#if page.page}
|
|
100
|
+
<Button
|
|
101
|
+
variant={page.isSelected ? 'secondary-selected' : 'secondary'}
|
|
102
|
+
class="paginate-button"
|
|
103
|
+
onclick={() => setPage(page.page!)}>{page.page}</Button
|
|
104
|
+
>
|
|
105
|
+
{:else}
|
|
106
|
+
<span class="paginate-button">…</span>
|
|
107
|
+
{/if}
|
|
108
|
+
{/each}
|
|
109
|
+
|
|
110
|
+
<ActionIcon
|
|
111
|
+
svg={chevronRight}
|
|
112
|
+
variant="secondary"
|
|
113
|
+
disabled={totalPages === undefined || selectedPage >= totalPages}
|
|
114
|
+
onclick={() => setPage(selectedPage + 1)}
|
|
115
|
+
/>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<style>
|
|
119
|
+
.pagination-container {
|
|
120
|
+
display: flex;
|
|
121
|
+
align-items: center;
|
|
122
|
+
gap: var(--pui-spacing-2);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.pagination-container :global(.paginate-button) {
|
|
126
|
+
width: 33.6px;
|
|
127
|
+
height: 29.6px;
|
|
128
|
+
display: flex;
|
|
129
|
+
justify-content: center;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
:global(.dark) .pagination-container :global(.paginate-button.secondary-selected) {
|
|
133
|
+
color: var(--pui-color-black);
|
|
134
|
+
}
|
|
135
|
+
</style>
|