@designbasekorea/ui-wc 0.5.3 → 0.5.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.
Files changed (156) hide show
  1. package/dist/chunks/lottie-e273b936.js +17032 -0
  2. package/dist/esm/components/animation-background/canvas-controller.js +121 -1
  3. package/dist/esm/components/animation-background/controls.js +180 -1
  4. package/dist/esm/components/animation-background/graphite-controller.js +196 -1
  5. package/dist/esm/components/animation-background/graphite-presets.js +42 -1
  6. package/dist/esm/components/animation-background/graphite-shader.js +111 -1
  7. package/dist/esm/components/animation-background/layers.js +369 -1
  8. package/dist/esm/components/animation-background/lumina-presets.js +53 -1
  9. package/dist/esm/components/animation-background/lumina-shaders.js +181 -1
  10. package/dist/esm/components/animation-background/lumina-utils.js +60 -1
  11. package/dist/esm/components/animation-background/particle-defaults.js +36 -1
  12. package/dist/esm/components/animation-background/renderers.js +167 -1
  13. package/dist/esm/components/animation-background/shader-controller.js +154 -1
  14. package/dist/esm/components/color-picker-utils.js +134 -1
  15. package/dist/esm/components/date-picker-utils.js +140 -1
  16. package/dist/esm/components/db-accordion.js +304 -1
  17. package/dist/esm/components/db-ad-banner.js +455 -1
  18. package/dist/esm/components/db-alert.js +149 -1
  19. package/dist/esm/components/db-animation-background.js +486 -1
  20. package/dist/esm/components/db-animation-text.js +601 -1
  21. package/dist/esm/components/db-app-badge.js +88 -1
  22. package/dist/esm/components/db-audio-player.js +752 -1
  23. package/dist/esm/components/db-avatar.js +188 -1
  24. package/dist/esm/components/db-backdrop.js +139 -1
  25. package/dist/esm/components/db-badge.js +91 -1
  26. package/dist/esm/components/db-banner.js +188 -1
  27. package/dist/esm/components/db-bottom-navigation.js +146 -1
  28. package/dist/esm/components/db-bottom-sheet.js +481 -1
  29. package/dist/esm/components/db-breadcrumbs.js +329 -1
  30. package/dist/esm/components/db-button.js +316 -1
  31. package/dist/esm/components/db-calendar.js +675 -1
  32. package/dist/esm/components/db-card.js +265 -1
  33. package/dist/esm/components/db-carousel.js +264 -1
  34. package/dist/esm/components/db-checkbox.js +202 -1
  35. package/dist/esm/components/db-chip.js +104 -1
  36. package/dist/esm/components/db-code-block.js +304 -1
  37. package/dist/esm/components/db-color-picker.js +746 -1
  38. package/dist/esm/components/db-confirm.js +191 -1
  39. package/dist/esm/components/db-container.js +39 -1
  40. package/dist/esm/components/db-context-menu.js +265 -1
  41. package/dist/esm/components/db-countdown.js +146 -1
  42. package/dist/esm/components/db-cursor-follower.js +173 -1
  43. package/dist/esm/components/db-date-picker.js +837 -1
  44. package/dist/esm/components/db-divider.js +66 -1
  45. package/dist/esm/components/db-drawer.js +245 -1
  46. package/dist/esm/components/db-dropdown.js +493 -1
  47. package/dist/esm/components/db-dropzone.js +266 -1
  48. package/dist/esm/components/db-empty-state.js +97 -1
  49. package/dist/esm/components/db-file-uploader.js +256 -1
  50. package/dist/esm/components/db-floating-action-button.js +139 -1
  51. package/dist/esm/components/db-footer.js +385 -1
  52. package/dist/esm/components/db-form.js +566 -1
  53. package/dist/esm/components/db-gantt.js +882 -1
  54. package/dist/esm/components/db-gradient.js +133 -1
  55. package/dist/esm/components/db-grid-background.js +909 -1
  56. package/dist/esm/components/db-grid.js +73 -1
  57. package/dist/esm/components/db-icons.js +82 -1
  58. package/dist/esm/components/db-image-list.js +214 -1
  59. package/dist/esm/components/db-image-placeholder.js +96 -1
  60. package/dist/esm/components/db-image.js +289 -1
  61. package/dist/esm/components/db-indicator.js +517 -1
  62. package/dist/esm/components/db-input.js +420 -1
  63. package/dist/esm/components/db-kanban.js +538 -1
  64. package/dist/esm/components/db-label.js +66 -1
  65. package/dist/esm/components/db-lightbox.js +372 -1
  66. package/dist/esm/components/db-list.js +340 -1
  67. package/dist/esm/components/db-logo-svg.js +72 -1
  68. package/dist/esm/components/db-logo.js +106 -1
  69. package/dist/esm/components/db-lottie.js +109 -1
  70. package/dist/esm/components/db-markdown-editor.js +458 -1
  71. package/dist/esm/components/db-marquee.js +402 -1
  72. package/dist/esm/components/db-masonry.js +94 -1
  73. package/dist/esm/components/db-menu-item.js +211 -1
  74. package/dist/esm/components/db-modal.js +522 -1
  75. package/dist/esm/components/db-navbar.js +680 -1
  76. package/dist/esm/components/db-onboarding-modal.js +322 -1
  77. package/dist/esm/components/db-page-header.js +312 -1
  78. package/dist/esm/components/db-pagination.js +271 -1
  79. package/dist/esm/components/db-popover.js +580 -1
  80. package/dist/esm/components/db-progress-step.js +166 -1
  81. package/dist/esm/components/db-progress.js +171 -1
  82. package/dist/esm/components/db-progressbar.js +72 -1
  83. package/dist/esm/components/db-radio.js +172 -1
  84. package/dist/esm/components/db-random-gradient.js +121 -1
  85. package/dist/esm/components/db-range-slider.js +811 -1
  86. package/dist/esm/components/db-rating.js +325 -1
  87. package/dist/esm/components/db-reorder.js +286 -1
  88. package/dist/esm/components/db-resizable-panels.js +282 -1
  89. package/dist/esm/components/db-scroll-area.js +126 -1
  90. package/dist/esm/components/db-search-bar.js +668 -1
  91. package/dist/esm/components/db-section-app-download.js +101 -1
  92. package/dist/esm/components/db-section-contact.js +102 -1
  93. package/dist/esm/components/db-section-cta.js +150 -1
  94. package/dist/esm/components/db-section-faq.js +120 -1
  95. package/dist/esm/components/db-section-feature-grid.js +137 -1
  96. package/dist/esm/components/db-section-feature.js +179 -1
  97. package/dist/esm/components/db-section-hero.js +243 -1
  98. package/dist/esm/components/db-section-logo-cloud.js +138 -1
  99. package/dist/esm/components/db-section-pricing.js +166 -1
  100. package/dist/esm/components/db-section-stats.js +129 -1
  101. package/dist/esm/components/db-section-testimonials.js +252 -1
  102. package/dist/esm/components/db-section.js +385 -1
  103. package/dist/esm/components/db-segment-control.js +231 -1
  104. package/dist/esm/components/db-select.js +571 -1
  105. package/dist/esm/components/db-share-icons.js +40 -1
  106. package/dist/esm/components/db-share.js +489 -1
  107. package/dist/esm/components/db-sidebar.js +1068 -1
  108. package/dist/esm/components/db-skeleton.js +94 -1
  109. package/dist/esm/components/db-spinner.js +102 -1
  110. package/dist/esm/components/db-split-view.js +297 -1
  111. package/dist/esm/components/db-stack.js +46 -1
  112. package/dist/esm/components/db-stat.js +218 -1
  113. package/dist/esm/components/db-stepper.js +398 -1
  114. package/dist/esm/components/db-table.js +412 -1
  115. package/dist/esm/components/db-tabs.js +335 -1
  116. package/dist/esm/components/db-testimonial.js +162 -1
  117. package/dist/esm/components/db-textarea.js +233 -1
  118. package/dist/esm/components/db-time-picker.js +523 -1
  119. package/dist/esm/components/db-timeline.js +174 -1
  120. package/dist/esm/components/db-toast.js +158 -1
  121. package/dist/esm/components/db-toggle.js +162 -1
  122. package/dist/esm/components/db-toolbar.js +94 -1
  123. package/dist/esm/components/db-tooltip.js +440 -1
  124. package/dist/esm/components/db-top-banner.js +121 -1
  125. package/dist/esm/components/db-tutorial.js +324 -1
  126. package/dist/esm/components/db-video-player.js +503 -1
  127. package/dist/esm/components/db-youtube-player.js +194 -1
  128. package/dist/esm/components/highlight-code.js +65 -1
  129. package/dist/esm/components/input-validation.js +50 -1
  130. package/dist/esm/components/marketing-block-host-utils.js +9 -1
  131. package/dist/esm/components/number-scrub.js +117 -1
  132. package/dist/esm/components/random-gradient-palettes.js +67 -1
  133. package/dist/esm/components/section-block-header-utils.js +48 -1
  134. package/dist/esm/helpers/confirm.js +52 -1
  135. package/dist/esm/helpers/toast.js +73 -1
  136. package/dist/esm/index.js +111 -1
  137. package/dist/esm/node_modules/prismjs/components/prism-bash.js +235 -1
  138. package/dist/esm/node_modules/prismjs/components/prism-clike.js +31 -1
  139. package/dist/esm/node_modules/prismjs/components/prism-css.js +64 -1
  140. package/dist/esm/node_modules/prismjs/components/prism-javascript.js +172 -1
  141. package/dist/esm/node_modules/prismjs/components/prism-json.js +27 -1
  142. package/dist/esm/node_modules/prismjs/components/prism-jsx.js +143 -1
  143. package/dist/esm/node_modules/prismjs/components/prism-markup.js +186 -1
  144. package/dist/esm/node_modules/prismjs/components/prism-scss.js +81 -1
  145. package/dist/esm/node_modules/prismjs/components/prism-tsx.js +15 -1
  146. package/dist/esm/node_modules/prismjs/components/prism-typescript.js +60 -1
  147. package/dist/index.cjs +55414 -1
  148. package/dist/index.css +1 -1
  149. package/dist/index.esm.js +38284 -1
  150. package/dist/react/chunks/lottie-72a4c6d4.js +17032 -0
  151. package/dist/react/index.cjs +56503 -1
  152. package/dist/react/index.d.ts +1 -1
  153. package/dist/react/index.esm.js +39373 -1
  154. package/package.json +1 -1
  155. package/dist/chunks/lottie-2d1f6278.js +0 -1
  156. package/dist/react/chunks/lottie-14e7addb.js +0 -1
@@ -1 +1,271 @@
1
- import{createDbIcon as t}from"./db-icons.js";class DbPagination extends HTMLElement{static get observedAttributes(){return["current-page","total-pages","total-items","page-size","page-size-options","size","variant","alignment","show-first-last","show-previous-next","show-page-size-selector","show-total","sibling-count","boundary-count","disabled","full-width"]}get currentPage(){return Number(this.getAttribute("current-page")||1)}set currentPage(t){this.setAttribute("current-page",String(t))}get totalPages(){return Number(this.getAttribute("total-pages")||1)}set totalPages(t){this.setAttribute("total-pages",String(t))}connectedCallback(){this.render()}attributeChangedCallback(){this.isConnected&&this.render()}iconSize(){const t=this.getAttribute("size")||"m";return"s"===t?12:"l"===t?16:14}render(){const t=this.getAttribute("size")||"m",e=this.getAttribute("variant")||"default",a=this.getAttribute("alignment")||"center",i=this.hasAttribute("disabled"),n=this.hasAttribute("show-first-last"),s="false"!==this.getAttribute("show-previous-next"),r=this.hasAttribute("show-page-size-selector"),o=this.hasAttribute("show-total"),c=this.hasAttribute("full-width")||r||o,l=Number(this.getAttribute("total-items")||0),g=Number(this.getAttribute("page-size")||10),u=this.currentPage,b=this.totalPages,d=u<=1,p=u>=b;this.className=["designbase-wc-pagination",`designbase-wc-pagination--${t}`,`designbase-wc-pagination--${e}`,`designbase-wc-pagination--${a}`,i&&"designbase-wc-pagination--disabled",c&&"designbase-wc-pagination--full-width"].filter(Boolean).join(" "),this.setAttribute("role","navigation"),this.setAttribute("aria-label","페이지 네비게이션"),this.replaceChildren();const h=document.createElement("div");if(h.className=["designbase-wc-pagination__container",c&&"designbase-wc-pagination__container--full-width"].filter(Boolean).join(" "),o&&l>0){const t=document.createElement("div");t.className="designbase-wc-pagination__total",t.textContent=this.getTotalLabel(l,g,u),h.append(t)}const m=document.createElement("nav");m.className="designbase-wc-pagination__nav",m.setAttribute("aria-label","페이지 네비게이션");const A=document.createElement("ul");A.className="designbase-wc-pagination__list",n&&!d&&A.append(this.createIconButton("arrow-bar-left",1,"첫 페이지로 이동","first")),s&&!d&&A.append(this.createIconButton("chevron-left",u-1,"이전 페이지로 이동","previous")),this.getPageNumbers().forEach((t,e)=>{if("..."===t){const t=document.createElement("li");t.className="designbase-wc-pagination__ellipsis";const e=document.createElement("span");return e.className="designbase-wc-pagination__ellipsis-text",e.textContent="...",t.append(e),void A.append(t)}"number"==typeof t&&A.append(this.createPageButton(t,i))}),s&&!p&&A.append(this.createIconButton("chevron-right",u+1,"다음 페이지로 이동","next")),n&&!p&&A.append(this.createIconButton("arrow-bar-right",b,"마지막 페이지로 이동","last")),m.append(A),h.append(m),r&&h.append(this.createPageSizeSelector(t,g,i)),this.append(h)}getPageSizeOptions(){const t=this.getAttribute("page-size-options");if(!t)return[10,20,50,100];try{const e=JSON.parse(t);if(Array.isArray(e))return e.map(t=>Number(t)).filter(t=>!Number.isNaN(t))}catch{}return[10,20,50,100]}getTotalLabel(t,e,a){return`${(a-1)*e+1}-${Math.min(a*e,t)} / ${t}개`}createPageSizeSelector(t,e,a){const i=document.createElement("div");i.className="designbase-wc-pagination__page-size";const n=document.createElement("label");n.className="designbase-wc-pagination__page-size-label";const s=document.createElement("span");s.className="designbase-wc-pagination__page-size-text",s.textContent="페이지당";const r=document.createElement("db-select");return r.className="designbase-wc-pagination__page-size-select",r.setAttribute("size",t),r.setAttribute("show-clear-button","false"),r.setAttribute("searchable","false"),r.setAttribute("options",JSON.stringify(this.getPageSizeOptions().map(t=>({value:String(t),label:String(t)})))),r.setAttribute("value",String(e)),a&&r.setAttribute("disabled",""),r.addEventListener("db-change",t=>{const a=t.detail,i=Number(a?.value);Number.isNaN(i)||i===e||(this.setAttribute("page-size",String(i)),this.dispatchEvent(new CustomEvent("db-page-size-change",{detail:{pageSize:i},bubbles:!0,composed:!0})))}),n.append(s,r),i.append(n),i}getPageNumbers(){const t=Number(this.getAttribute("sibling-count")||1),e=Number(this.getAttribute("boundary-count")||1),a=this.totalPages,i=this.currentPage;if(a<=2*t+3+2)return Array.from({length:a},(t,e)=>e+1);const n=Math.max(i-t,e),s=Math.min(i+t,a-e+1),r=n>e+2,o=s<a-e-1;if(!r&&o){const e=3+2*t;return[...Array.from({length:e},(t,e)=>e+1),"...",a]}if(r&&!o){const e=3+2*t;return[1,"...",...Array.from({length:e},(t,i)=>a-e+i+1)]}if(r&&o){return[1,"...",...Array.from({length:s-n+1},(t,e)=>n+e),"...",a]}return Array.from({length:a},(t,e)=>e+1)}createPageButton(t,e){const a=t===this.currentPage,i=document.createElement("li");i.className="designbase-wc-pagination__item";const n=document.createElement("button");return n.type="button",n.className=["designbase-wc-pagination__button",a&&"designbase-wc-pagination__button--active"].filter(Boolean).join(" "),n.textContent=String(t),n.disabled=e,a&&n.setAttribute("aria-current","page"),n.setAttribute("aria-label",`페이지 ${t}로 이동`),n.addEventListener("click",()=>this.select(t)),i.append(n),i}createIconButton(e,a,i,n){const s=document.createElement("li");s.className="designbase-wc-pagination__item";const r=document.createElement("button");return r.type="button",r.className=`designbase-wc-pagination__button designbase-wc-pagination__button--${n}`,r.disabled=this.hasAttribute("disabled"),r.setAttribute("aria-label",i),r.append(t(e,this.iconSize())),r.addEventListener("click",()=>this.select(a)),s.append(r),s}select(t){this.hasAttribute("disabled")||t===this.currentPage||t<1||t>this.totalPages||(this.currentPage=t,this.dispatchEvent(new CustomEvent("db-change",{detail:{page:t},bubbles:!0,composed:!0})))}}customElements.get("db-pagination")||customElements.define("db-pagination",DbPagination);export{DbPagination};
1
+ import { createDbIcon } from './db-icons.js';
2
+
3
+ class DbPagination extends HTMLElement {
4
+ static get observedAttributes() {
5
+ return [
6
+ 'current-page',
7
+ 'total-pages',
8
+ 'total-items',
9
+ 'page-size',
10
+ 'page-size-options',
11
+ 'size',
12
+ 'variant',
13
+ 'alignment',
14
+ 'show-first-last',
15
+ 'show-previous-next',
16
+ 'show-page-size-selector',
17
+ 'show-total',
18
+ 'sibling-count',
19
+ 'boundary-count',
20
+ 'disabled',
21
+ 'full-width',
22
+ ];
23
+ }
24
+ get currentPage() {
25
+ return Number(this.getAttribute('current-page') || 1);
26
+ }
27
+ set currentPage(value) {
28
+ this.setAttribute('current-page', String(value));
29
+ }
30
+ get totalPages() {
31
+ return Number(this.getAttribute('total-pages') || 1);
32
+ }
33
+ set totalPages(value) {
34
+ this.setAttribute('total-pages', String(value));
35
+ }
36
+ connectedCallback() {
37
+ this.render();
38
+ }
39
+ attributeChangedCallback() {
40
+ if (!this.isConnected)
41
+ return;
42
+ this.render();
43
+ }
44
+ iconSize() {
45
+ const size = this.getAttribute('size') || 'm';
46
+ if (size === 's')
47
+ return 12;
48
+ if (size === 'l')
49
+ return 16;
50
+ return 14;
51
+ }
52
+ render() {
53
+ const size = this.getAttribute('size') || 'm';
54
+ const variant = this.getAttribute('variant') || 'default';
55
+ const alignment = this.getAttribute('alignment') || 'center';
56
+ const disabled = this.hasAttribute('disabled');
57
+ const showFirstLast = this.hasAttribute('show-first-last');
58
+ const showPreviousNext = this.getAttribute('show-previous-next') !== 'false';
59
+ const showPageSizeSelector = this.hasAttribute('show-page-size-selector');
60
+ const showTotal = this.hasAttribute('show-total');
61
+ const fullWidth = this.hasAttribute('full-width') || showPageSizeSelector || showTotal;
62
+ const totalItems = Number(this.getAttribute('total-items') || 0);
63
+ const pageSize = Number(this.getAttribute('page-size') || 10);
64
+ const currentPage = this.currentPage;
65
+ const totalPages = this.totalPages;
66
+ const isFirstPage = currentPage <= 1;
67
+ const isLastPage = currentPage >= totalPages;
68
+ this.className = [
69
+ 'designbase-wc-pagination',
70
+ `designbase-wc-pagination--${size}`,
71
+ `designbase-wc-pagination--${variant}`,
72
+ `designbase-wc-pagination--${alignment}`,
73
+ disabled && 'designbase-wc-pagination--disabled',
74
+ fullWidth && 'designbase-wc-pagination--full-width',
75
+ ]
76
+ .filter(Boolean)
77
+ .join(' ');
78
+ this.setAttribute('role', 'navigation');
79
+ this.setAttribute('aria-label', '페이지 네비게이션');
80
+ this.replaceChildren();
81
+ const container = document.createElement('div');
82
+ container.className = [
83
+ 'designbase-wc-pagination__container',
84
+ fullWidth && 'designbase-wc-pagination__container--full-width',
85
+ ]
86
+ .filter(Boolean)
87
+ .join(' ');
88
+ if (showTotal && totalItems > 0) {
89
+ const totalEl = document.createElement('div');
90
+ totalEl.className = 'designbase-wc-pagination__total';
91
+ totalEl.textContent = this.getTotalLabel(totalItems, pageSize, currentPage);
92
+ container.append(totalEl);
93
+ }
94
+ const nav = document.createElement('nav');
95
+ nav.className = 'designbase-wc-pagination__nav';
96
+ nav.setAttribute('aria-label', '페이지 네비게이션');
97
+ const list = document.createElement('ul');
98
+ list.className = 'designbase-wc-pagination__list';
99
+ if (showFirstLast && !isFirstPage) {
100
+ list.append(this.createIconButton('arrow-bar-left', 1, '첫 페이지로 이동', 'first'));
101
+ }
102
+ if (showPreviousNext && !isFirstPage) {
103
+ list.append(this.createIconButton('chevron-left', currentPage - 1, '이전 페이지로 이동', 'previous'));
104
+ }
105
+ this.getPageNumbers().forEach((page, index) => {
106
+ if (page === '...') {
107
+ const item = document.createElement('li');
108
+ item.className = 'designbase-wc-pagination__ellipsis';
109
+ const text = document.createElement('span');
110
+ text.className = 'designbase-wc-pagination__ellipsis-text';
111
+ text.textContent = '...';
112
+ item.append(text);
113
+ list.append(item);
114
+ return;
115
+ }
116
+ if (typeof page !== 'number')
117
+ return;
118
+ list.append(this.createPageButton(page, disabled));
119
+ });
120
+ if (showPreviousNext && !isLastPage) {
121
+ list.append(this.createIconButton('chevron-right', currentPage + 1, '다음 페이지로 이동', 'next'));
122
+ }
123
+ if (showFirstLast && !isLastPage) {
124
+ list.append(this.createIconButton('arrow-bar-right', totalPages, '마지막 페이지로 이동', 'last'));
125
+ }
126
+ nav.append(list);
127
+ container.append(nav);
128
+ if (showPageSizeSelector) {
129
+ container.append(this.createPageSizeSelector(size, pageSize, disabled));
130
+ }
131
+ this.append(container);
132
+ }
133
+ getPageSizeOptions() {
134
+ const raw = this.getAttribute('page-size-options');
135
+ if (!raw)
136
+ return [10, 20, 50, 100];
137
+ try {
138
+ const parsed = JSON.parse(raw);
139
+ if (Array.isArray(parsed)) {
140
+ return parsed.map((value) => Number(value)).filter((value) => !Number.isNaN(value));
141
+ }
142
+ }
143
+ catch {
144
+ // ignore invalid JSON
145
+ }
146
+ return [10, 20, 50, 100];
147
+ }
148
+ getTotalLabel(totalItems, pageSize, currentPage) {
149
+ const start = (currentPage - 1) * pageSize + 1;
150
+ const end = Math.min(currentPage * pageSize, totalItems);
151
+ return `${start}-${end} / ${totalItems}개`;
152
+ }
153
+ createPageSizeSelector(size, pageSize, disabled) {
154
+ const wrapper = document.createElement('div');
155
+ wrapper.className = 'designbase-wc-pagination__page-size';
156
+ const label = document.createElement('label');
157
+ label.className = 'designbase-wc-pagination__page-size-label';
158
+ const text = document.createElement('span');
159
+ text.className = 'designbase-wc-pagination__page-size-text';
160
+ text.textContent = '페이지당';
161
+ const select = document.createElement('db-select');
162
+ select.className = 'designbase-wc-pagination__page-size-select';
163
+ select.setAttribute('size', size);
164
+ select.setAttribute('show-clear-button', 'false');
165
+ select.setAttribute('searchable', 'false');
166
+ select.setAttribute('options', JSON.stringify(this.getPageSizeOptions().map((option) => ({
167
+ value: String(option),
168
+ label: String(option),
169
+ }))));
170
+ select.setAttribute('value', String(pageSize));
171
+ if (disabled)
172
+ select.setAttribute('disabled', '');
173
+ select.addEventListener('db-change', (event) => {
174
+ const detail = event.detail;
175
+ const nextSize = Number(detail?.value);
176
+ if (Number.isNaN(nextSize) || nextSize === pageSize)
177
+ return;
178
+ this.setAttribute('page-size', String(nextSize));
179
+ this.dispatchEvent(new CustomEvent('db-page-size-change', {
180
+ detail: { pageSize: nextSize },
181
+ bubbles: true,
182
+ composed: true,
183
+ }));
184
+ });
185
+ label.append(text, select);
186
+ wrapper.append(label);
187
+ return wrapper;
188
+ }
189
+ getPageNumbers() {
190
+ const siblingCount = Number(this.getAttribute('sibling-count') || 1);
191
+ const boundaryCount = Number(this.getAttribute('boundary-count') || 1);
192
+ const totalPages = this.totalPages;
193
+ const currentPage = this.currentPage;
194
+ const totalNumbers = siblingCount * 2 + 3;
195
+ const totalBlocks = totalNumbers + 2;
196
+ if (totalPages <= totalBlocks) {
197
+ return Array.from({ length: totalPages }, (_, index) => index + 1);
198
+ }
199
+ const leftSiblingIndex = Math.max(currentPage - siblingCount, boundaryCount);
200
+ const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages - boundaryCount + 1);
201
+ const shouldShowLeftDots = leftSiblingIndex > boundaryCount + 2;
202
+ const shouldShowRightDots = rightSiblingIndex < totalPages - boundaryCount - 1;
203
+ if (!shouldShowLeftDots && shouldShowRightDots) {
204
+ const leftItemCount = 3 + 2 * siblingCount;
205
+ return [...Array.from({ length: leftItemCount }, (_, index) => index + 1), '...', totalPages];
206
+ }
207
+ if (shouldShowLeftDots && !shouldShowRightDots) {
208
+ const rightItemCount = 3 + 2 * siblingCount;
209
+ return [
210
+ 1,
211
+ '...',
212
+ ...Array.from({ length: rightItemCount }, (_, index) => totalPages - rightItemCount + index + 1),
213
+ ];
214
+ }
215
+ if (shouldShowLeftDots && shouldShowRightDots) {
216
+ const middleRange = Array.from({ length: rightSiblingIndex - leftSiblingIndex + 1 }, (_, index) => leftSiblingIndex + index);
217
+ return [1, '...', ...middleRange, '...', totalPages];
218
+ }
219
+ return Array.from({ length: totalPages }, (_, index) => index + 1);
220
+ }
221
+ createPageButton(page, disabled) {
222
+ const isActive = page === this.currentPage;
223
+ const item = document.createElement('li');
224
+ item.className = 'designbase-wc-pagination__item';
225
+ const button = document.createElement('button');
226
+ button.type = 'button';
227
+ button.className = [
228
+ 'designbase-wc-pagination__button',
229
+ isActive && 'designbase-wc-pagination__button--active',
230
+ ]
231
+ .filter(Boolean)
232
+ .join(' ');
233
+ button.textContent = String(page);
234
+ button.disabled = disabled;
235
+ if (isActive)
236
+ button.setAttribute('aria-current', 'page');
237
+ button.setAttribute('aria-label', `페이지 ${page}로 이동`);
238
+ button.addEventListener('click', () => this.select(page));
239
+ item.append(button);
240
+ return item;
241
+ }
242
+ createIconButton(iconName, page, label, modifier) {
243
+ const item = document.createElement('li');
244
+ item.className = 'designbase-wc-pagination__item';
245
+ const button = document.createElement('button');
246
+ button.type = 'button';
247
+ button.className = `designbase-wc-pagination__button designbase-wc-pagination__button--${modifier}`;
248
+ button.disabled = this.hasAttribute('disabled');
249
+ button.setAttribute('aria-label', label);
250
+ button.append(createDbIcon(iconName, this.iconSize()));
251
+ button.addEventListener('click', () => this.select(page));
252
+ item.append(button);
253
+ return item;
254
+ }
255
+ select(page) {
256
+ if (this.hasAttribute('disabled') || page === this.currentPage || page < 1 || page > this.totalPages) {
257
+ return;
258
+ }
259
+ this.currentPage = page;
260
+ this.dispatchEvent(new CustomEvent('db-change', {
261
+ detail: { page },
262
+ bubbles: true,
263
+ composed: true,
264
+ }));
265
+ }
266
+ }
267
+ if (!customElements.get('db-pagination')) {
268
+ customElements.define('db-pagination', DbPagination);
269
+ }
270
+
271
+ export { DbPagination };