turbo_material 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +247 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/config/turbo_material_manifest.js +3 -0
  6. data/app/assets/dist/turbo_material/tailwind.css +1 -0
  7. data/app/assets/javascripts/turbo_material/material_checkbox_controller.js +12 -0
  8. data/app/assets/javascripts/turbo_material/material_chips_input_controller.js +140 -0
  9. data/app/assets/javascripts/turbo_material/material_chips_select_controller.js +111 -0
  10. data/app/assets/javascripts/turbo_material/material_dialog_controller.js +27 -0
  11. data/app/assets/javascripts/turbo_material/material_input_controller.js +10 -0
  12. data/app/assets/javascripts/turbo_material/material_list_controller.js +57 -0
  13. data/app/assets/javascripts/turbo_material/material_menu_surface_controller.js +11 -0
  14. data/app/assets/javascripts/turbo_material/material_radio_controller.js +10 -0
  15. data/app/assets/javascripts/turbo_material/material_ripple_controller.js +10 -0
  16. data/app/assets/javascripts/turbo_material/material_select_controller.js +10 -0
  17. data/app/assets/javascripts/turbo_material/material_switch_controller.js +14 -0
  18. data/app/assets/stylesheets/turbo_material/application.css +15 -0
  19. data/app/assets/stylesheets/turbo_material/application.tailwind.css +3 -0
  20. data/app/controllers/turbo_material/application_controller.rb +4 -0
  21. data/app/helpers/turbo_material/application_helper.rb +7 -0
  22. data/app/helpers/turbo_material/checkbox_helper.rb +7 -0
  23. data/app/helpers/turbo_material/chips_input_helper.rb +7 -0
  24. data/app/helpers/turbo_material/chips_select_helper.rb +7 -0
  25. data/app/helpers/turbo_material/input_helper.rb +7 -0
  26. data/app/helpers/turbo_material/modal_helper.rb +7 -0
  27. data/app/helpers/turbo_material/radio_helper.rb +7 -0
  28. data/app/helpers/turbo_material/select_helper.rb +7 -0
  29. data/app/helpers/turbo_material/switch_helper.rb +7 -0
  30. data/app/helpers/turbo_material/textarea_helper.rb +7 -0
  31. data/app/jobs/turbo_material/application_job.rb +4 -0
  32. data/app/mailers/turbo_material/application_mailer.rb +6 -0
  33. data/app/models/turbo_material/application_record.rb +5 -0
  34. data/app/views/components/_checkbox.html.erb +25 -0
  35. data/app/views/components/_chips_input.html.erb +36 -0
  36. data/app/views/components/_chips_input_options.html.erb +20 -0
  37. data/app/views/components/_chips_select.html.erb +56 -0
  38. data/app/views/components/_input.html.erb +32 -0
  39. data/app/views/components/_modal.html.erb +37 -0
  40. data/app/views/components/_radio.html.erb +28 -0
  41. data/app/views/components/_select.html.erb +67 -0
  42. data/app/views/components/_switch.html.erb +34 -0
  43. data/app/views/components/_textarea.html.erb +30 -0
  44. data/app/views/layouts/turbo_material/application.html.erb +21 -0
  45. data/config/importmap.rb +4 -0
  46. data/config/routes.rb +2 -0
  47. data/config/tailwind.config.js +26 -0
  48. data/lib/tasks/turbo_material_tasks.rake +4 -0
  49. data/lib/turbo_material/engine.rb +44 -0
  50. data/lib/turbo_material/version.rb +3 -0
  51. data/lib/turbo_material.rb +6 -0
  52. metadata +164 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 744972b70aa57b3a3f41156bce396e31de349171b1c925d97233d05e80e2407b
4
+ data.tar.gz: c4572e273f07217c9e66468cd19721ed56dc41fa64b029ee770d632f2ab82619
5
+ SHA512:
6
+ metadata.gz: d2bf5fabb54f3cbf94bf63fa03f852e0a78ffe22f7e62d70552668e6b4accf3f7a093e50774d6a8f04583e63730ec904195a9bd5835ae15566ab67de3064508c
7
+ data.tar.gz: 2c79b8bd8819ae634366d512348df27aa6a3614aa815731dd3839f0f60bcb91b95c0e4c33533115cbc075f22596d85ea9d138c626142014e6413833d34dbe465
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright Sergey Moiseev
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,247 @@
1
+ # Material Components for Hotwire Turbo
2
+
3
+ This gem implements drop-in implementation for [Material Design](https://material.io/) in [Turbo](https://turbo.hotwire.dev/). It is based on [Material Components for the Web](https://github.com/material-components/material-components-web) as it's being most feature rich implementation at the moment.
4
+
5
+ ## Requirements
6
+
7
+ * Ruby 3.3+ (might work with older versions, but not tested)
8
+ * Rails 7.1+ (Turbo is hard requirement for complex components like server based Chips)
9
+ * Turbo
10
+ * Stimulus
11
+ * Importmaps
12
+ * Tailwind
13
+
14
+ That list is based on the project from which this library is being extracted. If you like to make it less demanding, feel free to submit PRs. Only strict requirements are Turbo and Stimulus.
15
+
16
+ ## Usage
17
+
18
+ Add following to your `app/javascript/controllers/index.js` after `eagerLoadControllersFrom("controllers", application)` line:
19
+
20
+ ```javascript
21
+ eagerLoadControllersFrom("turbo_material", application)
22
+ ```
23
+ Add following to your `app/view/layouts/application.html.erb` in `<head>` section:
24
+
25
+ ```erb
26
+ <link href="//cdn.jsdelivr.net/npm/material-components-web@latest/dist/material-components-web.min.css" rel="stylesheet">
27
+ <script src="//cdn.jsdelivr.net/npm/material-components-web@latest/dist/material-components-web.min.js"></script>
28
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
29
+ <%= stylesheet_link_tag "turbo_material/tailwind.css" %>
30
+ ```
31
+
32
+ ### Material Components for Web customizations
33
+
34
+ For supporting custom styling for you components, consider including following in your application stylesheet:
35
+
36
+ ```css
37
+ @import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,600;1,400;1,600&display=swap');
38
+
39
+ html, body, label {
40
+ font-family: 'Roboto', sans-serif;
41
+ }
42
+
43
+ html, body {
44
+ scroll-behavior: smooth;
45
+ }
46
+
47
+ html [id], body [id] {
48
+ scroll-margin: 120px !important;
49
+ }
50
+
51
+ :root {
52
+ --real-primary: #5d7dd4;
53
+ --real-secondary: #607D8B;
54
+ --real-warn: rgb(244, 67, 54);
55
+
56
+ --mdc-theme-primary: var(--real-primary);
57
+ --mdc-theme-secondary: var(--real-secondary);
58
+ --mdc-dialog-z-index: 100;
59
+ --mdc-ripple-color: white;
60
+ }
61
+
62
+ .turbo-progress-bar {
63
+ background-color: #77a1d6;
64
+ filter: brightness(90%);
65
+ }
66
+
67
+ .mdc-button.menu-item {
68
+ --mdc-theme-primary: white;
69
+ }
70
+
71
+ .mdc-button--accent:not(.mdc-button--raised):not([disabled]) {
72
+ color: #77a1d6;
73
+ color: var(--mdc-theme-secondary, #77a1d6);
74
+ }
75
+
76
+ .mdc-button--accent.mdc-button--raised:not([disabled]) {
77
+ background-color: #77a1d6;
78
+ background-color: var(--mdc-theme-secondary, #77a1d6);
79
+ }
80
+
81
+ .mdc-button.mdc-button--accent .mdc-button__ripple::before, .mdc-button.mdc-button--accent .mdc-button__ripple::after {
82
+ background-color: #77a1d6;
83
+ background-color: var(--mdc-theme-secondary, #77a1d6);
84
+ }
85
+
86
+ .mdc-button--warn:not(.mdc-button--raised):not([disabled]) {
87
+ color: rgb(244, 67, 54);
88
+ color: var(--real-warn, rgb(244, 67, 54));
89
+ }
90
+
91
+ .mdc-button--warn.mdc-button--raised:not([disabled]) {
92
+ background-color: rgb(244, 67, 54);
93
+ background-color: var(--real-warn, rgb(244, 67, 54));
94
+ }
95
+
96
+ .mdc-button.mdc-button--warn .mdc-button__ripple::before, .mdc-button.mdc-button--warn .mdc-button__ripple::after {
97
+ background-color: rgb(244, 67, 54);
98
+ background-color: var(--real-warn, rgb(244, 67, 54));
99
+ }
100
+
101
+ .mdc-button--white:not(.mdc-button--raised):not([disabled]) {
102
+ color: white;
103
+ }
104
+
105
+ .mdc-button--white.mdc-button--raised:not([disabled]) {
106
+ background-color: white;
107
+ }
108
+
109
+ .mdc-button.mdc-button--white .mdc-button__ripple::before, .mdc-button.mdc-button--white .mdc-button__ripple::after {
110
+ background-color: white;
111
+ }
112
+
113
+ .mdc-text-field:not(.mdc-text-field--label-floating) .iti__flag-container {
114
+ display: none !important;
115
+ }
116
+
117
+ .mdc-drawer .mdc-deprecated-list-item {
118
+ margin: 0;
119
+ border-radius: 0;
120
+ }
121
+
122
+ aside.mdc-drawer:not(.mdc-drawer--right) {
123
+ box-shadow: 0px 5px 5px -3px rgb(0 0 0 / 20%), 0px 8px 10px 1px rgb(0 0 0 / 14%), 0px 3px 14px 2px rgb(0 0 0 / 12%);
124
+ }
125
+
126
+ aside.mdc-drawer.main-drawer {
127
+ background-color: #2d323e;
128
+ }
129
+
130
+ .mdc-drawer--right.mdc-drawer--dismissible {
131
+ right: 0 !important;
132
+ left: initial !important;
133
+ }
134
+
135
+ .mdc-drawer--right.mdc-drawer.mdc-drawer--open:not(.mdc-drawer--closing) + .mdc-drawer-app-content {
136
+ margin-right: 16rem !important;
137
+ margin-left: 0 !important;
138
+ }
139
+
140
+ .mdc-drawer--right.mdc-drawer.mdc-drawer--open.mdc-drawer--closing + .mdc-drawer-app-content {
141
+ transition: margin-right 200ms 15ms linear;
142
+ }
143
+
144
+ .mdc-drawer--right.mdc-drawer.mdc-drawer--open.mdc-drawer--openening.mdc-drawer--closing + .mdc-drawer-app-content {
145
+ transition: margin-right 200ms 15ms linear;
146
+ }
147
+
148
+ .mdc-drawer--right.mdc-drawer--animate {
149
+ transform: translateX(100%) !important;
150
+ }
151
+
152
+ .mdc-drawer--right.mdc-drawer--closing {
153
+ transform: translateX(100%) !important;
154
+ }
155
+
156
+ .mdc-drawer--right.mdc-drawer--opening {
157
+ transform: translateX(0) !important;
158
+ }
159
+
160
+ .mdc-dialog__title::before {
161
+ content: none !important;
162
+ }
163
+
164
+ .mdc-dialog__title {
165
+ padding-top: 1rem;
166
+ }
167
+
168
+ .clip-path-bottom {
169
+ clip-path: inset(-8px -8px 0px -8px);
170
+ }
171
+
172
+ .clip-path-top {
173
+ clip-path: inset(0px -8px -8px -8px);
174
+ }
175
+
176
+ .mdc-drawer.mdc-drawer--open:not(.mdc-drawer--closing) + .mdc-drawer-app-content .mdc-top-app-bar {
177
+ width: calc(100vw - 16rem);
178
+ }
179
+
180
+ .mdc-text-field .field_with_errors {
181
+ width: 100%;
182
+ }
183
+
184
+ .bg-secondary .mdc-tab-indicator .mdc-tab-indicator__content--underline {
185
+ border-color: white !important;
186
+ }
187
+
188
+ .bg-secondary .mdc-tab--active .mdc-tab__text-label {
189
+ color: white !important;
190
+ }
191
+
192
+ .bg-secondary .mdc-tab .mdc-tab__icon {
193
+ color: white !important;
194
+ }
195
+
196
+ .bg-secondary .mdc-tab--active .mdc-tab__icon {
197
+ color: white !important;
198
+ }
199
+
200
+ .bg-secondary .mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label {
201
+ color: white !important;
202
+ }
203
+
204
+ .mdc-chip.red {
205
+ background-color: #f44336 !important;
206
+ color: white !important;
207
+ }
208
+
209
+ .mdc-chip.red .mdc-chip__icon {
210
+ color: white !important;
211
+ }
212
+ ```
213
+
214
+ ## Installation
215
+ Add this line to your application's Gemfile:
216
+
217
+ ```ruby
218
+ gem "turbo_material"
219
+ ```
220
+
221
+ And then execute:
222
+ ```bash
223
+ $ bundle
224
+ ```
225
+
226
+ Or install it yourself as:
227
+ ```bash
228
+ $ gem install turbo_material
229
+ ```
230
+
231
+ ## Lookbook documentation for components
232
+
233
+ Gem implements [Lookbook](https://lookbook.build) documentation for all components. I am considering implementing a way to pass it's previews to lookbook in hosting application, but for now, to use it, please checkout gem source code and use it like this:
234
+
235
+ ```bash
236
+ bundle install
237
+ cd test/dummy
238
+ foreman start -f Procfile.dev
239
+ ```
240
+
241
+ and then open [http://localhost:3000/lookbook](http://localhost:3000/lookbook) in your browser.
242
+
243
+ ## Contributing
244
+ This gem is open for new contributions. Use [Material Components for Web documentation](https://github.com/material-components/material-components-web/tree/master/packages) as a references for missing functionality.
245
+
246
+ ## License
247
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
6
+ load "rails/tasks/statistics.rake"
7
+
8
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ //= link_directory ../stylesheets/turbo_material .css
2
+ //= link_tree ../javascripts/turbo_material .js
3
+ //= link_tree ../dist/turbo_material .css
@@ -0,0 +1 @@
1
+ /*! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter var,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}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-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height: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{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],select,textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,select:focus,textarea:focus{--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);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple]{background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:1rem}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--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(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}[type=checkbox]:checked,[type=radio]:checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:#0000}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=checkbox]:indeterminate,[type=radio]:checked:focus,[type=radio]:checked:hover{background-color:currentColor;border-color:#0000}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}[type=file]{background:unset;border-color:inherit;border-radius:0;border-width:0;font-size:unset;line-height:inherit;padding:0}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}*,::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: }.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where([class~=lead]):not(:where([class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.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-bottom:1.25em;margin-top: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-bottom:1.25em;margin-top:1.25em;padding-left:1.625em}.prose :where(ol>li):not(:where([class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.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-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose] *)){border-left-color:var(--tw-prose-quote-borders);border-left-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-left:1em;quotes:"\201C""\201D""\2018""\2019"}.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-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose :where(h2 strong):not(:where([class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(figure>*):not(:where([class~=not-prose] *)){margin-bottom:0;margin-top: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-size:.875em;font-weight:600}.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] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding:.8571429em 1.1428571em}.prose :where(pre code):not(:where([class~=not-prose] *)){background-color:initial;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.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] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;text-align:left;width:100%}.prose :where(thead):not(:where([class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-bottom:.5714286em;padding-left:.5714286em;padding-right:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.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-color:var(--tw-prose-th-borders);border-top-width:1px}.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:1rem;line-height:1.75}.prose :where(p):not(:where([class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(video):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(figure):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(li):not(:where([class~=not-prose] *)){margin-bottom:.5em;margin-top:.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-bottom:.75em;margin-top:.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-bottom:.75em;margin-top:.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}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.8888889em;margin-top:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-left:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose] *)){font-size:2.1428571em;line-height:1.2;margin-bottom:.8em;margin-top:0}.prose-sm :where(h2):not(:where([class~=not-prose] *)){font-size:1.4285714em;line-height:1.4;margin-bottom:.8em;margin-top:1.6em}.prose-sm :where(h3):not(:where([class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.5555556em}.prose-sm :where(h4):not(:where([class~=not-prose] *)){line-height:1.4285714;margin-bottom:.5714286em;margin-top:1.4285714em}.prose-sm :where(img):not(:where([class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(video):not(:where([class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(figure):not(:where([class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-sm :where(figcaption):not(:where([class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(code):not(:where([class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose] *)){border-radius:.25rem;font-size:.8571429em;line-height:1.6666667;margin-bottom:1.6666667em;margin-top:1.6666667em;padding:.6666667em 1em}.prose-sm :where(ol):not(:where([class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-left:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-left:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose] *)){margin-bottom:.2857143em;margin-top:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose] *)){padding-left:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose] *)){padding-left:.4285714em}.prose-sm :where(.prose>ul>li p):not(:where([class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}.prose-sm :where(.prose>ul>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose>ul>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose>ol>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose>ol>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose] *)){margin-bottom:2.8571429em;margin-top:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose] *)){padding-bottom:.6666667em;padding-left:1em;padding-right:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose] *)){padding:.6666667em 1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose-sm :where(.prose>:first-child):not(:where([class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose>:last-child):not(:where([class~=not-prose] *)){margin-bottom:0}.prose-base{font-size:1rem;line-height:1.75}.prose-base :where(p):not(:where([class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose-base :where([class~=lead]):not(:where([class~=not-prose] *)){font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose-base :where(blockquote):not(:where([class~=not-prose] *)){margin-bottom:1.6em;margin-top:1.6em;padding-left:1em}.prose-base :where(h1):not(:where([class~=not-prose] *)){font-size:2.25em;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose-base :where(h2):not(:where([class~=not-prose] *)){font-size:1.5em;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose-base :where(h3):not(:where([class~=not-prose] *)){font-size:1.25em;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose-base :where(h4):not(:where([class~=not-prose] *)){line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose-base :where(img):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(video):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(figure):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(figure>*):not(:where([class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-base :where(figcaption):not(:where([class~=not-prose] *)){font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose-base :where(code):not(:where([class~=not-prose] *)){font-size:.875em}.prose-base :where(h2 code):not(:where([class~=not-prose] *)){font-size:.875em}.prose-base :where(h3 code):not(:where([class~=not-prose] *)){font-size:.9em}.prose-base :where(pre):not(:where([class~=not-prose] *)){border-radius:.375rem;font-size:.875em;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;padding:.8571429em 1.1428571em}.prose-base :where(ol):not(:where([class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em;padding-left:1.625em}.prose-base :where(ul):not(:where([class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em;padding-left:1.625em}.prose-base :where(li):not(:where([class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose-base :where(ol>li):not(:where([class~=not-prose] *)){padding-left:.375em}.prose-base :where(ul>li):not(:where([class~=not-prose] *)){padding-left:.375em}.prose-base :where(.prose>ul>li p):not(:where([class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose-base :where(.prose>ul>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.25em}.prose-base :where(.prose>ul>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.25em}.prose-base :where(.prose>ol>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.25em}.prose-base :where(.prose>ol>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.25em}.prose-base :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose-base :where(hr):not(:where([class~=not-prose] *)){margin-bottom:3em;margin-top:3em}.prose-base :where(hr+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-base :where(h2+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-base :where(h3+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-base :where(h4+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-base :where(table):not(:where([class~=not-prose] *)){font-size:.875em;line-height:1.7142857}.prose-base :where(thead th):not(:where([class~=not-prose] *)){padding-bottom:.5714286em;padding-left:.5714286em;padding-right:.5714286em}.prose-base :where(thead th:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose-base :where(thead th:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose-base :where(tbody td,tfoot td):not(:where([class~=not-prose] *)){padding:.5714286em}.prose-base :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose-base :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose-base :where(.prose>:first-child):not(:where([class~=not-prose] *)){margin-top:0}.prose-base :where(.prose>:last-child):not(:where([class~=not-prose] *)){margin-bottom:0}.prose-lg{font-size:1.125rem;line-height:1.7777778}.prose-lg :where(p):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.prose-lg :where([class~=lead]):not(:where([class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-bottom:1.0909091em;margin-top:1.0909091em}.prose-lg :where(blockquote):not(:where([class~=not-prose] *)){margin-bottom:1.6666667em;margin-top:1.6666667em;padding-left:1em}.prose-lg :where(h1):not(:where([class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.8333333em;margin-top:0}.prose-lg :where(h2):not(:where([class~=not-prose] *)){font-size:1.6666667em;line-height:1.3333333;margin-bottom:1.0666667em;margin-top:1.8666667em}.prose-lg :where(h3):not(:where([class~=not-prose] *)){font-size:1.3333333em;line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}.prose-lg :where(h4):not(:where([class~=not-prose] *)){line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.7777778em}.prose-lg :where(img):not(:where([class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(video):not(:where([class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(figure):not(:where([class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(figure>*):not(:where([class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-lg :where(figcaption):not(:where([class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.prose-lg :where(code):not(:where([class~=not-prose] *)){font-size:.8888889em}.prose-lg :where(h2 code):not(:where([class~=not-prose] *)){font-size:.8666667em}.prose-lg :where(h3 code):not(:where([class~=not-prose] *)){font-size:.875em}.prose-lg :where(pre):not(:where([class~=not-prose] *)){border-radius:.375rem;font-size:.8888889em;line-height:1.75;margin-bottom:2em;margin-top:2em;padding:1em 1.5em}.prose-lg :where(ol):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-left:1.5555556em}.prose-lg :where(ul):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-left:1.5555556em}.prose-lg :where(li):not(:where([class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}.prose-lg :where(ol>li):not(:where([class~=not-prose] *)){padding-left:.4444444em}.prose-lg :where(ul>li):not(:where([class~=not-prose] *)){padding-left:.4444444em}.prose-lg :where(.prose>ul>li p):not(:where([class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.prose-lg :where(.prose>ul>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose>ul>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(.prose>ol>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose>ol>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.prose-lg :where(hr):not(:where([class~=not-prose] *)){margin-bottom:3.1111111em;margin-top:3.1111111em}.prose-lg :where(hr+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-lg :where(h2+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-lg :where(h3+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-lg :where(h4+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-lg :where(table):not(:where([class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.prose-lg :where(thead th):not(:where([class~=not-prose] *)){padding-bottom:.75em;padding-left:.75em;padding-right:.75em}.prose-lg :where(thead th:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose-lg :where(thead th:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose] *)){padding:.75em}.prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose-lg :where(.prose>:first-child):not(:where([class~=not-prose] *)){margin-top:0}.prose-lg :where(.prose>:last-child):not(:where([class~=not-prose] *)){margin-bottom:0}.prose-xl{font-size:1.25rem;line-height:1.8}.prose-xl :where(p):not(:where([class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em}.prose-xl :where([class~=lead]):not(:where([class~=not-prose] *)){font-size:1.2em;line-height:1.5;margin-bottom:1em;margin-top:1em}.prose-xl :where(blockquote):not(:where([class~=not-prose] *)){margin-bottom:1.6em;margin-top:1.6em;padding-left:1.0666667em}.prose-xl :where(h1):not(:where([class~=not-prose] *)){font-size:2.8em;line-height:1;margin-bottom:.8571429em;margin-top:0}.prose-xl :where(h2):not(:where([class~=not-prose] *)){font-size:1.8em;line-height:1.1111111;margin-bottom:.8888889em;margin-top:1.5555556em}.prose-xl :where(h3):not(:where([class~=not-prose] *)){font-size:1.5em;line-height:1.3333333;margin-bottom:.6666667em;margin-top:1.6em}.prose-xl :where(h4):not(:where([class~=not-prose] *)){line-height:1.6;margin-bottom:.6em;margin-top:1.8em}.prose-xl :where(img):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-xl :where(video):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-xl :where(figure):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-xl :where(figure>*):not(:where([class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-xl :where(figcaption):not(:where([class~=not-prose] *)){font-size:.9em;line-height:1.5555556;margin-top:1em}.prose-xl :where(code):not(:where([class~=not-prose] *)){font-size:.9em}.prose-xl :where(h2 code):not(:where([class~=not-prose] *)){font-size:.8611111em}.prose-xl :where(h3 code):not(:where([class~=not-prose] *)){font-size:.9em}.prose-xl :where(pre):not(:where([class~=not-prose] *)){border-radius:.5rem;font-size:.9em;line-height:1.7777778;margin-bottom:2em;margin-top:2em;padding:1.1111111em 1.3333333em}.prose-xl :where(ol):not(:where([class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em;padding-left:1.6em}.prose-xl :where(ul):not(:where([class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em;padding-left:1.6em}.prose-xl :where(li):not(:where([class~=not-prose] *)){margin-bottom:.6em;margin-top:.6em}.prose-xl :where(ol>li):not(:where([class~=not-prose] *)){padding-left:.4em}.prose-xl :where(ul>li):not(:where([class~=not-prose] *)){padding-left:.4em}.prose-xl :where(.prose>ul>li p):not(:where([class~=not-prose] *)){margin-bottom:.8em;margin-top:.8em}.prose-xl :where(.prose>ul>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.2em}.prose-xl :where(.prose>ul>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.2em}.prose-xl :where(.prose>ol>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.2em}.prose-xl :where(.prose>ol>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.2em}.prose-xl :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose] *)){margin-bottom:.8em;margin-top:.8em}.prose-xl :where(hr):not(:where([class~=not-prose] *)){margin-bottom:2.8em;margin-top:2.8em}.prose-xl :where(hr+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-xl :where(h2+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-xl :where(h3+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-xl :where(h4+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-xl :where(table):not(:where([class~=not-prose] *)){font-size:.9em;line-height:1.5555556}.prose-xl :where(thead th):not(:where([class~=not-prose] *)){padding-bottom:.8888889em;padding-left:.6666667em;padding-right:.6666667em}.prose-xl :where(thead th:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose-xl :where(thead th:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose-xl :where(tbody td,tfoot td):not(:where([class~=not-prose] *)){padding:.8888889em .6666667em}.prose-xl :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose-xl :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose-xl :where(.prose>:first-child):not(:where([class~=not-prose] *)){margin-top:0}.prose-xl :where(.prose>:last-child):not(:where([class~=not-prose] *)){margin-bottom:0}.prose-2xl{font-size:1.5rem;line-height:1.6666667}.prose-2xl :where(p):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.prose-2xl :where([class~=lead]):not(:where([class~=not-prose] *)){font-size:1.25em;line-height:1.4666667;margin-bottom:1.0666667em;margin-top:1.0666667em}.prose-2xl :where(blockquote):not(:where([class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em;padding-left:1.1111111em}.prose-2xl :where(h1):not(:where([class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.875em;margin-top:0}.prose-2xl :where(h2):not(:where([class~=not-prose] *)){font-size:2em;line-height:1.0833333;margin-bottom:.8333333em;margin-top:1.5em}.prose-2xl :where(h3):not(:where([class~=not-prose] *)){font-size:1.5em;line-height:1.2222222;margin-bottom:.6666667em;margin-top:1.5555556em}.prose-2xl :where(h4):not(:where([class~=not-prose] *)){line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}.prose-2xl :where(img):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-2xl :where(video):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-2xl :where(figure):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-2xl :where(figure>*):not(:where([class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-2xl :where(figcaption):not(:where([class~=not-prose] *)){font-size:.8333333em;line-height:1.6;margin-top:1em}.prose-2xl :where(code):not(:where([class~=not-prose] *)){font-size:.8333333em}.prose-2xl :where(h2 code):not(:where([class~=not-prose] *)){font-size:.875em}.prose-2xl :where(h3 code):not(:where([class~=not-prose] *)){font-size:.8888889em}.prose-2xl :where(pre):not(:where([class~=not-prose] *)){border-radius:.5rem;font-size:.8333333em;line-height:1.8;margin-bottom:2em;margin-top:2em;padding:1.2em 1.6em}.prose-2xl :where(ol):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-left:1.5833333em}.prose-2xl :where(ul):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-left:1.5833333em}.prose-2xl :where(li):not(:where([class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose-2xl :where(ol>li):not(:where([class~=not-prose] *)){padding-left:.4166667em}.prose-2xl :where(ul>li):not(:where([class~=not-prose] *)){padding-left:.4166667em}.prose-2xl :where(.prose>ul>li p):not(:where([class~=not-prose] *)){margin-bottom:.8333333em;margin-top:.8333333em}.prose-2xl :where(.prose>ul>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.3333333em}.prose-2xl :where(.prose>ul>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em}.prose-2xl :where(.prose>ol>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.3333333em}.prose-2xl :where(.prose>ol>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.3333333em}.prose-2xl :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}.prose-2xl :where(hr):not(:where([class~=not-prose] *)){margin-bottom:3em;margin-top:3em}.prose-2xl :where(hr+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-2xl :where(h2+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-2xl :where(h3+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-2xl :where(h4+*):not(:where([class~=not-prose] *)){margin-top:0}.prose-2xl :where(table):not(:where([class~=not-prose] *)){font-size:.8333333em;line-height:1.4}.prose-2xl :where(thead th):not(:where([class~=not-prose] *)){padding-bottom:.8em;padding-left:.6em;padding-right:.6em}.prose-2xl :where(thead th:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose-2xl :where(thead th:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose-2xl :where(tbody td,tfoot td):not(:where([class~=not-prose] *)){padding:.8em .6em}.prose-2xl :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose-2xl :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose-2xl :where(.prose>:first-child):not(:where([class~=not-prose] *)){margin-top:0}.prose-2xl :where(.prose>:last-child):not(:where([class~=not-prose] *)){margin-bottom:0}.prose-invert{--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.prose-slate{--tw-prose-body:#334155;--tw-prose-headings:#0f172a;--tw-prose-lead:#475569;--tw-prose-links:#0f172a;--tw-prose-bold:#0f172a;--tw-prose-counters:#64748b;--tw-prose-bullets:#cbd5e1;--tw-prose-hr:#e2e8f0;--tw-prose-quotes:#0f172a;--tw-prose-quote-borders:#e2e8f0;--tw-prose-captions:#64748b;--tw-prose-code:#0f172a;--tw-prose-pre-code:#e2e8f0;--tw-prose-pre-bg:#1e293b;--tw-prose-th-borders:#cbd5e1;--tw-prose-td-borders:#e2e8f0;--tw-prose-invert-body:#cbd5e1;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#94a3b8;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#94a3b8;--tw-prose-invert-bullets:#475569;--tw-prose-invert-hr:#334155;--tw-prose-invert-quotes:#f1f5f9;--tw-prose-invert-quote-borders:#334155;--tw-prose-invert-captions:#94a3b8;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#cbd5e1;--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:#475569;--tw-prose-invert-td-borders:#334155}.prose-gray{--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}.prose-zinc{--tw-prose-body:#3f3f46;--tw-prose-headings:#18181b;--tw-prose-lead:#52525b;--tw-prose-links:#18181b;--tw-prose-bold:#18181b;--tw-prose-counters:#71717a;--tw-prose-bullets:#d4d4d8;--tw-prose-hr:#e4e4e7;--tw-prose-quotes:#18181b;--tw-prose-quote-borders:#e4e4e7;--tw-prose-captions:#71717a;--tw-prose-code:#18181b;--tw-prose-pre-code:#e4e4e7;--tw-prose-pre-bg:#27272a;--tw-prose-th-borders:#d4d4d8;--tw-prose-td-borders:#e4e4e7;--tw-prose-invert-body:#d4d4d8;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#a1a1aa;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#a1a1aa;--tw-prose-invert-bullets:#52525b;--tw-prose-invert-hr:#3f3f46;--tw-prose-invert-quotes:#f4f4f5;--tw-prose-invert-quote-borders:#3f3f46;--tw-prose-invert-captions:#a1a1aa;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d4d4d8;--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:#52525b;--tw-prose-invert-td-borders:#3f3f46}.prose-neutral{--tw-prose-body:#404040;--tw-prose-headings:#171717;--tw-prose-lead:#525252;--tw-prose-links:#171717;--tw-prose-bold:#171717;--tw-prose-counters:#737373;--tw-prose-bullets:#d4d4d4;--tw-prose-hr:#e5e5e5;--tw-prose-quotes:#171717;--tw-prose-quote-borders:#e5e5e5;--tw-prose-captions:#737373;--tw-prose-code:#171717;--tw-prose-pre-code:#e5e5e5;--tw-prose-pre-bg:#262626;--tw-prose-th-borders:#d4d4d4;--tw-prose-td-borders:#e5e5e5;--tw-prose-invert-body:#d4d4d4;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#a3a3a3;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#a3a3a3;--tw-prose-invert-bullets:#525252;--tw-prose-invert-hr:#404040;--tw-prose-invert-quotes:#f5f5f5;--tw-prose-invert-quote-borders:#404040;--tw-prose-invert-captions:#a3a3a3;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d4d4d4;--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:#525252;--tw-prose-invert-td-borders:#404040}.prose-stone{--tw-prose-body:#44403c;--tw-prose-headings:#1c1917;--tw-prose-lead:#57534e;--tw-prose-links:#1c1917;--tw-prose-bold:#1c1917;--tw-prose-counters:#78716c;--tw-prose-bullets:#d6d3d1;--tw-prose-hr:#e7e5e4;--tw-prose-quotes:#1c1917;--tw-prose-quote-borders:#e7e5e4;--tw-prose-captions:#78716c;--tw-prose-code:#1c1917;--tw-prose-pre-code:#e7e5e4;--tw-prose-pre-bg:#292524;--tw-prose-th-borders:#d6d3d1;--tw-prose-td-borders:#e7e5e4;--tw-prose-invert-body:#d6d3d1;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#a8a29e;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#a8a29e;--tw-prose-invert-bullets:#57534e;--tw-prose-invert-hr:#44403c;--tw-prose-invert-quotes:#f5f5f4;--tw-prose-invert-quote-borders:#44403c;--tw-prose-invert-captions:#a8a29e;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d6d3d1;--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:#57534e;--tw-prose-invert-td-borders:#44403c}.prose-red{--tw-prose-links:#dc2626;--tw-prose-invert-links:#ef4444}.prose-orange{--tw-prose-links:#ea580c;--tw-prose-invert-links:#f97316}.prose-amber{--tw-prose-links:#d97706;--tw-prose-invert-links:#f59e0b}.prose-yellow{--tw-prose-links:#ca8a04;--tw-prose-invert-links:#eab308}.prose-lime{--tw-prose-links:#65a30d;--tw-prose-invert-links:#84cc16}.prose-green{--tw-prose-links:#16a34a;--tw-prose-invert-links:#22c55e}.prose-emerald{--tw-prose-links:#059669;--tw-prose-invert-links:#10b981}.prose-teal{--tw-prose-links:#0d9488;--tw-prose-invert-links:#14b8a6}.prose-cyan{--tw-prose-links:#0891b2;--tw-prose-invert-links:#06b6d4}.prose-sky{--tw-prose-links:#0284c7;--tw-prose-invert-links:#0ea5e9}.prose-blue{--tw-prose-links:#2563eb;--tw-prose-invert-links:#3b82f6}.prose-indigo{--tw-prose-links:#4f46e5;--tw-prose-invert-links:#6366f1}.prose-violet{--tw-prose-links:#7c3aed;--tw-prose-invert-links:#8b5cf6}.prose-purple{--tw-prose-links:#9333ea;--tw-prose-invert-links:#a855f7}.prose-fuchsia{--tw-prose-links:#c026d3;--tw-prose-invert-links:#d946ef}.prose-pink{--tw-prose-links:#db2777;--tw-prose-invert-links:#ec4899}.prose-rose{--tw-prose-links:#e11d48;--tw-prose-invert-links:#f43f5e}.fixed{position:fixed}.relative{position:relative}.\!top-6{top:1.5rem!important}.flex{display:flex}.grid{display:grid}.\!hidden{display:none!important}.hidden{display:none}.\!h-full{height:100%!important}.\!h-max{height:-moz-max-content!important;height:max-content!important}.max-h-64{max-height:16rem}.\!min-h-\[14rem\]{min-height:14rem!important}.\!w-full{width:100%!important}.w-full{width:100%}.\!min-w-\[36rem\]{min-width:36rem!important}.max-w-prose{max-width:65ch}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.overflow-y-auto{overflow-y:auto}.p-2{padding:.5rem}.\!pt-8{padding-top:2rem!important}.pb-1{padding-bottom:.25rem}.font-sans{font-family:Inter var,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.capitalize{text-transform:capitalize}.\!text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}
@@ -0,0 +1,12 @@
1
+ import { Controller } from "@hotwired/stimulus";
2
+
3
+ export default class extends Controller {
4
+ connect() {
5
+ const checkbox = mdc.checkbox.MDCCheckbox.attachTo(this.element.querySelector('.mdc-checkbox'));
6
+ const formField = mdc.formField.MDCFormField.attachTo(this.element);
7
+ formField.input = checkbox;
8
+ }
9
+
10
+ disconnect() {
11
+ }
12
+ }
@@ -0,0 +1,140 @@
1
+ import { Controller } from "@hotwired/stimulus";
2
+ import { get } from "@rails/request.js";
3
+ import { useClickOutside } from 'stimulus-use';
4
+
5
+ export default class extends Controller {
6
+ opened = false;
7
+ static targets = [ "input", "hidden", "field", "panel" ];
8
+ static outlets = [ "material-list" ];
9
+
10
+ static values = {
11
+ url: String,
12
+ suffix: String,
13
+ name: String
14
+ }
15
+
16
+
17
+ connect() {
18
+ this.inputEl = this.element.querySelector(".mdc-text-field");
19
+ this.chipsetEl = this.element.querySelector(".mdc-chip-set");
20
+ mdc.textField.MDCTextField.attachTo(this.inputEl);
21
+ this.chips = mdc.chips.MDCChipSet.attachTo(this.chipsetEl);
22
+ useClickOutside(this);
23
+ }
24
+
25
+ chipTemplate(label, value) {
26
+ return `<div class="mdc-chip__text">${label}</div><i data-action="click->material-chips-input#removeChip" data-value="${value}" class="material-icons mdc-chip__icon mdc-chip__icon--trailing" tabindex="0" role="button">cancel</i>`;
27
+ }
28
+
29
+ addChip(content, value) {
30
+ const chipEl = document.createElement('div');
31
+ chipEl.classList.add('mdc-chip');
32
+ if (this.chipCssValue) {
33
+ chipEl.classList.add(this.chipCssValue);
34
+ }
35
+ chipEl.dataset.value = value;
36
+ chipEl.innerHTML = content;
37
+ this.chipsetEl.insertBefore(chipEl, this.hiddenTarget);
38
+ this.chips.addChip(chipEl);
39
+ this.hiddenTarget.value = this.chips.chipsList.map((chip) => chip.root.dataset.value).join(',');
40
+ this.search();
41
+ }
42
+
43
+ removeChip(event) {
44
+ event.stopPropagation();
45
+ event.preventDefault();
46
+ const chip = this.element.querySelector(`.mdc-chip[data-value="${event.target.dataset.value}"]`);
47
+ this.chipsetEl.removeChild(chip);
48
+ if (this.chipsetEl.children.length === 0) {
49
+ this.inputEl.foundation.adapter.floatLabel(false);
50
+ }
51
+ this.hiddenTarget.value = this.chips.chipsList.map((chip) => chip.root.dataset.value).join(',');
52
+ this.search();
53
+ }
54
+
55
+ open() {
56
+ if ((this.opened && this.panelTarget.classList.contains('mdc-menu-surface--open')) || (parseInt(this.panelTarget.dataset.size) === 0)) return;
57
+
58
+ this.opened = true;
59
+ this.panelTarget.classList.add("mdc-menu-surface--open");
60
+ }
61
+
62
+ toggle() {
63
+ if (this.opened) {
64
+ this.close();
65
+ } else {
66
+ this.open();
67
+ }
68
+ }
69
+
70
+ close(event) {
71
+ if (!this.opened) return;
72
+
73
+ this.opened = false;
74
+ this.panelTarget.classList.remove("mdc-menu-surface--open");
75
+ if(event) {
76
+ event.preventDefault();
77
+ event.stopPropagation();
78
+ }
79
+ }
80
+
81
+ clickOutside(event) {
82
+ if (!this.opened) {
83
+ return;
84
+ } else {
85
+ this.close(event);
86
+ }
87
+ }
88
+
89
+
90
+ select(user) {
91
+ this.close();
92
+ this.inputTarget.value = "";
93
+ this.addChip(this.chipTemplate(user.dataset.name, user.dataset.value), user.dataset.value);
94
+ }
95
+
96
+ focusNext(event) {
97
+ if (!this.opened) return;
98
+
99
+ this.materialListOutlet.focusNext();
100
+ if(event) {
101
+ event.preventDefault();
102
+ event.stopPropagation();
103
+ }
104
+ }
105
+
106
+ focusPrevious(event) {
107
+ if (!this.opened) return;
108
+
109
+ this.materialListOutlet.focusPrevious();
110
+ if(event) {
111
+ event.preventDefault();
112
+ event.stopPropagation();
113
+ }
114
+ }
115
+
116
+ confirmSelection(event) {
117
+ if (!this.opened) return;
118
+
119
+ this.select(this.materialListOutlet.list.listElements[event.detail.index]);
120
+ if(event) {
121
+ event.preventDefault();
122
+ event.stopPropagation();
123
+ }
124
+ }
125
+
126
+ disconnect() {
127
+ }
128
+
129
+ search() {
130
+ let params = new URLSearchParams();
131
+ params.append("query", this.inputTarget.value);
132
+ params.append("suffix", this.suffixValue);
133
+ params.append("name", this.nameValue);
134
+ params.append("opened", this.opened);
135
+ params.append("exclude", this.hiddenTarget.value);
136
+ get(`${this.urlValue}?${params.toString()}`, {
137
+ responseKind: "turbo-stream",
138
+ });
139
+ }
140
+ }
@@ -0,0 +1,111 @@
1
+ import { Controller } from "@hotwired/stimulus";
2
+ import { post, destroy, get, patch } from "@rails/request.js";
3
+
4
+ export default class extends Controller {
5
+ static values = {
6
+ selected: Array,
7
+ url: String,
8
+ confirmable: Boolean,
9
+ modalUrl: String,
10
+ modalName: String,
11
+ queryString: String,
12
+ chipCss: String,
13
+ }
14
+
15
+ static targets = [ "hidden" ];
16
+
17
+ connect() {
18
+ this.select = mdc.select.MDCSelect.attachTo(this.element);
19
+ this.chipsetEl = this.element.querySelector(".mdc-chip-set");
20
+ this.materialChipset = mdc.chips.MDCChipSet.attachTo(this.chipsetEl);
21
+ if (this.selectedValue.length > 0) {
22
+ this.select.foundation.adapter.floatLabel(true);
23
+ this.selectedValue.forEach(item => {
24
+ let listItem = this.element.querySelector(`.mdc-deprecated-list-item[data-value="${item}"]`);
25
+ this.addChip(this.chipTemplate(listItem.dataset.label, listItem.dataset.value, listItem.dataset.confirmed), listItem.dataset.value);
26
+ listItem.classList.add('!hidden');
27
+ });
28
+ }
29
+ this.select.listen('MDCSelect:change', (event) => {
30
+ const selected = this.element.querySelector(`.mdc-deprecated-list-item[data-value="${event.detail.value}"]`);
31
+ selected.classList.add('!hidden');
32
+ this.addChip(this.chipTemplate(selected.dataset.label, selected.dataset.value, selected.dataset.confirmed), selected.dataset.value);
33
+ });
34
+ }
35
+
36
+ addChip(content, value) {
37
+ const chipEl = document.createElement('div');
38
+ chipEl.classList.add('mdc-chip');
39
+ if (this.chipCssValue) {
40
+ chipEl.classList.add(this.chipCssValue);
41
+ }
42
+ chipEl.dataset.value = value;
43
+ chipEl.innerHTML = content;
44
+ this.chipsetEl.appendChild(chipEl);
45
+ this.materialChipset.addChip(chipEl);
46
+ if (this.hasHiddenTarget) {
47
+ this.hiddenTarget.value = this.materialChipset.chipsList.map((chip) => chip.root.dataset.value).join(',');
48
+ }
49
+ if (this.urlValue) {
50
+ post(this.urlValue, {
51
+ body: {
52
+ id: value,
53
+ },
54
+ responseKind: "turbo-stream",
55
+ });
56
+ }
57
+ }
58
+
59
+ removeChip(event) {
60
+ event.stopPropagation();
61
+ event.preventDefault();
62
+ const chip = this.element.querySelector(`.mdc-chip[data-value="${event.target.dataset.value}"]`);
63
+ this.chipsetEl.removeChild(chip);
64
+ if (this.hasHiddenTarget) {
65
+ this.hiddenTarget.value = this.materialChipset.chipsList.map((chip) => chip.root.dataset.value).join(',');
66
+ }
67
+ const selected = this.element.querySelector(`.mdc-deprecated-list-item[data-value="${event.target.dataset.value}"]`);
68
+ selected.classList.remove('!hidden');
69
+ if (this.urlValue) {
70
+ destroy(`${this.urlValue}/${event.target.dataset.value}`, {
71
+ responseKind: "turbo-stream",
72
+ });
73
+ }
74
+ if (this.chipsetEl.children.length === 0) {
75
+ this.select.foundation.adapter.floatLabel(false);
76
+ }
77
+ }
78
+
79
+ toggle(event) {
80
+ if (this.confirmableValue) {
81
+ event.stopPropagation();
82
+ event.preventDefault();
83
+ const item = this.element.querySelector(`.mdc-deprecated-list-item[data-value="${event.target.parentElement.dataset.value}"]`);
84
+ item.dataset.confirmed = item.dataset.confirmed === 'true' ? 'false' : 'true';
85
+ if (item.dataset.confirmed === 'true') {
86
+ let params = new URLSearchParams(this.queryStringValue);
87
+ params.append("name", this.modalNameValue);
88
+ params.append("id", event.target.parentElement.dataset.value);
89
+
90
+ get(`${this.modalUrlValue}?${params.toString()}`, {
91
+ responseKind: "turbo-stream",
92
+ });
93
+ } else {
94
+ patch(`${this.urlValue}/${event.target.parentElement.dataset.value}/toggle`, {
95
+ body: {
96
+ confirmed: false,
97
+ },
98
+ responseKind: "turbo-stream"
99
+ });
100
+ }
101
+ }
102
+ }
103
+
104
+ chipTemplate(label, value, confirmed) {
105
+ const confirm_label = (confirmed === 'false' && this.confirmableValue) ? '&nbsp;(unconfirmed)' : '';
106
+ return `<div class="mdc-chip__text" data-action="click->material-chips-select#toggle">${label}${confirm_label}</div><i data-action="click->material-chips-select#removeChip" data-value="${value}" class="material-icons mdc-chip__icon mdc-chip__icon--trailing" tabindex="0" role="button">cancel</i>`;
107
+ }
108
+
109
+ disconnect() {
110
+ }
111
+ }