haveapi 0.31.2 → 0.32.1

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 (123) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/benchmarks/documentation.rb +29 -6
  4. data/benchmarks/endpoints.rb +153 -24
  5. data/benchmarks/spec/client_examples_spec.rb +109 -37
  6. data/doc/client-examples.md +218 -45
  7. data/doc/documentation-oauth.md +188 -0
  8. data/doc/documentation-ui.md +192 -0
  9. data/doc/index.md +3 -6
  10. data/doc/performance.md +48 -14
  11. data/haveapi.gemspec +1 -1
  12. data/lib/haveapi/authentication/chain.rb +19 -0
  13. data/lib/haveapi/authentication/oauth2/provider.rb +7 -1
  14. data/lib/haveapi/client_example.rb +143 -15
  15. data/lib/haveapi/client_examples/curl.rb +30 -20
  16. data/lib/haveapi/client_examples/dynamic_helpers.rb +1 -1
  17. data/lib/haveapi/client_examples/go_client.rb +9 -2
  18. data/lib/haveapi/client_examples/http.rb +9 -4
  19. data/lib/haveapi/client_examples/js_async_client.rb +7 -0
  20. data/lib/haveapi/client_examples/js_client.rb +47 -36
  21. data/lib/haveapi/client_examples/php_client.rb +161 -75
  22. data/lib/haveapi/client_examples/python_async_client.rb +3 -0
  23. data/lib/haveapi/client_examples/python_client.rb +61 -47
  24. data/lib/haveapi/client_examples/ruby_cli.rb +27 -18
  25. data/lib/haveapi/client_examples/ruby_client.rb +80 -31
  26. data/lib/haveapi/client_examples/rust_client.rb +20 -9
  27. data/lib/haveapi/client_examples/ts_async_client.rb +7 -0
  28. data/lib/haveapi/client_examples/ts_client.rb +3 -0
  29. data/lib/haveapi/client_examples/ts_generated_client.rb +10 -2
  30. data/lib/haveapi/documentation_context.rb +7 -2
  31. data/lib/haveapi/documentation_helpers.rb +223 -0
  32. data/lib/haveapi/documentation_oauth.rb +411 -0
  33. data/lib/haveapi/documentation_search.rb +225 -0
  34. data/lib/haveapi/documentation_search_index.rb +79 -0
  35. data/lib/haveapi/documentation_validators.rb +179 -0
  36. data/lib/haveapi/public/css/documentation.css +343 -0
  37. data/lib/haveapi/public/js/documentation.js +992 -0
  38. data/lib/haveapi/server.rb +144 -86
  39. data/lib/haveapi/shared_documentation_helpers.rb +54 -0
  40. data/lib/haveapi/version.rb +1 -1
  41. data/lib/haveapi/views/doc_layout.erb +16 -0
  42. data/lib/haveapi/views/doc_sidebars/create-client.erb +3 -3
  43. data/lib/haveapi/views/doc_sidebars/json-schema.erb +1 -1
  44. data/lib/haveapi/views/doc_sidebars/protocol.erb +5 -5
  45. data/lib/haveapi/views/documentation/search_form.erb +10 -0
  46. data/lib/haveapi/views/documentation/search_index.erb +1 -0
  47. data/lib/haveapi/views/documentation/search_results.erb +20 -0
  48. data/lib/haveapi/views/index.erb +2 -4
  49. data/lib/haveapi/views/main_layout.erb +12 -6
  50. data/lib/haveapi/views/shared_documentation.erb +12 -0
  51. data/lib/haveapi/views/shared_sidebar.erb +25 -0
  52. data/lib/haveapi/views/version_page/auth_body.erb +12 -33
  53. data/lib/haveapi/views/version_page/client_overview.erb +40 -0
  54. data/lib/haveapi/views/version_page/example_panels.erb +18 -0
  55. data/lib/haveapi/views/version_page/resource_body.erb +91 -132
  56. data/lib/haveapi/views/version_page/resource_directory.erb +14 -0
  57. data/lib/haveapi/views/version_page/usage.erb +7 -0
  58. data/lib/haveapi/views/version_page.erb +36 -117
  59. data/lib/haveapi/views/version_sidebar/auth_nav.erb +12 -16
  60. data/lib/haveapi/views/version_sidebar/auth_resource_nav.erb +19 -0
  61. data/lib/haveapi/views/version_sidebar/authentication_control.erb +26 -0
  62. data/lib/haveapi/views/version_sidebar/authentication_status.erb +3 -0
  63. data/lib/haveapi/views/version_sidebar/brand.erb +31 -0
  64. data/lib/haveapi/views/version_sidebar/resource_nav.erb +11 -20
  65. data/lib/haveapi/views/version_sidebar.erb +59 -48
  66. data/spec/authentication/basic_spec.rb +10 -10
  67. data/spec/authentication/oauth2_chain_spec.rb +72 -0
  68. data/spec/authentication/oauth2_token_validation_spec.rb +38 -0
  69. data/spec/client_examples/assets/documentation_test.cjs +817 -0
  70. data/spec/client_examples/context_performance_spec.rb +5 -4
  71. data/spec/client_examples/context_spec.rb +23 -2
  72. data/spec/client_examples/detail_spec.rb +175 -0
  73. data/spec/client_examples/dynamic_acceptance.md +59 -26
  74. data/spec/client_examples/dynamic_acceptance.rb +164 -44
  75. data/spec/client_examples/dynamic_acceptance_spec.rb +140 -23
  76. data/spec/client_examples/dynamic_fixture.rb +4 -3
  77. data/spec/client_examples/dynamic_js_spec.rb +20 -11
  78. data/spec/client_examples/dynamic_metadata_spec.rb +69 -0
  79. data/spec/client_examples/dynamic_mounted_paths_spec.rb +9 -7
  80. data/spec/client_examples/dynamic_python_spec.rb +62 -11
  81. data/spec/client_examples/go_spec.rb +14 -1
  82. data/spec/client_examples/presentation_spec.rb +247 -0
  83. data/spec/client_examples/profile_mount_spec.rb +40 -13
  84. data/spec/client_examples/rust_client_spec.rb +35 -1
  85. data/spec/client_examples/shell_spec.rb +268 -0
  86. data/spec/client_examples/syntax_spec.rb +192 -0
  87. data/spec/client_examples/ts_generated_client_spec.rb +15 -2
  88. data/spec/client_examples/typescript_profiles_spec.rb +1 -1
  89. data/spec/documentation/auth_filtering_spec.rb +9 -4
  90. data/spec/documentation/canonical_routes_spec.rb +89 -0
  91. data/spec/documentation/client_examples_spec.rb +39 -5
  92. data/spec/documentation/client_overview_spec.rb +145 -0
  93. data/spec/documentation/current_user_html_escaping_spec.rb +7 -2
  94. data/spec/documentation/example_variants_spec.rb +93 -0
  95. data/spec/documentation/fixtures/search_index.json +476 -0
  96. data/spec/documentation/identity_and_guides_spec.rb +130 -0
  97. data/spec/documentation/identity_context_spec.rb +180 -0
  98. data/spec/documentation/navigation_spec.rb +296 -0
  99. data/spec/documentation/oauth_fixture_spec.rb +39 -0
  100. data/spec/documentation/oauth_spec.rb +1058 -0
  101. data/spec/documentation/oauth_transport_spec.rb +45 -0
  102. data/spec/documentation/performance_spec.rb +47 -6
  103. data/spec/documentation/reference_headings_spec.rb +190 -0
  104. data/spec/documentation/search_index_routes_spec.rb +202 -0
  105. data/spec/documentation/search_index_spec.rb +85 -0
  106. data/spec/documentation/search_routes_spec.rb +199 -0
  107. data/spec/documentation/search_spec.rb +134 -0
  108. data/spec/documentation/shared_pages_spec.rb +240 -0
  109. data/spec/documentation/validators_spec.rb +123 -0
  110. data/spec/documentation_spec.rb +3 -3
  111. data/spec/packaging_spec.rb +21 -2
  112. data/spec/performance/documentation_identity_fixture_spec.rb +47 -0
  113. data/spec/performance/documentation_shapes_spec.rb +97 -0
  114. data/spec/performance/event_baseline_spec.rb +97 -2
  115. data/spec/performance/json_activation_spec.rb +78 -1
  116. data/spec/performance/release_lineage_spec.rb +4 -3
  117. data/spec/performance/runner_spec.rb +1 -0
  118. data/test_support/all_client_performance_fixture.rb +6 -10
  119. data/test_support/documentation_oauth_fixture.rb +54 -0
  120. data/test_support/documentation_performance_fixture.rb +19 -1
  121. data/test_support/dynamic_documentation_api.rb +35 -10
  122. data/test_support/dynamic_python_login_spec.rb +3 -11
  123. metadata +52 -3
@@ -0,0 +1,343 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --docs-bg: #fff;
4
+ --docs-panel: #f5f7f9;
5
+ --docs-code: #f1f4f7;
6
+ --docs-text: #243142;
7
+ --docs-muted: #526174;
8
+ --docs-border: #dce3e9;
9
+ --docs-accent: #14695d;
10
+ --docs-active: #e0f2ec;
11
+ --docs-string: #9f3547;
12
+ --docs-keyword: #6741a5;
13
+ --docs-number: #166d83;
14
+ }
15
+
16
+ @media (prefers-color-scheme: dark) {
17
+ :root:not([data-docs-theme="light"]) {
18
+ color-scheme: dark;
19
+ --docs-bg: #141b24;
20
+ --docs-panel: #192330;
21
+ --docs-code: #1c2836;
22
+ --docs-text: #e0e8f0;
23
+ --docs-muted: #acbbcb;
24
+ --docs-border: #354355;
25
+ --docs-accent: #79d6bb;
26
+ --docs-active: #203f3b;
27
+ --docs-string: #f2b5ac;
28
+ --docs-keyword: #c4a9f7;
29
+ --docs-number: #87d3e6;
30
+ }
31
+ }
32
+
33
+ :root[data-docs-theme="dark"] {
34
+ color-scheme: dark;
35
+ --docs-bg: #141b24;
36
+ --docs-panel: #192330;
37
+ --docs-code: #1c2836;
38
+ --docs-text: #e0e8f0;
39
+ --docs-muted: #acbbcb;
40
+ --docs-border: #354355;
41
+ --docs-accent: #79d6bb;
42
+ --docs-active: #203f3b;
43
+ --docs-string: #f2b5ac;
44
+ --docs-keyword: #c4a9f7;
45
+ --docs-number: #87d3e6;
46
+ }
47
+
48
+ * { box-sizing: border-box; }
49
+ html { background: var(--docs-bg); scroll-padding-top: 0; }
50
+ body {
51
+ margin: 0;
52
+ color: var(--docs-text);
53
+ background: var(--docs-bg);
54
+ font: 16px/1.6 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
55
+ -webkit-text-size-adjust: 100%;
56
+ }
57
+ a { color: var(--docs-accent); text-underline-offset: .2em; }
58
+ a:hover { text-decoration-thickness: 2px; }
59
+ button, input, select { font: inherit; }
60
+ button, select, input {
61
+ max-width: 100%;
62
+ min-height: 2.5rem;
63
+ padding: .4rem .65rem;
64
+ border: 1px solid var(--docs-border);
65
+ border-radius: .375rem;
66
+ color: var(--docs-text);
67
+ background: var(--docs-bg);
68
+ }
69
+ button, select { cursor: pointer; }
70
+ button:hover { border-color: var(--docs-accent); }
71
+ input::placeholder { color: var(--docs-muted); }
72
+ :focus-visible { outline: 3px solid var(--docs-accent); outline-offset: 3px; }
73
+ [hidden] { display: none !important; }
74
+ [id] { scroll-margin-top: 1.5rem; }
75
+ [data-docs] { overflow-anchor: none; }
76
+ .docs-container { max-width: 100rem; margin: 0 auto; }
77
+ .docs-brand {
78
+ display: grid;
79
+ grid-template-columns: minmax(0, 1fr) auto;
80
+ align-items: center;
81
+ gap: .25rem .4rem;
82
+ margin: 0 .5rem 1.25rem;
83
+ }
84
+ .docs-brand > a {
85
+ grid-column: 1;
86
+ min-width: 0;
87
+ color: var(--docs-text);
88
+ font-size: 1rem;
89
+ font-weight: 650;
90
+ letter-spacing: -.02em;
91
+ line-height: 1.35;
92
+ overflow-wrap: anywhere;
93
+ text-decoration: none;
94
+ }
95
+ .docs-api-version { grid-column: 1; color: var(--docs-muted); font-size: .75rem; }
96
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
97
+ [data-documentation-menu] { grid-column: 2; grid-row: 1 / span 2; align-self: start; position: relative; }
98
+ [data-documentation-menu] > summary { display: grid; place-items: center; width: 2.75rem; min-height: 2.75rem; padding: .5rem; border: 1px solid var(--docs-border); border-radius: .375rem; cursor: pointer; list-style: none; }
99
+ [data-documentation-menu] > summary::-webkit-details-marker { display: none; }
100
+ [data-documentation-menu] > summary svg { width: 1.2rem; height: 1.2rem; }
101
+ [data-documentation-menu-content] { position: absolute; z-index: 20; top: calc(100% + .35rem); left: 0; width: 14.5rem; max-width: calc(100vw - 2rem); padding: .75rem; border: 1px solid var(--docs-border); border-radius: .375rem; background: var(--docs-bg); box-shadow: 0 .25rem .75rem #0002; }
102
+ [data-documentation-menu-content] .docs-identity { display: block; width: 100%; margin-bottom: .5rem; overflow-wrap: anywhere; font-weight: 600; }
103
+ [data-documentation-menu-content] .authentication a, [data-documentation-menu-content] .docs-account-link, [data-documentation-menu-content] .authentication button { display: flex; align-items: center; gap: .5rem; width: 100%; min-height: 2.75rem; text-align: left; }
104
+ [data-documentation-menu-content] .authentication { margin: .75rem 0 0; padding-top: .75rem; border-top: 1px solid var(--docs-border); }
105
+ [data-documentation-menu-content] > .docs-account-link { margin-top: .75rem; }
106
+ [data-documentation-menu-content] form { margin: 0; }
107
+ [data-documentation-menu-content] form + form { margin-top: .4rem; }
108
+ .docs-theme-choices { display: flex; gap: .2rem; }
109
+ .docs-theme-label { display: block; margin-bottom: .4rem; color: var(--docs-muted); font-size: .8125rem; font-weight: 600; }
110
+ .docs-theme-choices button { display: grid; place-items: center; width: 2.75rem; min-height: 2.75rem; padding: .4rem; background: transparent; }
111
+ .docs-theme-choices svg { width: 1rem; height: 1rem; }
112
+ .docs-theme-choices [aria-pressed="true"] { color: var(--docs-accent); border-color: var(--docs-accent); background: var(--docs-active); }
113
+ .docs-mobile-toolbar { display: none; }
114
+ [data-nav-toggle] { display: none; }
115
+ [data-docs]:not([data-docs-enhanced]) .docs-preferences,
116
+ [data-docs]:not([data-docs-enhanced]) .docs-theme-label,
117
+ [data-docs]:not([data-docs-enhanced]) .docs-theme-choices,
118
+ [data-docs]:not([data-docs-enhanced]) [data-resource-nav] > label { display: none; }
119
+ .docs-layout { display: grid; grid-template-columns: 18.5rem minmax(0, 1fr); }
120
+ .docs-sidebar {
121
+ position: sticky;
122
+ top: 0;
123
+ align-self: start;
124
+ height: 100dvh;
125
+ overflow-y: auto;
126
+ overscroll-behavior: contain;
127
+ padding: 1.25rem 1.25rem 2rem;
128
+ border-right: 1px solid var(--docs-border);
129
+ background: var(--docs-panel);
130
+ font-size: .875rem;
131
+ scrollbar-width: thin;
132
+ }
133
+ .docs-sidebar h2, .docs-sidebar h3 {
134
+ margin: 1.6rem .5rem .5rem;
135
+ color: var(--docs-muted);
136
+ font-size: .75rem;
137
+ font-weight: 700;
138
+ letter-spacing: .055em;
139
+ text-transform: uppercase;
140
+ }
141
+ .docs-sidebar p { margin: .5rem; }
142
+ .docs-sidebar .docs-authentication-submenu { margin: .25rem 0 .4rem .6rem; padding-left: .6rem; border-left: 1px solid var(--docs-border); }
143
+ .docs-sidebar .docs-authentication-submenu a { font-size: .8125rem; }
144
+ .docs-brand > .docs-visibility-note, .docs-brand > [role="status"] { grid-column: 1 / -1; margin: .25rem 0; }
145
+ .docs-sidebar [data-current-resource] { margin: 1.25rem 0 .5rem; overflow-wrap: anywhere; }
146
+ [data-current-resource] a { display: block; padding: .35rem .5rem; text-decoration: none; }
147
+ [data-current-resource] strong { display: block; font-weight: 650; }
148
+ .docs-sidebar .authentication p { margin: .5rem 0; }
149
+ .docs-sign-in, .docs-account-link { padding: .4rem .65rem; border: 1px solid var(--docs-border); border-radius: .375rem; }
150
+ .docs-sign-in:hover, .docs-account-link:hover, [data-documentation-menu] > summary:hover { border-color: var(--docs-accent); background: var(--docs-active); }
151
+ .docs-sign-in svg, .docs-account-link svg { flex: 0 0 1.1rem; width: 1.1rem; height: 1.1rem; }
152
+ .docs-sidebar .docs-visibility-note { color: var(--docs-muted); font-size: .75rem; line-height: 1.5; }
153
+ [data-documentation-search] { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: .4rem; max-width: 42rem; margin: 1rem 0 1.5rem; }
154
+ [data-documentation-search] > label { grid-column: 1 / -1; margin: 0; color: var(--docs-muted); font-size: .8125rem; }
155
+ [data-documentation-search] > input[type="search"] { width: 100%; min-width: 0; }
156
+ [data-documentation-search] > button { padding-right: .5rem; padding-left: .5rem; font-size: .8125rem; }
157
+ .docs-sidebar [data-documentation-search] { margin: 1rem .5rem; }
158
+ .docs-sidebar [data-documentation-search] > label { margin: 0; }
159
+ [data-search-suggestions] { grid-column: 1 / -1; min-width: 0; padding: .75rem; border: 1px solid var(--docs-border); border-radius: .375rem; background: var(--docs-bg); }
160
+ [data-search-status] { color: var(--docs-muted); font-size: .8125rem; }
161
+ .docs-sidebar [data-search-status] { margin: 0; }
162
+ [data-search-preview] ol, [data-search-results] ol { padding: 0; margin: .5rem 0 0; list-style: none; }
163
+ [data-search-preview] li, [data-search-results] li { padding: .6rem 0; border-top: 1px solid var(--docs-border); }
164
+ [data-search-preview] a, [data-search-results] li > a { display: block; font-weight: 600; overflow-wrap: anywhere; }
165
+ [data-search-preview] li > span, [data-search-results] li > span { display: block; margin-top: .2rem; color: var(--docs-muted); font-size: .8125rem; overflow-wrap: anywhere; }
166
+ .docs-sidebar nav > ul { padding: 0; margin: 0; }
167
+ .docs-sidebar li { list-style: none; margin: .1rem 0; }
168
+ .docs-sidebar li > ul { padding-left: .85rem; }
169
+ .docs-sidebar [data-doc-subnav] { margin: .2rem 0 .5rem .5rem; padding-left: .6rem; border-left: 1px solid var(--docs-border); }
170
+ .docs-sidebar [data-doc-subsection] { font-size: .8125rem; }
171
+ .docs-sidebar nav a {
172
+ display: block;
173
+ padding: .35rem .5rem;
174
+ border-radius: .3rem;
175
+ color: var(--docs-muted);
176
+ line-height: 1.5;
177
+ overflow-wrap: anywhere;
178
+ text-decoration: none;
179
+ }
180
+ .docs-sidebar nav a:hover { color: var(--docs-text); background: var(--docs-code); }
181
+ .docs-sidebar a[aria-current] { color: var(--docs-accent); background: var(--docs-active); font-weight: 650; }
182
+ .docs-sidebar label { display: block; margin: .6rem .5rem; }
183
+ .docs-sidebar label > input { width: 100%; margin-top: .25rem; }
184
+ .docs-preferences {
185
+ display: grid;
186
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
187
+ gap: .75rem;
188
+ margin: 1.2rem .5rem;
189
+ padding: 1rem 0;
190
+ border-top: 1px solid var(--docs-border);
191
+ border-bottom: 1px solid var(--docs-border);
192
+ }
193
+ .docs-preferences label { min-width: 0; margin: 0; color: var(--docs-muted); font-size: .75rem; }
194
+ .docs-preferences label:has([data-detail-select]) { grid-column: 1 / -1; }
195
+ .docs-preferences:has([data-variant-control][hidden]) label:has([data-language-select]) { grid-column: 1 / -1; }
196
+ .docs-preferences select { width: 100%; margin-top: .3rem; padding-right: .2rem; font-size: .875rem; }
197
+ .docs-preferences [data-preference-status] { grid-column: 1 / -1; margin: 0; font-size: .8rem; }
198
+ .docs-resource-list { margin: 1.5rem 0; padding: 0; list-style: none; }
199
+ .docs-resource-list ul { margin: .2rem 0 .6rem; padding-left: 1.5rem; list-style: none; }
200
+ .docs-resource-list > li { margin: .9rem 0; }
201
+ .docs-resource-list li li { margin: .2rem 0; }
202
+ .docs-resource-list a { display: inline-block; padding: .15rem 0; }
203
+ .docs-main [data-resource-filter] { display: block; width: min(100%, 36rem); margin: .4rem 0 1.25rem; }
204
+ .docs-main [data-resource-empty] { color: var(--docs-muted); }
205
+ .docs-main { min-width: 0; padding: 2.5rem clamp(1.5rem, 4vw, 4.5rem) 5rem; }
206
+ .docs-main > :first-child { margin-top: 0; }
207
+ .docs-main h1, .docs-main h2, .docs-main h3 { font-weight: 650; letter-spacing: -.025em; line-height: 1.25; }
208
+ .docs-main h1 { overflow-wrap: anywhere; }
209
+ .docs-main h1, .docs-main > .resource { margin: 0 0 1.25rem; font-size: clamp(1.8rem, 3vw, 2.5rem); }
210
+ .docs-main h2 { margin: 2.5rem 0 1rem; font-size: 1.6rem; }
211
+ .docs-main h3 { margin: 2rem 0 1.25rem; font-size: 1.4rem; }
212
+ .docs-main [data-doc-section] > h2, .docs-main [data-doc-section] > h3 { margin-top: 0; }
213
+ .docs-main h4 { margin: 1.75rem 0 .75rem; font-size: 1rem; }
214
+ .docs-main h5, .docs-main h6 { margin: 1.25rem 0 .5rem; font-size: .95rem; }
215
+ .docs-permalink { display: inline-flex; align-items: center; justify-content: center; min-width: 1.6rem; min-height: 1.6rem; margin-left: .3rem; border-radius: .2rem; font-size: .75em; font-weight: 400; text-decoration: none; vertical-align: middle; opacity: 0; }
216
+ :is(h1, h2, h3, h4, h5, h6):hover > .docs-permalink, .docs-permalink:focus-visible { opacity: 1; }
217
+ @media (any-hover: none) { .docs-permalink { opacity: .7; } }
218
+ .docs-main p { max-width: 85ch; margin: .75rem 0; overflow-wrap: anywhere; }
219
+ .docs-main li { overflow-wrap: anywhere; }
220
+ .docs-main > nav { color: var(--docs-muted); font-size: .875rem; margin-bottom: 1.5rem; }
221
+ .docs-main nav[aria-label="Breadcrumb"] ol { display: flex; flex-wrap: wrap; gap: .35rem .6rem; margin: 0; padding: 0; list-style: none; }
222
+ .docs-main nav[aria-label="Breadcrumb"] li + li::before { content: "/"; margin-right: .6rem; color: var(--docs-muted); }
223
+ .docs-main nav[aria-label="Breadcrumb"] [aria-current="page"] { color: var(--docs-text); }
224
+ .docs-main hr { margin: 1.5rem 0; border: 0; border-top: 1px solid var(--docs-border); }
225
+ .docs-main [data-doc-section] { margin: 2.5rem 0 0; padding-top: 2rem; border-top: 1px solid var(--docs-border); }
226
+ .docs-main dl { margin: 1rem 0; }
227
+ .docs-main dt { font-weight: 600; }
228
+ .docs-main dd { margin: .25rem 0 .75rem 1.25rem; }
229
+ .docs-main dl.docs-metadata {
230
+ display: grid;
231
+ grid-template-columns: minmax(8rem, 11rem) minmax(0, 1fr);
232
+ margin: 1rem 0;
233
+ border: 1px solid var(--docs-border);
234
+ border-radius: .5rem;
235
+ overflow: hidden;
236
+ font-size: .875rem;
237
+ }
238
+ .docs-main .docs-metadata > dt, .docs-main .docs-metadata > dd { padding: .55rem .8rem; margin: 0; overflow-wrap: anywhere; }
239
+ .docs-main .docs-metadata > dt { background: var(--docs-panel); color: var(--docs-muted); }
240
+ .docs-main .docs-metadata > dd + dt, .docs-main .docs-metadata > dd ~ dd { border-top: 1px solid var(--docs-border); }
241
+ .docs-table-scroll { max-width: 100%; margin: 1rem 0 1.75rem; overflow-x: auto; border: 1px solid var(--docs-border); border-radius: .375rem; }
242
+ .docs-main table {
243
+ display: table;
244
+ width: 100%;
245
+ margin: 0;
246
+ table-layout: auto;
247
+ border-collapse: collapse;
248
+ font-size: .875rem;
249
+ }
250
+ .docs-main th, .docs-main td { padding: .65rem .8rem; text-align: left; vertical-align: top; border-bottom: 1px solid var(--docs-border); }
251
+ .docs-main th { background: var(--docs-panel); font-weight: 650; white-space: nowrap; }
252
+ .docs-main tr:last-child td { border-bottom: 0; }
253
+ .docs-main tr:nth-child(even) { background: var(--docs-panel); }
254
+ .docs-main td p { margin: 0; }
255
+ .docs-main .docs-param-name { min-width: 10rem; }
256
+ .docs-main .docs-param-name > code { display: block; width: fit-content; }
257
+ .docs-main .docs-param-label, .docs-main .docs-param-name > div { display: block; margin-top: .25rem; color: var(--docs-muted); }
258
+ .docs-main .docs-param-details, .docs-main .docs-output-parameters > tbody > tr > td:last-child { min-width: 20rem; }
259
+ .docs-main .docs-input-parameters > tbody > tr > td:nth-child(2), .docs-main .docs-output-parameters > tbody > tr > td:nth-child(2) { min-width: 6rem; }
260
+ .docs-main .docs-input-parameters > tbody > tr > td:nth-child(3) { min-width: 5rem; }
261
+ .docs-main .docs-validator-table { margin-top: .75rem; width: 100%; }
262
+ .docs-validator-table caption { padding: .4rem 0; color: var(--docs-muted); text-align: left; font-weight: 600; }
263
+ .docs-main .docs-validator-table > thead > tr > th, .docs-main .docs-validator-table > tbody > tr > th, .docs-main .docs-validator-table > tbody > tr > td { padding: .6rem; border: 1px solid var(--docs-border); white-space: normal; }
264
+ .docs-main .docs-validator-table > tbody > tr > th { width: 6rem; min-width: 5rem; }
265
+ .docs-main .docs-validator-table > tbody > tr > td { min-width: 17rem; }
266
+ .docs-validators { margin-top: .75rem; }
267
+ .docs-validator { margin: .5rem 0; }
268
+ .docs-validator-values { padding-left: 1.25rem; margin: .5rem 0; }
269
+ .docs-validator-values li { margin: .35rem 0; }
270
+ .docs-validator-values code { display: inline-block; margin-right: .4rem; }
271
+ .docs-validator details { margin: .75rem 0; }
272
+ .docs-validator summary { cursor: pointer; color: var(--docs-muted); }
273
+ .docs-validator details pre { margin-top: .5rem; }
274
+ .docs-validator details pre code { white-space: pre-wrap; overflow-wrap: anywhere; }
275
+ .docs-main .docs-validator h5 { margin: .5rem 0 .15rem; font-size: .875rem; }
276
+ .docs-validator > div { margin: .2rem 0; overflow-wrap: break-word; }
277
+ .docs-main .docs-validator dl { display: block; margin: .3rem 0; }
278
+ .docs-main .docs-validator dt { margin: .4rem 0 .1rem; }
279
+ .docs-main .docs-validator dd { margin: 0 0 .4rem 1rem; overflow-wrap: break-word; }
280
+ .docs-param-details > p + p { margin-top: .5rem; }
281
+ code, pre { font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace; font-size: .85em; }
282
+ code { padding: .15em .3em; border-radius: .2rem; background: var(--docs-code); overflow-wrap: anywhere; }
283
+ pre {
284
+ max-width: 100%;
285
+ margin: 0;
286
+ padding: 1.2rem 1.4rem;
287
+ overflow: auto;
288
+ border: 1px solid var(--docs-border);
289
+ border-radius: .5rem;
290
+ background: var(--docs-code);
291
+ line-height: 1.7;
292
+ tab-size: 2;
293
+ }
294
+ pre code { display: block; padding: 0; background: transparent; color: inherit; font-size: 1em; white-space: pre; overflow-wrap: normal; }
295
+ .docs-example { min-width: 0; margin: 1rem 0 2rem; }
296
+ .docs-example details { margin: .75rem 0; }
297
+ .docs-example summary { padding: .6rem 0; cursor: pointer; font-weight: 600; }
298
+ [data-docs-enhanced] [data-example-panel] { margin: 0; }
299
+ [data-docs-enhanced] [data-example-panel] > summary { display: none; }
300
+ .docs-code-block { position: relative; min-width: 0; border: 1px solid var(--docs-border); border-radius: .5rem; background: var(--docs-code); }
301
+ .docs-code-block > pre { min-width: 0; padding-inline-end: 3.75rem; border: 0; border-radius: inherit; background: transparent; }
302
+ [data-copy-example] { position: absolute; z-index: 1; inset-block-start: 0; inset-inline-end: 0; display: grid; place-items: center; width: 2.75rem; height: 2.75rem; min-width: 2.75rem; min-height: 2.75rem; padding: 0; border-color: transparent; background: var(--docs-code); }
303
+ [data-copy-example] svg { width: .875rem; height: .875rem; }
304
+ .docs-copy-status { position: absolute; z-index: 1; inset-block-start: 100%; inset-inline-end: 0; max-width: 100%; padding: .15rem .5rem; border-radius: .25rem; background: var(--docs-bg); color: var(--docs-muted); font-size: .8125rem; line-height: 1.4; overflow-wrap: anywhere; }
305
+ .docs-copy-status:empty { display: none; }
306
+ .docs-notice, .client-limitation {
307
+ padding: .8rem 1rem;
308
+ border: 1px solid var(--docs-border);
309
+ border-radius: .5rem;
310
+ background: var(--docs-panel);
311
+ color: var(--docs-muted);
312
+ font-size: .875rem;
313
+ }
314
+ .docs-footer { padding: 1rem 2rem; border-top: 1px solid var(--docs-border); color: var(--docs-muted); font-size: .75rem; text-align: right; }
315
+ .docs-skip-link { position: fixed; z-index: 30; top: .5rem; left: .5rem; padding: .6rem 1rem; background: var(--docs-bg); transform: translateY(-200%); }
316
+ .docs-skip-link:focus { transform: translateY(0); }
317
+ .hljs-comment, .hljs-quote { color: var(--docs-muted); }
318
+ .hljs-keyword, .hljs-selector-tag, .hljs-name, .hljs-meta, .hljs-built_in { color: var(--docs-keyword); }
319
+ .hljs-string, .hljs-regexp, .hljs-template-tag, .hljs-template-variable, .hljs-deletion { color: var(--docs-string); }
320
+ .hljs-number, .hljs-literal, .hljs-type, .hljs-attr, .hljs-attribute, .hljs-symbol, .hljs-bullet { color: var(--docs-number); }
321
+ .hljs-title, .hljs-section, .hljs-link, .hljs-addition { color: var(--docs-accent); }
322
+ .hljs-strong { font-weight: bold; }
323
+ .hljs-emphasis { font-style: italic; }
324
+
325
+ @media (max-width: 1100px) {
326
+ .docs-layout { grid-template-columns: 17rem minmax(0, 1fr); }
327
+ .docs-sidebar { padding-left: .75rem; padding-right: .75rem; }
328
+ }
329
+ @media (max-width: 900px) {
330
+ html { scroll-padding-top: 3.5rem; }
331
+ [data-docs-enhanced] .docs-mobile-toolbar { position: sticky; z-index: 10; top: 0; display: flex; align-items: center; justify-content: flex-end; min-height: 3.5rem; padding: .4rem 1rem; border-bottom: 1px solid var(--docs-border); background: var(--docs-bg); }
332
+ [data-docs-enhanced] [data-nav-toggle] { display: block; }
333
+ .docs-layout { display: block; }
334
+ .docs-sidebar { position: static; width: auto; height: auto; max-height: none; border-right: 0; border-bottom: 1px solid var(--docs-border); }
335
+ [data-docs-enhanced]:not([data-nav-open]) .docs-sidebar { display: none; }
336
+ [data-docs-enhanced][data-nav-open] .docs-sidebar { position: fixed; z-index: 9; top: 3.5rem; right: 0; bottom: 0; left: 0; max-height: calc(100dvh - 3.5rem); }
337
+ .docs-preferences { max-width: 32rem; }
338
+ .docs-main { padding: 1.75rem 1rem 3rem; }
339
+ .docs-main dl.docs-metadata { grid-template-columns: minmax(6rem, 8rem) minmax(0, 1fr); }
340
+ .docs-main .docs-metadata > dt, .docs-main .docs-metadata > dd { padding: .5rem .6rem; }
341
+ pre { padding: 1rem; }
342
+ .docs-footer { padding: 1rem; }
343
+ }