anchor_view_components 0.21.0 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/app/assets/builds/anchor-view-components.css +1 -1
  4. data/app/assets/images/icons/calendar.svg +7 -0
  5. data/app/assets/images/icons/check.svg +4 -0
  6. data/app/assets/images/icons/paste-clipboard.svg +5 -0
  7. data/app/components/anchor/action_menu_component.html.erb +1 -1
  8. data/app/components/anchor/anchor_view_components.ts +2 -0
  9. data/app/components/anchor/button_component.html.erb +1 -0
  10. data/app/components/anchor/button_component.rb +7 -0
  11. data/app/components/anchor/copy_to_clipboard_component.en.yml +2 -0
  12. data/app/components/anchor/copy_to_clipboard_component.html.erb +21 -0
  13. data/app/components/anchor/copy_to_clipboard_component.rb +15 -0
  14. data/app/components/anchor/copy_to_clipboard_controller.ts +34 -0
  15. data/app/components/anchor/popover_component.html.erb +1 -1
  16. data/app/components/anchor/popover_controller.ts +9 -4
  17. data/app/components/anchor/radio_button_collection_component.html.erb +1 -0
  18. data/app/components/anchor/radio_button_collection_component.rb +35 -0
  19. data/app/components/anchor/radio_button_component.html.erb +11 -0
  20. data/app/components/anchor/radio_button_component.rb +105 -0
  21. data/app/components/anchor/side_nav_component.html.erb +1 -0
  22. data/app/components/anchor/table/pagination_component.rb +1 -1
  23. data/app/components/anchor/table_component.html.erb +4 -4
  24. data/app/components/anchor/table_component.rb +8 -0
  25. data/app/components/anchor/text_field_component.html.erb +19 -1
  26. data/app/components/anchor/text_field_component.rb +35 -16
  27. data/app/components/anchor/toast_component.html.erb +1 -1
  28. data/app/components/anchor/toast_component.rb +6 -4
  29. data/app/helpers/anchor/form_builder.rb +38 -29
  30. data/app/helpers/anchor/tailwind_constants.rb +0 -37
  31. data/app/helpers/anchor/view_helper.rb +1 -0
  32. data/lib/anchor/view_components/engine.rb +0 -1
  33. data/lib/anchor/view_components/version.rb +1 -1
  34. data/previews/anchor/copy_to_clipboard_component_preview.rb +7 -0
  35. data/previews/anchor/forms_preview.rb +45 -0
  36. data/previews/anchor/table_component_preview.rb +15 -1
  37. data/previews/anchor/toast_component_preview.rb +5 -4
  38. data/previews/forms/default.html.erb +6 -4
  39. data/previews/forms/radio_button_collection.html.erb +51 -0
  40. data/previews/forms/with_icons.html.erb +10 -0
  41. metadata +16 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa8ed5782253afbdd9c586a20076e73a93784b107cd167a1f852968d219662b4
4
- data.tar.gz: 0d60fc67b91e6ed2e40e785d738156de5f13c22514eda27822baa9c563fc7ddc
3
+ metadata.gz: 10905b7d6e05fbba41122bcfef3df8fbe62af8da1956e2e3f2e7ed45e3ec7cc1
4
+ data.tar.gz: c15cb5d4c53b29054f0a6b888a12b01e4d62e76aca720ca808a02d16a41922f1
5
5
  SHA512:
6
- metadata.gz: 835be6c05e42acc4b702c38eee985f6a790f9b3693578fef3d70945d00717ab83b7bd9c371eaacfb6aecd094dcbc512a91f4b1fcd92b024a56fc3751f5631bea
7
- data.tar.gz: f7c6b681b721e9965722a7402f841e75cf9ebf6d4e9d62b9215df995e8790e9e1478e535103a56543158e324ea59565f4f4efed9164a51464910793af91b66d5
6
+ metadata.gz: 3cad01ec2ce02d85efeca7771869a660ac27cc1916f7f282cac1e6f64e98439b488a56196248627f114242f565e8374b2cb45e749ba80d33b6e91d527f1f1718
7
+ data.tar.gz: 380dad77f2b03ae974055bf2844febe5d9bd2d798172d578923959180754bc99c116c18a8661de318fd90ce935c47306cd53c3296f2e7fe7ddf207440b79fa42
data/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.23.0
4
+
5
+ ### Minor Changes
6
+
7
+ - dba04e0: Support context-aware TableComponent headers
8
+
9
+ ### Patch Changes
10
+
11
+ - 6a461ef: Hide table pagination when no data is available
12
+ - 15467bd: Close action menu when item is clicked
13
+
14
+ ## 0.22.0
15
+
16
+ ### Minor Changes
17
+
18
+ - 3f92869: Infer RadioButtonComponent descriptions
19
+ - a732586: Added a CopyToClipboard component
20
+ - be6f324: Add icon support to TextFieldComponent
21
+ - c23bb32: Generate testids for button and toast components
22
+ - 5070d61: Add RadioButtonCollectionComponent
23
+
24
+ ### Patch Changes
25
+
26
+ - e03dfa7: Remove "anchor/view_helper" require to fix CI
27
+ - 9655588: Fix typo in RELEASING.md
28
+
3
29
  ## 0.21.0
4
30
 
5
31
  ### Minor Changes
@@ -1 +1 @@
1
- /*! tailwindcss v3.3.3 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[popover]{position:fixed;z-index:2147483647;inset:0;padding:.25em;width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content;border:initial solid;border-color:initial;-o-border-image:initial;border-image:initial;background-color:canvas;color:initial;overflow:auto;margin:auto}[popover]:not(.\:popover-open){display:none}[popover]:is(dialog[open]){display:revert}@supports not (background-color:canvas){[popover]{background-color:#fff;color:#000}}@supports (width:-moz-fit-content){[popover]{width:-moz-fit-content;height:-moz-fit-content}}@supports not (inset:0){[popover]{top:0;left:0;right:0;bottom:0}}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.form-input,.form-multiselect,.form-select,.form-textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}.form-input:focus,.form-multiselect:focus,.form-select:focus,.form-textarea:focus{outline:2px solid #0000;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}.form-input::-moz-placeholder,.form-textarea::-moz-placeholder{color:#6b7280;opacity:1}.form-input::placeholder,.form-textarea::placeholder{color:#6b7280;opacity:1}.form-input::-webkit-datetime-edit-fields-wrapper{padding:0}.form-input::-webkit-date-and-time-value{min-height:1.5em}.form-input::-webkit-datetime-edit,.form-input::-webkit-datetime-edit-day-field,.form-input::-webkit-datetime-edit-hour-field,.form-input::-webkit-datetime-edit-meridiem-field,.form-input::-webkit-datetime-edit-millisecond-field,.form-input::-webkit-datetime-edit-minute-field,.form-input::-webkit-datetime-edit-month-field,.form-input::-webkit-datetime-edit-second-field,.form-input::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}.prose{color:#101112;max-width:65ch}.prose :where(p):not(:where([class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol>li):not(:where([class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(hr):not(:where([class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-left-width:.25rem;border-left-color:var(--tw-prose-quote-borders);quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(figure>*):not(:where([class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose :where(code):not(:where([class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose :where(pre code):not(:where([class~=not-prose] *)){background-color:initial;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose] *)){width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose] *)){vertical-align:initial}.prose :where(tfoot):not(:where([class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose] *)){vertical-align:top}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:.875rem;line-height:1rem}.prose :where(video):not(:where([class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(figure):not(:where([class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(li):not(:where([class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose] *)){padding-left:.375em}.prose :where(ul>li):not(:where([class~=not-prose] *)){padding-left:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(hr+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose :where(thead th:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose] *)){padding:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose :where(.prose>:first-child):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose] *)){margin-bottom:0}.action-menu-item>*{display:block;width:100%;padding:.25rem .75rem;text-align:left}.btn{display:inline-flex;height:2.5rem;align-items:center;gap:.5rem;white-space:nowrap;border-radius:.25rem;border-width:1px;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding-left:1.25rem;padding-right:1.25rem;font-size:.75rem;line-height:1rem;font-weight:600;text-decoration-line:none}.btn:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.btn:disabled{pointer-events:none;--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity));--tw-text-opacity:1;color:rgb(156 161 165/var(--tw-text-opacity))}.btn-primary{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-primary:hover{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.btn-primary:disabled{pointer-events:none;border-color:rgb(235 237 240/var(--tw-border-opacity));background-color:rgb(235 237 240/var(--tw-bg-opacity));color:rgb(156 161 165/var(--tw-text-opacity))}.btn-critical,.btn-primary:disabled{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1}.btn-critical{border-color:rgb(191 47 29/var(--tw-border-opacity));background-color:rgb(191 47 29/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.btn-critical:hover{--tw-border-opacity:1;border-color:rgb(148 38 25/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(148 38 25/var(--tw-bg-opacity))}.btn-critical:disabled{pointer-events:none;--tw-border-opacity:1;border-color:rgb(235 237 240/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(235 237 240/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(156 161 165/var(--tw-text-opacity))}.btn-text{color:rgb(39 110 241/var(--tw-text-opacity))}.btn-text,.btn-text:hover{border-color:#0000;background-color:initial;--tw-text-opacity:1}.btn-text:hover{color:rgb(30 84 183/var(--tw-text-opacity))}.btn-text:disabled{pointer-events:none;border-color:#0000;--tw-text-opacity:1;color:rgb(156 161 165/var(--tw-text-opacity))}.btn-small{height:1.75rem;padding-right:.75rem}.btn-small,.btn-with-starting-icon{padding-left:.75rem}.btn-with-ending-icon{padding-right:.75rem}.btn-full-width{width:100%;justify-content:center}.toast{align-items:center}.toast>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.toast{border-radius:.25rem;padding:1rem;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.toast.\:popover-open{position:fixed;top:auto;bottom:2.5rem;margin-left:auto;margin-right:auto;display:flex;overflow:visible;border-width:0}.toast:popover-open{position:fixed;top:auto;bottom:2.5rem;margin-left:auto;margin-right:auto;display:flex;overflow:visible;border-width:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.-left-full{left:-100%}.-top-full{top:-100%}.bottom-0{bottom:0}.right-0{right:0}.z-10{z-index:10}.m-0{margin:0}.m-\[3px\]{margin:3px}.mx-2{margin-left:.5rem;margin-right:.5rem}.\!ml-10{margin-left:2.5rem!important}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-\[500\/341\]{aspect-ratio:500/341}.aspect-\[500\/81\]{aspect-ratio:500/81}.aspect-\[72\/58\]{aspect-ratio:72/58}.aspect-square{aspect-ratio:1/1}.h-5{height:1.25rem}.h-\[120px\]{height:120px}.h-full{height:100%}.max-h-\[100dvh\]{max-height:100dvh}.max-h-\[200px\]{max-height:200px}.max-h-full{max-height:100%}.min-h-\[100dvh\]{min-height:100dvh}.min-h-\[40px\]{min-height:40px}.w-12{width:3rem}.w-5{width:1.25rem}.w-\[15rem\]{width:15rem}.w-\[18px\]{width:18px}.w-\[198px\]{width:198px}.w-\[36rem\]{width:36rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.max-w-full{max-width:100%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.resize-none{resize:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-\[1fr_1fr\]{grid-template-columns:1fr 1fr}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.divide-white\/10>:not([hidden])~:not([hidden]){border-color:#ffffff1a}.self-end{align-self:flex-end}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-grey-40{--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity))}.border-grey-60{--tw-border-opacity:1;border-color:rgb(127 131 135/var(--tw-border-opacity))}.border-subdued{--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity))}.bg-critical-subdued{--tw-bg-opacity:1;background-color:rgb(255 222 217/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.bg-informational-subdued{--tw-bg-opacity:1;background-color:rgb(212 226 252/var(--tw-bg-opacity))}.bg-neutral{--tw-bg-opacity:1;background-color:rgb(235 237 240/var(--tw-bg-opacity))}.bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.bg-success-subdued{--tw-bg-opacity:1;background-color:rgb(218 240 227/var(--tw-bg-opacity))}.bg-teal{--tw-bg-opacity:1;background-color:rgb(28 73 87/var(--tw-bg-opacity))}.bg-warning-subdued{--tw-bg-opacity:1;background-color:rgb(255 242 217/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-white\/\[\.05\]{background-color:#ffffff0d}.bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.bg-\[length\:16px_16px\]{background-size:16px 16px}.bg-\[8px_center\]{background-position:8px}.bg-no-repeat{background-repeat:no-repeat}.p-0{padding:0}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-1{padding-bottom:.25rem}.pb-6{padding-bottom:1.5rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:1.75rem}.text-3xl{font-size:2rem;line-height:2.5rem}.text-4xl{font-size:2.5rem;line-height:3rem}.text-base{font-size:.875rem;line-height:1rem}.text-lg{font-size:1rem;line-height:1.25rem}.text-sm{font-size:.75rem;line-height:1rem}.text-xl{font-size:1.25rem;line-height:1.5rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-4{line-height:1rem}.text-coral{--tw-text-opacity:1;color:rgb(242 170 106/var(--tw-text-opacity))}.text-critical{--tw-text-opacity:1;color:rgb(191 47 29/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-grey-100{--tw-text-opacity:1;color:rgb(16 17 18/var(--tw-text-opacity))}.text-grey-50{--tw-text-opacity:1;color:rgb(156 161 165/var(--tw-text-opacity))}.text-primary{--tw-text-opacity:1;color:rgb(16 17 18/var(--tw-text-opacity))}.text-secondary{--tw-text-opacity:1;color:rgb(98 102 106/var(--tw-text-opacity))}.text-teal{--tw-text-opacity:1;color:rgb(28 73 87/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-white\/60{color:#fff9}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-\[inset_0_-1px\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_-1px\]{--tw-shadow:inset 0 -1px;--tw-shadow-colored:inset 0 -1px var(--tw-shadow-color)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-gray-400{--tw-shadow-color:#9ca3af;--tw-shadow:var(--tw-shadow-colored)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[padding\]{transition-property:padding;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-500{transition-duration:.5s}.backdrop\:bg-grey-100\/50::backdrop{background-color:#10111280}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-x-0:after{content:var(--tw-content);left:0;right:0}.after\:-bottom-1:after{content:var(--tw-content);bottom:-.25rem}.after\:block:after{content:var(--tw-content);display:block}.after\:h-1:after{content:var(--tw-content);height:.25rem}.after\:bg-blue-500:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.checked\:border-blue-50:checked{--tw-border-opacity:1;border-color:rgb(39 110 241/var(--tw-border-opacity))}.checked\:bg-gradient-radial:checked{background-image:radial-gradient(var(--tw-gradient-stops))}.checked\:from-blue-50:checked{--tw-gradient-from:#276ef1 var(--tw-gradient-from-position);--tw-gradient-to:#276ef100 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.checked\:from-\[50\%\]:checked{--tw-gradient-from-position:50%}.checked\:to-transparent:checked{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.checked\:to-\[54\%\]:checked{--tw-gradient-to-position:54%}.focus-within\:bg-grey-10:focus-within{--tw-bg-opacity:1;background-color:rgb(245 246 247/var(--tw-bg-opacity))}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:border-grey-80:hover{--tw-border-opacity:1;border-color:rgb(70 73 77/var(--tw-border-opacity))}.hover\:bg-grey-10:hover{--tw-bg-opacity:1;background-color:rgb(245 246 247/var(--tw-bg-opacity))}.hover\:bg-white\/\[\.05\]:hover{background-color:#ffffff0d}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:text-grey-70:hover{--tw-text-opacity:1;color:rgb(98 102 106/var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.hover\:no-underline:hover{text-decoration-line:none}.checked\:hover\:border-blue-60:hover:checked{--tw-border-opacity:1;border-color:rgb(30 84 183/var(--tw-border-opacity))}.checked\:hover\:from-blue-60:hover:checked{--tw-gradient-from:#1e54b7 var(--tw-gradient-from-position);--tw-gradient-to:#1e54b700 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.checked\:hover\:from-\[50\%\]:hover:checked{--tw-gradient-from-position:50%}.checked\:hover\:to-transparent:hover:checked{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.checked\:hover\:to-\[54\%\]:hover:checked{--tw-gradient-to-position:54%}.focus\:no-underline:focus{text-decoration-line:none}.disabled\:border-grey-40:disabled,.disabled\:checked\:border-grey-40:checked:disabled{--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity))}.disabled\:checked\:from-grey-40:checked:disabled{--tw-gradient-from:#babec3 var(--tw-gradient-from-position);--tw-gradient-to:#babec300 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.disabled\:checked\:from-\[50\%\]:checked:disabled{--tw-gradient-from-position:50%}.disabled\:checked\:to-transparent:checked:disabled{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.disabled\:checked\:to-\[54\%\]:checked:disabled{--tw-gradient-to-position:54%}.aria-readonly\:border-grey-40[aria-readonly=true],.aria-readonly\:checked\:border-grey-40:checked[aria-readonly=true]{--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity))}.aria-readonly\:checked\:from-grey-40:checked[aria-readonly=true]{--tw-gradient-from:#babec3 var(--tw-gradient-from-position);--tw-gradient-to:#babec300 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.aria-readonly\:checked\:from-\[50\%\]:checked[aria-readonly=true]{--tw-gradient-from-position:50%}.aria-readonly\:checked\:to-transparent:checked[aria-readonly=true]{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.aria-readonly\:checked\:to-\[54\%\]:checked[aria-readonly=true]{--tw-gradient-to-position:54%}.group[aria-expanded][data-empty=true][data-loading=false] .group-aria-\[expanded\]\[data-empty\=\'true\'\]\[data-loading\=\'false\'\]\:block,.group[aria-expanded][data-loading=true] .group-aria-\[expanded\]\[data-loading\=\'true\'\]\:block{display:block}.group[data-empty=true] .group-data-\[empty\=\'true\'\]\:hidden,.group[data-loading=true] .group-data-\[loading\=\'true\'\]\:hidden{display:none}.popover-open\:block:popover-open{display:block}.\[\&\>\[aria-selected\=\'true\'\]\]\:bg-blue-20>[aria-selected=true]{--tw-bg-opacity:1;background-color:rgb(212 226 252/var(--tw-bg-opacity))}.\[\&\>li\]\:cursor-pointer>li{cursor:pointer}.\[\&\>li\]\:px-3>li{padding-left:.75rem;padding-right:.75rem}.\[\&\>li\]\:py-2>li{padding-top:.5rem;padding-bottom:.5rem}.\[\&\[readonly\]\]\:border-grey-40[readonly]{--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity))}.\[\&\[readonly\]\]\:bg-grey-10[readonly]{--tw-bg-opacity:1;background-color:rgb(245 246 247/var(--tw-bg-opacity))}.\[\&\[readonly\]\]\:shadow-none[readonly]{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.side-nav-open .\[\.side-nav-open_\&\]\:w-\[3\.5rem\]{width:3.5rem}.side-nav-open .\[\.side-nav-open_\&\]\:rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.side-nav-open .\[\.side-nav-open_\&\]\:px-4{padding-left:1rem;padding-right:1rem}.side-nav-open .\[\.side-nav-open_\&\]\:opacity-0{opacity:0}
1
+ /*! tailwindcss v3.3.3 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[popover]{position:fixed;z-index:2147483647;inset:0;padding:.25em;width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content;border:initial solid;border-color:initial;-o-border-image:initial;border-image:initial;background-color:canvas;color:initial;overflow:auto;margin:auto}[popover]:not(.\:popover-open){display:none}[popover]:is(dialog[open]){display:revert}@supports not (background-color:canvas){[popover]{background-color:#fff;color:#000}}@supports (width:-moz-fit-content){[popover]{width:-moz-fit-content;height:-moz-fit-content}}@supports not (inset:0){[popover]{top:0;left:0;right:0;bottom:0}}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.form-input,.form-multiselect,.form-select,.form-textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}.form-input:focus,.form-multiselect:focus,.form-select:focus,.form-textarea:focus{outline:2px solid #0000;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}.form-input::-moz-placeholder,.form-textarea::-moz-placeholder{color:#6b7280;opacity:1}.form-input::placeholder,.form-textarea::placeholder{color:#6b7280;opacity:1}.form-input::-webkit-datetime-edit-fields-wrapper{padding:0}.form-input::-webkit-date-and-time-value{min-height:1.5em}.form-input::-webkit-datetime-edit,.form-input::-webkit-datetime-edit-day-field,.form-input::-webkit-datetime-edit-hour-field,.form-input::-webkit-datetime-edit-meridiem-field,.form-input::-webkit-datetime-edit-millisecond-field,.form-input::-webkit-datetime-edit-minute-field,.form-input::-webkit-datetime-edit-month-field,.form-input::-webkit-datetime-edit-second-field,.form-input::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}.prose{color:#101112;max-width:65ch}.prose :where(p):not(:where([class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol>li):not(:where([class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(hr):not(:where([class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-left-width:.25rem;border-left-color:var(--tw-prose-quote-borders);quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(figure>*):not(:where([class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose :where(code):not(:where([class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose :where(pre code):not(:where([class~=not-prose] *)){background-color:initial;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose] *)){width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose] *)){vertical-align:initial}.prose :where(tfoot):not(:where([class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose] *)){vertical-align:top}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:.875rem;line-height:1rem}.prose :where(video):not(:where([class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(figure):not(:where([class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(li):not(:where([class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose] *)){padding-left:.375em}.prose :where(ul>li):not(:where([class~=not-prose] *)){padding-left:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(hr+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose :where(thead th:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose] *)){padding:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose :where(.prose>:first-child):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose] *)){margin-bottom:0}.action-menu-item>*{display:block;width:100%;padding:.25rem .75rem;text-align:left}.btn{display:inline-flex;height:2.5rem;align-items:center;gap:.5rem;white-space:nowrap;border-radius:.25rem;border-width:1px;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding-left:1.25rem;padding-right:1.25rem;font-size:.75rem;line-height:1rem;font-weight:600;text-decoration-line:none}.btn:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.btn:disabled{pointer-events:none;--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity));--tw-text-opacity:1;color:rgb(156 161 165/var(--tw-text-opacity))}.btn-primary{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-primary:hover{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.btn-primary:disabled{pointer-events:none;border-color:rgb(235 237 240/var(--tw-border-opacity));background-color:rgb(235 237 240/var(--tw-bg-opacity));color:rgb(156 161 165/var(--tw-text-opacity))}.btn-critical,.btn-primary:disabled{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1}.btn-critical{border-color:rgb(191 47 29/var(--tw-border-opacity));background-color:rgb(191 47 29/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.btn-critical:hover{--tw-border-opacity:1;border-color:rgb(148 38 25/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(148 38 25/var(--tw-bg-opacity))}.btn-critical:disabled{pointer-events:none;--tw-border-opacity:1;border-color:rgb(235 237 240/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(235 237 240/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(156 161 165/var(--tw-text-opacity))}.btn-text{color:rgb(39 110 241/var(--tw-text-opacity))}.btn-text,.btn-text:hover{border-color:#0000;background-color:initial;--tw-text-opacity:1}.btn-text:hover{color:rgb(30 84 183/var(--tw-text-opacity))}.btn-text:disabled{pointer-events:none;border-color:#0000;--tw-text-opacity:1;color:rgb(156 161 165/var(--tw-text-opacity))}.btn-small{height:1.75rem;padding-right:.75rem}.btn-small,.btn-with-starting-icon{padding-left:.75rem}.btn-with-ending-icon{padding-right:.75rem}.btn-full-width{width:100%;justify-content:center}.toast{align-items:center}.toast>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.toast{border-radius:.25rem;padding:1rem;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.toast.\:popover-open{position:fixed;top:auto;bottom:2.5rem;margin-left:auto;margin-right:auto;display:flex;overflow:visible;border-width:0}.toast:popover-open{position:fixed;top:auto;bottom:2.5rem;margin-left:auto;margin-right:auto;display:flex;overflow:visible;border-width:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.-left-full{left:-100%}.-top-full{top:-100%}.bottom-0{bottom:0}.left-4{left:1rem}.right-0{right:0}.right-4{right:1rem}.top-1\/2{top:50%}.z-10{z-index:10}.m-0{margin:0}.m-\[3px\]{margin:3px}.mx-2{margin-left:.5rem;margin-right:.5rem}.\!ml-10{margin-left:2.5rem!important}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-\[500\/341\]{aspect-ratio:500/341}.aspect-\[500\/81\]{aspect-ratio:500/81}.aspect-\[72\/58\]{aspect-ratio:72/58}.aspect-square{aspect-ratio:1/1}.h-5{height:1.25rem}.h-\[120px\]{height:120px}.h-full{height:100%}.max-h-\[100dvh\]{max-height:100dvh}.max-h-\[200px\]{max-height:200px}.max-h-full{max-height:100%}.min-h-\[100dvh\]{min-height:100dvh}.min-h-\[40px\]{min-height:40px}.w-12{width:3rem}.w-5{width:1.25rem}.w-\[15rem\]{width:15rem}.w-\[18px\]{width:18px}.w-\[198px\]{width:198px}.w-\[36rem\]{width:36rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.max-w-full{max-width:100%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.resize-none{resize:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-\[1fr_1fr\]{grid-template-columns:1fr 1fr}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.divide-white\/10>:not([hidden])~:not([hidden]){border-color:#ffffff1a}.self-end{align-self:flex-end}.self-center{align-self:center}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-grey-40{--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity))}.border-grey-60{--tw-border-opacity:1;border-color:rgb(127 131 135/var(--tw-border-opacity))}.border-subdued{--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity))}.bg-critical-subdued{--tw-bg-opacity:1;background-color:rgb(255 222 217/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.bg-informational-subdued{--tw-bg-opacity:1;background-color:rgb(212 226 252/var(--tw-bg-opacity))}.bg-neutral{--tw-bg-opacity:1;background-color:rgb(235 237 240/var(--tw-bg-opacity))}.bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.bg-success-subdued{--tw-bg-opacity:1;background-color:rgb(218 240 227/var(--tw-bg-opacity))}.bg-teal{--tw-bg-opacity:1;background-color:rgb(28 73 87/var(--tw-bg-opacity))}.bg-transparent{background-color:initial}.bg-warning-subdued{--tw-bg-opacity:1;background-color:rgb(255 242 217/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-white\/\[\.05\]{background-color:#ffffff0d}.bg-\[length\:16px_16px\]{background-size:16px 16px}.bg-\[8px_center\]{background-position:8px}.bg-no-repeat{background-repeat:no-repeat}.p-0{padding:0}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-1{padding-bottom:.25rem}.pb-6{padding-bottom:1.5rem}.pl-11{padding-left:2.75rem}.pl-8{padding-left:2rem}.pr-11{padding-right:2.75rem}.pr-2{padding-right:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:1.75rem}.text-3xl{font-size:2rem;line-height:2.5rem}.text-4xl{font-size:2.5rem;line-height:3rem}.text-base{font-size:.875rem;line-height:1rem}.text-lg{font-size:1rem;line-height:1.25rem}.text-sm{font-size:.75rem;line-height:1rem}.text-xl{font-size:1.25rem;line-height:1.5rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-4{line-height:1rem}.text-coral{--tw-text-opacity:1;color:rgb(242 170 106/var(--tw-text-opacity))}.text-critical{--tw-text-opacity:1;color:rgb(191 47 29/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-grey-100{--tw-text-opacity:1;color:rgb(16 17 18/var(--tw-text-opacity))}.text-grey-50{--tw-text-opacity:1;color:rgb(156 161 165/var(--tw-text-opacity))}.text-primary{--tw-text-opacity:1;color:rgb(16 17 18/var(--tw-text-opacity))}.text-secondary{--tw-text-opacity:1;color:rgb(98 102 106/var(--tw-text-opacity))}.text-teal{--tw-text-opacity:1;color:rgb(28 73 87/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-white\/60{color:#fff9}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-\[inset_0_-1px\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_-1px\]{--tw-shadow:inset 0 -1px;--tw-shadow-colored:inset 0 -1px var(--tw-shadow-color)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-gray-400{--tw-shadow-color:#9ca3af;--tw-shadow:var(--tw-shadow-colored)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[padding\]{transition-property:padding;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-500{transition-duration:.5s}.backdrop\:bg-grey-100\/50::backdrop{background-color:#10111280}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-x-0:after{content:var(--tw-content);left:0;right:0}.after\:-bottom-1:after{content:var(--tw-content);bottom:-.25rem}.after\:block:after{content:var(--tw-content);display:block}.after\:h-1:after{content:var(--tw-content);height:.25rem}.after\:bg-blue-500:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.checked\:border-blue-50:checked{--tw-border-opacity:1;border-color:rgb(39 110 241/var(--tw-border-opacity))}.checked\:bg-gradient-radial:checked{background-image:radial-gradient(var(--tw-gradient-stops))}.checked\:from-blue-50:checked{--tw-gradient-from:#276ef1 var(--tw-gradient-from-position);--tw-gradient-to:#276ef100 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.checked\:from-\[50\%\]:checked{--tw-gradient-from-position:50%}.checked\:to-transparent:checked{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.checked\:to-\[54\%\]:checked{--tw-gradient-to-position:54%}.focus-within\:bg-grey-10:focus-within{--tw-bg-opacity:1;background-color:rgb(245 246 247/var(--tw-bg-opacity))}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:border-grey-80:hover{--tw-border-opacity:1;border-color:rgb(70 73 77/var(--tw-border-opacity))}.hover\:bg-grey-10:hover{--tw-bg-opacity:1;background-color:rgb(245 246 247/var(--tw-bg-opacity))}.hover\:bg-white\/\[\.05\]:hover{background-color:#ffffff0d}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:text-grey-70:hover{--tw-text-opacity:1;color:rgb(98 102 106/var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.hover\:no-underline:hover{text-decoration-line:none}.checked\:hover\:border-blue-60:hover:checked{--tw-border-opacity:1;border-color:rgb(30 84 183/var(--tw-border-opacity))}.checked\:hover\:from-blue-60:hover:checked{--tw-gradient-from:#1e54b7 var(--tw-gradient-from-position);--tw-gradient-to:#1e54b700 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.checked\:hover\:from-\[50\%\]:hover:checked{--tw-gradient-from-position:50%}.checked\:hover\:to-transparent:hover:checked{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.checked\:hover\:to-\[54\%\]:hover:checked{--tw-gradient-to-position:54%}.focus\:no-underline:focus{text-decoration-line:none}.disabled\:border-grey-40:disabled,.disabled\:checked\:border-grey-40:checked:disabled{--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity))}.disabled\:checked\:from-grey-40:checked:disabled{--tw-gradient-from:#babec3 var(--tw-gradient-from-position);--tw-gradient-to:#babec300 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.disabled\:checked\:from-\[50\%\]:checked:disabled{--tw-gradient-from-position:50%}.disabled\:checked\:to-transparent:checked:disabled{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.disabled\:checked\:to-\[54\%\]:checked:disabled{--tw-gradient-to-position:54%}.aria-readonly\:border-grey-40[aria-readonly=true],.aria-readonly\:checked\:border-grey-40:checked[aria-readonly=true]{--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity))}.aria-readonly\:checked\:from-grey-40:checked[aria-readonly=true]{--tw-gradient-from:#babec3 var(--tw-gradient-from-position);--tw-gradient-to:#babec300 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.aria-readonly\:checked\:from-\[50\%\]:checked[aria-readonly=true]{--tw-gradient-from-position:50%}.aria-readonly\:checked\:to-transparent:checked[aria-readonly=true]{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.aria-readonly\:checked\:to-\[54\%\]:checked[aria-readonly=true]{--tw-gradient-to-position:54%}.group[aria-expanded][data-empty=true][data-loading=false] .group-aria-\[expanded\]\[data-empty\=\'true\'\]\[data-loading\=\'false\'\]\:block,.group[aria-expanded][data-loading=true] .group-aria-\[expanded\]\[data-loading\=\'true\'\]\:block{display:block}.group[data-empty=true] .group-data-\[empty\=\'true\'\]\:hidden,.group[data-loading=true] .group-data-\[loading\=\'true\'\]\:hidden{display:none}.popover-open\:block:popover-open{display:block}.\[\&\>\[aria-selected\=\'true\'\]\]\:bg-blue-20>[aria-selected=true]{--tw-bg-opacity:1;background-color:rgb(212 226 252/var(--tw-bg-opacity))}.\[\&\>li\]\:cursor-pointer>li{cursor:pointer}.\[\&\>li\]\:px-3>li{padding-left:.75rem;padding-right:.75rem}.\[\&\>li\]\:py-2>li{padding-top:.5rem;padding-bottom:.5rem}.\[\&\[readonly\]\]\:border-grey-40[readonly]{--tw-border-opacity:1;border-color:rgb(186 190 195/var(--tw-border-opacity))}.\[\&\[readonly\]\]\:bg-grey-10[readonly]{--tw-bg-opacity:1;background-color:rgb(245 246 247/var(--tw-bg-opacity))}.\[\&\[readonly\]\]\:shadow-none[readonly]{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.side-nav-open .\[\.side-nav-open_\&\]\:w-\[3\.5rem\]{width:3.5rem}.side-nav-open .\[\.side-nav-open_\&\]\:rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.side-nav-open .\[\.side-nav-open_\&\]\:px-4{padding-left:1rem;padding-right:1rem}.side-nav-open .\[\.side-nav-open_\&\]\:opacity-0{opacity:0}
@@ -0,0 +1,7 @@
1
+ <!-- Source: Iconoir, added via `bin/add_icon` -->
2
+ <svg width="24" height="24" stroke-width="1.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <path d="M15 4V2M15 4V6M15 4H10.5M3 10V19C3 20.1046 3.89543 21 5 21H19C20.1046 21 21 20.1046 21 19V10H3Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
4
+ <path d="M3 10V6C3 4.89543 3.89543 4 5 4H7" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
5
+ <path d="M7 2V6" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
6
+ <path d="M21 10V6C21 4.89543 20.1046 4 19 4H18.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
7
+ </svg>
@@ -0,0 +1,4 @@
1
+ <!-- Source: Iconoir, added via `bin/add_icon` -->
2
+ <svg width="24" height="24" stroke-width="1.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <path d="M5 13L9 17L19 7" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
4
+ </svg>
@@ -0,0 +1,5 @@
1
+ <!-- Source: Iconoir, added via `bin/add_icon` -->
2
+ <svg width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <path d="M8.5 4H6C4.89543 4 4 4.89543 4 6V20C4 21.1046 4.89543 22 6 22H18C19.1046 22 20 21.1046 20 20V6C20 4.89543 19.1046 4 18 4H15.5" stroke="currentColor" stroke-linecap="round"/>
4
+ <path d="M8 6.4V4.5C8 4.22386 8.22386 4 8.5 4C8.77614 4 9.00422 3.77604 9.05152 3.50398C9.19968 2.65171 9.77399 1 12 1C14.226 1 14.8003 2.65171 14.9485 3.50398C14.9958 3.77604 15.2239 4 15.5 4C15.7761 4 16 4.22386 16 4.5V6.4C16 6.73137 15.7314 7 15.4 7H8.6C8.26863 7 8 6.73137 8 6.4Z" stroke="currentColor" stroke-linecap="round"/>
5
+ </svg>
@@ -13,7 +13,7 @@
13
13
  item,
14
14
  **merge_options(item_options,
15
15
  class: "action-menu-item whitespace-nowrap hover:bg-grey-10",
16
- data: { testid: "action-menu-item" },
16
+ data: { testid: "action-menu-item", action: "click->popover#hide" },
17
17
  )
18
18
  ) %>
19
19
  <% end %>
@@ -1,6 +1,7 @@
1
1
  import "@oddbird/popover-polyfill";
2
2
 
3
3
  import AutocompleteController from "./autocomplete_controller";
4
+ import CopyToClipboardController from "./copy_to_clipboard_controller";
4
5
  import DialogController from "./dialog_controller";
5
6
  import InvokerController from "./invoker_controller";
6
7
  import PopoverController from "./popover_controller";
@@ -12,6 +13,7 @@ import { Application } from "@hotwired/stimulus";
12
13
  export function registerAnchorControllers(application: Application) {
13
14
  application.register("autocomplete", AutocompleteController);
14
15
  application.register("dialog", DialogController);
16
+ application.register("copy-to-clipboard", CopyToClipboardController);
15
17
  application.register("invoker", InvokerController);
16
18
  application.register("popover", PopoverController);
17
19
  application.register("sortable", Sortable);
@@ -8,6 +8,7 @@
8
8
  "btn-with-ending-icon" => ending_icon?,
9
9
  "btn-full-width" => full_width,
10
10
  ),
11
+ data: { testid: test_id }
11
12
  }),
12
13
  ) do %>
13
14
  <%= starting_icon if starting_icon? %>
@@ -67,5 +67,12 @@ module Anchor
67
67
  def render?
68
68
  content.present?
69
69
  end
70
+
71
+ def test_id
72
+ wrapper_options.dig(
73
+ :data,
74
+ :testid
75
+ ) || "#{content.to_s.parameterize}-button"
76
+ end
70
77
  end
71
78
  end
@@ -0,0 +1,2 @@
1
+ en:
2
+ copy_to_clipboard: Copy to Clipboard
@@ -0,0 +1,21 @@
1
+ <%= tag.button(
2
+ aria: { label: label || t(".copy_to_clipboard") },
3
+ data: {
4
+ action: "click->copy-to-clipboard#copy",
5
+ controller: "copy-to-clipboard",
6
+ copy_to_clipboard_text_to_copy_value: value,
7
+ copy_to_clipboard_hidden_class: "hidden",
8
+ },
9
+ class: "bg-transparent",
10
+ type: "button",
11
+ ) do %>
12
+ <%= anchor_icon(
13
+ icon: "paste-clipboard",
14
+ data: { copy_to_clipboard_target: "initialIcon"},
15
+ ) %>
16
+ <%= anchor_icon(
17
+ icon: "check",
18
+ classes: "hidden",
19
+ data: { copy_to_clipboard_target: "successIcon"},
20
+ ) %>
21
+ <% end %>
@@ -0,0 +1,15 @@
1
+ module Anchor
2
+ class CopyToClipboardComponent < Component
3
+ attr_reader :label, :value
4
+
5
+ def initialize(
6
+ value: nil,
7
+ label: nil,
8
+ **kwargs
9
+ )
10
+ @label = label
11
+ @value = value
12
+ super
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,34 @@
1
+ import { Controller } from "@hotwired/stimulus";
2
+
3
+ export default class extends Controller<HTMLDivElement> {
4
+ static targets = [ "initialIcon", "successIcon"];
5
+ static classes = [ "hidden" ]
6
+
7
+ declare readonly initialIconTarget: SVGElement;
8
+ declare readonly successIconTarget: SVGElement;
9
+ declare readonly notificationDelayValue: number;
10
+ declare readonly hiddenClass: string;
11
+ declare readonly textToCopyValue: string;
12
+ declare readonly hasTextToCopyValue: boolean;
13
+
14
+ static values = {
15
+ notificationDelay: { type: Number, default: 1500 },
16
+ textToCopy: String,
17
+ };
18
+
19
+ copy(): void {
20
+ if (this.hasTextToCopyValue) {
21
+ navigator.clipboard.writeText(this.textToCopyValue);
22
+ }
23
+ this.toggleIcons();
24
+
25
+ setTimeout(() => {
26
+ this.toggleIcons();
27
+ }, this.notificationDelayValue);
28
+ }
29
+
30
+ toggleIcons(): void {
31
+ this.initialIconTarget.classList.toggle(this.hiddenClass);
32
+ this.successIconTarget.classList.toggle(this.hiddenClass);
33
+ }
34
+ }
@@ -6,7 +6,7 @@
6
6
 
7
7
  <%= tag.div(**merge_options(wrapper_options,
8
8
  class: "absolute -left-full -top-full m-0 bg-white rounded border border-subdued popover-open:block",
9
- data: { action: "toggle->popover#positionPopover" },
9
+ data: { action: "toggle->popover#positionPopover", popover_target: "popover" },
10
10
  popover: "auto",
11
11
  )) do %>
12
12
  <%= content %>
@@ -2,13 +2,14 @@ import { Controller } from "@hotwired/stimulus";
2
2
  import { computePosition, autoPlacement, offset, autoUpdate } from "@floating-ui/dom";
3
3
 
4
4
  export default class extends Controller<HTMLDivElement> {
5
- static targets = ["button"];
5
+ static targets = ["button", "popover"];
6
6
 
7
7
  declare readonly buttonTarget: HTMLButtonElement;
8
+ declare readonly popoverTarget: HTMLDivElement;
8
9
 
9
- positionPopover = (event: { target: HTMLDivElement }): void => {
10
- const trigger = this.buttonTarget
11
- const popover = event.target;
10
+ positionPopover = (): void => {
11
+ const trigger = this.buttonTarget;
12
+ const popover = this.popoverTarget;
12
13
 
13
14
  const updatePosition = () => {
14
15
  computePosition(trigger, popover, {
@@ -29,4 +30,8 @@ export default class extends Controller<HTMLDivElement> {
29
30
 
30
31
  autoUpdate(trigger, popover, updatePosition);
31
32
  };
33
+
34
+ hide = (): void => {
35
+ this.popoverTarget.hidePopover();
36
+ }
32
37
  }
@@ -0,0 +1 @@
1
+ <%= tag.div content, class: "flex flex-col space-y-2 text-base" %>
@@ -0,0 +1,35 @@
1
+ module Anchor
2
+ class RadioButtonCollectionComponent < Component
3
+ attr_reader :attribute, :descriptions, :form_builder
4
+
5
+ def initialize(
6
+ form_builder:,
7
+ attribute:,
8
+ collection:,
9
+ value_method:,
10
+ text_method:,
11
+ **options
12
+ )
13
+ @form_builder = form_builder
14
+ @attribute = attribute
15
+ @collection = collection
16
+ @value_method = value_method
17
+ @text_method = text_method
18
+ @descriptions = options.delete(:descriptions)
19
+
20
+ super
21
+
22
+ def options
23
+ { class: RadioButtonComponent::INPUT_CLASSES }
24
+ end
25
+
26
+ def radio(radio:)
27
+ RadioButtonComponent.new(
28
+ radio:,
29
+ attribute:,
30
+ form_builder:
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,11 @@
1
+ <div class="flex gap-1 items-start">
2
+ <%= radio.radio_button(radio_options) %>
3
+ <% if description.present? %>
4
+ <div class="flex flex-col gap-1">
5
+ <%= radio.label %>
6
+ <%= description_span %>
7
+ </div>
8
+ <% else %>
9
+ <%= tag.div radio.label, class: "self-center" %>
10
+ <% end %>
11
+ </div>
@@ -0,0 +1,105 @@
1
+ module Anchor
2
+ class RadioButtonComponent < Anchor::Component
3
+ INPUT_CLASSES = %w(
4
+ appearance-none
5
+ w-[18px]
6
+ m-[3px]
7
+ aspect-square
8
+ rounded-full
9
+ border-2
10
+ border-grey-60
11
+ hover:border-grey-80
12
+ checked:bg-gradient-radial
13
+ checked:from-blue-50
14
+ checked:from-[50%]
15
+ checked:to-transparent
16
+ checked:to-[54%]
17
+ checked:border-blue-50
18
+ checked:hover:from-blue-60
19
+ checked:hover:from-[50%]
20
+ checked:hover:to-transparent
21
+ checked:hover:to-[54%]
22
+ checked:hover:border-blue-60
23
+ disabled:border-grey-40
24
+ disabled:checked:border-grey-40
25
+ disabled:checked:from-grey-40
26
+ disabled:checked:from-[50%]
27
+ disabled:checked:to-transparent
28
+ disabled:checked:to-[54%]
29
+ disabled:checked:border-grey-40
30
+ aria-readonly:border-grey-40
31
+ aria-readonly:checked:border-grey-40
32
+ aria-readonly:checked:from-grey-40
33
+ aria-readonly:checked:from-[50%]
34
+ aria-readonly:checked:to-transparent
35
+ aria-readonly:checked:to-[54%]
36
+ aria-readonly:checked:border-grey-40
37
+ ).freeze
38
+
39
+ DESCRIPTION_CLASSES = %w(
40
+ text-secondary
41
+ text-sm
42
+ ).freeze
43
+
44
+ def initialize(radio:, attribute:, form_builder:)
45
+ @radio = radio
46
+ @attribute = attribute
47
+ @form_builder = form_builder
48
+
49
+ super
50
+ end
51
+
52
+ private
53
+
54
+ attr_reader :radio, :attribute, :form_builder
55
+
56
+ delegate :value, to: :radio
57
+
58
+ def aria_description
59
+ { describedby: description_id }
60
+ end
61
+
62
+ def description
63
+ if radio.object.is_a?(Hash)
64
+ radio.object[:description]
65
+ elsif radio.object.respond_to?(:description)
66
+ radio.object.description
67
+ elsif I18n.exists?(description_translation_scope)
68
+ human_attribute_description
69
+ else
70
+ false
71
+ end
72
+ end
73
+
74
+ def description_id
75
+ "#{attribute}-#{value}-description"
76
+ end
77
+
78
+ def description_span
79
+ tag.span description, id: description_id, class: DESCRIPTION_CLASSES
80
+ end
81
+
82
+ def description_text
83
+ human_attribute_description
84
+ end
85
+
86
+ def description_translation_scope
87
+ ["activerecord.values", i18n_model_key, description_id.gsub("-", ".")]
88
+ end
89
+
90
+ def human_attribute_description
91
+ I18n.t description_translation_scope.join(".")
92
+ end
93
+
94
+ def i18n_model_key
95
+ form_builder.object.class.model_name.i18n_key
96
+ end
97
+
98
+ def radio_options
99
+ {
100
+ aria: description.present? && aria_description,
101
+ data: { testid: "radio-#{attribute}-#{radio.value}".dasherize },
102
+ }
103
+ end
104
+ end
105
+ end
@@ -108,6 +108,7 @@
108
108
  "[.side-nav-open_&]:opacity-0 transition duration-500",
109
109
  ),
110
110
  data: { testid: "side-nav-footer", toggle_target: "inertify" },
111
+ role: "none",
111
112
  ) do %>
112
113
  <%= tag.p(
113
114
  "#{employee.first_name} #{employee.last_name.first}.",
@@ -14,7 +14,7 @@ module Anchor
14
14
  end
15
15
 
16
16
  def render?
17
- paginate.present?
17
+ paginatable_data.any? && paginate.present?
18
18
  end
19
19
 
20
20
  def next_page_link
@@ -8,7 +8,7 @@
8
8
  <tr class="border-b">
9
9
  <% columns.each do |column| %>
10
10
  <%= tag.th(
11
- column.header,
11
+ header_for(column),
12
12
  class: "px-2 py-3 font-semibold",
13
13
  scope: "col",
14
14
  ) %>
@@ -17,12 +17,12 @@
17
17
  </thead>
18
18
 
19
19
  <%= tag.tbody(data: tbody_data) do
20
- table_data.each do |model| %>
20
+ table_data.each.with_index(1) do |model, tr_index| %>
21
21
  <%= tag.tr(
22
22
  class: row_classes,
23
23
  data: {
24
24
  sortable_update_url: sort_url(model),
25
- testid: "tr-#{model.id}"
25
+ testid: "tr-#{tr_index}"
26
26
  },
27
27
  ) do
28
28
  columns.each.with_index do |column, index| %>
@@ -35,7 +35,7 @@
35
35
  "px-2 py-3": !sort_handle,
36
36
  ),
37
37
  style: sort_handle ? "background-image: url(#{asset_path("icons/menu.svg")})" : "",
38
- data: { testid: "tr-#{model.id}-td-#{column.header.to_s.parameterize}" },
38
+ data: { testid: "tr-#{tr_index}-td-#{index}" },
39
39
  ) %>
40
40
  <% end
41
41
  end
@@ -64,6 +64,14 @@ module Anchor
64
64
  end
65
65
  end
66
66
 
67
+ def header_for(column)
68
+ if column.header.respond_to?(:call)
69
+ column.header.call(self)
70
+ else
71
+ column.header
72
+ end
73
+ end
74
+
67
75
  def value_for(model, column)
68
76
  if column.value.respond_to?(:call)
69
77
  column.value.call(model)
@@ -1 +1,19 @@
1
- <%= content %>
1
+ <% if starting_icon? || ending_icon? %>
2
+ <%= tag.div class: "relative" do %>
3
+ <%= content %>
4
+ <% if starting_icon? %>
5
+ <%= anchor_icon(
6
+ icon: starting_icon,
7
+ classes: class_names(ICON_CLASSES, "left-4")
8
+ ) %>
9
+ <% end %>
10
+ <% if ending_icon? %>
11
+ <%= anchor_icon(
12
+ icon: ending_icon,
13
+ classes: class_names(ICON_CLASSES, "right-4")
14
+ ) %>
15
+ <% end %>
16
+ <% end %>
17
+ <% else %>
18
+ <%= content %>
19
+ <% end %>
@@ -1,30 +1,49 @@
1
1
  module Anchor
2
2
  class TextFieldComponent < Component
3
- INPUT_CLASSES = %w(
4
- block
5
- border
6
- form-input
7
- min-h-[40px]
8
- mt-1
9
- resize-none
10
- rounded
11
- text-base
12
- w-full
13
- [&[readonly]]:bg-grey-10
14
- [&[readonly]]:border-grey-40
15
- [&[readonly]]:shadow-none
3
+ ICON_CLASSES = %w(
4
+ absolute
5
+ h-5
6
+ w-5
7
+ top-1/2
8
+ -translate-y-1/2
9
+ text-secondary
10
+ pointer-events-none
16
11
  ).freeze
17
12
 
18
- def initialize(form_builder:, attribute:, **options)
13
+ def initialize(
14
+ form_builder:,
15
+ attribute:,
16
+ starting_icon: nil,
17
+ ending_icon: nil
18
+ )
19
19
  @form_builder = form_builder
20
20
  @attribute = attribute
21
- @options = options
21
+ @starting_icon = starting_icon
22
+ @ending_icon = ending_icon
22
23
 
23
24
  super
24
25
  end
25
26
 
27
+ attr_reader :starting_icon, :ending_icon
28
+
26
29
  def options
27
- { class: INPUT_CLASSES }
30
+ {
31
+ class: class_names(
32
+ TailwindConstants::INPUT,
33
+ "pl-11" => starting_icon?,
34
+ "pr-11" => ending_icon?
35
+ ),
36
+ }
37
+ end
38
+
39
+ private
40
+
41
+ def starting_icon?
42
+ starting_icon.present?
43
+ end
44
+
45
+ def ending_icon?
46
+ ending_icon.present?
28
47
  end
29
48
  end
30
49
  end
@@ -1,7 +1,7 @@
1
1
  <%= tag.div(
2
2
  **merge_options(wrapper_options, {
3
3
  class: "toast",
4
- data: { controller: "toast" },
4
+ data: { controller: "toast", testid: test_id },
5
5
  popover: "manual",
6
6
  })
7
7
  ) do %>
@@ -7,10 +7,8 @@ module Anchor
7
7
  VARIANT_DEFAULT = :notice
8
8
  VARIANT_MAPPINGS = {
9
9
  VARIANT_DEFAULT => "bg-gray-900 text-white",
10
- :success => "bg-green-700 text-white",
11
- :error => "bg-red-700 text-white",
12
- # TODO: Figma doesn’t provide a yellow ‘alert’ style
13
- :alert => "bg-yellow-600 text-white",
10
+ success: "bg-green-700 text-white",
11
+ error: "bg-red-700 text-white",
14
12
  }.freeze
15
13
  VARIANT_OPTIONS = VARIANT_MAPPINGS.keys
16
14
 
@@ -26,5 +24,9 @@ module Anchor
26
24
  def render?
27
25
  content.present?
28
26
  end
27
+
28
+ def test_id
29
+ wrapper_options.dig(:data, :testid) || "toast"
30
+ end
29
31
  end
30
32
  end
@@ -12,6 +12,36 @@ module Anchor
12
12
  )
13
13
  end
14
14
 
15
+ def collection_radio_buttons(
16
+ attribute,
17
+ collection,
18
+ value_method,
19
+ text_method,
20
+ options = {},
21
+ html_options = {}
22
+ )
23
+ render RadioButtonCollectionComponent.new(
24
+ form_builder: self,
25
+ attribute:,
26
+ collection:,
27
+ value_method:,
28
+ text_method:,
29
+ **options,
30
+ **html_options
31
+ ) do |component|
32
+ super(
33
+ attribute,
34
+ collection,
35
+ value_method,
36
+ text_method,
37
+ options,
38
+ component.options.merge(html_options),
39
+ ) do |radio|
40
+ render component.radio(radio:)
41
+ end
42
+ end
43
+ end
44
+
15
45
  def error_message_for(attribute, options = {})
16
46
  render ErrorMessageComponent.new(
17
47
  form_builder: self,
@@ -34,7 +64,9 @@ module Anchor
34
64
  def text_field(attribute, options = {})
35
65
  render TextFieldComponent.new(
36
66
  form_builder: self,
37
- attribute:
67
+ attribute:,
68
+ starting_icon: options.delete(:starting_icon),
69
+ ending_icon: options.delete(:ending_icon)
38
70
  ) do |component|
39
71
  super attribute, component.options.merge(options)
40
72
  end
@@ -42,33 +74,6 @@ module Anchor
42
74
 
43
75
  # The following methods are pending to be replaced with ViewComponents.
44
76
 
45
- def collection_radio_buttons(
46
- attribute,
47
- collection,
48
- value_method,
49
- text_method,
50
- options = {},
51
- html_options = {}
52
- )
53
- content_tag :div, class: "flex flex-col space-y-2 text-base" do
54
- super(
55
- attribute,
56
- collection,
57
- value_method,
58
- text_method,
59
- options,
60
- html_options.merge(class: Anchor::TailwindConstants::RADIO)
61
- ) do |radio|
62
- content_tag :div, class: "inline-flex items-center gap-1" do
63
- concat(radio.radio_button(
64
- data: { testId: "radio-#{attribute}-#{radio.value}".dasherize }
65
- ))
66
- concat(radio.label { i18n_label("#{attribute}.#{radio.value}") })
67
- end
68
- end
69
- end
70
- end
71
-
72
77
  def datetime_field(attribute, options = {})
73
78
  super attribute, options.merge(class: Anchor::TailwindConstants::INPUT)
74
79
  end
@@ -121,7 +126,11 @@ module Anchor
121
126
  private
122
127
 
123
128
  def i18n_label(attribute)
124
- object.class.human_attribute_name attribute
129
+ if object.class.respond_to?(:human_attribute_name)
130
+ object.class.human_attribute_name(attribute)
131
+ else
132
+ attribute
133
+ end
125
134
  end
126
135
 
127
136
  def view_component?(template)
@@ -11,7 +11,6 @@ module Anchor
11
11
  text-base
12
12
  min-h-[40px]
13
13
  resize-none
14
- mt-1
15
14
  block
16
15
  w-full
17
16
  rounded
@@ -21,42 +20,6 @@ module Anchor
21
20
  [&[readonly]]:shadow-none
22
21
  ).freeze
23
22
 
24
- RADIO = %w(
25
- appearance-none
26
- w-[18px]
27
- m-[3px]
28
- aspect-square
29
- rounded-full
30
- border-2
31
- border-grey-60
32
- hover:border-grey-80
33
- checked:bg-gradient-radial
34
- checked:from-blue-50
35
- checked:from-[50%]
36
- checked:to-transparent
37
- checked:to-[54%]
38
- checked:border-blue-50
39
- checked:hover:from-blue-60
40
- checked:hover:from-[50%]
41
- checked:hover:to-transparent
42
- checked:hover:to-[54%]
43
- checked:hover:border-blue-60
44
- disabled:border-grey-40
45
- disabled:checked:border-grey-40
46
- disabled:checked:from-grey-40
47
- disabled:checked:from-[50%]
48
- disabled:checked:to-transparent
49
- disabled:checked:to-[54%]
50
- disabled:checked:border-grey-40
51
- aria-readonly:border-grey-40
52
- aria-readonly:checked:border-grey-40
53
- aria-readonly:checked:from-grey-40
54
- aria-readonly:checked:from-[50%]
55
- aria-readonly:checked:to-transparent
56
- aria-readonly:checked:to-[54%]
57
- aria-readonly:checked:border-grey-40
58
- ).freeze
59
-
60
23
  TEXT_AREA = %w(
61
24
  h-[120px]
62
25
  ).freeze
@@ -7,6 +7,7 @@ module Anchor
7
7
  banner
8
8
  breadcrumbs
9
9
  button
10
+ copy_to_clipboard
10
11
  dialog
11
12
  favicons
12
13
  icon
@@ -25,7 +25,6 @@ module Anchor
25
25
 
26
26
  initializer "anchor_view_components.helper" do
27
27
  ActiveSupport.on_load(:action_controller_base) do
28
- require "anchor/view_helper"
29
28
  helper Anchor::ViewHelper
30
29
  end
31
30
  end
@@ -1,5 +1,5 @@
1
1
  module Anchor
2
2
  module ViewComponents
3
- VERSION = "0.21.0".freeze
3
+ VERSION = "0.23.0".freeze
4
4
  end
5
5
  end
@@ -0,0 +1,7 @@
1
+ module Anchor
2
+ class CopyToClipboardComponentPreview < Preview
3
+ def default
4
+ anchor_copy_to_clipboard(value: "Copy Me")
5
+ end
6
+ end
7
+ end
@@ -1,16 +1,61 @@
1
1
  module Anchor
2
2
  class FormsPreview < Preview
3
+ Option = Data.define(:value, :text, :description)
4
+
3
5
  def default
4
6
  model = FakeUser.new(name: "Jerry Seinfeld")
5
7
 
6
8
  render_with_template(template: "forms/default", locals: { model: })
7
9
  end
8
10
 
11
+ def with_icons
12
+ render_with_template(template: "forms/with_icons")
13
+ end
14
+
9
15
  def with_errors
10
16
  model = FakeUser.new
11
17
  model.valid?
12
18
 
13
19
  render_with_template(template: "forms/default", locals: { model: })
14
20
  end
21
+
22
+ def radio_button_collection
23
+ model = FakeUser.new
24
+
25
+ render_with_template(
26
+ template: "forms/radio_button_collection",
27
+ locals: { model:, object_options:, hash_options: }
28
+ )
29
+ end
30
+
31
+ private
32
+
33
+ def object_options
34
+ [
35
+ Option.new(
36
+ value: "english",
37
+ text: "English",
38
+ description: "Object #1"
39
+ ),
40
+ Option.new(
41
+ value: "portuguese",
42
+ text: "Portuguese",
43
+ description: "Object #2"
44
+ ),
45
+ Option.new(
46
+ value: "spanish",
47
+ text: "Spanish",
48
+ description: "Object #3"
49
+ ),
50
+ ]
51
+ end
52
+
53
+ def hash_options
54
+ [
55
+ { value: "english", text: "English", description: "Hash #1" },
56
+ { value: "portuguese", text: "Portuguese", description: "Hash #2" },
57
+ { value: "spanish", text: "Spanish", description: "Hash #3" },
58
+ ]
59
+ end
15
60
  end
16
61
  end
@@ -59,7 +59,7 @@ module Anchor
59
59
  end
60
60
 
61
61
  def empty_data
62
- anchor_table(data: []) do |table|
62
+ anchor_table(data: [], paginate: true) do |table|
63
63
  table.with_column(header: "ID", value: :id)
64
64
  table.with_column(header: "Name", value: -> { _1.name.capitalize })
65
65
  end
@@ -72,6 +72,20 @@ module Anchor
72
72
  end
73
73
  end
74
74
 
75
+ def context_aware_headers
76
+ anchor_table(data:, paginate: 2) do |table|
77
+ table.with_column(
78
+ header: lambda do |table_component|
79
+ table_component.paginated_data.sum(&:id).then do |sum|
80
+ "Sum of currently displayed IDs: #{sum}"
81
+ end
82
+ end,
83
+ value: :id
84
+ )
85
+ table.with_column(header: "Value", value: -> { _1.name.capitalize })
86
+ end
87
+ end
88
+
75
89
  private
76
90
 
77
91
  def data
@@ -1,5 +1,10 @@
1
1
  module Anchor
2
2
  class ToastComponentPreview < Preview
3
+
4
+ def default
5
+ anchor_toast("Questionnaire created")
6
+ end
7
+
3
8
  def variant_notice
4
9
  anchor_toast("Questionnaire created", variant: :notice)
5
10
  end
@@ -12,10 +17,6 @@ module Anchor
12
17
  anchor_toast("Questionnaire deleted", variant: :error)
13
18
  end
14
19
 
15
- def variant_alert
16
- anchor_toast("Questionnaire created", variant: :alert)
17
- end
18
-
19
20
  def with_icon
20
21
  anchor_toast do |toast|
21
22
  toast.with_icon(icon: "check-circle")
@@ -1,5 +1,7 @@
1
- <%= anchor_form_with model:, url: false do |form| %>
2
- <%= form.label :name %>
3
- <%= form.text_field :name %>
4
- <%= form.error_message_for :name %>
1
+ <%= anchor_form_with model:, url: false, class: "flex flex-col gap-4" do |form| %>
2
+ <%= tag.div do %>
3
+ <%= form.label :name %>
4
+ <%= form.text_field :name %>
5
+ <%= form.error_message_for :name %>
6
+ <% end %>
5
7
  <% end %>
@@ -0,0 +1,51 @@
1
+ <div class="space-y-5">
2
+ <%= anchor_form_with url: false do |form| %>
3
+ <%= tag.div do %>
4
+ <%= form.legend "Object options" %>
5
+ <%= form.collection_radio_buttons(
6
+ :language,
7
+ object_options,
8
+ :value,
9
+ :text,
10
+ { checked: FakeUser::LANGUAGES.sample }
11
+ ) %>
12
+ <% end %>
13
+ <% end %>
14
+
15
+ <%= anchor_form_with url: false do |form| %>
16
+ <%= tag.div do %>
17
+ <%= form.legend "Hash options" %>
18
+ <%= form.collection_radio_buttons(
19
+ :language,
20
+ hash_options,
21
+ ->(option) { option[:value] },
22
+ ->(option) { option[:text] },
23
+ { checked: FakeUser::LANGUAGES.sample }
24
+ ) %>
25
+ <% end %>
26
+ <% end %>
27
+
28
+ <%= anchor_form_with model:, url: false do |form| %>
29
+ <%= tag.div do %>
30
+ <%= form.legend "Translated descriptions" %>
31
+ <%= form.collection_radio_buttons(
32
+ :language,
33
+ FakeUser::LANGUAGES,
34
+ :to_s,
35
+ :titleize,
36
+ ) %>
37
+ <% end %>
38
+ <% end %>
39
+
40
+ <%= anchor_form_with model: FakeCar.new, url: false do |form| %>
41
+ <%= tag.div do %>
42
+ <%= form.legend "No descriptions" %>
43
+ <%= form.collection_radio_buttons(
44
+ :color,
45
+ FakeCar::COLORS,
46
+ :to_s,
47
+ :titleize,
48
+ ) %>
49
+ <% end %>
50
+ <% end %>
51
+ </div>
@@ -0,0 +1,10 @@
1
+ <%= anchor_form_with url: false, method: :get do |form| %>
2
+ <div class="flex flex-col gap-4">
3
+ <%= form.text_field :search, placeholder: "Search…",
4
+ starting_icon: :search %>
5
+ <%= form.text_field :search, placeholder: "Search…",
6
+ ending_icon: :calendar %>
7
+ <%= form.text_field :search, placeholder: "Search…", starting_icon: :search,
8
+ ending_icon: :calendar %>
9
+ </div>
10
+ <% end %>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: anchor_view_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.0
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Buoy Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-04 00:00:00.000000000 Z
11
+ date: 2023-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -55,14 +55,17 @@ files:
55
55
  - app/assets/images/favicon.ico
56
56
  - app/assets/images/favicon.svg
57
57
  - app/assets/images/icons/README.md
58
+ - app/assets/images/icons/calendar.svg
58
59
  - app/assets/images/icons/cancel.svg
59
60
  - app/assets/images/icons/check-circle.svg
61
+ - app/assets/images/icons/check.svg
60
62
  - app/assets/images/icons/fast-left-circle.svg
61
63
  - app/assets/images/icons/loading-indicator.svg
62
64
  - app/assets/images/icons/menu.svg
63
65
  - app/assets/images/icons/nav-arrow-down.svg
64
66
  - app/assets/images/icons/nav-arrow-left.svg
65
67
  - app/assets/images/icons/nav-arrow-right.svg
68
+ - app/assets/images/icons/paste-clipboard.svg
66
69
  - app/assets/images/icons/search.svg
67
70
  - app/assets/images/icons/warning-triangle.svg
68
71
  - app/assets/stylesheets/anchor-view-components.tailwind.css
@@ -87,6 +90,10 @@ files:
87
90
  - app/components/anchor/button_component.html.erb
88
91
  - app/components/anchor/button_component.rb
89
92
  - app/components/anchor/component.rb
93
+ - app/components/anchor/copy_to_clipboard_component.en.yml
94
+ - app/components/anchor/copy_to_clipboard_component.html.erb
95
+ - app/components/anchor/copy_to_clipboard_component.rb
96
+ - app/components/anchor/copy_to_clipboard_controller.ts
90
97
  - app/components/anchor/dialog_component.html.erb
91
98
  - app/components/anchor/dialog_component.rb
92
99
  - app/components/anchor/dialog_controller.ts
@@ -117,6 +124,10 @@ files:
117
124
  - app/components/anchor/popover_controller.ts
118
125
  - app/components/anchor/prose_component.html.erb
119
126
  - app/components/anchor/prose_component.rb
127
+ - app/components/anchor/radio_button_collection_component.html.erb
128
+ - app/components/anchor/radio_button_collection_component.rb
129
+ - app/components/anchor/radio_button_component.html.erb
130
+ - app/components/anchor/radio_button_component.rb
120
131
  - app/components/anchor/side_nav_component.en.yml
121
132
  - app/components/anchor/side_nav_component.html.erb
122
133
  - app/components/anchor/side_nav_component.rb
@@ -155,6 +166,7 @@ files:
155
166
  - previews/anchor/banner_component_preview.rb
156
167
  - previews/anchor/breadcrumbs_component_preview.rb
157
168
  - previews/anchor/button_component_preview.rb
169
+ - previews/anchor/copy_to_clipboard_component_preview.rb
158
170
  - previews/anchor/dialog_component_preview.rb
159
171
  - previews/anchor/dialog_component_preview/with_custom_show_button.html.erb
160
172
  - previews/anchor/dialog_component_preview/with_footer.html.erb
@@ -174,6 +186,8 @@ files:
174
186
  - previews/anchor/text_component_preview.rb
175
187
  - previews/anchor/toast_component_preview.rb
176
188
  - previews/forms/default.html.erb
189
+ - previews/forms/radio_button_collection.html.erb
190
+ - previews/forms/with_icons.html.erb
177
191
  - previews/pages/forms.md.erb
178
192
  - previews/pages/helpers.md.erb
179
193
  - previews/pages/icons.md.erb