@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.
- package/dist/cm-designsystem.css +1 -1
- package/dist/components/accessible-button/AccessibleButton.d.ts +32 -0
- package/dist/components/accessible-button/AccessibleButton.js +15 -0
- package/dist/components/accessible-button/AccessibleButton.test.d.ts +1 -0
- package/dist/components/accessible-button/AccessibleButton.test.js +28 -0
- package/dist/components/avatar/Avatar.d.ts +51 -4
- package/dist/components/avatar/Avatar.js +9 -1
- package/dist/components/button/Button.d.ts +27 -15
- package/dist/components/button/Button.js +11 -7
- package/dist/components/button/Button.test.js +3 -3
- package/dist/components/file-upload/FileUpload.js +1 -1
- package/dist/components/icon-button/IconButton.d.ts +24 -5
- package/dist/components/icon-button/IconButton.js +8 -5
- package/dist/components/icon-button/IconButton.test.js +2 -2
- package/dist/components/icons/IconBase.js +2 -2
- package/dist/components/modal/Modal.test.js +2 -2
- package/dist/components/navi-button/NaviButton.d.ts +28 -5
- package/dist/components/navi-button/NaviButton.js +8 -3
- package/dist/components/navi-button/NaviButton.test.js +2 -2
- package/dist/components/navi-user-button/NaviUserButton.d.ts +24 -6
- package/dist/components/navi-user-button/NaviUserButton.js +8 -4
- package/dist/components/round-button/RoundButton.d.ts +23 -4
- package/dist/components/round-button/RoundButton.js +8 -3
- package/dist/components/round-button/RoundButton.test.js +3 -2
- package/dist/components/timed-button/TimedButton.d.ts +29 -6
- package/dist/components/timed-button/TimedButton.js +9 -6
- package/dist/components/timed-button/TimedButton.test.js +6 -5
- package/dist/components/typography/AccessibleTypography.d.ts +33 -0
- package/dist/components/typography/AccessibleTypography.js +11 -0
- package/dist/components/typography/Heading.d.ts +17 -10
- package/dist/components/typography/Heading.js +8 -8
- package/dist/components/typography/Label.d.ts +15 -8
- package/dist/components/typography/Label.js +8 -4
- package/dist/components/typography/Paragraph.d.ts +15 -8
- package/dist/components/typography/Paragraph.js +8 -4
- package/dist/components/typography/Placeholder.d.ts +12 -8
- package/dist/components/typography/Placeholder.js +8 -4
- package/dist/components/typography/ValidationMessage.d.ts +15 -8
- package/dist/components/typography/ValidationMessage.js +8 -6
- package/dist/index.es.js +2925 -3002
- package/package.json +57 -59
package/dist/cm-designsystem.css
CHANGED
|
@@ -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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|
-
|
|
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
|
-
|
|
67
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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 {
|
|
3
|
-
import {
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return (_jsxs(
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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
|
-
|
|
44
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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",
|
|
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",
|
|
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 {
|
|
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:
|
|
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",
|
|
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",
|
|
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
|
-
|
|
20
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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 {};
|