@krrli/cm-designsystem 1.20.1 → 1.20.3

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 (41) hide show
  1. package/dist/cm-designsystem.css +1 -1
  2. package/dist/components/accessible-button/AccessibleButton.d.ts +32 -0
  3. package/dist/components/accessible-button/AccessibleButton.js +15 -0
  4. package/dist/components/accessible-button/AccessibleButton.test.d.ts +1 -0
  5. package/dist/components/accessible-button/AccessibleButton.test.js +28 -0
  6. package/dist/components/avatar/Avatar.d.ts +51 -4
  7. package/dist/components/avatar/Avatar.js +9 -1
  8. package/dist/components/button/Button.d.ts +27 -15
  9. package/dist/components/button/Button.js +11 -7
  10. package/dist/components/button/Button.test.js +3 -3
  11. package/dist/components/file-upload/FileUpload.js +1 -1
  12. package/dist/components/icon-button/IconButton.d.ts +24 -5
  13. package/dist/components/icon-button/IconButton.js +8 -5
  14. package/dist/components/icon-button/IconButton.test.js +2 -2
  15. package/dist/components/icons/IconBase.js +2 -2
  16. package/dist/components/modal/Modal.test.js +2 -2
  17. package/dist/components/navi-button/NaviButton.d.ts +28 -5
  18. package/dist/components/navi-button/NaviButton.js +8 -3
  19. package/dist/components/navi-button/NaviButton.test.js +2 -2
  20. package/dist/components/navi-user-button/NaviUserButton.d.ts +24 -6
  21. package/dist/components/navi-user-button/NaviUserButton.js +8 -4
  22. package/dist/components/round-button/RoundButton.d.ts +23 -4
  23. package/dist/components/round-button/RoundButton.js +8 -3
  24. package/dist/components/round-button/RoundButton.test.js +3 -2
  25. package/dist/components/timed-button/TimedButton.d.ts +29 -6
  26. package/dist/components/timed-button/TimedButton.js +9 -6
  27. package/dist/components/timed-button/TimedButton.test.js +6 -5
  28. package/dist/components/typography/AccessibleTypography.d.ts +33 -0
  29. package/dist/components/typography/AccessibleTypography.js +11 -0
  30. package/dist/components/typography/Heading.d.ts +17 -10
  31. package/dist/components/typography/Heading.js +8 -8
  32. package/dist/components/typography/Label.d.ts +15 -8
  33. package/dist/components/typography/Label.js +8 -4
  34. package/dist/components/typography/Paragraph.d.ts +15 -8
  35. package/dist/components/typography/Paragraph.js +8 -4
  36. package/dist/components/typography/Placeholder.d.ts +12 -8
  37. package/dist/components/typography/Placeholder.js +8 -4
  38. package/dist/components/typography/ValidationMessage.d.ts +15 -8
  39. package/dist/components/typography/ValidationMessage.js +8 -6
  40. package/dist/index.es.js +2925 -3002
  41. package/package.json +57 -59
@@ -1 +1 @@
1
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--container-md:28rem;--tracking-normal:0em;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--color-black:oklch(0% 0 0);--color-white:oklch(100% 0 0);--color-error:oklch(57.7% .245 27.325);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-900:oklch(40.8% .153 2.432);--color-pink-950:oklch(28.4% .109 3.907);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-900:oklch(38% .189 293.745);--color-violet-950:oklch(28.3% .141 291.089);--spacing:4px;--font-poppins:Poppins,sans-serif;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{font-family:var(--font-poppins);color:var(--color-slate-600)}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-4\.5{top:calc(var(--spacing)*4.5)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.bottom-2{bottom:calc(var(--spacing)*2)}.left-1\/2{left:50%}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-1{margin:calc(var(--spacing)*1)}.m-\[\`\<spacing\>\`\]{margin:`<spacing>`}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-16{height:calc(var(--spacing)*16)}.h-24{height:calc(var(--spacing)*24)}.h-31\.25{height:calc(var(--spacing)*31.25)}.h-40{height:calc(var(--spacing)*40)}.h-\[44px\]{height:44px}.h-\[\`\<spacing\>\`\]{height:`<spacing>`}.min-h-10{min-height:calc(var(--spacing)*10)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-16{width:calc(var(--spacing)*16)}.w-24{width:calc(var(--spacing)*24)}.w-31\.25{width:calc(var(--spacing)*31.25)}.w-40{width:calc(var(--spacing)*40)}.w-\[\`\<spacing\>\`\]{width:`<spacing>`}.w-auto{width:auto}.w-full{width:100%}.max-w-md{max-width:var(--container-md)}.min-w-10{min-width:calc(var(--spacing)*10)}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-12{gap:calc(var(--spacing)*12)}.gap-16{gap:calc(var(--spacing)*16)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-6{border-style:var(--tw-border-style);border-width:6px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-solid{--tw-border-style:solid;border-style:solid}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.bg-black{background-color:var(--color-black)}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black)20%,transparent)}}.bg-error{background-color:var(--color-error)}.bg-pink-50{background-color:var(--color-pink-50)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-pink-200{background-color:var(--color-pink-200)}.bg-pink-300{background-color:var(--color-pink-300)}.bg-pink-400{background-color:var(--color-pink-400)}.bg-pink-500{background-color:var(--color-pink-500)}.bg-pink-600{background-color:var(--color-pink-600)}.bg-pink-700{background-color:var(--color-pink-700)}.bg-pink-800{background-color:var(--color-pink-800)}.bg-pink-900{background-color:var(--color-pink-900)}.bg-pink-950{background-color:var(--color-pink-950)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-500{background-color:var(--color-slate-500)}.bg-slate-600{background-color:var(--color-slate-600)}.bg-slate-700{background-color:var(--color-slate-700)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950{background-color:var(--color-slate-950)}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-violet-200{background-color:var(--color-violet-200)}.bg-violet-300{background-color:var(--color-violet-300)}.bg-violet-400{background-color:var(--color-violet-400)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-600{background-color:var(--color-violet-600)}.bg-violet-700{background-color:var(--color-violet-700)}.bg-violet-800{background-color:var(--color-violet-800)}.bg-violet-900{background-color:var(--color-violet-900)}.bg-violet-950{background-color:var(--color-violet-950)}.bg-white{background-color:var(--color-white)}.bg-linear-to-r{--tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab,red,red)){.bg-linear-to-r{--tw-gradient-position:to right in oklab}}.bg-linear-to-r{background-image:linear-gradient(var(--tw-gradient-stops))}.from-pink-500{--tw-gradient-from:var(--color-pink-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-0\%{--tw-gradient-from-position:0%}.to-violet-600{--tw-gradient-to:var(--color-violet-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-100\%{--tw-gradient-to-position:100%}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.p-10{padding:calc(var(--spacing)*10)}.p-\[\`\<spacing\>\`\]{padding:`<spacing>`}.px-3{padding-inline:calc(var(--spacing)*3)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-12{padding-top:calc(var(--spacing)*12)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-6{padding-right:calc(var(--spacing)*6)}.pr-8{padding-right:calc(var(--spacing)*8)}.pr-10{padding-right:calc(var(--spacing)*10)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pb-12{padding-bottom:calc(var(--spacing)*12)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.align-middle{vertical-align:middle}.text-\[14px\]\/\[100\%\]{font-size:14px;line-height:100%}.text-\[16px\]\/\[100\%\]{font-size:16px;line-height:100%}.text-\[18px\]\/\[140\%\]{font-size:18px;line-height:140%}.text-\[20px\]\/\[100\%\]{font-size:20px;line-height:100%}.text-\[20px\]\/\[135\%\]{font-size:20px;line-height:135%}.text-\[24px\]\/\[100\%\]{font-size:24px;line-height:100%}.text-\[24px\]\/\[125\%\]{font-size:24px;line-height:125%}.text-\[24px\]\/\[145\%\]{font-size:24px;line-height:145%}.text-\[32px\]\/\[125\%\]{font-size:32px;line-height:125%}.text-\[40px\]\/\[125\%\]{font-size:40px;line-height:125%}.text-\[48px\]\/\[125\%\]{font-size:48px;line-height:125%}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.text-black{color:var(--color-black)}.text-error{color:var(--color-error)}.text-inherit{color:inherit}.text-pink-50{color:var(--color-pink-50)}.text-pink-100{color:var(--color-pink-100)}.text-pink-200{color:var(--color-pink-200)}.text-pink-300{color:var(--color-pink-300)}.text-pink-400{color:var(--color-pink-400)}.text-pink-500{color:var(--color-pink-500)}.text-pink-600{color:var(--color-pink-600)}.text-pink-700{color:var(--color-pink-700)}.text-pink-800{color:var(--color-pink-800)}.text-pink-900{color:var(--color-pink-900)}.text-pink-950{color:var(--color-pink-950)}.text-slate-50{color:var(--color-slate-50)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-violet-50{color:var(--color-violet-50)}.text-violet-100{color:var(--color-violet-100)}.text-violet-200{color:var(--color-violet-200)}.text-violet-300{color:var(--color-violet-300)}.text-violet-400{color:var(--color-violet-400)}.text-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-700{color:var(--color-violet-700)}.text-violet-800{color:var(--color-violet-800)}.text-violet-900{color:var(--color-violet-900)}.text-violet-950{color:var(--color-violet-950)}.text-white{color:var(--color-white)}.underline{text-decoration-line:underline}.decoration-violet-600{-webkit-text-decoration-color:var(--color-violet-600);text-decoration-color:var(--color-violet-600)}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-100{opacity:1}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-350{--tw-duration:.35s;transition-duration:.35s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}.group-hover\:hidden:is(:where(.group):hover *){display:none}.group-hover\:pr-6:is(:where(.group):hover *){padding-right:calc(var(--spacing)*6)}.group-hover\:pl-6:is(:where(.group):hover *){padding-left:calc(var(--spacing)*6)}.group-hover\:text-slate-800:is(:where(.group):hover *){color:var(--color-slate-800)}}.placeholder\:text-\[16px\]\/\[100\%\]::placeholder{font-size:16px;line-height:100%}.placeholder\:text-\[20px\]\/\[135\%\]::placeholder{font-size:20px;line-height:135%}.placeholder\:font-medium::placeholder{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:tracking-normal::placeholder{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.placeholder\:text-slate-300::placeholder{color:var(--color-slate-300)}.placeholder\:text-slate-500::placeholder{color:var(--color-slate-500)}.focus-within\:ring-violet-600:focus-within{--tw-ring-color:var(--color-violet-600)}@media(hover:hover){.hover\:scale-95:hover{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:bg-pink-50:hover{background-color:var(--color-pink-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-300:hover{background-color:var(--color-slate-300)}.hover\:bg-slate-700:hover{background-color:var(--color-slate-700)}.hover\:bg-violet-50:hover{background-color:var(--color-violet-50)}.hover\:bg-violet-700:hover{background-color:var(--color-violet-700)}.hover\:to-80\%:hover{--tw-gradient-to-position:80%}.hover\:text-pink-600:hover{color:var(--color-pink-600)}.hover\:text-slate-600:hover{color:var(--color-slate-600)}.hover\:text-violet-600:hover{color:var(--color-violet-600)}.hover\:text-violet-900:hover{color:var(--color-violet-900)}.hover\:decoration-violet-200:hover{-webkit-text-decoration-color:var(--color-violet-200);text-decoration-color:var(--color-violet-200)}.hover\:ring-2:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-3:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-slate-100:hover{--tw-ring-color:var(--color-slate-100)}.hover\:ring-slate-300:hover{--tw-ring-color:var(--color-slate-300)}.hover\:ring-violet-100:hover{--tw-ring-color:var(--color-violet-100)}.hover\:ring-violet-600:hover{--tw-ring-color:var(--color-violet-600)}.hover\:transition-all:hover{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.hover\:duration-300:hover{--tw-duration:.3s;transition-duration:.3s}.hover\:duration-350:hover{--tw-duration:.35s;transition-duration:.35s}.hover\:ease-in-out:hover{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.hover\:ease-out:hover{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-violet-600:focus{--tw-ring-color:var(--color-violet-600)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-violet-600:focus-visible{--tw-ring-color:var(--color-violet-600)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:to-70\%:active{--tw-gradient-to-position:70%}.active\:ring-4:active{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.active\:ring-violet-200:active{--tw-ring-color:var(--color-violet-200)}.active\:duration-300:active{--tw-duration:.3s;transition-duration:.3s}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--container-md:28rem;--tracking-normal:0em;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--color-black:oklch(0% 0 0);--color-white:oklch(100% 0 0);--color-error:oklch(57.7% .245 27.325);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-900:oklch(40.8% .153 2.432);--color-pink-950:oklch(28.4% .109 3.907);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-900:oklch(38% .189 293.745);--color-violet-950:oklch(28.3% .141 291.089);--spacing:4px;--font-poppins:Poppins,sans-serif;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{font-family:var(--font-poppins);color:var(--color-slate-600)}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-4\.5{top:calc(var(--spacing)*4.5)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.bottom-2{bottom:calc(var(--spacing)*2)}.left-1\/2{left:50%}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-1{margin:calc(var(--spacing)*1)}.m-\[\`\<spacing\>\`\]{margin:`<spacing>`}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-16{height:calc(var(--spacing)*16)}.h-24{height:calc(var(--spacing)*24)}.h-31\.25{height:calc(var(--spacing)*31.25)}.h-40{height:calc(var(--spacing)*40)}.h-\[44px\]{height:44px}.h-\[\`\<spacing\>\`\]{height:`<spacing>`}.min-h-10{min-height:calc(var(--spacing)*10)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-16{width:calc(var(--spacing)*16)}.w-24{width:calc(var(--spacing)*24)}.w-31\.25{width:calc(var(--spacing)*31.25)}.w-40{width:calc(var(--spacing)*40)}.w-\[\`\<spacing\>\`\]{width:`<spacing>`}.w-auto{width:auto}.w-full{width:100%}.max-w-md{max-width:var(--container-md)}.min-w-10{min-width:calc(var(--spacing)*10)}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-12{gap:calc(var(--spacing)*12)}.gap-16{gap:calc(var(--spacing)*16)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-6{border-style:var(--tw-border-style);border-width:6px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-solid{--tw-border-style:solid;border-style:solid}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.bg-black{background-color:var(--color-black)}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black)20%,transparent)}}.bg-error{background-color:var(--color-error)}.bg-pink-50{background-color:var(--color-pink-50)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-pink-200{background-color:var(--color-pink-200)}.bg-pink-300{background-color:var(--color-pink-300)}.bg-pink-400{background-color:var(--color-pink-400)}.bg-pink-500{background-color:var(--color-pink-500)}.bg-pink-600{background-color:var(--color-pink-600)}.bg-pink-700{background-color:var(--color-pink-700)}.bg-pink-800{background-color:var(--color-pink-800)}.bg-pink-900{background-color:var(--color-pink-900)}.bg-pink-950{background-color:var(--color-pink-950)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-500{background-color:var(--color-slate-500)}.bg-slate-600{background-color:var(--color-slate-600)}.bg-slate-700{background-color:var(--color-slate-700)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950{background-color:var(--color-slate-950)}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-violet-200{background-color:var(--color-violet-200)}.bg-violet-300{background-color:var(--color-violet-300)}.bg-violet-400{background-color:var(--color-violet-400)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-600{background-color:var(--color-violet-600)}.bg-violet-700{background-color:var(--color-violet-700)}.bg-violet-800{background-color:var(--color-violet-800)}.bg-violet-900{background-color:var(--color-violet-900)}.bg-violet-950{background-color:var(--color-violet-950)}.bg-white{background-color:var(--color-white)}.bg-linear-to-r{--tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab,red,red)){.bg-linear-to-r{--tw-gradient-position:to right in oklab}}.bg-linear-to-r{background-image:linear-gradient(var(--tw-gradient-stops))}.from-pink-500{--tw-gradient-from:var(--color-pink-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-0\%{--tw-gradient-from-position:0%}.to-violet-600{--tw-gradient-to:var(--color-violet-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-100\%{--tw-gradient-to-position:100%}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.p-10{padding:calc(var(--spacing)*10)}.p-\[\`\<spacing\>\`\]{padding:`<spacing>`}.px-3{padding-inline:calc(var(--spacing)*3)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-12{padding-top:calc(var(--spacing)*12)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-6{padding-right:calc(var(--spacing)*6)}.pr-8{padding-right:calc(var(--spacing)*8)}.pr-10{padding-right:calc(var(--spacing)*10)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pb-12{padding-bottom:calc(var(--spacing)*12)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.align-middle{vertical-align:middle}.text-\[14px\]\/\[100\%\]{font-size:14px;line-height:100%}.text-\[16px\]\/\[100\%\]{font-size:16px;line-height:100%}.text-\[18px\]\/\[140\%\]{font-size:18px;line-height:140%}.text-\[20px\]\/\[100\%\]{font-size:20px;line-height:100%}.text-\[20px\]\/\[135\%\]{font-size:20px;line-height:135%}.text-\[24px\]\/\[100\%\]{font-size:24px;line-height:100%}.text-\[24px\]\/\[125\%\]{font-size:24px;line-height:125%}.text-\[24px\]\/\[145\%\]{font-size:24px;line-height:145%}.text-\[32px\]\/\[125\%\]{font-size:32px;line-height:125%}.text-\[40px\]\/\[125\%\]{font-size:40px;line-height:125%}.text-\[48px\]\/\[125\%\]{font-size:48px;line-height:125%}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.text-black{color:var(--color-black)}.text-error{color:var(--color-error)}.text-inherit{color:inherit}.text-pink-50{color:var(--color-pink-50)}.text-pink-100{color:var(--color-pink-100)}.text-pink-200{color:var(--color-pink-200)}.text-pink-300{color:var(--color-pink-300)}.text-pink-400{color:var(--color-pink-400)}.text-pink-500{color:var(--color-pink-500)}.text-pink-600{color:var(--color-pink-600)}.text-pink-700{color:var(--color-pink-700)}.text-pink-800{color:var(--color-pink-800)}.text-pink-900{color:var(--color-pink-900)}.text-pink-950{color:var(--color-pink-950)}.text-slate-50{color:var(--color-slate-50)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-violet-50{color:var(--color-violet-50)}.text-violet-100{color:var(--color-violet-100)}.text-violet-200{color:var(--color-violet-200)}.text-violet-300{color:var(--color-violet-300)}.text-violet-400{color:var(--color-violet-400)}.text-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-700{color:var(--color-violet-700)}.text-violet-800{color:var(--color-violet-800)}.text-violet-900{color:var(--color-violet-900)}.text-violet-950{color:var(--color-violet-950)}.text-white{color:var(--color-white)}.underline{text-decoration-line:underline}.decoration-violet-600{-webkit-text-decoration-color:var(--color-violet-600);text-decoration-color:var(--color-violet-600)}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-100{opacity:1}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-350{--tw-duration:.35s;transition-duration:.35s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}:is(.\*\*\:cursor-pointer *){cursor:pointer}@media(hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}.group-hover\:hidden:is(:where(.group):hover *){display:none}.group-hover\:rotate-90:is(:where(.group):hover *){rotate:90deg}.group-hover\:pr-6:is(:where(.group):hover *){padding-right:calc(var(--spacing)*6)}.group-hover\:pl-6:is(:where(.group):hover *){padding-left:calc(var(--spacing)*6)}.group-hover\:text-slate-800:is(:where(.group):hover *){color:var(--color-slate-800)}}.placeholder\:text-\[16px\]\/\[100\%\]::placeholder{font-size:16px;line-height:100%}.placeholder\:text-\[20px\]\/\[135\%\]::placeholder{font-size:20px;line-height:135%}.placeholder\:font-medium::placeholder{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:tracking-normal::placeholder{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.placeholder\:text-slate-300::placeholder{color:var(--color-slate-300)}.placeholder\:text-slate-500::placeholder{color:var(--color-slate-500)}.focus-within\:ring-violet-600:focus-within{--tw-ring-color:var(--color-violet-600)}@media(hover:hover){.hover\:scale-95:hover{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:bg-pink-50:hover{background-color:var(--color-pink-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-300:hover{background-color:var(--color-slate-300)}.hover\:bg-slate-700:hover{background-color:var(--color-slate-700)}.hover\:bg-violet-50:hover{background-color:var(--color-violet-50)}.hover\:bg-violet-700:hover{background-color:var(--color-violet-700)}.hover\:to-80\%:hover{--tw-gradient-to-position:80%}.hover\:text-pink-600:hover{color:var(--color-pink-600)}.hover\:text-slate-600:hover{color:var(--color-slate-600)}.hover\:text-violet-600:hover{color:var(--color-violet-600)}.hover\:text-violet-900:hover{color:var(--color-violet-900)}.hover\:decoration-violet-200:hover{-webkit-text-decoration-color:var(--color-violet-200);text-decoration-color:var(--color-violet-200)}.hover\:ring-2:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-3:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-slate-100:hover{--tw-ring-color:var(--color-slate-100)}.hover\:ring-slate-300:hover{--tw-ring-color:var(--color-slate-300)}.hover\:ring-violet-100:hover{--tw-ring-color:var(--color-violet-100)}.hover\:ring-violet-600:hover{--tw-ring-color:var(--color-violet-600)}.hover\:transition-all:hover{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.hover\:duration-300:hover{--tw-duration:.3s;transition-duration:.3s}.hover\:duration-350:hover{--tw-duration:.35s;transition-duration:.35s}.hover\:ease-in-out:hover{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.hover\:ease-out:hover{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-violet-600:focus{--tw-ring-color:var(--color-violet-600)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-violet-600:focus-visible{--tw-ring-color:var(--color-violet-600)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:to-70\%:active{--tw-gradient-to-position:70%}.active\:ring-4:active{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.active\:ring-violet-200:active{--tw-ring-color:var(--color-violet-200)}.active\:duration-300:active{--tw-duration:.3s;transition-duration:.3s}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}@media(hover:hover){.group-hover\:\[\&\>g\]\:\[\&\>path\:first-child\]\:translate-x-0\.5:is(:where(.group):hover *)>g>path:first-child{--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Props for the AccessibleButton component.
3
+ */
4
+ export interface BaseAccessibleButtonProps {
5
+ /**
6
+ * Accessible label for the button, used by screen readers.
7
+ */
8
+ ariaLabel?: string;
9
+ /**
10
+ * Additional class names to apply to the button element.
11
+ */
12
+ className?: string;
13
+ /**
14
+ * HTML button type attribute.
15
+ */
16
+ type?: React.ButtonHTMLAttributes<HTMLButtonElement>["type"];
17
+ /**
18
+ * Click handler for the button.
19
+ */
20
+ onClick?: () => void;
21
+ }
22
+ interface AccessibleButtonProps extends BaseAccessibleButtonProps {
23
+ /**
24
+ * The content displayed inside the button.
25
+ */
26
+ children?: React.ReactNode;
27
+ }
28
+ /**
29
+ * A fully accessible button component.
30
+ */
31
+ export declare const AccessibleButton: React.FC<AccessibleButtonProps>;
32
+ export {};
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn, tv } from "tailwind-variants";
3
+ const accessibleButtonStyles = tv({
4
+ variants: {
5
+ isClickable: {
6
+ true: ["cursor-pointer", "**:cursor-pointer"],
7
+ },
8
+ },
9
+ });
10
+ /**
11
+ * A fully accessible button component.
12
+ */
13
+ export const AccessibleButton = ({ className, ariaLabel, onClick, type = "button", ...props }) => {
14
+ return (_jsx("button", { type: type, className: cn(accessibleButtonStyles({ isClickable: !!onClick }), className), "aria-label": ariaLabel, onClick: onClick, children: props.children }));
15
+ };
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { fireEvent, render, screen } from "@testing-library/react";
3
+ import { describe, expect, test, vi } from "vitest";
4
+ import { AccessibleButton } from "./AccessibleButton";
5
+ describe("Button", () => {
6
+ test("should render button", async () => {
7
+ // Arrange
8
+ render(_jsx(AccessibleButton, { onClick: vi.fn(), children: "button" }));
9
+ // Assert
10
+ expect(screen.getByRole("button")).toBeVisible();
11
+ expect(screen.getByRole("button")).toHaveTextContent("button");
12
+ });
13
+ test("should render button with ariaLabel", async () => {
14
+ // Arrange
15
+ render(_jsx(AccessibleButton, { ariaLabel: "This is a button", onClick: vi.fn(), children: "button" }));
16
+ // Assert
17
+ expect(screen.getByRole("button")).toBeVisible();
18
+ expect(screen.getByRole("button")).toHaveTextContent("button");
19
+ expect(screen.queryByLabelText("This is a button")).toBeInTheDocument();
20
+ });
21
+ test("should call onClick when clicked", () => {
22
+ // Arrange
23
+ const onClick = vi.fn();
24
+ render(_jsx(AccessibleButton, { onClick: onClick, children: "button" }));
25
+ fireEvent.click(screen.getByRole("button"));
26
+ expect(onClick).toHaveBeenCalled();
27
+ });
28
+ });
@@ -1,5 +1,10 @@
1
1
  import { type VariantProps } from "tailwind-variants";
2
2
  declare const avatarStyles: import("tailwind-variants").TVReturnType<{
3
+ isClickable: {
4
+ true: {
5
+ base: string[];
6
+ };
7
+ };
3
8
  size: {
4
9
  sm: {
5
10
  avatar: string[];
@@ -19,6 +24,11 @@ declare const avatarStyles: import("tailwind-variants").TVReturnType<{
19
24
  avatar: string[];
20
25
  action: string[];
21
26
  }, undefined, {
27
+ isClickable: {
28
+ true: {
29
+ base: string[];
30
+ };
31
+ };
22
32
  size: {
23
33
  sm: {
24
34
  avatar: string[];
@@ -38,6 +48,11 @@ declare const avatarStyles: import("tailwind-variants").TVReturnType<{
38
48
  avatar: string[];
39
49
  action: string[];
40
50
  }, import("tailwind-variants").TVReturnType<{
51
+ isClickable: {
52
+ true: {
53
+ base: string[];
54
+ };
55
+ };
41
56
  size: {
42
57
  sm: {
43
58
  avatar: string[];
@@ -59,13 +74,45 @@ declare const avatarStyles: import("tailwind-variants").TVReturnType<{
59
74
  }, undefined, unknown, unknown, undefined>>;
60
75
  type AvatarVariants = VariantProps<typeof avatarStyles>;
61
76
  type AvatarSize = "sm" | "md" | "lg" | "xl";
77
+ /**
78
+ * Props for the Avatar component.
79
+ */
62
80
  interface AvatarProps extends AvatarVariants {
63
- label: string;
81
+ /**
82
+ * Alternative text describing the avatar image.
83
+ */
84
+ alt: string;
85
+ /**
86
+ * Controls the visual size of the avatar.
87
+ */
64
88
  size: AvatarSize;
89
+ /**
90
+ * The URL source of the avatar image.
91
+ */
65
92
  src: string;
66
- children: React.ReactNode;
67
- onClick?: () => void;
93
+ /**
94
+ * Accessible label for the action button that appears on extra-large (`xl`)
95
+ * avatars when `onActionClick` is provided.
96
+ */
97
+ actionAriaLabel?: string;
98
+ /**
99
+ * Click handler for the entire avatar.
100
+ * Makes the outer wrapper clickable.
101
+ */
102
+ onAvatarClick?: () => void;
103
+ /**
104
+ * Optional click handler for the action button.
105
+ * Only visible when:
106
+ * - `size === "xl"`
107
+ * - `onActionClick` is provided
108
+ *
109
+ * Useful for “Edit avatar” or “Change photo” actions.
110
+ */
68
111
  onActionClick?: () => void;
69
112
  }
70
- export declare const Avatar: (props: AvatarProps) => import("react/jsx-runtime").JSX.Element;
113
+ /**
114
+ * A flexible and accessible user avatar component.
115
+ * Built on top of Radix UI’s `Avatar` primitives and styled with Tailwind variants.
116
+ */
117
+ export declare const Avatar: React.FC<AvatarProps>;
71
118
  export {};
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as RadixAvatar from "@radix-ui/react-avatar";
3
3
  import { tv } from "tailwind-variants";
4
+ import fallbackImage from "../../assets/fallback.png";
4
5
  import { Edit } from "../icons/generated";
5
6
  import { RoundButton } from "../round-button/RoundButton";
6
7
  const avatarStyles = tv({
@@ -20,6 +21,9 @@ const avatarStyles = tv({
20
21
  action: ["absolute", "bottom-2", "right-2"],
21
22
  },
22
23
  variants: {
24
+ isClickable: {
25
+ true: { base: ["cursor-pointer"] },
26
+ },
23
27
  size: {
24
28
  sm: { avatar: ["w-10", "h-10", "hover:scale-105"] },
25
29
  md: {
@@ -57,7 +61,11 @@ const avatarStyles = tv({
57
61
  },
58
62
  },
59
63
  });
64
+ /**
65
+ * A flexible and accessible user avatar component.
66
+ * Built on top of Radix UI’s `Avatar` primitives and styled with Tailwind variants.
67
+ */
60
68
  export const Avatar = (props) => {
61
69
  const { base, avatar, action } = avatarStyles(props);
62
- return (_jsxs(RadixAvatar.Root, { onClick: props.onClick, className: base(props), children: [_jsx(RadixAvatar.Image, { src: props.src, alt: props.label, className: avatar(props) }), props.size === "xl" && props.onActionClick && (_jsx("div", { className: action(props), children: _jsx(RoundButton, { intent: "primary", ariaLabel: `Edit ${props.label}`, onClick: props.onActionClick ?? (() => { }), children: _jsx(Edit, {}) }) })), _jsx(RadixAvatar.Fallback, { children: _jsx("div", { className: avatar(props), children: props.children }) })] }));
70
+ return (_jsxs(RadixAvatar.Root, { onClick: props.onAvatarClick, className: base({ isClickable: !!props.onAvatarClick, ...props }), "data-testid": "avatar", children: [_jsx(RadixAvatar.Image, { src: props.src, alt: props.alt, className: avatar(props) }), props.size === "xl" && props.onActionClick && (_jsx("div", { className: action(props), children: _jsx(RoundButton, { intent: "primary", ariaLabel: props.actionAriaLabel ?? "", icon: Edit, onClick: props.onActionClick }) })), _jsx(RadixAvatar.Fallback, { children: _jsx("img", { src: fallbackImage, alt: props.alt, className: avatar(props) }) })] }));
63
71
  };
@@ -1,4 +1,5 @@
1
1
  import { type VariantProps } from "tailwind-variants";
2
+ import { type BaseAccessibleButtonProps } from "../accessible-button/AccessibleButton";
2
3
  import type { IconBaseProps } from "../icons/IconBase";
3
4
  declare const buttonStyles: import("tailwind-variants").TVReturnType<{
4
5
  intent: {
@@ -34,21 +35,32 @@ declare const buttonStyles: import("tailwind-variants").TVReturnType<{
34
35
  type ButtonVariants = VariantProps<typeof buttonStyles>;
35
36
  type ButtonIntent = "primary" | "secondary" | "tertiary";
36
37
  type ButtonSize = "md" | "lg";
37
- type BaseButtonProps = ButtonVariants & {
38
+ /**
39
+ * Props for the Button component.
40
+ *
41
+ * @inheritdoc BaseAccessibleButtonProps
42
+ * @inheritdoc ButtonVariants
43
+ */
44
+ interface ButtonProps extends ButtonVariants, BaseAccessibleButtonProps {
45
+ /**
46
+ * Visual intent of the button (controls background color, hover, and active styles).
47
+ */
38
48
  intent: ButtonIntent;
49
+ /**
50
+ * Visual size of the button (padding and spacing).
51
+ */
39
52
  size: ButtonSize;
40
- onClick: () => void;
41
- className?: string;
42
- children?: React.ReactElement<IconBaseProps>;
43
- };
44
- type ButtonWithLabel = BaseButtonProps & {
45
- label: string;
46
- ariaLabel?: string;
47
- };
48
- type ButtonIconOnly = BaseButtonProps & {
49
- label?: undefined;
50
- ariaLabel: string;
51
- };
52
- type ButtonProps = ButtonWithLabel | ButtonIconOnly;
53
- export declare const Button: (props: ButtonProps) => import("react/jsx-runtime").JSX.Element;
53
+ /**
54
+ * Optional icon element rendered alongside the button label.
55
+ */
56
+ icon?: React.ComponentType<IconBaseProps>;
57
+ /**
58
+ * Visible text label displayed inside the button.
59
+ */
60
+ children: string;
61
+ }
62
+ /**
63
+ * A fully accessible, stylable button component.
64
+ */
65
+ export declare const Button: React.FC<ButtonProps>;
54
66
  export {};
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { twMerge } from "tailwind-merge";
3
- import { tv } from "tailwind-variants";
2
+ import { cn, tv } from "tailwind-variants";
3
+ import { AccessibleButton, } from "../accessible-button/AccessibleButton";
4
4
  import { Label } from "../typography/Label";
5
5
  const buttonStyles = tv({
6
6
  base: [
@@ -15,6 +15,10 @@ const buttonStyles = tv({
15
15
  "duration-350",
16
16
  "active:duration-300",
17
17
  "ease-in-out",
18
+ "flex",
19
+ "justify-center",
20
+ "w-full",
21
+ "cursor-pointer",
18
22
  ],
19
23
  variants: {
20
24
  intent: {
@@ -48,9 +52,9 @@ const buttonStyles = tv({
48
52
  },
49
53
  },
50
54
  });
51
- export const Button = (props) => {
52
- const { label, ariaLabel, children, ...rest } = props;
53
- // Set aria-label when no visible label exists
54
- const finalAriaLabel = label ? undefined : ariaLabel;
55
- return (_jsxs("button", { ...rest, className: twMerge(props.className, buttonStyles(props)), onClick: props.onClick, "aria-label": finalAriaLabel, children: [_jsx(Label, { as: "span", size: "md", children: label }), children] }));
55
+ /**
56
+ * A fully accessible, stylable button component.
57
+ */
58
+ export const Button = ({ className, ...props }) => {
59
+ return (_jsxs(AccessibleButton, { className: cn(buttonStyles(props), className), ...props, children: [_jsx(Label, { as: "span", size: "md", children: props.children }), props.icon && _jsx(props.icon, {})] }));
56
60
  };
@@ -6,7 +6,7 @@ import { Button } from "./Button";
6
6
  describe("Button", () => {
7
7
  test("should render button with icon", async () => {
8
8
  // Arrange
9
- render(_jsx(Button, { intent: "primary", size: "md", label: "button", onClick: vi.fn(), children: _jsx(Mumble, {}) }));
9
+ render(_jsx(Button, { intent: "primary", size: "md", icon: Mumble, onClick: vi.fn(), children: "button" }));
10
10
  // Assert
11
11
  expect(screen.getByRole("button")).toBeVisible();
12
12
  expect(screen.getByRole("button")).toHaveTextContent("button");
@@ -14,7 +14,7 @@ describe("Button", () => {
14
14
  });
15
15
  test("should render button without icon", async () => {
16
16
  // Arrange
17
- render(_jsx(Button, { intent: "primary", size: "md", label: "button", onClick: vi.fn() }));
17
+ render(_jsx(Button, { intent: "primary", size: "md", onClick: vi.fn(), children: "button" }));
18
18
  // Assert
19
19
  expect(screen.getByRole("button")).toBeVisible();
20
20
  expect(screen.getByRole("button")).toHaveTextContent("button");
@@ -23,7 +23,7 @@ describe("Button", () => {
23
23
  test("should call onClick when clicked", () => {
24
24
  // Arrange
25
25
  const onClick = vi.fn();
26
- render(_jsx(Button, { intent: "primary", size: "md", label: "button", onClick: onClick, children: _jsx(Mumble, {}) }));
26
+ render(_jsx(Button, { intent: "primary", size: "md", icon: Mumble, onClick: onClick, children: "button" }));
27
27
  fireEvent.click(screen.getByRole("button"));
28
28
  expect(onClick).toHaveBeenCalled();
29
29
  });
@@ -66,5 +66,5 @@ export const FileUpload = ({ title = "Drag & Drop your File", subtitle = "JPEG o
66
66
  e.preventDefault();
67
67
  document.getElementById("fileInput")?.click();
68
68
  }
69
- }, children: [_jsx(Upload, { className: uploadIcon(props) }), _jsx(Label, { size: "xl", className: titleText(props), children: title }), _jsx(Paragraph, { size: "md", className: subtitleText(props), children: subtitle })] }), _jsx(Button, { className: action(props), intent: "primary", size: "md", label: actionLabel, onClick: () => document.getElementById("fileInput")?.click(), children: _jsx(Upload, {}) }), _jsx("input", { id: "fileInput", "aria-label": title, type: "file", accept: ".jpg,.png", className: input(props), onChange: handleFileChange }), file && (_jsxs("div", { className: preview(props), children: [_jsx(Label, { size: "md", className: previewLabel(props), children: file.name }), _jsx(Cancel, { onClick: () => setFile(null) })] }))] }));
69
+ }, children: [_jsx(Upload, { className: uploadIcon(props) }), _jsx(Label, { size: "xl", className: titleText(props), children: title }), _jsx(Paragraph, { size: "md", className: subtitleText(props), children: subtitle })] }), _jsx(Button, { className: action(props), intent: "primary", size: "md", icon: Upload, onClick: () => document.getElementById("fileInput")?.click(), children: actionLabel }), _jsx("input", { id: "fileInput", "aria-label": title, type: "file", accept: ".jpg,.png", className: input(props), onChange: handleFileChange }), file && (_jsxs("div", { className: preview(props), children: [_jsx(Label, { size: "md", className: previewLabel(props), children: file.name }), _jsx(Cancel, { onClick: () => setFile(null) })] }))] }));
70
70
  };
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
2
  import { type VariantProps } from "tailwind-variants";
3
+ import { type BaseAccessibleButtonProps } from "../accessible-button/AccessibleButton";
3
4
  import type { IconBaseProps } from "../icons/IconBase";
4
5
  declare const iconButtonStyles: import("tailwind-variants").TVReturnType<{
5
6
  intent: {
@@ -40,11 +41,29 @@ declare const iconButtonStyles: import("tailwind-variants").TVReturnType<{
40
41
  }, undefined, unknown, unknown, undefined>>;
41
42
  type IconButtonVariants = VariantProps<typeof iconButtonStyles>;
42
43
  type IconButtonIntent = "primary" | "secondary";
43
- interface IconButtonProps extends IconButtonVariants {
44
- label: string;
44
+ /**
45
+ * Props for the IconButton component.
46
+ *
47
+ * @inheritdoc BaseAccessibleButtonProps
48
+ * @inheritdoc IconButtonVariants
49
+ */
50
+ interface IconButtonProps extends IconButtonVariants, BaseAccessibleButtonProps {
51
+ /**
52
+ * Visual intent of the button (controls background color, hover, and active styles).
53
+ */
45
54
  intent: IconButtonIntent;
46
- onClick: () => void;
47
- children: React.ReactElement<IconBaseProps>;
55
+ /**
56
+ * Icon element rendered alongside the button label.
57
+ */
58
+ icon?: React.ComponentType<IconBaseProps>;
59
+ /**
60
+ * Visible text label displayed inside the button.
61
+ */
62
+ children: string;
48
63
  }
49
- export declare const IconButton: (props: IconButtonProps) => import("react/jsx-runtime").JSX.Element;
64
+ /**
65
+ * A compact, accessible button component that displays an icon alongside
66
+ * a text label.
67
+ */
68
+ export declare const IconButton: React.FC<IconButtonProps>;
50
69
  export {};
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from "react";
3
- import { tv } from "tailwind-variants";
3
+ import { cn, tv } from "tailwind-variants";
4
+ import { AccessibleButton, } from "../accessible-button/AccessibleButton";
4
5
  import { Label } from "../typography/Label";
5
6
  const iconButtonStyles = tv({
6
7
  slots: {
@@ -14,9 +15,11 @@ const iconButtonStyles = tv({
14
15
  },
15
16
  },
16
17
  });
17
- export const IconButton = (props) => {
18
+ /**
19
+ * A compact, accessible button component that displays an icon alongside
20
+ * a text label.
21
+ */
22
+ export const IconButton = ({ className, ...props }) => {
18
23
  const { base, icon } = iconButtonStyles();
19
- return (_jsxs("button", { className: base(props), onClick: props.onClick, "aria-label": props.label, children: [React.cloneElement(props.children, {
20
- className: `${icon(props)}`,
21
- }), _jsx(Label, { as: "span", size: "sm", children: props.label })] }));
24
+ return (_jsxs(AccessibleButton, { className: cn(base(props), className), ...props, children: [props.icon && _jsx(props.icon, { className: icon(props) }), _jsx(Label, { as: "span", size: "md", children: props.children })] }));
22
25
  };
@@ -6,7 +6,7 @@ import { IconButton } from "./IconButton";
6
6
  describe("IconButton", () => {
7
7
  test("should render icon-button with icon", async () => {
8
8
  // Arrange
9
- render(_jsx(IconButton, { intent: "primary", label: "button", onClick: vi.fn(), children: _jsx(Profile, {}) }));
9
+ render(_jsx(IconButton, { intent: "primary", icon: Profile, onClick: vi.fn(), children: "button" }));
10
10
  // Assert
11
11
  expect(screen.getByRole("button")).toBeVisible();
12
12
  expect(screen.getByRole("button")).toHaveTextContent("button");
@@ -15,7 +15,7 @@ describe("IconButton", () => {
15
15
  test("should call onClick when clicked", () => {
16
16
  // Arrange
17
17
  const onClick = vi.fn();
18
- render(_jsx(IconButton, { intent: "primary", label: "button", onClick: onClick, children: _jsx(Profile, {}) }));
18
+ render(_jsx(IconButton, { intent: "primary", icon: Profile, onClick: onClick, children: "button" }));
19
19
  fireEvent.click(screen.getByRole("button"));
20
20
  expect(onClick).toHaveBeenCalled();
21
21
  });
@@ -2,10 +2,10 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  // src/components/icons/IconBase.tsx
3
3
  import { AccessibleIcon } from "@radix-ui/react-accessible-icon";
4
4
  import * as React from "react";
5
- import { cnBase, tv } from "tailwind-variants";
5
+ import { cn, tv } from "tailwind-variants";
6
6
  const iconStyles = tv({
7
7
  base: ["w-4", "h-4"],
8
8
  });
9
9
  export const IconBase = ({ label = "", children, className, ...props }) => {
10
- return (_jsx(AccessibleIcon, { label: label, children: _jsx("svg", { className: cnBase(className, iconStyles()), fill: "currentColor", viewBox: props.viewBox || "0 0 16 16", ...props, children: children }) }));
10
+ return (_jsx(AccessibleIcon, { label: label, children: _jsx("svg", { className: cn(iconStyles(), className), fill: "currentColor", viewBox: props.viewBox || "0 0 16 16", ...props, children: children }) }));
11
11
  };
@@ -7,7 +7,7 @@ import { Modal } from "./Modal";
7
7
  describe("Modal", () => {
8
8
  test("should open modal", async () => {
9
9
  // Arrange
10
- render(_jsx("div", { children: _jsxs(Modal, { open: true, onOpenChange: () => { }, title: "Modal", children: [_jsx(Modal.Body, { children: "Body" }), _jsxs(Modal.Actions, { children: [_jsx(Button, { intent: "primary", size: "md", label: "Exit", onClick: () => { }, children: _jsx(Cancel, {}) }), _jsx(Button, { intent: "secondary", size: "md", label: "Save", onClick: () => { }, children: _jsx(Checkmark, {}) })] })] }) }));
10
+ render(_jsx("div", { children: _jsxs(Modal, { open: true, onOpenChange: () => { }, title: "Modal", children: [_jsx(Modal.Body, { children: "Body" }), _jsxs(Modal.Actions, { children: [_jsx(Button, { intent: "primary", size: "md", onClick: () => { }, icon: Cancel, children: "Exit" }), _jsx(Button, { intent: "secondary", size: "md", onClick: () => { }, icon: Checkmark, children: "Save" })] })] }) }));
11
11
  // Assert
12
12
  expect(screen.getByRole("dialog")).toBeVisible();
13
13
  expect(screen.getByText(/body/i)).toBeVisible();
@@ -17,7 +17,7 @@ describe("Modal", () => {
17
17
  });
18
18
  test("should open modal", async () => {
19
19
  // Arrange
20
- render(_jsx("div", { children: _jsxs(Modal, { open: false, onOpenChange: () => { }, title: "Modal", children: [_jsx(Modal.Body, { children: "Body" }), _jsxs(Modal.Actions, { children: [_jsx(Button, { intent: "primary", size: "md", label: "Exit", onClick: () => { }, children: _jsx(Cancel, {}) }), _jsx(Button, { intent: "secondary", size: "md", label: "Save", onClick: () => { }, children: _jsx(Checkmark, {}) })] })] }) }));
20
+ render(_jsx("div", { children: _jsxs(Modal, { open: false, onOpenChange: () => { }, title: "Modal", children: [_jsx(Modal.Body, { children: "Body" }), _jsxs(Modal.Actions, { children: [_jsx(Button, { intent: "primary", size: "md", onClick: () => { }, icon: Cancel, children: "Exit" }), _jsx(Button, { intent: "secondary", size: "md", onClick: () => { }, icon: Checkmark, children: "Save" })] })] }) }));
21
21
  // Assert
22
22
  expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
23
23
  });
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
2
  import { type VariantProps } from "tailwind-variants";
3
+ import { type BaseAccessibleButtonProps } from "../accessible-button/AccessibleButton";
3
4
  import type { IconBaseProps } from "../icons/IconBase";
4
5
  declare const naviButtonStyles: import("tailwind-variants").TVReturnType<{
5
6
  intent: {
@@ -16,11 +17,33 @@ declare const naviButtonStyles: import("tailwind-variants").TVReturnType<{
16
17
  }, undefined, string[], unknown, unknown, undefined>>;
17
18
  type NaviButtonVariants = VariantProps<typeof naviButtonStyles>;
18
19
  type NaviButtonIntent = "secondary";
19
- interface NaviButtonProps extends NaviButtonVariants {
20
- label: string;
20
+ /**
21
+ * Props for the NaviButton component.
22
+ *
23
+ * @inheritdoc BaseAccessibleButtonProps
24
+ * @inheritdoc NaviButtonVariants
25
+ */
26
+ interface NaviButtonProps extends NaviButtonVariants, BaseAccessibleButtonProps {
27
+ /**
28
+ * Visual intent of the button (controls background color, hover, and active styles).
29
+ */
21
30
  intent?: NaviButtonIntent;
22
- onClick: () => void;
23
- children: React.ReactElement<IconBaseProps>;
31
+ /**
32
+ * Optional icon element rendered alongside the button label.
33
+ */
34
+ icon?: React.ComponentType<IconBaseProps>;
35
+ /**
36
+ * Optional className applied to the icon element.
37
+ */
38
+ iconClassName?: string;
39
+ /**
40
+ * Visible text label displayed inside the button.
41
+ */
42
+ children: string;
24
43
  }
25
- export declare const NaviButton: ({ intent, ...props }: NaviButtonProps) => import("react/jsx-runtime").JSX.Element;
44
+ /**
45
+ * A navigation-style button component that combines an accessible,
46
+ * keyboard-friendly button foundation with variant-based styling.
47
+ */
48
+ export declare const NaviButton: React.FC<NaviButtonProps>;
26
49
  export {};