@ttdk-design-system/library-svelte 0.0.0-stage → 1.0.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.
- package/AI_GUIDE.md +6518 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +2 -0
- package/dist/core/tailwind-preset.cjs +62 -0
- package/dist/core/tailwind-preset.d.cts +63 -0
- package/dist/core/tailwind-preset.d.ts +74 -0
- package/dist/core/tailwind-preset.js +79 -0
- package/dist/core/theme/tokens.css +663 -0
- package/dist/core/types.d.ts +152 -0
- package/dist/core/types.js +735 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +15 -0
- package/dist/tailwind-preset.cjs +62 -0
- package/dist/tailwind-preset.d.cts +63 -0
- package/dist/tailwind-preset.d.ts +74 -0
- package/dist/tailwind-preset.js +79 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +1 -0
- package/dist/web/accordion/AI_GUIDE.md +149 -0
- package/dist/web/accordion/accordion.css +1 -0
- package/dist/web/accordion/accordion.svelte +217 -0
- package/dist/web/accordion/accordion.svelte.d.ts +224 -0
- package/dist/web/accordion/index.d.ts +2 -0
- package/dist/web/accordion/index.js +2 -0
- package/dist/web/accordion/manifest.json +351 -0
- package/dist/web/alert/AI_GUIDE.md +139 -0
- package/dist/web/alert/alert.css +1 -0
- package/dist/web/alert/alert.svelte +175 -0
- package/dist/web/alert/alert.svelte.d.ts +165 -0
- package/dist/web/alert/index.d.ts +2 -0
- package/dist/web/alert/index.js +2 -0
- package/dist/web/alert/manifest.json +240 -0
- package/dist/web/avatar/AI_GUIDE.md +118 -0
- package/dist/web/avatar/avatar.css +1 -0
- package/dist/web/avatar/avatar.svelte +108 -0
- package/dist/web/avatar/avatar.svelte.d.ts +147 -0
- package/dist/web/avatar/index.d.ts +2 -0
- package/dist/web/avatar/index.js +2 -0
- package/dist/web/avatar/manifest.json +195 -0
- package/dist/web/badge/AI_GUIDE.md +94 -0
- package/dist/web/badge/badge.css +1 -0
- package/dist/web/badge/badge.svelte +50 -0
- package/dist/web/badge/badge.svelte.d.ts +111 -0
- package/dist/web/badge/index.d.ts +2 -0
- package/dist/web/badge/index.js +2 -0
- package/dist/web/badge/manifest.json +141 -0
- package/dist/web/banner/AI_GUIDE.md +130 -0
- package/dist/web/banner/banner.css +1 -0
- package/dist/web/banner/banner.svelte +180 -0
- package/dist/web/banner/banner.svelte.d.ts +172 -0
- package/dist/web/banner/index.d.ts +2 -0
- package/dist/web/banner/index.js +2 -0
- package/dist/web/banner/manifest.json +240 -0
- package/dist/web/breadcrumb/AI_GUIDE.md +120 -0
- package/dist/web/breadcrumb/breadcrumb.css +1 -0
- package/dist/web/breadcrumb/breadcrumb.svelte +168 -0
- package/dist/web/breadcrumb/breadcrumb.svelte.d.ts +141 -0
- package/dist/web/breadcrumb/index.d.ts +2 -0
- package/dist/web/breadcrumb/index.js +2 -0
- package/dist/web/breadcrumb/manifest.json +225 -0
- package/dist/web/button/AI_GUIDE.md +121 -0
- package/dist/web/button/button.css +1 -0
- package/dist/web/button/button.svelte +154 -0
- package/dist/web/button/button.svelte.d.ts +159 -0
- package/dist/web/button/index.d.ts +2 -0
- package/dist/web/button/index.js +2 -0
- package/dist/web/button/manifest.json +177 -0
- package/dist/web/calendar/AI_GUIDE.md +151 -0
- package/dist/web/calendar/calendar.css +1 -0
- package/dist/web/calendar/calendar.svelte +1091 -0
- package/dist/web/calendar/calendar.svelte.d.ts +268 -0
- package/dist/web/calendar/index.d.ts +2 -0
- package/dist/web/calendar/index.js +2 -0
- package/dist/web/calendar/manifest.json +470 -0
- package/dist/web/card/AI_GUIDE.md +133 -0
- package/dist/web/card/card.css +1 -0
- package/dist/web/card/card.svelte +217 -0
- package/dist/web/card/card.svelte.d.ts +242 -0
- package/dist/web/card/index.d.ts +2 -0
- package/dist/web/card/index.js +2 -0
- package/dist/web/card/manifest.json +357 -0
- package/dist/web/checkbox/AI_GUIDE.md +146 -0
- package/dist/web/checkbox/checkbox.css +1 -0
- package/dist/web/checkbox/checkbox.svelte +131 -0
- package/dist/web/checkbox/checkbox.svelte.d.ts +199 -0
- package/dist/web/checkbox/index.d.ts +2 -0
- package/dist/web/checkbox/index.js +2 -0
- package/dist/web/checkbox/manifest.json +294 -0
- package/dist/web/chip/AI_GUIDE.md +186 -0
- package/dist/web/chip/chip.css +1 -0
- package/dist/web/chip/chip.svelte +113 -0
- package/dist/web/chip/chip.svelte.d.ts +145 -0
- package/dist/web/chip/index.d.ts +2 -0
- package/dist/web/chip/index.js +2 -0
- package/dist/web/chip/manifest.json +186 -0
- package/dist/web/dropdown/AI_GUIDE.md +167 -0
- package/dist/web/dropdown/dropdown.css +1 -0
- package/dist/web/dropdown/dropdown.svelte +844 -0
- package/dist/web/dropdown/dropdown.svelte.d.ts +361 -0
- package/dist/web/dropdown/index.d.ts +2 -0
- package/dist/web/dropdown/index.js +2 -0
- package/dist/web/dropdown/manifest.json +576 -0
- package/dist/web/flex/AI_GUIDE.md +113 -0
- package/dist/web/flex/flex-item.svelte +37 -0
- package/dist/web/flex/flex-item.svelte.d.ts +96 -0
- package/dist/web/flex/flex.css +1 -0
- package/dist/web/flex/flex.svelte +39 -0
- package/dist/web/flex/flex.svelte.d.ts +104 -0
- package/dist/web/flex/index.d.ts +3 -0
- package/dist/web/flex/index.js +3 -0
- package/dist/web/flex/manifest.json +162 -0
- package/dist/web/form/index.d.ts +1 -0
- package/dist/web/form/index.js +2 -0
- package/dist/web/grid/AI_GUIDE.md +112 -0
- package/dist/web/grid/grid-item.svelte +41 -0
- package/dist/web/grid/grid-item.svelte.d.ts +112 -0
- package/dist/web/grid/grid.css +1 -0
- package/dist/web/grid/grid.svelte +37 -0
- package/dist/web/grid/grid.svelte.d.ts +96 -0
- package/dist/web/grid/index.d.ts +3 -0
- package/dist/web/grid/index.js +3 -0
- package/dist/web/grid/manifest.json +153 -0
- package/dist/web/index.d.ts +58 -0
- package/dist/web/index.js +57 -0
- package/dist/web/input/AI_GUIDE.md +159 -0
- package/dist/web/input/index.d.ts +2 -0
- package/dist/web/input/index.js +2 -0
- package/dist/web/input/input.css +1 -0
- package/dist/web/input/input.svelte +283 -0
- package/dist/web/input/input.svelte.d.ts +283 -0
- package/dist/web/input/manifest.json +465 -0
- package/dist/web/input-number/AI_GUIDE.md +164 -0
- package/dist/web/input-number/index.d.ts +2 -0
- package/dist/web/input-number/index.js +2 -0
- package/dist/web/input-number/input-number.css +1 -0
- package/dist/web/input-number/input-number.svelte +783 -0
- package/dist/web/input-number/input-number.svelte.d.ts +352 -0
- package/dist/web/input-number/manifest.json +575 -0
- package/dist/web/modal/AI_GUIDE.md +171 -0
- package/dist/web/modal/index.d.ts +2 -0
- package/dist/web/modal/index.js +2 -0
- package/dist/web/modal/manifest.json +375 -0
- package/dist/web/modal/modal.css +1 -0
- package/dist/web/modal/modal.svelte +333 -0
- package/dist/web/modal/modal.svelte.d.ts +231 -0
- package/dist/web/pagination/AI_GUIDE.md +148 -0
- package/dist/web/pagination/index.d.ts +19 -0
- package/dist/web/pagination/index.js +19 -0
- package/dist/web/pagination/manifest.json +432 -0
- package/dist/web/pagination/pagination-content.svelte +25 -0
- package/dist/web/pagination/pagination-content.svelte.d.ts +36 -0
- package/dist/web/pagination/pagination-ellipsis.svelte +38 -0
- package/dist/web/pagination/pagination-ellipsis.svelte.d.ts +35 -0
- package/dist/web/pagination/pagination-first.svelte +105 -0
- package/dist/web/pagination/pagination-first.svelte.d.ts +74 -0
- package/dist/web/pagination/pagination-item.svelte +25 -0
- package/dist/web/pagination/pagination-item.svelte.d.ts +36 -0
- package/dist/web/pagination/pagination-last.svelte +105 -0
- package/dist/web/pagination/pagination-last.svelte.d.ts +74 -0
- package/dist/web/pagination/pagination-link.svelte +67 -0
- package/dist/web/pagination/pagination-link.svelte.d.ts +69 -0
- package/dist/web/pagination/pagination-next.svelte +99 -0
- package/dist/web/pagination/pagination-next.svelte.d.ts +75 -0
- package/dist/web/pagination/pagination-previous.svelte +99 -0
- package/dist/web/pagination/pagination-previous.svelte.d.ts +75 -0
- package/dist/web/pagination/pagination.css +1 -0
- package/dist/web/pagination/pagination.svelte +471 -0
- package/dist/web/pagination/pagination.svelte.d.ts +256 -0
- package/dist/web/popover/AI_GUIDE.md +163 -0
- package/dist/web/popover/index.d.ts +3 -0
- package/dist/web/popover/index.js +3 -0
- package/dist/web/popover/manifest.json +396 -0
- package/dist/web/popover/popover.css +1 -0
- package/dist/web/popover/popover.svelte +497 -0
- package/dist/web/popover/popover.svelte.d.ts +116 -0
- package/dist/web/radio/AI_GUIDE.md +155 -0
- package/dist/web/radio/index.d.ts +2 -0
- package/dist/web/radio/index.js +2 -0
- package/dist/web/radio/manifest.json +294 -0
- package/dist/web/radio/radio.css +1 -0
- package/dist/web/radio/radio.svelte +123 -0
- package/dist/web/radio/radio.svelte.d.ts +192 -0
- package/dist/web/selectbox/AI_GUIDE.md +216 -0
- package/dist/web/selectbox/index.d.ts +2 -0
- package/dist/web/selectbox/index.js +2 -0
- package/dist/web/selectbox/manifest.json +477 -0
- package/dist/web/selectbox/selectbox.css +1 -0
- package/dist/web/selectbox/selectbox.svelte +704 -0
- package/dist/web/selectbox/selectbox.svelte.d.ts +296 -0
- package/dist/web/sonner/AI_GUIDE.md +98 -0
- package/dist/web/sonner/index.d.ts +46 -0
- package/dist/web/sonner/index.js +64 -0
- package/dist/web/sonner/manifest.json +132 -0
- package/dist/web/sonner/sonner.css +1 -0
- package/dist/web/sonner/sonner.svelte +85 -0
- package/dist/web/sonner/sonner.svelte.d.ts +105 -0
- package/dist/web/table/AI_GUIDE.md +145 -0
- package/dist/web/table/index.d.ts +21 -0
- package/dist/web/table/index.js +22 -0
- package/dist/web/table/manifest.json +168 -0
- package/dist/web/table/table-body.svelte +23 -0
- package/dist/web/table/table-body.svelte.d.ts +36 -0
- package/dist/web/table/table-caption.svelte +23 -0
- package/dist/web/table/table-caption.svelte.d.ts +36 -0
- package/dist/web/table/table-cell.svelte +35 -0
- package/dist/web/table/table-cell.svelte.d.ts +57 -0
- package/dist/web/table/table-empty.svelte +56 -0
- package/dist/web/table/table-empty.svelte.d.ts +65 -0
- package/dist/web/table/table-footer.svelte +23 -0
- package/dist/web/table/table-footer.svelte.d.ts +36 -0
- package/dist/web/table/table-head.svelte +39 -0
- package/dist/web/table/table-head.svelte.d.ts +58 -0
- package/dist/web/table/table-header.svelte +23 -0
- package/dist/web/table/table-header.svelte.d.ts +36 -0
- package/dist/web/table/table-row.svelte +33 -0
- package/dist/web/table/table-row.svelte.d.ts +52 -0
- package/dist/web/table/table.css +1 -0
- package/dist/web/table/table.svelte +178 -0
- package/dist/web/table/table.svelte.d.ts +120 -0
- package/dist/web/tabs/AI_GUIDE.md +150 -0
- package/dist/web/tabs/index.d.ts +2 -0
- package/dist/web/tabs/index.js +2 -0
- package/dist/web/tabs/manifest.json +315 -0
- package/dist/web/tabs/tabs.css +1 -0
- package/dist/web/tabs/tabs.svelte +138 -0
- package/dist/web/tabs/tabs.svelte.d.ts +204 -0
- package/dist/web/text/AI_GUIDE.md +129 -0
- package/dist/web/text/index.d.ts +2 -0
- package/dist/web/text/index.js +2 -0
- package/dist/web/text/manifest.json +195 -0
- package/dist/web/text/text.css +1 -0
- package/dist/web/text/text.svelte +515 -0
- package/dist/web/text/text.svelte.d.ts +168 -0
- package/dist/web/textarea/AI_GUIDE.md +141 -0
- package/dist/web/textarea/index.d.ts +2 -0
- package/dist/web/textarea/index.js +2 -0
- package/dist/web/textarea/manifest.json +438 -0
- package/dist/web/textarea/textarea.css +1 -0
- package/dist/web/textarea/textarea.svelte +224 -0
- package/dist/web/textarea/textarea.svelte.d.ts +274 -0
- package/dist/web/tooltip/AI_GUIDE.md +110 -0
- package/dist/web/tooltip/index.d.ts +2 -0
- package/dist/web/tooltip/index.js +2 -0
- package/dist/web/tooltip/manifest.json +222 -0
- package/dist/web/tooltip/tooltip.css +1 -0
- package/dist/web/tooltip/tooltip.svelte +292 -0
- package/dist/web/tooltip/tooltip.svelte.d.ts +140 -0
- package/dist/webview/bottomsheet/AI_GUIDE.md +141 -0
- package/dist/webview/bottomsheet/bottomsheet.css +1 -0
- package/dist/webview/bottomsheet/bottomsheet.svelte +462 -0
- package/dist/webview/bottomsheet/bottomsheet.svelte.d.ts +200 -0
- package/dist/webview/bottomsheet/index.d.ts +4 -0
- package/dist/webview/bottomsheet/index.js +3 -0
- package/dist/webview/bottomsheet/manifest.json +377 -0
- package/dist/webview/button/AI_GUIDE.md +79 -0
- package/dist/webview/button/button-ios.css +1 -0
- package/dist/webview/button/button-ios.svelte +58 -0
- package/dist/webview/button/button-ios.svelte.d.ts +114 -0
- package/dist/webview/button/button-material.css +1 -0
- package/dist/webview/button/button-material.svelte +58 -0
- package/dist/webview/button/button-material.svelte.d.ts +114 -0
- package/dist/webview/button/index.d.ts +6 -0
- package/dist/webview/button/index.js +4 -0
- package/dist/webview/button/manifest.json +148 -0
- package/dist/webview/index.d.ts +6 -0
- package/dist/webview/index.js +6 -0
- package/llms.txt +6518 -0
- package/package.json +709 -4
- package/ttdk-manifest.json +10188 -0
- package/README.md +0 -3
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
<script context="module"></script>
|
|
2
|
+
|
|
3
|
+
<script>import { onDestroy, onMount } from "svelte";
|
|
4
|
+
import { buildUiVars, UiProps } from "../../core/types";
|
|
5
|
+
export let open = void 0;
|
|
6
|
+
export let defaultOpen = void 0;
|
|
7
|
+
export let preventClose = void 0;
|
|
8
|
+
export let dismissible = void 0;
|
|
9
|
+
export let onOpen = void 0;
|
|
10
|
+
export let onUpdateOpen = void 0;
|
|
11
|
+
export let onOpenChange = void 0;
|
|
12
|
+
export let onClosePrevent = void 0;
|
|
13
|
+
export let onClose = void 0;
|
|
14
|
+
export let header = void 0;
|
|
15
|
+
export let body = void 0;
|
|
16
|
+
export let footer = void 0;
|
|
17
|
+
export let content = void 0;
|
|
18
|
+
export let className = void 0;
|
|
19
|
+
export let modal = void 0;
|
|
20
|
+
export let ui = void 0;
|
|
21
|
+
export let overlay = void 0;
|
|
22
|
+
export let overlayClass = void 0;
|
|
23
|
+
export let overlayStyle = void 0;
|
|
24
|
+
export let contentClass = void 0;
|
|
25
|
+
export let size = void 0;
|
|
26
|
+
export let fullscreen = void 0;
|
|
27
|
+
export let scrollable = void 0;
|
|
28
|
+
export let contentStyle = void 0;
|
|
29
|
+
export let title = void 0;
|
|
30
|
+
export let close = void 0;
|
|
31
|
+
export let headerClass = void 0;
|
|
32
|
+
export let headerStyle = void 0;
|
|
33
|
+
export let description = void 0;
|
|
34
|
+
export let closeIcon = void 0;
|
|
35
|
+
export let bodyClass = void 0;
|
|
36
|
+
export let bodyStyle = void 0;
|
|
37
|
+
export let footerClass = void 0;
|
|
38
|
+
export let footerStyle = void 0;
|
|
39
|
+
export let preventScroll = void 0;
|
|
40
|
+
export let lockScroll = void 0;
|
|
41
|
+
function stringifyStyles(stylesObj) {
|
|
42
|
+
let styles = "";
|
|
43
|
+
for (let key in stylesObj) {
|
|
44
|
+
const dashedKey = key.replace(/[A-Z]/g, function(match) {
|
|
45
|
+
return "-" + match.toLowerCase();
|
|
46
|
+
});
|
|
47
|
+
styles += dashedKey + ":" + stylesObj[key] + ";";
|
|
48
|
+
}
|
|
49
|
+
return styles;
|
|
50
|
+
}
|
|
51
|
+
function isDismissible() {
|
|
52
|
+
if (preventClose === true)
|
|
53
|
+
return false;
|
|
54
|
+
return dismissible !== false;
|
|
55
|
+
}
|
|
56
|
+
function triggerShake() {
|
|
57
|
+
if (shakeTimer) {
|
|
58
|
+
clearTimeout(shakeTimer);
|
|
59
|
+
}
|
|
60
|
+
isAnimDone = true;
|
|
61
|
+
isShaking = true;
|
|
62
|
+
shakeTimer = setTimeout(() => {
|
|
63
|
+
isShaking = false;
|
|
64
|
+
shakeTimer = null;
|
|
65
|
+
}, 400);
|
|
66
|
+
}
|
|
67
|
+
function openModal() {
|
|
68
|
+
if (!isOpen) {
|
|
69
|
+
isOpen = true;
|
|
70
|
+
isAnimDone = false;
|
|
71
|
+
if (animTimer)
|
|
72
|
+
clearTimeout(animTimer);
|
|
73
|
+
animTimer = setTimeout(() => {
|
|
74
|
+
isAnimDone = true;
|
|
75
|
+
}, 250);
|
|
76
|
+
if (onOpen)
|
|
77
|
+
onOpen();
|
|
78
|
+
if (onUpdateOpen)
|
|
79
|
+
onUpdateOpen(true);
|
|
80
|
+
if (onOpenChange)
|
|
81
|
+
onOpenChange(true);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function closeModal(force) {
|
|
85
|
+
if (!isDismissible() && !force) {
|
|
86
|
+
triggerShake();
|
|
87
|
+
if (onClosePrevent) {
|
|
88
|
+
onClosePrevent();
|
|
89
|
+
}
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (isOpen) {
|
|
93
|
+
isOpen = false;
|
|
94
|
+
isAnimDone = false;
|
|
95
|
+
if (onClose)
|
|
96
|
+
onClose();
|
|
97
|
+
if (onUpdateOpen)
|
|
98
|
+
onUpdateOpen(false);
|
|
99
|
+
if (onOpenChange)
|
|
100
|
+
onOpenChange(false);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function handleOverlayClick() {
|
|
104
|
+
closeModal();
|
|
105
|
+
}
|
|
106
|
+
function handleKeyDown(event) {
|
|
107
|
+
if (!isOpen)
|
|
108
|
+
return;
|
|
109
|
+
if (event.key === "Escape") {
|
|
110
|
+
closeModal();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function renderHeaderContent() {
|
|
114
|
+
if (header) {
|
|
115
|
+
return typeof header === "function" ? header({
|
|
116
|
+
close: () => closeModal(true)
|
|
117
|
+
}) : header;
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
function renderBodyContent() {
|
|
122
|
+
if (body) {
|
|
123
|
+
return typeof body === "function" ? body({
|
|
124
|
+
close: () => closeModal(true)
|
|
125
|
+
}) : body;
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
function renderFooterContent() {
|
|
130
|
+
if (footer) {
|
|
131
|
+
return typeof footer === "function" ? footer({
|
|
132
|
+
close: () => closeModal(true)
|
|
133
|
+
}) : footer;
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
function renderCustomContent() {
|
|
138
|
+
if (content) {
|
|
139
|
+
return typeof content === "function" ? content({
|
|
140
|
+
close: () => closeModal(true)
|
|
141
|
+
}) : content;
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
let dialogRef;
|
|
146
|
+
let isOpen = open !== void 0 ? open : Boolean(defaultOpen);
|
|
147
|
+
let originalOverflow = "";
|
|
148
|
+
let isScrollLocked = false;
|
|
149
|
+
function portal(node) {
|
|
150
|
+
if (typeof document !== "undefined") {
|
|
151
|
+
document.body.appendChild(node);
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
destroy() {
|
|
155
|
+
if (node.parentNode) {
|
|
156
|
+
node.parentNode.removeChild(node);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function applyScrollLock(shouldLock) {
|
|
162
|
+
if (typeof document === "undefined")
|
|
163
|
+
return;
|
|
164
|
+
if (shouldLock && !isScrollLocked) {
|
|
165
|
+
originalOverflow = document.body.style.overflow;
|
|
166
|
+
document.body.style.overflow = "hidden";
|
|
167
|
+
isScrollLocked = true;
|
|
168
|
+
} else if (!shouldLock && isScrollLocked) {
|
|
169
|
+
document.body.style.overflow = originalOverflow;
|
|
170
|
+
isScrollLocked = false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
$:
|
|
174
|
+
if (open !== void 0 && open !== isOpen) {
|
|
175
|
+
if (open) {
|
|
176
|
+
openModal();
|
|
177
|
+
} else {
|
|
178
|
+
closeModal(true);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
$: {
|
|
182
|
+
const shouldLock = isOpen && preventScroll !== false && lockScroll !== false;
|
|
183
|
+
applyScrollLock(shouldLock);
|
|
184
|
+
}
|
|
185
|
+
let isShaking = false;
|
|
186
|
+
let isAnimDone = false;
|
|
187
|
+
let shakeTimer = null;
|
|
188
|
+
let animTimer = null;
|
|
189
|
+
onMount(() => {
|
|
190
|
+
if (typeof document !== "undefined") {
|
|
191
|
+
document.addEventListener("keydown", (e) => handleKeyDown(e), true);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
onDestroy(() => {
|
|
195
|
+
applyScrollLock(false);
|
|
196
|
+
if (shakeTimer) {
|
|
197
|
+
clearTimeout(shakeTimer);
|
|
198
|
+
}
|
|
199
|
+
if (typeof document !== "undefined") {
|
|
200
|
+
document.removeEventListener(
|
|
201
|
+
"keydown",
|
|
202
|
+
(e) => handleKeyDown(e),
|
|
203
|
+
true
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
</script>
|
|
208
|
+
|
|
209
|
+
<div>
|
|
210
|
+
{#if isOpen}
|
|
211
|
+
<div
|
|
212
|
+
style={stringifyStyles({
|
|
213
|
+
...buildUiVars(ui),
|
|
214
|
+
})}
|
|
215
|
+
role="dialog"
|
|
216
|
+
use:portal
|
|
217
|
+
class={`ttdk-modal-portal ${className || ""}`.trim()}
|
|
218
|
+
aria-modal={modal !== false ? "true" : "false"}
|
|
219
|
+
tabIndex={-1}
|
|
220
|
+
>
|
|
221
|
+
{#if overlay !== false}
|
|
222
|
+
<div
|
|
223
|
+
style={stringifyStyles({
|
|
224
|
+
...buildUiVars(overlayStyle),
|
|
225
|
+
})}
|
|
226
|
+
class={`ttdk-modal-overlay ${overlayClass || ""}`.trim()}
|
|
227
|
+
on:click={(event) => {
|
|
228
|
+
handleOverlayClick();
|
|
229
|
+
}}
|
|
230
|
+
/>
|
|
231
|
+
{/if}
|
|
232
|
+
<div
|
|
233
|
+
style={stringifyStyles({
|
|
234
|
+
...buildUiVars(contentStyle),
|
|
235
|
+
})}
|
|
236
|
+
bind:this={dialogRef}
|
|
237
|
+
class={`ttdk-modal-dialog ${isAnimDone ? "ttdk-modal-anim-done" : ""} ${
|
|
238
|
+
isShaking ? "ttdk-modal-shake" : ""
|
|
239
|
+
} ${contentClass || ""}`.trim()}
|
|
240
|
+
data-size={size || "md"}
|
|
241
|
+
data-fullscreen={fullscreen ? "true" : undefined}
|
|
242
|
+
data-scrollable={scrollable !== false ? "true" : undefined}
|
|
243
|
+
>
|
|
244
|
+
{#if Boolean(content)}
|
|
245
|
+
{renderCustomContent()}
|
|
246
|
+
{/if}
|
|
247
|
+
{#if !content}
|
|
248
|
+
{#if Boolean(header || title || close !== false)}
|
|
249
|
+
<div
|
|
250
|
+
style={stringifyStyles({
|
|
251
|
+
...buildUiVars(headerStyle),
|
|
252
|
+
})}
|
|
253
|
+
class={`ttdk-modal-header ${headerClass || ""}`.trim()}
|
|
254
|
+
>
|
|
255
|
+
{#if Boolean(header)}
|
|
256
|
+
{renderHeaderContent()}
|
|
257
|
+
{/if}
|
|
258
|
+
{#if !header}
|
|
259
|
+
<div class="ttdk-modal-header-info">
|
|
260
|
+
{#if Boolean(title)}
|
|
261
|
+
<h3 class="ttdk-modal-title">{title}</h3>
|
|
262
|
+
{/if}
|
|
263
|
+
{#if Boolean(description)}
|
|
264
|
+
<p class="ttdk-modal-description">{description}</p>
|
|
265
|
+
{/if}
|
|
266
|
+
</div>
|
|
267
|
+
|
|
268
|
+
{#if close !== false}
|
|
269
|
+
<button
|
|
270
|
+
type="button"
|
|
271
|
+
class="ttdk-modal-close"
|
|
272
|
+
aria-label="Tutup modal"
|
|
273
|
+
on:click={(event) => {
|
|
274
|
+
closeModal(true);
|
|
275
|
+
}}
|
|
276
|
+
>
|
|
277
|
+
{#if Boolean(closeIcon)}
|
|
278
|
+
{closeIcon}
|
|
279
|
+
{/if}
|
|
280
|
+
{#if !closeIcon}
|
|
281
|
+
<svg
|
|
282
|
+
width="16"
|
|
283
|
+
height="16"
|
|
284
|
+
viewBox="0 0 24 24"
|
|
285
|
+
fill="none"
|
|
286
|
+
stroke="currentColor"
|
|
287
|
+
><line x1="18" y1="6" x2="6" y2="18" /><line
|
|
288
|
+
x1="6"
|
|
289
|
+
y1="6"
|
|
290
|
+
x2="18"
|
|
291
|
+
y2="18"
|
|
292
|
+
/></svg
|
|
293
|
+
>
|
|
294
|
+
{/if}</button
|
|
295
|
+
>
|
|
296
|
+
{/if}
|
|
297
|
+
{/if}
|
|
298
|
+
</div>
|
|
299
|
+
{/if}
|
|
300
|
+
<div
|
|
301
|
+
style={stringifyStyles({
|
|
302
|
+
...buildUiVars(bodyStyle),
|
|
303
|
+
})}
|
|
304
|
+
class={`ttdk-modal-body ${bodyClass || ""}`.trim()}
|
|
305
|
+
>
|
|
306
|
+
{#if Boolean(body)}
|
|
307
|
+
{renderBodyContent()}
|
|
308
|
+
{/if}
|
|
309
|
+
{#if !body && $$slots.default}
|
|
310
|
+
<slot />
|
|
311
|
+
{/if}
|
|
312
|
+
</div>
|
|
313
|
+
|
|
314
|
+
{#if Boolean(footer) || $$slots.footer}
|
|
315
|
+
<div
|
|
316
|
+
style={stringifyStyles({
|
|
317
|
+
...buildUiVars(footerStyle),
|
|
318
|
+
})}
|
|
319
|
+
class={`ttdk-modal-footer ${footerClass || ""}`.trim()}
|
|
320
|
+
>
|
|
321
|
+
{#if Boolean(footer)}
|
|
322
|
+
{renderFooterContent()}
|
|
323
|
+
{/if}
|
|
324
|
+
{#if $$slots.footer}
|
|
325
|
+
<slot name="footer" />
|
|
326
|
+
{/if}
|
|
327
|
+
</div>
|
|
328
|
+
{/if}
|
|
329
|
+
{/if}
|
|
330
|
+
</div>
|
|
331
|
+
</div>
|
|
332
|
+
{/if}
|
|
333
|
+
</div>
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
export type ModalSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl" | "5xl" | "full";
|
|
3
|
+
export type ModalUiProps = UiProps;
|
|
4
|
+
export interface ModalProps {
|
|
5
|
+
/**
|
|
6
|
+
* Status visibilitas modal (mode terkontrol / controlled state).
|
|
7
|
+
* Mendukung `v-model:open` / `v-model` pada Vue 3 dan controlled prop `open` pada React.
|
|
8
|
+
*/
|
|
9
|
+
open?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Status visibilitas awal saat pertama kali dirender (uncontrolled initial state).
|
|
12
|
+
* @default false
|
|
13
|
+
*/
|
|
14
|
+
defaultOpen?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Judul teks di bagian header modal.
|
|
17
|
+
*/
|
|
18
|
+
title?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Deskripsi penjelasan di bagian header modal di bawah judul.
|
|
21
|
+
*/
|
|
22
|
+
description?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Menampilkan tombol tutup 'X' di pojok kanan atas header.
|
|
25
|
+
* Berikan `false` untuk menyembunyikan tombol tutup.
|
|
26
|
+
* @default true
|
|
27
|
+
*/
|
|
28
|
+
close?: boolean | any;
|
|
29
|
+
/**
|
|
30
|
+
* Ikon kustom untuk tombol tutup.
|
|
31
|
+
*/
|
|
32
|
+
closeIcon?: any;
|
|
33
|
+
/**
|
|
34
|
+
* Menjadikan modal tampil dalam ukuran layar penuh (fullscreen 100vw x 100vh).
|
|
35
|
+
* @default false
|
|
36
|
+
*/
|
|
37
|
+
fullscreen?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Skala ukuran lebar maksimum modal dialog ('xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | 'full').
|
|
40
|
+
* @default 'md'
|
|
41
|
+
*/
|
|
42
|
+
size?: ModalSize;
|
|
43
|
+
/**
|
|
44
|
+
* Mengizinkan modal ditutup saat pengguna mengeklik latar belakang (backdrop) atau menekan tombol `Escape`.
|
|
45
|
+
* @default true
|
|
46
|
+
*/
|
|
47
|
+
dismissible?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Mencegah modal ditutup saat klik di luar atau tombol `Escape` (alias selaras Nuxt UI prevent-close).
|
|
50
|
+
* Jika bernilai `true`, popover/modal tidak dapat ditutup kecuali melalui tombol aksi eksplisit di dalam modal.
|
|
51
|
+
* @default false
|
|
52
|
+
*/
|
|
53
|
+
preventClose?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Menampilkan lapisan latar belakang redup (backdrop overlay).
|
|
56
|
+
* @default true
|
|
57
|
+
*/
|
|
58
|
+
overlay?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Menjadikan modal sebagai dialog modal yang memusatkan fokus interaksi pengguna.
|
|
61
|
+
* @default true
|
|
62
|
+
*/
|
|
63
|
+
modal?: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Mengaktifkan area konten body yang dapat digulir jika isi modal melebihi tinggi layar.
|
|
66
|
+
* @default true
|
|
67
|
+
*/
|
|
68
|
+
scrollable?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Mengunci scrolling halaman web latar belakang saat modal sedang terbuka (body scroll lock).
|
|
71
|
+
* @default true
|
|
72
|
+
*/
|
|
73
|
+
preventScroll?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Alias untuk `preventScroll`.
|
|
76
|
+
* @default true
|
|
77
|
+
*/
|
|
78
|
+
lockScroll?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Konten kustom untuk seluruh dialog (menggantikan header, body, dan footer default).
|
|
81
|
+
*/
|
|
82
|
+
content?: any;
|
|
83
|
+
/**
|
|
84
|
+
* Konten kustom untuk bagian header modal.
|
|
85
|
+
*/
|
|
86
|
+
header?: any;
|
|
87
|
+
/**
|
|
88
|
+
* Konten kustom untuk bagian isi utama (body) modal.
|
|
89
|
+
*/
|
|
90
|
+
body?: any;
|
|
91
|
+
/**
|
|
92
|
+
* Konten kustom untuk bagian footer (biasanya tombol aksi Batal / Konfirmasi).
|
|
93
|
+
*/
|
|
94
|
+
footer?: any;
|
|
95
|
+
/**
|
|
96
|
+
* Kustomisasi CSS variables atau token visual melalui UiProps.
|
|
97
|
+
*/
|
|
98
|
+
ui?: ModalUiProps;
|
|
99
|
+
/**
|
|
100
|
+
* Class CSS kustom pada elemen pembungkus terluar.
|
|
101
|
+
*/
|
|
102
|
+
className?: string;
|
|
103
|
+
/**
|
|
104
|
+
* Class CSS kustom (alias framework Vue).
|
|
105
|
+
*/
|
|
106
|
+
class?: string;
|
|
107
|
+
/**
|
|
108
|
+
* Style inline kustom pada kontainer dialog.
|
|
109
|
+
*/
|
|
110
|
+
style?: any;
|
|
111
|
+
/**
|
|
112
|
+
* Class CSS kustom untuk lapisan backdrop overlay.
|
|
113
|
+
*/
|
|
114
|
+
overlayClass?: string;
|
|
115
|
+
/**
|
|
116
|
+
* Style kustom untuk lapisan backdrop overlay (UiProps).
|
|
117
|
+
*/
|
|
118
|
+
overlayStyle?: UiProps;
|
|
119
|
+
/**
|
|
120
|
+
* Class CSS kustom untuk kartu panel modal dialog.
|
|
121
|
+
*/
|
|
122
|
+
contentClass?: string;
|
|
123
|
+
/**
|
|
124
|
+
* Style kustom untuk kartu panel modal dialog (UiProps).
|
|
125
|
+
*/
|
|
126
|
+
contentStyle?: UiProps;
|
|
127
|
+
/**
|
|
128
|
+
* Class CSS kustom untuk header modal.
|
|
129
|
+
*/
|
|
130
|
+
headerClass?: string;
|
|
131
|
+
/**
|
|
132
|
+
* Style kustom untuk header modal (UiProps).
|
|
133
|
+
*/
|
|
134
|
+
headerStyle?: UiProps;
|
|
135
|
+
/**
|
|
136
|
+
* Class CSS kustom untuk body modal.
|
|
137
|
+
*/
|
|
138
|
+
bodyClass?: string;
|
|
139
|
+
/**
|
|
140
|
+
* Style kustom untuk body modal (UiProps).
|
|
141
|
+
*/
|
|
142
|
+
bodyStyle?: UiProps;
|
|
143
|
+
/**
|
|
144
|
+
* Class CSS kustom untuk footer modal.
|
|
145
|
+
*/
|
|
146
|
+
footerClass?: string;
|
|
147
|
+
/**
|
|
148
|
+
* Style kustom untuk footer modal (UiProps).
|
|
149
|
+
*/
|
|
150
|
+
footerStyle?: UiProps;
|
|
151
|
+
/**
|
|
152
|
+
* Callback event saat status terbuka/tertutup berubah (kompatibel dengan v-model:open pada Vue 3).
|
|
153
|
+
*/
|
|
154
|
+
onUpdateOpen?: (open: boolean) => void;
|
|
155
|
+
/**
|
|
156
|
+
* Callback event saat status terbuka/tertutup berubah (alias standar React).
|
|
157
|
+
*/
|
|
158
|
+
onOpenChange?: (open: boolean) => void;
|
|
159
|
+
/**
|
|
160
|
+
* Callback event saat modal terbuka.
|
|
161
|
+
*/
|
|
162
|
+
onOpen?: () => void;
|
|
163
|
+
/**
|
|
164
|
+
* Callback event saat modal ditutup.
|
|
165
|
+
*/
|
|
166
|
+
onClose?: () => void;
|
|
167
|
+
/**
|
|
168
|
+
* Callback event saat pengguna mencoba menutup modal tetapi dicegah karena preventClose={true} atau dismissible={false}.
|
|
169
|
+
*/
|
|
170
|
+
onClosePrevent?: () => void;
|
|
171
|
+
/**
|
|
172
|
+
* Elemen pemicu (trigger), tombol, atau konten modal default.
|
|
173
|
+
*/
|
|
174
|
+
children?: any;
|
|
175
|
+
}
|
|
176
|
+
import { UiProps } from "../../core/types";
|
|
177
|
+
declare const __propDef: {
|
|
178
|
+
props: {
|
|
179
|
+
open?: ModalProps["open"];
|
|
180
|
+
defaultOpen?: ModalProps["defaultOpen"];
|
|
181
|
+
preventClose?: ModalProps["preventClose"];
|
|
182
|
+
dismissible?: ModalProps["dismissible"];
|
|
183
|
+
onOpen?: ModalProps["onOpen"];
|
|
184
|
+
onUpdateOpen?: ModalProps["onUpdateOpen"];
|
|
185
|
+
onOpenChange?: ModalProps["onOpenChange"];
|
|
186
|
+
onClosePrevent?: ModalProps["onClosePrevent"];
|
|
187
|
+
onClose?: ModalProps["onClose"];
|
|
188
|
+
header?: ModalProps["header"];
|
|
189
|
+
body?: ModalProps["body"];
|
|
190
|
+
footer?: ModalProps["footer"];
|
|
191
|
+
content?: ModalProps["content"];
|
|
192
|
+
className?: ModalProps["className"];
|
|
193
|
+
modal?: ModalProps["modal"];
|
|
194
|
+
ui?: ModalProps["ui"];
|
|
195
|
+
overlay?: ModalProps["overlay"];
|
|
196
|
+
overlayClass?: ModalProps["overlayClass"];
|
|
197
|
+
overlayStyle?: ModalProps["overlayStyle"];
|
|
198
|
+
contentClass?: ModalProps["contentClass"];
|
|
199
|
+
size?: ModalProps["size"];
|
|
200
|
+
fullscreen?: ModalProps["fullscreen"];
|
|
201
|
+
scrollable?: ModalProps["scrollable"];
|
|
202
|
+
contentStyle?: ModalProps["contentStyle"];
|
|
203
|
+
title?: ModalProps["title"];
|
|
204
|
+
close?: ModalProps["close"];
|
|
205
|
+
headerClass?: ModalProps["headerClass"];
|
|
206
|
+
headerStyle?: ModalProps["headerStyle"];
|
|
207
|
+
description?: ModalProps["description"];
|
|
208
|
+
closeIcon?: ModalProps["closeIcon"];
|
|
209
|
+
bodyClass?: ModalProps["bodyClass"];
|
|
210
|
+
bodyStyle?: ModalProps["bodyStyle"];
|
|
211
|
+
footerClass?: ModalProps["footerClass"];
|
|
212
|
+
footerStyle?: ModalProps["footerStyle"];
|
|
213
|
+
preventScroll?: ModalProps["preventScroll"];
|
|
214
|
+
lockScroll?: ModalProps["lockScroll"];
|
|
215
|
+
};
|
|
216
|
+
events: {
|
|
217
|
+
[evt: string]: CustomEvent<any>;
|
|
218
|
+
};
|
|
219
|
+
slots: {
|
|
220
|
+
default: {};
|
|
221
|
+
footer: {};
|
|
222
|
+
};
|
|
223
|
+
exports?: {} | undefined;
|
|
224
|
+
bindings?: string | undefined;
|
|
225
|
+
};
|
|
226
|
+
type ModalProps_ = typeof __propDef.props;
|
|
227
|
+
export type ModalEvents = typeof __propDef.events;
|
|
228
|
+
export type ModalSlots = typeof __propDef.slots;
|
|
229
|
+
export default class Modal extends SvelteComponent<ModalProps_, ModalEvents, ModalSlots> {
|
|
230
|
+
}
|
|
231
|
+
export {};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# <Pagination /> — TTDK Component Reference
|
|
2
|
+
|
|
3
|
+
Komponen Pagination navigasi halaman dengan dukungan Compound API (ala Shadcn UI) dan Props-driven mode.
|
|
4
|
+
|
|
5
|
+
## 1. Stylesheets & Theming (Pure CSS)
|
|
6
|
+
Import the corresponding stylesheet for the theme you wish to use:
|
|
7
|
+
- **COMMON Theme**: `import "@ttdk-design-system/library-<react|vue|svelte>/web/pagination/pagination.css";`
|
|
8
|
+
|
|
9
|
+
## 2. Subpath Component Import
|
|
10
|
+
```ts
|
|
11
|
+
// React
|
|
12
|
+
import Pagination from "@ttdk-design-system/library-react/web/pagination";
|
|
13
|
+
|
|
14
|
+
// Vue 3
|
|
15
|
+
import Pagination from "@ttdk-design-system/library-vue/web/pagination";
|
|
16
|
+
|
|
17
|
+
// Svelte
|
|
18
|
+
import Pagination from "@ttdk-design-system/library-svelte/web/pagination";
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 3. Props & API Reference
|
|
22
|
+
|
|
23
|
+
| Prop | Type | Default | Description |
|
|
24
|
+
| :--- | :--- | :--- | :--- |
|
|
25
|
+
| `page?` | `number` | `1` | Nomor halaman saat ini (1-indexed). |
|
|
26
|
+
| `maxPages?` | `number` | `1` | Jumlah total halaman maksimum (alias untuk totalPages). |
|
|
27
|
+
| `totalPages?` | `number` | `1` | Jumlah total halaman (alias maxPages). |
|
|
28
|
+
| `limit?` | `number` | `10` | Jumlah baris/item data per halaman (page size). |
|
|
29
|
+
| `onLimitChange?` | `(limit: number) => void` | `-` | Callback saat jumlah baris per halaman diubah via select box. |
|
|
30
|
+
| `limitOptions?` | `number[]` | `[10, 20, 50, 100]` | Pilihan angka baris per halaman pada select box. |
|
|
31
|
+
| `canPrevPage?` | `boolean` | `false` | Menentukan apakah navigasi ke halaman sebelumnya diizinkan (false = tombol Previous dinonaktifkan). |
|
|
32
|
+
| `canNextPage?` | `boolean` | `false` | Menentukan apakah navigasi ke halaman berikutnya diizinkan (false = tombol Next dinonaktifkan). |
|
|
33
|
+
| `onFirstPage?` | `() => void` | `-` | Callback saat tombol First Page (halaman pertama) diklik. |
|
|
34
|
+
| `onPrevPage?` | `() => void` | `-` | Callback saat tombol Previous Page (halaman sebelumnya) diklik. |
|
|
35
|
+
| `onNextPage?` | `() => void` | `-` | Callback saat tombol Next Page (halaman selanjutnya) diklik. |
|
|
36
|
+
| `onLastPage?` | `() => void` | `-` | Callback saat tombol Last Page (halaman terakhir) diklik. |
|
|
37
|
+
| `onPageChange?` | `(page: number) => void` | `-` | Callback saat nomor halaman tertentu diklik. |
|
|
38
|
+
| `siblingCount?` | `number` | `1` | Jumlah tetangga nomor halaman di samping kiri dan kanan halaman aktif. |
|
|
39
|
+
| `showEdges?` | `boolean` | `false` | Menampilkan tombol First (<<) dan Last (>>). |
|
|
40
|
+
| `showPageNumbers?` | `boolean` | `true` | Menampilkan nomor halaman terpaginasi (1, 2, 3...). |
|
|
41
|
+
| `size?` | `'sm' | 'md' | 'lg'` | `md` | Skala ukuran pagination: - `'sm'`: 28px - `'md'`: 36px (standar) - `'lg'`: 44px |
|
|
42
|
+
| `style?` | `any` | `-` | Inline CSS style object native. |
|
|
43
|
+
| `ui?` | `UiProps` | `-` | Kustomisasi visual granular root kontainer pagination (UiProps). |
|
|
44
|
+
| `contentStyle?` | `UiProps` | `-` | Style kustom untuk kontainer daftar pagination content (ul.ttdk-pagination-content). |
|
|
45
|
+
| `contentClass?` | `string` | `-` | Class CSS kustom untuk kontainer daftar pagination content. |
|
|
46
|
+
| `linkStyle?` | `UiProps` | `-` | Style kustom untuk tombol link nomor halaman / navigasi. |
|
|
47
|
+
| `linkClass?` | `string` | `-` | Class CSS kustom untuk tombol link nomor halaman / navigasi. |
|
|
48
|
+
| `activeLinkStyle?` | `UiProps` | `-` | Style kustom untuk tombol nomor halaman saat aktif. |
|
|
49
|
+
| `activeLinkClass?` | `string` | `-` | Class CSS kustom untuk tombol nomor halaman saat aktif. |
|
|
50
|
+
| `limitStyle?` | `UiProps` | `-` | Style kustom untuk kontainer baris per halaman (limit). |
|
|
51
|
+
| `limitClass?` | `string` | `-` | Class CSS kustom untuk kontainer baris per halaman (limit). |
|
|
52
|
+
| `limitSelectStyle?` | `UiProps` | `-` | Style kustom untuk elemen Selectbox baris per halaman (limit). |
|
|
53
|
+
| `limitSlot?` | `any` | `-` | Slot kustom untuk menggantikan elemen limit selector bawaan. |
|
|
54
|
+
| `showLimit?` | `boolean` | `-` | Menentukan apakah kontrol baris per halaman (limit selectbox) ditampilkan. Jika tidak disetel, otomatis mengikuti keberadaan callback onLimitChange. |
|
|
55
|
+
| `showLimitLabel?` | `boolean` | `true` | Menentukan apakah teks label 'Baris per halaman:' ditampilkan di samping selectbox limit. |
|
|
56
|
+
| `limitLabel?` | `string` | `Baris per halaman:` | Teks label untuk opsi baris per halaman. |
|
|
57
|
+
| `firstIcon?` | `any` | `-` | Ikon kustom untuk tombol halaman pertama (first page, menggantikan <<). |
|
|
58
|
+
| `prevIcon?` | `any` | `-` | Ikon kustom untuk tombol halaman sebelumnya (previous page, menggantikan <). |
|
|
59
|
+
| `nextIcon?` | `any` | `-` | Ikon kustom untuk tombol halaman selanjutnya (next page, menggantikan >). |
|
|
60
|
+
| `lastIcon?` | `any` | `-` | Ikon kustom untuk tombol halaman terakhir (last page, menggantikan >>). |
|
|
61
|
+
| `ellipsisIcon?` | `any` | `-` | Ikon kustom untuk separator elipsis (menggantikan ...). |
|
|
62
|
+
| `prevText?` | `string` | `Previous` | Label teks tombol Previous. |
|
|
63
|
+
| `nextText?` | `string` | `Next` | Label teks tombol Next. |
|
|
64
|
+
| `iconOnly?` | `boolean` | `false` | Mode hanya menampilkan ikon pada tombol Previous dan Next tanpa teks label. |
|
|
65
|
+
| `className?` | `string` | `-` | Class CSS kustom. |
|
|
66
|
+
| `children?` | `any` | `-` | Konten kustom atau subkomponen compound (PaginationContent, PaginationItem, dll). |
|
|
67
|
+
|
|
68
|
+
### Sub-interface: `PaginationPageItem`
|
|
69
|
+
|
|
70
|
+
| Field | Type | Default | Description |
|
|
71
|
+
| :--- | :--- | :--- | :--- |
|
|
72
|
+
| `type` | `'page' | 'ellipsis'` | `-` | |
|
|
73
|
+
| `value` | `number | string` | `-` | |
|
|
74
|
+
| `key` | `string` | `-` | |
|
|
75
|
+
|
|
76
|
+
## 4. Usage Examples
|
|
77
|
+
|
|
78
|
+
### React Example
|
|
79
|
+
```tsx
|
|
80
|
+
import { useState } from "react";
|
|
81
|
+
import Pagination from "@ttdk-design-system/library-react/pagination";
|
|
82
|
+
import "@ttdk-design-system/library-react/pagination/pagination.css";
|
|
83
|
+
|
|
84
|
+
export function Example() {
|
|
85
|
+
const [page, setPage] = useState(1);
|
|
86
|
+
const [limit, setLimit] = useState(10);
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<Pagination
|
|
90
|
+
page={page}
|
|
91
|
+
totalPages={15}
|
|
92
|
+
limit={limit}
|
|
93
|
+
limitOptions={[10, 25, 50, 100]}
|
|
94
|
+
canPrevPage={page > 1}
|
|
95
|
+
canNextPage={page < 15}
|
|
96
|
+
onPageChange={(p) => setPage(p)}
|
|
97
|
+
onLimitChange={(l) => setLimit(l)}
|
|
98
|
+
/>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Vue 3 Example
|
|
104
|
+
```vue
|
|
105
|
+
<script setup lang="ts">
|
|
106
|
+
import { ref } from "vue";
|
|
107
|
+
import Pagination from "@ttdk-design-system/library-vue/pagination";
|
|
108
|
+
import "@ttdk-design-system/library-vue/pagination/pagination.css";
|
|
109
|
+
|
|
110
|
+
const page = ref(1);
|
|
111
|
+
const limit = ref(10);
|
|
112
|
+
</script>
|
|
113
|
+
|
|
114
|
+
<template>
|
|
115
|
+
<Pagination
|
|
116
|
+
:page="page"
|
|
117
|
+
:total-pages="15"
|
|
118
|
+
:limit="limit"
|
|
119
|
+
:limit-options="[10, 25, 50, 100]"
|
|
120
|
+
:can-prev-page="page > 1"
|
|
121
|
+
:can-next-page="page < 15"
|
|
122
|
+
@page-change="(p: number) => (page = p)"
|
|
123
|
+
@limit-change="(l: number) => (limit = l)"
|
|
124
|
+
/>
|
|
125
|
+
</template>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Svelte Example
|
|
129
|
+
```svelte
|
|
130
|
+
<script lang="ts">
|
|
131
|
+
import Pagination from "@ttdk-design-system/library-svelte/pagination";
|
|
132
|
+
import "@ttdk-design-system/library-svelte/pagination/pagination.css";
|
|
133
|
+
|
|
134
|
+
let page = 1;
|
|
135
|
+
let limit = 10;
|
|
136
|
+
</script>
|
|
137
|
+
|
|
138
|
+
<Pagination
|
|
139
|
+
{page}
|
|
140
|
+
totalPages={15}
|
|
141
|
+
{limit}
|
|
142
|
+
limitOptions={[10, 25, 50, 100]}
|
|
143
|
+
canPrevPage={page > 1}
|
|
144
|
+
canNextPage={page < 15}
|
|
145
|
+
on:pageChange={(e) => (page = e.detail)}
|
|
146
|
+
on:limitChange={(e) => (limit = e.detail)}
|
|
147
|
+
/>
|
|
148
|
+
```
|