@designbasekorea/ui-wc 0.2.1 → 0.2.2

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 (239) hide show
  1. package/README.md +322 -29
  2. package/dist/esm/components/animation-background/canvas-controller.js +1 -0
  3. package/dist/esm/components/animation-background/layers.js +1 -0
  4. package/dist/esm/components/animation-background/lumina-presets.js +1 -0
  5. package/dist/esm/components/animation-background/lumina-shaders.js +1 -0
  6. package/dist/esm/components/animation-background/lumina-utils.js +1 -0
  7. package/dist/esm/components/animation-background/particle-defaults.js +1 -0
  8. package/dist/esm/components/animation-background/renderers.js +1 -0
  9. package/dist/esm/components/animation-background/shader-controller.js +1 -0
  10. package/dist/esm/components/color-picker-utils.js +1 -0
  11. package/dist/esm/components/date-picker-utils.js +1 -0
  12. package/dist/esm/components/db-accordion.d.ts +40 -0
  13. package/dist/esm/components/db-accordion.js +1 -0
  14. package/dist/esm/components/db-ad-banner.d.ts +41 -0
  15. package/dist/esm/components/db-ad-banner.js +1 -0
  16. package/dist/esm/components/db-alert.d.ts +24 -0
  17. package/dist/esm/components/db-alert.js +1 -0
  18. package/dist/esm/components/db-animation-background.d.ts +20 -0
  19. package/dist/esm/components/db-animation-background.js +1 -0
  20. package/dist/esm/components/db-animation-text.d.ts +32 -0
  21. package/dist/esm/components/db-animation-text.js +1 -0
  22. package/dist/esm/components/db-app-badge.d.ts +20 -0
  23. package/dist/esm/components/db-app-badge.js +1 -0
  24. package/dist/esm/components/db-audio-player.d.ts +82 -0
  25. package/dist/esm/components/db-audio-player.js +1 -0
  26. package/dist/esm/components/db-avatar.d.ts +18 -0
  27. package/dist/esm/components/db-avatar.js +1 -0
  28. package/dist/esm/components/db-backdrop.d.ts +24 -0
  29. package/dist/esm/components/db-backdrop.js +1 -0
  30. package/dist/esm/components/db-badge.d.ts +27 -0
  31. package/dist/esm/components/db-badge.js +1 -0
  32. package/dist/esm/components/db-banner.d.ts +28 -0
  33. package/dist/esm/components/db-banner.js +1 -0
  34. package/dist/esm/components/db-bottom-navigation.d.ts +29 -0
  35. package/dist/esm/components/db-bottom-navigation.js +1 -0
  36. package/dist/esm/components/db-bottom-sheet.d.ts +49 -0
  37. package/dist/esm/components/db-bottom-sheet.js +1 -0
  38. package/dist/esm/components/db-breadcrumbs.d.ts +24 -0
  39. package/dist/esm/components/db-breadcrumbs.js +1 -0
  40. package/dist/esm/components/db-button.d.ts +57 -0
  41. package/dist/esm/components/db-button.js +1 -0
  42. package/dist/esm/components/db-calendar.d.ts +78 -0
  43. package/dist/esm/components/db-calendar.js +1 -0
  44. package/dist/esm/components/db-card.d.ts +42 -0
  45. package/dist/esm/components/db-card.js +1 -0
  46. package/dist/esm/components/db-carousel.d.ts +35 -0
  47. package/dist/esm/components/db-carousel.js +1 -0
  48. package/dist/esm/components/db-checkbox.d.ts +35 -0
  49. package/dist/esm/components/db-checkbox.js +1 -0
  50. package/dist/esm/components/db-chip.d.ts +14 -0
  51. package/dist/esm/components/db-chip.js +1 -0
  52. package/dist/esm/components/db-code-block.d.ts +28 -0
  53. package/dist/esm/components/db-code-block.js +1 -0
  54. package/dist/esm/components/db-color-picker.d.ts +83 -0
  55. package/dist/esm/components/db-color-picker.js +1 -0
  56. package/dist/esm/components/db-confirm.d.ts +23 -0
  57. package/dist/esm/components/db-confirm.js +1 -0
  58. package/dist/esm/components/db-container.d.ts +13 -0
  59. package/dist/esm/components/db-container.js +1 -0
  60. package/dist/esm/components/db-context-menu.d.ts +46 -0
  61. package/dist/esm/components/db-context-menu.js +1 -0
  62. package/dist/esm/components/db-countdown.d.ts +23 -0
  63. package/dist/esm/components/db-countdown.js +1 -0
  64. package/dist/esm/components/db-cursor-follower.d.ts +32 -0
  65. package/dist/esm/components/db-cursor-follower.js +1 -0
  66. package/dist/esm/components/db-date-picker.d.ts +84 -0
  67. package/dist/esm/components/db-date-picker.js +1 -0
  68. package/dist/esm/components/db-divider.d.ts +13 -0
  69. package/dist/esm/components/db-divider.js +1 -0
  70. package/dist/esm/components/db-drawer.d.ts +32 -0
  71. package/dist/esm/components/db-drawer.js +1 -0
  72. package/dist/esm/components/db-dropdown.d.ts +70 -0
  73. package/dist/esm/components/db-dropdown.js +1 -0
  74. package/dist/esm/components/db-dropzone.d.ts +29 -0
  75. package/dist/esm/components/db-dropzone.js +1 -0
  76. package/dist/esm/components/db-empty-state.d.ts +14 -0
  77. package/dist/esm/components/db-empty-state.js +1 -0
  78. package/dist/esm/components/db-file-uploader.d.ts +27 -0
  79. package/dist/esm/components/db-file-uploader.js +1 -0
  80. package/dist/esm/components/db-floating-action-button.d.ts +24 -0
  81. package/dist/esm/components/db-floating-action-button.js +1 -0
  82. package/dist/esm/components/db-form.d.ts +94 -0
  83. package/dist/esm/components/db-form.js +1 -0
  84. package/dist/esm/components/db-gradient.d.ts +26 -0
  85. package/dist/esm/components/db-gradient.js +1 -0
  86. package/dist/esm/components/db-grid.d.ts +20 -0
  87. package/dist/esm/components/db-grid.js +1 -0
  88. package/dist/esm/components/db-icons.js +1 -0
  89. package/dist/esm/components/db-image-list.d.ts +35 -0
  90. package/dist/esm/components/db-image-list.js +1 -0
  91. package/dist/esm/components/db-image-placeholder.d.ts +16 -0
  92. package/dist/esm/components/db-image-placeholder.js +1 -0
  93. package/dist/esm/components/db-image.d.ts +34 -0
  94. package/dist/esm/components/db-image.js +1 -0
  95. package/dist/esm/components/db-indicator.d.ts +46 -0
  96. package/dist/esm/components/db-indicator.js +1 -0
  97. package/dist/esm/components/db-input.d.ts +51 -0
  98. package/dist/esm/components/db-input.js +1 -0
  99. package/dist/esm/components/db-label.d.ts +13 -0
  100. package/dist/esm/components/db-label.js +1 -0
  101. package/dist/esm/components/db-lightbox.d.ts +52 -0
  102. package/dist/esm/components/db-lightbox.js +1 -0
  103. package/dist/esm/components/db-list.d.ts +46 -0
  104. package/dist/esm/components/db-list.js +1 -0
  105. package/dist/esm/components/db-logo-svg.js +1 -0
  106. package/dist/esm/components/db-logo.d.ts +15 -0
  107. package/dist/esm/components/db-logo.js +1 -0
  108. package/dist/esm/components/db-lottie.d.ts +20 -0
  109. package/dist/esm/components/db-lottie.js +1 -0
  110. package/dist/esm/components/db-markdown-editor.d.ts +53 -0
  111. package/dist/esm/components/db-markdown-editor.js +1 -0
  112. package/dist/esm/components/db-marquee.d.ts +34 -0
  113. package/dist/esm/components/db-marquee.js +1 -0
  114. package/dist/esm/components/db-masonry.d.ts +24 -0
  115. package/dist/esm/components/db-masonry.js +1 -0
  116. package/dist/esm/components/db-menu-item.d.ts +30 -0
  117. package/dist/esm/components/db-menu-item.js +1 -0
  118. package/dist/esm/components/db-modal.d.ts +63 -0
  119. package/dist/esm/components/db-modal.js +1 -0
  120. package/dist/esm/components/db-navbar.d.ts +57 -0
  121. package/dist/esm/components/db-navbar.js +1 -0
  122. package/dist/esm/components/db-onboarding-modal.d.ts +57 -0
  123. package/dist/esm/components/db-onboarding-modal.js +1 -0
  124. package/dist/esm/components/db-page-header.d.ts +33 -0
  125. package/dist/esm/components/db-page-header.js +1 -0
  126. package/dist/esm/components/db-pagination.d.ts +25 -0
  127. package/dist/esm/components/db-pagination.js +1 -0
  128. package/dist/esm/components/db-popover.d.ts +62 -0
  129. package/dist/esm/components/db-popover.js +1 -0
  130. package/dist/esm/components/db-progress-step.d.ts +28 -0
  131. package/dist/esm/components/db-progress-step.js +1 -0
  132. package/dist/esm/components/db-progress.d.ts +15 -0
  133. package/dist/esm/components/db-progress.js +1 -0
  134. package/dist/esm/components/db-progressbar.d.ts +13 -0
  135. package/dist/esm/components/db-progressbar.js +1 -0
  136. package/dist/esm/components/db-radio.d.ts +34 -0
  137. package/dist/esm/components/db-radio.js +1 -0
  138. package/dist/esm/components/db-random-gradient.d.ts +24 -0
  139. package/dist/esm/components/db-random-gradient.js +1 -0
  140. package/dist/esm/components/db-range-slider.d.ts +64 -0
  141. package/dist/esm/components/db-range-slider.js +1 -0
  142. package/dist/esm/components/db-rating.d.ts +31 -0
  143. package/dist/esm/components/db-rating.js +1 -0
  144. package/dist/esm/components/db-reorder.d.ts +38 -0
  145. package/dist/esm/components/db-reorder.js +1 -0
  146. package/dist/esm/components/db-resizable-panels.d.ts +42 -0
  147. package/dist/esm/components/db-resizable-panels.js +1 -0
  148. package/dist/esm/components/db-scroll-area.d.ts +23 -0
  149. package/dist/esm/components/db-scroll-area.js +1 -0
  150. package/dist/esm/components/db-search-bar.d.ts +53 -0
  151. package/dist/esm/components/db-search-bar.js +1 -0
  152. package/dist/esm/components/db-section-app-download.d.ts +32 -0
  153. package/dist/esm/components/db-section-app-download.js +1 -0
  154. package/dist/esm/components/db-section-contact.d.ts +22 -0
  155. package/dist/esm/components/db-section-contact.js +1 -0
  156. package/dist/esm/components/db-section-feature.d.ts +34 -0
  157. package/dist/esm/components/db-section-feature.js +1 -0
  158. package/dist/esm/components/db-section-hero.d.ts +34 -0
  159. package/dist/esm/components/db-section-hero.js +1 -0
  160. package/dist/esm/components/db-section.d.ts +44 -0
  161. package/dist/esm/components/db-section.js +1 -0
  162. package/dist/esm/components/db-segment-control.d.ts +41 -0
  163. package/dist/esm/components/db-segment-control.js +1 -0
  164. package/dist/esm/components/db-select.d.ts +66 -0
  165. package/dist/esm/components/db-select.js +1 -0
  166. package/dist/esm/components/db-share-icons.js +1 -0
  167. package/dist/esm/components/db-share.d.ts +48 -0
  168. package/dist/esm/components/db-share.js +1 -0
  169. package/dist/esm/components/db-sidebar.d.ts +59 -0
  170. package/dist/esm/components/db-sidebar.js +1 -0
  171. package/dist/esm/components/db-skeleton.d.ts +13 -0
  172. package/dist/esm/components/db-skeleton.js +1 -0
  173. package/dist/esm/components/db-spinner.d.ts +27 -0
  174. package/dist/esm/components/db-spinner.js +1 -0
  175. package/dist/esm/components/db-split-view.d.ts +33 -0
  176. package/dist/esm/components/db-split-view.js +1 -0
  177. package/dist/esm/components/db-stack.d.ts +13 -0
  178. package/dist/esm/components/db-stack.js +1 -0
  179. package/dist/esm/components/db-stat.d.ts +26 -0
  180. package/dist/esm/components/db-stat.js +1 -0
  181. package/dist/esm/components/db-stepper.d.ts +49 -0
  182. package/dist/esm/components/db-stepper.js +1 -0
  183. package/dist/esm/components/db-table.d.ts +39 -0
  184. package/dist/esm/components/db-table.js +1 -0
  185. package/dist/esm/components/db-tabs.d.ts +48 -0
  186. package/dist/esm/components/db-tabs.js +1 -0
  187. package/dist/esm/components/db-testimonial.d.ts +27 -0
  188. package/dist/esm/components/db-testimonial.js +1 -0
  189. package/dist/esm/components/db-textarea.d.ts +33 -0
  190. package/dist/esm/components/db-textarea.js +1 -0
  191. package/dist/esm/components/db-time-picker.d.ts +62 -0
  192. package/dist/esm/components/db-time-picker.js +1 -0
  193. package/dist/esm/components/db-timeline.d.ts +29 -0
  194. package/dist/esm/components/db-timeline.js +1 -0
  195. package/dist/esm/components/db-toast.d.ts +23 -0
  196. package/dist/esm/components/db-toast.js +1 -0
  197. package/dist/esm/components/db-toggle.d.ts +35 -0
  198. package/dist/esm/components/db-toggle.js +1 -0
  199. package/dist/esm/components/db-toolbar.d.ts +25 -0
  200. package/dist/esm/components/db-toolbar.js +1 -0
  201. package/dist/esm/components/db-tooltip.d.ts +55 -0
  202. package/dist/esm/components/db-tooltip.js +1 -0
  203. package/dist/esm/components/db-top-banner.d.ts +17 -0
  204. package/dist/esm/components/db-top-banner.js +1 -0
  205. package/dist/esm/components/db-tutorial.d.ts +54 -0
  206. package/dist/esm/components/db-tutorial.js +1 -0
  207. package/dist/esm/components/db-video-player.d.ts +67 -0
  208. package/dist/esm/components/db-video-player.js +1 -0
  209. package/dist/esm/components/db-youtube-player.d.ts +22 -0
  210. package/dist/esm/components/db-youtube-player.js +1 -0
  211. package/dist/esm/components/highlight-code.js +1 -0
  212. package/dist/esm/components/input-validation.js +1 -0
  213. package/dist/esm/components/number-scrub.js +1 -0
  214. package/dist/esm/components/random-gradient-palettes.js +1 -0
  215. package/dist/esm/helpers/confirm.d.ts +30 -0
  216. package/dist/esm/helpers/confirm.js +1 -0
  217. package/dist/esm/helpers/toast.d.ts +56 -0
  218. package/dist/esm/helpers/toast.js +1 -0
  219. package/dist/esm/index.d.ts +100 -0
  220. package/dist/esm/index.js +1 -0
  221. package/dist/esm/node_modules/prismjs/components/prism-bash.js +1 -0
  222. package/dist/esm/node_modules/prismjs/components/prism-clike.js +1 -0
  223. package/dist/esm/node_modules/prismjs/components/prism-css.js +1 -0
  224. package/dist/esm/node_modules/prismjs/components/prism-javascript.js +1 -0
  225. package/dist/esm/node_modules/prismjs/components/prism-json.js +1 -0
  226. package/dist/esm/node_modules/prismjs/components/prism-jsx.js +1 -0
  227. package/dist/esm/node_modules/prismjs/components/prism-markup.js +1 -0
  228. package/dist/esm/node_modules/prismjs/components/prism-scss.js +1 -0
  229. package/dist/esm/node_modules/prismjs/components/prism-tsx.js +1 -0
  230. package/dist/esm/node_modules/prismjs/components/prism-typescript.js +1 -0
  231. package/dist/index.cjs +1 -1
  232. package/dist/index.css +1 -1
  233. package/dist/index.d.ts +160 -3
  234. package/dist/index.esm.js +1 -1
  235. package/dist/react/index.cjs +1 -1
  236. package/dist/react/index.d.ts +176 -48
  237. package/dist/react/index.esm.js +1 -1
  238. package/package.json +10 -2
  239. /package/dist/chunks/{lottie-2c3b8673.js → lottie-e741cdda.js} +0 -0
@@ -0,0 +1,52 @@
1
+ interface DbLightboxImage {
2
+ id: string;
3
+ src: string;
4
+ alt?: string;
5
+ title?: string;
6
+ description?: string;
7
+ thumbnail?: string;
8
+ }
9
+ declare class DbLightbox extends HTMLElement {
10
+ private portalEl;
11
+ private imageEl;
12
+ private loadingEl;
13
+ private errorEl;
14
+ private counterBadge;
15
+ private prevNav;
16
+ private nextNav;
17
+ private currentIndex;
18
+ private imageLoaded;
19
+ private imageError;
20
+ private keydownHandler;
21
+ private boundSrc;
22
+ static get observedAttributes(): string[];
23
+ connectedCallback(): void;
24
+ disconnectedCallback(): void;
25
+ attributeChangedCallback(name: string, _old: string | null, newValue: string | null): void;
26
+ get open(): boolean;
27
+ set open(value: boolean);
28
+ private parseImages;
29
+ private getCurrentImage;
30
+ private resetImageState;
31
+ private close;
32
+ private goTo;
33
+ private createIconButton;
34
+ private buildPortal;
35
+ private handleImageLoad;
36
+ private handleImageError;
37
+ private syncImageLayers;
38
+ private updateThumbnails;
39
+ private loadCurrentImage;
40
+ private refreshView;
41
+ private mount;
42
+ private unmount;
43
+ private syncOpenState;
44
+ }
45
+ declare global {
46
+ interface HTMLElementTagNameMap {
47
+ 'db-lightbox': DbLightbox;
48
+ }
49
+ }
50
+
51
+ export { DbLightbox };
52
+ export type { DbLightboxImage };
@@ -0,0 +1 @@
1
+ import{createDbIcon as e}from"./db-icons.js";const t=["s","m","l","xl"];class DbLightbox extends HTMLElement{constructor(){super(...arguments),this.portalEl=null,this.imageEl=null,this.loadingEl=null,this.errorEl=null,this.counterBadge=null,this.prevNav=null,this.nextNav=null,this.currentIndex=0,this.imageLoaded=!1,this.imageError=!1,this.keydownHandler=null,this.boundSrc="",this.handleImageLoad=()=>{this.imageLoaded=!0,this.imageError=!1,this.syncImageLayers()},this.handleImageError=()=>{this.imageLoaded=!1,this.imageError=!0,this.syncImageLayers()}}static get observedAttributes(){return["images","current-index","size","open","enable-keyboard","show-thumbnails","show-counter","show-close-button","show-navigation-buttons","show-toolbar","close-on-backdrop-click","close-on-escape"]}connectedCallback(){this.classList.add("designbase-wc-lightbox-host"),this.syncOpenState()}disconnectedCallback(){this.unmount()}attributeChangedCallback(e,t,s){if("current-index"===e)return this.currentIndex=Number(s||0),this.resetImageState(),void(this.open&&this.refreshView());"open"!==e?"images"===e&&this.open&&this.refreshView():this.syncOpenState()}get open(){return this.hasAttribute("open")&&"false"!==this.getAttribute("open")}set open(e){e?this.setAttribute("open",""):this.removeAttribute("open")}parseImages(){const e=this.getAttribute("images");if(!e)return[];try{const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}getCurrentImage(){return this.parseImages()[this.currentIndex]||null}resetImageState(){this.imageLoaded=!1,this.imageError=!1,this.boundSrc=""}close(){this.open=!1,this.dispatchEvent(new CustomEvent("db-close",{bubbles:!0,composed:!0}))}goTo(e){const t=this.parseImages();if(!t.length)return;const s=(e%t.length+t.length)%t.length;s!==this.currentIndex&&(this.currentIndex=s,this.setAttribute("current-index",String(s)),this.resetImageState(),this.refreshView(),this.dispatchEvent(new CustomEvent("db-image-change",{bubbles:!0,composed:!0,detail:{index:s}})))}createIconButton(t,s,i,n,a,r={}){const o=document.createElement("db-button");o.className=t,o.setAttribute("variant",r.variant||"ghost"),o.setAttribute("size","m"),o.setAttribute("icon-only",""),o.setAttribute("aria-label",n),r.radius&&o.setAttribute("radius",r.radius);const l=document.createElement("span");return l.className="designbase-wc-button__start-icon",l.append(e(s,i)),o.append(l),o.addEventListener("db-click",a),o}buildPortal(){const s=this.getAttribute("size")||"l",i=t.includes(s)?s:"l",n=document.createElement("div");n.className=`designbase-wc-lightbox designbase-wc-lightbox--size-${i}`,n.setAttribute("data-wc-internal","");const a=document.createElement("div");a.className="designbase-wc-lightbox__overlay";const r=document.createElement("div");r.className="designbase-wc-lightbox__modal";const o=document.createElement("div");o.className="designbase-wc-lightbox__header";const l=document.createElement("div");l.className="designbase-wc-lightbox__title";const c=document.createElement("h3");c.className="designbase-wc-lightbox__title-text";const h=document.createElement("db-badge");h.className="designbase-wc-lightbox__counter",h.setAttribute("size","s"),h.setAttribute("variant","secondary"),h.setAttribute("badge-style","text"),l.append(c,h);const d=document.createElement("div");d.className="designbase-wc-lightbox__header-actions","false"!==this.getAttribute("show-close-button")&&d.append(this.createIconButton("designbase-wc-lightbox__close-button","close",20,"닫기",()=>this.close())),o.append(l,d);const g=document.createElement("div");g.className="designbase-wc-lightbox__content",this.prevNav=this.createIconButton("designbase-wc-lightbox__nav-button designbase-wc-lightbox__nav-button--prev","chevron-left",24,"이전 이미지",()=>this.goTo(this.currentIndex-1),{radius:"pill"}),this.nextNav=this.createIconButton("designbase-wc-lightbox__nav-button designbase-wc-lightbox__nav-button--next","chevron-right",24,"다음 이미지",()=>this.goTo(this.currentIndex+1),{radius:"pill"});const u=document.createElement("div");u.className="designbase-wc-lightbox__image-container",this.errorEl=document.createElement("div"),this.errorEl.className="designbase-wc-lightbox__error",this.errorEl.hidden=!0;const b=e("gallery",24);b.classList.add("designbase-wc-lightbox__error-icon"),this.errorEl.append(b);const m=document.createElement("p");m.className="designbase-wc-lightbox__error-text",m.textContent="이미지를 불러올 수 없습니다",this.errorEl.append(m),this.loadingEl=document.createElement("div"),this.loadingEl.className="designbase-wc-lightbox__loading";const p=document.createElement("db-spinner");p.setAttribute("type","circular"),p.setAttribute("size","m"),p.setAttribute("show-label",""),p.setAttribute("label","이미지 로딩 중..."),this.loadingEl.append(p),this.imageEl=document.createElement("img"),this.imageEl.className="designbase-wc-lightbox__image",this.imageEl.draggable=!1,this.imageEl.addEventListener("load",this.handleImageLoad),this.imageEl.addEventListener("error",this.handleImageError),u.append(this.errorEl,this.loadingEl,this.imageEl);const E=document.createElement("div");E.className="designbase-wc-lightbox__description";const x=document.createElement("p");x.className="designbase-wc-lightbox__description-text",E.append(x),"false"!==this.getAttribute("show-navigation-buttons")&&g.append(this.prevNav,this.nextNav),g.append(u,E);const w=document.createElement("div");w.className="designbase-wc-lightbox__thumbnails";const _=document.createElement("div");return _.className="designbase-wc-lightbox__thumbnails-container",w.append(_),r.append(o,g,w),a.append(r),n.append(a),a.addEventListener("click",e=>{e.target===a&&"false"!==this.getAttribute("close-on-backdrop-click")&&this.close()}),this.portalEl=n,this.counterBadge=h,n}syncImageLayers(){this.imageEl&&this.loadingEl&&this.errorEl&&(this.imageEl.classList.toggle("designbase-wc-lightbox__image--loaded",this.imageLoaded),this.loadingEl.hidden=this.imageLoaded||this.imageError,this.errorEl.hidden=!this.imageError,this.imageEl.hidden=this.imageError)}updateThumbnails(){if(!this.portalEl)return;const e=this.portalEl.querySelector(".designbase-wc-lightbox__thumbnails-container"),t=this.portalEl.querySelector(".designbase-wc-lightbox__thumbnails");if(!e||!t)return;const s=this.parseImages(),i="false"!==this.getAttribute("show-thumbnails")&&s.length>1;t.hidden=!i,e.replaceChildren(),i&&s.forEach((t,s)=>{const i=document.createElement("button");i.type="button",i.className=["designbase-wc-lightbox__thumbnail",s===this.currentIndex&&"designbase-wc-lightbox__thumbnail--active"].filter(Boolean).join(" "),i.title=t.title||`이미지 ${s+1}`,i.setAttribute("aria-label",t.alt||t.title||`이미지 ${s+1}`),i.setAttribute("aria-current",s===this.currentIndex?"true":"false");const n=document.createElement("img");n.className="designbase-wc-lightbox__thumbnail-image",n.src=t.thumbnail||t.src,n.alt="",n.draggable=!1,n.loading="lazy",n.decoding="async",i.append(n),i.addEventListener("click",()=>this.goTo(s)),e.append(i)})}loadCurrentImage(){if(!this.imageEl)return;const e=this.getCurrentImage();if(!e?.src)return this.imageEl.removeAttribute("src"),this.resetImageState(),void this.syncImageLayers();this.boundSrc!==e.src&&(this.boundSrc=e.src,this.resetImageState(),this.imageEl.src=e.src,this.imageEl.alt=e.alt||e.title||`이미지 ${this.currentIndex+1}`,this.syncImageLayers(),this.imageEl.complete&&this.imageEl.naturalWidth>0&&this.handleImageLoad())}refreshView(){if(!this.portalEl)return;const e=this.getCurrentImage(),t=this.parseImages(),s=this.portalEl.querySelector(".designbase-wc-lightbox__title-text"),i=this.portalEl.querySelector(".designbase-wc-lightbox__description-text"),n=this.portalEl.querySelector(".designbase-wc-lightbox__description");if(s&&(s.textContent=e?.title||"",s.hidden=!e?.title),this.counterBadge){const e="false"!==this.getAttribute("show-counter")&&t.length>1?`${this.currentIndex+1} / ${t.length}`:"";this.counterBadge.textContent=e,this.counterBadge.hidden=!e}n&&i&&(i.textContent=e?.description||"",n.hidden=!e?.description);const a="false"!==this.getAttribute("show-navigation-buttons")&&t.length>1;this.prevNav&&(this.prevNav.hidden=!a),this.nextNav&&(this.nextNav.hidden=!a),this.loadCurrentImage(),this.updateThumbnails()}mount(){this.portalEl||(this.portalEl=this.buildPortal()),this.portalEl.isConnected||document.body.append(this.portalEl),document.body.style.overflow="hidden",this.keydownHandler||(this.keydownHandler=e=>{this.open&&"false"!==this.getAttribute("enable-keyboard")&&("Escape"===e.key&&"false"!==this.getAttribute("close-on-escape")&&(e.preventDefault(),this.close()),"ArrowLeft"===e.key&&this.goTo(this.currentIndex-1),"ArrowRight"===e.key&&this.goTo(this.currentIndex+1))},document.addEventListener("keydown",this.keydownHandler)),this.currentIndex=Number(this.getAttribute("current-index")||0),this.refreshView()}unmount(){this.portalEl?.remove(),document.body.style.overflow="",this.keydownHandler&&(document.removeEventListener("keydown",this.keydownHandler),this.keydownHandler=null)}syncOpenState(){this.open?this.mount():this.unmount()}}customElements.get("db-lightbox")||customElements.define("db-lightbox",DbLightbox);export{DbLightbox};
@@ -0,0 +1,46 @@
1
+ interface DbListItemData {
2
+ id: string;
3
+ title: string;
4
+ description?: string;
5
+ badge?: string | {
6
+ text: string;
7
+ variant?: string;
8
+ style?: string;
9
+ };
10
+ icon?: string;
11
+ image?: string;
12
+ disabled?: boolean;
13
+ selected?: boolean;
14
+ meta?: {
15
+ label: string;
16
+ value: string;
17
+ }[];
18
+ }
19
+ declare class DbList extends HTMLElement {
20
+ static get observedAttributes(): string[];
21
+ private groupName;
22
+ get items(): DbListItemData[];
23
+ set items(value: DbListItemData[] | string);
24
+ get selectedItems(): string[];
25
+ set selectedItems(value: string[] | string);
26
+ connectedCallback(): void;
27
+ attributeChangedCallback(name: string): void;
28
+ private flag;
29
+ private controlSize;
30
+ private parseBadge;
31
+ private isSelected;
32
+ private setSelection;
33
+ private toggleSelection;
34
+ private syncSelectionState;
35
+ private createSelectControl;
36
+ private createBadge;
37
+ private render;
38
+ }
39
+ declare global {
40
+ interface HTMLElementTagNameMap {
41
+ 'db-list': DbList;
42
+ }
43
+ }
44
+
45
+ export { DbList };
46
+ export type { DbListItemData };
@@ -0,0 +1 @@
1
+ import{createDbIcon as e}from"./db-icons.js";class DbList extends HTMLElement{constructor(){super(...arguments),this.groupName=`db-list-${Math.random().toString(36).slice(2,9)}`}static get observedAttributes(){return["items","size","variant","layout","spacing","selectable","multiple","selected-items","empty-message","show-description","show-arrow","show-badge","loading","loading-count"]}get items(){try{return JSON.parse(this.getAttribute("items")||"[]")}catch{return[]}}set items(e){this.setAttribute("items","string"==typeof e?e:JSON.stringify(e))}get selectedItems(){const e=this.getAttribute("selected-items")||"[]";try{const t=JSON.parse(e);return Array.isArray(t)?t.map(String):[]}catch{return[]}}set selectedItems(e){this.setAttribute("selected-items","string"==typeof e?e:JSON.stringify(e))}connectedCallback(){this.render()}attributeChangedCallback(e){this.isConnected&&("selected-items"!==e?this.render():this.syncSelectionState())}flag(e,t=!0){return this.hasAttribute(e)?"false"!==this.getAttribute(e):t}controlSize(){return"l"===(this.getAttribute("size")||"m")?"m":"s"}parseBadge(e){return e?"string"==typeof e?{text:e,variant:"primary",style:"text"}:{text:e.text,variant:e.variant||"primary",style:e.style||"text"}:null}isSelected(e){return e.selected||this.selectedItems.includes(e.id)}setSelection(e){const t=JSON.stringify(e);this.getAttribute("selected-items")!==t?(this.setAttribute("selected-items",t),this.syncSelectionState(),this.dispatchEvent(new CustomEvent("db-select",{detail:{selectedItems:e},bubbles:!0,composed:!0}))):this.syncSelectionState()}toggleSelection(e){const t=this.hasAttribute("multiple"),s=this.selectedItems;let i;i=t?s.includes(e)?s.filter(t=>t!==e):[...s,e]:s.includes(e)?[]:[e],this.setSelection(i)}syncSelectionState(){const e=new Set(this.selectedItems);this.querySelectorAll(":scope > .designbase-wc-list__item").forEach(t=>{const s=t.dataset.itemId;if(!s)return;const i=e.has(s);t.classList.toggle("designbase-wc-list__item--selected",i),t.setAttribute("aria-selected",String(i));const n=t.querySelector("db-checkbox, db-radio");n&&(i?n.setAttribute("checked",""):n.removeAttribute("checked"))})}createSelectControl(e,t){const s=document.createElement("div");s.className="designbase-wc-list__item-select";const i=document.createElement(t?"db-checkbox":"db-radio");return i.setAttribute("has-label","false"),i.setAttribute("size",this.controlSize()),i.setAttribute("value",e.id),t||i.setAttribute("name",this.groupName),this.isSelected(e)&&i.setAttribute("checked",""),e.disabled&&i.setAttribute("disabled",""),i.addEventListener("click",e=>e.stopPropagation()),i.addEventListener("db-change",t=>{t.stopPropagation(),e.disabled||this.toggleSelection(e.id)}),s.append(i),s}createBadge(e){const t=document.createElement("db-badge");return t.setAttribute("size","s"),t.setAttribute("variant",e.variant),t.setAttribute("badge-style",e.style),"number"===e.style?t.setAttribute("count",e.text):t.textContent=e.text,t}render(){const t=this.getAttribute("size")||"m",s=this.getAttribute("variant")||"navigation",i=this.getAttribute("layout")||"vertical",n=this.getAttribute("spacing")||"s",a=this.hasAttribute("selectable"),c=this.hasAttribute("multiple"),l=this.hasAttribute("loading"),d=Number(this.getAttribute("loading-count")||3),r=this.flag("show-description",!1),o=this.flag("show-arrow",!0),m=this.flag("show-badge",!0),b=this.items,g="s"===t?16:"l"===t?24:20;if(this.className=["designbase-wc-list",`designbase-wc-list--size-${t}`,`designbase-wc-list--variant-${s}`,`designbase-wc-list--layout-${i}`,`designbase-wc-list--spacing-${n}`,a&&"designbase-wc-list--selectable",c&&"designbase-wc-list--multiple",l&&"designbase-wc-list--loading"].filter(Boolean).join(" "),this.replaceChildren(),l)for(let e=0;e<d;e+=1){const e=document.createElement("div");e.className="designbase-wc-list__item designbase-wc-list__item--loading",e.innerHTML='\n <div class="designbase-wc-list__item-skeleton">\n <div class="designbase-wc-list__item-skeleton-icon"></div>\n <div class="designbase-wc-list__item-skeleton-content">\n <div class="designbase-wc-list__item-skeleton-title"></div>\n <div class="designbase-wc-list__item-skeleton-description"></div>\n </div>\n </div>\n ',this.append(e)}else{if(0===b.length){const e=document.createElement("div");return e.className="designbase-wc-list__empty",e.textContent=this.getAttribute("empty-message")||"항목이 없습니다.",void this.append(e)}b.forEach((l,d)=>{const b=this.isSelected(l),u=r&&Boolean(l.description),h=Boolean(l.meta?.length),p=this.parseBadge(l.badge),_=Boolean(m&&p||o),w=document.createElement("div");if(w.className=["designbase-wc-list__item",`designbase-wc-list__item--size-${t}`,`designbase-wc-list__item--variant-${s}`,`designbase-wc-list__item--layout-${i}`,`designbase-wc-list__item--spacing-${n}`,b&&"designbase-wc-list__item--selected",l.disabled&&"designbase-wc-list__item--disabled",(a||!l.disabled)&&"designbase-wc-list__item--clickable",l.icon&&"designbase-wc-list__item--with-leading",(u||h)&&"designbase-wc-list__item--with-secondary",_&&"designbase-wc-list__item--with-trailing"].filter(Boolean).join(" "),w.dataset.itemId=l.id,w.tabIndex=l.disabled?-1:0,a&&w.setAttribute("aria-selected",String(b)),a&&w.append(this.createSelectControl(l,c)),l.icon){const t=document.createElement("div");t.className="designbase-wc-list__item-icon",t.append(e(l.icon,g)),w.append(t)}else if(l.image){const e=document.createElement("div");e.className="designbase-wc-list__item-image";const t=document.createElement("img");t.src=l.image,t.alt=l.title,e.append(t),w.append(e)}const v=document.createElement("div");v.className="designbase-wc-list__item-content";const A=document.createElement("div");A.className="designbase-wc-list__item-header";const y=document.createElement("h4");if(y.className="designbase-wc-list__item-title",y.textContent=l.title,A.append(y),v.append(A),u){const e=document.createElement("p");e.className="designbase-wc-list__item-description",e.textContent=l.description||"",v.append(e)}if(h&&l.meta){const e=document.createElement("div");e.className="designbase-wc-list__item-meta",l.meta.forEach(t=>{const s=document.createElement("div");s.className="designbase-wc-list__item-meta-item";const i=document.createElement("span");i.className="designbase-wc-list__item-meta-label",i.textContent=`${t.label}:`;const n=document.createElement("span");n.className="designbase-wc-list__item-meta-value",n.textContent=t.value,s.append(i,n),e.append(s)}),v.append(e)}if(w.append(v),_){const t=document.createElement("div");if(t.className="designbase-wc-list__item-trailing",m&&p&&t.append(this.createBadge(p)),o){const s=document.createElement("div");s.className="designbase-wc-list__item-arrow",s.setAttribute("aria-hidden","true"),s.append(e("chevron-right",16)),t.append(s)}w.append(t)}const handleActivate=()=>{l.disabled||(this.dispatchEvent(new CustomEvent("db-item-click",{detail:{item:l,index:d},bubbles:!0,composed:!0})),a&&this.toggleSelection(l.id))};w.addEventListener("click",handleActivate),w.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),handleActivate())}),this.append(w)})}}}customElements.get("db-list")||customElements.define("db-list",DbList);export{DbList};
@@ -0,0 +1 @@
1
+ const t={xs:{width:96,height:20,markSize:19},s:{width:125,height:26,markSize:25},m:{width:193,height:40,markSize:38},l:{width:256,height:53,markSize:50},xl:{width:320,height:66,markSize:63}};function getLogoDimensions(e){return t[e]||t.m}function getLogoColor(t){if("original"===t)return;const e={light:"#ffffff",dark:"#000000",default:"var(--db-text-primary)",primary:"var(--db-brand-primary)",secondary:"var(--db-text-secondary)",white:"#ffffff"};return e[t]??e.default}function createDesignBaseLogoSvg(t,e,i,r){const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("width",String(t)),n.setAttribute("height",String(e)),n.setAttribute("viewBox","0 0 386 40"),n.setAttribute("fill","none"),n.setAttribute("xmlns","http://www.w3.org/2000/svg"),n.setAttribute("aria-label","DesignBase Logo"),r&&n.setAttribute("class",r);const s=document.createElementNS("http://www.w3.org/2000/svg","g");return s.setAttribute("fill",i||"#000000"),s.innerHTML='\n<polygon points="58.4,23.6 77.3,23.6 77.3,16.2 58.4,16.2 58.4,7.7 79.4,7.7 79.4,0.4 49.5,0.4 49.5,39.6 80,39.6 80,32.3 58.4,32.3"/>\n<path d="M95.6,10.8c0-2.1,2-3.2,5-3.2s8.1,1.6,12.2,4l3.4-7.3c-4.5-2.8-9.6-4.2-14.9-4.2c-9.1,0-15.2,4.5-15.2,11.6 c0,13.9,20.9,9.6,20.9,17c0,2.4-2.2,3.8-5.8,3.8c-4.2,0-9.9-2.3-13.9-5.9l-3.5,7.2c4.9,4,11,6.2,17.3,6.2c8.7,0,15.4-4.1,15.4-11.8 C116.5,13.9,95.6,18,95.6,10.8z"/>\n<rect x="122.7" y="0.4" width="8.8" height="39.2"/>\n<path d="M158.8,7.8c4,0.1,7.8,1.7,10.8,4.4l5-6.3c-4.4-3.7-10-5.7-15.7-5.7c-12.2,0-21.4,8.5-21.4,19.9s9,20,20.9,20 c5.7-0.1,11.2-1.9,15.9-5.1V19.8h-7.6v10.3c-2.4,1.3-5,2-7.7,2.1h-0.4c-6.7-0.1-12.1-5.6-12-12.3v-0.4 C146.7,13,152.2,7.7,158.8,7.8z"/>\n<polygon points="209.1,25.6 190.1,0.4 182,0.4 182,39.6 190.5,39.6 190.5,14.5 209.5,39.6 217.5,39.6 217.5,0.4 209.1,0.4"/>\n<path d="M263.3,18.8c4-0.9,6.9-4.5,6.8-8.6c0-6-5.4-9.8-14-9.8h-24.5v6.5l6.4,1v31.8h18.7c9.1,0,14.8-4.2,14.8-10.9 C271.7,23.8,268.2,19.5,263.3,18.8z M246.9,7.6h8.7c3.4-0.1,5.4,1.5,5.4,4.2s-2,4.4-5.4,4.4h-8.7V7.6z M255.7,32.4h-8.7v-9.3h8.7 c4.1,0,6.7,1.7,6.7,4.5C262.4,30.6,259.8,32.4,255.7,32.4z"/>\n<path d="M290.5,0.4l-17,39.2h9.1l3.1-7.6h18.2l3,7.6h9.5L299.6,0.4H290.5z M288.6,24.9l6.2-15.2l6.2,15.2L288.6,24.9z"/>\n<path d="M328.9,10.8c0-2.1,2-3.2,5-3.2s8.1,1.6,12.2,4l3.4-7.3C345,1.4,339.9,0,334.6,0c-9.1,0-15.2,4.5-15.2,11.6 c0,13.9,20.9,9.6,20.9,17c0,2.4-2.2,3.8-5.8,3.8c-4.1,0-9.9-2.3-13.9-5.9l-3.5,7.2c4.9,4,11,6.2,17.3,6.2c8.7,0,15.4-4.1,15.4-11.8 C349.8,13.9,328.9,18,328.9,10.8z"/>\n<polygon points="364.4,32.3 364.4,23.6 383.3,23.6 383.3,16.2 364.4,16.2 364.4,7.7 385.4,7.7 385.4,0.4 355.5,0.4 355.5,39.6 386,39.6 386,32.3"/>\n<path d="M23.1,0.4H0v6.5l6.5,1v31.8h16.3c12.4,0,21-8.1,21-19.6S35.2,0.4,23.1,0.4z M34.7,20.1c0,7.2-4.8,12.1-11.4,12.1h-8V7.8H23 C29.8,7.8,34.8,12.8,34.7,20.1L34.7,20.1z"/>\n',n.append(s),n}function createDesignBaseLogoMarkSvg(t,e,i){const r=.95*t,n=t,s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.setAttribute("width",String(r)),s.setAttribute("height",String(n)),s.setAttribute("viewBox","0 0 95 100"),s.setAttribute("fill","none"),s.setAttribute("xmlns","http://www.w3.org/2000/svg"),s.setAttribute("aria-label","DesignBase Mark"),i&&s.setAttribute("class",i);const o=document.createElementNS("http://www.w3.org/2000/svg","path");return o.setAttribute("fill",e||"#000000"),o.setAttribute("d","M45,0H0V8l10,2V90L0,92v8H45A50,50,0,0,0,45,0ZM43.12,90H20V10H38.33a15,15,0,0,1,0,30H30.11V50h13a20,20,0,0,1,0,40ZM71.4,80A30,30,0,0,0,55.83,42.83,24.93,24.93,0,0,0,60.27,13,40,40,0,0,1,71.4,80Z"),s.append(o),s}export{createDesignBaseLogoMarkSvg,createDesignBaseLogoSvg,getLogoColor,getLogoDimensions};
@@ -0,0 +1,15 @@
1
+ declare class DbLogo extends HTMLElement {
2
+ static get observedAttributes(): string[];
3
+ connectedCallback(): void;
4
+ attributeChangedCallback(): void;
5
+ private handleClick;
6
+ private renderLogoContent;
7
+ private render;
8
+ }
9
+ declare global {
10
+ interface HTMLElementTagNameMap {
11
+ 'db-logo': DbLogo;
12
+ }
13
+ }
14
+
15
+ export { DbLogo };
@@ -0,0 +1 @@
1
+ import{createDesignBaseLogoSvg as e,createDesignBaseLogoMarkSvg as t,getLogoDimensions as s,getLogoColor as i}from"./db-logo-svg.js";class DbLogo extends HTMLElement{static get observedAttributes(){return["type","text","src","alt","size","variant","clickable","href","target","full-width"]}connectedCallback(){this.render()}attributeChangedCallback(){this.render()}handleClick(e){(this.hasAttribute("clickable")||this.getAttribute("href"))&&(e.preventDefault(),this.dispatchEvent(new CustomEvent("db-click",{bubbles:!0,composed:!0})))}renderLogoContent(n){const a=this.getAttribute("type")||"designbase",o=this.getAttribute("text")||"Logo",r=this.getAttribute("src"),l=this.getAttribute("alt")||o,c=this.getAttribute("size")||"m",d=this.getAttribute("variant")||"original",{width:g,height:b,markSize:h}=s(c),u=i(d);if("designbase"===a){const t=document.createElement("div");return t.className="designbase-wc-logo__svg",t.append(e(g,b,u)),void n.append(t)}if("designbase-mark"===a){const e=document.createElement("div");return e.className="designbase-wc-logo__svg",e.append(t(h,u)),void n.append(e)}if(r){const e=document.createElement("img");return e.className="designbase-wc-logo__image",e.src=r,e.alt=l,void n.append(e)}const m=document.createElement("span");m.className="designbase-wc-logo__text",m.textContent=o,n.append(m)}render(){const e=this.getAttribute("type")||"designbase",t=this.getAttribute("size")||"m",s=this.getAttribute("variant")||"original",i=this.hasAttribute("clickable")||Boolean(this.getAttribute("href")),n=this.hasAttribute("full-width"),a=this.getAttribute("href"),o=this.getAttribute("target")||"_self";this.className="",this.replaceChildren();const r=document.createElement("div");if(r.className=["designbase-wc-logo",`designbase-wc-logo--${t}`,s?`designbase-wc-logo--${s}`:"",i?"designbase-wc-logo--clickable":"",n?"designbase-wc-logo--full-width":"","custom"!==e?"designbase-wc-logo--svg":""].filter(Boolean).join(" "),i&&(r.addEventListener("click",e=>this.handleClick(e)),a||r.setAttribute("role","button"),r.setAttribute("tabindex","0"),r.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),this.handleClick(e))})),this.renderLogoContent(r),a){const e=document.createElement("a");return e.className="designbase-wc-logo__link",e.href=a,e.target=o,"_blank"===o&&(e.rel="noopener noreferrer"),e.append(r),void this.append(e)}this.append(r)}}customElements.get("db-logo")||customElements.define("db-logo",DbLogo);export{DbLogo};
@@ -0,0 +1,20 @@
1
+ declare class DbLottie extends HTMLElement {
2
+ private container?;
3
+ private animation?;
4
+ private loadToken;
5
+ static get observedAttributes(): string[];
6
+ connectedCallback(): void;
7
+ disconnectedCallback(): void;
8
+ attributeChangedCallback(): void;
9
+ private getBool;
10
+ private getSizeStyle;
11
+ private destroyAnimation;
12
+ private renderAnimation;
13
+ }
14
+ declare global {
15
+ interface HTMLElementTagNameMap {
16
+ 'db-lottie': DbLottie;
17
+ }
18
+ }
19
+
20
+ export { DbLottie };
@@ -0,0 +1 @@
1
+ const t="designbase-wc-lottie";class DbLottie extends HTMLElement{constructor(){super(...arguments),this.loadToken=0}static get observedAttributes(){return["src","animation-data","loop","autoplay","speed","width","height","renderer"]}connectedCallback(){this.style.display="inline-block",this.renderAnimation()}disconnectedCallback(){this.destroyAnimation(),this.container?.remove(),this.container=void 0}attributeChangedCallback(){this.isConnected&&this.renderAnimation()}getBool(t,e=!1){if(!this.hasAttribute(t))return e;const i=this.getAttribute(t);return""===i||"true"===i}getSizeStyle(t){if(!t)return;const e=Number(t);return Number.isFinite(e)?`${e}px`:t}destroyAnimation(){this.animation?.destroy(),this.animation=void 0}async renderAnimation(){const e=++this.loadToken;this.destroyAnimation(),this.container?this.container.replaceChildren():(this.container=document.createElement("div"),this.container.className=`${t}__container`,this.appendChild(this.container));const i=this.getSizeStyle(this.getAttribute("width")),n=this.getSizeStyle(this.getAttribute("height"));if(i&&(this.style.width=i),n&&(this.style.height=n),e!==this.loadToken||!this.container)return;const o=this.getBool("loop",!0),s=!this.hasAttribute("autoplay")||this.getBool("autoplay",!0),a=Number(this.getAttribute("speed")||1),r=this.getAttribute("renderer")||"svg";let h;const c=this.getAttribute("animation-data");if(c)try{h=JSON.parse(c)}catch{h=void 0}const d=this.getAttribute("src");if(!h&&!d){const e=document.createElement("div");return e.className=`${t}__fallback`,e.textContent="src 또는 animation-data 속성이 필요합니다.",void this.container.appendChild(e)}const l=await import("lottie-web"),u=l.default??l;e===this.loadToken&&this.container&&(this.animation=u.loadAnimation({container:this.container,renderer:r,loop:o,autoplay:s,...h?{animationData:h}:{path:d}}),Number.isFinite(a)&&a>0&&this.animation.setSpeed(a))}}customElements.get("db-lottie")||customElements.define("db-lottie",DbLottie);export{DbLottie};
@@ -0,0 +1,53 @@
1
+ declare class DbMarkdownEditor extends HTMLElement {
2
+ static get observedAttributes(): string[];
3
+ private built;
4
+ private internalValue;
5
+ private currentMode;
6
+ private isFocused;
7
+ private wordCount;
8
+ private lineCount;
9
+ private lastSaved;
10
+ private isSaving;
11
+ private autoSaveTimer?;
12
+ private textareaEl?;
13
+ private previewEl?;
14
+ private codeViewEl?;
15
+ private editPanelEl?;
16
+ private previewPanelEl?;
17
+ private codePanelEl?;
18
+ private contentEl?;
19
+ private toolbarEl?;
20
+ private statusEl?;
21
+ private wordCountEl?;
22
+ private lineCountEl?;
23
+ private lastSavedEl?;
24
+ private savingEl?;
25
+ connectedCallback(): void;
26
+ disconnectedCallback(): void;
27
+ attributeChangedCallback(name: string): void;
28
+ get value(): string;
29
+ set value(next: string);
30
+ private getBool;
31
+ private syncFromAttributes;
32
+ private updateRootClasses;
33
+ private markdownToHtml;
34
+ private updatePreview;
35
+ private updateCodeView;
36
+ private updateCounts;
37
+ private updateStatus;
38
+ private emitChange;
39
+ private insertText;
40
+ private getDefaultToolbarActions;
41
+ private renderToolbar;
42
+ private renderMode;
43
+ private setupAutoSave;
44
+ private handleKeyDown;
45
+ private build;
46
+ }
47
+ declare global {
48
+ interface HTMLElementTagNameMap {
49
+ 'db-markdown-editor': DbMarkdownEditor;
50
+ }
51
+ }
52
+
53
+ export { DbMarkdownEditor };
@@ -0,0 +1 @@
1
+ import{createDbIcon as t}from"./db-icons.js";const e="designbase-wc-markdown-editor";class DbMarkdownEditor extends HTMLElement{constructor(){super(...arguments),this.built=!1,this.internalValue="",this.currentMode="preview",this.isFocused=!1,this.wordCount=0,this.lineCount=0,this.lastSaved=null,this.isSaving=!1,this.handleKeyDown=t=>{if(this.getBool("disabled")||this.getBool("readonly"))return;const{ctrlKey:e,shiftKey:i,key:s}=t;e&&"b"===s?(t.preventDefault(),this.insertText("**","**","**")):e&&"i"===s?(t.preventDefault(),this.insertText("*","*","*")):e&&"k"===s?(t.preventDefault(),this.insertText("[","](",")")):e&&"`"===s?(t.preventDefault(),this.insertText("`","`","`")):e&&i&&"S"===s?(t.preventDefault(),this.insertText("~~","~~","~~")):"Tab"===s&&(t.preventDefault(),this.insertText(" ","",""))}}static get observedAttributes(){return["size","variant","mode","theme","value","placeholder","min-height","max-height","auto-height","readonly","disabled","show-toolbar","show-status","show-word-count","show-line-count","auto-save","auto-save-interval","file-upload"]}connectedCallback(){this.built||(this.built=!0,this.build()),this.syncFromAttributes(),this.renderMode(),this.updateCounts(),this.updateStatus(),this.setupAutoSave()}disconnectedCallback(){this.autoSaveTimer&&window.clearInterval(this.autoSaveTimer)}attributeChangedCallback(t){if(this.built){if("value"===t&&this.textareaEl)return this.internalValue=this.getAttribute("value")||"",this.textareaEl.value=this.internalValue,this.updatePreview(),this.updateCodeView(),void this.updateCounts();if("mode"===t)return this.currentMode=this.getAttribute("mode")||"preview",void this.renderMode();"auto-save"!==t&&"auto-save-interval"!==t||this.setupAutoSave(),this.updateRootClasses()}}get value(){return this.internalValue}set value(t){this.internalValue=t,this.setAttribute("value",t),this.textareaEl&&(this.textareaEl.value=t),this.updatePreview(),this.updateCodeView(),this.updateCounts()}getBool(t,e=!1){if(!this.hasAttribute(t))return e;const i=this.getAttribute(t);return""===i||"true"===i}syncFromAttributes(){if(this.internalValue=this.getAttribute("value")||"",this.currentMode=this.getAttribute("mode")||"preview",this.textareaEl){this.textareaEl.value=this.internalValue,this.textareaEl.placeholder=this.getAttribute("placeholder")||"마크다운을 입력하세요...",this.textareaEl.readOnly=this.getBool("readonly"),this.textareaEl.disabled=this.getBool("disabled");const t=Number(this.getAttribute("min-height")||200),e=Number(this.getAttribute("max-height")||600),i=this.getBool("auto-height");this.textareaEl.style.minHeight=i?"auto":`${t}px`,this.textareaEl.style.maxHeight=i?"none":`${e}px`}this.updateRootClasses(),this.updatePreview(),this.updateCodeView()}updateRootClasses(){const t=this.getAttribute("size")||"m",i=this.getAttribute("variant")||"default",s=this.getAttribute("theme")||"light";this.className=[e,`${e}--size-${t}`,`${e}--variant-${i}`,`${e}--mode-${this.currentMode}`,`${e}--theme-${s}`,this.isFocused&&`${e}--focused`,this.getBool("disabled")&&`${e}--disabled`,this.getBool("readonly")&&`${e}--readonly`].filter(Boolean).join(" ")}markdownToHtml(t){return t.replace(/^### (.*$)/gim,"<h3>$1</h3>").replace(/^## (.*$)/gim,"<h2>$1</h2>").replace(/^# (.*$)/gim,"<h1>$1</h1>").replace(/\*\*(.*)\*\*/gim,"<strong>$1</strong>").replace(/\*(.*)\*/gim,"<em>$1</em>").replace(/~~(.*)~~/gim,"<del>$1</del>").replace(/`(.*)`/gim,"<code>$1</code>").replace(/\[([^\]]+)\]\(([^)]+)\)/gim,'<a href="$2">$1</a>').replace(/!\[([^\]]*)\]\(([^)]+)\)/gim,'<img alt="$1" src="$2" />').replace(/^> (.*$)/gim,"<blockquote>$1</blockquote>").replace(/^- (.*$)/gim,"<ul><li>$1</li></ul>").replace(/^(\d+)\. (.*$)/gim,"<ol><li>$2</li></ol>").replace(/\n/gim,"<br />")}updatePreview(){this.previewEl&&(this.previewEl.innerHTML=this.markdownToHtml(this.internalValue))}updateCodeView(){if(this.codeViewEl){const t=this.codeViewEl.querySelector("code");t&&(t.textContent=this.internalValue)}}updateCounts(){this.wordCount=this.internalValue.trim()?this.internalValue.trim().split(/\s+/).length:0,this.lineCount=this.internalValue?this.internalValue.split("\n").length:0,this.wordCountEl&&(this.wordCountEl.textContent=`단어: ${this.wordCount}`),this.lineCountEl&&(this.lineCountEl.textContent=`라인: ${this.lineCount}`)}updateStatus(){if(!this.statusEl)return;const t=this.getBool("show-status",!0);this.statusEl.hidden=!t,this.wordCountEl&&(this.wordCountEl.hidden=!this.getBool("show-word-count",!0)),this.lineCountEl&&(this.lineCountEl.hidden=!this.getBool("show-line-count",!0)),this.lastSavedEl&&(this.lastSavedEl.hidden=!this.lastSaved,this.lastSaved&&(this.lastSavedEl.textContent=`저장됨: ${this.lastSaved.toLocaleTimeString()}`)),this.savingEl&&(this.savingEl.hidden=!this.isSaving)}emitChange(){this.dispatchEvent(new CustomEvent("db-change",{detail:{value:this.internalValue},bubbles:!0,composed:!0}))}insertText(t,e="",i=""){if(!this.textareaEl||this.getBool("disabled")||this.getBool("readonly"))return;const{selectionStart:s,selectionEnd:a}=this.textareaEl,l=this.internalValue.substring(s,a),n=e+(l||t)+i,o=this.internalValue.substring(0,s)+n+this.internalValue.substring(a);this.internalValue=o,this.textareaEl.value=o,this.emitChange(),this.updatePreview(),this.updateCodeView(),this.updateCounts();const r=s+e.length+(l?l.length:t.length);window.setTimeout(()=>{this.textareaEl&&(this.textareaEl.setSelectionRange(r,r),this.textareaEl.focus())},0)}getDefaultToolbarActions(){return[{id:"bold",label:"B",tooltip:"굵게 (Ctrl+B)",shortcut:"Ctrl+B",action:()=>this.insertText("**","**","**")},{id:"italic",label:"I",tooltip:"기울임 (Ctrl+I)",shortcut:"Ctrl+I",action:()=>this.insertText("*","*","*")},{id:"strikethrough",label:"S",tooltip:"취소선 (Ctrl+Shift+S)",shortcut:"Ctrl+Shift+S",action:()=>this.insertText("~~","~~","~~")},{id:"separator1",label:"|",separator:!0,action:()=>{}},{id:"heading1",label:"H1",tooltip:"제목 1",action:()=>this.insertText("# ","","")},{id:"heading2",label:"H2",tooltip:"제목 2",action:()=>this.insertText("## ","","")},{id:"heading3",label:"H3",tooltip:"제목 3",action:()=>this.insertText("### ","","")},{id:"separator2",label:"|",separator:!0,action:()=>{}},{id:"link",label:"",icon:"share-alt",tooltip:"링크 (Ctrl+K)",shortcut:"Ctrl+K",action:()=>this.insertText("[","](",")")},{id:"image",label:"",icon:"video",tooltip:"이미지",action:()=>this.insertText("![","](",")")},{id:"code",label:"",icon:"code",tooltip:"인라인 코드 (Ctrl+`)",shortcut:"Ctrl+`",action:()=>this.insertText("`","`","`")},{id:"codeBlock",label:"```",tooltip:"코드 블록",action:()=>this.insertText("\n```\n","","\n```\n")},{id:"separator3",label:"|",separator:!0,action:()=>{}},{id:"list",label:"•",tooltip:"순서 없는 목록",action:()=>this.insertText("- ","","")},{id:"orderedList",label:"1.",tooltip:"순서 있는 목록",action:()=>this.insertText("1. ","","")},{id:"quote",label:'"',tooltip:"인용구",action:()=>this.insertText("> ","","")},{id:"separator4",label:"|",separator:!0,action:()=>{}},{id:"table",label:"⊞",tooltip:"테이블",action:()=>this.insertText("\n| 헤더1 | 헤더2 | 헤더3 |\n|-------|-------|-------|\n| 셀1 | 셀2 | 셀3 |\n","","")},{id:"horizontalRule",label:"—",tooltip:"수평선",action:()=>this.insertText("\n---\n","","")}]}renderToolbar(){if(!this.toolbarEl)return;const i=this.getBool("show-toolbar",!0);this.toolbarEl.hidden=!i,this.toolbarEl.replaceChildren();const s=document.createElement("div");s.className=`${e}__mode-buttons`;[{mode:"edit",icon:"write",title:"편집 모드"},{mode:"preview",icon:"show",title:"미리보기 모드"},{mode:"split",icon:"hide",title:"분할 모드"},{mode:"code",icon:"code",title:"코드 보기"}].forEach(({mode:i,icon:a,title:l})=>{const n=document.createElement("button");n.type="button",n.className=`${e}__mode-button${this.currentMode===i?` ${e}__mode-button--active`:""}`,n.title=l,n.append(t(a,16)),n.addEventListener("click",()=>{this.currentMode=i,this.updateRootClasses(),this.renderMode(),this.renderToolbar()}),s.append(n)}),this.toolbarEl.append(s);const a=document.createElement("div");if(a.className=`${e}__toolbar-separator`,this.toolbarEl.append(a),"code"!==this.currentMode&&(this.getDefaultToolbarActions().forEach(i=>{const s=document.createElement("button");if(s.type="button",s.className=`${e}__toolbar-item`,s.disabled=this.getBool("disabled"),i.tooltip&&(s.title=i.tooltip),i.icon)s.append(t(i.icon,16));else if("bold"===i.id){const t=document.createElement("strong");t.textContent=i.label,s.append(t)}else if("italic"===i.id){const t=document.createElement("em");t.textContent=i.label,s.append(t)}else if("strikethrough"===i.id){const t=document.createElement("span");t.style.textDecoration="line-through",t.textContent=i.label,s.append(t)}else s.textContent=i.label;if(i.shortcut){const t=document.createElement("span");t.className=`${e}__toolbar-shortcut`,t.textContent=i.shortcut,s.append(t)}s.addEventListener("click",i.action),this.toolbarEl?.append(s)}),this.getBool("file-upload"))){const i=document.createElement("label");i.className=`${e}__file-upload`;const s=document.createElement("input");s.type="file",s.accept="image/*",s.hidden=!0,s.addEventListener("change",async()=>{const t=s.files?.[0];if(!t)return;const e=new CustomEvent("db-file-upload",{detail:{file:t},bubbles:!0,composed:!0,cancelable:!0});if(this.dispatchEvent(e),!e.defaultPrevented){const e=URL.createObjectURL(t);this.insertText(`![${t.name}](${e})`)}s.value=""}),i.append(s,t("upload",16)),this.toolbarEl.append(i)}}renderMode(){if(!this.editPanelEl||!this.previewPanelEl||!this.codePanelEl)return;const t="edit"===this.currentMode||"split"===this.currentMode,e="preview"===this.currentMode||"split"===this.currentMode,i="code"===this.currentMode;this.editPanelEl.hidden=!t,this.previewPanelEl.hidden=!e,this.codePanelEl.hidden=!i,this.updateRootClasses(),this.renderToolbar()}setupAutoSave(){if(this.autoSaveTimer&&window.clearInterval(this.autoSaveTimer),!this.getBool("auto-save"))return;const t=Number(this.getAttribute("auto-save-interval")||3e4);this.autoSaveTimer=window.setInterval(()=>{const t=this.getAttribute("value")||"";this.internalValue&&this.internalValue!==t&&(this.isSaving=!0,this.updateStatus(),this.dispatchEvent(new CustomEvent("db-save",{detail:{value:this.internalValue},bubbles:!0,composed:!0})),this.isSaving=!1,this.lastSaved=new Date,this.updateStatus())},t)}build(){this.toolbarEl=document.createElement("div"),this.toolbarEl.className=`${e}__toolbar`,this.contentEl=document.createElement("div"),this.contentEl.className=`${e}__content`,this.editPanelEl=document.createElement("div"),this.editPanelEl.className=`${e}__edit-panel`,this.textareaEl=document.createElement("textarea"),this.textareaEl.className=`${e}__textarea`,this.textareaEl.addEventListener("input",()=>{this.internalValue=this.textareaEl?.value||"",this.emitChange(),this.updatePreview(),this.updateCodeView(),this.updateCounts()}),this.textareaEl.addEventListener("focus",()=>{this.isFocused=!0,this.updateRootClasses(),this.dispatchEvent(new CustomEvent("db-focus",{bubbles:!0,composed:!0}))}),this.textareaEl.addEventListener("blur",()=>{this.isFocused=!1,this.updateRootClasses(),this.dispatchEvent(new CustomEvent("db-blur",{bubbles:!0,composed:!0}))}),this.textareaEl.addEventListener("keydown",this.handleKeyDown),this.editPanelEl.append(this.textareaEl),this.previewPanelEl=document.createElement("div"),this.previewPanelEl.className=`${e}__preview-panel`,this.previewEl=document.createElement("div"),this.previewEl.className=`${e}__preview`,this.previewPanelEl.append(this.previewEl),this.codePanelEl=document.createElement("div"),this.codePanelEl.className=`${e}__code-panel`,this.codeViewEl=document.createElement("pre"),this.codeViewEl.className=`${e}__code-view`;const t=document.createElement("code");this.codeViewEl.append(t),this.codePanelEl.append(this.codeViewEl),this.contentEl.append(this.editPanelEl,this.previewPanelEl,this.codePanelEl),this.statusEl=document.createElement("div"),this.statusEl.className=`${e}__status`,this.wordCountEl=document.createElement("span"),this.wordCountEl.className=`${e}__word-count`,this.lineCountEl=document.createElement("span"),this.lineCountEl.className=`${e}__line-count`,this.lastSavedEl=document.createElement("span"),this.lastSavedEl.className=`${e}__last-saved`,this.savingEl=document.createElement("span"),this.savingEl.className=`${e}__saving`,this.savingEl.textContent="저장 중...",this.statusEl.append(this.wordCountEl,this.lineCountEl,this.lastSavedEl,this.savingEl),this.append(this.toolbarEl,this.contentEl,this.statusEl)}}customElements.get("db-markdown-editor")||customElements.define("db-markdown-editor",DbMarkdownEditor);export{DbMarkdownEditor};
@@ -0,0 +1,34 @@
1
+ declare class DbMarquee extends HTMLElement {
2
+ static get observedAttributes(): string[];
3
+ private built;
4
+ private containerEl?;
5
+ private trackEl?;
6
+ private baseGroupEl?;
7
+ private srOnlyEl?;
8
+ private resizeObserver?;
9
+ private containerWidth;
10
+ private baseGroupWidth;
11
+ private boundMeasure;
12
+ connectedCallback(): void;
13
+ disconnectedCallback(): void;
14
+ attributeChangedCallback(): void;
15
+ private getBool;
16
+ private parseItems;
17
+ private build;
18
+ private bindResize;
19
+ private measure;
20
+ private unbindImageListeners;
21
+ private bindImageListeners;
22
+ private renderItem;
23
+ private renderGroup;
24
+ private renderDuplicates;
25
+ private syncReadyState;
26
+ private updateUI;
27
+ }
28
+ declare global {
29
+ interface HTMLElementTagNameMap {
30
+ 'db-marquee': DbMarquee;
31
+ }
32
+ }
33
+
34
+ export { DbMarquee };
@@ -0,0 +1 @@
1
+ const e="designbase-wc-marquee";class DbMarquee extends HTMLElement{constructor(){super(...arguments),this.built=!1,this.containerWidth=0,this.baseGroupWidth=0,this.boundMeasure=()=>this.measure()}static get observedAttributes(){return["items","direction","duration","speed","size","variant","bordered","pause-on-hover","fade-edges","fade-width","edge-padding","gap","align-y","aria-label"]}connectedCallback(){this.style.display="block",this.built||(this.built=!0,this.build(),this.bindResize()),this.updateUI()}disconnectedCallback(){this.resizeObserver?.disconnect(),this.unbindImageListeners()}attributeChangedCallback(){this.built&&this.updateUI()}getBool(e,t=!1){if(!this.hasAttribute(e))return t;const i=this.getAttribute(e);return""===i||"true"===i}parseItems(){try{const e=this.getAttribute("items"),t=e?JSON.parse(e):[];if(Array.isArray(t)&&t.length>0)return t}catch{}const e=Array.from(this.children).filter(e=>!e.hasAttribute("data-wc-internal"));return e.length>0?e.map(e=>e.textContent?.trim()||""):[]}build(){this.containerEl=document.createElement("div"),this.srOnlyEl=document.createElement("span"),this.srOnlyEl.className=`${e}__sr-only`,this.trackEl=document.createElement("div"),this.trackEl.className=`${e}__track`,this.baseGroupEl=document.createElement("div"),this.baseGroupEl.className=`${e}__group`,this.baseGroupEl.setAttribute("aria-hidden","true"),this.trackEl.append(this.baseGroupEl),this.containerEl.append(this.srOnlyEl,this.trackEl),this.append(this.containerEl)}bindResize(){this.resizeObserver=new ResizeObserver(()=>this.measure()),this.containerEl&&this.resizeObserver.observe(this.containerEl),this.baseGroupEl&&this.resizeObserver.observe(this.baseGroupEl)}measure(){this.containerWidth=Math.ceil(this.containerEl?.clientWidth??0),this.baseGroupWidth=Math.ceil(this.baseGroupEl?.scrollWidth??0),this.renderDuplicates(),this.bindImageListeners(),this.syncReadyState()}unbindImageListeners(){this.baseGroupEl&&this.baseGroupEl.querySelectorAll("img").forEach(e=>{e.removeEventListener("load",this.boundMeasure),e.removeEventListener("error",this.boundMeasure)})}bindImageListeners(){this.baseGroupEl&&(this.unbindImageListeners(),this.baseGroupEl.querySelectorAll("img").forEach(e=>{e.complete||(e.addEventListener("load",this.boundMeasure),e.addEventListener("error",this.boundMeasure))}))}renderItem(t){const i=document.createElement("div");return i.className=`${e}__item`,i.textContent=t,i}renderGroup(t,i){const s=i??document.createElement("div");return s.className=`${e}__group`,s.setAttribute("aria-hidden","true"),s.replaceChildren(...t.map(e=>this.renderItem(e))),s}renderDuplicates(){if(!this.trackEl||!this.baseGroupEl)return;const e=this.parseItems();this.renderGroup(e,this.baseGroupEl);const t=this.baseGroupWidth>0?Math.max(1,Math.ceil(this.containerWidth/this.baseGroupWidth)):1,i=[];for(let s=0;s<t;s+=1)i.push(this.renderGroup(e));this.trackEl.replaceChildren(this.baseGroupEl,...i)}syncReadyState(){this.containerEl&&this.containerEl.classList.toggle(`${e}--ready`,this.baseGroupWidth>0)}updateUI(){const t=this.parseItems();if(0===t.length)return void(this.hidden=!0);this.hidden=!1;const i=this.getAttribute("direction")||"left",s=Math.max(Number(this.getAttribute("duration")||20),1),r=Number(this.getAttribute("speed")||1),a=s/(Number.isFinite(r)&&r>0?r:1),n=this.getAttribute("size")||"m",h=this.getAttribute("variant")||"default",l=this.getAttribute("align-y")||"center",o=this.getBool("fade-edges"),d=Math.max(Number(this.getAttribute("fade-width")||48),0),u=this.getAttribute("edge-padding"),c=null!==u&&""!==u?Math.max(Number(u),0):o?d:0,b=Math.max(Number(this.getAttribute("gap")||24),0),p=this.getBool("pause-on-hover",!0),m=this.hasAttribute("bordered")?this.getBool("bordered"):"outlined"===h,E=this.getAttribute("aria-label")||"Scrolling content";this.containerEl&&(this.containerEl.className=[e,`${e}--size-${n}`,`${e}--variant-${h}`,`${e}--align-${l}`,p&&`${e}--pause-on-hover`,o&&`${e}--fade-edges`,"right"===i&&`${e}--right`,m&&`${e}--bordered`].filter(Boolean).join(" "),this.containerEl.style.setProperty("--db-marquee-duration",`${a}s`),this.containerEl.style.setProperty("--db-marquee-shift",`${this.baseGroupWidth+b}px`),this.containerEl.style.setProperty("--db-marquee-gap",`${b}px`),this.containerEl.style.setProperty("--db-marquee-fade-width",`${d}px`),this.containerEl.style.setProperty("--db-marquee-edge-padding",`${c}px`),this.containerEl.setAttribute("role","region"),this.containerEl.setAttribute("aria-label",E)),this.srOnlyEl&&(this.srOnlyEl.textContent=t.join(" • ")||E),this.renderDuplicates(),this.measure()}}customElements.get("db-marquee")||customElements.define("db-marquee",DbMarquee);export{DbMarquee};
@@ -0,0 +1,24 @@
1
+ type DbMasonryItem = {
2
+ id?: string;
3
+ src: string;
4
+ alt?: string;
5
+ title?: string;
6
+ description?: string;
7
+ thumbnail?: string;
8
+ };
9
+ declare class DbMasonry extends HTMLElement {
10
+ static get observedAttributes(): string[];
11
+ connectedCallback(): void;
12
+ attributeChangedCallback(): void;
13
+ get images(): DbMasonryItem[];
14
+ set images(value: DbMasonryItem[] | string);
15
+ private boolAttr;
16
+ private render;
17
+ }
18
+ declare global {
19
+ interface HTMLElementTagNameMap {
20
+ 'db-masonry': DbMasonry;
21
+ }
22
+ }
23
+
24
+ export { DbMasonry };
@@ -0,0 +1 @@
1
+ const e=[1,2,3,4,5,6],t=["xs","s","m","l","xl"];class DbMasonry extends HTMLElement{static get observedAttributes(){return["images","columns","spacing","hover","clickable"]}connectedCallback(){this.render()}attributeChangedCallback(){this.render()}get images(){try{const e=JSON.parse(this.getAttribute("images")||"[]");return Array.isArray(e)?e.filter(e=>e&&"string"==typeof e.src):[]}catch{return[]}}set images(e){this.setAttribute("images","string"==typeof e?e:JSON.stringify(e))}boolAttr(e,t=!0){if(!this.hasAttribute(e))return t;const s=this.getAttribute(e);return""===s||"true"===s}render(){const s=Number(this.getAttribute("columns")||3),n=e.includes(s)?s:3,a=this.getAttribute("spacing")||"m",i=t.includes(a)?a:"m",r=this.boolAttr("hover",!0),c=this.boolAttr("clickable",!0);this.className=["designbase-wc-masonry",`designbase-wc-masonry--columns-${n}`,`designbase-wc-masonry--spacing-${i}`,r&&"designbase-wc-masonry--hover",c&&"designbase-wc-masonry--clickable"].filter(Boolean).join(" ");const o=Array.from({length:n},()=>[]),m=new Array(n).fill(0);this.images.forEach(e=>{const t=m.indexOf(Math.min(...m));o[t].push(e),m[t]+=1});const d=document.createDocumentFragment();o.forEach(e=>{const t=document.createElement("div");t.className="designbase-wc-masonry__column",e.forEach(e=>{const s=this.images.indexOf(e),n=document.createElement("figure");n.className="designbase-wc-masonry__item";const a=document.createElement("img");if(a.className="designbase-wc-masonry__image",a.src=e.thumbnail||e.src,a.alt=e.alt||e.title||`image-${s+1}`,a.loading="lazy",a.addEventListener("load",()=>{this.dispatchEvent(new CustomEvent("db-image-load",{detail:{image:e,index:s},bubbles:!0,composed:!0}))}),a.addEventListener("error",()=>{this.dispatchEvent(new CustomEvent("db-image-error",{detail:{image:e,index:s},bubbles:!0,composed:!0}))}),n.append(a),e.title||e.description){const t=document.createElement("figcaption");if(t.className="designbase-wc-masonry__overlay",e.title){const s=document.createElement("h3");s.className="designbase-wc-masonry__title",s.textContent=e.title,t.append(s)}if(e.description){const s=document.createElement("p");s.className="designbase-wc-masonry__description",s.textContent=e.description,t.append(s)}n.append(t)}c&&(n.tabIndex=0,n.addEventListener("click",()=>{this.dispatchEvent(new CustomEvent("db-image-click",{detail:{image:e,index:s},bubbles:!0,composed:!0}))})),t.append(n)}),d.append(t)}),this.replaceChildren(d)}}customElements.get("db-masonry")||customElements.define("db-masonry",DbMasonry);export{DbMasonry};
@@ -0,0 +1,30 @@
1
+ interface DbMenuItemChildData {
2
+ id: string;
3
+ label: string;
4
+ href?: string;
5
+ icon?: string;
6
+ active?: boolean;
7
+ disabled?: boolean;
8
+ badge?: string | number;
9
+ badgeColor?: string;
10
+ variant?: string;
11
+ }
12
+ declare class DbMenuItem extends HTMLElement {
13
+ static get observedAttributes(): string[];
14
+ get subItems(): DbMenuItemChildData[];
15
+ set subItems(value: DbMenuItemChildData[] | string);
16
+ get expanded(): boolean;
17
+ set expanded(value: boolean);
18
+ connectedCallback(): void;
19
+ attributeChangedCallback(): void;
20
+ private iconSize;
21
+ private render;
22
+ }
23
+ declare global {
24
+ interface HTMLElementTagNameMap {
25
+ 'db-menu-item': DbMenuItem;
26
+ }
27
+ }
28
+
29
+ export { DbMenuItem };
30
+ export type { DbMenuItemChildData };
@@ -0,0 +1 @@
1
+ import{createDbIcon as e}from"./db-icons.js";class DbMenuItem extends HTMLElement{static get observedAttributes(){return["label","href","icon","active","disabled","badge","badge-color","size","variant","type","menu-style","expanded","expandable","sub-items","depth"]}get subItems(){try{return JSON.parse(this.getAttribute("sub-items")||"[]")}catch{return[]}}set subItems(e){this.setAttribute("sub-items","string"==typeof e?e:JSON.stringify(e))}get expanded(){return this.hasAttribute("expanded")}set expanded(e){this.toggleAttribute("expanded",e)}connectedCallback(){this.render()}attributeChangedCallback(){this.isConnected&&this.render()}iconSize(e){return"s"===e?16:"l"===e?24:20}render(){const t=this.getAttribute("label")||"",i=this.getAttribute("href")||"",n=this.getAttribute("icon"),s=this.getAttribute("size")||"m",a=this.getAttribute("variant")||"default",d=this.getAttribute("type")||"block",b=this.getAttribute("menu-style")||"accordion",c=Number(this.getAttribute("depth")||0),r=this.hasAttribute("active"),m=this.hasAttribute("disabled"),u=this.getAttribute("badge")||"",l=this.getAttribute("badge-color")||"primary",o=this.subItems,h=o.length>0,g=this.hasAttribute("expandable")||h,p=this.expanded,A=this.iconSize(s);this.className=["designbase-wc-menu-item",`designbase-wc-menu-item--${d}`,`designbase-wc-menu-item--${s}`,`designbase-wc-menu-item--${a}`,`designbase-wc-menu-item--${b}`,`designbase-wc-menu-item--depth-${c}`,r&&"designbase-wc-menu-item--active",m&&"designbase-wc-menu-item--disabled",g&&"designbase-wc-menu-item--expandable",p&&"designbase-wc-menu-item--expanded",h&&"designbase-wc-menu-item--with-children",u&&"designbase-wc-menu-item--with-badge",n&&"designbase-wc-menu-item--with-icon"].filter(Boolean).join(" "),this.replaceChildren();const w=document.createElement("div");if(w.className=["designbase-wc-menu-item__content","designbase-wc-menu-item__content--clickable"].join(" "),n){const t=document.createElement("div");t.className=["designbase-wc-menu-item__icon",`designbase-wc-menu-item__icon--${a}`,r&&"designbase-wc-menu-item__icon--active",m&&"designbase-wc-menu-item__icon--disabled"].filter(Boolean).join(" "),t.append(e(n,A)),w.append(t)}const v=document.createElement("span");if(v.className="designbase-wc-menu-item__label",v.textContent=t,w.append(v),u){const e=document.createElement("db-badge");e.setAttribute("size","s"),e.setAttribute("variant",l),e.setAttribute("badge-style","number"),e.setAttribute("count",u),w.append(e)}if(h){const t=document.createElement("div");t.className="designbase-wc-menu-item__expand-icon",t.append(e(p?"chevron-up":"chevron-down",16)),w.append(t)}if(w.addEventListener("click",e=>{m||(h&&g?(e.preventDefault(),this.expanded=!this.expanded):i&&(window.location.href=i),this.dispatchEvent(new CustomEvent("db-click",{detail:{label:t,href:i,expanded:this.expanded},bubbles:!0,composed:!0})))}),this.append(w),h&&p){const e=document.createElement("div");e.className=`designbase-wc-menu-item__children designbase-wc-menu-item__children--${b}`,o.forEach(t=>{const i=document.createElement("db-menu-item");i.setAttribute("label",t.label),i.setAttribute("type","block"),i.setAttribute("menu-style",b),i.setAttribute("size",s),i.setAttribute("depth",String(c+1)),t.href&&i.setAttribute("href",t.href),t.icon&&i.setAttribute("icon",t.icon),t.active&&i.setAttribute("active",""),t.disabled&&i.setAttribute("disabled",""),void 0!==t.badge&&i.setAttribute("badge",String(t.badge)),t.badgeColor&&i.setAttribute("badge-color",t.badgeColor),t.variant&&i.setAttribute("variant",t.variant),i.addEventListener("db-click",e=>{e.stopPropagation(),t.disabled||this.dispatchEvent(new CustomEvent("db-child-click",{detail:{child:t},bubbles:!0,composed:!0}))}),e.append(i)}),this.append(e)}}}customElements.get("db-menu-item")||customElements.define("db-menu-item",DbMenuItem);export{DbMenuItem};
@@ -0,0 +1,63 @@
1
+ declare class DbModal extends HTMLElement {
2
+ static get observedAttributes(): string[];
3
+ private root?;
4
+ private panel?;
5
+ private headerEl?;
6
+ private headerContentEl?;
7
+ private titleEl?;
8
+ private closeButton?;
9
+ private navEl?;
10
+ private tabsEl?;
11
+ private segmentEl?;
12
+ private contentEl?;
13
+ private titleId;
14
+ private isMounted;
15
+ private internalTabId;
16
+ private internalSegment;
17
+ get open(): boolean;
18
+ set open(value: boolean);
19
+ private childObserver?;
20
+ connectedCallback(): void;
21
+ disconnectedCallback(): void;
22
+ attributeChangedCallback(name: string): void;
23
+ private resolvedSize;
24
+ get size(): string;
25
+ set size(value: string);
26
+ private resolvedHeaderVariant;
27
+ private parsedTabs;
28
+ private parsedSegments;
29
+ private usesIntegratedNav;
30
+ private closeIconSize;
31
+ private activeTabId;
32
+ private activeSegmentValue;
33
+ private collectUserChildren;
34
+ private classifyChildren;
35
+ private getClassifiedChildren;
36
+ private isBodyPart;
37
+ private isFooterPart;
38
+ private collectContentParts;
39
+ private placeContentParts;
40
+ private restorePartsToHost;
41
+ private bindFooterActions;
42
+ private ensureStructure;
43
+ private renderCloseButton;
44
+ private renderDefaultHeader;
45
+ private renderNavHeader;
46
+ private renderHeader;
47
+ private renderBodyContent;
48
+ private renderFooter;
49
+ private render;
50
+ private exitTimerId;
51
+ private syncVisibility;
52
+ private syncOpenState;
53
+ private teardown;
54
+ private close;
55
+ private handleDocumentKeyDown;
56
+ }
57
+ declare global {
58
+ interface HTMLElementTagNameMap {
59
+ 'db-modal': DbModal;
60
+ }
61
+ }
62
+
63
+ export { DbModal };
@@ -0,0 +1 @@
1
+ import{createDbIcon as t}from"./db-icons.js";const e=["s","m","l","xl","full"],s=["default","tabs","segment"],i=["s","m","l"];class DbModal extends HTMLElement{constructor(){super(...arguments),this.titleId=`db-modal-title-${Math.random().toString(36).slice(2,9)}`,this.isMounted=!1,this.internalTabId="",this.internalSegment="",this.exitTimerId=null,this.handleDocumentKeyDown=t=>{"Escape"===t.key&&this.open&&"false"!==this.getAttribute("close-on-escape")&&(t.preventDefault(),this.close())}}static get observedAttributes(){return["open","title","size","header-variant","tabs","segments","selected-tab-id","default-selected-tab-id","segment-value","default-segment-value","nav-size","segment-full-width","close-on-outside-click","close-on-escape","show-close-button"]}get open(){return this.hasAttribute("open")&&"false"!==this.getAttribute("open")}set open(t){t?this.setAttribute("open","true"):this.removeAttribute("open")}connectedCallback(){this.classList.add("designbase-wc-modal-host"),document.addEventListener("keydown",this.handleDocumentKeyDown),this.childObserver=new MutationObserver(()=>{this.open&&this.render()}),this.childObserver.observe(this,{childList:!0}),this.syncOpenState()}disconnectedCallback(){this.childObserver?.disconnect(),document.removeEventListener("keydown",this.handleDocumentKeyDown),this.exitTimerId&&clearTimeout(this.exitTimerId),this.teardown()}attributeChangedCallback(t){if(this.isConnected)if("open"!==t){if("selected-tab-id"===t||"segment-value"===t){const t=this.getClassifiedChildren();return this.renderBodyContent(t.body),void this.renderHeader(t.header)}this.render(),this.isMounted&&this.syncVisibility()}else this.syncOpenState()}resolvedSize(){return e.includes(this.size)?this.size:"m"}get size(){return this.getAttribute("size")||"m"}set size(t){t?this.setAttribute("size",t):this.removeAttribute("size")}resolvedHeaderVariant(){const t=this.getAttribute("header-variant")||"default";return s.includes(t)?t:"default"}parsedTabs(){const t=this.getAttribute("tabs");if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}parsedSegments(){const t=this.getAttribute("segments");if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}usesIntegratedNav(){const t=this.resolvedHeaderVariant();return"tabs"===t&&this.parsedTabs().length>0||"segment"===t&&this.parsedSegments().length>0}closeIconSize(){const t=this.resolvedSize();return"s"===t?16:"l"===t?20:"xl"===t?24:18}activeTabId(){return this.getAttribute("selected-tab-id")||this.internalTabId||this.getAttribute("default-selected-tab-id")||this.parsedTabs()[0]?.id||""}activeSegmentValue(){return this.getAttribute("segment-value")||this.internalSegment||this.getAttribute("default-segment-value")||this.parsedSegments()[0]?.value||""}collectUserChildren(){return Array.from(this.children).filter(t=>!t.hasAttribute("data-wc-internal"))}classifyChildren(t){const isPart=(t,e,s)=>t.classList.contains(s)||t.getAttribute("data-modal-part")===e,e=t.filter(t=>isPart(t,"header","designbase-wc-modal__header")),s=t.filter(t=>isPart(t,"footer","designbase-wc-modal__footer")||"footer"===t.getAttribute("slot")),i=t.filter(t=>isPart(t,"body","designbase-wc-modal__body")),n=t.filter(t=>!e.includes(t)&&!s.includes(t)&&!i.includes(t));return{header:e,body:[...i,...n],footer:s}}getClassifiedChildren(){const t=this.classifyChildren(this.collectUserChildren());if(t.header.length||t.body.length||t.footer.length)return t;return{header:Array.from(this.headerEl?.children||[]).filter(t=>t!==this.closeButton&&!t.classList.contains("designbase-wc-modal__header-row")&&("header"===t.getAttribute("data-modal-part")||t.classList.contains("designbase-wc-modal__header"))),body:this.collectContentParts("body"),footer:this.collectContentParts("footer")}}isBodyPart(t){return t.classList.contains("designbase-wc-modal__body")||"body"===t.getAttribute("data-modal-part")}isFooterPart(t){return t.classList.contains("designbase-wc-modal__footer")||"footer"===t.getAttribute("data-modal-part")||"footer"===t.getAttribute("slot")}collectContentParts(t){if(!this.contentEl)return[];const e=Array.from(this.contentEl.children).filter(e=>"body"===t?this.isBodyPart(e):this.isFooterPart(e));return e.length>0?e:Array.from(this.children).filter(e=>"body"===t?this.isBodyPart(e):this.isFooterPart(e))}placeContentParts(t,e){this.contentEl&&e.forEach(e=>{if(e.parentElement!==this.contentEl){if("body"===t){const t=this.contentEl.querySelector(':scope > .designbase-wc-modal__footer, :scope > [data-modal-part="footer"]')||null;return void this.contentEl.insertBefore(e,t)}this.contentEl.append(e)}})}restorePartsToHost(){this.contentEl&&Array.from(this.contentEl.children).filter(t=>!t.classList.contains("designbase-wc-modal__integrated-content")&&!t.hasAttribute("data-wc-internal")).forEach(t=>{t.parentElement!==this&&this.append(t)})}bindFooterActions(){if(!this.contentEl||"true"===this.contentEl.dataset.modalActionsBound)return;this.contentEl.dataset.modalActionsBound="true";const handleClose=t=>{const e=t.target?.closest("[data-modal-close]");e&&this.contentEl?.contains(e)&&this.close()};this.contentEl.addEventListener("click",handleClose),this.contentEl.addEventListener("db-click",handleClose)}ensureStructure(){this.root||(this.root=document.createElement("div"),this.root.className="designbase-wc-modal__overlay",this.root.setAttribute("data-wc-internal",""),this.root.addEventListener("click",t=>{t.target===this.root&&"false"!==this.getAttribute("close-on-outside-click")&&this.close()}),this.panel=document.createElement("div"),this.panel.className="designbase-wc-modal",this.panel.setAttribute("role","dialog"),this.panel.setAttribute("aria-modal","true"),this.panel.addEventListener("click",t=>t.stopPropagation()),this.headerEl=document.createElement("div"),this.headerEl.className="designbase-wc-modal__header",this.headerContentEl=document.createElement("div"),this.headerContentEl.className="designbase-wc-modal__header-content",this.titleEl=document.createElement("h2"),this.titleEl.className="designbase-wc-modal__title",this.titleEl.id=this.titleId,this.closeButton=document.createElement("button"),this.closeButton.type="button",this.closeButton.className="designbase-wc-modal__close-button",this.closeButton.setAttribute("aria-label","모달 닫기"),this.closeButton.addEventListener("click",()=>this.close()),this.navEl=document.createElement("div"),this.navEl.className="designbase-wc-modal__header-nav",this.contentEl=document.createElement("div"),this.contentEl.className="designbase-wc-modal__content",this.panel.append(this.headerEl,this.contentEl),this.root.append(this.panel))}renderCloseButton(){if(!this.closeButton)return;const e=this.closeIconSize();this.closeButton.replaceChildren(t("close",e)),this.closeButton.hidden="false"===this.getAttribute("show-close-button")}renderDefaultHeader(t){if(!(this.headerEl&&this.headerContentEl&&this.titleEl&&this.closeButton))return;if(this.headerEl.className="designbase-wc-modal__header",this.headerEl.replaceChildren(),t.length>0)return t.forEach(t=>this.headerEl.append(t)),void("false"!==this.getAttribute("show-close-button")&&this.headerEl.append(this.closeButton));const e=this.getAttribute("title")||"";this.titleEl.textContent=e,this.titleEl.hidden=!e,this.headerContentEl.replaceChildren(),e&&this.headerContentEl.append(this.titleEl),this.renderCloseButton(),this.headerEl.append(this.headerContentEl),"false"!==this.getAttribute("show-close-button")&&this.headerEl.append(this.closeButton),this.panel&&(e?this.panel.setAttribute("aria-labelledby",this.titleId):this.panel.removeAttribute("aria-labelledby"))}renderNavHeader(){if(!(this.headerEl&&this.headerContentEl&&this.titleEl&&this.closeButton&&this.navEl))return;const t=this.resolvedHeaderVariant(),e=this.parsedTabs(),s=this.parsedSegments(),n=i.includes(this.getAttribute("nav-size")||"m")?this.getAttribute("nav-size")||"m":"s";this.headerEl.className=["designbase-wc-modal__header","tabs"===t&&"designbase-wc-modal__header--tabs","segment"===t&&"designbase-wc-modal__header--segment"].filter(Boolean).join(" ");const a=this.getAttribute("title")||"";this.titleEl.textContent=a,this.titleEl.hidden=!a,this.headerContentEl.replaceChildren(),a&&this.headerContentEl.append(this.titleEl),this.renderCloseButton();const r=document.createElement("div");if(r.className="designbase-wc-modal__header-row",r.append(this.headerContentEl),"false"!==this.getAttribute("show-close-button")&&r.append(this.closeButton),this.headerEl.replaceChildren(r),this.navEl.replaceChildren(),"tabs"===t&&e.length>0){const t=document.createElement("db-tabs");t.setAttribute("size",n),t.setAttribute("items",JSON.stringify(e.map(t=>({id:t.id,label:t.label,disabled:t.disabled})))),t.setAttribute("selected-id",this.activeTabId()),t.addEventListener("db-change",t=>{const e=t.detail?.id;e&&(this.hasAttribute("selected-tab-id")||(this.internalTabId=e),this.dispatchEvent(new CustomEvent("db-tab-change",{detail:{tabId:e},bubbles:!0,composed:!0})),this.renderBodyContent(this.getClassifiedChildren().body))}),this.tabsEl=t,this.navEl.append(t),this.headerEl.append(this.navEl)}if("segment"===t&&s.length>0){const t=document.createElement("db-segment-control");t.setAttribute("size",n),t.setAttribute("options",JSON.stringify(s.map(t=>({value:t.value,label:t.label,disabled:t.disabled})))),t.setAttribute("value",this.activeSegmentValue()),"false"!==this.getAttribute("segment-full-width")&&t.setAttribute("full-width",""),t.addEventListener("db-change",t=>{const e=t.detail?.value;e&&(this.hasAttribute("segment-value")||(this.internalSegment=e),this.dispatchEvent(new CustomEvent("db-segment-change",{detail:{value:e},bubbles:!0,composed:!0})),this.renderBodyContent(this.getClassifiedChildren().body))}),this.segmentEl=t,this.navEl.append(t),this.headerEl.append(this.navEl)}this.panel&&(a?this.panel.setAttribute("aria-labelledby",this.titleId):this.panel.removeAttribute("aria-labelledby"))}renderHeader(t){if(!this.headerEl)return;if(t.length>0)return this.headerEl.hidden=!1,void this.renderDefaultHeader(t);if(this.usesIntegratedNav())return this.headerEl.hidden=!1,void this.renderNavHeader();this.getAttribute("title")||""?(this.headerEl.hidden=!1,this.renderDefaultHeader([])):this.headerEl.hidden=!0}renderBodyContent(t=[]){if(!this.contentEl)return;let e=this.contentEl.querySelector(":scope > .designbase-wc-modal__integrated-content"),s="";if(this.usesIntegratedNav()){const t=this.resolvedHeaderVariant();if("tabs"===t){const t=this.parsedTabs().find(t=>t.id===this.activeTabId());s=t?.content||""}if("segment"===t){const t=this.parsedSegments().find(t=>t.value===this.activeSegmentValue());s=t?.content||""}}s?(e||(e=document.createElement("div"),e.className="designbase-wc-modal__integrated-content designbase-wc-modal__body",this.contentEl.insertBefore(e,this.contentEl.firstChild)),e.textContent=s):e?.remove();const i=t.filter(t=>this.isBodyPart(t)),n=t.filter(t=>!this.isBodyPart(t)&&!this.isFooterPart(t));this.placeContentParts("body",i.length>0?i:n)}renderFooter(t){if(!this.contentEl)return;const e=t.filter(t=>this.isFooterPart(t)),s=t.filter(t=>!this.isFooterPart(t)&&!this.isBodyPart(t)),i=e.length>0?e:s;this.placeContentParts("footer",i),i.forEach(t=>{t.hidden=!1}),this.bindFooterActions()}render(){this.ensureStructure();const{header:t,body:s,footer:i}=this.getClassifiedChildren();e.forEach(t=>this.panel?.classList.remove(`designbase-wc-modal--${t}`)),this.panel?.classList.add(`designbase-wc-modal--${this.resolvedSize()}`),this.renderHeader(t),this.renderBodyContent(s),this.renderFooter(i)}syncVisibility(){if(this.root&&this.panel){if(this.open)return this.root.setAttribute("data-state","entering"),this.panel.setAttribute("data-state","entering"),void requestAnimationFrame(()=>{this.panel,requestAnimationFrame(()=>{this.open&&this.root&&this.panel&&(this.root.setAttribute("data-state","entered"),this.panel.setAttribute("data-state","entered"))})});this.root.setAttribute("data-state","exiting"),this.panel.setAttribute("data-state","exiting")}}syncOpenState(){if(this.open)return this.render(),this.root&&!this.root.isConnected&&document.body.append(this.root),document.body.style.overflow="hidden",this.isMounted=!0,void this.syncVisibility();this.isMounted&&(this.syncVisibility(),document.body.style.overflow="",this.exitTimerId&&clearTimeout(this.exitTimerId),this.exitTimerId=window.setTimeout(()=>{this.open||this.teardown()},200))}teardown(){this.restorePartsToHost(),this.root?.remove(),this.isMounted=!1,document.body.style.overflow=""}close(){this.open=!1,this.dispatchEvent(new CustomEvent("db-close",{bubbles:!0,composed:!0}))}}customElements.get("db-modal")||customElements.define("db-modal",DbModal);export{DbModal};
@@ -0,0 +1,57 @@
1
+ interface DbNavbarItem {
2
+ id: string;
3
+ label: string;
4
+ href?: string;
5
+ icon?: string;
6
+ active?: boolean;
7
+ disabled?: boolean;
8
+ children?: DbNavbarItem[];
9
+ }
10
+ interface DbNavbarUserProfile {
11
+ name: string;
12
+ email?: string;
13
+ avatar?: string;
14
+ badge?: number;
15
+ badgeVariant?: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'danger';
16
+ badgeStyle?: 'dot' | 'number' | 'text' | 'outlined';
17
+ badgeText?: string;
18
+ }
19
+ declare class DbNavbar extends HTMLElement {
20
+ private mobileOpen;
21
+ private userMenuOpen;
22
+ private expandedMobile;
23
+ private outsideHandler;
24
+ static get observedAttributes(): string[];
25
+ connectedCallback(): void;
26
+ disconnectedCallback(): void;
27
+ attributeChangedCallback(): void;
28
+ get items(): DbNavbarItem[];
29
+ set items(value: DbNavbarItem[] | string);
30
+ get userMenuItems(): DbNavbarItem[];
31
+ set userMenuItems(value: DbNavbarItem[] | string);
32
+ get userProfile(): DbNavbarUserProfile | null;
33
+ set userProfile(value: DbNavbarUserProfile | string | null);
34
+ private parseItems;
35
+ private parseUserProfile;
36
+ private iconSize;
37
+ private bindOutsideClick;
38
+ private unbindOutsideClick;
39
+ private dispatchItemClick;
40
+ private syncHostClasses;
41
+ private createDesktopNavItem;
42
+ private createUserMenuItemElement;
43
+ private bindSearchEvents;
44
+ private applyAvatarProfile;
45
+ private createMobileMenuItem;
46
+ private updateUserMenuVisibility;
47
+ private renderMobileMenu;
48
+ private render;
49
+ }
50
+ declare global {
51
+ interface HTMLElementTagNameMap {
52
+ 'db-navbar': DbNavbar;
53
+ }
54
+ }
55
+
56
+ export { DbNavbar };
57
+ export type { DbNavbarItem, DbNavbarUserProfile };
@@ -0,0 +1 @@
1
+ import{createDbIcon as e}from"./db-icons.js";const t=["s","m","l"],s=["default","transparent"],n=["fixed","sticky","static"];function resolveIcon(e){if(e)return e}class DbNavbar extends HTMLElement{constructor(){super(...arguments),this.mobileOpen=!1,this.userMenuOpen=!1,this.expandedMobile={},this.outsideHandler=null}static get observedAttributes(){return["items","user-menu-items","user-profile","size","variant","position","is-authenticated","show-search","search-placeholder","full-width","shadow"]}connectedCallback(){this.render(),this.bindOutsideClick()}disconnectedCallback(){this.unbindOutsideClick()}attributeChangedCallback(){this.isConnected&&this.render()}get items(){return this.parseItems("items")}set items(e){this.setAttribute("items","string"==typeof e?e:JSON.stringify(e))}get userMenuItems(){return this.parseItems("user-menu-items")}set userMenuItems(e){this.setAttribute("user-menu-items","string"==typeof e?e:JSON.stringify(e))}get userProfile(){return this.parseUserProfile()}set userProfile(e){null==e?this.removeAttribute("user-profile"):this.setAttribute("user-profile","string"==typeof e?e:JSON.stringify(e))}parseItems(e="items"){try{const t=JSON.parse(this.getAttribute(e)||"[]");return Array.isArray(t)?t:[]}catch{return[]}}parseUserProfile(){const e=this.getAttribute("user-profile");if(!e)return null;try{return JSON.parse(e)}catch{return null}}iconSize(e){return"s"===e?16:"l"===e?24:20}bindOutsideClick(){this.outsideHandler||(this.outsideHandler=e=>{this.contains(e.target)||(this.userMenuOpen=!1,this.updateUserMenuVisibility())},document.addEventListener("mousedown",this.outsideHandler))}unbindOutsideClick(){this.outsideHandler&&(document.removeEventListener("mousedown",this.outsideHandler),this.outsideHandler=null)}dispatchItemClick(e,t){this.dispatchEvent(new CustomEvent("user"===t?"db-user-menu-item-click":"db-item-click",{bubbles:!0,composed:!0,detail:{item:e,source:t}}))}syncHostClasses(){const e=this.getAttribute("size")||"m",a=this.getAttribute("variant")||"default",i=this.getAttribute("position")||"static";this.className=["designbase-wc-navbar",`designbase-wc-navbar--${t.includes(e)?e:"m"}`,`designbase-wc-navbar--${s.includes(a)?a:"default"}`,`designbase-wc-navbar--${n.includes(i)?i:"static"}`,this.hasAttribute("full-width")&&"designbase-wc-navbar--full-width",this.hasAttribute("shadow")&&"designbase-wc-navbar--shadow",this.mobileOpen&&"designbase-wc-navbar--mobile-open"].filter(Boolean).join(" ")}createDesktopNavItem(t,s){const n=document.createElement("li");n.className="designbase-wc-navbar__nav-item";if(Boolean(t.children?.length)){const a=document.createElement("div");a.className="designbase-wc-navbar__dropdown";const i=document.createElement("button");i.type="button",i.className=["designbase-wc-navbar__nav-link","designbase-wc-navbar__nav-link--has-children",t.active&&"designbase-wc-navbar__nav-link--active",t.disabled&&"designbase-wc-navbar__nav-link--disabled"].filter(Boolean).join(" "),i.disabled=Boolean(t.disabled);const r=resolveIcon(t.icon);r&&i.append(e(r,s)),i.append(document.createTextNode(t.label));const d=e("chevron-down",12);d.classList.add("designbase-wc-navbar__chevron"),i.append(d);const c=document.createElement("ul");return c.className="designbase-wc-navbar__dropdown-menu",t.children.forEach(t=>{const n=document.createElement("li"),a=document.createElement("a");a.href=t.href||"#",a.className=["designbase-wc-navbar__dropdown-item",t.active&&"designbase-wc-navbar__dropdown-item--active",t.disabled&&"designbase-wc-navbar__dropdown-item--disabled"].filter(Boolean).join(" ");const i=resolveIcon(t.icon);i&&a.append(e(i,s)),a.append(document.createTextNode(t.label)),a.addEventListener("click",e=>{t.disabled?e.preventDefault():(e.preventDefault(),this.dispatchItemClick(t,"nav"))}),n.append(a),c.append(n)}),a.append(i,c),n.append(a),n}const a=document.createElement("a");a.href=t.href||"#",a.className=["designbase-wc-navbar__nav-link",t.active&&"designbase-wc-navbar__nav-link--active",t.disabled&&"designbase-wc-navbar__nav-link--disabled"].filter(Boolean).join(" ");const i=resolveIcon(t.icon);return i&&a.append(e(i,s)),a.append(document.createTextNode(t.label)),a.addEventListener("click",e=>{t.disabled?e.preventDefault():(e.preventDefault(),this.dispatchItemClick(t,"nav"))}),n.append(a),n}createUserMenuItemElement(e,t,s){const n=document.createElement("db-menu-item");return n.setAttribute("label",e.label),n.setAttribute("type","block"),n.setAttribute("menu-style","dropdown"),n.setAttribute("size",t),e.href&&n.setAttribute("href",e.href),e.icon&&n.setAttribute("icon",e.icon),e.disabled&&n.setAttribute("disabled",""),n.addEventListener("db-click",()=>{e.disabled||(s(),this.dispatchItemClick(e,"user"))}),n}bindSearchEvents(e){e.addEventListener("db-search",e=>{const t=e.detail,s=t.query??t.value??"";this.dispatchEvent(new CustomEvent("db-search",{bubbles:!0,composed:!0,detail:{query:s,value:s}}))})}applyAvatarProfile(e,t,s){e.setAttribute("size","s"===s?"s":"l"===s?"l":"m"),e.setAttribute("initials",t.name),e.setAttribute("alt",t.name),t.avatar&&e.setAttribute("src",t.avatar),void 0!==t.badge&&e.setAttribute("badge",String(t.badge)),t.badgeVariant&&e.setAttribute("badge-variant",t.badgeVariant),t.badgeStyle&&e.setAttribute("badge-style",t.badgeStyle),t.badgeText&&e.setAttribute("badge-text",t.badgeText)}createMobileMenuItem(e,t){const s=Boolean(e.children?.length),n=Boolean(this.expandedMobile[e.id]),a=document.createElement("db-menu-item");return a.setAttribute("label",e.label),a.setAttribute("type","block"),a.setAttribute("menu-style","accordion"),a.setAttribute("size",t),e.href&&a.setAttribute("href",e.href),e.icon&&a.setAttribute("icon",e.icon),e.active&&a.setAttribute("active",""),e.disabled&&a.setAttribute("disabled",""),s&&(a.setAttribute("expandable",""),a.subItems=(e.children||[]).map(e=>({id:e.id,label:e.label,href:e.href,icon:e.icon,active:e.active,disabled:e.disabled})),n&&a.setAttribute("expanded","")),a.addEventListener("db-click",()=>{if(!e.disabled){if(s)return this.expandedMobile[e.id]=!n,void this.renderMobileMenu();this.mobileOpen=!1,this.dispatchItemClick(e,"mobile"),this.render()}}),a.addEventListener("db-child-click",e=>{const t=e.detail;this.mobileOpen=!1,this.dispatchItemClick(t.child,"mobile"),this.render()}),a}updateUserMenuVisibility(){const e=this.querySelector(".designbase-wc-navbar__user-dropdown-menu");e&&(e.hidden=!this.userMenuOpen)}renderMobileMenu(){const e=this.querySelector(".designbase-wc-navbar__mobile-nav-list");if(!e)return;const t=this.getAttribute("size")||"m",s=this.parseItems();e.replaceChildren(...s.map(e=>this.createMobileMenuItem(e,t)))}render(){this.syncHostClasses(),this.setAttribute("role","navigation"),this.setAttribute("aria-label","메인 네비게이션");const t=this.getAttribute("size")||"m",s=this.iconSize(t),n=this.parseItems(),a=this.parseItems("user-menu-items"),i=this.parseUserProfile(),r=this.hasAttribute("is-authenticated"),d=this.hasAttribute("show-search");this.replaceChildren();const c=document.createElement("div");c.className=["designbase-wc-navbar__container",this.hasAttribute("full-width")&&"designbase-wc-navbar__container--full-width"].filter(Boolean).join(" ");const l=document.createElement("div");l.className="designbase-wc-navbar__left";const o=document.createElement("div");o.className="designbase-wc-navbar__brand";const b=document.createElement("div");b.className="designbase-wc-navbar__logo";const u=document.createElement("db-logo");u.setAttribute("type","designbase"),u.setAttribute("size","s"),u.setAttribute("clickable",""),u.addEventListener("db-click",()=>{this.dispatchEvent(new CustomEvent("db-logo-click",{bubbles:!0,composed:!0}))}),b.append(u),o.append(b),l.append(o);const m=document.createElement("div");m.className="designbase-wc-navbar__right";const p=document.createElement("div");p.className="designbase-wc-navbar__nav designbase-wc-navbar__nav--desktop";const h=document.createElement("ul");if(h.className="designbase-wc-navbar__nav-list",n.forEach(e=>h.append(this.createDesktopNavItem(e,s))),p.append(h),m.append(p),d){const e=document.createElement("div");e.className="designbase-wc-navbar__search";const s=document.createElement("db-search-bar");s.setAttribute("variant","outlined"),s.setAttribute("size","s"===t?"s":"l"===t?"l":"m"),s.setAttribute("placeholder",this.getAttribute("search-placeholder")||"검색..."),this.bindSearchEvents(s),e.append(s),m.append(e)}const v=document.createElement("div");if(v.className="designbase-wc-navbar__user-menu",r&&i){const s=document.createElement("div");s.className="designbase-wc-navbar__user-dropdown";const n=document.createElement("button");n.type="button",n.className="designbase-wc-navbar__user-toggle",n.setAttribute("aria-expanded",String(this.userMenuOpen));const r=document.createElement("db-avatar");this.applyAvatarProfile(r,i,t);const d=document.createElement("span");d.className="designbase-wc-navbar__user-name",d.textContent=i.name,n.append(r,d,e("chevron-down",12)),n.addEventListener("click",()=>{this.userMenuOpen=!this.userMenuOpen,n.setAttribute("aria-expanded",String(this.userMenuOpen)),this.updateUserMenuVisibility()});const c=document.createElement("ul");if(c.className="designbase-wc-navbar__user-dropdown-menu",c.hidden=!this.userMenuOpen,i.email){const e=document.createElement("li");e.className="designbase-wc-navbar__user-info";const t=document.createElement("span");t.className="designbase-wc-navbar__user-email",t.textContent=i.email,e.append(t),c.append(e)}a.forEach(e=>{const s=document.createElement("li");s.append(this.createUserMenuItemElement(e,t,()=>{this.userMenuOpen=!1,this.updateUserMenuVisibility()})),c.append(s)}),s.append(n,c),v.append(s)}else{const e=document.createElement("db-button");e.setAttribute("variant","primary"),e.setAttribute("size","s"===t?"s":"l"===t?"l":"m"),e.textContent="로그인",e.addEventListener("db-click",()=>{this.dispatchEvent(new CustomEvent("db-login-click",{bubbles:!0,composed:!0}))}),v.append(e)}m.append(v);const g=document.createElement("button");g.type="button",g.className="designbase-wc-navbar__mobile-toggle",g.setAttribute("aria-expanded",String(this.mobileOpen)),g.setAttribute("aria-label","메뉴 열기");for(let e=0;e<3;e+=1){const e=document.createElement("span");e.className="designbase-wc-navbar__mobile-toggle-line",g.append(e)}if(g.addEventListener("click",()=>{this.mobileOpen=!this.mobileOpen,this.render()}),c.append(l,m,g),this.append(c),this.mobileOpen){const e=document.createElement("div");if(e.className="designbase-wc-navbar__mobile-menu",d){const t=document.createElement("div");t.className="designbase-wc-navbar__mobile-search";const s=document.createElement("db-search-bar");s.setAttribute("variant","outlined"),s.setAttribute("size","s"),s.setAttribute("full-width",""),s.setAttribute("placeholder",this.getAttribute("search-placeholder")||"검색..."),this.bindSearchEvents(s),t.append(s),e.append(t)}const t=document.createElement("ul");t.className="designbase-wc-navbar__mobile-nav-list",e.append(t);const s=document.createElement("div");if(s.className="designbase-wc-navbar__mobile-user",r&&i){const e=document.createElement("div");e.className="designbase-wc-navbar__mobile-user-info";const t=document.createElement("db-avatar");this.applyAvatarProfile(t,i,"m");const n=document.createElement("div"),r=document.createElement("div");if(r.className="designbase-wc-navbar__mobile-user-name",r.textContent=i.name,n.append(r),i.email){const e=document.createElement("div");e.className="designbase-wc-navbar__mobile-user-email",e.textContent=i.email,n.append(e)}if(e.append(t,n),s.append(e),a.length){const e=document.createElement("ul");e.className="designbase-wc-navbar__mobile-user-menu",a.forEach(t=>{const s=document.createElement("li");s.append(this.createUserMenuItemElement(t,"m",()=>{this.mobileOpen=!1,this.render()})),e.append(s)}),s.append(e)}}else{const e=document.createElement("db-button");e.setAttribute("variant","primary"),e.setAttribute("size","m"),e.setAttribute("full-width",""),e.textContent="로그인",e.addEventListener("db-click",()=>{this.dispatchEvent(new CustomEvent("db-login-click",{bubbles:!0,composed:!0}))}),s.append(e)}e.append(s),this.append(e),this.renderMobileMenu()}}}customElements.get("db-navbar")||customElements.define("db-navbar",DbNavbar);export{DbNavbar};