@ttdk-design-system/library-react 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI_GUIDE.md +6518 -0
- package/llms.txt +6518 -0
- package/package.json +1098 -4
- package/src/core/index.ts +2 -0
- package/src/core/tailwind-preset.cjs +62 -0
- package/src/core/tailwind-preset.ts +85 -0
- package/src/core/theme/tokens.css +663 -0
- package/src/core/types.ts +836 -0
- package/src/index.ts +17 -0
- package/src/tailwind-preset.cjs +62 -0
- package/src/tailwind-preset.ts +85 -0
- package/src/types.ts +1 -0
- package/src/web/accordion/AI_GUIDE.md +149 -0
- package/src/web/accordion/accordion.css +1 -0
- package/src/web/accordion/accordion.tsx +430 -0
- package/src/web/accordion/index.ts +3 -0
- package/src/web/accordion/manifest.json +351 -0
- package/src/web/alert/AI_GUIDE.md +139 -0
- package/src/web/alert/alert.css +1 -0
- package/src/web/alert/alert.tsx +318 -0
- package/src/web/alert/index.ts +3 -0
- package/src/web/alert/manifest.json +240 -0
- package/src/web/avatar/AI_GUIDE.md +118 -0
- package/src/web/avatar/avatar.css +1 -0
- package/src/web/avatar/avatar.tsx +233 -0
- package/src/web/avatar/index.ts +3 -0
- package/src/web/avatar/manifest.json +195 -0
- package/src/web/badge/AI_GUIDE.md +94 -0
- package/src/web/badge/badge.css +1 -0
- package/src/web/badge/badge.tsx +140 -0
- package/src/web/badge/index.ts +2 -0
- package/src/web/badge/manifest.json +141 -0
- package/src/web/banner/AI_GUIDE.md +130 -0
- package/src/web/banner/banner.css +1 -0
- package/src/web/banner/banner.tsx +334 -0
- package/src/web/banner/index.ts +3 -0
- package/src/web/banner/manifest.json +240 -0
- package/src/web/breadcrumb/AI_GUIDE.md +120 -0
- package/src/web/breadcrumb/breadcrumb.css +1 -0
- package/src/web/breadcrumb/breadcrumb.tsx +306 -0
- package/src/web/breadcrumb/index.ts +3 -0
- package/src/web/breadcrumb/manifest.json +225 -0
- package/src/web/button/AI_GUIDE.md +121 -0
- package/src/web/button/button.css +1 -0
- package/src/web/button/button.tsx +287 -0
- package/src/web/button/index.ts +2 -0
- package/src/web/button/manifest.json +177 -0
- package/src/web/calendar/AI_GUIDE.md +151 -0
- package/src/web/calendar/calendar.css +1 -0
- package/src/web/calendar/calendar.tsx +1611 -0
- package/src/web/calendar/index.ts +3 -0
- package/src/web/calendar/manifest.json +470 -0
- package/src/web/card/AI_GUIDE.md +133 -0
- package/src/web/card/card.css +1 -0
- package/src/web/card/card.tsx +408 -0
- package/src/web/card/index.ts +4 -0
- package/src/web/card/manifest.json +357 -0
- package/src/web/checkbox/AI_GUIDE.md +146 -0
- package/src/web/checkbox/checkbox.css +1 -0
- package/src/web/checkbox/checkbox.tsx +307 -0
- package/src/web/checkbox/index.ts +2 -0
- package/src/web/checkbox/manifest.json +294 -0
- package/src/web/chip/AI_GUIDE.md +186 -0
- package/src/web/chip/chip.css +1 -0
- package/src/web/chip/chip.tsx +230 -0
- package/src/web/chip/index.ts +2 -0
- package/src/web/chip/manifest.json +186 -0
- package/src/web/dropdown/AI_GUIDE.md +167 -0
- package/src/web/dropdown/dropdown.css +1 -0
- package/src/web/dropdown/dropdown.tsx +1274 -0
- package/src/web/dropdown/index.ts +3 -0
- package/src/web/dropdown/manifest.json +576 -0
- package/src/web/flex/AI_GUIDE.md +113 -0
- package/src/web/flex/flex-item.tsx +97 -0
- package/src/web/flex/flex.css +1 -0
- package/src/web/flex/flex.tsx +108 -0
- package/src/web/flex/index.ts +5 -0
- package/src/web/flex/manifest.json +162 -0
- package/src/web/form/index.ts +7 -0
- package/src/web/grid/AI_GUIDE.md +112 -0
- package/src/web/grid/grid-item.tsx +112 -0
- package/src/web/grid/grid.css +1 -0
- package/src/web/grid/grid.tsx +99 -0
- package/src/web/grid/index.ts +5 -0
- package/src/web/grid/manifest.json +153 -0
- package/src/web/index.ts +86 -0
- package/src/web/input/AI_GUIDE.md +159 -0
- package/src/web/input/index.ts +3 -0
- package/src/web/input/input.css +1 -0
- package/src/web/input/input.tsx +537 -0
- package/src/web/input/manifest.json +465 -0
- package/src/web/input-number/AI_GUIDE.md +164 -0
- package/src/web/input-number/index.ts +3 -0
- package/src/web/input-number/input-number.css +1 -0
- package/src/web/input-number/input-number.tsx +1193 -0
- package/src/web/input-number/manifest.json +575 -0
- package/src/web/modal/AI_GUIDE.md +171 -0
- package/src/web/modal/index.ts +3 -0
- package/src/web/modal/manifest.json +375 -0
- package/src/web/modal/modal.css +1 -0
- package/src/web/modal/modal.tsx +571 -0
- package/src/web/pagination/AI_GUIDE.md +148 -0
- package/src/web/pagination/index.ts +21 -0
- package/src/web/pagination/manifest.json +432 -0
- package/src/web/pagination/pagination-content.tsx +45 -0
- package/src/web/pagination/pagination-ellipsis.tsx +54 -0
- package/src/web/pagination/pagination-first.tsx +155 -0
- package/src/web/pagination/pagination-item.tsx +45 -0
- package/src/web/pagination/pagination-last.tsx +155 -0
- package/src/web/pagination/pagination-link.tsx +121 -0
- package/src/web/pagination/pagination-next.tsx +158 -0
- package/src/web/pagination/pagination-previous.tsx +158 -0
- package/src/web/pagination/pagination.css +1 -0
- package/src/web/pagination/pagination.tsx +687 -0
- package/src/web/popover/AI_GUIDE.md +163 -0
- package/src/web/popover/index.ts +3 -0
- package/src/web/popover/manifest.json +396 -0
- package/src/web/popover/popover.css +1 -0
- package/src/web/popover/popover.tsx +702 -0
- package/src/web/radio/AI_GUIDE.md +155 -0
- package/src/web/radio/index.ts +2 -0
- package/src/web/radio/manifest.json +294 -0
- package/src/web/radio/radio.css +1 -0
- package/src/web/radio/radio.tsx +290 -0
- package/src/web/selectbox/AI_GUIDE.md +216 -0
- package/src/web/selectbox/index.ts +3 -0
- package/src/web/selectbox/manifest.json +477 -0
- package/src/web/selectbox/selectbox.css +1 -0
- package/src/web/selectbox/selectbox.tsx +1048 -0
- package/src/web/sonner/AI_GUIDE.md +98 -0
- package/src/web/sonner/index.ts +114 -0
- package/src/web/sonner/manifest.json +132 -0
- package/src/web/sonner/sonner.css +1 -0
- package/src/web/sonner/sonner.tsx +177 -0
- package/src/web/table/AI_GUIDE.md +145 -0
- package/src/web/table/index.ts +35 -0
- package/src/web/table/manifest.json +168 -0
- package/src/web/table/table-body.tsx +45 -0
- package/src/web/table/table-caption.tsx +45 -0
- package/src/web/table/table-cell.tsx +74 -0
- package/src/web/table/table-empty.tsx +108 -0
- package/src/web/table/table-footer.tsx +45 -0
- package/src/web/table/table-head.tsx +80 -0
- package/src/web/table/table-header.tsx +45 -0
- package/src/web/table/table-row.tsx +69 -0
- package/src/web/table/table.css +1 -0
- package/src/web/table/table.tsx +305 -0
- package/src/web/tabs/AI_GUIDE.md +150 -0
- package/src/web/tabs/index.ts +3 -0
- package/src/web/tabs/manifest.json +315 -0
- package/src/web/tabs/tabs.css +1 -0
- package/src/web/tabs/tabs.tsx +332 -0
- package/src/web/text/AI_GUIDE.md +129 -0
- package/src/web/text/index.ts +3 -0
- package/src/web/text/manifest.json +195 -0
- package/src/web/text/text.css +1 -0
- package/src/web/text/text.tsx +689 -0
- package/src/web/textarea/AI_GUIDE.md +141 -0
- package/src/web/textarea/index.ts +3 -0
- package/src/web/textarea/manifest.json +438 -0
- package/src/web/textarea/textarea.css +1 -0
- package/src/web/textarea/textarea.tsx +467 -0
- package/src/web/tooltip/AI_GUIDE.md +110 -0
- package/src/web/tooltip/index.ts +3 -0
- package/src/web/tooltip/manifest.json +222 -0
- package/src/web/tooltip/tooltip.css +1 -0
- package/src/web/tooltip/tooltip.tsx +423 -0
- package/src/webview/bottomsheet/AI_GUIDE.md +141 -0
- package/src/webview/bottomsheet/bottomsheet.css +1 -0
- package/src/webview/bottomsheet/bottomsheet.tsx +603 -0
- package/src/webview/bottomsheet/index.ts +4 -0
- package/src/webview/bottomsheet/manifest.json +377 -0
- package/src/webview/button/AI_GUIDE.md +79 -0
- package/src/webview/button/button-ios.css +1 -0
- package/src/webview/button/button-ios.tsx +138 -0
- package/src/webview/button/button-material.css +1 -0
- package/src/webview/button/button-material.tsx +138 -0
- package/src/webview/button/index.ts +7 -0
- package/src/webview/button/manifest.json +148 -0
- package/src/webview/index.ts +7 -0
- package/tailwind-preset.cjs +62 -0
- package/tailwind-preset.js +62 -0
- package/ttdk-manifest.json +10188 -0
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.ttdk-avatar{border-radius:var(--ttdk-radius-full,9999px);background-color:var(--ttdk-color-blue-100,#ecf3fe);width:40px;height:40px;color:var(--ttdk-text-icon-status-info,#0968f6);font-family:var(--ttdk-font-sans,"Manrope", sans-serif);box-sizing:border-box;user-select:none;vertical-align:middle;flex-shrink:0;justify-content:center;align-items:center;line-height:1;transition:opacity .15s cubic-bezier(.4,0,.2,1),transform .15s cubic-bezier(.4,0,.2,1);display:inline-flex;position:relative;overflow:visible}.ttdk-avatar[data-interactive=true]{cursor:pointer}.ttdk-avatar[data-interactive=true]:hover{opacity:.9}.ttdk-avatar[data-interactive=true]:focus-visible{outline:2px solid var(--ttdk-stroke-border-focus,#16b3ac);outline-offset:2px}.ttdk-avatar[data-disabled=true]{opacity:.55;cursor:not-allowed;pointer-events:none}.ttdk-avatar-image{object-fit:cover;border-radius:inherit;width:100%;height:100%;display:block}.ttdk-avatar-initials{font-weight:var(--ttdk-font-weight-medium,500);letter-spacing:.01em;text-transform:uppercase;color:inherit;justify-content:center;align-items:center;line-height:1;display:inline-flex}.ttdk-avatar-icon{color:var(--ttdk-ui-icon-color,var(--ttdk-text-icon-primary,#141313));justify-content:center;align-items:center;line-height:0;display:inline-flex}.ttdk-avatar-icon:before{content:"";background-color:currentColor;width:20px;height:20px;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0'/%3E%3Cpath d='M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0'/%3E%3Cpath d='M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.ttdk-avatar-icon:not(:empty):before{display:none}.ttdk-avatar-icon svg{stroke:currentColor;stroke-width:1.8px;stroke-linecap:round;stroke-linejoin:round;fill:none;width:20px;height:20px}.ttdk-avatar[data-size=xs]{width:24px;height:24px;font-size:10px}.ttdk-avatar[data-size=xs] .ttdk-avatar-icon:before,.ttdk-avatar[data-size=xs] .ttdk-avatar-icon svg{width:14px;height:14px}.ttdk-avatar[data-size=sm]{width:32px;height:32px;font-size:14px}.ttdk-avatar[data-size=sm] .ttdk-avatar-icon:before,.ttdk-avatar[data-size=sm] .ttdk-avatar-icon svg{width:16px;height:16px}.ttdk-avatar[data-size=md]{width:40px;height:40px;font-size:16px}.ttdk-avatar[data-size=md] .ttdk-avatar-icon:before,.ttdk-avatar[data-size=md] .ttdk-avatar-icon svg{width:20px;height:20px}.ttdk-avatar[data-size=lg]{width:48px;height:48px;font-size:18px}.ttdk-avatar[data-size=lg] .ttdk-avatar-icon:before,.ttdk-avatar[data-size=lg] .ttdk-avatar-icon svg{width:24px;height:24px}.ttdk-avatar[data-size=xl]{width:56px;height:56px;font-size:20px}.ttdk-avatar[data-size=xl] .ttdk-avatar-icon:before,.ttdk-avatar[data-size=xl] .ttdk-avatar-icon svg{width:28px;height:28px}.ttdk-avatar[data-rounded=full]{border-radius:var(--ttdk-radius-full,9999px)}.ttdk-avatar[data-rounded=lg]{border-radius:var(--ttdk-radius-md,12px)}.ttdk-avatar[data-rounded=md]{border-radius:var(--ttdk-radius-sm,8px)}.ttdk-avatar[data-rounded=sm]{border-radius:var(--ttdk-radius-xs,6px)}.ttdk-avatar[data-rounded=none]{border-radius:var(--ttdk-radius-none,0px)}.ttdk-avatar[data-variant=info]{background-color:var(--ttdk-color-blue-100,#ecf3fe);color:var(--ttdk-text-icon-status-info,#0968f6)}.ttdk-avatar[data-variant=primary]{background-color:var(--ttdk-brand-subtle,#e1fbfa);color:var(--ttdk-brand-default,#16b3ac)}.ttdk-avatar[data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle,#e0fae0);color:var(--ttdk-text-icon-status-success,#3cc14e)}.ttdk-avatar[data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle,#fff8d5);color:var(--ttdk-text-icon-status-warning,#ff8806)}.ttdk-avatar[data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle,#ffe0e0);color:var(--ttdk-text-icon-status-error,#f02d2d)}.ttdk-avatar[data-variant=neutral]{background-color:var(--ttdk-bg-secondary-disabled,#f1f2f3);color:var(--ttdk-text-icon-primary,#141313)}.dark .ttdk-avatar,[data-theme=dark] .ttdk-avatar{color:var(--ttdk-text-icon-primary,#fff)}.dark .ttdk-avatar-icon,[data-theme=dark] .ttdk-avatar-icon{color:var(--ttdk-ui-icon-color,var(--ttdk-text-icon-primary,#fff))}.dark .ttdk-avatar[data-variant=info],[data-theme=dark] .ttdk-avatar[data-variant=info]{background-color:var(--ttdk-bg-status-info-subtle,#002a69);color:var(--ttdk-text-icon-status-info,#84b4fb)}.dark .ttdk-avatar[data-variant=primary],[data-theme=dark] .ttdk-avatar[data-variant=primary]{background-color:var(--ttdk-brand-subtle-dark,#062f2d);color:var(--ttdk-brand-default,#16b3ac)}.dark .ttdk-avatar[data-variant=success],[data-theme=dark] .ttdk-avatar[data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle,#1b561a);color:var(--ttdk-text-icon-status-success,#a6f0a5)}.dark .ttdk-avatar[data-variant=warning],[data-theme=dark] .ttdk-avatar[data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle,#553b06);color:var(--ttdk-text-icon-status-warning,#ffe58a)}.dark .ttdk-avatar[data-variant=danger],[data-theme=dark] .ttdk-avatar[data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle,#570303);color:var(--ttdk-text-icon-status-error,#ffa0a0)}.dark .ttdk-avatar[data-variant=neutral],[data-theme=dark] .ttdk-avatar[data-variant=neutral]{background-color:var(--ttdk-bg-secondary-disabled,#313336);color:var(--ttdk-text-icon-primary,#fff)}.ttdk-avatar-status{border:1.5px solid var(--ttdk-bg-base-primary,#fff);box-sizing:border-box;background-color:var(--ttdk-bg-status-success,#3cc14e);border-radius:9999px;position:absolute;bottom:0;right:0}.dark .ttdk-avatar-status,[data-theme=dark] .ttdk-avatar-status{border-color:var(--ttdk-bg-base-primary,#141313)}.ttdk-avatar[data-size=xs] .ttdk-avatar-status{border-width:1px;width:6px;height:6px}.ttdk-avatar[data-size=sm] .ttdk-avatar-status{border-width:1.5px;width:8px;height:8px}.ttdk-avatar[data-size=md] .ttdk-avatar-status{border-width:1.5px;width:10px;height:10px}.ttdk-avatar[data-size=lg] .ttdk-avatar-status{border-width:2px;width:12px;height:12px}.ttdk-avatar[data-size=xl] .ttdk-avatar-status{border-width:2px;width:14px;height:14px}.ttdk-avatar-status[data-status=online]{background-color:var(--ttdk-bg-status-success,#3cc14e)}.ttdk-avatar-status[data-status=offline]{background-color:var(--ttdk-color-neutral-400,#969ba2)}.ttdk-avatar-status[data-status=verified]{background-color:#0000;background-image:url(data:image/svg+xml,%3Csvg%20width%3D%2225%22%20height%3D%2227%22%20viewBox%3D%220%200%2025%2027%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cuse%20xlink%3Ahref%3D%22%23stroke0_696_8896%22%20fill%3D%22%231E81E8%22%2F%3E%3Cmask%20id%3D%22stroke1_696_8896%22%20maskUnits%3D%22userSpaceOnUse%22%20x%3D%22-0.577322%22%20y%3D%22-1.33077%22%20width%3D%2226.4905%22%20height%3D%2229.1467%22%20fill%3D%22black%22%3E%3Crect%20fill%3D%22white%22%20x%3D%22-0.577322%22%20y%3D%22-1.33077%22%20width%3D%2226.4905%22%20height%3D%2229.1467%22%2F%3E%3Cuse%20xlink%3Ahref%3D%22%23stroke0_696_8896%22%2F%3E%3C%2Fmask%3E%3Cpath%20d%3D%22M23.1264%204.39673L24.094%204.14968L23.8502%203.21882L22.9113%203.41901L23.1264%204.39673ZM12.5952%201.23272L13.1994%200.440062L12.6235%205.7958e-05L12.0282%200.405408L12.5952%201.23272ZM1.87074%203.81179L2.13074%202.84824L1.2209%202.59744L0.922051%203.48837L1.87074%203.81179ZM11.7726%2025.626L11.3952%2026.5493L11.7485%2026.6955L12.108%2026.5701L11.7726%2025.626ZM23.1264%204.39673L22.9113%203.41901C20.7297%203.88421%2018.3403%203.19906%2016.4009%202.30664C15.4476%201.868%2014.6401%201.39645%2014.0714%201.03467C13.7878%200.854194%2013.5653%200.702137%2013.4157%200.596732C13.341%200.54406%2013.2846%200.503128%2013.2481%200.476231C13.2298%200.462785%2013.2165%200.452855%2013.2083%200.446729C13.2042%200.443666%2013.2014%200.441555%2013.1999%200.440431C13.1992%200.439869%2013.1988%200.439555%2013.1987%200.439492C13.1986%200.43946%2013.1987%200.439492%2013.1988%200.439586C13.1989%200.439634%2013.199%200.439753%2013.1991%200.439776C13.1992%200.439911%2013.1994%200.440062%2012.5952%201.23272C11.991%202.02539%2011.9913%202.02557%2011.9915%202.02577C11.9917%202.02586%2011.9919%202.02607%2011.9922%202.02625C11.9926%202.0266%2011.9932%202.02702%2011.9938%202.0275C11.9951%202.02846%2011.9967%202.02967%2011.9986%202.03114C12.0025%202.03407%2012.0077%202.03801%2012.0142%202.04292C12.0273%202.05273%2012.0457%202.06642%2012.0692%202.08369C12.1161%202.11822%2012.1836%202.16711%2012.27%202.228C12.4427%202.34972%2012.6917%202.51975%2013.005%202.71912C13.6304%203.11702%2014.519%203.6362%2015.5741%204.12171C17.6514%205.07759%2020.5276%205.97444%2023.3414%205.37444L23.1264%204.39673ZM12.5952%201.23272C12.0282%200.405408%2012.0284%200.405271%2012.0286%200.405149C12.0286%200.405128%2012.0288%200.40502%2012.0288%200.404979C12.0289%200.404895%2012.029%200.40487%2012.0289%200.404904C12.0288%200.404972%2012.0284%200.405275%2012.0276%200.405807C12.026%200.406871%2012.0231%200.408855%2012.0188%200.411723C12.0102%200.417459%2011.9962%200.42673%2011.9771%200.439256C11.9388%200.464314%2011.8798%200.502364%2011.8018%200.551183C11.6458%200.648876%2011.414%200.789355%2011.1192%200.954928C10.5285%201.28684%209.69205%201.71554%208.71167%202.10263C6.71599%202.8906%204.2845%203.44196%202.13074%202.84824L1.87074%203.81179L1.61074%204.77533C4.39472%205.54277%207.32548%204.80459%209.45761%203.96274C10.5411%203.53492%2011.46%203.06365%2012.1086%202.6993C12.4335%202.51675%2012.6923%202.36003%2012.872%202.24756C12.9619%202.1913%2013.0321%202.14602%2013.081%202.11403C13.1055%202.09803%2013.1246%202.08534%2013.1382%202.07625C13.145%202.0717%2013.1504%202.06806%2013.1545%202.06534C13.1565%202.06399%2013.1581%202.06286%2013.1594%202.06198C13.1601%202.06154%2013.1606%202.06115%2013.1611%202.06083C13.1614%202.06067%2013.1617%202.06047%2013.1618%202.06039C13.162%202.06021%2013.1623%202.06004%2012.5952%201.23272ZM1.87074%203.81179C0.922051%203.48837%200.921877%203.48889%200.921684%203.48947C0.921593%203.48974%200.92138%203.49037%200.921199%203.49092C0.920836%203.49201%200.920395%203.49333%200.919878%203.4949C0.918842%203.49802%200.9175%203.5021%200.915863%203.50711C0.912588%203.51713%200.908135%203.5309%200.9026%203.54832C0.891531%203.58316%200.876135%203.63262%200.857201%203.69594C0.819341%203.82255%200.767288%204.00472%200.707393%204.23635C0.587677%204.6993%200.436175%205.36153%200.30413%206.17379C0.0407089%207.79419%20-0.148984%2010.0341%200.158825%2012.4906C0.780892%2017.455%203.44239%2023.2589%2011.3952%2026.5493L11.7726%2025.626L12.15%2024.7028C4.98209%2021.7372%202.69267%2016.634%202.14399%2012.2553C1.86642%2010.0401%202.0364%207.99952%202.27899%206.50725C2.39995%205.76317%202.53804%205.16104%202.64466%204.74871C2.69794%204.54269%202.74324%204.3845%202.77445%204.28014C2.79005%204.22798%202.80211%204.18931%202.80987%204.1649C2.81374%204.15269%202.81655%204.14405%202.81817%204.13907C2.81899%204.13658%202.81951%204.135%202.81972%204.13435C2.81983%204.13403%202.81986%204.13394%202.81981%204.13408C2.81979%204.13415%202.81969%204.13443%202.81968%204.13447C2.81957%204.13481%202.81943%204.13521%201.87074%203.81179ZM11.7726%2025.626L12.108%2026.5701C20.2456%2023.7309%2023.2865%2018.0972%2024.2432%2013.1809C24.7168%2010.7469%2024.6802%208.50039%2024.5277%206.8672C24.4513%206.04866%2024.3453%205.37876%2024.2574%204.90953C24.2134%204.67477%2024.1738%204.48981%2024.1447%204.36111C24.1301%204.29674%2024.1181%204.24641%2024.1094%204.21091C24.105%204.19316%2024.1015%204.17912%2024.0989%204.16888C24.0976%204.16376%2024.0966%204.1596%2024.0957%204.15639C24.0953%204.15479%2024.095%204.15343%2024.0947%204.15231C24.0945%204.15175%2024.0944%204.15109%2024.0943%204.15081C24.0941%204.15022%2024.094%204.14968%2023.1264%204.39673C22.1587%204.64378%2022.1586%204.64336%2022.1585%204.64301C22.1585%204.64297%2022.1584%204.64267%2022.1584%204.64259C22.1584%204.64244%2022.1584%204.64252%2022.1585%204.64284C22.1586%204.64347%2022.159%204.64505%2022.1597%204.64755C22.1609%204.65257%2022.1631%204.6613%2022.1662%204.67365C22.1722%204.69836%2022.1816%204.73753%2022.1936%204.79037C22.2175%204.89609%2022.2519%205.05633%2022.2909%205.26477C22.3691%205.68194%2022.4658%206.2904%2022.5357%207.03968C22.6759%208.54213%2022.7068%2010.5891%2022.2792%2012.7866C21.4334%2017.1332%2018.7974%2022.1141%2011.4372%2024.682L11.7726%2025.626Z%22%20fill%3D%22white%22%20mask%3D%22url\(%23stroke1_696_8896\)%22%2F%3E%3Cpath%20d%3D%22M12.7982%2018.6179C16.1989%2018.4641%2018.8078%2015.7456%2018.6252%2012.5461C18.4427%209.34656%2015.5378%206.87751%2012.137%207.03132C8.73627%207.18513%206.1274%209.90355%206.30996%2013.1031C6.49252%2016.3026%209.39739%2018.7717%2012.7982%2018.6179Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M11.7845%2016.0567L11.7782%2016.057C11.5591%2016.0653%2011.3451%2015.988%2011.1848%2015.843L8.33674%2013.2645C8.00913%2012.9681%207.99235%2012.4747%208.29919%2012.1629C8.60578%2011.8509%209.11979%2011.8384%209.44741%2012.135L11.6853%2014.1612L15.3696%2010.194C15.6671%209.87369%2016.1805%209.84733%2016.5165%2010.1349C16.8524%2010.4228%2016.8838%2010.9152%2016.5865%2011.2355L12.3486%2015.799C12.2046%2015.9543%2012.0014%2016.0469%2011.7845%2016.0567%22%20fill%3D%22%231E81E8%22%2F%3E%3Cdefs%3E%3Cpath%20id%3D%22stroke0_696_8896%22%20d%3D%22M23.1264%204.39673C18.1309%205.46192%2012.5952%201.23272%2012.5952%201.23272C12.5952%201.23272%206.80847%205.17294%201.87074%203.81179C1.87074%203.81179%20-3.34811%2019.3701%2011.7726%2025.626C27.2704%2020.219%2023.1264%204.39673%2023.1264%204.39673Z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fdefs%3E%3C%2Fsvg%3E);background-position:50%;background-repeat:no-repeat;background-size:contain;border:none;border-radius:0}.ttdk-avatar[data-size=xs] .ttdk-avatar-status[data-status=verified]{width:8px;height:8.5px}.ttdk-avatar[data-size=sm] .ttdk-avatar-status[data-status=verified]{width:12px;height:12.75px}.ttdk-avatar[data-size=md] .ttdk-avatar-status[data-status=verified]{width:16px;height:17px}.ttdk-avatar[data-size=lg] .ttdk-avatar-status[data-status=verified]{width:20px;height:21.25px}.ttdk-avatar[data-size=xl] .ttdk-avatar-status[data-status=verified]{width:24px;height:25.5px}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
|
|
5
|
+
export type AvatarUiProps = UiProps;
|
|
6
|
+
export interface AvatarProps {
|
|
7
|
+
/**
|
|
8
|
+
* URL gambar profil avatar.
|
|
9
|
+
* Jika kosong atau gagal dimuat, tampilan otomatis beralih ke `initials` atau ikon pengguna bawaan.
|
|
10
|
+
*/
|
|
11
|
+
src?: string;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Teks alternatif (alt) untuk elemen gambar avatar.
|
|
15
|
+
*/
|
|
16
|
+
alt?: string;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Teks inisial pengguna yang ditampilkan di dalam lingkaran avatar (misal: "NA", "SR").
|
|
20
|
+
* Ditampilkan apabila `src` tidak tersedia atau gagal dimuat.
|
|
21
|
+
*/
|
|
22
|
+
initials?: string;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Skala ukuran avatar:
|
|
26
|
+
* - `'xs'`: Lingkaran 28px.
|
|
27
|
+
* - `'sm'`: Lingkaran 32px.
|
|
28
|
+
* - `'md'`: Lingkaran 40px (standar).
|
|
29
|
+
* - `'lg'`: Lingkaran 48px.
|
|
30
|
+
* - `'xl'`: Lingkaran 56px.
|
|
31
|
+
*
|
|
32
|
+
* @default 'md'
|
|
33
|
+
*/
|
|
34
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl";
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Varian warna semantik untuk latar & teks/ikon fallback avatar:
|
|
38
|
+
* - `'info'`: Biru informasi sesuai standar profil (default).
|
|
39
|
+
* - `'primary'`: Brand Teal utama.
|
|
40
|
+
* - `'success'`: Hijau sukses.
|
|
41
|
+
* - `'warning'`: Kuning / amber peringatan.
|
|
42
|
+
* - `'danger'`: Merah bahaya.
|
|
43
|
+
* - `'neutral'`: Abu-abu netral.
|
|
44
|
+
*
|
|
45
|
+
* @default 'info'
|
|
46
|
+
*/
|
|
47
|
+
variant?: "info" | "primary" | "success" | "warning" | "danger" | "neutral";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Sudut kelengkungan lingkaran avatar:
|
|
51
|
+
* - `'full'`: Lingkaran penuh 9999px (default).
|
|
52
|
+
* - `'lg'`: Radius membulat 12px.
|
|
53
|
+
* - `'md'`: Radius sedang 8px.
|
|
54
|
+
* - `'sm'`: Radius halus 4px.
|
|
55
|
+
* - `'none'`: Persegi tajam 0px.
|
|
56
|
+
*
|
|
57
|
+
* @default 'full'
|
|
58
|
+
*/
|
|
59
|
+
rounded?: "none" | "sm" | "md" | "lg" | "full";
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Indikator status kehadiran atau verifikasi di pojok kanan bawah lingkaran avatar:
|
|
63
|
+
* - `'online'`: Titik hijau status aktif.
|
|
64
|
+
* - `'offline'`: Titik abu-abu status luring.
|
|
65
|
+
* - `'verified'`: Lencana perisai biru terverifikasi.
|
|
66
|
+
*/
|
|
67
|
+
status?: "online" | "offline" | "verified";
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Ikon kustom untuk menggantikan ikon pengguna bawaan saat `src` dan `initials` tidak diisi.
|
|
71
|
+
*/
|
|
72
|
+
icon?: any;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Warna kustom untuk ikon di dalam avatar.
|
|
76
|
+
*/
|
|
77
|
+
iconColor?: string;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Menjadikan komponen avatar interaktif (memiliki efek hover & fokus keyboard).
|
|
81
|
+
* @default false
|
|
82
|
+
*/
|
|
83
|
+
interactive?: boolean;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Menonaktifkan interaksi klik pada avatar.
|
|
87
|
+
* @default false
|
|
88
|
+
*/
|
|
89
|
+
disabled?: boolean;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Event handler saat komponen avatar diklik.
|
|
93
|
+
*/
|
|
94
|
+
onClick?: (event?: any) => void;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Event handler saat gambar `src` gagal dimuat.
|
|
98
|
+
*/
|
|
99
|
+
onImageError?: (event?: any) => void;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Kustomisasi visual granular pada elemen root melalui style-like object (+ support pseudo-class: hover, active).
|
|
103
|
+
*/
|
|
104
|
+
ui?: UiProps;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Inline CSS style object native pada elemen root.
|
|
108
|
+
*/
|
|
109
|
+
style?: React.CSSProperties;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Style kustom untuk elemen gambar `<img>` di dalam avatar (UiProps).
|
|
113
|
+
*/
|
|
114
|
+
imageStyle?: UiProps;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Class CSS kustom untuk elemen gambar `<img>`.
|
|
118
|
+
*/
|
|
119
|
+
imageClass?: string;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Class CSS kustom pada elemen root.
|
|
123
|
+
*/
|
|
124
|
+
className?: string;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Slot konten tambahan atau pengganti ikon di dalam avatar.
|
|
128
|
+
*/
|
|
129
|
+
children?: any;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Komponen Avatar untuk menampilkan foto profil, inisial nama, atau ikon pengguna.
|
|
134
|
+
*/
|
|
135
|
+
|
|
136
|
+
import { buildUiVars, UiProps } from "../../core/types";
|
|
137
|
+
|
|
138
|
+
function Avatar(props: AvatarProps) {
|
|
139
|
+
const [hasImageError, setHasImageError] = useState(() => false);
|
|
140
|
+
|
|
141
|
+
function handleImgError(event: any) {
|
|
142
|
+
setHasImageError(true);
|
|
143
|
+
props.onImageError?.(event);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function handleClick(event: any) {
|
|
147
|
+
if (props.disabled) return;
|
|
148
|
+
props.onClick?.(event);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function handleKeyDown(event: any) {
|
|
152
|
+
if (props.disabled) return;
|
|
153
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
154
|
+
event.preventDefault();
|
|
155
|
+
props.onClick?.(event);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return (
|
|
160
|
+
<span
|
|
161
|
+
className={`ttdk-avatar ${props.className || ""}`.trim()}
|
|
162
|
+
data-size={props.size || "md"}
|
|
163
|
+
data-variant={props.variant || "info"}
|
|
164
|
+
data-rounded={props.rounded || "full"}
|
|
165
|
+
data-mode={
|
|
166
|
+
props.src && !hasImageError
|
|
167
|
+
? "image"
|
|
168
|
+
: props.initials
|
|
169
|
+
? "initials"
|
|
170
|
+
: "icon"
|
|
171
|
+
}
|
|
172
|
+
data-interactive={
|
|
173
|
+
Boolean(props.interactive || props.onClick) ? "true" : "false"
|
|
174
|
+
}
|
|
175
|
+
data-disabled={props.disabled ? "true" : "false"}
|
|
176
|
+
role={props.interactive || props.onClick ? "button" : undefined}
|
|
177
|
+
tabIndex={
|
|
178
|
+
props.disabled ? -1 : props.interactive || props.onClick ? 0 : undefined
|
|
179
|
+
}
|
|
180
|
+
aria-disabled={props.disabled ? "true" : undefined}
|
|
181
|
+
style={{
|
|
182
|
+
...buildUiVars(props.ui),
|
|
183
|
+
...(props.iconColor
|
|
184
|
+
? {
|
|
185
|
+
"--ttdk-ui-icon-color": props.iconColor,
|
|
186
|
+
}
|
|
187
|
+
: {}),
|
|
188
|
+
...((props as any)["style"] || {}),
|
|
189
|
+
...props.style,
|
|
190
|
+
}}
|
|
191
|
+
onClick={(event) => handleClick(event)}
|
|
192
|
+
onKeyDown={(event) => handleKeyDown(event)}
|
|
193
|
+
>
|
|
194
|
+
{props.src && !hasImageError ? (
|
|
195
|
+
<img
|
|
196
|
+
className={`ttdk-avatar-image ${props.imageClass || ""}`.trim()}
|
|
197
|
+
src={props.src}
|
|
198
|
+
alt={props.alt || props.initials || "Avatar"}
|
|
199
|
+
style={{
|
|
200
|
+
...buildUiVars(props.imageStyle),
|
|
201
|
+
}}
|
|
202
|
+
onError={(event) => handleImgError(event)}
|
|
203
|
+
/>
|
|
204
|
+
) : null}
|
|
205
|
+
{(!props.src || hasImageError) && props.initials ? (
|
|
206
|
+
<span className="ttdk-avatar-initials">{props.initials}</span>
|
|
207
|
+
) : null}
|
|
208
|
+
{(!props.src || hasImageError) && !props.initials ? (
|
|
209
|
+
<>
|
|
210
|
+
{props.icon ? (
|
|
211
|
+
<span className="ttdk-avatar-icon">{props.icon}</span>
|
|
212
|
+
) : null}
|
|
213
|
+
{!props.icon ? (
|
|
214
|
+
<span className="ttdk-avatar-icon" aria-hidden="true">
|
|
215
|
+
<>{props.children}</>
|
|
216
|
+
</span>
|
|
217
|
+
) : null}
|
|
218
|
+
</>
|
|
219
|
+
) : null}
|
|
220
|
+
{props.status ? (
|
|
221
|
+
<span
|
|
222
|
+
className="ttdk-avatar-status"
|
|
223
|
+
data-status={props.status}
|
|
224
|
+
aria-label={props.status}
|
|
225
|
+
/>
|
|
226
|
+
) : null}
|
|
227
|
+
</span>
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export default Avatar;
|
|
232
|
+
|
|
233
|
+
export { Avatar };
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ttdk-design-system/avatar",
|
|
3
|
+
"component": "Avatar",
|
|
4
|
+
"folder": "avatar",
|
|
5
|
+
"description": "Komponen Avatar untuk menampilkan foto profil, inisial nama, atau ikon pengguna.",
|
|
6
|
+
"stylesheets": [
|
|
7
|
+
{
|
|
8
|
+
"theme": "common",
|
|
9
|
+
"file": "avatar.css",
|
|
10
|
+
"importPath": "web/avatar/avatar.css"
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"props": {
|
|
14
|
+
"src": {
|
|
15
|
+
"name": "src",
|
|
16
|
+
"type": "string",
|
|
17
|
+
"optional": true,
|
|
18
|
+
"default": null,
|
|
19
|
+
"description": "URL gambar profil avatar. Jika kosong atau gagal dimuat, tampilan otomatis beralih ke `initials` atau ikon pengguna bawaan.",
|
|
20
|
+
"example": null,
|
|
21
|
+
"param": null
|
|
22
|
+
},
|
|
23
|
+
"alt": {
|
|
24
|
+
"name": "alt",
|
|
25
|
+
"type": "string",
|
|
26
|
+
"optional": true,
|
|
27
|
+
"default": null,
|
|
28
|
+
"description": "Teks alternatif (alt) untuk elemen gambar avatar.",
|
|
29
|
+
"example": null,
|
|
30
|
+
"param": null
|
|
31
|
+
},
|
|
32
|
+
"initials": {
|
|
33
|
+
"name": "initials",
|
|
34
|
+
"type": "string",
|
|
35
|
+
"optional": true,
|
|
36
|
+
"default": null,
|
|
37
|
+
"description": "Teks inisial pengguna yang ditampilkan di dalam lingkaran avatar (misal: \"NA\", \"SR\"). Ditampilkan apabila `src` tidak tersedia atau gagal dimuat.",
|
|
38
|
+
"example": null,
|
|
39
|
+
"param": null
|
|
40
|
+
},
|
|
41
|
+
"size": {
|
|
42
|
+
"name": "size",
|
|
43
|
+
"type": "'xs' | 'sm' | 'md' | 'lg' | 'xl'",
|
|
44
|
+
"optional": true,
|
|
45
|
+
"default": "md",
|
|
46
|
+
"description": "Skala ukuran avatar: - `'xs'`: Lingkaran 28px. - `'sm'`: Lingkaran 32px. - `'md'`: Lingkaran 40px (standar). - `'lg'`: Lingkaran 48px. - `'xl'`: Lingkaran 56px.",
|
|
47
|
+
"example": null,
|
|
48
|
+
"param": null
|
|
49
|
+
},
|
|
50
|
+
"variant": {
|
|
51
|
+
"name": "variant",
|
|
52
|
+
"type": "'info' | 'primary' | 'success' | 'warning' | 'danger' | 'neutral'",
|
|
53
|
+
"optional": true,
|
|
54
|
+
"default": "info",
|
|
55
|
+
"description": "Varian warna semantik untuk latar & teks/ikon fallback avatar: - `'info'`: Biru informasi sesuai standar profil (default). - `'primary'`: Brand Teal utama. - `'success'`: Hijau sukses. - `'warning'`: Kuning / amber peringatan. - `'danger'`: Merah bahaya. - `'neutral'`: Abu-abu netral.",
|
|
56
|
+
"example": null,
|
|
57
|
+
"param": null
|
|
58
|
+
},
|
|
59
|
+
"rounded": {
|
|
60
|
+
"name": "rounded",
|
|
61
|
+
"type": "'none' | 'sm' | 'md' | 'lg' | 'full'",
|
|
62
|
+
"optional": true,
|
|
63
|
+
"default": "full",
|
|
64
|
+
"description": "Sudut kelengkungan lingkaran avatar: - `'full'`: Lingkaran penuh 9999px (default). - `'lg'`: Radius membulat 12px. - `'md'`: Radius sedang 8px. - `'sm'`: Radius halus 4px. - `'none'`: Persegi tajam 0px.",
|
|
65
|
+
"example": null,
|
|
66
|
+
"param": null
|
|
67
|
+
},
|
|
68
|
+
"status": {
|
|
69
|
+
"name": "status",
|
|
70
|
+
"type": "'online' | 'offline' | 'verified'",
|
|
71
|
+
"optional": true,
|
|
72
|
+
"default": null,
|
|
73
|
+
"description": "Indikator status kehadiran atau verifikasi di pojok kanan bawah lingkaran avatar: - `'online'`: Titik hijau status aktif. - `'offline'`: Titik abu-abu status luring. - `'verified'`: Lencana perisai biru terverifikasi.",
|
|
74
|
+
"example": null,
|
|
75
|
+
"param": null
|
|
76
|
+
},
|
|
77
|
+
"icon": {
|
|
78
|
+
"name": "icon",
|
|
79
|
+
"type": "any",
|
|
80
|
+
"optional": true,
|
|
81
|
+
"default": null,
|
|
82
|
+
"description": "Ikon kustom untuk menggantikan ikon pengguna bawaan saat `src` dan `initials` tidak diisi.",
|
|
83
|
+
"example": null,
|
|
84
|
+
"param": null
|
|
85
|
+
},
|
|
86
|
+
"iconColor": {
|
|
87
|
+
"name": "iconColor",
|
|
88
|
+
"type": "string",
|
|
89
|
+
"optional": true,
|
|
90
|
+
"default": null,
|
|
91
|
+
"description": "Warna kustom untuk ikon di dalam avatar.",
|
|
92
|
+
"example": null,
|
|
93
|
+
"param": null
|
|
94
|
+
},
|
|
95
|
+
"interactive": {
|
|
96
|
+
"name": "interactive",
|
|
97
|
+
"type": "boolean",
|
|
98
|
+
"optional": true,
|
|
99
|
+
"default": "false",
|
|
100
|
+
"description": "Menjadikan komponen avatar interaktif (memiliki efek hover & fokus keyboard).",
|
|
101
|
+
"example": null,
|
|
102
|
+
"param": null
|
|
103
|
+
},
|
|
104
|
+
"disabled": {
|
|
105
|
+
"name": "disabled",
|
|
106
|
+
"type": "boolean",
|
|
107
|
+
"optional": true,
|
|
108
|
+
"default": "false",
|
|
109
|
+
"description": "Menonaktifkan interaksi klik pada avatar.",
|
|
110
|
+
"example": null,
|
|
111
|
+
"param": null
|
|
112
|
+
},
|
|
113
|
+
"onClick": {
|
|
114
|
+
"name": "onClick",
|
|
115
|
+
"type": "(event?: any) => void",
|
|
116
|
+
"optional": true,
|
|
117
|
+
"default": null,
|
|
118
|
+
"description": "Event handler saat komponen avatar diklik.",
|
|
119
|
+
"example": null,
|
|
120
|
+
"param": null
|
|
121
|
+
},
|
|
122
|
+
"onImageError": {
|
|
123
|
+
"name": "onImageError",
|
|
124
|
+
"type": "(event?: any) => void",
|
|
125
|
+
"optional": true,
|
|
126
|
+
"default": null,
|
|
127
|
+
"description": "Event handler saat gambar `src` gagal dimuat.",
|
|
128
|
+
"example": null,
|
|
129
|
+
"param": null
|
|
130
|
+
},
|
|
131
|
+
"ui": {
|
|
132
|
+
"name": "ui",
|
|
133
|
+
"type": "UiProps",
|
|
134
|
+
"optional": true,
|
|
135
|
+
"default": null,
|
|
136
|
+
"description": "Kustomisasi visual granular pada elemen root melalui style-like object (+ support pseudo-class: hover, active).",
|
|
137
|
+
"example": null,
|
|
138
|
+
"param": null
|
|
139
|
+
},
|
|
140
|
+
"style": {
|
|
141
|
+
"name": "style",
|
|
142
|
+
"type": "any",
|
|
143
|
+
"optional": true,
|
|
144
|
+
"default": null,
|
|
145
|
+
"description": "Inline CSS style object native pada elemen root.",
|
|
146
|
+
"example": null,
|
|
147
|
+
"param": null
|
|
148
|
+
},
|
|
149
|
+
"imageStyle": {
|
|
150
|
+
"name": "imageStyle",
|
|
151
|
+
"type": "UiProps",
|
|
152
|
+
"optional": true,
|
|
153
|
+
"default": null,
|
|
154
|
+
"description": "Style kustom untuk elemen gambar `<img>` di dalam avatar (UiProps).",
|
|
155
|
+
"example": null,
|
|
156
|
+
"param": null
|
|
157
|
+
},
|
|
158
|
+
"imageClass": {
|
|
159
|
+
"name": "imageClass",
|
|
160
|
+
"type": "string",
|
|
161
|
+
"optional": true,
|
|
162
|
+
"default": null,
|
|
163
|
+
"description": "Class CSS kustom untuk elemen gambar `<img>`.",
|
|
164
|
+
"example": null,
|
|
165
|
+
"param": null
|
|
166
|
+
},
|
|
167
|
+
"className": {
|
|
168
|
+
"name": "className",
|
|
169
|
+
"type": "string",
|
|
170
|
+
"optional": true,
|
|
171
|
+
"default": null,
|
|
172
|
+
"description": "Class CSS kustom pada elemen root.",
|
|
173
|
+
"example": null,
|
|
174
|
+
"param": null
|
|
175
|
+
},
|
|
176
|
+
"children": {
|
|
177
|
+
"name": "children",
|
|
178
|
+
"type": "any",
|
|
179
|
+
"optional": true,
|
|
180
|
+
"default": null,
|
|
181
|
+
"description": "Slot konten tambahan atau pengganti ikon di dalam avatar.",
|
|
182
|
+
"example": null,
|
|
183
|
+
"param": null
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"subInterfaces": {},
|
|
187
|
+
"supportedFrameworks": [
|
|
188
|
+
"react",
|
|
189
|
+
"vue",
|
|
190
|
+
"svelte"
|
|
191
|
+
],
|
|
192
|
+
"themes": [
|
|
193
|
+
"tw"
|
|
194
|
+
]
|
|
195
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# <Badge /> — TTDK Component Reference
|
|
2
|
+
|
|
3
|
+
TTDK Badge component with multi-theme support.
|
|
4
|
+
|
|
5
|
+
## 1. Stylesheets & Theming (Pure CSS)
|
|
6
|
+
Import the corresponding stylesheet for the theme you wish to use:
|
|
7
|
+
- **COMMON Theme**: `import "@ttdk-design-system/library-<react|vue|svelte>/web/badge/badge.css";`
|
|
8
|
+
|
|
9
|
+
## 2. Subpath Component Import
|
|
10
|
+
```ts
|
|
11
|
+
// React
|
|
12
|
+
import Badge from "@ttdk-design-system/library-react/web/badge";
|
|
13
|
+
|
|
14
|
+
// Vue 3
|
|
15
|
+
import Badge from "@ttdk-design-system/library-vue/web/badge";
|
|
16
|
+
|
|
17
|
+
// Svelte
|
|
18
|
+
import Badge from "@ttdk-design-system/library-svelte/web/badge";
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 3. Props & API Reference
|
|
22
|
+
|
|
23
|
+
| Prop | Type | Default | Description |
|
|
24
|
+
| :--- | :--- | :--- | :--- |
|
|
25
|
+
| `label?` | `string` | `-` | Teks label yang ditampilkan di dalam badge (misal: "CSV", "Publik", "Aktif"). |
|
|
26
|
+
| `variant?` | `| 'primary'
|
|
27
|
+
| 'success'
|
|
28
|
+
| 'info'
|
|
29
|
+
| 'warning'
|
|
30
|
+
| 'danger'
|
|
31
|
+
| 'neutral'
|
|
32
|
+
| 'disabled'` | `primary` | Varian warna semantik tema badge: - `'primary'`: Brand Teal utama (#00B5AD). - `'success'`: Sukses hijau (#04B761). - `'info'`: Biru informasi (#2196F3). - `'warning'`: Peringatan kuning / amber (#F88000). - `'danger'`: Bahaya / merah (#D0021B). |
|
|
33
|
+
| `appearance?` | `'soft' | 'solid' | 'outline'` | `soft` | Gaya visual tampilan badge: - `'soft'`: Latar belakang lembut transparan dengan teks berwarna (default). - `'solid'`: Latar belakang pekat solid dengan teks kontras putih/gelap. - `'outline'`: Garis tepi tipis dengan latar belakang transparan. |
|
|
34
|
+
| `size?` | `'sm' | 'md' | 'lg'` | `md` | Skala ukuran badge: - `'sm'`: Kecil (tinggi 28px, font 12px). - `'md'`: Sedang (tinggi 32px, font 13px, standar). - `'lg'`: Besar (tinggi 38px, font 15px). |
|
|
35
|
+
| `rounded?` | `'none' | 'sm' | 'md' | 'lg' | 'full'` | `full` | Sudut kelengkungan badge: - `'none'`: Sudut tajam kotak (0px). - `'sm'`: Radius halus (4px). - `'md'`: Radius sedang (6px). - `'lg'`: Radius membulat (8px). - `'full'`: Pill-shaped membulat penuh (9999px, default). |
|
|
36
|
+
| `dot?` | `boolean` | `false` | Menampilkan titik indikator status (dot) di sisi kiri teks badge. |
|
|
37
|
+
| `dotColor?` | `string` | `-` | Warna kustom untuk titik indikator status (dot). |
|
|
38
|
+
| `dotStyle?` | `UiProps` | `-` | Style kustom untuk titik indikator status (UiProps / style object + pseudo support). |
|
|
39
|
+
| `dotClass?` | `string` | `-` | Class CSS kustom untuk titik indikator status. |
|
|
40
|
+
| `ui?` | `UiProps` | `-` | Kustomisasi visual granular melalui style-like object (+ support pseudo-class: hover, active). |
|
|
41
|
+
| `style?` | `any` | `-` | Inline CSS style object native. |
|
|
42
|
+
| `className?` | `string` | `-` | Class CSS kustom. |
|
|
43
|
+
| `children?` | `any` | `-` | Konten kustom atau ikon yang disisipkan ke dalam badge. |
|
|
44
|
+
|
|
45
|
+
## 4. Usage Examples
|
|
46
|
+
|
|
47
|
+
### React Example
|
|
48
|
+
```tsx
|
|
49
|
+
import Badge from "@ttdk-design-system/library-react/web/badge";
|
|
50
|
+
import "@ttdk-design-system/library-react/web/badge/badge.css";
|
|
51
|
+
|
|
52
|
+
export function Example() {
|
|
53
|
+
return (
|
|
54
|
+
<div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>
|
|
55
|
+
<Badge variant="default" label="Publik" />
|
|
56
|
+
<Badge variant="success" dot label="Aktif" />
|
|
57
|
+
<Badge variant="warning" appearance="solid" label="Dalam Review" />
|
|
58
|
+
<Badge variant="danger" appearance="outline" label="Gagal" />
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Vue 3 Example
|
|
65
|
+
```vue
|
|
66
|
+
<script setup lang="ts">
|
|
67
|
+
import Badge from "@ttdk-design-system/library-vue/web/badge";
|
|
68
|
+
import "@ttdk-design-system/library-vue/web/badge/badge.css";
|
|
69
|
+
</script>
|
|
70
|
+
|
|
71
|
+
<template>
|
|
72
|
+
<div style="display: flex; gap: 8px; align-items: center;">
|
|
73
|
+
<Badge variant="default" label="Publik" />
|
|
74
|
+
<Badge variant="success" :dot="true" label="Aktif" />
|
|
75
|
+
<Badge variant="warning" appearance="solid" label="Dalam Review" />
|
|
76
|
+
<Badge variant="danger" appearance="outline" label="Gagal" />
|
|
77
|
+
</div>
|
|
78
|
+
</template>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Svelte Example
|
|
82
|
+
```svelte
|
|
83
|
+
<script lang="ts">
|
|
84
|
+
import Badge from "@ttdk-design-system/library-svelte/web/badge";
|
|
85
|
+
import "@ttdk-design-system/library-svelte/web/badge/badge.css";
|
|
86
|
+
</script>
|
|
87
|
+
|
|
88
|
+
<div style="display: flex; gap: 8px; align-items: center;">
|
|
89
|
+
<Badge variant="default" label="Publik" />
|
|
90
|
+
<Badge variant="success" dot={true} label="Aktif" />
|
|
91
|
+
<Badge variant="warning" appearance="solid" label="Dalam Review" />
|
|
92
|
+
<Badge variant="danger" appearance="outline" label="Gagal" />
|
|
93
|
+
</div>
|
|
94
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.ttdk-badge{font-family:var(--ttdk-font-sans);font-weight:var(--ttdk-font-weight-medium,500);letter-spacing:.15px;box-sizing:border-box;user-select:none;white-space:nowrap;vertical-align:middle;border-radius:var(--ttdk-radius-full,9999px);border-style:solid;border-width:.8px;justify-content:center;align-items:center;gap:6px;line-height:100%;text-decoration:none;transition:all .15s cubic-bezier(.4,0,.2,1);display:inline-flex;position:relative}.ttdk-badge[data-size=xs]{min-width:45px;height:24px;padding:0 var(--ttdk-spacing-xs);border-width:.8px;font-size:11px}.ttdk-badge[data-size=sm]{min-width:55px;height:28px;font-size:var(--ttdk-font-size-12);letter-spacing:.15px;border-width:.8px;padding:0 10px;font-weight:500;line-height:1}.ttdk-badge[data-size=md]{letter-spacing:.15px;border-width:.8px;min-width:60px;height:32px;padding:0 14px;font-size:13px;font-weight:500;line-height:1}.ttdk-badge[data-size=lg]{letter-spacing:.15px;border-width:1px;min-width:60px;height:38px;padding:0 18px;font-size:15px;font-weight:500;line-height:1}.ttdk-badge[data-rounded=full]{border-radius:var(--ttdk-radius-full,9999px)}.ttdk-badge[data-rounded=lg]{border-radius:var(--ttdk-radius-md,12px)}.ttdk-badge[data-rounded=md]{border-radius:var(--ttdk-radius-sm,8px)}.ttdk-badge[data-rounded=sm]{border-radius:var(--ttdk-radius-xs,4px)}.ttdk-badge[data-rounded=none]{border-radius:var(--ttdk-radius-none,0px)}.ttdk-badge[data-appearance=soft][data-variant=primary]{background-color:var(--ttdk-brand-subtle);border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default)}.ttdk-badge[data-appearance=soft][data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle);border-color:var(--ttdk-stroke-status-success);color:var(--ttdk-text-icon-status-success)}.ttdk-badge[data-appearance=soft][data-variant=info]{background-color:var(--ttdk-bg-status-info-subtle);border-color:var(--ttdk-stroke-status-info);color:var(--ttdk-text-icon-status-info)}.ttdk-badge[data-appearance=soft][data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle);border-color:var(--ttdk-stroke-status-warning);color:var(--ttdk-text-icon-status-warning)}.ttdk-badge[data-appearance=soft][data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle);border-color:var(--ttdk-stroke-status-error);color:var(--ttdk-text-icon-status-error)}.ttdk-badge[data-variant=neutral],.ttdk-badge[data-appearance=soft][data-variant=neutral]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary)}.ttdk-badge[data-variant=disable],.ttdk-badge[data-variant=disabled],.ttdk-badge[data-appearance=soft][data-variant=disable],.ttdk-badge[data-appearance=soft][data-variant=disabled]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.ttdk-badge[data-appearance=solid][data-variant=primary]{background-color:var(--ttdk-brand-default);border-color:var(--ttdk-brand-default);color:var(--ttdk-color-white)}.ttdk-badge[data-appearance=solid][data-variant=success]{background-color:var(--ttdk-bg-status-success);border-color:var(--ttdk-bg-status-success);color:var(--ttdk-color-white)}.ttdk-badge[data-appearance=solid][data-variant=info]{background-color:var(--ttdk-bg-status-info);border-color:var(--ttdk-bg-status-info);color:var(--ttdk-color-white)}.ttdk-badge[data-appearance=solid][data-variant=warning]{background-color:var(--ttdk-bg-status-warning);border-color:var(--ttdk-bg-status-warning);color:var(--ttdk-color-black)}.ttdk-badge[data-appearance=solid][data-variant=danger]{background-color:var(--ttdk-bg-status-error);border-color:var(--ttdk-bg-status-error);color:var(--ttdk-color-white)}.ttdk-badge[data-appearance=solid][data-variant=neutral]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary)}.ttdk-badge[data-appearance=solid][data-variant=disable],.ttdk-badge[data-appearance=solid][data-variant=disabled]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.ttdk-badge[data-appearance=outline]{background-color:#0000}.ttdk-badge[data-appearance=outline][data-variant=primary]{border-color:var(--ttdk-brand-default);color:var(--ttdk-brand-default)}.ttdk-badge[data-appearance=outline][data-variant=success]{border-color:var(--ttdk-stroke-status-success);color:var(--ttdk-text-icon-status-success)}.ttdk-badge[data-appearance=outline][data-variant=info]{border-color:var(--ttdk-stroke-status-info);color:var(--ttdk-text-icon-status-info)}.ttdk-badge[data-appearance=outline][data-variant=warning]{border-color:var(--ttdk-stroke-status-warning);color:var(--ttdk-text-icon-status-warning)}.ttdk-badge[data-appearance=outline][data-variant=danger]{border-color:var(--ttdk-stroke-status-error);color:var(--ttdk-text-icon-status-error)}.ttdk-badge[data-appearance=outline][data-variant=neutral]{border-color:var(--ttdk-stroke-divider);color:var(--ttdk-text-icon-primary)}.ttdk-badge[data-appearance=outline][data-variant=disable],.ttdk-badge[data-appearance=outline][data-variant=disabled]{border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.dark .ttdk-badge[data-appearance=soft][data-variant=primary],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=primary]{background-color:var(--ttdk-brand-subtle-dark);border-color:var(--ttdk-brand-default)}.dark .ttdk-badge[data-appearance=soft][data-variant=success],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=success]{background-color:var(--ttdk-bg-status-success-subtle);border-color:var(--ttdk-stroke-status-success)}.dark .ttdk-badge[data-appearance=soft][data-variant=info],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=info]{background-color:var(--ttdk-bg-status-info-subtle);border-color:var(--ttdk-stroke-status-info)}.dark .ttdk-badge[data-appearance=soft][data-variant=warning],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=warning]{background-color:var(--ttdk-bg-status-warning-subtle);border-color:var(--ttdk-stroke-status-warning)}.dark .ttdk-badge[data-appearance=soft][data-variant=danger],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=danger]{background-color:var(--ttdk-bg-status-error-subtle);border-color:var(--ttdk-stroke-status-error)}.dark .ttdk-badge[data-appearance=solid][data-variant=neutral],[data-theme=dark] .ttdk-badge[data-appearance=solid][data-variant=neutral]{background-color:var(--ttdk-bg-stay-black);border-color:var(--ttdk-bg-stay-black);color:var(--ttdk-text-icon-stay-white)}.dark .ttdk-badge[data-appearance=soft][data-variant=neutral],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=neutral],.dark .ttdk-badge[data-variant=neutral],[data-theme=dark] .ttdk-badge[data-variant=neutral]{background-color:var(--ttdk-color-neutral-900);border-color:var(--ttdk-stroke-strong);color:var(--ttdk-text-icon-primary)}.dark .ttdk-badge[data-appearance=outline][data-variant=neutral],[data-theme=dark] .ttdk-badge[data-appearance=outline][data-variant=neutral]{background-color:var(--ttdk-bg-stay-black);border-color:var(--ttdk-stroke-stay-white);color:var(--ttdk-text-icon-primary)}.dark .ttdk-badge[data-appearance=soft][data-variant=disable],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=disable],.dark .ttdk-badge[data-appearance=soft][data-variant=disabled],[data-theme=dark] .ttdk-badge[data-appearance=soft][data-variant=disabled],.dark .ttdk-badge[data-variant=disable],[data-theme=dark] .ttdk-badge[data-variant=disable],.dark .ttdk-badge[data-variant=disabled],[data-theme=dark] .ttdk-badge[data-variant=disabled],.dark .ttdk-badge[data-appearance=solid][data-variant=disable],[data-theme=dark] .ttdk-badge[data-appearance=solid][data-variant=disable],.dark .ttdk-badge[data-appearance=solid][data-variant=disabled],[data-theme=dark] .ttdk-badge[data-appearance=solid][data-variant=disabled]{background-color:var(--ttdk-bg-secondary-disabled);border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled)}.dark .ttdk-badge[data-appearance=outline][data-variant=disable],[data-theme=dark] .ttdk-badge[data-appearance=outline][data-variant=disable],.dark .ttdk-badge[data-appearance=outline][data-variant=disabled],[data-theme=dark] .ttdk-badge[data-appearance=outline][data-variant=disabled]{border-color:var(--ttdk-stroke-subtle);color:var(--ttdk-text-icon-disabled);background-color:#0000}.ttdk-badge-dot{background-color:currentColor;border-radius:50%;flex-shrink:0;width:6px;height:6px;display:inline-block}.ttdk-badge[data-size=xs] .ttdk-badge-dot{width:4px;height:4px}.ttdk-badge[data-size=lg] .ttdk-badge-dot{width:8px;height:8px}
|