diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 54ea012b..b03a557e 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -168,6 +168,7 @@ const config: Config = { }, }, ], + "@docusaurus/theme-live-codeblock", [ "@signalwire/docusaurus-plugin-llms-txt", { diff --git a/package-lock.json b/package-lock.json index a7daef04..86e787b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,10 @@ "dependencies": { "@docusaurus/core": "^3.8.1", "@docusaurus/preset-classic": "^3.8.1", + "@docusaurus/theme-live-codeblock": "^3.8.1", "@docusaurus/theme-mermaid": "^3.8.1", "@mdx-js/react": "^3.0.0", + "@radix-ui/react-compose-refs": "^1.1.2", "@radix-ui/themes": "^3.2.1", "@signalwire/docusaurus-plugin-llms-txt": "^1.2.1", "asyncapi-schema-loader": "^0.0.1", @@ -4887,6 +4889,30 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/theme-live-codeblock": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-3.8.1.tgz", + "integrity": "sha512-TuCdnbJdTCAR4xv/dEU9m299/+hr+DrxQnQyK1mAmxnvWM/KrfaWdKMfjJ9h4hHa54ctPGm6ykdTvZic0GWdIw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-translations": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@philpl/buble": "^0.19.7", + "clsx": "^2.0.0", + "fs-extra": "^11.1.1", + "react-live": "^4.1.6", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, "node_modules/@docusaurus/theme-mermaid": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.8.1.tgz", @@ -6197,6 +6223,186 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@philpl/buble": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@philpl/buble/-/buble-0.19.7.tgz", + "integrity": "sha512-wKTA2DxAGEW+QffRQvOhRQ0VBiYU2h2p8Yc1oBNlqSKws48/8faxqKNIuub0q4iuyTuLwtB8EkwiKwhlfV1PBA==", + "license": "MIT", + "dependencies": { + "acorn": "^6.1.1", + "acorn-class-fields": "^0.2.1", + "acorn-dynamic-import": "^4.0.0", + "acorn-jsx": "^5.0.1", + "chalk": "^2.4.2", + "magic-string": "^0.25.2", + "minimist": "^1.2.0", + "os-homedir": "^1.0.1", + "regexpu-core": "^4.5.4" + }, + "bin": { + "buble": "bin/buble" + } + }, + "node_modules/@philpl/buble/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@philpl/buble/node_modules/acorn-class-fields": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/acorn-class-fields/-/acorn-class-fields-0.2.1.tgz", + "integrity": "sha512-US/kqTe0H8M4LN9izoL+eykVAitE68YMuYZ3sHn3i1fjniqR7oQ3SPvuMK/VT1kjOQHrx5Q88b90TtOKgAv2hQ==", + "license": "MIT", + "engines": { + "node": ">=4.8.2" + }, + "peerDependencies": { + "acorn": "^6.0.0" + } + }, + "node_modules/@philpl/buble/node_modules/acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "deprecated": "This is probably built in to whatever tool you're using. If you still need it... idk", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0" + } + }, + "node_modules/@philpl/buble/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@philpl/buble/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@philpl/buble/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@philpl/buble/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@philpl/buble/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@philpl/buble/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@philpl/buble/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/@philpl/buble/node_modules/regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@philpl/buble/node_modules/regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@philpl/buble/node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "license": "MIT" + }, + "node_modules/@philpl/buble/node_modules/regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/@philpl/buble/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -17778,6 +17984,15 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -23191,6 +23406,15 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -28669,6 +28893,13 @@ "node": ">=0.10.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" + }, "node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", diff --git a/package.json b/package.json index 72d82fa8..535e2bea 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "start": "run-p build:jobs-api-ref && dotenv -e .env -e .env.local node_modules/.bin/docusaurus start", "build": "run-p build:jobs-api-ref && dotenv -e .env -e .env.local node_modules/.bin/docusaurus build", "build:jobs-spec": "tsx scripts/generate-batch-spec.ts", - "build:jobs-api-ref": "rimraf docs/api-ref/jobs && npm run build:jobs-spec && docusaurus gen-api-docs jobs", + "build:jobs-api-ref": "rm -rf docs/api-ref/batch && npm run build:jobs-spec && docusaurus gen-api-docs jobs", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", @@ -23,8 +23,10 @@ "dependencies": { "@docusaurus/core": "^3.8.1", "@docusaurus/preset-classic": "^3.8.1", + "@docusaurus/theme-live-codeblock": "^3.8.1", "@docusaurus/theme-mermaid": "^3.8.1", "@mdx-js/react": "^3.0.0", + "@radix-ui/react-compose-refs": "^1.1.2", "@radix-ui/themes": "^3.2.1", "@signalwire/docusaurus-plugin-llms-txt": "^1.2.1", "asyncapi-schema-loader": "^0.0.1", @@ -62,11 +64,7 @@ "postman-code-generators": "1.10.1" }, "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], + "production": [">0.5%", "not dead", "not op_mini all"], "development": [ "last 3 chrome version", "last 3 firefox version", diff --git a/scripts/redirects/sync-redirects.ts b/scripts/redirects/sync-redirects.ts index 7509da0c..a3ce02b2 100755 --- a/scripts/redirects/sync-redirects.ts +++ b/scripts/redirects/sync-redirects.ts @@ -3,8 +3,8 @@ import { dirname } from "node:path"; import { fileURLToPath } from "node:url"; import vercelJSON from "../../vercel.json" with { type: "json" }; import { normalizePath } from "./check-redirects"; -import redirects from "./redirects.json" with { type: "json" }; import oldRedirects from "./old-redirects.json" with { type: "json" }; +import redirects from "./redirects.json" with { type: "json" }; import superOldRedirects from "./super-old-redirects.json" with { type: "json", }; diff --git a/spec/batch.yaml b/spec/batch.yaml index 60f8b181..261d6494 100644 --- a/spec/batch.yaml +++ b/spec/batch.yaml @@ -22,6 +22,8 @@ parameters: name: Authorization in: header description: Customer API token + pattern: "^Bearer .+$" + x-docusaurus-example-prefix: "Bearer " required: true type: string EARTag: @@ -37,12 +39,20 @@ paths: - $ref: "#/parameters/EARTag" post: summary: Create a new job + description: | + Create and configure a new job. + + :::tip + The quickest way to create a transcription job is to use the [Speechmatics Portal](https://portal.speechmatics.com/jobs/create/batch). + ::: consumes: - multipart/form-data parameters: - name: config in: formData type: string + x-docusaurus-example-element: textarea + x-docusaurus-example-value: "{}" description: >- JSON containing a [`JobConfig`](/speech-to-text/batch/input#jobconfig-schema) model indicating the type and parameters for the recognition job. required: true diff --git a/src/css/custom.css b/src/css/custom.css index d54540f3..5f127729 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -20,4 +20,4 @@ .radix-themes .openapi-explorer__form-item-input { background-color: var(--gray-1); border-color: var(--gray-4); -} \ No newline at end of file +} diff --git a/src/css/infima-overrides.css b/src/css/infima-overrides.css index 8d03506b..bdd99249 100644 --- a/src/css/infima-overrides.css +++ b/src/css/infima-overrides.css @@ -130,6 +130,7 @@ html[data-theme="dark"] { --ifm-color-primary-lightest: var(--accent-7); --color-background: var(--gray-3); + --segmented-control-indicator-background-color: var(--color-panel); --ifm-background-color: var(--gray-3); --base-card-surface-hover-box-shadow: 0 0 0 1px color-mix(in oklab, var(--gray-a8), var(--gray-8) 25%); diff --git a/src/css/markdown.css b/src/css/markdown.css index a53be0fc..b7463c3a 100644 --- a/src/css/markdown.css +++ b/src/css/markdown.css @@ -1,3 +1,3 @@ .rt-CalloutText { --ifm-paragraph-margin-bottom: 0; -} \ No newline at end of file +} diff --git a/src/theme/ApiExplorer/FormSelect/_FormSelect.scss b/src/theme/ApiExplorer/FormSelect/_FormSelect.scss new file mode 100644 index 00000000..86872613 --- /dev/null +++ b/src/theme/ApiExplorer/FormSelect/_FormSelect.scss @@ -0,0 +1,43 @@ +html[data-theme="dark"] .openapi-explorer__select-input { + margin-top: calc(var(--ifm-pre-padding) / 2); + background-color: var(--openapi-input-background); + border: none; + outline: none; + width: 100%; + color: var(--ifm-pre-color); + + border-radius: 4px; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + + background-image: url('data:image/svg+xml;charset=US-ASCII,'); + background-repeat: no-repeat; + background-position: right var(--ifm-pre-padding) top 50%; + background-size: auto auto; +} + +.openapi-explorer__select-input { + width: 100%; + margin-top: calc(var(--ifm-pre-padding) / 2); + padding: var(--openapi-explorer-padding-input); + border: none; + outline: none; + border-radius: 4px; + background-color: var(--openapi-input-background); + font-size: var(--openapi-explorer-font-size-input); + font-family: var(--ifm-font-family-monospace); + color: var(--ifm-pre-color); + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + + background-image: url('data:image/svg+xml;charset=US-ASCII,'); + background-repeat: no-repeat; + background-position: right var(--ifm-pre-padding) top 50%; + background-size: auto auto; + + &:focus { + box-shadow: inset 0px 0px 0px 2px var(--openapi-input-border); + } +} diff --git a/src/theme/ApiExplorer/FormSelect/index.tsx b/src/theme/ApiExplorer/FormSelect/index.tsx new file mode 100644 index 00000000..2c6ab28b --- /dev/null +++ b/src/theme/ApiExplorer/FormSelect/index.tsx @@ -0,0 +1,31 @@ +import type React from "react"; + +export interface Props { + value?: string; + options?: string[]; + onChange?: React.ChangeEventHandler; +} + +function FormSelect({ value, options, onChange }: Props) { + if (!Array.isArray(options) || options.length === 0) { + return null; + } + + return ( + + ); +} + +export default FormSelect; diff --git a/src/theme/ApiExplorer/FormTextInput/index.tsx b/src/theme/ApiExplorer/FormTextInput/index.tsx new file mode 100644 index 00000000..09131885 --- /dev/null +++ b/src/theme/ApiExplorer/FormTextInput/index.tsx @@ -0,0 +1,145 @@ +import type React from "react"; +import { forwardRef, useCallback, useEffect, useRef } from "react"; + +import { useDoc } from "@docusaurus/plugin-content-docs/client"; +import { ErrorMessage } from "@hookform/error-message"; +import { Box, Button, Flex, Text, TextArea, TextField } from "@radix-ui/themes"; +import { useController, useFormContext } from "react-hook-form"; + +export interface Props { + isRequired?: boolean; + paramName?: string; + value?: string; + placeholder?: string; + password?: boolean; + onChange?: React.ChangeEventHandler; + prefix?: string; +} + +const FormTextInput = forwardRef( + ( + { + isRequired, + value, + placeholder, + password, + paramName, + prefix, + ...props + }: Props, + ref, + ) => { + placeholder = placeholder?.split("\n")[0]; + + const { + formState: { errors }, + } = useFormContext(); + + const showErrorMessage = errors?.[paramName]?.message; + + const controller = useController({ + name: paramName, + rules: { + required: isRequired ? "This field is required" : false, + }, + }); + + const onChange = useCallback( + (e: React.ChangeEvent) => { + controller.field.onChange(e); + props.onChange?.(e); + }, + [controller, props.onChange], + ); + + const docId = useDoc().metadata.id; + const isJobConfig = + docId === "api-ref/batch/create-a-new-job" && paramName === "config"; + + if (isJobConfig) { + return ( + + + + + +