opmsec 0.1.0 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/.env.example +23 -13
  2. package/README.md +256 -173
  3. package/docs/architecture/agents.mdx +77 -0
  4. package/docs/architecture/benchmarks.mdx +65 -0
  5. package/docs/architecture/overview.mdx +58 -0
  6. package/docs/architecture/scanner.mdx +53 -0
  7. package/docs/cli/audit.mdx +35 -0
  8. package/docs/cli/check.mdx +44 -0
  9. package/docs/cli/fix.mdx +49 -0
  10. package/docs/cli/info.mdx +44 -0
  11. package/docs/cli/install.mdx +71 -0
  12. package/docs/cli/push.mdx +99 -0
  13. package/docs/cli/register-agent.mdx +80 -0
  14. package/docs/cli/view.mdx +52 -0
  15. package/docs/concepts/multi-agent-consensus.mdx +58 -0
  16. package/docs/concepts/on-chain-registry.mdx +74 -0
  17. package/docs/concepts/security-model.mdx +76 -0
  18. package/docs/concepts/zk-agent-verification.mdx +82 -0
  19. package/docs/configuration.mdx +82 -0
  20. package/docs/contract/deployment.mdx +57 -0
  21. package/docs/contract/events.mdx +115 -0
  22. package/docs/contract/functions.mdx +220 -0
  23. package/docs/contract/overview.mdx +58 -0
  24. package/docs/favicon.svg +5 -0
  25. package/docs/introduction.mdx +43 -0
  26. package/docs/logo/dark.svg +5 -0
  27. package/docs/logo/light.svg +5 -0
  28. package/docs/mint.json +106 -0
  29. package/docs/quickstart.mdx +133 -0
  30. package/package.json +3 -3
  31. package/packages/cli/src/commands/author-view.tsx +9 -1
  32. package/packages/cli/src/commands/check.tsx +318 -0
  33. package/packages/cli/src/commands/fix.tsx +294 -0
  34. package/packages/cli/src/commands/install.tsx +229 -33
  35. package/packages/cli/src/commands/push.tsx +53 -22
  36. package/packages/cli/src/commands/register-agent.tsx +227 -0
  37. package/packages/cli/src/components/AgentScores.tsx +20 -6
  38. package/packages/cli/src/components/Hyperlink.tsx +30 -0
  39. package/packages/cli/src/components/ScanReport.tsx +3 -2
  40. package/packages/cli/src/index.tsx +41 -5
  41. package/packages/cli/src/services/avatar.ts +43 -6
  42. package/packages/cli/src/services/chainpatrol.ts +20 -17
  43. package/packages/cli/src/services/contract.ts +41 -8
  44. package/packages/cli/src/services/ens.ts +3 -5
  45. package/packages/cli/src/services/fileverse.ts +12 -13
  46. package/packages/cli/src/services/typosquat.ts +166 -0
  47. package/packages/contracts/circuits/accuracy_verifier.circom +101 -0
  48. package/packages/contracts/contracts/OPMRegistry.sol +63 -0
  49. package/packages/contracts/scripts/deploy.ts +22 -3
  50. package/packages/core/src/abi.ts +221 -0
  51. package/packages/core/src/benchmarks.ts +450 -0
  52. package/packages/core/src/constants.ts +20 -0
  53. package/packages/core/src/index.ts +2 -0
  54. package/packages/core/src/model-rankings.ts +115 -0
  55. package/packages/core/src/prompt.ts +58 -0
  56. package/packages/core/src/types.ts +41 -0
  57. package/packages/core/src/utils.ts +7 -3
  58. package/packages/scanner/src/agents/base-agent.ts +13 -3
  59. package/packages/scanner/src/index.ts +5 -2
  60. package/packages/scanner/src/queue/memory-queue.ts +8 -3
  61. package/packages/scanner/src/services/benchmark-runner.ts +114 -0
  62. package/packages/scanner/src/services/contract-writer.ts +2 -3
  63. package/packages/scanner/src/services/fileverse.ts +26 -7
  64. package/packages/scanner/src/services/openrouter.ts +46 -0
  65. package/packages/scanner/src/services/report-formatter.ts +122 -3
  66. package/packages/scanner/src/services/zk-verifier.ts +118 -0
  67. package/packages/web/.next/app-build-manifest.json +15 -0
  68. package/packages/web/.next/build-manifest.json +20 -0
  69. package/packages/web/.next/package.json +1 -0
  70. package/packages/web/.next/prerender-manifest.json +11 -0
  71. package/packages/web/.next/react-loadable-manifest.json +1 -0
  72. package/packages/web/.next/routes-manifest.json +1 -0
  73. package/packages/web/.next/server/app/page.js +272 -0
  74. package/packages/web/.next/server/app/page_client-reference-manifest.js +1 -0
  75. package/packages/web/.next/server/app-paths-manifest.json +3 -0
  76. package/packages/web/.next/server/interception-route-rewrite-manifest.js +1 -0
  77. package/packages/web/.next/server/middleware-build-manifest.js +22 -0
  78. package/packages/web/.next/server/middleware-manifest.json +6 -0
  79. package/packages/web/.next/server/middleware-react-loadable-manifest.js +1 -0
  80. package/packages/web/.next/server/next-font-manifest.js +1 -0
  81. package/packages/web/.next/server/next-font-manifest.json +1 -0
  82. package/packages/web/.next/server/pages-manifest.json +1 -0
  83. package/packages/web/.next/server/server-reference-manifest.js +1 -0
  84. package/packages/web/.next/server/server-reference-manifest.json +5 -0
  85. package/packages/web/.next/server/vendor-chunks/@swc.js +55 -0
  86. package/packages/web/.next/server/vendor-chunks/next.js +3010 -0
  87. package/packages/web/.next/server/webpack-runtime.js +209 -0
  88. package/packages/web/.next/static/chunks/app/layout.js +39 -0
  89. package/packages/web/.next/static/chunks/app/page.js +61 -0
  90. package/packages/web/.next/static/chunks/app-pages-internals.js +182 -0
  91. package/packages/web/.next/static/chunks/main-app.js +1882 -0
  92. package/packages/web/.next/static/chunks/polyfills.js +1 -0
  93. package/packages/web/.next/static/chunks/webpack.js +1393 -0
  94. package/packages/web/.next/static/css/app/layout.css +1237 -0
  95. package/packages/web/.next/static/development/_buildManifest.js +1 -0
  96. package/packages/web/.next/static/development/_ssgManifest.js +1 -0
  97. package/packages/web/.next/static/webpack/633457081244afec._.hot-update.json +1 -0
  98. package/packages/web/.next/static/webpack/6fee6306e0f98869.webpack.hot-update.json +1 -0
  99. package/packages/web/.next/static/webpack/73e341375c8d429e.webpack.hot-update.json +1 -0
  100. package/packages/web/.next/static/webpack/app/layout.6fee6306e0f98869.hot-update.js +22 -0
  101. package/packages/web/.next/static/webpack/app/layout.73e341375c8d429e.hot-update.js +22 -0
  102. package/packages/web/.next/static/webpack/app/page.6fee6306e0f98869.hot-update.js +22 -0
  103. package/packages/web/.next/static/webpack/app/page.73e341375c8d429e.hot-update.js +22 -0
  104. package/packages/web/.next/static/webpack/webpack.6fee6306e0f98869.hot-update.js +12 -0
  105. package/packages/web/.next/static/webpack/webpack.73e341375c8d429e.hot-update.js +12 -0
  106. package/packages/web/.next/trace +5 -0
  107. package/packages/web/.next/types/app/layout.ts +84 -0
  108. package/packages/web/.next/types/app/page.ts +84 -0
  109. package/packages/web/.next/types/cache-life.d.ts +141 -0
  110. package/packages/web/.next/types/package.json +1 -0
  111. package/packages/web/.next/types/routes.d.ts +57 -0
  112. package/packages/web/.next/types/validator.ts +61 -0
  113. package/packages/web/app/globals.css +75 -0
  114. package/packages/web/app/layout.tsx +26 -0
  115. package/packages/web/app/page.tsx +358 -0
  116. package/packages/web/bun.lock +300 -0
  117. package/packages/web/next-env.d.ts +6 -0
  118. package/packages/web/next.config.ts +5 -0
  119. package/packages/web/package.json +26 -0
  120. package/packages/web/postcss.config.mjs +8 -0
  121. package/packages/web/public/favicon.svg +5 -0
  122. package/packages/web/public/logo.svg +7 -0
  123. package/packages/web/tailwind.config.ts +48 -0
  124. package/packages/web/tsconfig.json +21 -0
@@ -0,0 +1,1237 @@
1
+ /*!*************************************************************************************************************************************************************************************************************************************************************!*\
2
+ !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[14].oneOf[10].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[14].oneOf[10].use[3]!./app/globals.css ***!
3
+ \*************************************************************************************************************************************************************************************************************************************************************/
4
+ *, ::before, ::after {
5
+ --tw-border-spacing-x: 0;
6
+ --tw-border-spacing-y: 0;
7
+ --tw-translate-x: 0;
8
+ --tw-translate-y: 0;
9
+ --tw-rotate: 0;
10
+ --tw-skew-x: 0;
11
+ --tw-skew-y: 0;
12
+ --tw-scale-x: 1;
13
+ --tw-scale-y: 1;
14
+ --tw-pan-x: ;
15
+ --tw-pan-y: ;
16
+ --tw-pinch-zoom: ;
17
+ --tw-scroll-snap-strictness: proximity;
18
+ --tw-gradient-from-position: ;
19
+ --tw-gradient-via-position: ;
20
+ --tw-gradient-to-position: ;
21
+ --tw-ordinal: ;
22
+ --tw-slashed-zero: ;
23
+ --tw-numeric-figure: ;
24
+ --tw-numeric-spacing: ;
25
+ --tw-numeric-fraction: ;
26
+ --tw-ring-inset: ;
27
+ --tw-ring-offset-width: 0px;
28
+ --tw-ring-offset-color: #fff;
29
+ --tw-ring-color: rgb(59 130 246 / 0.5);
30
+ --tw-ring-offset-shadow: 0 0 #0000;
31
+ --tw-ring-shadow: 0 0 #0000;
32
+ --tw-shadow: 0 0 #0000;
33
+ --tw-shadow-colored: 0 0 #0000;
34
+ --tw-blur: ;
35
+ --tw-brightness: ;
36
+ --tw-contrast: ;
37
+ --tw-grayscale: ;
38
+ --tw-hue-rotate: ;
39
+ --tw-invert: ;
40
+ --tw-saturate: ;
41
+ --tw-sepia: ;
42
+ --tw-drop-shadow: ;
43
+ --tw-backdrop-blur: ;
44
+ --tw-backdrop-brightness: ;
45
+ --tw-backdrop-contrast: ;
46
+ --tw-backdrop-grayscale: ;
47
+ --tw-backdrop-hue-rotate: ;
48
+ --tw-backdrop-invert: ;
49
+ --tw-backdrop-opacity: ;
50
+ --tw-backdrop-saturate: ;
51
+ --tw-backdrop-sepia: ;
52
+ --tw-contain-size: ;
53
+ --tw-contain-layout: ;
54
+ --tw-contain-paint: ;
55
+ --tw-contain-style: ;
56
+ }
57
+
58
+ ::backdrop {
59
+ --tw-border-spacing-x: 0;
60
+ --tw-border-spacing-y: 0;
61
+ --tw-translate-x: 0;
62
+ --tw-translate-y: 0;
63
+ --tw-rotate: 0;
64
+ --tw-skew-x: 0;
65
+ --tw-skew-y: 0;
66
+ --tw-scale-x: 1;
67
+ --tw-scale-y: 1;
68
+ --tw-pan-x: ;
69
+ --tw-pan-y: ;
70
+ --tw-pinch-zoom: ;
71
+ --tw-scroll-snap-strictness: proximity;
72
+ --tw-gradient-from-position: ;
73
+ --tw-gradient-via-position: ;
74
+ --tw-gradient-to-position: ;
75
+ --tw-ordinal: ;
76
+ --tw-slashed-zero: ;
77
+ --tw-numeric-figure: ;
78
+ --tw-numeric-spacing: ;
79
+ --tw-numeric-fraction: ;
80
+ --tw-ring-inset: ;
81
+ --tw-ring-offset-width: 0px;
82
+ --tw-ring-offset-color: #fff;
83
+ --tw-ring-color: rgb(59 130 246 / 0.5);
84
+ --tw-ring-offset-shadow: 0 0 #0000;
85
+ --tw-ring-shadow: 0 0 #0000;
86
+ --tw-shadow: 0 0 #0000;
87
+ --tw-shadow-colored: 0 0 #0000;
88
+ --tw-blur: ;
89
+ --tw-brightness: ;
90
+ --tw-contrast: ;
91
+ --tw-grayscale: ;
92
+ --tw-hue-rotate: ;
93
+ --tw-invert: ;
94
+ --tw-saturate: ;
95
+ --tw-sepia: ;
96
+ --tw-drop-shadow: ;
97
+ --tw-backdrop-blur: ;
98
+ --tw-backdrop-brightness: ;
99
+ --tw-backdrop-contrast: ;
100
+ --tw-backdrop-grayscale: ;
101
+ --tw-backdrop-hue-rotate: ;
102
+ --tw-backdrop-invert: ;
103
+ --tw-backdrop-opacity: ;
104
+ --tw-backdrop-saturate: ;
105
+ --tw-backdrop-sepia: ;
106
+ --tw-contain-size: ;
107
+ --tw-contain-layout: ;
108
+ --tw-contain-paint: ;
109
+ --tw-contain-style: ;
110
+ }/*
111
+ ! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
112
+ *//*
113
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
114
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
115
+ */
116
+
117
+ *,
118
+ ::before,
119
+ ::after {
120
+ box-sizing: border-box; /* 1 */
121
+ border-width: 0; /* 2 */
122
+ border-style: solid; /* 2 */
123
+ border-color: #e5e7eb; /* 2 */
124
+ }
125
+
126
+ ::before,
127
+ ::after {
128
+ --tw-content: '';
129
+ }
130
+
131
+ /*
132
+ 1. Use a consistent sensible line-height in all browsers.
133
+ 2. Prevent adjustments of font size after orientation changes in iOS.
134
+ 3. Use a more readable tab size.
135
+ 4. Use the user's configured `sans` font-family by default.
136
+ 5. Use the user's configured `sans` font-feature-settings by default.
137
+ 6. Use the user's configured `sans` font-variation-settings by default.
138
+ 7. Disable tap highlights on iOS
139
+ */
140
+
141
+ html,
142
+ :host {
143
+ line-height: 1.5; /* 1 */
144
+ -webkit-text-size-adjust: 100%; /* 2 */
145
+ -moz-tab-size: 4; /* 3 */
146
+ -o-tab-size: 4;
147
+ tab-size: 4; /* 3 */
148
+ font-family: Inter, system-ui, -apple-system, sans-serif; /* 4 */
149
+ font-feature-settings: normal; /* 5 */
150
+ font-variation-settings: normal; /* 6 */
151
+ -webkit-tap-highlight-color: transparent; /* 7 */
152
+ }
153
+
154
+ /*
155
+ 1. Remove the margin in all browsers.
156
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
157
+ */
158
+
159
+ body {
160
+ margin: 0; /* 1 */
161
+ line-height: inherit; /* 2 */
162
+ }
163
+
164
+ /*
165
+ 1. Add the correct height in Firefox.
166
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
167
+ 3. Ensure horizontal rules are visible by default.
168
+ */
169
+
170
+ hr {
171
+ height: 0; /* 1 */
172
+ color: inherit; /* 2 */
173
+ border-top-width: 1px; /* 3 */
174
+ }
175
+
176
+ /*
177
+ Add the correct text decoration in Chrome, Edge, and Safari.
178
+ */
179
+
180
+ abbr:where([title]) {
181
+ -webkit-text-decoration: underline dotted;
182
+ text-decoration: underline dotted;
183
+ }
184
+
185
+ /*
186
+ Remove the default font size and weight for headings.
187
+ */
188
+
189
+ h1,
190
+ h2,
191
+ h3,
192
+ h4,
193
+ h5,
194
+ h6 {
195
+ font-size: inherit;
196
+ font-weight: inherit;
197
+ }
198
+
199
+ /*
200
+ Reset links to optimize for opt-in styling instead of opt-out.
201
+ */
202
+
203
+ a {
204
+ color: inherit;
205
+ text-decoration: inherit;
206
+ }
207
+
208
+ /*
209
+ Add the correct font weight in Edge and Safari.
210
+ */
211
+
212
+ b,
213
+ strong {
214
+ font-weight: bolder;
215
+ }
216
+
217
+ /*
218
+ 1. Use the user's configured `mono` font-family by default.
219
+ 2. Use the user's configured `mono` font-feature-settings by default.
220
+ 3. Use the user's configured `mono` font-variation-settings by default.
221
+ 4. Correct the odd `em` font sizing in all browsers.
222
+ */
223
+
224
+ code,
225
+ kbd,
226
+ samp,
227
+ pre {
228
+ font-family: JetBrains Mono, Menlo, monospace; /* 1 */
229
+ font-feature-settings: normal; /* 2 */
230
+ font-variation-settings: normal; /* 3 */
231
+ font-size: 1em; /* 4 */
232
+ }
233
+
234
+ /*
235
+ Add the correct font size in all browsers.
236
+ */
237
+
238
+ small {
239
+ font-size: 80%;
240
+ }
241
+
242
+ /*
243
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
244
+ */
245
+
246
+ sub,
247
+ sup {
248
+ font-size: 75%;
249
+ line-height: 0;
250
+ position: relative;
251
+ vertical-align: baseline;
252
+ }
253
+
254
+ sub {
255
+ bottom: -0.25em;
256
+ }
257
+
258
+ sup {
259
+ top: -0.5em;
260
+ }
261
+
262
+ /*
263
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
264
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
265
+ 3. Remove gaps between table borders by default.
266
+ */
267
+
268
+ table {
269
+ text-indent: 0; /* 1 */
270
+ border-color: inherit; /* 2 */
271
+ border-collapse: collapse; /* 3 */
272
+ }
273
+
274
+ /*
275
+ 1. Change the font styles in all browsers.
276
+ 2. Remove the margin in Firefox and Safari.
277
+ 3. Remove default padding in all browsers.
278
+ */
279
+
280
+ button,
281
+ input,
282
+ optgroup,
283
+ select,
284
+ textarea {
285
+ font-family: inherit; /* 1 */
286
+ font-feature-settings: inherit; /* 1 */
287
+ font-variation-settings: inherit; /* 1 */
288
+ font-size: 100%; /* 1 */
289
+ font-weight: inherit; /* 1 */
290
+ line-height: inherit; /* 1 */
291
+ letter-spacing: inherit; /* 1 */
292
+ color: inherit; /* 1 */
293
+ margin: 0; /* 2 */
294
+ padding: 0; /* 3 */
295
+ }
296
+
297
+ /*
298
+ Remove the inheritance of text transform in Edge and Firefox.
299
+ */
300
+
301
+ button,
302
+ select {
303
+ text-transform: none;
304
+ }
305
+
306
+ /*
307
+ 1. Correct the inability to style clickable types in iOS and Safari.
308
+ 2. Remove default button styles.
309
+ */
310
+
311
+ button,
312
+ input:where([type='button']),
313
+ input:where([type='reset']),
314
+ input:where([type='submit']) {
315
+ -webkit-appearance: button; /* 1 */
316
+ background-color: transparent; /* 2 */
317
+ background-image: none; /* 2 */
318
+ }
319
+
320
+ /*
321
+ Use the modern Firefox focus style for all focusable elements.
322
+ */
323
+
324
+ :-moz-focusring {
325
+ outline: auto;
326
+ }
327
+
328
+ /*
329
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
330
+ */
331
+
332
+ :-moz-ui-invalid {
333
+ box-shadow: none;
334
+ }
335
+
336
+ /*
337
+ Add the correct vertical alignment in Chrome and Firefox.
338
+ */
339
+
340
+ progress {
341
+ vertical-align: baseline;
342
+ }
343
+
344
+ /*
345
+ Correct the cursor style of increment and decrement buttons in Safari.
346
+ */
347
+
348
+ ::-webkit-inner-spin-button,
349
+ ::-webkit-outer-spin-button {
350
+ height: auto;
351
+ }
352
+
353
+ /*
354
+ 1. Correct the odd appearance in Chrome and Safari.
355
+ 2. Correct the outline style in Safari.
356
+ */
357
+
358
+ [type='search'] {
359
+ -webkit-appearance: textfield; /* 1 */
360
+ outline-offset: -2px; /* 2 */
361
+ }
362
+
363
+ /*
364
+ Remove the inner padding in Chrome and Safari on macOS.
365
+ */
366
+
367
+ ::-webkit-search-decoration {
368
+ -webkit-appearance: none;
369
+ }
370
+
371
+ /*
372
+ 1. Correct the inability to style clickable types in iOS and Safari.
373
+ 2. Change font properties to `inherit` in Safari.
374
+ */
375
+
376
+ ::-webkit-file-upload-button {
377
+ -webkit-appearance: button; /* 1 */
378
+ font: inherit; /* 2 */
379
+ }
380
+
381
+ /*
382
+ Add the correct display in Chrome and Safari.
383
+ */
384
+
385
+ summary {
386
+ display: list-item;
387
+ }
388
+
389
+ /*
390
+ Removes the default spacing and border for appropriate elements.
391
+ */
392
+
393
+ blockquote,
394
+ dl,
395
+ dd,
396
+ h1,
397
+ h2,
398
+ h3,
399
+ h4,
400
+ h5,
401
+ h6,
402
+ hr,
403
+ figure,
404
+ p,
405
+ pre {
406
+ margin: 0;
407
+ }
408
+
409
+ fieldset {
410
+ margin: 0;
411
+ padding: 0;
412
+ }
413
+
414
+ legend {
415
+ padding: 0;
416
+ }
417
+
418
+ ol,
419
+ ul,
420
+ menu {
421
+ list-style: none;
422
+ margin: 0;
423
+ padding: 0;
424
+ }
425
+
426
+ /*
427
+ Reset default styling for dialogs.
428
+ */
429
+ dialog {
430
+ padding: 0;
431
+ }
432
+
433
+ /*
434
+ Prevent resizing textareas horizontally by default.
435
+ */
436
+
437
+ textarea {
438
+ resize: vertical;
439
+ }
440
+
441
+ /*
442
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
443
+ 2. Set the default placeholder color to the user's configured gray 400 color.
444
+ */
445
+
446
+ input::-moz-placeholder, textarea::-moz-placeholder {
447
+ opacity: 1; /* 1 */
448
+ color: #9ca3af; /* 2 */
449
+ }
450
+
451
+ input::placeholder,
452
+ textarea::placeholder {
453
+ opacity: 1; /* 1 */
454
+ color: #9ca3af; /* 2 */
455
+ }
456
+
457
+ /*
458
+ Set the default cursor for buttons.
459
+ */
460
+
461
+ button,
462
+ [role="button"] {
463
+ cursor: pointer;
464
+ }
465
+
466
+ /*
467
+ Make sure disabled buttons don't get the pointer cursor.
468
+ */
469
+ :disabled {
470
+ cursor: default;
471
+ }
472
+
473
+ /*
474
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
475
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
476
+ This can trigger a poorly considered lint error in some tools but is included by design.
477
+ */
478
+
479
+ img,
480
+ svg,
481
+ video,
482
+ canvas,
483
+ audio,
484
+ iframe,
485
+ embed,
486
+ object {
487
+ display: block; /* 1 */
488
+ vertical-align: middle; /* 2 */
489
+ }
490
+
491
+ /*
492
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
493
+ */
494
+
495
+ img,
496
+ video {
497
+ max-width: 100%;
498
+ height: auto;
499
+ }
500
+
501
+ /* Make elements with the HTML hidden attribute stay hidden by default */
502
+ [hidden]:where(:not([hidden="until-found"])) {
503
+ display: none;
504
+ }
505
+ .fixed {
506
+ position: fixed;
507
+ }
508
+ .absolute {
509
+ position: absolute;
510
+ }
511
+ .relative {
512
+ position: relative;
513
+ }
514
+ .-inset-0\.5 {
515
+ inset: -0.125rem;
516
+ }
517
+ .inset-0 {
518
+ inset: 0px;
519
+ }
520
+ .-right-2\.5 {
521
+ right: -0.625rem;
522
+ }
523
+ .bottom-0 {
524
+ bottom: 0px;
525
+ }
526
+ .left-0 {
527
+ left: 0px;
528
+ }
529
+ .left-1\/2 {
530
+ left: 50%;
531
+ }
532
+ .right-0 {
533
+ right: 0px;
534
+ }
535
+ .top-0 {
536
+ top: 0px;
537
+ }
538
+ .top-1\/2 {
539
+ top: 50%;
540
+ }
541
+ .z-10 {
542
+ z-index: 10;
543
+ }
544
+ .z-40 {
545
+ z-index: 40;
546
+ }
547
+ .mx-auto {
548
+ margin-left: auto;
549
+ margin-right: auto;
550
+ }
551
+ .mb-1 {
552
+ margin-bottom: 0.25rem;
553
+ }
554
+ .mb-12 {
555
+ margin-bottom: 3rem;
556
+ }
557
+ .mb-2 {
558
+ margin-bottom: 0.5rem;
559
+ }
560
+ .mb-20 {
561
+ margin-bottom: 5rem;
562
+ }
563
+ .mb-3 {
564
+ margin-bottom: 0.75rem;
565
+ }
566
+ .mb-4 {
567
+ margin-bottom: 1rem;
568
+ }
569
+ .mb-6 {
570
+ margin-bottom: 1.5rem;
571
+ }
572
+ .mb-8 {
573
+ margin-bottom: 2rem;
574
+ }
575
+ .ml-2 {
576
+ margin-left: 0.5rem;
577
+ }
578
+ .mt-0\.5 {
579
+ margin-top: 0.125rem;
580
+ }
581
+ .mt-20 {
582
+ margin-top: 5rem;
583
+ }
584
+ .block {
585
+ display: block;
586
+ }
587
+ .flex {
588
+ display: flex;
589
+ }
590
+ .inline-flex {
591
+ display: inline-flex;
592
+ }
593
+ .grid {
594
+ display: grid;
595
+ }
596
+ .hidden {
597
+ display: none;
598
+ }
599
+ .h-1\.5 {
600
+ height: 0.375rem;
601
+ }
602
+ .h-16 {
603
+ height: 4rem;
604
+ }
605
+ .h-2 {
606
+ height: 0.5rem;
607
+ }
608
+ .h-3 {
609
+ height: 0.75rem;
610
+ }
611
+ .h-32 {
612
+ height: 8rem;
613
+ }
614
+ .h-\[800px\] {
615
+ height: 800px;
616
+ }
617
+ .h-full {
618
+ height: 100%;
619
+ }
620
+ .h-px {
621
+ height: 1px;
622
+ }
623
+ .min-h-screen {
624
+ min-height: 100vh;
625
+ }
626
+ .w-1\.5 {
627
+ width: 0.375rem;
628
+ }
629
+ .w-2 {
630
+ width: 0.5rem;
631
+ }
632
+ .w-3 {
633
+ width: 0.75rem;
634
+ }
635
+ .w-5 {
636
+ width: 1.25rem;
637
+ }
638
+ .w-\[800px\] {
639
+ width: 800px;
640
+ }
641
+ .max-w-2xl {
642
+ max-width: 42rem;
643
+ }
644
+ .max-w-4xl {
645
+ max-width: 56rem;
646
+ }
647
+ .max-w-6xl {
648
+ max-width: 72rem;
649
+ }
650
+ .shrink-0 {
651
+ flex-shrink: 0;
652
+ }
653
+ .-translate-x-1\/2 {
654
+ --tw-translate-x: -50%;
655
+ 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));
656
+ }
657
+ .-translate-y-1\/2 {
658
+ --tw-translate-y: -50%;
659
+ 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));
660
+ }
661
+ @keyframes fadeIn {
662
+
663
+ from {
664
+ opacity: 0;
665
+ }
666
+
667
+ to {
668
+ opacity: 1;
669
+ }
670
+ }
671
+ .animate-fade-in {
672
+ animation: fadeIn 0.8s ease-out forwards;
673
+ }
674
+ @keyframes glowPulse {
675
+
676
+ 0%, 100% {
677
+ opacity: 0.4;
678
+ }
679
+
680
+ 50% {
681
+ opacity: 0.8;
682
+ }
683
+ }
684
+ .animate-glow-pulse {
685
+ animation: glowPulse 3s ease-in-out infinite;
686
+ }
687
+ @keyframes pulse {
688
+
689
+ 50% {
690
+ opacity: .5;
691
+ }
692
+ }
693
+ .animate-pulse {
694
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
695
+ }
696
+ @keyframes slideUp {
697
+
698
+ from {
699
+ opacity: 0;
700
+ transform: translateY(20px);
701
+ }
702
+
703
+ to {
704
+ opacity: 1;
705
+ transform: translateY(0);
706
+ }
707
+ }
708
+ .animate-slide-up {
709
+ animation: slideUp 0.6s ease-out forwards;
710
+ }
711
+ .cursor-pointer {
712
+ cursor: pointer;
713
+ }
714
+ .grid-cols-1 {
715
+ grid-template-columns: repeat(1, minmax(0, 1fr));
716
+ }
717
+ .grid-cols-2 {
718
+ grid-template-columns: repeat(2, minmax(0, 1fr));
719
+ }
720
+ .flex-col {
721
+ flex-direction: column;
722
+ }
723
+ .items-center {
724
+ align-items: center;
725
+ }
726
+ .justify-center {
727
+ justify-content: center;
728
+ }
729
+ .justify-between {
730
+ justify-content: space-between;
731
+ }
732
+ .gap-1\.5 {
733
+ gap: 0.375rem;
734
+ }
735
+ .gap-16 {
736
+ gap: 4rem;
737
+ }
738
+ .gap-2 {
739
+ gap: 0.5rem;
740
+ }
741
+ .gap-2\.5 {
742
+ gap: 0.625rem;
743
+ }
744
+ .gap-3 {
745
+ gap: 0.75rem;
746
+ }
747
+ .gap-4 {
748
+ gap: 1rem;
749
+ }
750
+ .gap-6 {
751
+ gap: 1.5rem;
752
+ }
753
+ .gap-8 {
754
+ gap: 2rem;
755
+ }
756
+ .gap-px {
757
+ gap: 1px;
758
+ }
759
+ .space-y-3 > :not([hidden]) ~ :not([hidden]) {
760
+ --tw-space-y-reverse: 0;
761
+ margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));
762
+ margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
763
+ }
764
+ .overflow-hidden {
765
+ overflow: hidden;
766
+ }
767
+ .rounded {
768
+ border-radius: 0.25rem;
769
+ }
770
+ .rounded-2xl {
771
+ border-radius: 1rem;
772
+ }
773
+ .rounded-full {
774
+ border-radius: 9999px;
775
+ }
776
+ .rounded-lg {
777
+ border-radius: 0.5rem;
778
+ }
779
+ .rounded-xl {
780
+ border-radius: 0.75rem;
781
+ }
782
+ .border {
783
+ border-width: 1px;
784
+ }
785
+ .border-b {
786
+ border-bottom-width: 1px;
787
+ }
788
+ .border-t {
789
+ border-top-width: 1px;
790
+ }
791
+ .border-border {
792
+ --tw-border-opacity: 1;
793
+ border-color: rgb(34 34 34 / var(--tw-border-opacity, 1));
794
+ }
795
+ .bg-\[\#28c840\] {
796
+ --tw-bg-opacity: 1;
797
+ background-color: rgb(40 200 64 / var(--tw-bg-opacity, 1));
798
+ }
799
+ .bg-\[\#febc2e\] {
800
+ --tw-bg-opacity: 1;
801
+ background-color: rgb(254 188 46 / var(--tw-bg-opacity, 1));
802
+ }
803
+ .bg-\[\#ff5f57\] {
804
+ --tw-bg-opacity: 1;
805
+ background-color: rgb(255 95 87 / var(--tw-bg-opacity, 1));
806
+ }
807
+ .bg-accent {
808
+ --tw-bg-opacity: 1;
809
+ background-color: rgb(237 237 237 / var(--tw-bg-opacity, 1));
810
+ }
811
+ .bg-bg {
812
+ --tw-bg-opacity: 1;
813
+ background-color: rgb(10 10 10 / var(--tw-bg-opacity, 1));
814
+ }
815
+ .bg-bg\/80 {
816
+ background-color: rgb(10 10 10 / 0.8);
817
+ }
818
+ .bg-border {
819
+ --tw-bg-opacity: 1;
820
+ background-color: rgb(34 34 34 / var(--tw-bg-opacity, 1));
821
+ }
822
+ .bg-green-500 {
823
+ --tw-bg-opacity: 1;
824
+ background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));
825
+ }
826
+ .bg-surface {
827
+ --tw-bg-opacity: 1;
828
+ background-color: rgb(17 17 17 / var(--tw-bg-opacity, 1));
829
+ }
830
+ .bg-surface\/50 {
831
+ background-color: rgb(17 17 17 / 0.5);
832
+ }
833
+ .bg-gradient-to-b {
834
+ background-image: linear-gradient(to bottom, var(--tw-gradient-stops));
835
+ }
836
+ .bg-gradient-to-r {
837
+ background-image: linear-gradient(to right, var(--tw-gradient-stops));
838
+ }
839
+ .bg-gradient-to-t {
840
+ background-image: linear-gradient(to top, var(--tw-gradient-stops));
841
+ }
842
+ .from-bg {
843
+ --tw-gradient-from: #0a0a0a var(--tw-gradient-from-position);
844
+ --tw-gradient-to: rgb(10 10 10 / 0) var(--tw-gradient-to-position);
845
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
846
+ }
847
+ .from-white {
848
+ --tw-gradient-from: #fff var(--tw-gradient-from-position);
849
+ --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);
850
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
851
+ }
852
+ .from-white\/20 {
853
+ --tw-gradient-from: rgb(255 255 255 / 0.2) var(--tw-gradient-from-position);
854
+ --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);
855
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
856
+ }
857
+ .from-white\/5 {
858
+ --tw-gradient-from: rgb(255 255 255 / 0.05) var(--tw-gradient-from-position);
859
+ --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);
860
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
861
+ }
862
+ .from-white\/\[0\.02\] {
863
+ --tw-gradient-from: rgb(255 255 255 / 0.02) var(--tw-gradient-from-position);
864
+ --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);
865
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
866
+ }
867
+ .via-white\/90 {
868
+ --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);
869
+ --tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / 0.9) var(--tw-gradient-via-position), var(--tw-gradient-to);
870
+ }
871
+ .to-transparent {
872
+ --tw-gradient-to: transparent var(--tw-gradient-to-position);
873
+ }
874
+ .to-white\/40 {
875
+ --tw-gradient-to: rgb(255 255 255 / 0.4) var(--tw-gradient-to-position);
876
+ }
877
+ .to-white\/5 {
878
+ --tw-gradient-to: rgb(255 255 255 / 0.05) var(--tw-gradient-to-position);
879
+ }
880
+ .bg-clip-text {
881
+ -webkit-background-clip: text;
882
+ background-clip: text;
883
+ }
884
+ .p-5 {
885
+ padding: 1.25rem;
886
+ }
887
+ .p-6 {
888
+ padding: 1.5rem;
889
+ }
890
+ .p-8 {
891
+ padding: 2rem;
892
+ }
893
+ .px-1\.5 {
894
+ padding-left: 0.375rem;
895
+ padding-right: 0.375rem;
896
+ }
897
+ .px-3 {
898
+ padding-left: 0.75rem;
899
+ padding-right: 0.75rem;
900
+ }
901
+ .px-4 {
902
+ padding-left: 1rem;
903
+ padding-right: 1rem;
904
+ }
905
+ .px-5 {
906
+ padding-left: 1.25rem;
907
+ padding-right: 1.25rem;
908
+ }
909
+ .px-6 {
910
+ padding-left: 1.5rem;
911
+ padding-right: 1.5rem;
912
+ }
913
+ .py-0\.5 {
914
+ padding-top: 0.125rem;
915
+ padding-bottom: 0.125rem;
916
+ }
917
+ .py-1\.5 {
918
+ padding-top: 0.375rem;
919
+ padding-bottom: 0.375rem;
920
+ }
921
+ .py-12 {
922
+ padding-top: 3rem;
923
+ padding-bottom: 3rem;
924
+ }
925
+ .py-2 {
926
+ padding-top: 0.5rem;
927
+ padding-bottom: 0.5rem;
928
+ }
929
+ .py-3 {
930
+ padding-top: 0.75rem;
931
+ padding-bottom: 0.75rem;
932
+ }
933
+ .py-32 {
934
+ padding-top: 8rem;
935
+ padding-bottom: 8rem;
936
+ }
937
+ .text-center {
938
+ text-align: center;
939
+ }
940
+ .font-mono {
941
+ font-family: JetBrains Mono, Menlo, monospace;
942
+ }
943
+ .text-2xl {
944
+ font-size: 1.5rem;
945
+ line-height: 2rem;
946
+ }
947
+ .text-4xl {
948
+ font-size: 2.25rem;
949
+ line-height: 2.5rem;
950
+ }
951
+ .text-6xl {
952
+ font-size: 3.75rem;
953
+ line-height: 1;
954
+ }
955
+ .text-\[10px\] {
956
+ font-size: 10px;
957
+ }
958
+ .text-lg {
959
+ font-size: 1.125rem;
960
+ line-height: 1.75rem;
961
+ }
962
+ .text-sm {
963
+ font-size: 0.875rem;
964
+ line-height: 1.25rem;
965
+ }
966
+ .text-xs {
967
+ font-size: 0.75rem;
968
+ line-height: 1rem;
969
+ }
970
+ .font-bold {
971
+ font-weight: 700;
972
+ }
973
+ .font-medium {
974
+ font-weight: 500;
975
+ }
976
+ .font-semibold {
977
+ font-weight: 600;
978
+ }
979
+ .uppercase {
980
+ text-transform: uppercase;
981
+ }
982
+ .leading-\[0\.9\] {
983
+ line-height: 0.9;
984
+ }
985
+ .leading-relaxed {
986
+ line-height: 1.625;
987
+ }
988
+ .tracking-tight {
989
+ letter-spacing: -0.025em;
990
+ }
991
+ .tracking-tighter {
992
+ letter-spacing: -0.05em;
993
+ }
994
+ .tracking-widest {
995
+ letter-spacing: 0.1em;
996
+ }
997
+ .text-accent {
998
+ --tw-text-opacity: 1;
999
+ color: rgb(237 237 237 / var(--tw-text-opacity, 1));
1000
+ }
1001
+ .text-bg {
1002
+ --tw-text-opacity: 1;
1003
+ color: rgb(10 10 10 / var(--tw-text-opacity, 1));
1004
+ }
1005
+ .text-blue-400\/80 {
1006
+ color: rgb(96 165 250 / 0.8);
1007
+ }
1008
+ .text-green-400 {
1009
+ --tw-text-opacity: 1;
1010
+ color: rgb(74 222 128 / var(--tw-text-opacity, 1));
1011
+ }
1012
+ .text-green-500\/80 {
1013
+ color: rgb(34 197 94 / 0.8);
1014
+ }
1015
+ .text-muted {
1016
+ --tw-text-opacity: 1;
1017
+ color: rgb(136 136 136 / var(--tw-text-opacity, 1));
1018
+ }
1019
+ .text-muted\/50 {
1020
+ color: rgb(136 136 136 / 0.5);
1021
+ }
1022
+ .text-muted\/60 {
1023
+ color: rgb(136 136 136 / 0.6);
1024
+ }
1025
+ .text-purple-400\/80 {
1026
+ color: rgb(192 132 252 / 0.8);
1027
+ }
1028
+ .text-transparent {
1029
+ color: transparent;
1030
+ }
1031
+ .antialiased {
1032
+ -webkit-font-smoothing: antialiased;
1033
+ -moz-osx-font-smoothing: grayscale;
1034
+ }
1035
+ .opacity-0 {
1036
+ opacity: 0;
1037
+ }
1038
+ .opacity-40 {
1039
+ opacity: 0.4;
1040
+ }
1041
+ .blur-sm {
1042
+ --tw-blur: blur(4px);
1043
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1044
+ }
1045
+ .backdrop-blur-xl {
1046
+ --tw-backdrop-blur: blur(24px);
1047
+ backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
1048
+ }
1049
+ .transition-all {
1050
+ transition-property: all;
1051
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1052
+ transition-duration: 150ms;
1053
+ }
1054
+ .transition-colors {
1055
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
1056
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1057
+ transition-duration: 150ms;
1058
+ }
1059
+ .transition-opacity {
1060
+ transition-property: opacity;
1061
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1062
+ transition-duration: 150ms;
1063
+ }
1064
+ .duration-300 {
1065
+ transition-duration: 300ms;
1066
+ }
1067
+
1068
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
1069
+
1070
+ :root {
1071
+ --bg: #0a0a0a;
1072
+ --surface: #111111;
1073
+ --border: #222222;
1074
+ --accent: #ededed;
1075
+ --muted: #888888;
1076
+ }
1077
+
1078
+ * {
1079
+ margin: 0;
1080
+ padding: 0;
1081
+ box-sizing: border-box;
1082
+ }
1083
+
1084
+ html {
1085
+ scroll-behavior: smooth;
1086
+ -webkit-font-smoothing: antialiased;
1087
+ -moz-osx-font-smoothing: grayscale;
1088
+ }
1089
+
1090
+ body {
1091
+ background: var(--bg);
1092
+ color: var(--accent);
1093
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
1094
+ }
1095
+
1096
+ ::-moz-selection {
1097
+ background: rgba(237, 237, 237, 0.15);
1098
+ color: #fff;
1099
+ }
1100
+
1101
+ ::selection {
1102
+ background: rgba(237, 237, 237, 0.15);
1103
+ color: #fff;
1104
+ }
1105
+
1106
+ .gradient-border {
1107
+ position: relative;
1108
+ }
1109
+
1110
+ .gradient-border::before {
1111
+ content: '';
1112
+ position: absolute;
1113
+ inset: 0;
1114
+ border-radius: inherit;
1115
+ padding: 1px;
1116
+ background: linear-gradient(135deg, rgba(255,255,255,0.1), rgba(255,255,255,0.02));
1117
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1118
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1119
+ -webkit-mask-composite: xor;
1120
+ mask-composite: exclude;
1121
+ pointer-events: none;
1122
+ }
1123
+
1124
+ .terminal-glow {
1125
+ box-shadow: 0 0 60px -12px rgba(100, 255, 150, 0.08),
1126
+ 0 0 120px -20px rgba(100, 255, 150, 0.04);
1127
+ }
1128
+
1129
+ .grid-bg {
1130
+ background-image:
1131
+ linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
1132
+ linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
1133
+ background-size: 60px 60px;
1134
+ }
1135
+
1136
+ .noise-overlay {
1137
+ position: fixed;
1138
+ inset: 0;
1139
+ z-index: 50;
1140
+ pointer-events: none;
1141
+ opacity: 0.015;
1142
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
1143
+ }
1144
+
1145
+ .hover\:border-border-light:hover {
1146
+ --tw-border-opacity: 1;
1147
+ border-color: rgb(51 51 51 / var(--tw-border-opacity, 1));
1148
+ }
1149
+
1150
+ .hover\:bg-surface:hover {
1151
+ --tw-bg-opacity: 1;
1152
+ background-color: rgb(17 17 17 / var(--tw-bg-opacity, 1));
1153
+ }
1154
+
1155
+ .hover\:bg-surface-hover:hover {
1156
+ --tw-bg-opacity: 1;
1157
+ background-color: rgb(26 26 26 / var(--tw-bg-opacity, 1));
1158
+ }
1159
+
1160
+ .hover\:bg-white:hover {
1161
+ --tw-bg-opacity: 1;
1162
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
1163
+ }
1164
+
1165
+ .hover\:text-accent:hover {
1166
+ --tw-text-opacity: 1;
1167
+ color: rgb(237 237 237 / var(--tw-text-opacity, 1));
1168
+ }
1169
+
1170
+ .hover\:opacity-80:hover {
1171
+ opacity: 0.8;
1172
+ }
1173
+
1174
+ .group:hover .group-hover\:opacity-100 {
1175
+ opacity: 1;
1176
+ }
1177
+
1178
+ @media (min-width: 640px) {
1179
+
1180
+ .sm\:flex-row {
1181
+ flex-direction: row;
1182
+ }
1183
+ }
1184
+
1185
+ @media (min-width: 768px) {
1186
+
1187
+ .md\:block {
1188
+ display: block;
1189
+ }
1190
+
1191
+ .md\:grid-cols-2 {
1192
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1193
+ }
1194
+
1195
+ .md\:grid-cols-3 {
1196
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1197
+ }
1198
+
1199
+ .md\:grid-cols-4 {
1200
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1201
+ }
1202
+
1203
+ .md\:grid-cols-5 {
1204
+ grid-template-columns: repeat(5, minmax(0, 1fr));
1205
+ }
1206
+
1207
+ .md\:flex-row {
1208
+ flex-direction: row;
1209
+ }
1210
+
1211
+ .md\:text-5xl {
1212
+ font-size: 3rem;
1213
+ line-height: 1;
1214
+ }
1215
+
1216
+ .md\:text-8xl {
1217
+ font-size: 6rem;
1218
+ line-height: 1;
1219
+ }
1220
+
1221
+ .md\:text-xl {
1222
+ font-size: 1.25rem;
1223
+ line-height: 1.75rem;
1224
+ }
1225
+ }
1226
+
1227
+ @media (min-width: 1024px) {
1228
+
1229
+ .lg\:grid-cols-2 {
1230
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1231
+ }
1232
+
1233
+ .lg\:grid-cols-3 {
1234
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1235
+ }
1236
+ }
1237
+