@epfl-sti/poesis 0.1.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/components/data-display/Card.d.ts +20 -0
  2. package/dist/components/data-display/Card.d.ts.map +1 -0
  3. package/dist/components/data-display/DescriptionList.d.ts +23 -0
  4. package/dist/components/data-display/DescriptionList.d.ts.map +1 -0
  5. package/dist/components/data-display/EmptyState.d.ts +18 -0
  6. package/dist/components/data-display/EmptyState.d.ts.map +1 -0
  7. package/dist/components/data-display/Table.d.ts +53 -0
  8. package/dist/components/data-display/Table.d.ts.map +1 -0
  9. package/dist/components/data-display/index.d.ts +5 -0
  10. package/dist/components/data-display/index.d.ts.map +1 -0
  11. package/dist/components/feedback/Alert.d.ts +18 -0
  12. package/dist/components/feedback/Alert.d.ts.map +1 -0
  13. package/dist/components/feedback/ConfirmDialog.d.ts +26 -0
  14. package/dist/components/feedback/ConfirmDialog.d.ts.map +1 -0
  15. package/dist/components/feedback/Dialog.d.ts +20 -0
  16. package/dist/components/feedback/Dialog.d.ts.map +1 -0
  17. package/dist/components/feedback/Toast.d.ts +5 -0
  18. package/dist/components/feedback/Toast.d.ts.map +1 -0
  19. package/dist/components/feedback/index.d.ts +6 -0
  20. package/dist/components/feedback/index.d.ts.map +1 -0
  21. package/dist/components/feedback/toastContext.d.ts +17 -0
  22. package/dist/components/feedback/toastContext.d.ts.map +1 -0
  23. package/dist/components/layout/BurgerDrawer.d.ts +25 -0
  24. package/dist/components/layout/BurgerDrawer.d.ts.map +1 -0
  25. package/dist/components/layout/Footer.d.ts +2 -0
  26. package/dist/components/layout/Footer.d.ts.map +1 -0
  27. package/dist/components/layout/PageShell.d.ts +41 -0
  28. package/dist/components/layout/PageShell.d.ts.map +1 -0
  29. package/dist/components/layout/SideNav.d.ts +31 -0
  30. package/dist/components/layout/SideNav.d.ts.map +1 -0
  31. package/dist/components/layout/TopNav.d.ts +26 -0
  32. package/dist/components/layout/TopNav.d.ts.map +1 -0
  33. package/dist/components/layout/UserMenu.d.ts +14 -0
  34. package/dist/components/layout/UserMenu.d.ts.map +1 -0
  35. package/dist/components/layout/index.d.ts +15 -0
  36. package/dist/components/layout/index.d.ts.map +1 -0
  37. package/dist/components/layout/types.d.ts +33 -0
  38. package/dist/components/layout/types.d.ts.map +1 -0
  39. package/dist/components/ui/Avatar.d.ts +25 -0
  40. package/dist/components/ui/Avatar.d.ts.map +1 -0
  41. package/dist/components/ui/Badge.d.ts +34 -0
  42. package/dist/components/ui/Badge.d.ts.map +1 -0
  43. package/dist/components/ui/Button.d.ts +35 -0
  44. package/dist/components/ui/Button.d.ts.map +1 -0
  45. package/dist/components/ui/Checkbox.d.ts +16 -0
  46. package/dist/components/ui/Checkbox.d.ts.map +1 -0
  47. package/dist/components/ui/DropdownMenu.d.ts +30 -0
  48. package/dist/components/ui/DropdownMenu.d.ts.map +1 -0
  49. package/dist/components/ui/FileUpload.d.ts +27 -0
  50. package/dist/components/ui/FileUpload.d.ts.map +1 -0
  51. package/dist/components/ui/IconButton.d.ts +34 -0
  52. package/dist/components/ui/IconButton.d.ts.map +1 -0
  53. package/dist/components/ui/Input.d.ts +21 -0
  54. package/dist/components/ui/Input.d.ts.map +1 -0
  55. package/dist/components/ui/LanguageSwitcher.d.ts +11 -0
  56. package/dist/components/ui/LanguageSwitcher.d.ts.map +1 -0
  57. package/dist/components/ui/Pagination.d.ts +36 -0
  58. package/dist/components/ui/Pagination.d.ts.map +1 -0
  59. package/dist/components/ui/Popover.d.ts +18 -0
  60. package/dist/components/ui/Popover.d.ts.map +1 -0
  61. package/dist/components/ui/ProgressBar.d.ts +30 -0
  62. package/dist/components/ui/ProgressBar.d.ts.map +1 -0
  63. package/dist/components/ui/RadioGroup.d.ts +45 -0
  64. package/dist/components/ui/RadioGroup.d.ts.map +1 -0
  65. package/dist/components/ui/Select.d.ts +15 -0
  66. package/dist/components/ui/Select.d.ts.map +1 -0
  67. package/dist/components/ui/Spinner.d.ts +19 -0
  68. package/dist/components/ui/Spinner.d.ts.map +1 -0
  69. package/dist/components/ui/Switch.d.ts +12 -0
  70. package/dist/components/ui/Switch.d.ts.map +1 -0
  71. package/dist/components/ui/Tabs.d.ts +36 -0
  72. package/dist/components/ui/Tabs.d.ts.map +1 -0
  73. package/dist/components/ui/Textarea.d.ts +18 -0
  74. package/dist/components/ui/Textarea.d.ts.map +1 -0
  75. package/dist/components/ui/ThemeToggle.d.ts +16 -0
  76. package/dist/components/ui/ThemeToggle.d.ts.map +1 -0
  77. package/dist/components/ui/Tooltip.d.ts +16 -0
  78. package/dist/components/ui/Tooltip.d.ts.map +1 -0
  79. package/dist/components/ui/index.d.ts +21 -0
  80. package/dist/components/ui/index.d.ts.map +1 -0
  81. package/dist/hooks/useAuth.d.ts +33 -0
  82. package/dist/hooks/useAuth.d.ts.map +1 -0
  83. package/dist/hooks/useLanguage.d.ts +14 -0
  84. package/dist/hooks/useLanguage.d.ts.map +1 -0
  85. package/dist/hooks/useTheme.d.ts +21 -0
  86. package/dist/hooks/useTheme.d.ts.map +1 -0
  87. package/dist/i18n/index.d.ts +3 -0
  88. package/dist/i18n/index.d.ts.map +1 -0
  89. package/dist/lib.d.ts +11 -0
  90. package/dist/lib.d.ts.map +1 -0
  91. package/dist/poesis.js +477 -278
  92. package/dist/poesis.js.map +1 -1
  93. package/dist/routes/types.d.ts +39 -0
  94. package/dist/routes/types.d.ts.map +1 -0
  95. package/dist/theme/reactSelectStyles.d.ts +12 -0
  96. package/dist/theme/reactSelectStyles.d.ts.map +1 -0
  97. package/package.json +3 -3
package/dist/poesis.js CHANGED
@@ -1,23 +1,23 @@
1
1
  (function(){try{if(typeof document<`u`){var e=document.createElement(`style`);e.appendChild(document.createTextNode(`/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
2
- @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-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction: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-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-xl:36rem;--container-6xl:72rem;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--radius-sm:4px;--radius-md:8px;--radius-lg:12px;--shadow-sm:0 1px 2px #0000000f;--shadow-md:0 2px 8px #00000014;--shadow-lg:0 4px 16px #0000001a;--shadow-xl:0 8px 32px #0000001f;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-epfl-red:red;--color-epfl-red-dark:#b51f1f;--color-epfl-leman:#00a79f;--color-epfl-canard:#007480;--color-epfl-canard-dark:#004248;--color-primary:var(--action-primary);--color-primary-hover:var(--action-primary-hover);--color-bg-primary:var(--bg-primary);--color-bg-secondary:var(--bg-secondary);--color-bg-tertiary:var(--bg-tertiary);--color-border:var(--border-default);--color-border-strong:var(--border-strong);--color-text-primary:var(--text-primary);--color-text-secondary:var(--text-secondary);--color-text-muted:var(--text-muted);--color-success:var(--semantic-success);--color-success-bg:var(--semantic-success-bg);--color-warning:var(--semantic-warning);--color-warning-bg:var(--semantic-warning-bg);--color-error:var(--semantic-error);--color-error-bg:var(--semantic-error-bg);--color-info:var(--semantic-info);--color-info-bg:var(--semantic-info-bg);--radius-full:9999px;--spacing-xs:4px;--spacing-sm:8px;--spacing-md:16px;--spacing-lg:24px;--spacing-xl:32px;--spacing-2xl:48px;--text-h1:2rem;--text-h1--line-height:1.2;--text-h2:1.5rem;--text-h2--line-height:1.3;--text-h3:1.25rem;--text-h3--line-height:1.4;--text-body:.9375rem;--text-body--line-height:1.5;--text-small:.8125rem;--text-small--line-height:1.5;--text-caption:.75rem;--text-caption--line-height:1.4}}@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;-webkit-text-decoration:inherit;-webkit-text-decoration: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}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.right-0{right:calc(var(--spacing) * 0)}.right-lg{right:var(--spacing-lg)}.bottom-lg{bottom:var(--spacing-lg)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-lg{margin-top:var(--spacing-lg)}.mt-md{margin-top:var(--spacing-md)}.mt-xs{margin-top:var(--spacing-xs)}.mr-lg{margin-right:var(--spacing-lg)}.mr-sm{margin-right:var(--spacing-sm)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-lg{margin-bottom:var(--spacing-lg)}.mb-md{margin-bottom:var(--spacing-md)}.mb-sm{margin-bottom:var(--spacing-sm)}.mb-xs{margin-bottom:var(--spacing-xs)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-20{width:calc(var(--spacing) * 20);height:calc(var(--spacing) * 20)}.size-full{width:100%;height:100%}.h-0\\.5{height:calc(var(--spacing) * .5)}.h-1\\.5{height:calc(var(--spacing) * 1.5)}.h-2\\.5{height:calc(var(--spacing) * 2.5)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-20{height:calc(var(--spacing) * 20)}.h-64{height:calc(var(--spacing) * 64)}.h-96{height:calc(var(--spacing) * 96)}.h-full{height:100%}.h-screen{height:100vh}.min-h-screen{min-height:100vh}.w-7{width:calc(var(--spacing) * 7)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-16{width:calc(var(--spacing) * 16)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-96{width:calc(var(--spacing) * 96)}.w-\\[4px\\]{width:4px}.w-\\[8px\\]{width:8px}.w-\\[16px\\]{width:16px}.w-\\[24px\\]{width:24px}.w-\\[32px\\]{width:32px}.w-\\[48px\\]{width:48px}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\\[24rem\\]{max-width:24rem}.max-w-\\[32rem\\]{max-width:32rem}.max-w-\\[42rem\\]{max-width:42rem}.max-w-\\[600px\\]{max-width:600px}.max-w-\\[var\\(--container-6xl\\)\\]{max-width:var(--container-6xl)}.max-w-\\[var\\(--container-md\\)\\]{max-width:var(--container-md)}.max-w-\\[var\\(--container-xl\\)\\]{max-width:var(--container-xl)}.max-w-\\[var\\(--container-xs\\)\\]{max-width:var(--container-xs)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--spacing-md)}.max-w-screen{max-width:100vw}.max-w-sm{max-width:var(--spacing-sm)}.max-w-xl{max-width:var(--spacing-xl)}.max-w-xs{max-width:var(--spacing-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-7{min-width:calc(var(--spacing) * 7)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-\\[10rem\\]{min-width:10rem}.min-w-\\[500px\\]{min-width:500px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-dialog-in{animation:.2s ease-out dialog-in}.animate-floating-in{animation:.15s ease-out floating-in}.animate-slide-in{animation:.25s ease-out slide-in}.animate-spin{animation:var(--animate-spin)}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2xl{gap:var(--spacing-2xl)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-lg{gap:var(--spacing-lg)}.gap-md{gap:var(--spacing-md)}.gap-px{gap:1px}.gap-sm{gap:var(--spacing-sm)}.gap-xl{gap:var(--spacing-xl)}.gap-xs{gap:var(--spacing-xs)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.\\!rounded-lg{border-radius:var(--radius-lg)!important}.\\!rounded-md{border-radius:var(--radius-md)!important}.\\!rounded-sm{border-radius:var(--radius-sm)!important}.rounded{border-radius:.25rem}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.\\!border{border-style:var(--tw-border-style)!important;border-width:1px!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.\\!border-border{border-color:var(--color-border)!important}.\\!border-epfl-canard{border-color:var(--color-epfl-canard)!important}.\\!border-error{border-color:var(--color-error)!important}.\\!border-primary{border-color:var(--color-primary)!important}.border-border{border-color:var(--color-border)}.border-border-strong{border-color:var(--color-border-strong)}.border-error,.border-error\\/30{border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.border-error\\/30{border-color:color-mix(in oklab, var(--color-error) 30%, transparent)}}.border-info\\/30{border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.border-info\\/30{border-color:color-mix(in oklab, var(--color-info) 30%, transparent)}}.border-primary{border-color:var(--color-primary)}.border-success\\/30{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.border-success\\/30{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}.border-transparent{border-color:#0000}.border-warning\\/30{border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\\/30{border-color:color-mix(in oklab, var(--color-warning) 30%, transparent)}}.\\!bg-bg-tertiary{background-color:var(--color-bg-tertiary)!important}.\\!bg-epfl-canard{background-color:var(--color-epfl-canard)!important}.\\!bg-primary{background-color:var(--color-primary)!important}.bg-bg-primary{background-color:var(--color-bg-primary)}.bg-bg-secondary{background-color:var(--color-bg-secondary)}.bg-bg-tertiary,.bg-bg-tertiary\\/50{background-color:var(--color-bg-tertiary)}@supports (color:color-mix(in lab, red, red)){.bg-bg-tertiary\\/50{background-color:color-mix(in oklab, var(--color-bg-tertiary) 50%, transparent)}}.bg-black\\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-black\\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-border{background-color:var(--color-border)}.bg-border-strong{background-color:var(--color-border-strong)}.bg-epfl-canard{background-color:var(--color-epfl-canard)}.bg-epfl-canard-dark{background-color:var(--color-epfl-canard-dark)}.bg-epfl-leman{background-color:var(--color-epfl-leman)}.bg-epfl-red{background-color:var(--color-epfl-red)}.bg-epfl-red-dark{background-color:var(--color-epfl-red-dark)}.bg-error{background-color:var(--color-error)}.bg-error-bg{background-color:var(--color-error-bg)}.bg-info{background-color:var(--color-info)}.bg-info-bg{background-color:var(--color-info-bg)}.bg-primary,.bg-primary\\/5{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/5{background-color:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.bg-primary\\/8{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/8{background-color:color-mix(in oklab, var(--color-primary) 8%, transparent)}}.bg-primary\\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/10{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.bg-success{background-color:var(--color-success)}.bg-success-bg{background-color:var(--color-success-bg)}.bg-text-muted{background-color:var(--color-text-muted)}.bg-text-primary{background-color:var(--color-text-primary)}.bg-warning{background-color:var(--color-warning)}.bg-warning-bg{background-color:var(--color-warning-bg)}.object-cover{object-fit:cover}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-2xl{padding:var(--spacing-2xl)}.p-16{padding:calc(var(--spacing) * 16)}.p-lg{padding:var(--spacing-lg)}.p-md{padding:var(--spacing-md)}.p-sm{padding:var(--spacing-sm)}.p-xl{padding:var(--spacing-xl)}.p-xs{padding:var(--spacing-xs)}.px-1\\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-lg{padding-inline:var(--spacing-lg)}.px-md{padding-inline:var(--spacing-md)}.px-sm{padding-inline:var(--spacing-sm)}.py-0\\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-2xl{padding-block:var(--spacing-2xl)}.py-lg{padding-block:var(--spacing-lg)}.py-md{padding-block:var(--spacing-md)}.py-sm{padding-block:var(--spacing-sm)}.py-xl{padding-block:var(--spacing-xl)}.py-xs{padding-block:var(--spacing-xs)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pt-xl{padding-top:var(--spacing-xl)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pr-11{padding-right:calc(var(--spacing) * 11)}.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)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-11{padding-left:calc(var(--spacing) * 11)}.pl-14{padding-left:calc(var(--spacing) * 14)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-body{font-size:var(--text-body);line-height:var(--tw-leading,var(--text-body--line-height))}.text-caption{font-size:var(--text-caption);line-height:var(--tw-leading,var(--text-caption--line-height))}.text-h1{font-size:var(--text-h1);line-height:var(--tw-leading,var(--text-h1--line-height))}.text-h2{font-size:var(--text-h2);line-height:var(--tw-leading,var(--text-h2--line-height))}.text-h3{font-size:var(--text-h3);line-height:var(--tw-leading,var(--text-h3--line-height))}.text-small{font-size:var(--text-small);line-height:var(--tw-leading,var(--text-small--line-height))}.leading-\\[1\\.2\\]{--tw-leading:1.2;line-height:1.2}.leading-\\[1\\.3\\]{--tw-leading:1.3;line-height:1.3}.leading-\\[1\\.4\\]{--tw-leading:1.4;line-height:1.4}.leading-\\[1\\.5\\]{--tw-leading:1.5;line-height:1.5}.leading-none{--tw-leading:1;line-height:1}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.whitespace-nowrap{white-space:nowrap}.\\!text-white{color:var(--color-white)!important}.text-bg-primary{color:var(--color-bg-primary)}.text-epfl-canard{color:var(--color-epfl-canard)}.text-epfl-leman{color:var(--color-epfl-leman)}.text-epfl-red{color:var(--color-epfl-red)}.text-error{color:var(--color-error)}.text-info{color:var(--color-info)}.text-primary{color:var(--color-primary)}.text-success{color:var(--color-success)}.text-text-muted{color:var(--color-text-muted)}.text-text-primary{color:var(--color-text-primary)}.text-text-secondary{color:var(--color-text-secondary)}.text-warning{color:var(--color-warning)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-100{opacity:1}.\\!shadow-lg{--tw-shadow:0 4px 16px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.\\!shadow-sm{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000f)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.shadow-lg{--tw-shadow:0 4px 16px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 2px 8px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 8px 32px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.\\!ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.\\!ring-epfl-canard{--tw-ring-color:var(--color-epfl-canard)!important}.\\!ring-primary{--tw-ring-color:var(--color-primary)!important}.transition-\\[width\\]{transition-property:width;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-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;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))}.transition-none{transition-property:none}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.peer-checked\\:bg-primary:is(:where(.peer):checked~*){background-color:var(--color-primary)}.peer-focus-visible\\:ring-2:is(:where(.peer):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)}.peer-focus-visible\\:ring-primary:is(:where(.peer):focus-visible~*){--tw-ring-color:var(--color-primary)}.peer-focus-visible\\:ring-offset-2:is(:where(.peer):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)}.peer-focus-visible\\:ring-offset-bg-primary:is(:where(.peer):focus-visible~*){--tw-ring-offset-color:var(--color-bg-primary)}.peer-disabled\\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.placeholder\\:text-text-muted::placeholder{color:var(--color-text-muted)}.after\\:absolute:after{content:var(--tw-content);position:absolute}.after\\:top-0\\.5:after{content:var(--tw-content);top:calc(var(--spacing) * .5)}.after\\:left-0\\.5:after{content:var(--tw-content);left:calc(var(--spacing) * .5)}.after\\:size-5:after{content:var(--tw-content);width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.after\\:rounded-full:after{content:var(--tw-content);border-radius:var(--radius-full)}.after\\:bg-white:after{content:var(--tw-content);background-color:var(--color-white)}.after\\:shadow-sm:after{content:var(--tw-content);--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.after\\:transition-transform:after{content:var(--tw-content);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))}.after\\:content-\\[\\'\\'\\]:after{--tw-content:"";content:var(--tw-content)}.peer-checked\\:after\\:translate-x-5:is(:where(.peer):checked~*):after{content:var(--tw-content);--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.last\\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.checked\\:border-\\[5px\\]:checked{border-style:var(--tw-border-style);border-width:5px}.checked\\:border-primary:checked{border-color:var(--color-primary)}.checked\\:bg-primary:checked{background-color:var(--color-primary)}.checked\\:bg-\\[url\\(\\'data\\:image\\/svg\\+xml\\,\\%3Csvg\\%20viewBox\\%3D\\%220\\%200\\%2016\\%2016\\%22\\%20fill\\%3D\\%22white\\%22\\%20xmlns\\%3D\\%22http\\%3A\\%2F\\%2Fwww\\.w3\\.org\\%2F2000\\%2Fsvg\\%22\\%3E\\%3Cpath\\%20d\\%3D\\%22M12\\.207\\%204\\.793a1\\%201\\%200\\%20010\\%201\\.414l-5\\%205a1\\%201\\%200\\%2001-1\\.414\\%200l-2-2a1\\%201\\%200\\%20011\\.414-1\\.414L6\\.5\\%209\\.086l4\\.293-4\\.293a1\\%201\\%200\\%20011\\.414\\%200z\\%22\\%2F\\%3E\\%3C\\%2Fsvg\\%3E\\'\\)\\]:checked{background-image:url(data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22white%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.207%204.793a1%201%200%20010%201.414l-5%205a1%201%200%2001-1.414%200l-2-2a1%201%200%20011.414-1.414L6.5%209.086l4.293-4.293a1%201%200%20011.414%200z%22%2F%3E%3C%2Fsvg%3E)}.checked\\:bg-center:checked{background-position:50%}.checked\\:bg-no-repeat:checked{background-repeat:no-repeat}.indeterminate\\:border-primary:indeterminate{border-color:var(--color-primary)}.indeterminate\\:bg-primary:indeterminate{background-color:var(--color-primary)}.indeterminate\\:bg-\\[url\\(\\'data\\:image\\/svg\\+xml\\,\\%3Csvg\\%20viewBox\\%3D\\%220\\%200\\%2016\\%2016\\%22\\%20fill\\%3D\\%22white\\%22\\%20xmlns\\%3D\\%22http\\%3A\\%2F\\%2Fwww\\.w3\\.org\\%2F2000\\%2Fsvg\\%22\\%3E\\%3Crect\\%20x\\%3D\\%223\\%22\\%20y\\%3D\\%227\\%22\\%20width\\%3D\\%2210\\%22\\%20height\\%3D\\%222\\%22\\%20rx\\%3D\\%221\\%22\\%2F\\%3E\\%3C\\%2Fsvg\\%3E\\'\\)\\]:indeterminate{background-image:url(data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22white%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20x%3D%223%22%20y%3D%227%22%20width%3D%2210%22%20height%3D%222%22%20rx%3D%221%22%2F%3E%3C%2Fsvg%3E)}.indeterminate\\:bg-center:indeterminate{background-position:50%}.indeterminate\\:bg-no-repeat:indeterminate{background-repeat:no-repeat}@media (hover:hover){.hover\\:border-border-strong:hover{border-color:var(--color-border-strong)}.hover\\:border-error:hover{border-color:var(--color-error)}.hover\\:border-primary:hover{border-color:var(--color-primary)}.hover\\:bg-bg-tertiary:hover,.hover\\:bg-bg-tertiary\\/70:hover{background-color:var(--color-bg-tertiary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-bg-tertiary\\/70:hover{background-color:color-mix(in oklab, var(--color-bg-tertiary) 70%, transparent)}}.hover\\:bg-error-bg:hover{background-color:var(--color-error-bg)}.hover\\:bg-error\\/80:hover{background-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-error\\/80:hover{background-color:color-mix(in oklab, var(--color-error) 80%, transparent)}}.hover\\:bg-primary-hover:hover{background-color:var(--color-primary-hover)}.hover\\:text-text-primary:hover{color:var(--color-text-primary)}.hover\\:text-text-secondary:hover{color:var(--color-text-secondary)}.hover\\:opacity-90:hover{opacity:.9}}.focus\\:border-error:focus{border-color:var(--color-error)}.focus\\:border-primary:focus{border-color:var(--color-primary)}.focus\\:bg-bg-tertiary:focus{background-color:var(--color-bg-tertiary)}.focus\\:bg-error-bg:focus{background-color:var(--color-error-bg)}.focus\\:ring-1:focus{--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)}.focus\\:ring-error:focus{--tw-ring-color:var(--color-error)}.focus\\:ring-primary:focus{--tw-ring-color:var(--color-primary)}.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-epfl-canard:focus-visible{--tw-ring-color:var(--color-epfl-canard)}.focus-visible\\:ring-error:focus-visible{--tw-ring-color:var(--color-error)}.focus-visible\\:ring-primary:focus-visible{--tw-ring-color:var(--color-primary)}.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\\:ring-offset-bg-primary:focus-visible{--tw-ring-offset-color:var(--color-bg-primary)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:bg-bg-secondary:disabled{background-color:var(--color-bg-secondary)}.disabled\\:opacity-50:disabled{opacity:.5}@media (width>=40rem){.sm\\:col-span-2{grid-column:span 2/span 2}.sm\\:w-1\\/3{width:33.3333%}.sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\\:flex-row{flex-direction:row}.sm\\:gap-lg{gap:var(--spacing-lg)}}@media (width>=48rem){.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width>=64rem){.lg\\:flex{display:flex}.lg\\:hidden{display:none}.lg\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\\:px-lg{padding-inline:var(--spacing-lg)}}.\\[\\&\\>svg\\]\\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\\[\\&\\>svg\\]\\:size-5>svg{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}}:root{--bg-primary:#fff;--bg-secondary:#f5f5f5;--bg-tertiary:#e6e6e6;--border-default:#d5d5d5;--border-strong:#c1c1c1;--text-primary:#212121;--text-secondary:#707070;--text-muted:#8e8e8e;--semantic-success:#1b874b;--semantic-success-bg:#e8f5e9;--semantic-warning:#d4860a;--semantic-warning-bg:#fff3e0;--semantic-error:#d32f2f;--semantic-error-bg:#ffebee;--semantic-info:#1976d2;--semantic-info-bg:#e3f2fd;--action-primary:#007480;--action-primary-hover:#004248}.dark{--bg-primary:#1a1a1a;--bg-secondary:#242424;--bg-tertiary:#2e2e2e;--border-default:#3a3a3a;--border-strong:#505050;--text-primary:#f0f0f0;--text-secondary:#a0a0a0;--text-muted:#707070;--semantic-success:#34d37a;--semantic-success-bg:#1a2e1a;--semantic-warning:#ffad33;--semantic-warning-bg:#2e2410;--semantic-error:#ff6b6b;--semantic-error-bg:#2e1515;--semantic-info:#64b5f6;--semantic-info-bg:#152538;--action-primary:#009ba6;--action-primary-hover:#007480;--shadow-sm:0 1px 2px #0000004d;--shadow-md:0 2px 8px #0006;--shadow-lg:0 4px 16px #00000080;--shadow-xl:0 8px 32px #0009}@keyframes slide-in{0%{opacity:0;transform:translate(1rem)}to{opacity:1;transform:translate(0)}}@keyframes dialog-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes floating-in{0%{opacity:0}to{opacity:1}}body{font-family:var(--font-sans);font-size:var(--text-body);line-height:var(--text-body--line-height);color:var(--color-text-primary);background-color:var(--color-bg-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@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-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}
2
+ @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-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction: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-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-600:oklch(57.7% .245 27.325);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-xl:36rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--radius-sm:4px;--radius-md:8px;--radius-lg:12px;--shadow-sm:0 1px 2px #0000000f;--shadow-md:0 2px 8px #00000014;--shadow-lg:0 4px 16px #0000001a;--shadow-xl:0 8px 32px #0000001f;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-epfl-red:red;--color-epfl-red-dark:#b51f1f;--color-epfl-leman:#00a79f;--color-epfl-canard:#007480;--color-epfl-canard-dark:#004248;--color-primary:var(--action-primary);--color-primary-hover:var(--action-primary-hover);--color-bg-primary:var(--bg-primary);--color-bg-secondary:var(--bg-secondary);--color-bg-tertiary:var(--bg-tertiary);--color-border:var(--border-default);--color-border-strong:var(--border-strong);--color-text-primary:var(--text-primary);--color-text-secondary:var(--text-secondary);--color-text-muted:var(--text-muted);--color-success:var(--semantic-success);--color-success-bg:var(--semantic-success-bg);--color-warning:var(--semantic-warning);--color-warning-bg:var(--semantic-warning-bg);--color-error:var(--semantic-error);--color-error-bg:var(--semantic-error-bg);--color-info:var(--semantic-info);--color-info-bg:var(--semantic-info-bg);--radius-full:9999px;--spacing-xs:4px;--spacing-sm:8px;--spacing-md:16px;--spacing-lg:24px;--spacing-xl:32px;--spacing-2xl:48px;--text-h1:2rem;--text-h1--line-height:1.2;--text-h2:1.5rem;--text-h2--line-height:1.3;--text-h3:1.25rem;--text-h3--line-height:1.4;--text-body:.9375rem;--text-body--line-height:1.5;--text-small:.8125rem;--text-small--line-height:1.5;--text-caption:.75rem;--text-caption--line-height:1.4}}@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;-webkit-text-decoration:inherit;-webkit-text-decoration: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}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.right-0{right:calc(var(--spacing) * 0)}.right-lg{right:var(--spacing-lg)}.bottom-lg{bottom:var(--spacing-lg)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mt-lg{margin-top:var(--spacing-lg)}.mt-md{margin-top:var(--spacing-md)}.mt-sm{margin-top:var(--spacing-sm)}.mt-xs{margin-top:var(--spacing-xs)}.mr-lg{margin-right:var(--spacing-lg)}.mr-sm{margin-right:var(--spacing-sm)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-lg{margin-bottom:var(--spacing-lg)}.mb-md{margin-bottom:var(--spacing-md)}.mb-sm{margin-bottom:var(--spacing-sm)}.mb-xs{margin-bottom:var(--spacing-xs)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-20{width:calc(var(--spacing) * 20);height:calc(var(--spacing) * 20)}.size-full{width:100%;height:100%}.h-0\\.5{height:calc(var(--spacing) * .5)}.h-1\\.5{height:calc(var(--spacing) * 1.5)}.h-2\\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-20{height:calc(var(--spacing) * 20)}.h-64{height:calc(var(--spacing) * 64)}.h-96{height:calc(var(--spacing) * 96)}.h-\\[30px\\]{height:30px}.h-full{height:100%}.h-screen{height:100vh}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-7{width:calc(var(--spacing) * 7)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-16{width:calc(var(--spacing) * 16)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-96{width:calc(var(--spacing) * 96)}.w-\\[4px\\]{width:4px}.w-\\[8px\\]{width:8px}.w-\\[16px\\]{width:16px}.w-\\[24px\\]{width:24px}.w-\\[32px\\]{width:32px}.w-\\[48px\\]{width:48px}.w-auto{width:auto}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\\[24rem\\]{max-width:24rem}.max-w-\\[32rem\\]{max-width:32rem}.max-w-\\[42rem\\]{max-width:42rem}.max-w-\\[600px\\]{max-width:600px}.max-w-\\[var\\(--container-6xl\\)\\]{max-width:var(--container-6xl)}.max-w-\\[var\\(--container-md\\)\\]{max-width:var(--container-md)}.max-w-\\[var\\(--container-xl\\)\\]{max-width:var(--container-xl)}.max-w-\\[var\\(--container-xs\\)\\]{max-width:var(--container-xs)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--spacing-md)}.max-w-screen{max-width:100vw}.max-w-sm{max-width:var(--spacing-sm)}.max-w-xl{max-width:var(--spacing-xl)}.max-w-xs{max-width:var(--spacing-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-7{min-width:calc(var(--spacing) * 7)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-\\[10rem\\]{min-width:10rem}.min-w-\\[280px\\]{min-width:280px}.min-w-\\[500px\\]{min-width:500px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-dialog-in{animation:.2s ease-out dialog-in}.animate-floating-in{animation:.15s ease-out floating-in}.animate-slide-in{animation:.25s ease-out slide-in}.animate-spin{animation:var(--animate-spin)}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-none{list-style-type:none}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2xl{gap:var(--spacing-2xl)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-lg{gap:var(--spacing-lg)}.gap-md{gap:var(--spacing-md)}.gap-px{gap:1px}.gap-sm{gap:var(--spacing-sm)}.gap-xl{gap:var(--spacing-xl)}.gap-xs{gap:var(--spacing-xs)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.\\!rounded-lg{border-radius:var(--radius-lg)!important}.\\!rounded-md{border-radius:var(--radius-md)!important}.\\!rounded-sm{border-radius:var(--radius-sm)!important}.rounded{border-radius:.25rem}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.\\!border{border-style:var(--tw-border-style)!important;border-width:1px!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-2{border-right-style:var(--tw-border-style);border-right-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.\\!border-border{border-color:var(--color-border)!important}.\\!border-epfl-canard{border-color:var(--color-epfl-canard)!important}.\\!border-error{border-color:var(--color-error)!important}.\\!border-primary{border-color:var(--color-primary)!important}.border-border{border-color:var(--color-border)}.border-border-strong{border-color:var(--color-border-strong)}.border-error,.border-error\\/30{border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.border-error\\/30{border-color:color-mix(in oklab, var(--color-error) 30%, transparent)}}.border-info\\/30{border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.border-info\\/30{border-color:color-mix(in oklab, var(--color-info) 30%, transparent)}}.border-primary{border-color:var(--color-primary)}.border-red-600{border-color:var(--color-red-600)}.border-success\\/30{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.border-success\\/30{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}.border-transparent{border-color:#0000}.border-warning\\/30{border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\\/30{border-color:color-mix(in oklab, var(--color-warning) 30%, transparent)}}.\\!bg-bg-tertiary{background-color:var(--color-bg-tertiary)!important}.\\!bg-epfl-canard{background-color:var(--color-epfl-canard)!important}.\\!bg-primary{background-color:var(--color-primary)!important}.bg-bg-primary{background-color:var(--color-bg-primary)}.bg-bg-secondary{background-color:var(--color-bg-secondary)}.bg-bg-tertiary,.bg-bg-tertiary\\/50{background-color:var(--color-bg-tertiary)}@supports (color:color-mix(in lab, red, red)){.bg-bg-tertiary\\/50{background-color:color-mix(in oklab, var(--color-bg-tertiary) 50%, transparent)}}.bg-black\\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-black\\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-border{background-color:var(--color-border)}.bg-border-strong{background-color:var(--color-border-strong)}.bg-epfl-canard{background-color:var(--color-epfl-canard)}.bg-epfl-canard-dark{background-color:var(--color-epfl-canard-dark)}.bg-epfl-leman{background-color:var(--color-epfl-leman)}.bg-epfl-red{background-color:var(--color-epfl-red)}.bg-epfl-red-dark{background-color:var(--color-epfl-red-dark)}.bg-error{background-color:var(--color-error)}.bg-error-bg{background-color:var(--color-error-bg)}.bg-info{background-color:var(--color-info)}.bg-info-bg{background-color:var(--color-info-bg)}.bg-primary,.bg-primary\\/5{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/5{background-color:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.bg-primary\\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/10{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.bg-success{background-color:var(--color-success)}.bg-success-bg{background-color:var(--color-success-bg)}.bg-text-muted{background-color:var(--color-text-muted)}.bg-text-primary{background-color:var(--color-text-primary)}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--color-warning)}.bg-warning-bg{background-color:var(--color-warning-bg)}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing) * 0)}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-2xl{padding:var(--spacing-2xl)}.p-16{padding:calc(var(--spacing) * 16)}.p-lg{padding:var(--spacing-lg)}.p-md{padding:var(--spacing-md)}.p-sm{padding:var(--spacing-sm)}.p-xl{padding:var(--spacing-xl)}.p-xs{padding:var(--spacing-xs)}.px-1\\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-lg{padding-inline:var(--spacing-lg)}.px-md{padding-inline:var(--spacing-md)}.px-sm{padding-inline:var(--spacing-sm)}.px-xs{padding-inline:var(--spacing-xs)}.py-0\\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-2xl{padding-block:var(--spacing-2xl)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-lg{padding-block:var(--spacing-lg)}.py-md{padding-block:var(--spacing-md)}.py-sm{padding-block:var(--spacing-sm)}.py-xl{padding-block:var(--spacing-xl)}.py-xs{padding-block:var(--spacing-xs)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pt-md{padding-top:var(--spacing-md)}.pt-sm{padding-top:var(--spacing-sm)}.pt-xl{padding-top:var(--spacing-xl)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pr-11{padding-right:calc(var(--spacing) * 11)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.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)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-11{padding-left:calc(var(--spacing) * 11)}.pl-14{padding-left:calc(var(--spacing) * 14)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-body{font-size:var(--text-body);line-height:var(--tw-leading,var(--text-body--line-height))}.text-caption{font-size:var(--text-caption);line-height:var(--tw-leading,var(--text-caption--line-height))}.text-h1{font-size:var(--text-h1);line-height:var(--tw-leading,var(--text-h1--line-height))}.text-h2{font-size:var(--text-h2);line-height:var(--tw-leading,var(--text-h2--line-height))}.text-h3{font-size:var(--text-h3);line-height:var(--tw-leading,var(--text-h3--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-small{font-size:var(--text-small);line-height:var(--tw-leading,var(--text-small--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-\\[1\\.2\\]{--tw-leading:1.2;line-height:1.2}.leading-\\[1\\.3\\]{--tw-leading:1.3;line-height:1.3}.leading-\\[1\\.4\\]{--tw-leading:1.4;line-height:1.4}.leading-\\[1\\.5\\]{--tw-leading:1.5;line-height:1.5}.leading-none{--tw-leading:1;line-height:1}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.\\!text-white{color:var(--color-white)!important}.text-bg-primary{color:var(--color-bg-primary)}.text-epfl-canard{color:var(--color-epfl-canard)}.text-epfl-leman{color:var(--color-epfl-leman)}.text-epfl-red{color:var(--color-epfl-red)}.text-error{color:var(--color-error)}.text-info{color:var(--color-info)}.text-primary{color:var(--color-primary)}.text-success{color:var(--color-success)}.text-text-muted{color:var(--color-text-muted)}.text-text-primary{color:var(--color-text-primary)}.text-text-secondary{color:var(--color-text-secondary)}.text-warning{color:var(--color-warning)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-100{opacity:1}.\\!shadow-lg{--tw-shadow:0 4px 16px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.\\!shadow-sm{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000f)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.shadow-lg{--tw-shadow:0 4px 16px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 2px 8px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 8px 32px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.\\!ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.\\!ring-epfl-canard{--tw-ring-color:var(--color-epfl-canard)!important}.\\!ring-primary{--tw-ring-color:var(--color-primary)!important}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-\\[width\\]{transition-property:width;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-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;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))}.transition-none{transition-property:none}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.peer-checked\\:bg-primary:is(:where(.peer):checked~*){background-color:var(--color-primary)}.peer-focus-visible\\:ring-2:is(:where(.peer):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)}.peer-focus-visible\\:ring-primary:is(:where(.peer):focus-visible~*){--tw-ring-color:var(--color-primary)}.peer-focus-visible\\:ring-offset-2:is(:where(.peer):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)}.peer-focus-visible\\:ring-offset-bg-primary:is(:where(.peer):focus-visible~*){--tw-ring-offset-color:var(--color-bg-primary)}.peer-disabled\\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.placeholder\\:text-text-muted::placeholder{color:var(--color-text-muted)}.after\\:absolute:after{content:var(--tw-content);position:absolute}.after\\:top-0\\.5:after{content:var(--tw-content);top:calc(var(--spacing) * .5)}.after\\:left-0\\.5:after{content:var(--tw-content);left:calc(var(--spacing) * .5)}.after\\:size-5:after{content:var(--tw-content);width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.after\\:rounded-full:after{content:var(--tw-content);border-radius:var(--radius-full)}.after\\:bg-white:after{content:var(--tw-content);background-color:var(--color-white)}.after\\:shadow-sm:after{content:var(--tw-content);--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.after\\:transition-transform:after{content:var(--tw-content);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))}.after\\:content-\\[\\'\\'\\]:after{--tw-content:"";content:var(--tw-content)}.peer-checked\\:after\\:translate-x-5:is(:where(.peer):checked~*):after{content:var(--tw-content);--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.last\\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.checked\\:border-\\[5px\\]:checked{border-style:var(--tw-border-style);border-width:5px}.checked\\:border-primary:checked{border-color:var(--color-primary)}.checked\\:bg-primary:checked{background-color:var(--color-primary)}.checked\\:bg-\\[url\\(\\'data\\:image\\/svg\\+xml\\,\\%3Csvg\\%20viewBox\\%3D\\%220\\%200\\%2016\\%2016\\%22\\%20fill\\%3D\\%22white\\%22\\%20xmlns\\%3D\\%22http\\%3A\\%2F\\%2Fwww\\.w3\\.org\\%2F2000\\%2Fsvg\\%22\\%3E\\%3Cpath\\%20d\\%3D\\%22M12\\.207\\%204\\.793a1\\%201\\%200\\%20010\\%201\\.414l-5\\%205a1\\%201\\%200\\%2001-1\\.414\\%200l-2-2a1\\%201\\%200\\%20011\\.414-1\\.414L6\\.5\\%209\\.086l4\\.293-4\\.293a1\\%201\\%200\\%20011\\.414\\%200z\\%22\\%2F\\%3E\\%3C\\%2Fsvg\\%3E\\'\\)\\]:checked{background-image:url(data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22white%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.207%204.793a1%201%200%20010%201.414l-5%205a1%201%200%2001-1.414%200l-2-2a1%201%200%20011.414-1.414L6.5%209.086l4.293-4.293a1%201%200%20011.414%200z%22%2F%3E%3C%2Fsvg%3E)}.checked\\:bg-center:checked{background-position:50%}.checked\\:bg-no-repeat:checked{background-repeat:no-repeat}.indeterminate\\:border-primary:indeterminate{border-color:var(--color-primary)}.indeterminate\\:bg-primary:indeterminate{background-color:var(--color-primary)}.indeterminate\\:bg-\\[url\\(\\'data\\:image\\/svg\\+xml\\,\\%3Csvg\\%20viewBox\\%3D\\%220\\%200\\%2016\\%2016\\%22\\%20fill\\%3D\\%22white\\%22\\%20xmlns\\%3D\\%22http\\%3A\\%2F\\%2Fwww\\.w3\\.org\\%2F2000\\%2Fsvg\\%22\\%3E\\%3Crect\\%20x\\%3D\\%223\\%22\\%20y\\%3D\\%227\\%22\\%20width\\%3D\\%2210\\%22\\%20height\\%3D\\%222\\%22\\%20rx\\%3D\\%221\\%22\\%2F\\%3E\\%3C\\%2Fsvg\\%3E\\'\\)\\]:indeterminate{background-image:url(data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22white%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20x%3D%223%22%20y%3D%227%22%20width%3D%2210%22%20height%3D%222%22%20rx%3D%221%22%2F%3E%3C%2Fsvg%3E)}.indeterminate\\:bg-center:indeterminate{background-position:50%}.indeterminate\\:bg-no-repeat:indeterminate{background-repeat:no-repeat}@media (hover:hover){.hover\\:border-border-strong:hover{border-color:var(--color-border-strong)}.hover\\:border-error:hover{border-color:var(--color-error)}.hover\\:border-primary:hover{border-color:var(--color-primary)}.hover\\:bg-bg-secondary:hover{background-color:var(--color-bg-secondary)}.hover\\:bg-bg-tertiary:hover,.hover\\:bg-bg-tertiary\\/70:hover{background-color:var(--color-bg-tertiary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-bg-tertiary\\/70:hover{background-color:color-mix(in oklab, var(--color-bg-tertiary) 70%, transparent)}}.hover\\:bg-error-bg:hover{background-color:var(--color-error-bg)}.hover\\:bg-error\\/80:hover{background-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-error\\/80:hover{background-color:color-mix(in oklab, var(--color-error) 80%, transparent)}}.hover\\:bg-primary-hover:hover{background-color:var(--color-primary-hover)}.hover\\:text-primary:hover{color:var(--color-primary)}.hover\\:text-text-primary:hover{color:var(--color-text-primary)}.hover\\:text-text-secondary:hover{color:var(--color-text-secondary)}.hover\\:opacity-90:hover{opacity:.9}}.focus\\:border-error:focus{border-color:var(--color-error)}.focus\\:border-primary:focus{border-color:var(--color-primary)}.focus\\:bg-bg-tertiary:focus{background-color:var(--color-bg-tertiary)}.focus\\:bg-error-bg:focus{background-color:var(--color-error-bg)}.focus\\:ring-1:focus{--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)}.focus\\:ring-error:focus{--tw-ring-color:var(--color-error)}.focus\\:ring-primary:focus{--tw-ring-color:var(--color-primary)}.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-epfl-canard:focus-visible{--tw-ring-color:var(--color-epfl-canard)}.focus-visible\\:ring-error:focus-visible{--tw-ring-color:var(--color-error)}.focus-visible\\:ring-primary:focus-visible{--tw-ring-color:var(--color-primary)}.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\\:ring-offset-bg-primary:focus-visible{--tw-ring-offset-color:var(--color-bg-primary)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:bg-bg-secondary:disabled{background-color:var(--color-bg-secondary)}.disabled\\:opacity-50:disabled{opacity:.5}@media (width>=40rem){.sm\\:col-span-2{grid-column:span 2/span 2}.sm\\:w-1\\/3{width:33.3333%}.sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\\:flex-row{flex-direction:row}.sm\\:gap-lg{gap:var(--spacing-lg)}}@media (width>=48rem){.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width>=64rem){.lg\\:flex{display:flex}.lg\\:hidden{display:none}.lg\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\\:px-lg{padding-inline:var(--spacing-lg)}}.\\[\\&\\>svg\\]\\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\\[\\&\\>svg\\]\\:size-5>svg{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}}:root{--bg-primary:#fff;--bg-secondary:#f5f5f5;--bg-tertiary:#e6e6e6;--border-default:#d5d5d5;--border-strong:#c1c1c1;--text-primary:#212121;--text-secondary:#707070;--text-muted:#8e8e8e;--semantic-success:#1b874b;--semantic-success-bg:#e8f5e9;--semantic-warning:#d4860a;--semantic-warning-bg:#fff3e0;--semantic-error:#d32f2f;--semantic-error-bg:#ffebee;--semantic-info:#1976d2;--semantic-info-bg:#e3f2fd;--action-primary:#007480;--action-primary-hover:#004248;--logo-filter:brightness(0);--logo-opacity:.5}.dark{--bg-primary:#1a1a1a;--bg-secondary:#242424;--bg-tertiary:#2e2e2e;--border-default:#3a3a3a;--border-strong:#505050;--text-primary:#f0f0f0;--text-secondary:#a0a0a0;--text-muted:#707070;--semantic-success:#34d37a;--semantic-success-bg:#1a2e1a;--semantic-warning:#ffad33;--semantic-warning-bg:#2e2410;--semantic-error:#ff6b6b;--semantic-error-bg:#2e1515;--semantic-info:#64b5f6;--semantic-info-bg:#152538;--action-primary:#009ba6;--action-primary-hover:#007480;--logo-filter:brightness(0) invert(1);--logo-opacity:1;--shadow-sm:0 1px 2px #0000004d;--shadow-md:0 2px 8px #0006;--shadow-lg:0 4px 16px #00000080;--shadow-xl:0 8px 32px #0009}@keyframes slide-in{0%{opacity:0;transform:translate(1rem)}to{opacity:1;transform:translate(0)}}@keyframes dialog-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes floating-in{0%{opacity:0}to{opacity:1}}body{font-family:var(--font-sans);font-size:var(--text-body);line-height:var(--text-body--line-height);color:var(--color-text-primary);background-color:var(--color-bg-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@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-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}
3
3
  /*$vite$:1*/`)),document.head.appendChild(e)}}catch(e){console.error(`vite-plugin-css-injected-by-js`,e)}})();import { createContext as e, forwardRef as t, useCallback as n, useContext as r, useEffect as i, useId as a, useMemo as o, useRef as s, useState as c, useSyncExternalStore as l } from "react";
4
4
  import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
5
- import { CheckCircleFill as p, ChevronBarLeft as m, ChevronBarRight as h, ChevronDown as g, ChevronLeft as _, ChevronRight as v, CloudArrowUp as y, ExclamationTriangleFill as b, InfoCircleFill as x, List as S, MoonFill as C, SortAlphaDown as w, SortAlphaDownAlt as T, SortDown as E, SortNumericDown as D, SortNumericDownAlt as O, SunFill as k, X as A, XCircleFill as j, XLg as M } from "react-bootstrap-icons";
5
+ import { BoxArrowInRight as p, BoxArrowRight as m, CheckCircleFill as h, ChevronBarLeft as g, ChevronBarRight as _, ChevronDown as v, ChevronLeft as y, ChevronRight as b, CloudArrowUp as x, ExclamationTriangleFill as S, InfoCircleFill as C, List as w, MoonFill as T, SortAlphaDown as E, SortAlphaDownAlt as D, SortDown as O, SortNumericDown as k, SortNumericDownAlt as A, SunFill as j, X as M, XCircleFill as ee, XLg as te } from "react-bootstrap-icons";
6
6
  import { useTranslation as N } from "react-i18next";
7
- import ee from "react-select";
8
- import { FloatingFocusManager as te, FloatingPortal as P, arrow as ne, autoUpdate as F, flip as I, offset as L, shift as R, useClick as z, useDismiss as B, useFloating as V, useFocus as re, useHover as ie, useInteractions as H, useListNavigation as ae, useRole as U } from "@floating-ui/react";
9
- import { createPortal as oe } from "react-dom";
7
+ import ne from "react-select";
8
+ import { FloatingFocusManager as re, FloatingPortal as P, arrow as ie, autoUpdate as F, flip as I, offset as L, shift as R, useClick as ae, useDismiss as z, useFloating as B, useFocus as oe, useHover as se, useInteractions as V, useListNavigation as ce, useRole as H } from "@floating-ui/react";
9
+ import { createPortal as le } from "react-dom";
10
10
  //#region src/components/ui/Avatar.tsx
11
- var se = {
11
+ var ue = {
12
12
  sm: "size-8 text-caption",
13
13
  md: "size-10 text-small",
14
14
  lg: "size-14 text-body"
15
15
  };
16
- function ce(e) {
16
+ function de(e) {
17
17
  let t = e.trim().split(/\s+/);
18
18
  return t.length === 0 ? "?" : t.length === 1 ? t[0][0].toUpperCase() : (t[0][0] + t[t.length - 1][0]).toUpperCase();
19
19
  }
20
- function le({ src: e, name: t, size: n = "md", alt: r, className: i = "", ...a }) {
20
+ function fe({ src: e, name: t, size: n = "md", alt: r, className: i = "", ...a }) {
21
21
  let [o, s] = c(!1), l = !!e && !o;
22
22
  return /* @__PURE__ */ d("span", {
23
23
  role: "img",
@@ -25,7 +25,7 @@ function le({ src: e, name: t, size: n = "md", alt: r, className: i = "", ...a }
25
25
  className: [
26
26
  "inline-flex items-center justify-center rounded-full overflow-hidden",
27
27
  "bg-primary text-white font-semibold select-none shrink-0",
28
- se[n],
28
+ ue[n],
29
29
  i
30
30
  ].join(" "),
31
31
  ...a,
@@ -36,35 +36,35 @@ function le({ src: e, name: t, size: n = "md", alt: r, className: i = "", ...a }
36
36
  onError: () => s(!0)
37
37
  }) : /* @__PURE__ */ d("span", {
38
38
  "aria-hidden": "true",
39
- children: ce(t)
39
+ children: de(t)
40
40
  })
41
41
  });
42
42
  }
43
43
  //#endregion
44
44
  //#region src/components/ui/Badge.tsx
45
- var ue = {
45
+ var pe = {
46
46
  default: "bg-bg-tertiary text-text-primary",
47
47
  success: "bg-success-bg text-success",
48
48
  warning: "bg-warning-bg text-warning",
49
49
  error: "bg-error-bg text-error",
50
50
  info: "bg-info-bg text-info"
51
- }, de = {
51
+ }, me = {
52
52
  default: "bg-text-muted",
53
53
  success: "bg-success",
54
54
  warning: "bg-warning",
55
55
  error: "bg-error",
56
56
  info: "bg-info"
57
57
  };
58
- function fe({ color: e = "default", dot: t, className: n = "", children: r, ...i }) {
58
+ function he({ color: e = "default", dot: t, className: n = "", children: r, ...i }) {
59
59
  return t ? /* @__PURE__ */ d("span", {
60
60
  role: "status",
61
- className: `inline-block size-2.5 rounded-full ${de[e]} ${n}`,
61
+ className: `inline-block size-2.5 rounded-full ${me[e]} ${n}`,
62
62
  ...i
63
63
  }) : /* @__PURE__ */ d("span", {
64
64
  className: [
65
65
  "inline-flex items-center rounded-sm px-2 py-0.5",
66
66
  "text-caption font-medium leading-none",
67
- ue[e],
67
+ pe[e],
68
68
  n
69
69
  ].join(" "),
70
70
  ...i,
@@ -73,17 +73,17 @@ function fe({ color: e = "default", dot: t, className: n = "", children: r, ...i
73
73
  }
74
74
  //#endregion
75
75
  //#region src/components/ui/Spinner.tsx
76
- var pe = {
76
+ var ge = {
77
77
  sm: "size-4",
78
78
  md: "size-6",
79
79
  lg: "size-8"
80
80
  };
81
- function W({ size: e = "md", className: t = "", ...n }) {
81
+ function U({ size: e = "md", className: t = "", ...n }) {
82
82
  return /* @__PURE__ */ f("svg", {
83
83
  viewBox: "0 0 24 24",
84
84
  fill: "none",
85
85
  xmlns: "http://www.w3.org/2000/svg",
86
- className: `animate-spin ${pe[e]} ${t}`,
86
+ className: `animate-spin ${ge[e]} ${t}`,
87
87
  role: "status",
88
88
  "aria-label": "Loading",
89
89
  ...n,
@@ -103,20 +103,20 @@ function W({ size: e = "md", className: t = "", ...n }) {
103
103
  }
104
104
  //#endregion
105
105
  //#region src/components/ui/Button.tsx
106
- var me = {
106
+ var _e = {
107
107
  primary: "bg-primary text-white hover:bg-primary-hover focus-visible:ring-primary",
108
108
  secondary: "border border-border text-text-primary bg-bg-primary hover:bg-bg-tertiary focus-visible:ring-primary",
109
109
  ghost: "text-text-primary hover:bg-bg-tertiary focus-visible:ring-primary",
110
110
  danger: "bg-error text-white hover:opacity-90 focus-visible:ring-error"
111
- }, he = {
111
+ }, ve = {
112
112
  sm: "text-small px-3 py-1 gap-1.5",
113
113
  md: "text-body px-4 py-2 gap-2",
114
114
  lg: "text-body px-5 py-2.5 gap-2"
115
- }, ge = {
115
+ }, ye = {
116
116
  sm: "sm",
117
117
  md: "sm",
118
118
  lg: "md"
119
- }, _e = t(function({ variant: e = "primary", size: t = "md", loading: n = !1, disabled: r, iconLeft: i, iconRight: a, className: o = "", children: s, ...c }, l) {
119
+ }, be = t(function({ variant: e = "primary", size: t = "md", loading: n = !1, disabled: r, iconLeft: i, iconRight: a, className: o = "", children: s, ...c }, l) {
120
120
  let u = r || n;
121
121
  return /* @__PURE__ */ f("button", {
122
122
  ref: l,
@@ -127,31 +127,31 @@ var me = {
127
127
  "inline-flex items-center justify-center font-medium rounded-md",
128
128
  "transition-colors duration-150 cursor-pointer",
129
129
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
130
- me[e],
131
- he[t],
130
+ _e[e],
131
+ ve[t],
132
132
  u && "opacity-50 pointer-events-none",
133
133
  o
134
134
  ].filter(Boolean).join(" "),
135
135
  ...c,
136
136
  children: [
137
- n ? /* @__PURE__ */ d(W, {
138
- size: ge[t],
137
+ n ? /* @__PURE__ */ d(U, {
138
+ size: ye[t],
139
139
  "aria-hidden": "true"
140
140
  }) : i,
141
141
  s,
142
142
  !n && a
143
143
  ]
144
144
  });
145
- }), ve = {
145
+ }), xe = {
146
146
  primary: "bg-primary text-white hover:bg-primary-hover focus-visible:ring-primary",
147
147
  secondary: "border border-border text-text-primary bg-bg-primary hover:bg-bg-tertiary focus-visible:ring-primary",
148
148
  ghost: "text-text-primary hover:bg-bg-tertiary focus-visible:ring-primary",
149
149
  danger: "bg-error text-white hover:opacity-90 focus-visible:ring-error"
150
- }, ye = {
150
+ }, Se = {
151
151
  sm: "size-7 text-small",
152
152
  md: "size-9 text-body",
153
153
  lg: "size-11 text-body"
154
- }, G = t(function({ variant: e = "ghost", size: t = "md", loading: n = !1, disabled: r, icon: i, className: a = "", ...o }, s) {
154
+ }, Ce = t(function({ variant: e = "ghost", size: t = "md", loading: n = !1, disabled: r, icon: i, className: a = "", ...o }, s) {
155
155
  let c = r || n;
156
156
  return /* @__PURE__ */ d("button", {
157
157
  ref: s,
@@ -162,27 +162,27 @@ var me = {
162
162
  "inline-flex items-center justify-center rounded-md",
163
163
  "transition-colors duration-150 cursor-pointer",
164
164
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
165
- ve[e],
166
- ye[t],
165
+ xe[e],
166
+ Se[t],
167
167
  c && "opacity-50 pointer-events-none",
168
168
  a
169
169
  ].filter(Boolean).join(" "),
170
170
  ...o,
171
- children: n ? /* @__PURE__ */ d(W, {
171
+ children: n ? /* @__PURE__ */ d(U, {
172
172
  size: "sm",
173
173
  "aria-hidden": "true"
174
174
  }) : i
175
175
  });
176
- }), K = {
176
+ }), W = {
177
177
  sm: "h-7 min-w-7 px-1.5 text-small",
178
178
  md: "h-9 min-w-9 px-2 text-body",
179
179
  lg: "h-11 min-w-11 px-3 text-body"
180
- }, be = {
180
+ }, we = {
181
181
  sm: 14,
182
182
  md: 16,
183
183
  lg: 18
184
184
  };
185
- function xe(e, t, n, r) {
185
+ function Te(e, t, n, r) {
186
186
  if (t <= r * 2 + n * 2 + 3) return Array.from({ length: t }, (e, t) => t + 1);
187
187
  let i = Array.from({ length: r }, (e, t) => t + 1), a = Array.from({ length: r }, (e, n) => t - r + 1 + n), o = Math.max(r + 2, e - n), s = Math.min(t - r - 1, e + n), c = o > r + 2, l = s < t - r - 1, u = [];
188
188
  if (u.push(...i), c) u.push("ellipsis-start");
@@ -192,87 +192,87 @@ function xe(e, t, n, r) {
192
192
  else for (let e = s + 1; e <= t - r; e++) u.push(e);
193
193
  return u.push(...a), u;
194
194
  }
195
- var Se = t(function({ totalPages: e, page: t, defaultPage: r = 1, onChange: i, siblingCount: a = 1, boundaryCount: o = 1, showFirstLast: s = !1, size: l = "md", disabled: u = !1, className: p = "", ...g }, y) {
196
- let { t: b } = N(), x = t !== void 0, [S, C] = c(r), w = Math.min(Math.max(x ? t : S, 1), e), T = n((t) => {
195
+ var Ee = t(function({ totalPages: e, page: t, defaultPage: r = 1, onChange: i, siblingCount: a = 1, boundaryCount: o = 1, showFirstLast: s = !1, size: l = "md", disabled: u = !1, className: p = "", ...m }, h) {
196
+ let { t: v } = N(), x = t !== void 0, [S, C] = c(r), w = Math.min(Math.max(x ? t : S, 1), e), T = n((t) => {
197
197
  let n = Math.min(Math.max(t, 1), e);
198
198
  x || C(n), i?.(n);
199
199
  }, [
200
200
  x,
201
201
  i,
202
202
  e
203
- ]), E = xe(w, e, a, o), D = be[l], O = w <= 1, k = w >= e, A = [
203
+ ]), E = Te(w, e, a, o), D = we[l], O = w <= 1, k = w >= e, A = [
204
204
  "inline-flex items-center justify-center rounded-md font-medium",
205
205
  "transition-colors duration-150 cursor-pointer",
206
206
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-epfl-canard",
207
- K[l]
207
+ W[l]
208
208
  ].join(" "), j = (e) => [A, e ? "bg-epfl-canard text-white" : "text-text-primary hover:bg-bg-tertiary"].filter(Boolean).join(" "), M = (e) => [
209
209
  A,
210
210
  "text-text-secondary hover:bg-bg-tertiary",
211
211
  (u || e) && "opacity-40 pointer-events-none"
212
212
  ].filter(Boolean).join(" ");
213
213
  return e <= 0 ? null : /* @__PURE__ */ f("nav", {
214
- ref: y,
215
- "aria-label": b("common.pagination"),
214
+ ref: h,
215
+ "aria-label": v("common.pagination"),
216
216
  className: ["inline-flex items-center gap-1", p].filter(Boolean).join(" "),
217
- ...g,
217
+ ...m,
218
218
  children: [
219
219
  s && /* @__PURE__ */ d("button", {
220
220
  type: "button",
221
- "aria-label": b("common.first"),
221
+ "aria-label": v("common.first"),
222
222
  disabled: u || O,
223
223
  className: M(O),
224
224
  onClick: () => T(1),
225
- children: /* @__PURE__ */ d(m, {
225
+ children: /* @__PURE__ */ d(g, {
226
226
  size: D,
227
227
  "aria-hidden": !0
228
228
  })
229
229
  }),
230
230
  /* @__PURE__ */ d("button", {
231
231
  type: "button",
232
- "aria-label": b("common.previous"),
232
+ "aria-label": v("common.previous"),
233
233
  disabled: u || O,
234
234
  className: M(O),
235
235
  onClick: () => T(w - 1),
236
- children: /* @__PURE__ */ d(_, {
236
+ children: /* @__PURE__ */ d(y, {
237
237
  size: D,
238
238
  "aria-hidden": !0
239
239
  })
240
240
  }),
241
- E.map((e, t) => {
241
+ E.map((e) => {
242
242
  if (typeof e == "string") return /* @__PURE__ */ d("span", {
243
243
  "aria-hidden": !0,
244
- className: ["inline-flex items-center justify-center select-none text-text-secondary", K[l]].join(" "),
244
+ className: ["inline-flex items-center justify-center select-none text-text-secondary", W[l]].join(" "),
245
245
  children: "…"
246
246
  }, e);
247
- let n = e === w;
247
+ let t = e === w;
248
248
  return /* @__PURE__ */ d("button", {
249
249
  type: "button",
250
- "aria-current": n ? "page" : void 0,
251
- "aria-label": b("common.goToPage", { page: e }),
250
+ "aria-current": t ? "page" : void 0,
251
+ "aria-label": v("common.goToPage", { page: e }),
252
252
  disabled: u,
253
- className: [j(n), u && "opacity-40 pointer-events-none"].filter(Boolean).join(" "),
253
+ className: [j(t), u && "opacity-40 pointer-events-none"].filter(Boolean).join(" "),
254
254
  onClick: () => T(e),
255
255
  children: e
256
256
  }, e);
257
257
  }),
258
258
  /* @__PURE__ */ d("button", {
259
259
  type: "button",
260
- "aria-label": b("common.next"),
260
+ "aria-label": v("common.next"),
261
261
  disabled: u || k,
262
262
  className: M(k),
263
263
  onClick: () => T(w + 1),
264
- children: /* @__PURE__ */ d(v, {
264
+ children: /* @__PURE__ */ d(b, {
265
265
  size: D,
266
266
  "aria-hidden": !0
267
267
  })
268
268
  }),
269
269
  s && /* @__PURE__ */ d("button", {
270
270
  type: "button",
271
- "aria-label": b("common.last"),
271
+ "aria-label": v("common.last"),
272
272
  disabled: u || k,
273
273
  className: M(k),
274
274
  onClick: () => T(e),
275
- children: /* @__PURE__ */ d(h, {
275
+ children: /* @__PURE__ */ d(_, {
276
276
  size: D,
277
277
  "aria-hidden": !0
278
278
  })
@@ -282,16 +282,16 @@ var Se = t(function({ totalPages: e, page: t, defaultPage: r = 1, onChange: i, s
282
282
  });
283
283
  //#endregion
284
284
  //#region src/components/ui/FileUpload.tsx
285
- function Ce(e) {
285
+ function De(e) {
286
286
  return e < 1024 ? `${e} B` : e < 1024 * 1024 ? `${(e / 1024).toFixed(1)} KB` : `${(e / (1024 * 1024)).toFixed(1)} MB`;
287
287
  }
288
- function we({ accept: e, multiple: t = !1, maxSize: r, onFilesSelected: i, onReject: a, disabled: o = !1, label: l = "Drop files here or click to browse", helperText: u, error: p, illustration: m, className: h = "" }) {
289
- let [g, _] = c(!1), [v, b] = c([]), x = s(null), S = !!p, C = n((e) => {
288
+ function Oe({ accept: e, multiple: t = !1, maxSize: r, onFilesSelected: i, onReject: a, disabled: o = !1, label: l = "Drop files here or click to browse", helperText: u, error: p, illustration: m, className: h = "" }) {
289
+ let [g, _] = c(!1), [v, y] = c([]), b = s(null), S = !!p, C = n((e) => {
290
290
  let n = Array.from(e), o = [], s = [];
291
291
  for (let e of n) r && e.size > r ? s.push(e) : o.push(e);
292
292
  if (o.length > 0) {
293
293
  let e = t ? [...v, ...o] : o.slice(0, 1);
294
- b(e), i?.(e);
294
+ y(e), i?.(e);
295
295
  }
296
296
  s.length > 0 && a?.(s);
297
297
  }, [
@@ -309,12 +309,12 @@ function we({ accept: e, multiple: t = !1, maxSize: r, onFilesSelected: i, onRej
309
309
  }, [o, C]), D = n((e) => {
310
310
  e.target.files?.length && C(e.target.files);
311
311
  }, [C]), O = n(() => {
312
- o || x.current?.click();
312
+ o || b.current?.click();
313
313
  }, [o]), k = n((e) => {
314
- !o && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), x.current?.click());
315
- }, [o]), j = n((e) => {
314
+ !o && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), b.current?.click());
315
+ }, [o]), A = n((e) => {
316
316
  let t = v.filter((t, n) => n !== e);
317
- b(t), i?.(t);
317
+ y(t), i?.(t);
318
318
  }, [v, i]);
319
319
  return /* @__PURE__ */ f("div", {
320
320
  className: `flex flex-col gap-1.5 ${h}`,
@@ -335,7 +335,7 @@ function we({ accept: e, multiple: t = !1, maxSize: r, onFilesSelected: i, onRej
335
335
  ].filter(Boolean).join(" "),
336
336
  "aria-disabled": o,
337
337
  children: [
338
- m ?? /* @__PURE__ */ d(y, {
338
+ m ?? /* @__PURE__ */ d(x, {
339
339
  size: 32,
340
340
  className: g ? "text-primary" : "text-text-muted",
341
341
  "aria-hidden": !0
@@ -351,7 +351,7 @@ function we({ accept: e, multiple: t = !1, maxSize: r, onFilesSelected: i, onRej
351
351
  ]
352
352
  }),
353
353
  /* @__PURE__ */ d("input", {
354
- ref: x,
354
+ ref: b,
355
355
  type: "file",
356
356
  accept: e,
357
357
  multiple: t,
@@ -375,16 +375,16 @@ function we({ accept: e, multiple: t = !1, maxSize: r, onFilesSelected: i, onRej
375
375
  }),
376
376
  /* @__PURE__ */ d("span", {
377
377
  className: "shrink-0 text-text-secondary",
378
- children: Ce(e.size)
378
+ children: De(e.size)
379
379
  }),
380
380
  /* @__PURE__ */ d("button", {
381
381
  type: "button",
382
382
  onClick: (e) => {
383
- e.stopPropagation(), j(t);
383
+ e.stopPropagation(), A(t);
384
384
  },
385
385
  className: "shrink-0 p-0.5 rounded-sm text-text-secondary hover:text-text-primary hover:bg-bg-tertiary transition-colors cursor-pointer",
386
386
  "aria-label": `Remove ${e.name}`,
387
- children: /* @__PURE__ */ d(A, { size: 14 })
387
+ children: /* @__PURE__ */ d(M, { size: 14 })
388
388
  })
389
389
  ]
390
390
  }, `${e.name}-${e.size}-${t}`))
@@ -394,30 +394,30 @@ function we({ accept: e, multiple: t = !1, maxSize: r, onFilesSelected: i, onRej
394
394
  }
395
395
  //#endregion
396
396
  //#region src/components/ui/ProgressBar.tsx
397
- var Te = {
397
+ var ke = {
398
398
  sm: "h-1.5",
399
399
  md: "h-2.5",
400
400
  lg: "h-4"
401
- }, Ee = {
401
+ }, Ae = {
402
402
  primary: "bg-primary",
403
403
  success: "bg-success",
404
404
  warning: "bg-warning",
405
405
  error: "bg-error",
406
406
  info: "bg-info"
407
- }, De = t(function({ value: e, variant: t = "primary", size: n = "md", showLabel: r = !1, formatLabel: i, className: a = "", ...o }, s) {
407
+ }, je = t(function({ value: e, variant: t = "primary", size: n = "md", showLabel: r = !1, formatLabel: i, className: a = "", ...o }, s) {
408
408
  let c = Math.round(Math.min(100, Math.max(0, e))), l = i ? i(c) : `${c}%`;
409
409
  return /* @__PURE__ */ f("div", {
410
410
  ref: s,
411
411
  className: `flex items-center gap-2 ${a}`,
412
412
  ...o,
413
413
  children: [/* @__PURE__ */ d("div", {
414
- className: ["flex-1 overflow-hidden rounded-full bg-bg-tertiary", Te[n]].join(" "),
414
+ className: ["flex-1 overflow-hidden rounded-full bg-bg-tertiary", ke[n]].join(" "),
415
415
  role: "progressbar",
416
416
  "aria-valuenow": c,
417
417
  "aria-valuemin": 0,
418
418
  "aria-valuemax": 100,
419
419
  children: /* @__PURE__ */ d("div", {
420
- className: ["h-full rounded-full transition-all duration-300 ease-out", Ee[t]].join(" "),
420
+ className: ["h-full rounded-full transition-all duration-300 ease-out", Ae[t]].join(" "),
421
421
  style: { width: `${c}%` }
422
422
  })
423
423
  }), r && /* @__PURE__ */ d("span", {
@@ -425,7 +425,7 @@ var Te = {
425
425
  children: l
426
426
  })]
427
427
  });
428
- }), Oe = t(function({ label: e, indeterminate: t = !1, helperText: r, error: o, className: c = "", id: l, disabled: u, ...p }, m) {
428
+ }), Me = t(function({ label: e, indeterminate: t = !1, helperText: r, error: o, className: c = "", id: l, disabled: u, ...p }, m) {
429
429
  let h = a(), g = l ?? h, _ = `${g}-helper`, v = !!o, y = s(null), b = n((e) => {
430
430
  y.current = e, typeof m == "function" ? m(e) : m && (m.current = e);
431
431
  }, [m]);
@@ -465,23 +465,23 @@ var Te = {
465
465
  children: o ?? r
466
466
  })]
467
467
  });
468
- }), ke = {
468
+ }), Ne = {
469
469
  sm: "h-8 text-small px-2.5",
470
470
  md: "h-10 text-body px-3",
471
471
  lg: "h-12 text-body px-3.5"
472
- }, Ae = {
472
+ }, Pe = {
473
473
  sm: "pl-8",
474
474
  md: "pl-10",
475
475
  lg: "pl-11"
476
- }, je = {
476
+ }, Fe = {
477
477
  sm: "pr-8",
478
478
  md: "pr-10",
479
479
  lg: "pr-11"
480
- }, q = {
480
+ }, G = {
481
481
  sm: "[&>svg]:size-4",
482
482
  md: "[&>svg]:size-5",
483
483
  lg: "[&>svg]:size-5"
484
- }, Me = t(function({ label: e, helperText: t, error: n, leftIcon: r, rightIcon: i, inputSize: o = "md", className: s = "", id: c, disabled: l, ...u }, p) {
484
+ }, Ie = t(function({ label: e, helperText: t, error: n, leftIcon: r, rightIcon: i, inputSize: o = "md", className: s = "", id: c, disabled: l, ...u }, p) {
485
485
  let m = a(), h = c ?? m, g = `${h}-helper`, _ = !!n;
486
486
  return /* @__PURE__ */ f("div", {
487
487
  className: `flex flex-col gap-1.5 ${s}`,
@@ -495,7 +495,7 @@ var Te = {
495
495
  className: "relative",
496
496
  children: [
497
497
  r && /* @__PURE__ */ d("span", {
498
- className: `pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-text-secondary ${q[o]}`,
498
+ className: `pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-text-secondary ${G[o]}`,
499
499
  "aria-hidden": "true",
500
500
  children: r
501
501
  }),
@@ -511,14 +511,14 @@ var Te = {
511
511
  "focus:border-primary focus:ring-1 focus:ring-primary",
512
512
  "disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-bg-secondary",
513
513
  _ ? "border-error focus:border-error focus:ring-error" : "border-border hover:border-border-strong",
514
- ke[o],
515
- r ? Ae[o] : "",
516
- i ? je[o] : ""
514
+ Ne[o],
515
+ r ? Pe[o] : "",
516
+ i ? Fe[o] : ""
517
517
  ].join(" "),
518
518
  ...u
519
519
  }),
520
520
  i && /* @__PURE__ */ d("span", {
521
- className: `pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3 text-text-secondary ${q[o]}`,
521
+ className: `pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3 text-text-secondary ${G[o]}`,
522
522
  "aria-hidden": "true",
523
523
  children: i
524
524
  })
@@ -531,15 +531,15 @@ var Te = {
531
531
  })
532
532
  ]
533
533
  });
534
- }), J = e(null);
535
- function Ne() {
536
- let e = r(J);
534
+ }), K = e(null);
535
+ function Le() {
536
+ let e = r(K);
537
537
  if (!e) throw Error("RadioGroup.Item must be used within RadioGroup");
538
538
  return e;
539
539
  }
540
- function Y({ name: e, value: t, onChange: n, label: r, helperText: i, error: o, orientation: s = "vertical", disabled: c = !1, children: l, className: u = "" }) {
540
+ function q({ name: e, value: t, onChange: n, label: r, helperText: i, error: o, orientation: s = "vertical", disabled: c = !1, children: l, className: u = "" }) {
541
541
  let p = a(), m = e ?? p, h = `${`${m}-group`}-helper`, g = !!o;
542
- return /* @__PURE__ */ d(J.Provider, {
542
+ return /* @__PURE__ */ d(K.Provider, {
543
543
  value: {
544
544
  name: m,
545
545
  value: t,
@@ -570,8 +570,8 @@ function Y({ name: e, value: t, onChange: n, label: r, helperText: i, error: o,
570
570
  })
571
571
  });
572
572
  }
573
- function Pe({ value: e, label: t, description: n, disabled: r }) {
574
- let { name: i, value: o, onChange: s, disabled: c, hasError: l } = Ne(), u = a(), p = c || r;
573
+ function Re({ value: e, label: t, description: n, disabled: r }) {
574
+ let { name: i, value: o, onChange: s, disabled: c, hasError: l } = Le(), u = a(), p = c || r;
575
575
  return /* @__PURE__ */ f("div", {
576
576
  className: "flex items-start gap-2",
577
577
  children: [/* @__PURE__ */ d("input", {
@@ -603,10 +603,10 @@ function Pe({ value: e, label: t, description: n, disabled: r }) {
603
603
  })]
604
604
  });
605
605
  }
606
- Y.Item = Pe;
606
+ q.Item = Re;
607
607
  //#endregion
608
608
  //#region src/theme/reactSelectStyles.ts
609
- var Fe = (e) => ({
609
+ var J = (e) => ({
610
610
  ...e,
611
611
  borderRadius: 8,
612
612
  colors: {
@@ -629,7 +629,7 @@ var Fe = (e) => ({
629
629
  danger: "var(--color-error)",
630
630
  dangerLight: "var(--color-error-bg)"
631
631
  }
632
- }), X = {
632
+ }), Y = {
633
633
  control: ({ isFocused: e }) => `!shadow-sm !rounded-md !border-border ${e ? "!border-primary !ring-1 !ring-primary" : ""}`,
634
634
  menu: () => "!rounded-lg !shadow-lg !border !border-border",
635
635
  option: ({ isFocused: e, isSelected: t }) => `${t ? "!bg-primary !text-white" : e ? "!bg-bg-tertiary" : ""}`,
@@ -637,7 +637,7 @@ var Fe = (e) => ({
637
637
  };
638
638
  //#endregion
639
639
  //#region src/components/ui/Select.tsx
640
- function Ie({ label: e, helperText: t, error: n, className: r = "", ...i }) {
640
+ function ze({ label: e, helperText: t, error: n, className: r = "", ...i }) {
641
641
  let o = a(), s = i.inputId ?? o, c = `${s}-helper`, l = !!n;
642
642
  return /* @__PURE__ */ f("div", {
643
643
  className: `flex flex-col gap-1.5 ${r}`,
@@ -647,9 +647,9 @@ function Ie({ label: e, helperText: t, error: n, className: r = "", ...i }) {
647
647
  className: "text-small font-medium text-text-primary",
648
648
  children: e
649
649
  }),
650
- /* @__PURE__ */ d(ee, {
650
+ /* @__PURE__ */ d(ne, {
651
651
  inputId: s,
652
- theme: Fe,
652
+ theme: J,
653
653
  menuPortalTarget: document.body,
654
654
  styles: {
655
655
  menuPortal: (e) => ({
@@ -659,9 +659,9 @@ function Ie({ label: e, helperText: t, error: n, className: r = "", ...i }) {
659
659
  ...i.styles
660
660
  },
661
661
  classNames: {
662
- ...X,
662
+ ...Y,
663
663
  control: (e) => {
664
- let t = X.control?.(e) ?? "";
664
+ let t = Y.control?.(e) ?? "";
665
665
  return l ? `${t} !border-error !focus:ring-error` : t;
666
666
  }
667
667
  },
@@ -679,7 +679,7 @@ function Ie({ label: e, helperText: t, error: n, className: r = "", ...i }) {
679
679
  }
680
680
  //#endregion
681
681
  //#region src/components/ui/Switch.tsx
682
- var Le = t(function({ label: e, helperText: t, className: n = "", id: r, disabled: i, ...o }, s) {
682
+ var Be = t(function({ label: e, helperText: t, className: n = "", id: r, disabled: i, ...o }, s) {
683
683
  let c = a(), l = r ?? c, u = `${l}-helper`;
684
684
  return /* @__PURE__ */ f("div", {
685
685
  className: `flex flex-col gap-1 ${n}`,
@@ -722,7 +722,7 @@ var Le = t(function({ label: e, helperText: t, className: n = "", id: r, disable
722
722
  children: t
723
723
  })]
724
724
  });
725
- }), Re = t(function({ label: e, helperText: t, error: r, autoGrow: o = !1, minRows: c = 3, className: l = "", id: u, disabled: p, onChange: m, ...h }, g) {
725
+ }), Ve = t(function({ label: e, helperText: t, error: r, autoGrow: o = !1, minRows: c = 3, className: l = "", id: u, disabled: p, onChange: m, ...h }, g) {
726
726
  let _ = a(), v = u ?? _, y = `${v}-helper`, b = !!r, x = s(null), S = n(() => {
727
727
  let e = x.current;
728
728
  !e || !o || (e.style.height = "auto", e.style.height = `${e.scrollHeight}px`);
@@ -772,20 +772,20 @@ var Le = t(function({ label: e, helperText: t, className: n = "", id: r, disable
772
772
  })
773
773
  ]
774
774
  });
775
- }), ze = e({
775
+ }), He = e({
776
776
  close: () => {},
777
777
  getItemProps: () => ({}),
778
778
  activeIndex: null,
779
779
  setActiveIndex: () => {}
780
780
  });
781
- function Be() {
781
+ function Ue() {
782
782
  return /* @__PURE__ */ d("div", {
783
783
  role: "separator",
784
784
  className: "my-1 border-t border-border"
785
785
  });
786
786
  }
787
- var Ve = t(function({ children: e, icon: t, danger: n = !1, disabled: i = !1, onClick: a, className: o = "", ...s }, c) {
788
- let { close: l } = r(ze);
787
+ var We = t(function({ children: e, icon: t, danger: n = !1, disabled: i = !1, onClick: a, className: o = "", ...s }, c) {
788
+ let { close: l } = r(He);
789
789
  return /* @__PURE__ */ f("button", {
790
790
  ref: c,
791
791
  type: "button",
@@ -808,8 +808,8 @@ var Ve = t(function({ children: e, icon: t, danger: n = !1, disabled: i = !1, on
808
808
  }), e]
809
809
  });
810
810
  });
811
- function He({ trigger: e, children: t, placement: r = "bottom-start", className: i = "" }) {
812
- let [a, o] = c(!1), [l, p] = c(null), m = s([]), { refs: h, floatingStyles: g, context: _ } = V({
811
+ function Ge({ trigger: e, children: t, placement: r = "bottom-start", className: i = "" }) {
812
+ let [a, o] = c(!1), [l, p] = c(null), m = s([]), { refs: h, floatingStyles: g, context: _ } = B({
813
813
  open: a,
814
814
  onOpenChange: o,
815
815
  placement: r,
@@ -819,11 +819,11 @@ function He({ trigger: e, children: t, placement: r = "bottom-start", className:
819
819
  R({ padding: 8 })
820
820
  ],
821
821
  whileElementsMounted: F
822
- }), { getReferenceProps: v, getFloatingProps: y, getItemProps: b } = H([
822
+ }), { getReferenceProps: v, getFloatingProps: y, getItemProps: b } = V([
823
+ ae(_),
823
824
  z(_),
824
- B(_),
825
- U(_, { role: "menu" }),
826
- ae(_, {
825
+ H(_, { role: "menu" }),
826
+ ce(_, {
827
827
  listRef: m,
828
828
  activeIndex: l,
829
829
  onNavigate: p,
@@ -835,7 +835,7 @@ function He({ trigger: e, children: t, placement: r = "bottom-start", className:
835
835
  className: "inline-flex",
836
836
  ...v(),
837
837
  children: e
838
- }), a && /* @__PURE__ */ d(P, { children: /* @__PURE__ */ d(te, {
838
+ }), a && /* @__PURE__ */ d(P, { children: /* @__PURE__ */ d(re, {
839
839
  context: _,
840
840
  modal: !1,
841
841
  children: /* @__PURE__ */ d("div", {
@@ -847,7 +847,7 @@ function He({ trigger: e, children: t, placement: r = "bottom-start", className:
847
847
  i
848
848
  ].join(" "),
849
849
  ...y(),
850
- children: /* @__PURE__ */ d(ze.Provider, {
850
+ children: /* @__PURE__ */ d(He.Provider, {
851
851
  value: {
852
852
  close: x,
853
853
  getItemProps: b,
@@ -861,8 +861,8 @@ function He({ trigger: e, children: t, placement: r = "bottom-start", className:
861
861
  }
862
862
  //#endregion
863
863
  //#region src/components/ui/Popover.tsx
864
- function Ue({ trigger: e, children: t, placement: n = "bottom", open: r, onOpenChange: i, className: a = "" }) {
865
- let [o, s] = c(!1), l = r !== void 0, p = l ? r : o, { refs: m, floatingStyles: h, context: g } = V({
864
+ function Ke({ trigger: e, children: t, placement: n = "bottom", open: r, onOpenChange: i, className: a = "" }) {
865
+ let [o, s] = c(!1), l = r !== void 0, p = l ? r : o, { refs: m, floatingStyles: h, context: g } = B({
866
866
  open: p,
867
867
  onOpenChange: l ? (e) => i?.(e) : s,
868
868
  placement: n,
@@ -872,17 +872,17 @@ function Ue({ trigger: e, children: t, placement: n = "bottom", open: r, onOpenC
872
872
  R({ padding: 8 })
873
873
  ],
874
874
  whileElementsMounted: F
875
- }), { getReferenceProps: _, getFloatingProps: v } = H([
875
+ }), { getReferenceProps: _, getFloatingProps: v } = V([
876
+ ae(g),
876
877
  z(g),
877
- B(g),
878
- U(g)
878
+ H(g)
879
879
  ]);
880
880
  return /* @__PURE__ */ f(u, { children: [/* @__PURE__ */ d("span", {
881
881
  ref: m.setReference,
882
882
  className: "inline-flex",
883
883
  ..._(),
884
884
  children: e
885
- }), p && /* @__PURE__ */ d(P, { children: /* @__PURE__ */ d(te, {
885
+ }), p && /* @__PURE__ */ d(P, { children: /* @__PURE__ */ d(re, {
886
886
  context: g,
887
887
  modal: !1,
888
888
  children: /* @__PURE__ */ d("div", {
@@ -900,12 +900,12 @@ function Ue({ trigger: e, children: t, placement: n = "bottom", open: r, onOpenC
900
900
  }
901
901
  //#endregion
902
902
  //#region src/components/ui/Tabs.tsx
903
- var We = e({
903
+ var qe = e({
904
904
  activeValue: "",
905
905
  idPrefix: ""
906
906
  });
907
- function Ge({ value: e, children: t, className: n = "" }) {
908
- let { activeValue: i, idPrefix: a } = r(We), o = i === e;
907
+ function Je({ value: e, children: t, className: n = "" }) {
908
+ let { activeValue: i, idPrefix: a } = r(qe), o = i === e;
909
909
  return /* @__PURE__ */ d("div", {
910
910
  id: `${a}-panel-${e}`,
911
911
  role: "tabpanel",
@@ -916,7 +916,7 @@ function Ge({ value: e, children: t, className: n = "" }) {
916
916
  children: o && t
917
917
  });
918
918
  }
919
- function Ke({ items: e, value: t, defaultValue: r, onChange: i, children: o, className: l = "" }) {
919
+ function Ye({ items: e, value: t, defaultValue: r, onChange: i, children: o, className: l = "" }) {
920
920
  let u = a().replace(/:/g, ""), p = s(null), m = t !== void 0, [h, g] = c(() => r ?? e.find((e) => !e.disabled)?.value ?? e[0]?.value ?? ""), _ = m ? t : h, v = n((e) => {
921
921
  m || g(e), i?.(e);
922
922
  }, [m, i]), y = e.filter((e) => !e.disabled), b = (e) => {
@@ -941,7 +941,7 @@ function Ke({ items: e, value: t, defaultValue: r, onChange: i, children: o, cla
941
941
  let r = y[n];
942
942
  r && (v(r.value), (p.current?.querySelector(`[data-tab-value="${r.value}"]`))?.focus());
943
943
  };
944
- return /* @__PURE__ */ d(We.Provider, {
944
+ return /* @__PURE__ */ d(qe.Provider, {
945
945
  value: {
946
946
  activeValue: _,
947
947
  idPrefix: u
@@ -985,14 +985,14 @@ function Ke({ items: e, value: t, defaultValue: r, onChange: i, children: o, cla
985
985
  }
986
986
  //#endregion
987
987
  //#region src/components/ui/Tooltip.tsx
988
- var qe = {
988
+ var Xe = {
989
989
  top: "bottom",
990
990
  bottom: "top",
991
991
  left: "right",
992
992
  right: "left"
993
993
  };
994
- function Je({ children: e, content: t, placement: n = "top", delay: r = 200, className: i = "" }) {
995
- let [a, o] = c(!1), l = s(null), { refs: p, floatingStyles: m, context: h, middlewareData: g, placement: _ } = V({
994
+ function Ze({ children: e, content: t, placement: n = "top", delay: r = 200, className: i = "" }) {
995
+ let [a, o] = c(!1), l = s(null), { refs: p, floatingStyles: m, context: h, middlewareData: g, placement: _ } = B({
996
996
  open: a,
997
997
  onOpenChange: o,
998
998
  placement: n,
@@ -1000,17 +1000,17 @@ function Je({ children: e, content: t, placement: n = "top", delay: r = 200, cla
1000
1000
  L(8),
1001
1001
  I(),
1002
1002
  R({ padding: 8 }),
1003
- ne({ element: l })
1003
+ ie({ element: l })
1004
1004
  ],
1005
1005
  whileElementsMounted: F
1006
- }), { getReferenceProps: v, getFloatingProps: y } = H([
1007
- ie(h, {
1006
+ }), { getReferenceProps: v, getFloatingProps: y } = V([
1007
+ se(h, {
1008
1008
  delay: r,
1009
1009
  move: !1
1010
1010
  }),
1011
- re(h),
1012
- B(h),
1013
- U(h, { role: "tooltip" })
1011
+ oe(h),
1012
+ z(h),
1013
+ H(h, { role: "tooltip" })
1014
1014
  ]), b = _.split("-")[0], x = g.arrow?.x, S = g.arrow?.y;
1015
1015
  return /* @__PURE__ */ f(u, { children: [/* @__PURE__ */ d("span", {
1016
1016
  ref: p.setReference,
@@ -1034,14 +1034,14 @@ function Je({ children: e, content: t, placement: n = "top", delay: r = 200, cla
1034
1034
  style: {
1035
1035
  left: x == null ? "" : `${x}px`,
1036
1036
  top: S == null ? "" : `${S}px`,
1037
- [qe[b]]: "-4px"
1037
+ [Xe[b]]: "-4px"
1038
1038
  }
1039
1039
  })]
1040
1040
  }) })] });
1041
1041
  }
1042
1042
  //#endregion
1043
1043
  //#region src/hooks/useLanguage.ts
1044
- function Ye() {
1044
+ function Qe() {
1045
1045
  let { i18n: e } = N(), t = e.language ?? "en", r = n((t) => {
1046
1046
  e.changeLanguage(t);
1047
1047
  }, [e]);
@@ -1055,20 +1055,20 @@ function Ye() {
1055
1055
  }
1056
1056
  //#endregion
1057
1057
  //#region src/components/ui/LanguageSwitcher.tsx
1058
- var Xe = [{
1058
+ var $e = [{
1059
1059
  value: "en",
1060
1060
  label: "EN"
1061
1061
  }, {
1062
1062
  value: "fr",
1063
1063
  label: "FR"
1064
1064
  }];
1065
- function Ze({ className: e = "" }) {
1066
- let { language: t, setLanguage: n } = Ye();
1065
+ function et({ className: e = "" }) {
1066
+ let { language: t, setLanguage: n } = Qe();
1067
1067
  return /* @__PURE__ */ d("div", {
1068
1068
  role: "radiogroup",
1069
1069
  "aria-label": "Language",
1070
1070
  className: ["inline-flex items-center rounded-full border border-border bg-bg-secondary p-0.5", e].filter(Boolean).join(" "),
1071
- children: Xe.map(({ value: e, label: r }) => {
1071
+ children: $e.map(({ value: e, label: r }) => {
1072
1072
  let i = t === e;
1073
1073
  return /* @__PURE__ */ d("button", {
1074
1074
  type: "button",
@@ -1083,57 +1083,57 @@ function Ze({ className: e = "" }) {
1083
1083
  }
1084
1084
  //#endregion
1085
1085
  //#region src/hooks/useTheme.ts
1086
- var Z = "poesis-theme", Q = /* @__PURE__ */ new Set();
1087
- function Qe() {
1088
- Q.forEach((e) => e());
1086
+ var X = "poesis-theme", Z = /* @__PURE__ */ new Set();
1087
+ function tt() {
1088
+ Z.forEach((e) => e());
1089
1089
  }
1090
- function $e(e) {
1091
- return Q.add(e), () => Q.delete(e);
1090
+ function nt(e) {
1091
+ return Z.add(e), () => Z.delete(e);
1092
1092
  }
1093
- function et() {
1093
+ function rt() {
1094
1094
  return document.documentElement.classList.contains("dark") ? "dark" : "light";
1095
1095
  }
1096
- function tt() {
1096
+ function it() {
1097
1097
  return "light";
1098
1098
  }
1099
- function $(e) {
1100
- e === "dark" ? document.documentElement.classList.add("dark") : document.documentElement.classList.remove("dark"), localStorage.setItem(Z, e), Qe();
1099
+ function Q(e) {
1100
+ e === "dark" ? document.documentElement.classList.add("dark") : document.documentElement.classList.remove("dark"), localStorage.setItem(X, e), tt();
1101
1101
  }
1102
- function nt() {
1103
- let e = localStorage.getItem(Z);
1102
+ function at() {
1103
+ let e = localStorage.getItem(X);
1104
1104
  if (e) {
1105
- $(e);
1105
+ Q(e);
1106
1106
  return;
1107
1107
  }
1108
1108
  let t = window.matchMedia("(prefers-color-scheme: dark)").matches;
1109
- $(t ? "dark" : "light");
1109
+ Q(t ? "dark" : "light");
1110
1110
  }
1111
- function rt() {
1112
- let e = l($e, et, tt);
1111
+ function ot() {
1112
+ let e = l(nt, rt, it);
1113
1113
  return i(() => {
1114
1114
  let e = window.matchMedia("(prefers-color-scheme: dark)"), t = (e) => {
1115
- localStorage.getItem(Z) || $(e.matches ? "dark" : "light");
1115
+ localStorage.getItem(X) || Q(e.matches ? "dark" : "light");
1116
1116
  };
1117
1117
  return e.addEventListener("change", t), () => e.removeEventListener("change", t);
1118
1118
  }, []), {
1119
1119
  theme: e,
1120
1120
  toggleTheme: n(() => {
1121
- $(e === "dark" ? "light" : "dark");
1121
+ Q(e === "dark" ? "light" : "dark");
1122
1122
  }, [e]),
1123
1123
  setTheme: n((e) => {
1124
- $(e);
1124
+ Q(e);
1125
1125
  }, []),
1126
1126
  isDark: e === "dark"
1127
1127
  };
1128
1128
  }
1129
1129
  //#endregion
1130
1130
  //#region src/components/ui/ThemeToggle.tsx
1131
- function it({ variant: e = "ghost", size: t = "md", className: n }) {
1132
- let { isDark: r, toggleTheme: i } = rt(), { t: a } = N();
1133
- return /* @__PURE__ */ d(G, {
1131
+ function st({ variant: e = "ghost", size: t = "md", className: n }) {
1132
+ let { isDark: r, toggleTheme: i } = ot(), { t: a } = N();
1133
+ return /* @__PURE__ */ d(Ce, {
1134
1134
  variant: e,
1135
1135
  size: t,
1136
- icon: d(r ? k : C, { size: 16 }),
1136
+ icon: d(r ? j : T, { size: 16 }),
1137
1137
  "aria-label": a("theme.toggleTheme"),
1138
1138
  onClick: i,
1139
1139
  className: n
@@ -1141,32 +1141,34 @@ function it({ variant: e = "ghost", size: t = "md", className: n }) {
1141
1141
  }
1142
1142
  //#endregion
1143
1143
  //#region src/components/layout/TopNav.tsx
1144
- function at({ logo: e, categories: t = [], activeCategoryId: n, onCategoryChange: r, actions: i, onBurgerClick: a }) {
1144
+ var ct = "https://www.epfl.ch/campus/services/website//wp-content/themes/wp-theme-2018/assets/svg/epfl-logo.svg?refresh=now";
1145
+ function lt({ logo: e, logoUrl: t, categories: n = [], activeCategoryId: r, onCategoryChange: i, actions: a, onBurgerClick: o }) {
1145
1146
  return /* @__PURE__ */ f("header", {
1146
1147
  className: "fixed inset-x-0 top-0 z-40 flex h-14 items-center border-b border-border bg-bg-primary px-md",
1147
1148
  children: [
1148
1149
  /* @__PURE__ */ d("button", {
1149
1150
  type: "button",
1150
- onClick: a,
1151
+ onClick: o,
1151
1152
  className: "mr-sm flex size-9 items-center justify-center rounded-md text-text-secondary hover:bg-bg-tertiary hover:text-text-primary lg:hidden",
1152
1153
  "aria-label": "Open menu",
1153
- children: /* @__PURE__ */ d(S, { size: 22 })
1154
+ children: /* @__PURE__ */ d(w, { size: 22 })
1154
1155
  }),
1155
1156
  /* @__PURE__ */ d("div", {
1156
1157
  className: "mr-lg flex shrink-0 items-center",
1157
- children: e ?? /* @__PURE__ */ d("span", {
1158
- className: "text-h3 font-bold text-epfl-red",
1159
- children: "EPFL"
1158
+ children: e ?? /* @__PURE__ */ d("img", {
1159
+ src: t ?? ct,
1160
+ alt: "EPFL",
1161
+ className: "h-[30px] w-auto"
1160
1162
  })
1161
1163
  }),
1162
1164
  /* @__PURE__ */ d("nav", {
1163
1165
  className: "hidden flex-1 items-center gap-xs lg:flex",
1164
1166
  "aria-label": "Main categories",
1165
- children: t.map((e) => {
1166
- let t = e.id === n;
1167
+ children: n.map((e) => {
1168
+ let t = e.id === r;
1167
1169
  return /* @__PURE__ */ f("button", {
1168
1170
  type: "button",
1169
- onClick: () => r?.(e.id),
1171
+ onClick: () => i?.(e.id),
1170
1172
  className: ["flex items-center gap-xs rounded-md px-sm py-xs text-small font-medium transition-colors", t ? "bg-primary/10 text-primary" : "text-text-secondary hover:bg-bg-tertiary hover:text-text-primary"].join(" "),
1171
1173
  "aria-current": t ? "page" : void 0,
1172
1174
  children: [e.icon && /* @__PURE__ */ d(e.icon, { size: 16 }), e.label]
@@ -1174,44 +1176,87 @@ function at({ logo: e, categories: t = [], activeCategoryId: n, onCategoryChange
1174
1176
  })
1175
1177
  }),
1176
1178
  /* @__PURE__ */ d("div", { className: "flex-1 lg:hidden" }),
1177
- i && /* @__PURE__ */ d("div", {
1179
+ a && /* @__PURE__ */ d("div", {
1178
1180
  className: "flex items-center gap-xs",
1179
- children: i
1181
+ children: a
1180
1182
  })
1181
1183
  ]
1182
1184
  });
1183
1185
  }
1184
1186
  //#endregion
1185
1187
  //#region src/components/layout/SideNav.tsx
1186
- function ot({ sections: e = [], activeLinkId: t, onLinkClick: n, collapsed: r = !1 }) {
1188
+ var $ = "sidebar-fold-state", ut = (e) => e.toString().toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").trim().replace(/[^\w\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, ""), dt = (e) => {
1189
+ try {
1190
+ let t = localStorage.getItem($);
1191
+ if (t) return JSON.parse(t)[e] === !0;
1192
+ } catch {}
1193
+ return !1;
1194
+ }, ft = (e, t) => {
1195
+ try {
1196
+ let n = localStorage.getItem($), r = n ? JSON.parse(n) : {};
1197
+ r[e] = t, localStorage.setItem($, JSON.stringify(r));
1198
+ } catch {}
1199
+ };
1200
+ function pt(e, t) {
1201
+ let n = `sidebar-${e ? ut(e) : "fallback"}-open`, [r, i] = c(t ? dt(n) : !0);
1202
+ return {
1203
+ isOpen: r,
1204
+ toggle: () => {
1205
+ if (!t) return;
1206
+ let e = !r;
1207
+ i(e), ft(n, e);
1208
+ }
1209
+ };
1210
+ }
1211
+ function mt({ sections: e = [], activeLinkId: t, onLinkClick: n, collapsed: r = !1, foldable: i = !1, homeLink: a }) {
1187
1212
  return /* @__PURE__ */ d("aside", {
1188
1213
  className: ["hidden lg:flex flex-col border-r border-border bg-bg-secondary overflow-y-auto transition-[width] duration-200", r ? "w-16" : "w-64"].join(" "),
1189
1214
  children: /* @__PURE__ */ d("nav", {
1190
- className: "flex flex-col gap-xs p-sm",
1191
1215
  "aria-label": "Page navigation",
1192
- children: e.map((e) => /* @__PURE__ */ d(st, {
1193
- section: e,
1194
- activeLinkId: t,
1195
- onLinkClick: n,
1196
- collapsed: r
1197
- }, e.id))
1216
+ children: /* @__PURE__ */ f("ul", {
1217
+ className: "list-none m-0 p-0",
1218
+ children: [a && /* @__PURE__ */ d("li", {
1219
+ className: "border-b border-border",
1220
+ children: /* @__PURE__ */ f("button", {
1221
+ type: "button",
1222
+ onClick: () => n?.(a.href),
1223
+ title: r ? a.label : void 0,
1224
+ className: [
1225
+ "flex w-full items-center gap-3 px-4 py-3.5 text-sm no-underline font-medium transition-colors",
1226
+ r ? "justify-center" : "",
1227
+ t === a.href ? "bg-bg-tertiary text-text-primary border-r-2 border-red-600" : "text-text-secondary hover:bg-bg-secondary hover:text-text-primary"
1228
+ ].join(" "),
1229
+ "aria-current": t === a.href ? "page" : void 0,
1230
+ children: [a.icon && /* @__PURE__ */ d(a.icon, {
1231
+ size: 18,
1232
+ className: "shrink-0"
1233
+ }), !r && /* @__PURE__ */ d("span", { children: a.label })]
1234
+ })
1235
+ }), e.map((e) => /* @__PURE__ */ d(ht, {
1236
+ section: e,
1237
+ activeLinkId: t,
1238
+ onLinkClick: n,
1239
+ collapsed: r,
1240
+ foldable: i
1241
+ }, e.id))]
1242
+ })
1198
1243
  })
1199
1244
  });
1200
1245
  }
1201
- function st({ section: e, activeLinkId: t, onLinkClick: n, collapsed: r }) {
1202
- let [i, a] = c(!0);
1203
- return /* @__PURE__ */ f("div", {
1204
- className: "flex flex-col",
1205
- children: [e.title && !r && /* @__PURE__ */ f("button", {
1246
+ function ht({ section: e, activeLinkId: t, onLinkClick: n, collapsed: r, foldable: i }) {
1247
+ let { isOpen: a, toggle: o } = pt(e.title, i);
1248
+ return /* @__PURE__ */ f("li", {
1249
+ className: "border-b border-border last:border-b-0",
1250
+ children: [e.title && !r && (i ? /* @__PURE__ */ f("button", {
1206
1251
  type: "button",
1207
- onClick: () => a((e) => !e),
1208
- className: "flex items-center justify-between rounded-md px-sm py-xs text-caption font-semibold uppercase tracking-wide text-text-secondary hover:text-text-primary",
1209
- children: [/* @__PURE__ */ d("span", { children: e.title }), /* @__PURE__ */ d(g, {
1210
- size: 14,
1211
- className: `transition-transform ${i ? "" : "-rotate-90"}`
1212
- })]
1213
- }), (i || r) && /* @__PURE__ */ d("ul", {
1214
- className: "flex flex-col gap-px",
1252
+ onClick: o,
1253
+ className: ["flex items-center gap-2 w-full text-left px-5 py-4 text-xs font-bold uppercase tracking-wider hover:text-text-primary hover:bg-bg-secondary transition-colors cursor-pointer bg-transparent border-none", e.titleClassName ?? "text-text-muted"].join(" "),
1254
+ children: [d(a ? v : b, { className: "w-3 h-3 shrink-0" }), /* @__PURE__ */ d("span", { children: e.title })]
1255
+ }) : /* @__PURE__ */ d("span", {
1256
+ className: ["block px-5 py-4 text-xs font-bold uppercase tracking-wider", e.titleClassName ?? "text-text-muted"].join(" "),
1257
+ children: e.title
1258
+ })), (a || r) && /* @__PURE__ */ d("ul", {
1259
+ className: "list-none m-0 p-0 pb-1",
1215
1260
  children: e.links.map((e) => {
1216
1261
  let i = e.id === t;
1217
1262
  return /* @__PURE__ */ d("li", { children: /* @__PURE__ */ f("button", {
@@ -1219,9 +1264,9 @@ function st({ section: e, activeLinkId: t, onLinkClick: n, collapsed: r }) {
1219
1264
  onClick: () => n?.(e.href),
1220
1265
  title: r ? e.label : void 0,
1221
1266
  className: [
1222
- "flex w-full items-center gap-sm rounded-md px-sm py-xs text-small transition-colors",
1267
+ "flex w-full items-center gap-sm px-4 py-3 text-sm no-underline transition-colors",
1223
1268
  r ? "justify-center" : "",
1224
- i ? "bg-primary/8 font-medium text-primary" : "text-text-secondary hover:bg-bg-tertiary hover:text-text-primary"
1269
+ i ? "bg-bg-tertiary text-text-primary font-medium border-r-2 border-red-600" : "text-text-secondary hover:bg-bg-secondary hover:text-text-primary"
1225
1270
  ].join(" "),
1226
1271
  "aria-current": i ? "page" : void 0,
1227
1272
  children: [e.icon && /* @__PURE__ */ d(e.icon, { size: 18 }), !r && /* @__PURE__ */ d("span", { children: e.label })]
@@ -1232,7 +1277,7 @@ function st({ section: e, activeLinkId: t, onLinkClick: n, collapsed: r }) {
1232
1277
  }
1233
1278
  //#endregion
1234
1279
  //#region src/components/layout/BurgerDrawer.tsx
1235
- function ct({ open: e, onClose: t, categories: n = [], activeCategoryId: r, onCategoryChange: a, sections: o = [], activeLinkId: c, onLinkClick: l }) {
1280
+ function gt({ open: e, onClose: t, categories: n = [], activeCategoryId: r, onCategoryChange: a, sections: o = [], activeLinkId: c, onLinkClick: l }) {
1236
1281
  let p = s(null);
1237
1282
  return i(() => {
1238
1283
  if (!e) return;
@@ -1265,7 +1310,7 @@ function ct({ open: e, onClose: t, categories: n = [], activeCategoryId: r, onCa
1265
1310
  onClick: t,
1266
1311
  className: "flex size-9 items-center justify-center rounded-md text-text-secondary hover:bg-bg-tertiary hover:text-text-primary",
1267
1312
  "aria-label": "Close menu",
1268
- children: /* @__PURE__ */ d(M, { size: 18 })
1313
+ children: /* @__PURE__ */ d(te, { size: 18 })
1269
1314
  })]
1270
1315
  }), /* @__PURE__ */ f("div", {
1271
1316
  className: "flex-1 overflow-y-auto p-sm",
@@ -1282,7 +1327,7 @@ function ct({ open: e, onClose: t, categories: n = [], activeCategoryId: r, onCa
1282
1327
  className: ["flex items-center gap-sm rounded-md px-sm py-xs text-small font-medium transition-colors", e.id === r ? "bg-primary/10 text-primary" : "text-text-secondary hover:bg-bg-tertiary hover:text-text-primary"].join(" "),
1283
1328
  children: [e.icon && /* @__PURE__ */ d(e.icon, { size: 16 }), e.label]
1284
1329
  }, e.id))]
1285
- }), o.map((e) => /* @__PURE__ */ d(lt, {
1330
+ }), o.map((e) => /* @__PURE__ */ d(_t, {
1286
1331
  section: e,
1287
1332
  activeLinkId: c,
1288
1333
  onLinkClick: (e) => {
@@ -1292,7 +1337,7 @@ function ct({ open: e, onClose: t, categories: n = [], activeCategoryId: r, onCa
1292
1337
  })]
1293
1338
  })] });
1294
1339
  }
1295
- function lt({ section: e, activeLinkId: t, onLinkClick: n }) {
1340
+ function _t({ section: e, activeLinkId: t, onLinkClick: n }) {
1296
1341
  let [r, i] = c(!0);
1297
1342
  return /* @__PURE__ */ f("div", {
1298
1343
  className: "mb-xs flex flex-col",
@@ -1300,7 +1345,7 @@ function lt({ section: e, activeLinkId: t, onLinkClick: n }) {
1300
1345
  type: "button",
1301
1346
  onClick: () => i((e) => !e),
1302
1347
  className: "flex items-center justify-between rounded-md px-sm py-xs text-caption font-semibold uppercase tracking-wide text-text-muted hover:text-text-secondary",
1303
- children: [/* @__PURE__ */ d("span", { children: e.title }), /* @__PURE__ */ d(g, {
1348
+ children: [/* @__PURE__ */ d("span", { children: e.title }), /* @__PURE__ */ d(v, {
1304
1349
  size: 14,
1305
1350
  className: `transition-transform ${r ? "" : "-rotate-90"}`
1306
1351
  })]
@@ -1320,47 +1365,201 @@ function lt({ section: e, activeLinkId: t, onLinkClick: n }) {
1320
1365
  });
1321
1366
  }
1322
1367
  //#endregion
1368
+ //#region src/components/layout/Footer.tsx
1369
+ var vt = "https://www.epfl.ch/campus/services/website//wp-content/themes/wp-theme-2018/assets/svg/epfl-logo.svg?refresh=now", yt = () => (/* @__PURE__ */ new Date()).getFullYear();
1370
+ function bt() {
1371
+ return /* @__PURE__ */ d("footer", {
1372
+ role: "contentinfo",
1373
+ className: "bg-bg-secondary border-t border-border mt-auto",
1374
+ children: /* @__PURE__ */ f("div", {
1375
+ className: "mx-auto max-w-[var(--container-6xl)] px-lg py-xl",
1376
+ children: [/* @__PURE__ */ f("div", {
1377
+ className: "flex flex-wrap gap-lg",
1378
+ children: [/* @__PURE__ */ d("div", {
1379
+ className: "shrink-0",
1380
+ children: /* @__PURE__ */ d("a", {
1381
+ href: "https://www.epfl.ch/en/",
1382
+ children: /* @__PURE__ */ d("img", {
1383
+ src: vt,
1384
+ alt: "Logo EPFL",
1385
+ className: "h-8 w-auto",
1386
+ style: {
1387
+ filter: "var(--logo-filter)",
1388
+ opacity: "var(--logo-opacity)"
1389
+ }
1390
+ })
1391
+ })
1392
+ }), /* @__PURE__ */ f("div", {
1393
+ className: "flex-1 min-w-[280px]",
1394
+ children: [/* @__PURE__ */ f("div", {
1395
+ className: "flex flex-wrap gap-sm items-center mb-sm text-small",
1396
+ children: [
1397
+ /* @__PURE__ */ d("span", {
1398
+ className: "font-medium text-text-primary",
1399
+ children: "Contact"
1400
+ }),
1401
+ /* @__PURE__ */ d("span", {
1402
+ className: "text-text-secondary",
1403
+ children: "EPFL CH-1015 Lausanne"
1404
+ }),
1405
+ /* @__PURE__ */ d("span", {
1406
+ className: "text-text-secondary",
1407
+ children: "+41 21 693 11 11"
1408
+ })
1409
+ ]
1410
+ }), /* @__PURE__ */ f("div", {
1411
+ className: "flex flex-wrap gap-sm text-small mt-sm border-t border-border pt-sm",
1412
+ children: [/* @__PURE__ */ f("div", {
1413
+ className: "flex gap-sm",
1414
+ children: [
1415
+ /* @__PURE__ */ d("a", {
1416
+ href: "https://www.epfl.ch/about/overview/regulations-and-guidelines/disclaimer/",
1417
+ className: "text-text-secondary no-underline hover:text-primary transition-colors",
1418
+ children: "Accessibility"
1419
+ }),
1420
+ /* @__PURE__ */ d("a", {
1421
+ href: "https://www.epfl.ch/about/overview/regulations-and-guidelines/disclaimer/",
1422
+ className: "text-text-secondary no-underline hover:text-primary transition-colors",
1423
+ children: "Disclaimer"
1424
+ }),
1425
+ /* @__PURE__ */ d("a", {
1426
+ href: "https://go.epfl.ch/privacy-policy/",
1427
+ className: "text-text-secondary no-underline hover:text-primary transition-colors",
1428
+ children: "Privacy policy"
1429
+ })
1430
+ ]
1431
+ }), /* @__PURE__ */ f("p", {
1432
+ className: "m-0 text-text-muted text-small",
1433
+ children: [
1434
+ "© ",
1435
+ yt(),
1436
+ " EPFL, all rights reserved"
1437
+ ]
1438
+ })]
1439
+ })]
1440
+ })]
1441
+ }), /* @__PURE__ */ d("div", {
1442
+ className: "flex justify-end pt-md",
1443
+ children: /* @__PURE__ */ d("button", {
1444
+ type: "button",
1445
+ onClick: (e) => {
1446
+ let t = e.currentTarget.closest("[data-scrollable]");
1447
+ t ? t.scrollTo({
1448
+ top: 0,
1449
+ behavior: "smooth"
1450
+ }) : window.scrollTo({
1451
+ top: 0,
1452
+ behavior: "smooth"
1453
+ });
1454
+ },
1455
+ "aria-label": "Back to top",
1456
+ className: "bg-transparent border border-border-strong text-text-muted rounded-full w-9 h-9 cursor-pointer flex items-center justify-center hover:bg-bg-tertiary hover:text-text-primary transition-colors",
1457
+ children: /* @__PURE__ */ d("svg", {
1458
+ viewBox: "0 0 24 24",
1459
+ fill: "none",
1460
+ stroke: "currentColor",
1461
+ strokeWidth: "2",
1462
+ strokeLinecap: "round",
1463
+ strokeLinejoin: "round",
1464
+ className: "w-4 h-4",
1465
+ children: /* @__PURE__ */ d("polyline", { points: "18 15 12 9 6 15" })
1466
+ })
1467
+ })
1468
+ })]
1469
+ })
1470
+ });
1471
+ }
1472
+ //#endregion
1473
+ //#region src/components/layout/UserMenu.tsx
1474
+ function xt({ onLogin: e }) {
1475
+ let { t } = N();
1476
+ return /* @__PURE__ */ d(be, {
1477
+ variant: "primary",
1478
+ size: "sm",
1479
+ iconLeft: /* @__PURE__ */ d(p, { size: 14 }),
1480
+ onClick: e,
1481
+ children: t("auth.login")
1482
+ });
1483
+ }
1484
+ function St({ user: e, onLogout: t }) {
1485
+ let { t: n } = N();
1486
+ return /* @__PURE__ */ f(Ge, {
1487
+ trigger: /* @__PURE__ */ d(fe, {
1488
+ src: e.avatarUrl,
1489
+ name: e.name,
1490
+ size: "sm",
1491
+ className: "cursor-pointer"
1492
+ }),
1493
+ placement: "bottom-end",
1494
+ children: [
1495
+ /* @__PURE__ */ f("div", {
1496
+ className: "px-3 py-2",
1497
+ children: [/* @__PURE__ */ d("p", {
1498
+ className: "text-small font-medium text-text-primary m-0",
1499
+ children: e.name
1500
+ }), /* @__PURE__ */ d("p", {
1501
+ className: "text-caption text-text-secondary m-0",
1502
+ children: e.email
1503
+ })]
1504
+ }),
1505
+ /* @__PURE__ */ d(Ue, {}),
1506
+ /* @__PURE__ */ d(We, {
1507
+ icon: /* @__PURE__ */ d(m, { size: 14 }),
1508
+ onClick: t,
1509
+ children: n("auth.logout")
1510
+ })
1511
+ ]
1512
+ });
1513
+ }
1514
+ //#endregion
1323
1515
  //#region src/components/layout/PageShell.tsx
1324
- function ut({ children: e, logo: t, categories: n = [], activeCategoryId: r, onCategoryChange: i, sections: a = [], activeLinkId: o, onLinkClick: s, actions: l, sideNavCollapsed: u = !1 }) {
1325
- let [p, m] = c(!1);
1516
+ function Ct({ children: e, logo: t, logoUrl: n, categories: r = [], activeCategoryId: i, onCategoryChange: a, sections: o = [], activeLinkId: s, onLinkClick: l, actions: u, sideNavCollapsed: p = !1, sideNavFoldable: m = !1, sideNavHomeLink: h, showFooter: g = !0 }) {
1517
+ let [_, v] = c(!1);
1326
1518
  return /* @__PURE__ */ f("div", {
1327
1519
  className: "flex h-screen flex-col bg-bg-primary",
1328
1520
  children: [
1329
- /* @__PURE__ */ d(at, {
1521
+ /* @__PURE__ */ d(lt, {
1330
1522
  logo: t,
1331
- categories: n,
1332
- activeCategoryId: r,
1333
- onCategoryChange: i,
1334
- actions: l,
1335
- onBurgerClick: () => m(!0)
1523
+ logoUrl: n,
1524
+ categories: r,
1525
+ activeCategoryId: i,
1526
+ onCategoryChange: a,
1527
+ actions: u,
1528
+ onBurgerClick: () => v(!0)
1336
1529
  }),
1337
1530
  /* @__PURE__ */ f("div", {
1338
1531
  className: "flex flex-1 overflow-hidden pt-14",
1339
- children: [/* @__PURE__ */ d(ot, {
1340
- sections: a,
1341
- activeLinkId: o,
1342
- onLinkClick: s,
1343
- collapsed: u
1344
- }), /* @__PURE__ */ d("main", {
1345
- className: "flex-1 overflow-y-auto px-md py-lg lg:px-lg",
1346
- children: /* @__PURE__ */ d("div", {
1347
- className: "mx-auto max-w-[var(--container-6xl)]",
1348
- children: e
1349
- })
1532
+ children: [/* @__PURE__ */ d(mt, {
1533
+ sections: o,
1534
+ activeLinkId: s,
1535
+ onLinkClick: l,
1536
+ collapsed: p,
1537
+ foldable: m,
1538
+ homeLink: h
1539
+ }), /* @__PURE__ */ f("main", {
1540
+ "data-scrollable": !0,
1541
+ className: "flex-1 overflow-y-auto flex flex-col",
1542
+ children: [/* @__PURE__ */ d("div", {
1543
+ className: "flex-1 px-md py-lg lg:px-lg",
1544
+ children: /* @__PURE__ */ d("div", {
1545
+ className: "mx-auto max-w-[var(--container-6xl)]",
1546
+ children: e
1547
+ })
1548
+ }), g && /* @__PURE__ */ d(bt, {})]
1350
1549
  })]
1351
1550
  }),
1352
- /* @__PURE__ */ d(ct, {
1353
- open: p,
1354
- onClose: () => m(!1),
1355
- categories: n,
1356
- activeCategoryId: r,
1551
+ /* @__PURE__ */ d(gt, {
1552
+ open: _,
1553
+ onClose: () => v(!1),
1554
+ categories: r,
1555
+ activeCategoryId: i,
1357
1556
  onCategoryChange: (e) => {
1358
- i?.(e), m(!1);
1557
+ a?.(e), v(!1);
1359
1558
  },
1360
- sections: a,
1361
- activeLinkId: o,
1559
+ sections: o,
1560
+ activeLinkId: s,
1362
1561
  onLinkClick: (e) => {
1363
- s?.(e), m(!1);
1562
+ l?.(e), v(!1);
1364
1563
  }
1365
1564
  })
1366
1565
  ]
@@ -1368,7 +1567,7 @@ function ut({ children: e, logo: t, categories: n = [], activeCategoryId: r, onC
1368
1567
  }
1369
1568
  //#endregion
1370
1569
  //#region src/components/data-display/Card.tsx
1371
- var dt = t(function({ header: e, footer: t, actions: n, noPadding: r = !1, className: i = "", children: a, ...o }, s) {
1570
+ var wt = t(function({ header: e, footer: t, actions: n, noPadding: r = !1, className: i = "", children: a, ...o }, s) {
1372
1571
  let c = t || n;
1373
1572
  return /* @__PURE__ */ f("div", {
1374
1573
  ref: s,
@@ -1402,7 +1601,7 @@ var dt = t(function({ header: e, footer: t, actions: n, noPadding: r = !1, class
1402
1601
  })
1403
1602
  ]
1404
1603
  });
1405
- }), ft = t(function({ items: e, layout: t = "horizontal", dividers: n = !0, className: r = "", ...i }, a) {
1604
+ }), Tt = t(function({ items: e, layout: t = "horizontal", dividers: n = !0, className: r = "", ...i }, a) {
1406
1605
  let o = t === "horizontal";
1407
1606
  return /* @__PURE__ */ d("dl", {
1408
1607
  ref: a,
@@ -1423,7 +1622,7 @@ var dt = t(function({ header: e, footer: t, actions: n, noPadding: r = !1, class
1423
1622
  })]
1424
1623
  }, t))
1425
1624
  });
1426
- }), pt = t(function({ illustration: e, title: t, description: n, action: r, className: i = "", ...a }, o) {
1625
+ }), Et = t(function({ illustration: e, title: t, description: n, action: r, className: i = "", ...a }, o) {
1427
1626
  return /* @__PURE__ */ f("div", {
1428
1627
  ref: o,
1429
1628
  className: ["flex flex-col items-center justify-center text-center py-2xl px-lg", i].filter(Boolean).join(" "),
@@ -1450,7 +1649,7 @@ var dt = t(function({ header: e, footer: t, actions: n, noPadding: r = !1, class
1450
1649
  });
1451
1650
  //#endregion
1452
1651
  //#region src/components/data-display/Table.tsx
1453
- function mt(e, t) {
1652
+ function Dt(e, t) {
1454
1653
  if (!e.sortValue || t.length === 0) return "text";
1455
1654
  for (let n of t) {
1456
1655
  let t = e.sortValue(n);
@@ -1458,18 +1657,18 @@ function mt(e, t) {
1458
1657
  }
1459
1658
  return "text";
1460
1659
  }
1461
- function ht({ active: e, direction: t, columnType: n }) {
1462
- return e ? d(n === "numeric" ? t === "asc" ? D : O : t === "asc" ? w : T, {
1660
+ function Ot({ active: e, direction: t, columnType: n }) {
1661
+ return e ? d(n === "numeric" ? t === "asc" ? k : A : t === "asc" ? E : D, {
1463
1662
  size: 14,
1464
1663
  className: "ml-1 inline",
1465
1664
  "aria-hidden": !0
1466
- }) : /* @__PURE__ */ d(E, {
1665
+ }) : /* @__PURE__ */ d(O, {
1467
1666
  size: 14,
1468
1667
  className: "ml-1 inline opacity-30",
1469
1668
  "aria-hidden": !0
1470
1669
  });
1471
1670
  }
1472
- var gt = t(function({ columns: e, data: t, rowKey: r, striped: i = !1, sort: a, onSortChange: s, emptyContent: l, className: u = "", ...p }, m) {
1671
+ var kt = t(function({ columns: e, data: t, rowKey: r, striped: i = !1, sort: a, onSortChange: s, emptyContent: l, className: u = "", ...p }, m) {
1473
1672
  let [h, g] = c(), _ = a ?? h, v = n((e) => {
1474
1673
  let t = _?.column === e && _.direction === "asc" ? {
1475
1674
  column: e,
@@ -1499,7 +1698,7 @@ var gt = t(function({ columns: e, data: t, rowKey: r, striped: i = !1, sort: a,
1499
1698
  s
1500
1699
  ]), b = o(() => {
1501
1700
  let n = /* @__PURE__ */ new Map();
1502
- for (let r of e) r.sortable && n.set(r.key, mt(r, t));
1701
+ for (let r of e) r.sortable && n.set(r.key, Dt(r, t));
1503
1702
  return n;
1504
1703
  }, [e, t]), x = y.length === 0;
1505
1704
  return /* @__PURE__ */ d("div", {
@@ -1522,7 +1721,7 @@ var gt = t(function({ columns: e, data: t, rowKey: r, striped: i = !1, sort: a,
1522
1721
  "aria-sort": t ? _.direction === "asc" ? "ascending" : "descending" : e.sortable ? "none" : void 0,
1523
1722
  children: /* @__PURE__ */ f("span", {
1524
1723
  className: "inline-flex items-center",
1525
- children: [e.header, e.sortable && /* @__PURE__ */ d(ht, {
1724
+ children: [e.header, e.sortable && /* @__PURE__ */ d(Ot, {
1526
1725
  active: t,
1527
1726
  direction: t ? _.direction : void 0,
1528
1727
  columnType: b.get(e.key) ?? "text"
@@ -1547,34 +1746,34 @@ var gt = t(function({ columns: e, data: t, rowKey: r, striped: i = !1, sort: a,
1547
1746
  }, r(t, n))) })]
1548
1747
  })
1549
1748
  });
1550
- }), _t = {
1749
+ }), At = {
1551
1750
  success: {
1552
1751
  bg: "bg-success-bg",
1553
1752
  border: "border-success/30",
1554
1753
  text: "text-success",
1555
- icon: p
1754
+ icon: h
1556
1755
  },
1557
1756
  warning: {
1558
1757
  bg: "bg-warning-bg",
1559
1758
  border: "border-warning/30",
1560
1759
  text: "text-warning",
1561
- icon: b
1760
+ icon: S
1562
1761
  },
1563
1762
  error: {
1564
1763
  bg: "bg-error-bg",
1565
1764
  border: "border-error/30",
1566
1765
  text: "text-error",
1567
- icon: j
1766
+ icon: ee
1568
1767
  },
1569
1768
  info: {
1570
1769
  bg: "bg-info-bg",
1571
1770
  border: "border-info/30",
1572
1771
  text: "text-info",
1573
- icon: x
1772
+ icon: C
1574
1773
  }
1575
1774
  };
1576
- function vt({ variant: e, title: t, children: n, dismissible: r = !1, onDismiss: i, className: a = "" }) {
1577
- let [o, s] = c(!0), { bg: l, border: u, text: p, icon: m } = _t[e];
1775
+ function jt({ variant: e, title: t, children: n, dismissible: r = !1, onDismiss: i, className: a = "" }) {
1776
+ let [o, s] = c(!0), { bg: l, border: u, text: p, icon: m } = At[e];
1578
1777
  if (!o) return null;
1579
1778
  let h = () => {
1580
1779
  s(!1), i?.();
@@ -1603,19 +1802,19 @@ function vt({ variant: e, title: t, children: n, dismissible: r = !1, onDismiss:
1603
1802
  onClick: h,
1604
1803
  className: "shrink-0 p-1 rounded-sm text-text-secondary hover:text-text-primary hover:bg-bg-tertiary transition-colors cursor-pointer",
1605
1804
  "aria-label": "Dismiss alert",
1606
- children: /* @__PURE__ */ d(A, { size: 16 })
1805
+ children: /* @__PURE__ */ d(M, { size: 16 })
1607
1806
  })
1608
1807
  ]
1609
1808
  });
1610
1809
  }
1611
1810
  //#endregion
1612
1811
  //#region src/components/feedback/Dialog.tsx
1613
- var yt = {
1812
+ var Mt = {
1614
1813
  sm: "max-w-[24rem]",
1615
1814
  md: "max-w-[32rem]",
1616
1815
  lg: "max-w-[42rem]"
1617
1816
  };
1618
- function bt({ open: e, onClose: t, title: n, size: r = "md", children: a, footer: o, className: c = "" }) {
1817
+ function Nt({ open: e, onClose: t, title: n, size: r = "md", children: a, footer: o, className: c = "" }) {
1619
1818
  let l = s(null);
1620
1819
  i(() => {
1621
1820
  if (!e) return;
@@ -1642,7 +1841,7 @@ function bt({ open: e, onClose: t, title: n, size: r = "md", children: a, footer
1642
1841
  e.shiftKey && document.activeElement === n ? (e.preventDefault(), r.focus()) : !e.shiftKey && document.activeElement === r && (e.preventDefault(), n.focus());
1643
1842
  }
1644
1843
  };
1645
- return e ? oe(/* @__PURE__ */ f("div", {
1844
+ return e ? le(/* @__PURE__ */ f("div", {
1646
1845
  style: {
1647
1846
  position: "fixed",
1648
1847
  inset: 0,
@@ -1674,7 +1873,7 @@ function bt({ open: e, onClose: t, title: n, size: r = "md", children: a, footer
1674
1873
  children: /* @__PURE__ */ f("div", {
1675
1874
  ref: l,
1676
1875
  tabIndex: -1,
1677
- className: `relative z-10 flex flex-col w-full ${yt[r]} rounded-lg border border-border bg-bg-primary shadow-xl outline-none animate-dialog-in ${c}`,
1876
+ className: `relative z-10 flex flex-col w-full ${Mt[r]} rounded-lg border border-border bg-bg-primary shadow-xl outline-none animate-dialog-in ${c}`,
1678
1877
  children: [
1679
1878
  n && /* @__PURE__ */ f("div", {
1680
1879
  className: "flex items-center justify-between px-lg py-md border-b border-border",
@@ -1687,7 +1886,7 @@ function bt({ open: e, onClose: t, title: n, size: r = "md", children: a, footer
1687
1886
  onClick: t,
1688
1887
  className: "shrink-0 p-1 rounded-sm text-text-secondary hover:text-text-primary hover:bg-bg-tertiary transition-colors cursor-pointer",
1689
1888
  "aria-label": "Close dialog",
1690
- children: /* @__PURE__ */ d(A, { size: 18 })
1889
+ children: /* @__PURE__ */ d(M, { size: 18 })
1691
1890
  })]
1692
1891
  }),
1693
1892
  /* @__PURE__ */ d("div", {
@@ -1705,15 +1904,15 @@ function bt({ open: e, onClose: t, title: n, size: r = "md", children: a, footer
1705
1904
  }
1706
1905
  //#endregion
1707
1906
  //#region src/components/feedback/ConfirmDialog.tsx
1708
- function xt({ open: e, onCancel: t, onConfirm: n, title: r, children: i, confirmLabel: a = "Confirm", cancelLabel: o = "Cancel", danger: s = !1, submitting: c = !1, size: l = "sm" }) {
1709
- return /* @__PURE__ */ f(bt, {
1907
+ function Pt({ open: e, onCancel: t, onConfirm: n, title: r, children: i, confirmLabel: a = "Confirm", cancelLabel: o = "Cancel", danger: s = !1, submitting: c = !1, size: l = "sm" }) {
1908
+ return /* @__PURE__ */ f(Nt, {
1710
1909
  open: e,
1711
1910
  onClose: t,
1712
1911
  title: r,
1713
1912
  size: l,
1714
1913
  children: [/* @__PURE__ */ f("div", {
1715
1914
  className: "flex gap-3",
1716
- children: [s && /* @__PURE__ */ d(b, {
1915
+ children: [s && /* @__PURE__ */ d(S, {
1717
1916
  size: 22,
1718
1917
  className: "shrink-0 mt-0.5 text-error",
1719
1918
  "aria-hidden": !0
@@ -1738,49 +1937,49 @@ function xt({ open: e, onCancel: t, onConfirm: n, title: r, children: i, confirm
1738
1937
  s ? "bg-error hover:bg-error/80" : "bg-primary hover:bg-primary-hover",
1739
1938
  c && "opacity-80 pointer-events-none"
1740
1939
  ].filter(Boolean).join(" "),
1741
- children: [c && /* @__PURE__ */ d(W, { size: "sm" }), a]
1940
+ children: [c && /* @__PURE__ */ d(U, { size: "sm" }), a]
1742
1941
  })]
1743
1942
  })]
1744
1943
  });
1745
1944
  }
1746
1945
  //#endregion
1747
1946
  //#region src/components/feedback/toastContext.ts
1748
- var St = e(null);
1749
- function Ct() {
1750
- let e = r(St);
1947
+ var Ft = e(null);
1948
+ function It() {
1949
+ let e = r(Ft);
1751
1950
  if (!e) throw Error("useToast must be used within a <ToastProvider>");
1752
1951
  return e;
1753
1952
  }
1754
1953
  //#endregion
1755
1954
  //#region src/components/feedback/Toast.tsx
1756
- var wt = {
1955
+ var Lt = {
1757
1956
  success: {
1758
1957
  bg: "bg-bg-primary",
1759
1958
  accent: "bg-success",
1760
1959
  text: "text-success",
1761
- icon: p
1960
+ icon: h
1762
1961
  },
1763
1962
  warning: {
1764
1963
  bg: "bg-bg-primary",
1765
1964
  accent: "bg-warning",
1766
1965
  text: "text-warning",
1767
- icon: b
1966
+ icon: S
1768
1967
  },
1769
1968
  error: {
1770
1969
  bg: "bg-bg-primary",
1771
1970
  accent: "bg-error",
1772
1971
  text: "text-error",
1773
- icon: j
1972
+ icon: ee
1774
1973
  },
1775
1974
  info: {
1776
1975
  bg: "bg-bg-primary",
1777
1976
  accent: "bg-info",
1778
1977
  text: "text-info",
1779
- icon: x
1978
+ icon: C
1780
1979
  }
1781
1980
  };
1782
- function Tt({ toast: e, onRemove: t }) {
1783
- let { variant: n, title: r, message: a, duration: o = 5e3 } = e, { bg: l, accent: u, text: p, icon: m } = wt[n], [h, g] = c(100), _ = s(0), v = s(0);
1981
+ function Rt({ toast: e, onRemove: t }) {
1982
+ let { variant: n, title: r, message: a, duration: o = 5e3 } = e, { bg: l, accent: u, text: p, icon: m } = Lt[n], [h, g] = c(100), _ = s(0), v = s(0);
1784
1983
  return i(() => {
1785
1984
  if (o <= 0) return;
1786
1985
  _.current = performance.now();
@@ -1824,7 +2023,7 @@ function Tt({ toast: e, onRemove: t }) {
1824
2023
  onClick: () => t(e.id),
1825
2024
  className: "shrink-0 p-1 rounded-sm text-text-secondary hover:text-text-primary hover:bg-bg-tertiary transition-colors cursor-pointer",
1826
2025
  "aria-label": "Dismiss notification",
1827
- children: /* @__PURE__ */ d(A, { size: 14 })
2026
+ children: /* @__PURE__ */ d(M, { size: 14 })
1828
2027
  })
1829
2028
  ]
1830
2029
  }), o > 0 && /* @__PURE__ */ d("div", {
@@ -1836,10 +2035,10 @@ function Tt({ toast: e, onRemove: t }) {
1836
2035
  })]
1837
2036
  });
1838
2037
  }
1839
- var Et = 0;
1840
- function Dt({ children: e }) {
2038
+ var zt = 0;
2039
+ function Bt({ children: e }) {
1841
2040
  let [t, r] = c([]), i = n((e) => {
1842
- let t = `toast-${++Et}`;
2041
+ let t = `toast-${++zt}`;
1843
2042
  return r((n) => [...n, {
1844
2043
  ...e,
1845
2044
  id: t
@@ -1847,7 +2046,7 @@ function Dt({ children: e }) {
1847
2046
  }, []), a = n((e) => {
1848
2047
  r((t) => t.filter((t) => t.id !== e));
1849
2048
  }, []);
1850
- return /* @__PURE__ */ f(St, {
2049
+ return /* @__PURE__ */ f(Ft, {
1851
2050
  value: {
1852
2051
  addToast: i,
1853
2052
  removeToast: a
@@ -1857,7 +2056,7 @@ function Dt({ children: e }) {
1857
2056
  className: "fixed bottom-lg right-lg z-50 flex flex-col-reverse gap-sm pointer-events-none",
1858
2057
  children: t.map((e) => /* @__PURE__ */ d("div", {
1859
2058
  className: "pointer-events-auto",
1860
- children: /* @__PURE__ */ d(Tt, {
2059
+ children: /* @__PURE__ */ d(Rt, {
1861
2060
  toast: e,
1862
2061
  onRemove: a
1863
2062
  })
@@ -1867,12 +2066,12 @@ function Dt({ children: e }) {
1867
2066
  }
1868
2067
  //#endregion
1869
2068
  //#region src/hooks/useAuth.tsx
1870
- var Ot = e(null), kt = {
2069
+ var Vt = e(null), Ht = {
1871
2070
  name: "Alice Martin",
1872
2071
  email: "alice.martin@epfl.ch",
1873
2072
  role: "admin"
1874
2073
  };
1875
- function At({ initialUser: e = kt, children: t }) {
2074
+ function Ut({ initialUser: e = Ht, children: t }) {
1876
2075
  let [n, r] = c(e), i = (e) => r((t) => ({
1877
2076
  ...t,
1878
2077
  role: e
@@ -1880,17 +2079,17 @@ function At({ initialUser: e = kt, children: t }) {
1880
2079
  user: n,
1881
2080
  setRole: i
1882
2081
  }), [n]);
1883
- return /* @__PURE__ */ d(Ot.Provider, {
2082
+ return /* @__PURE__ */ d(Vt.Provider, {
1884
2083
  value: a,
1885
2084
  children: t
1886
2085
  });
1887
2086
  }
1888
- function jt() {
1889
- let e = r(Ot);
2087
+ function Wt() {
2088
+ let e = r(Vt);
1890
2089
  if (!e) throw Error("useAuth must be used within an AuthProvider");
1891
2090
  return e;
1892
2091
  }
1893
2092
  //#endregion
1894
- export { vt as Alert, At as AuthProvider, le as Avatar, fe as Badge, ct as BurgerDrawer, _e as Button, dt as Card, Oe as Checkbox, xt as ConfirmDialog, ft as DescriptionList, bt as Dialog, Be as DropdownDivider, Ve as DropdownItem, He as DropdownMenu, pt as EmptyState, we as FileUpload, G as IconButton, Me as Input, Ze as LanguageSwitcher, ut as PageShell, Se as Pagination, Ue as Popover, De as ProgressBar, Y as RadioGroup, Ie as Select, ot as SideNav, W as Spinner, Le as Switch, Ge as TabPanel, gt as Table, Ke as Tabs, Re as Textarea, it as ThemeToggle, Dt as ToastProvider, Je as Tooltip, at as TopNav, X as epflSelectClassNames, Fe as epflSelectTheme, nt as initTheme, jt as useAuth, Ye as useLanguage, rt as useTheme, Ct as useToast };
2093
+ export { jt as Alert, Ut as AuthProvider, fe as Avatar, he as Badge, gt as BurgerDrawer, be as Button, wt as Card, Me as Checkbox, Pt as ConfirmDialog, Tt as DescriptionList, Nt as Dialog, Ue as DropdownDivider, We as DropdownItem, Ge as DropdownMenu, Et as EmptyState, Oe as FileUpload, bt as Footer, Ce as IconButton, Ie as Input, et as LanguageSwitcher, xt as LoginButton, Ct as PageShell, Ee as Pagination, Ke as Popover, je as ProgressBar, q as RadioGroup, ze as Select, mt as SideNav, U as Spinner, Be as Switch, Je as TabPanel, kt as Table, Ye as Tabs, Ve as Textarea, st as ThemeToggle, Bt as ToastProvider, Ze as Tooltip, lt as TopNav, St as UserMenu, Y as epflSelectClassNames, J as epflSelectTheme, at as initTheme, Wt as useAuth, Qe as useLanguage, ot as useTheme, It as useToast };
1895
2094
 
1896
2095
  //# sourceMappingURL=poesis.js.map