parse-stack-next 5.0.1 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.yml +105 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.yml +67 -0
  4. data/.github/dependabot.yml +13 -0
  5. data/.github/workflows/codeql.yml +1 -1
  6. data/.github/workflows/docs.yml +3 -3
  7. data/.github/workflows/release.yml +14 -3
  8. data/.github/workflows/ruby.yml +1 -1
  9. data/.gitignore +1 -0
  10. data/.yardopts +19 -0
  11. data/CHANGELOG.md +792 -0
  12. data/Gemfile +3 -0
  13. data/Gemfile.lock +8 -5
  14. data/README.md +15 -0
  15. data/Rakefile +5 -1
  16. data/docs/acl_clp_guide.md +553 -0
  17. data/docs/atlas_vector_search_guide.md +123 -22
  18. data/docs/client_sdk_guide.md +201 -5
  19. data/docs/usage_guide.md +21 -0
  20. data/docs/yard-template/default/fulldoc/html/css/common.css +1222 -0
  21. data/docs/yard-template/default/fulldoc/html/css/full_list.css +387 -0
  22. data/lib/parse/agent/tools.rb +153 -1
  23. data/lib/parse/cache/redis.rb +53 -0
  24. data/lib/parse/client/caching.rb +18 -1
  25. data/lib/parse/client.rb +79 -12
  26. data/lib/parse/embeddings/cohere.rb +143 -6
  27. data/lib/parse/embeddings/provider.rb +20 -2
  28. data/lib/parse/embeddings/voyage.rb +102 -0
  29. data/lib/parse/embeddings.rb +332 -1
  30. data/lib/parse/live_query/client.rb +167 -4
  31. data/lib/parse/live_query/configuration.rb +12 -0
  32. data/lib/parse/live_query/subscription.rb +55 -2
  33. data/lib/parse/live_query.rb +123 -1
  34. data/lib/parse/lock.rb +342 -0
  35. data/lib/parse/lock_backend.rb +308 -0
  36. data/lib/parse/model/classes/audience.rb +5 -0
  37. data/lib/parse/model/classes/installation.rb +122 -0
  38. data/lib/parse/model/classes/job_schedule.rb +3 -1
  39. data/lib/parse/model/classes/job_status.rb +4 -1
  40. data/lib/parse/model/classes/push_status.rb +4 -1
  41. data/lib/parse/model/classes/session.rb +7 -0
  42. data/lib/parse/model/classes/user.rb +204 -0
  43. data/lib/parse/model/core/create_lock.rb +28 -146
  44. data/lib/parse/model/core/embed_managed.rb +162 -13
  45. data/lib/parse/model/core/parse_reference.rb +17 -1
  46. data/lib/parse/model/core/querying.rb +26 -2
  47. data/lib/parse/model/file.rb +523 -18
  48. data/lib/parse/query.rb +31 -1
  49. data/lib/parse/stack/version.rb +1 -1
  50. data/lib/parse/stack.rb +98 -1
  51. data/parse-stack-next.gemspec +2 -2
  52. metadata +17 -7
@@ -0,0 +1,1222 @@
1
+ /* parse-stack-next YARD theme overlay
2
+ *
3
+ * Loaded after YARD's default common.css, so every rule here is an
4
+ * intentional override. Palette:
5
+ *
6
+ * Ruby red #B22234 / #E63946 (accent, links, headings)
7
+ * Parse blue #169CEE / #4FB8F4 (highlights, borders, code)
8
+ * Graphite #1E1F22 / #2A2C30 (dark bg / surfaces)
9
+ * Slate #6B7280 / #9CA3AF (muted text, dividers)
10
+ * Bone #F8F9FA / #FFFFFF (light bg / surfaces)
11
+ *
12
+ * Honors prefers-color-scheme for automatic dark mode.
13
+ */
14
+
15
+ :root {
16
+ --ruby: #B22234;
17
+ --ruby-hi: #E63946;
18
+ --parse: #169CEE;
19
+ --parse-hi: #4FB8F4;
20
+ --graphite: #1E1F22;
21
+ --graphite-2: #2A2C30;
22
+ --graphite-3: #34373C;
23
+ --slate: #6B7280;
24
+ --slate-2: #9CA3AF;
25
+ --bone: #F8F9FA;
26
+ --paper: #FFFFFF;
27
+ --ink: #1F2328;
28
+ --rule: #E5E7EB;
29
+
30
+ --bg: var(--paper);
31
+ --bg-soft: var(--bone);
32
+ --bg-code: #F3F5F7;
33
+ --fg: var(--ink);
34
+ --fg-muted: var(--slate);
35
+ --accent: var(--ruby);
36
+ --accent-hi: var(--ruby-hi);
37
+ --link: var(--parse);
38
+ --link-hover: var(--ruby);
39
+ --border: var(--rule);
40
+ /* Inline-code text color. Lighter pink-rose so the inline `tags`
41
+ * read as a separate color family from h1/h2 ruby accents. */
42
+ --code-inline: #C2185B;
43
+
44
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "Inter",
45
+ Roboto, "Helvetica Neue", Arial, sans-serif;
46
+ --font-mono: "JetBrains Mono", "SF Mono", "Menlo", "Consolas",
47
+ "Liberation Mono", "DejaVu Sans Mono", monospace;
48
+
49
+ --radius: 8px;
50
+ --radius-sm: 4px;
51
+ --shadow: 0 1px 2px rgba(0,0,0,.04), 0 4px 12px rgba(0,0,0,.06);
52
+ }
53
+
54
+ @media (prefers-color-scheme: dark) {
55
+ :root {
56
+ --bg: var(--graphite);
57
+ --bg-soft: var(--graphite-2);
58
+ --bg-code: var(--graphite-3);
59
+ --fg: #E6E8EB;
60
+ --fg-muted: var(--slate-2);
61
+ --border: #3A3D42;
62
+ --link: #88CDFD; /* sky / Github-Dark blue, lighter than parse-hi */
63
+ --link-hover: var(--ruby-hi);
64
+ --accent: #FF8FA3; /* rose-pink for h1/h2/h3 accents in dark mode */
65
+ --accent-hi: #FFB4C2;
66
+ --code-inline: #FF8FA3; /* lighter rose-pink for inline code in dark mode */
67
+ --shadow: 0 1px 2px rgba(0,0,0,.4), 0 4px 14px rgba(0,0,0,.5);
68
+ }
69
+ }
70
+
71
+ /* -------- base -------- */
72
+
73
+ html, body {
74
+ background: var(--bg);
75
+ color: var(--fg);
76
+ font-family: var(--font-sans);
77
+ font-size: 15px;
78
+ line-height: 1.6;
79
+ -webkit-font-smoothing: antialiased;
80
+ -moz-osx-font-smoothing: grayscale;
81
+ }
82
+
83
+ #main, #content, .docstring, .tags {
84
+ color: var(--fg);
85
+ background: var(--bg);
86
+ }
87
+
88
+ a, a:visited {
89
+ color: var(--link);
90
+ text-decoration: none;
91
+ transition: color .15s ease;
92
+ }
93
+
94
+ a:hover, a:focus {
95
+ color: var(--link-hover);
96
+ text-decoration: underline;
97
+ text-decoration-thickness: 1px;
98
+ text-underline-offset: 3px;
99
+ }
100
+
101
+ /* YARD's style.css ships `#content a { color: #05a }` and
102
+ * `#content a:hover { background: #ffffa5 }` (highlighter yellow,
103
+ * straight from 2010). Re-target with matching specificity. */
104
+ #content a,
105
+ #content a:visited,
106
+ #filecontents a,
107
+ #filecontents a:visited,
108
+ .docstring a,
109
+ .docstring a:visited,
110
+ .tags a,
111
+ .tags a:visited {
112
+ color: var(--link);
113
+ text-decoration: none;
114
+ }
115
+
116
+ #content a:hover,
117
+ #filecontents a:hover,
118
+ .docstring a:hover,
119
+ .tags a:hover {
120
+ color: var(--link-hover);
121
+ background: transparent;
122
+ text-decoration: underline;
123
+ text-underline-offset: 3px;
124
+ }
125
+
126
+ p, li {
127
+ color: var(--fg);
128
+ }
129
+
130
+ hr {
131
+ border: 0;
132
+ border-top: 1px solid var(--border);
133
+ margin: 2rem 0;
134
+ }
135
+
136
+ /* -------- headings -------- */
137
+
138
+ h1, h2, h3, h4, h5, h6 {
139
+ font-family: var(--font-sans);
140
+ color: var(--fg);
141
+ font-weight: 650;
142
+ letter-spacing: -0.01em;
143
+ line-height: 1.25;
144
+ margin-top: 1.6em;
145
+ margin-bottom: 0.6em;
146
+ }
147
+
148
+ h1 {
149
+ font-size: 1.9em;
150
+ border-bottom: 2px solid var(--accent);
151
+ padding-bottom: .35em;
152
+ /* NB: do NOT set display: inline-block here -- the README #toc is
153
+ * float:right, and an inline-block h1 establishes a new block
154
+ * formatting context which refuses to flow next to the float,
155
+ * pushing the rest of the page far below the ToC. Keep h1 a block. */
156
+ display: block;
157
+ }
158
+
159
+ h2 {
160
+ font-size: 1.45em;
161
+ border-bottom: 1px solid var(--border);
162
+ padding-bottom: .3em;
163
+ color: var(--accent);
164
+ }
165
+
166
+ h3 { font-size: 1.18em; color: var(--accent); }
167
+ h4 { font-size: 1.05em; color: var(--fg); }
168
+
169
+ /* -------- header / top nav -------- */
170
+
171
+ #header, .nav_wrap {
172
+ background: var(--bg-soft);
173
+ border-bottom: 1px solid var(--border);
174
+ color: var(--fg);
175
+ }
176
+
177
+ #menu, #footer {
178
+ background: var(--bg-soft);
179
+ color: var(--fg-muted);
180
+ border-top: 1px solid var(--border);
181
+ border-bottom: 1px solid var(--border);
182
+ }
183
+
184
+ #menu a, #footer a {
185
+ color: var(--link);
186
+ }
187
+
188
+ #search a {
189
+ background: var(--graphite-2);
190
+ color: #fff;
191
+ border: 1px solid var(--border);
192
+ border-radius: var(--radius-sm);
193
+ padding: 4px 10px;
194
+ }
195
+
196
+ @media (prefers-color-scheme: dark) {
197
+ #search a { background: var(--parse); border-color: var(--parse); }
198
+ }
199
+
200
+ #full_list, #full_list_nav, #content {
201
+ font-family: var(--font-sans);
202
+ }
203
+
204
+ /* -------- sidebar / full-list pane -------- */
205
+
206
+ #full_list {
207
+ background: var(--bg-soft);
208
+ color: var(--fg);
209
+ border-right: 1px solid var(--border);
210
+ }
211
+
212
+ #full_list li, #full_list .clear { color: var(--fg); }
213
+
214
+ #full_list li a {
215
+ color: var(--fg);
216
+ border-radius: var(--radius-sm);
217
+ padding: 2px 6px;
218
+ }
219
+
220
+ #full_list li a:hover,
221
+ #full_list li.collapsed > a:hover {
222
+ background: var(--parse);
223
+ color: #fff;
224
+ text-decoration: none;
225
+ }
226
+
227
+ #full_list li.odd { background: transparent; }
228
+ #full_list li.even { background: rgba(0,0,0,.02); }
229
+
230
+ @media (prefers-color-scheme: dark) {
231
+ #full_list li.even { background: rgba(255,255,255,.03); }
232
+ }
233
+
234
+ #nav_inactive, #nav_active {
235
+ color: var(--fg-muted);
236
+ }
237
+
238
+ /* -------- code -------- */
239
+
240
+ code, kbd, pre, tt {
241
+ font-family: var(--font-mono);
242
+ font-size: .92em;
243
+ }
244
+
245
+ code, tt {
246
+ background: var(--bg-code);
247
+ color: var(--code-inline);
248
+ padding: 1px 5px;
249
+ border-radius: var(--radius-sm);
250
+ border: 1px solid var(--border);
251
+ }
252
+
253
+ a > code, a > tt, h1 code, h2 code, h3 code, h4 code {
254
+ color: inherit;
255
+ background: transparent;
256
+ border: none;
257
+ padding: 0;
258
+ }
259
+
260
+ pre, pre.code, .source_code pre {
261
+ background: var(--bg-code);
262
+ color: var(--fg);
263
+ border: 1px solid var(--border);
264
+ border-left: 3px solid var(--parse);
265
+ border-radius: var(--radius);
266
+ padding: 12px 16px;
267
+ overflow-x: auto;
268
+ box-shadow: var(--shadow);
269
+ line-height: 1.5;
270
+ }
271
+
272
+ pre code, pre tt {
273
+ background: transparent;
274
+ border: 0;
275
+ padding: 0;
276
+ color: inherit;
277
+ }
278
+
279
+ /* method signatures (top of method docs) */
280
+ .method_details_list .method_details {
281
+ border-top: 1px solid var(--border);
282
+ padding-top: 1.2em;
283
+ margin-top: 1.5em;
284
+ }
285
+
286
+ .signature, .method_details .method_signature {
287
+ background: var(--bg-soft);
288
+ border: 1px solid var(--border);
289
+ border-left: 3px solid var(--accent);
290
+ border-radius: var(--radius);
291
+ padding: 10px 14px;
292
+ font-family: var(--font-mono);
293
+ color: var(--fg);
294
+ }
295
+
296
+ .summary_signature {
297
+ background: var(--bg-soft);
298
+ border-radius: var(--radius-sm);
299
+ padding: 2px 8px;
300
+ }
301
+
302
+ .summary_signature a, .summary_signature a:visited {
303
+ color: var(--accent);
304
+ }
305
+
306
+ /* -------- docstring boxes -------- */
307
+
308
+ .docstring, .tags {
309
+ font-family: var(--font-sans);
310
+ color: var(--fg);
311
+ }
312
+
313
+ .note {
314
+ background: var(--bg-soft);
315
+ border: 1px solid var(--border);
316
+ border-left: 3px solid var(--parse);
317
+ border-radius: var(--radius);
318
+ padding: 10px 14px;
319
+ margin: 1em 0;
320
+ color: var(--fg);
321
+ }
322
+
323
+ .note.deprecated {
324
+ border-left-color: var(--accent);
325
+ background: rgba(178, 34, 52, .06);
326
+ }
327
+
328
+ .note.private {
329
+ border-left-color: var(--slate);
330
+ color: var(--fg-muted);
331
+ }
332
+
333
+ .note.title {
334
+ font-weight: 600;
335
+ }
336
+
337
+ /* -------- tags / categories -------- */
338
+
339
+ .tags ul.param > li, .tags ul.return > li {
340
+ border-left: 2px solid var(--border);
341
+ padding-left: 12px;
342
+ margin: 6px 0;
343
+ }
344
+
345
+ .tags h3, .tags h4 {
346
+ color: var(--accent);
347
+ font-size: 1em;
348
+ margin-top: 1.4em;
349
+ }
350
+
351
+ .tag_title {
352
+ text-transform: uppercase;
353
+ font-size: .78em;
354
+ letter-spacing: .06em;
355
+ color: var(--fg-muted);
356
+ font-weight: 700;
357
+ }
358
+
359
+ /* -------- tables -------- */
360
+
361
+ table {
362
+ border-collapse: collapse;
363
+ width: 100%;
364
+ margin: 1em 0;
365
+ font-size: .95em;
366
+ background: var(--bg);
367
+ border: 1px solid var(--border);
368
+ border-radius: var(--radius);
369
+ overflow: hidden;
370
+ }
371
+
372
+ th, td {
373
+ padding: 8px 12px;
374
+ text-align: left;
375
+ border-bottom: 1px solid var(--border);
376
+ }
377
+
378
+ th {
379
+ background: var(--bg-soft);
380
+ color: var(--fg);
381
+ font-weight: 600;
382
+ border-bottom: 2px solid var(--border);
383
+ }
384
+
385
+ tr:last-child td { border-bottom: 0; }
386
+
387
+ tr:hover td { background: var(--bg-soft); }
388
+
389
+ /* -------- blockquotes -------- */
390
+
391
+ blockquote {
392
+ border-left: 3px solid var(--parse);
393
+ background: var(--bg-soft);
394
+ margin: 1em 0;
395
+ padding: 8px 16px;
396
+ border-radius: 0 var(--radius) var(--radius) 0;
397
+ color: var(--fg);
398
+ }
399
+
400
+ /* -------- search box -------- */
401
+
402
+ #search input[type=text],
403
+ #search input[type=search],
404
+ .search input,
405
+ .search input[type=search],
406
+ input#search_box,
407
+ input[name=q],
408
+ .frames #search input {
409
+ background: var(--bg);
410
+ color: var(--fg);
411
+ border: 1px solid var(--border);
412
+ border-radius: var(--radius-sm);
413
+ padding: 4px 10px;
414
+ font-family: var(--font-sans);
415
+ outline: none;
416
+ }
417
+
418
+ input#search_box:focus,
419
+ input[name=q]:focus,
420
+ .search input:focus {
421
+ border-color: var(--parse);
422
+ box-shadow: 0 0 0 2px rgba(22, 156, 238, .2);
423
+ }
424
+
425
+ input#search_box::placeholder,
426
+ input[name=q]::placeholder {
427
+ color: var(--fg-muted);
428
+ }
429
+
430
+ /* -------- index page -------- */
431
+
432
+ #listing ul.alpha {
433
+ list-style: none;
434
+ padding: 0;
435
+ }
436
+
437
+ #listing ul.alpha li.letter {
438
+ margin-top: 1.4em;
439
+ }
440
+
441
+ #listing ul.alpha li.letter h2 {
442
+ color: var(--accent);
443
+ border-bottom: 2px solid var(--accent);
444
+ display: inline-block;
445
+ padding: 0 .8em .2em 0;
446
+ }
447
+
448
+ #listing ul li a {
449
+ border-bottom: 1px dotted var(--border);
450
+ }
451
+
452
+ /* -------- inheritance / mixin lists -------- */
453
+
454
+ dl.box {
455
+ background: var(--bg-soft);
456
+ border: 1px solid var(--border);
457
+ border-radius: var(--radius);
458
+ padding: 12px 16px;
459
+ }
460
+
461
+ dl.box dt {
462
+ color: var(--fg-muted);
463
+ font-weight: 600;
464
+ text-transform: uppercase;
465
+ font-size: .78em;
466
+ letter-spacing: .05em;
467
+ }
468
+
469
+ dl.box dd {
470
+ margin: 4px 0 12px;
471
+ color: var(--fg);
472
+ }
473
+
474
+ /* -------- type signatures inline -------- */
475
+
476
+ .type, .object_link a {
477
+ color: var(--link);
478
+ }
479
+
480
+ .docstring h3, .docstring h4 {
481
+ border-bottom: 1px solid var(--border);
482
+ padding-bottom: .25em;
483
+ }
484
+
485
+ /* -------- subtle "this method only on" badges -------- */
486
+
487
+ .permalink {
488
+ color: var(--fg-muted);
489
+ text-decoration: none;
490
+ margin-right: 6px;
491
+ opacity: .6;
492
+ }
493
+
494
+ .permalink:hover {
495
+ color: var(--accent);
496
+ opacity: 1;
497
+ text-decoration: none;
498
+ }
499
+
500
+ /* -------- selection -------- */
501
+
502
+ ::selection {
503
+ background: rgba(22, 156, 238, .25);
504
+ color: var(--fg);
505
+ }
506
+
507
+ /* -------- scrollbars (webkit) -------- */
508
+
509
+ ::-webkit-scrollbar { width: 10px; height: 10px; }
510
+ ::-webkit-scrollbar-track { background: var(--bg-soft); }
511
+ ::-webkit-scrollbar-thumb { background: var(--slate-2); border-radius: 6px; border: 2px solid var(--bg-soft); }
512
+ ::-webkit-scrollbar-thumb:hover { background: var(--parse); }
513
+
514
+ /* -------- README Table of Contents (#toc) --------
515
+ *
516
+ * The #toc element is injected by app.js (`generateTOC`) as the
517
+ * first child of #content with YARD's default `float: right`. The
518
+ * earlier banner-image cap (max-width: 480px on the first <p> img
519
+ * inside #filecontents) is enough to let the float layout work as
520
+ * YARD intended -- so we keep the float and just restyle.
521
+ */
522
+
523
+ #toc {
524
+ background: var(--bg-soft);
525
+ border: 1px solid var(--border);
526
+ border-left: 3px solid var(--parse);
527
+ border-radius: var(--radius);
528
+ box-shadow: var(--shadow);
529
+ color: var(--fg);
530
+ max-width: 300px;
531
+ padding: 16px 22px 16px 18px;
532
+ }
533
+
534
+ /* Banner / wide images at the very top of a file page. Cap the
535
+ * leading hero image so it doesn't fight the ToC for horizontal
536
+ * real estate. Regular inline images can still go full width. */
537
+ #filecontents > p:first-child > img,
538
+ #filecontents > p:first-child + p > img {
539
+ max-width: 480px;
540
+ height: auto;
541
+ display: block;
542
+ margin: 0 0 16px;
543
+ }
544
+
545
+ #filecontents img {
546
+ max-width: 100%;
547
+ height: auto;
548
+ }
549
+
550
+ @media (max-width: 900px) {
551
+ /* Stack on narrow viewports: drop the float and let the ToC live
552
+ * in normal flow at the top of the article. */
553
+ #toc {
554
+ float: none;
555
+ max-width: none;
556
+ margin: 0 0 16px;
557
+ }
558
+ }
559
+
560
+ #toc .title {
561
+ color: var(--accent);
562
+ font-weight: 650;
563
+ letter-spacing: -0.01em;
564
+ }
565
+
566
+ #toc a,
567
+ #toc a:visited {
568
+ color: var(--link);
569
+ }
570
+
571
+ #toc a:hover {
572
+ color: var(--accent);
573
+ text-decoration: underline;
574
+ }
575
+
576
+ #toc.hidden,
577
+ #toc.hidden:hover {
578
+ background: var(--bg-soft);
579
+ box-shadow: none;
580
+ }
581
+
582
+ /* -------- Iframe sidebar host (left rail) --------
583
+ * The class-list iframe lives inside #nav (or similar); make sure the
584
+ * surrounding container doesn't show a stale white background while
585
+ * the iframe is loading.
586
+ */
587
+
588
+ iframe#nav,
589
+ #nav {
590
+ background: var(--bg-soft);
591
+ border-right: 1px solid var(--border);
592
+ }
593
+
594
+ #footer {
595
+ color: var(--fg-muted);
596
+ font-size: .85em;
597
+ text-align: center;
598
+ padding: 20px 0;
599
+ }
600
+
601
+ #footer a, #footer a:visited { color: var(--link); }
602
+
603
+ /* ============================================================
604
+ * High-specificity overrides for YARD's style.css
605
+ * ------------------------------------------------------------
606
+ * style.css ships rules like `*:not(pre) > code { background:
607
+ * #f7f7f9 }` and `.docstring pre.code { background: #f7f7f9 }`
608
+ * whose specificity beats our simpler `code {}` / `pre {}` rules.
609
+ * Match or exceed their specificity here so the dark palette
610
+ * applies inside docstrings, notes, and #filecontents.
611
+ * ============================================================ */
612
+
613
+ /* Inline code (anywhere except inside pre). */
614
+ *:not(pre) > code,
615
+ *:not(pre) > tt {
616
+ background: var(--bg-code);
617
+ color: var(--code-inline);
618
+ border: 1px solid var(--border);
619
+ border-radius: var(--radius-sm);
620
+ padding: 1px 5px;
621
+ }
622
+
623
+ /* Inline code/tt inside paragraph text in docstrings + tags. */
624
+ .docstring p > code,
625
+ .docstring p > tt,
626
+ .docstring li > code,
627
+ .docstring li > tt,
628
+ .tags p > code,
629
+ .tags p > tt,
630
+ #filecontents p > code,
631
+ #filecontents p > tt,
632
+ #filecontents li > code,
633
+ #filecontents li > tt {
634
+ background: var(--bg-code);
635
+ color: var(--code-inline);
636
+ border: 1px solid var(--border);
637
+ border-radius: var(--radius-sm);
638
+ padding: 1px 5px;
639
+ }
640
+
641
+ /* Code blocks (fenced + indented + tag examples). */
642
+ .docstring pre.code,
643
+ #filecontents pre.code,
644
+ .tags pre.example,
645
+ .source_code pre {
646
+ background: var(--bg-code);
647
+ color: var(--fg);
648
+ border: 1px solid var(--border);
649
+ border-left: 3px solid var(--parse);
650
+ border-radius: var(--radius);
651
+ padding: 12px 16px;
652
+ line-height: 1.5;
653
+ overflow-x: auto;
654
+ box-shadow: var(--shadow);
655
+ }
656
+
657
+ pre.code,
658
+ pre.code .info.file {
659
+ color: var(--fg);
660
+ }
661
+
662
+ pre.code a {
663
+ color: var(--link);
664
+ border-bottom: 1px dotted var(--parse);
665
+ }
666
+
667
+ /* Note boxes — every variant needs explicit override because each
668
+ * carries a single-class selector with a hardcoded light background
669
+ * (.note.todo, .note.deprecated, .note.private, .note.returns_void). */
670
+ .note,
671
+ .note.todo,
672
+ .note.returns_void,
673
+ .note.deprecated,
674
+ .note.private,
675
+ .note.title.deprecated,
676
+ .docstring .note {
677
+ background: var(--bg-soft);
678
+ color: var(--fg);
679
+ border: 1px solid var(--border);
680
+ border-left: 3px solid var(--parse);
681
+ border-radius: var(--radius);
682
+ padding: 10px 14px;
683
+ margin: 1em 0;
684
+ }
685
+
686
+ .note.deprecated,
687
+ .note.title.deprecated {
688
+ border-left-color: var(--accent);
689
+ background: rgba(178, 34, 52, .08);
690
+ }
691
+
692
+ .note.private {
693
+ border-left-color: var(--slate-2);
694
+ color: var(--fg-muted);
695
+ }
696
+
697
+ .note.todo {
698
+ border-left-color: #E5A93B; /* amber */
699
+ }
700
+
701
+ /* Tag titles ("Returns:", "Parameters:", etc.) often render against
702
+ * a YARD-supplied yellow/blue strip — neutralize. */
703
+ .tags .tag_title,
704
+ .tags h3.tag_title {
705
+ background: transparent;
706
+ color: var(--accent);
707
+ }
708
+
709
+ /* Method-summary section header strip and inheritance bar. */
710
+ h2.h2_sum,
711
+ .summary h2,
712
+ .method_details_list .method_details h3,
713
+ #filecontents h2 small a,
714
+ .docstring h2 small a {
715
+ background: var(--bg-soft);
716
+ color: var(--fg);
717
+ border-color: var(--border);
718
+ }
719
+
720
+ /* Inheritance / mixin "subclass" inline boxes. */
721
+ .box_info {
722
+ background: var(--bg-soft);
723
+ border: 1px solid var(--border);
724
+ border-radius: var(--radius);
725
+ padding: 10px 14px;
726
+ }
727
+
728
+ .box_info dt {
729
+ background: transparent;
730
+ color: var(--fg-muted);
731
+ border-color: var(--border);
732
+ }
733
+
734
+ .box_info dd {
735
+ background: transparent;
736
+ color: var(--fg);
737
+ border-color: var(--border);
738
+ }
739
+
740
+ /* ============================================================
741
+ * Ruby syntax highlighting — dark-mode palette
742
+ * ------------------------------------------------------------
743
+ * YARD's stock token colors are tuned for light backgrounds:
744
+ * .comment is #0066ff, .val/.tstring is #036a07, .kw is #0000ff,
745
+ * .label is #c5060b -- all invisible-to-unreadable on graphite.
746
+ * Re-target the token classes with a high-contrast palette that
747
+ * stays in the ruby/parse-blue family.
748
+ * ============================================================ */
749
+
750
+ @media (prefers-color-scheme: dark) {
751
+ :root {
752
+ /* Pull the code panel DARKER than the surrounding page (--bg is
753
+ * #1E1F22) so the bright syntax tokens have something to pop
754
+ * against. */
755
+ --bg-code: #0B0C0E;
756
+ }
757
+ }
758
+
759
+ /* Default (light) — leave YARD's stock colors alone. Only re-skin in dark. */
760
+ @media (prefers-color-scheme: dark) {
761
+ pre.code,
762
+ pre.code .info.file {
763
+ color: #E6E8EB;
764
+ }
765
+
766
+ /* Strings + string-like literals. */
767
+ pre.code .val,
768
+ pre.code .tstring_content,
769
+ pre.code .heredoc_beg,
770
+ pre.code .heredoc_end,
771
+ pre.code .qwords_beg,
772
+ pre.code .qwords_end,
773
+ pre.code .qwords_sep,
774
+ pre.code .words_beg,
775
+ pre.code .words_end,
776
+ pre.code .words_sep,
777
+ pre.code .qsymbols_beg,
778
+ pre.code .qsymbols_end,
779
+ pre.code .qsymbols_sep,
780
+ pre.code .symbols_beg,
781
+ pre.code .symbols_end,
782
+ pre.code .symbols_sep,
783
+ pre.code .tstring,
784
+ pre.code .dstring,
785
+ pre.code .regexp,
786
+ .dregexp {
787
+ color: #A5E2A5; /* lighter green, was #036a07 */
788
+ }
789
+
790
+ /* Method names / function ids. */
791
+ pre.code .fid,
792
+ pre.code .rubyid_new,
793
+ pre.code .rubyid_to_s,
794
+ pre.code .rubyid_to_sym,
795
+ pre.code .rubyid_to_f,
796
+ pre.code .dot + pre.code .id,
797
+ pre.code .rubyid_to_i pre.code .rubyid_each {
798
+ color: #82D4F4; /* parse-blue tint */
799
+ }
800
+
801
+ /* Comments — most important to brighten. */
802
+ pre.code .comment {
803
+ color: #9CA3AF; /* slate, was #0066ff */
804
+ font-style: italic;
805
+ }
806
+
807
+ /* Constants (class names). */
808
+ pre.code .const,
809
+ pre.code .constant {
810
+ color: #FFB86C; /* warm amber-orange */
811
+ }
812
+
813
+ /* Symbols and labels. */
814
+ pre.code .label,
815
+ pre.code .symbol {
816
+ color: #FF9580; /* salmon */
817
+ }
818
+
819
+ /* Keywords (def, class, require, etc.). */
820
+ pre.code .kw,
821
+ pre.code .rubyid_require,
822
+ pre.code .rubyid_extend,
823
+ pre.code .rubyid_include {
824
+ color: #FF7B96; /* ruby-pink */
825
+ font-weight: 600;
826
+ }
827
+
828
+ pre.code .ivar { color: #79C0FF; }
829
+ pre.code .gvar,
830
+ pre.code .rubyid_backref,
831
+ pre.code .rubyid_nth_ref { color: #D2A8FF; }
832
+
833
+ /* Object link colors inside highlighted code. */
834
+ #content .summary_desc pre.code .id > .object_link a,
835
+ #content .docstring pre.code .id > .object_link a,
836
+ pre.code a {
837
+ color: #82D4F4;
838
+ border-bottom-color: #82D4F4;
839
+ }
840
+ #content .summary_desc pre.code .const > .object_link a,
841
+ #content .docstring pre.code .const > .object_link a {
842
+ color: #FFB86C;
843
+ }
844
+ }
845
+
846
+ /* ============================================================
847
+ * Class header info box (Inherits / Includes / Defined in)
848
+ * ------------------------------------------------------------
849
+ * YARD's stripe rules `.box_info dl:nth-child(odd/even) > *`
850
+ * hardcode #eee and #fff. Match the same specificity with our
851
+ * dark palette so the rows are legible.
852
+ * ============================================================ */
853
+
854
+ .box_info dl dt,
855
+ .box_info dl dd {
856
+ background: var(--bg);
857
+ color: var(--fg);
858
+ border-color: var(--border) !important;
859
+ }
860
+
861
+ .box_info dl:nth-child(odd) > * {
862
+ background: var(--bg-soft);
863
+ }
864
+
865
+ .box_info dl:nth-child(even) > * {
866
+ background: var(--bg);
867
+ }
868
+
869
+ .box_info dl:last-child > * {
870
+ border-bottom-color: var(--border) !important;
871
+ }
872
+
873
+ .box_info dl dd a,
874
+ .box_info dl dd a:visited {
875
+ color: var(--link);
876
+ }
877
+
878
+ /* "show all" toggle button. */
879
+ .box_info .more_info_link {
880
+ color: var(--link);
881
+ }
882
+
883
+ /* Breadcrumb at top of class pages. The "current page" item often
884
+ * renders in a low-contrast gray; bump it. */
885
+ #menu .title {
886
+ color: var(--fg);
887
+ }
888
+
889
+ /* ============================================================
890
+ * Sidebar/iframe extras: toggle arrows + top-bar layout
891
+ * ============================================================ */
892
+
893
+ /* The collapse arrows in the class-tree iframe are a base64 PNG
894
+ * sprite of dark glyphs on a transparent background — invisible
895
+ * against our dark surface. CSS filter inverts them in place. */
896
+ #full_list li a.toggle {
897
+ filter: invert(0.85) hue-rotate(180deg) brightness(1.6);
898
+ }
899
+
900
+ /* ============================================================
901
+ * Final-pass inline-code + toggle-button overrides
902
+ * ------------------------------------------------------------
903
+ * YARD ships several places that re-color inline code (e.g.
904
+ * <code class="highlighter-rouge"> from kramdown markdown) and
905
+ * "summary_toggle" / "constants_summary_toggle" / "more_info_link"
906
+ * buttons. Belt-and-braces overrides with !important so the dark
907
+ * palette always wins, regardless of YARD's inline / cascade order.
908
+ * ============================================================ */
909
+
910
+ /* Every inline code or tt outside <pre> in docstring / file / tags / summary.
911
+ * This also catches kramdown's `<code class="highlighter-rouge">`. */
912
+ .docstring code,
913
+ .docstring tt,
914
+ .tags code,
915
+ .tags tt,
916
+ .summary code,
917
+ .summary tt,
918
+ #filecontents code,
919
+ #filecontents tt,
920
+ .discussion code,
921
+ .discussion tt,
922
+ .method_details code,
923
+ .method_details tt {
924
+ background: var(--bg-code) !important;
925
+ color: var(--code-inline) !important;
926
+ border: 1px solid var(--border) !important;
927
+ border-radius: var(--radius-sm);
928
+ padding: 1px 6px !important;
929
+ }
930
+
931
+ /* But never on the code blocks themselves (the pre.code descendants). */
932
+ pre code,
933
+ pre tt,
934
+ pre.code code,
935
+ pre.code tt {
936
+ background: transparent !important;
937
+ border: 0 !important;
938
+ padding: 0 !important;
939
+ color: inherit !important;
940
+ }
941
+
942
+ /* "show all" / "more" link inside the .box_info inheritance bar. */
943
+ .more_info_link,
944
+ a.more_info_link,
945
+ a.show_link {
946
+ background: var(--bg-soft) !important;
947
+ color: var(--link) !important;
948
+ border: 1px solid var(--border) !important;
949
+ border-radius: var(--radius-sm) !important;
950
+ padding: 2px 8px !important;
951
+ font-size: 0.85em;
952
+ font-weight: 600;
953
+ text-decoration: none !important;
954
+ }
955
+
956
+ .more_info_link:hover,
957
+ a.show_link:hover {
958
+ background: var(--parse) !important;
959
+ color: #fff !important;
960
+ border-color: var(--parse) !important;
961
+ }
962
+
963
+ /* "collapse" / "expand" toggle pills on summary sections. */
964
+ .summary_toggle,
965
+ .constants_summary_toggle,
966
+ a.summary_toggle,
967
+ a.constants_summary_toggle {
968
+ background: var(--bg-soft) !important;
969
+ color: var(--link) !important;
970
+ border: 1px solid var(--border) !important;
971
+ border-radius: 999px;
972
+ padding: 2px 10px !important;
973
+ font-size: 0.8em;
974
+ font-weight: 600;
975
+ text-decoration: none !important;
976
+ margin-left: 8px;
977
+ text-transform: lowercase;
978
+ letter-spacing: .02em;
979
+ vertical-align: middle;
980
+ }
981
+
982
+ .summary_toggle:hover,
983
+ .constants_summary_toggle:hover {
984
+ background: var(--parse) !important;
985
+ color: #fff !important;
986
+ border-color: var(--parse) !important;
987
+ }
988
+
989
+ /* The hide_toc anchor inside the README ToC. */
990
+ #toc .hide_toc,
991
+ #toc .hide_toc a {
992
+ color: var(--link);
993
+ text-decoration: none;
994
+ }
995
+
996
+ #toc .hide_toc:hover,
997
+ #toc .hide_toc a:hover {
998
+ color: var(--accent);
999
+ }
1000
+
1001
+ /* "collapse" / "expand" arrow indicators on summary lists, if any. */
1002
+ .summary li > a.summary_signature::before {
1003
+ color: var(--fg-muted);
1004
+ }
1005
+
1006
+ /* ============================================================
1007
+ * Method / attribute signature bars
1008
+ * ------------------------------------------------------------
1009
+ * YARD ships `p.signature, h3.signature { background: #e8f4ff }`
1010
+ * which is a hardcoded light blue — fights every dark surface.
1011
+ * Re-skin with matching specificity.
1012
+ * ============================================================ */
1013
+
1014
+ p.signature,
1015
+ h3.signature,
1016
+ .method_details p.signature,
1017
+ .method_details h3.signature {
1018
+ background: var(--bg-soft) !important;
1019
+ color: var(--fg) !important;
1020
+ border: 1px solid var(--border) !important;
1021
+ border-left: 3px solid var(--accent) !important;
1022
+ border-radius: var(--radius);
1023
+ padding: 8px 14px !important;
1024
+ font-family: var(--font-mono);
1025
+ }
1026
+
1027
+ p.signature .extras,
1028
+ h3.signature .extras {
1029
+ color: var(--fg-muted) !important;
1030
+ font-family: var(--font-sans);
1031
+ }
1032
+
1033
+ p.signature .not_defined_here,
1034
+ h3.signature .not_defined_here,
1035
+ p.signature .aliases,
1036
+ h3.signature .aliases {
1037
+ color: var(--fg-muted) !important;
1038
+ font-family: var(--font-sans);
1039
+ }
1040
+
1041
+ p.signature tt,
1042
+ h3.signature tt,
1043
+ p.signature code,
1044
+ h3.signature code {
1045
+ background: transparent !important;
1046
+ border: 0 !important;
1047
+ color: var(--fg) !important;
1048
+ padding: 0 !important;
1049
+ font-family: var(--font-mono);
1050
+ }
1051
+
1052
+ /* The strong/method-name portion inside the signature (e.g. `#field`)
1053
+ * was rendering near-invisible because YARD's #content a { color: #05a }
1054
+ * lost out to nothing and links inside .signature became near-transparent.
1055
+ * Force the method name to the foreground color. */
1056
+ p.signature strong,
1057
+ h3.signature strong,
1058
+ p.signature a,
1059
+ h3.signature a,
1060
+ p.signature a:visited,
1061
+ h3.signature a:visited {
1062
+ color: var(--fg) !important;
1063
+ font-weight: 700;
1064
+ }
1065
+
1066
+ /* The "Object" return-type pill inside attribute signatures keeps
1067
+ * its tt-wrapper; let it carry the inline-code background. */
1068
+ h3.signature > tt,
1069
+ p.signature > tt {
1070
+ background: var(--bg-code) !important;
1071
+ border: 1px solid var(--border) !important;
1072
+ border-radius: var(--radius-sm);
1073
+ padding: 1px 6px !important;
1074
+ color: var(--code-inline) !important;
1075
+ }
1076
+
1077
+ .method_details {
1078
+ border-top: 1px solid var(--border);
1079
+ margin-top: 24px;
1080
+ padding-top: 8px;
1081
+ }
1082
+
1083
+ /* ============================================================
1084
+ * Object links, "show all", "more..."
1085
+ * ============================================================ */
1086
+
1087
+ /* `.summary_desc .object_link a, .docstring .object_link a` ships with
1088
+ * background #edf4fa + color #05a (light bg, dark link). Re-skin. */
1089
+ .summary_desc .object_link a,
1090
+ .docstring .object_link a,
1091
+ .tags .object_link a,
1092
+ #filecontents .object_link a,
1093
+ .discussion .object_link a {
1094
+ background: var(--bg-code) !important;
1095
+ color: var(--code-inline) !important;
1096
+ border: 1px solid var(--border);
1097
+ border-radius: var(--radius-sm);
1098
+ padding: 1px 6px !important;
1099
+ font-family: var(--font-mono);
1100
+ }
1101
+
1102
+ .summary_desc .object_link a:hover,
1103
+ .docstring .object_link a:hover,
1104
+ .tags .object_link a:hover,
1105
+ #filecontents .object_link a:hover {
1106
+ background: var(--parse) !important;
1107
+ color: #fff !important;
1108
+ border-color: var(--parse);
1109
+ }
1110
+
1111
+ /* Object links inside <pre.code> stay transparent (YARD already sets
1112
+ * `background: inherit` there; we re-pin to avoid !important fighting). */
1113
+ .summary_desc pre.code .object_link a,
1114
+ .docstring pre.code .object_link a,
1115
+ pre.code .object_link a {
1116
+ background: transparent !important;
1117
+ border: 0 !important;
1118
+ padding: 0 !important;
1119
+ color: var(--link) !important;
1120
+ }
1121
+
1122
+ /* "show all" inheritance-tree toggle inside .box_info. */
1123
+ a.inheritanceTree,
1124
+ .box_info a.inheritanceTree,
1125
+ .inheritanceTree {
1126
+ background: var(--bg-soft) !important;
1127
+ color: var(--link) !important;
1128
+ border: 1px solid var(--border) !important;
1129
+ border-radius: var(--radius-sm) !important;
1130
+ padding: 1px 8px !important;
1131
+ font-size: 0.85em;
1132
+ font-weight: 600;
1133
+ text-decoration: none !important;
1134
+ }
1135
+
1136
+ a.inheritanceTree:hover {
1137
+ background: var(--parse) !important;
1138
+ color: #fff !important;
1139
+ border-color: var(--parse) !important;
1140
+ }
1141
+
1142
+ /* "more..." / "(less)" toggle inserted by createDefineLinks(). */
1143
+ a.toggleDefines,
1144
+ .toggleDefines {
1145
+ background: var(--bg-soft) !important;
1146
+ color: var(--link) !important;
1147
+ border: 1px solid var(--border) !important;
1148
+ border-radius: var(--radius-sm) !important;
1149
+ padding: 1px 8px !important;
1150
+ font-size: 0.8em;
1151
+ font-weight: 600;
1152
+ text-decoration: none !important;
1153
+ margin-left: 4px;
1154
+ }
1155
+
1156
+ a.toggleDefines:hover {
1157
+ background: var(--parse) !important;
1158
+ color: #fff !important;
1159
+ border-color: var(--parse) !important;
1160
+ }
1161
+
1162
+ /* `.defines` is the hidden detail span the toggle reveals; keep its
1163
+ * text inheriting the page palette (it was a light surface in stock). */
1164
+ .defines {
1165
+ color: var(--fg-muted);
1166
+ }
1167
+
1168
+ /* ============================================================
1169
+ * .note.title.* badges (Private, Readonly, Writeonly, Constructor)
1170
+ * ------------------------------------------------------------
1171
+ * These are the inline pill badges next to method signatures. YARD
1172
+ * ships hardcoded pastel backgrounds for each — too light to read
1173
+ * on a dark surface. Specificity 0,3,0 (three classes) so we need
1174
+ * to match it.
1175
+ * ============================================================ */
1176
+
1177
+ .note.title {
1178
+ background: var(--bg-soft) !important;
1179
+ color: var(--fg) !important;
1180
+ border: 1px solid var(--border) !important;
1181
+ border-radius: var(--radius-sm);
1182
+ padding: 1px 8px !important;
1183
+ font-size: 0.78em;
1184
+ font-weight: 700;
1185
+ text-transform: uppercase;
1186
+ letter-spacing: .04em;
1187
+ vertical-align: middle;
1188
+ }
1189
+
1190
+ .note.title.private {
1191
+ background: var(--bg-soft) !important;
1192
+ color: var(--fg-muted) !important;
1193
+ border-color: var(--slate) !important;
1194
+ }
1195
+
1196
+ .note.title.readonly {
1197
+ background: rgba(22, 156, 238, .18) !important;
1198
+ color: var(--link) !important;
1199
+ border-color: var(--parse) !important;
1200
+ }
1201
+
1202
+ .note.title.writeonly {
1203
+ background: rgba(69, 166, 56, .18) !important;
1204
+ color: #7ED4A6 !important;
1205
+ border-color: #4D8E48 !important;
1206
+ }
1207
+
1208
+ .note.title.constructor {
1209
+ background: rgba(255, 143, 163, .15) !important;
1210
+ color: var(--accent) !important;
1211
+ border-color: var(--accent) !important;
1212
+ }
1213
+
1214
+ .note.title.not_defined_here,
1215
+ .note.title.deprecated {
1216
+ background: rgba(255, 107, 122, .15) !important;
1217
+ color: var(--accent-hi) !important;
1218
+ border-color: var(--accent) !important;
1219
+ }
1220
+
1221
+ /* Strike-through line for deprecated entries already comes from
1222
+ * .deprecated rules elsewhere — leave it alone. */