diff --git a/documentation/package.json b/documentation/package.json index ede45eef35a77..3b5a7e3e1d125 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -43,6 +43,9 @@ "@floating-ui/react": "^0.26.9", "@headlessui/react": "^1.7.15", "@mdx-js/react": "^1.6.22", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-select": "^2.1.1", + "@radix-ui/react-separator": "^1.1.1", "@swc/core": "^1.3.64", "@tailwindcss/line-clamp": "^0.4.2", "autoprefixer": "^10.4.8", @@ -71,7 +74,9 @@ "remark-rehype": "^10.0.0", "snarkdown": "^2.0.0", "swc-loader": "^0.2.3", + "tailwind-merge": "^2.5.2", "tailwindcss": "^3.3.5", + "tailwindcss-animate": "^1.0.7", "title-case": "^3.0.3" }, "devDependencies": { diff --git a/documentation/pnpm-lock.yaml b/documentation/pnpm-lock.yaml index cb1341c5055c4..9c0b51724d3fa 100644 --- a/documentation/pnpm-lock.yaml +++ b/documentation/pnpm-lock.yaml @@ -50,6 +50,15 @@ importers: '@mdx-js/react': specifier: ^1.6.22 version: 1.6.22(react@17.0.2) + '@radix-ui/react-icons': + specifier: ^1.3.0 + version: 1.3.2(react@17.0.2) + '@radix-ui/react-select': + specifier: ^2.1.1 + version: 2.2.5(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-separator': + specifier: ^1.1.1 + version: 1.1.7(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@swc/core': specifier: ^1.3.64 version: 1.5.5 @@ -134,9 +143,15 @@ importers: swc-loader: specifier: ^0.2.3 version: 0.2.6(@swc/core@1.5.5)(webpack@5.91.0(@swc/core@1.5.5)) + tailwind-merge: + specifier: ^2.5.2 + version: 2.6.0 tailwindcss: specifier: ^3.3.5 version: 3.4.3 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.3) title-case: specifier: ^3.0.3 version: 3.0.3 @@ -1409,6 +1424,276 @@ packages: '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.10': + resolution: {integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-icons@1.3.2': + resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-popper@1.2.7': + resolution: {integrity: sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.2.5': + resolution: {integrity: sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.7': + resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@react-hook/intersection-observer@3.1.1': resolution: {integrity: sha512-OTDx8/wFaRvzFtKl1dEUEXSOqK2zVJHporiTTdC2xO++0e9FEx9wIrPis5q3lqtXeZH9zYGLbk+aB75qNFbbuw==} peerDependencies: @@ -2048,6 +2333,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} @@ -2812,6 +3101,9 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -3287,6 +3579,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -5278,6 +5574,26 @@ packages: peerDependencies: react: '>=16.6.0' + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.0: + resolution: {integrity: sha512-sGsQtcjMqdQyijAHytfGEELB8FufGbfXIsvUTe+NLx1GDRJCXtCFLBLUI1eyZCKXXvbEU2C6gai0PZKoIE9Vbg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-rewards@2.0.4: resolution: {integrity: sha512-Lw7gIhD8yPDzC6boaVmcXwuTHRLSLAdqB3kZc+29YWvdHWsuc3fdAZlxI8Cm8fvD8fhP+3JkZBtzX224czw15w==} peerDependencies: @@ -5306,6 +5622,16 @@ packages: peerDependencies: react: ^16.3.0 || ^17 || ^18 + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-textarea-autosize@8.5.3: resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} engines: {node: '>=10'} @@ -5878,6 +6204,14 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + tailwindcss@3.4.3: resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} engines: {node: '>=14.0.0'} @@ -6183,6 +6517,16 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + use-composed-ref@1.3.0: resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} peerDependencies: @@ -6206,6 +6550,16 @@ packages: '@types/react': optional: true + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + use-sync-external-store@1.2.2: resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: @@ -8643,6 +8997,237 @@ snapshots: '@polka/url@1.0.0-next.25': {} + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.2': {} + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + '@types/react-dom': 17.0.25 + + '@radix-ui/react-collection@1.1.7(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-context': 1.1.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-slot': 1.2.3(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + '@types/react-dom': 17.0.25 + + '@radix-ui/react-compose-refs@1.1.2(@types/react@17.0.80)(react@17.0.2)': + dependencies: + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-context@1.1.2(@types/react@17.0.80)(react@17.0.2)': + dependencies: + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-direction@1.1.1(@types/react@17.0.80)(react@17.0.2)': + dependencies: + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + '@types/react-dom': 17.0.25 + + '@radix-ui/react-focus-guards@1.1.2(@types/react@17.0.80)(react@17.0.2)': + dependencies: + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + '@types/react-dom': 17.0.25 + + '@radix-ui/react-icons@1.3.2(react@17.0.2)': + dependencies: + react: 17.0.2 + + '@radix-ui/react-id@1.1.1(@types/react@17.0.80)(react@17.0.2)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-popper@1.2.7(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@floating-ui/react-dom': 2.0.9(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-context': 1.1.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-use-rect': 1.1.1(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-use-size': 1.1.1(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/rect': 1.1.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + '@types/react-dom': 17.0.25 + + '@radix-ui/react-portal@1.1.9(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + '@types/react-dom': 17.0.25 + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + '@types/react-dom': 17.0.25 + + '@radix-ui/react-select@2.2.5(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-context': 1.1.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-direction': 1.1.1(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-id': 1.1.1(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@radix-ui/react-slot': 1.2.3(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-use-previous': 1.1.1(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + aria-hidden: 1.2.6 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-remove-scroll: 2.7.0(@types/react@17.0.80)(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + '@types/react-dom': 17.0.25 + + '@radix-ui/react-separator@1.1.7(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + '@types/react-dom': 17.0.25 + + '@radix-ui/react-slot@1.2.3(@types/react@17.0.80)(react@17.0.2)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@17.0.80)(react@17.0.2)': + dependencies: + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@17.0.80)(react@17.0.2)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@17.0.80)(react@17.0.2) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@17.0.80)(react@17.0.2)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@17.0.80)(react@17.0.2)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@17.0.80)(react@17.0.2)': + dependencies: + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-previous@1.1.1(@types/react@17.0.80)(react@17.0.2)': + dependencies: + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-rect@1.1.1(@types/react@17.0.80)(react@17.0.2)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-size@1.1.1(@types/react@17.0.80)(react@17.0.2)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@17.0.80)(react@17.0.2) + react: 17.0.2 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@17.0.25)(@types/react@17.0.80)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + '@types/react-dom': 17.0.25 + + '@radix-ui/rect@1.1.1': {} + '@react-hook/intersection-observer@3.1.1(react@17.0.2)': dependencies: '@react-hook/passive-layout-effect': 1.2.1(react@17.0.2) @@ -9344,6 +9929,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.6.2 + aria-query@5.1.3: dependencies: deep-equal: 2.2.3 @@ -10227,6 +10816,8 @@ snapshots: detect-newline@3.1.0: {} + detect-node-es@1.1.0: {} + detect-node@2.1.0: {} detect-port-alt@1.1.6: @@ -10773,6 +11364,8 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-nonce@1.0.1: {} + get-own-enumerable-property-symbols@3.0.2: {} get-package-type@0.1.0: {} @@ -13143,6 +13736,25 @@ snapshots: react: 17.0.2 react-fast-compare: 3.2.2 + react-remove-scroll-bar@2.3.8(@types/react@17.0.80)(react@17.0.2): + dependencies: + react: 17.0.2 + react-style-singleton: 2.2.3(@types/react@17.0.80)(react@17.0.2) + tslib: 2.6.2 + optionalDependencies: + '@types/react': 17.0.80 + + react-remove-scroll@2.7.0(@types/react@17.0.80)(react@17.0.2): + dependencies: + react: 17.0.2 + react-remove-scroll-bar: 2.3.8(@types/react@17.0.80)(react@17.0.2) + react-style-singleton: 2.2.3(@types/react@17.0.80)(react@17.0.2) + tslib: 2.6.2 + use-callback-ref: 1.3.3(@types/react@17.0.80)(react@17.0.2) + use-sidecar: 1.1.3(@types/react@17.0.80)(react@17.0.2) + optionalDependencies: + '@types/react': 17.0.80 + react-rewards@2.0.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2): dependencies: react: 17.0.2 @@ -13186,6 +13798,14 @@ snapshots: transitivePeerDependencies: - supports-color + react-style-singleton@2.2.3(@types/react@17.0.80)(react@17.0.2): + dependencies: + get-nonce: 1.0.1 + react: 17.0.2 + tslib: 2.6.2 + optionalDependencies: + '@types/react': 17.0.80 + react-textarea-autosize@8.5.3(@types/react@17.0.80)(react@17.0.2): dependencies: '@babel/runtime': 7.24.5 @@ -13863,6 +14483,12 @@ snapshots: tabbable@6.2.0: {} + tailwind-merge@2.6.0: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.3): + dependencies: + tailwindcss: 3.4.3 + tailwindcss@3.4.3: dependencies: '@alloc/quick-lru': 5.2.0 @@ -14193,6 +14819,13 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 + use-callback-ref@1.3.3(@types/react@17.0.80)(react@17.0.2): + dependencies: + react: 17.0.2 + tslib: 2.6.2 + optionalDependencies: + '@types/react': 17.0.80 + use-composed-ref@1.3.0(react@17.0.2): dependencies: react: 17.0.2 @@ -14210,6 +14843,14 @@ snapshots: optionalDependencies: '@types/react': 17.0.80 + use-sidecar@1.1.3(@types/react@17.0.80)(react@17.0.2): + dependencies: + detect-node-es: 1.1.0 + react: 17.0.2 + tslib: 2.6.2 + optionalDependencies: + '@types/react': 17.0.80 + use-sync-external-store@1.2.2(react@17.0.2): dependencies: react: 17.0.2 diff --git a/documentation/src/pages/ai/index.tsx b/documentation/src/pages/ai/index.tsx index 9362ed20dc641..0d5f5bde119d6 100644 --- a/documentation/src/pages/ai/index.tsx +++ b/documentation/src/pages/ai/index.tsx @@ -8,6 +8,8 @@ import { AiLandingManageWithEaseScaleWithConfidence } from "@site/src/refine-the import { JoinWaitlist } from "@site/src/refine-theme/ai-landing-join-the-waitlist-cta"; import { AiLandingHero } from "@site/src/refine-theme/ai-landing-hero"; import { StepList } from "@site/src/refine-theme/ai-landing-step-list"; +import { AiPricingCards } from "@site/src/refine-theme/ai-pricing-cards"; +import { AiFaq } from "@site/src/refine-theme/ai-faq"; const title = "Refine AI"; @@ -47,7 +49,8 @@ const RefineAIPage = () => { - + +
diff --git a/documentation/src/refine-theme/ai-faq.tsx b/documentation/src/refine-theme/ai-faq.tsx new file mode 100644 index 0000000000000..d2f6593ac399e --- /dev/null +++ b/documentation/src/refine-theme/ai-faq.tsx @@ -0,0 +1,187 @@ +import React, { useState } from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import { clsx } from "clsx"; +import { MinusRectangle } from "./icons/minus-rectangle"; +import { PlusRectangle } from "./icons/plus-rectangle"; + +type AiFaqProps = { + className?: string; +}; + +export const AiFaq = ({ className }: AiFaqProps) => { + return ( +
+

+ Frequently asked questions +

+
+ {faqData.map((item) => ( + + ))} +
+
+ ); +}; + +type AccordionItemProps = { + question: React.ReactNode; + answer: React.ReactNode; +}; + +const AccordionItem: React.FC = ({ question, answer }) => { + const [isOpen, setIsOpen] = useState(false); + + return ( +
+ + + {isOpen && ( + +
+
+

+ {answer} +

+
+ + )} + +
+ ); +}; + +const faqData = [ + { + question: "What are credits?", + answer: + "Credits are the usage units you spend when generating code, previewing output, or using any other feature in Refine AI. Every paid plan refills a fixed number of credits at the start of each billing month.", + }, + { + question: "How many real tokens does one credit equal?", + answer: + "We don’t tie credits to a strict number of model tokens, as usage depends on factors like prompt complexity, generation type, and model efficiency. Behind the scenes, we continuously optimize our infrastructure to help you get more value from every credit — no need to worry about token math.", + }, + { + question: "What happens when I run out of credits?", + answer: + "You can still view and edit the code you’ve already generated, but new AI actions pause until the next refill. Need to keep building right away? Upgrade your plan—credits and billing cycle refresh instantly.", + }, + { + question: "Can I upgrade my plan at any time?", + answer: + "Yes — upgrades take effect immediately. You’ll receive additional credits right away.", + }, + { + question: "What happens when I downgrade?", + answer: ( +
+

+ Downgrades take effect at the start of your next billing cycle. You’ll + remain on your current tier until then. +

+

+ Example: You’re on $40 / 3 + K-tokens with 800 tokens left. You downgrade to $20 / 1.5 K-tokens. + You can still use the remaining 800 tokens this month; on your next + billing date your bucket resets to 1 500 tokens. +

+
+ ), + }, + { + question: "Will I lose unused credits when I change plans?", + answer: + "If you upgrade, your balance is topped-up to the full allowance of the new plan right away. Example: You’re on the $20 / 1.5 K-token plan and have 600 tokens left. Mid-month you upgrade to $40 / 3 K-tokens. Your bucket is immediately refilled to 3 000 tokens for the rest of the current cycle.", + }, + { + question: "Do unused credits roll over month-to-month?", + answer: + "No — credits reset each month unless you’re on an Enterprise plan with a custom rollover agreement.", + }, + { + question: "Can I buy extra credits without upgrading?", + answer: + "No — we don’t offer one-time credit top-ups. If you need more credits before your next renewal, you can upgrade your plan at any time. Upgrades apply immediately and include a fresh set of monthly credits.", + }, + { + question: "Can I cancel at any time?", + answer: + "Yes — you can cancel anytime from your billing settings. Your current plan will remain active until the end of your billing cycle.", + }, +]; diff --git a/documentation/src/refine-theme/ai-landing-hero.tsx b/documentation/src/refine-theme/ai-landing-hero.tsx index b264689a3fdae..79921fd2ff60a 100644 --- a/documentation/src/refine-theme/ai-landing-hero.tsx +++ b/documentation/src/refine-theme/ai-landing-hero.tsx @@ -2,6 +2,7 @@ import { useColorMode } from "@docusaurus/theme-common"; import clsx from "clsx"; import React from "react"; import { JoinWaitlist } from "./ai-landing-join-the-waitlist-cta"; +import BrowserOnly from "@docusaurus/BrowserOnly"; export const AiLandingHero = ({ className, @@ -10,9 +11,6 @@ export const AiLandingHero = ({ className?: string; contentClassName?: string; }) => { - const { colorMode } = useColorMode(); - const isDarkTheme = colorMode === "dark"; - return (
- AI Coding agents + Instant React Dashboards
-
for building internal software.
+
straight from your APIs.

- The next-gen approach to build enterprise-ready React-based internal - tools, admin panels, dashboards & B2B apps with the power of GenAI. + Powered by AI, secure by default and fully React. Export or deploy + whenever you’re ready.

- + {() =>
); }; + +const Video = () => { + const { colorMode } = useColorMode(); + const isDarkTheme = colorMode === "dark"; + + return ( + + ); +}; diff --git a/documentation/src/refine-theme/ai-landing-manage-with-ease-scale-with-confidence.tsx b/documentation/src/refine-theme/ai-landing-manage-with-ease-scale-with-confidence.tsx index 9a67b885e387c..f75c490135d22 100644 --- a/documentation/src/refine-theme/ai-landing-manage-with-ease-scale-with-confidence.tsx +++ b/documentation/src/refine-theme/ai-landing-manage-with-ease-scale-with-confidence.tsx @@ -20,7 +20,7 @@ export const AiLandingManageWithEaseScaleWithConfidence = ({ "landing-sm:leading-10", "tracking-tight", "text-start", - "pl-4 landing-sm:pl-0", + "pl-4 landing-sm:pl-10", "dark:text-gray-0 text-gray-900", )} > @@ -42,7 +42,10 @@ export const AiLandingManageWithEaseScaleWithConfidence = ({ "text-refine-indigo drop-shadow-[0_0_30px_rgba(51,51,255,0.55)]", )} > - confidence + + confidence + . + diff --git a/documentation/src/refine-theme/ai-landing-step-info.tsx b/documentation/src/refine-theme/ai-landing-step-info.tsx index f7a079deb7d01..0750fbeac5e44 100644 --- a/documentation/src/refine-theme/ai-landing-step-info.tsx +++ b/documentation/src/refine-theme/ai-landing-step-info.tsx @@ -22,7 +22,7 @@ export const AiLandingStepInfo = ({ "landing-sm:flex-row", "gap-4", "landing-sm:gap-6", - "pl-4 landing-sm:pl-0", + "pl-4 landing-sm:pl-10", "w-full", "landing-lg:w-[548px]", "landing-sm:min-h-[220px]", diff --git a/documentation/src/refine-theme/ai-landing-step-list.tsx b/documentation/src/refine-theme/ai-landing-step-list.tsx index e39425b6040d4..2b92bd655bad2 100644 --- a/documentation/src/refine-theme/ai-landing-step-list.tsx +++ b/documentation/src/refine-theme/ai-landing-step-list.tsx @@ -14,19 +14,22 @@ export const StepList = ({ className }: { className?: string }) => { "text-2xl", "font-semibold", "landing-sm:text-[32px] landing-sm:leading-[40px]", - "pl-4 landing-sm:pl-0", + "pl-4 landing-sm:pl-10", )} > Seamless workflow,{" "} - - step by step. + + + step by step + . +
{ + return ( +
+
+

+ Select your plan and{" "} + + get started + . + +

+
+
+ + + +
+
+
+ ); +}; + +const PricingCardStarter = () => { + const starterPlan = { + planKey: "starter", + name: "Starter", + description: "Get hands-on with the fundamentals.", + features: ["Core features for exploration", "Preview your builds"], + refineTokenCount: 150, + monthlyPriceCents: 0, + }; + + return ( +
+
+
+

+ {starterPlan?.name} +

+
+ +
+

+ {starterPlan?.description} +

+
+
+ +
+ +
+ +
+ + {new Intl.NumberFormat().format(starterPlan?.refineTokenCount || 0)} + + credits + / + month +
+ +
+

FREE

+
+ + + +
+ +
+ +
+ {starterPlan?.features?.map((feature, i) => ( +
+ {feature} +
{feature}
+
+ ))} +
+
+ ); +}; + +const PricingCardPro = () => { + const proPlans = [ + { + planKey: "pro", + name: "Pro", + description: "Full power for production-grade development.", + features: [ + "Interactive code editor", + "One-Click Export", + "Hosting with Netlify", + "Attach files, specs, or artefacts", + ], + refineTokenCount: 1500, + monthlyPriceCents: 2000, + }, + { + planKey: "pro_3k", + name: "Pro 3K", + description: "Full power for production-grade development.", + features: [ + "Interactive code editor", + "One-Click Export & Hosting with Netlify", + "Attach files, specs, or artefacts", + ], + sortKey: 2, + refineTokenCount: 3000, + monthlyPriceCents: 4000, + }, + { + planKey: "pro_6k", + name: "Pro 6K", + description: "Full power for production-grade development.", + tier: "pro", + features: [ + "Interactive code editor", + "One-Click Export & Hosting with Netlify", + "Attach files, specs, or artefacts", + ], + sortKey: 3, + refineTokenCount: 6000, + monthlyPriceCents: 8000, + }, + { + planKey: "pro_9k", + name: "Pro 9K", + description: "Full power for production-grade development.", + tier: "pro", + features: [ + "Interactive code editor", + "One-Click Export & Hosting with Netlify", + "Attach files, specs, or artefacts", + ], + sortKey: 4, + refineTokenCount: 9000, + monthlyPriceCents: 12000, + }, + { + planKey: "pro_15k", + name: "Pro 15K", + description: "Full power for production-grade development.", + tier: "pro", + features: [ + "Interactive code editor", + "One-Click Export & Hosting with Netlify", + "Attach files, specs, or artefacts", + ], + sortKey: 5, + refineTokenCount: 15000, + monthlyPriceCents: 20000, + }, + { + planKey: "pro_20k", + name: "Pro 20K", + description: "Full power for production-grade development.", + tier: "pro", + features: [ + "Interactive code editor", + "One-Click Export & Hosting with Netlify", + "Attach files, specs, or artefacts", + ], + sortKey: 6, + refineTokenCount: 20000, + monthlyPriceCents: 26600, + }, + { + planKey: "pro_40k", + name: "Pro 40K", + description: "Full power for production-grade development.", + tier: "pro", + features: [ + "Interactive code editor", + "One-Click Export & Hosting with Netlify", + "Attach files, specs, or artefacts", + ], + sortKey: 7, + refineTokenCount: 40000, + monthlyPriceCents: 53300, + }, + ]; + + const [selectedTierKey, setSelectedTierKey] = useState( + proPlans.at(0)?.planKey ?? null, + ); + const selectedTier = proPlans.find( + (plan) => plan.planKey === selectedTierKey, + ); + + const tierOptions = proPlans.map((plan) => ({ + label: `${new Intl.NumberFormat().format( + plan.refineTokenCount, + )} credits / month`, + value: plan.planKey, + })); + + const handleOnPlanClick = async () => { + console.log("handleOnPlanClick"); + }; + + return ( +
+
+
+

+ {proPlans[0]?.name} +

+ +
+ +
+

+ {selectedTier?.description} +

+
+
+ +
+ +
+ + + +
+

+ + {new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + minimumFractionDigits: 2, + }).format((selectedTier?.monthlyPriceCents ?? 0) / 100)} + + / + month +

+
+ +
+ + + +
+ +
+ +
+ +
+ {selectedTier?.features?.map((feature, i) => ( +
+ {feature} +
{feature}
+
+ ))} +
+
+ ); +}; + +const PricingCardEnterprise = () => { + const features = useMemo(() => { + return [ + "Custom terms and volume pricing", + "Dedicated support team", + "SSO (Single Sign-On)", + "Option to opt out of data training", + "Private Slack channel with direct access", + ]; + }, []); + + const handleOnPlanClick = () => { + window.open("mailto:info@refine.dev", "_blank"); + }; + + return ( +
+
+
+

+ Enterprise +

+
+ +
+

+ Custom solutions for large-scale teams. +

+
+
+ +
+ +
+ +

+ Designed for teams building at scale or with specialized needs. + Enterprise offers tailored solutions with advanced security, support, + and control options. +

+ +
+ +
+ +
+ +
+ +
+ {features?.map((feature, i) => ( +
+ {feature} +
{feature}
+
+ ))} +
+
+ ); +}; + +const SubscribeButton = ({ + onClick, + buttonText, + className, +}: { + onClick: undefined | (() => void); + buttonText: string; + className?: ClassValue; +}) => { + return ( + + ); +}; + +const MostPopularBadge = () => { + const [isMounted, setIsMounted] = useState(false); + + const { colorMode } = useColorMode(); + + useEffect(() => { + setIsMounted(true); + }, []); + + if (!isMounted) return null; + + return ( +
+ Most Popular +
+ ); +}; diff --git a/documentation/src/refine-theme/icons/minus-rectangle.tsx b/documentation/src/refine-theme/icons/minus-rectangle.tsx new file mode 100644 index 0000000000000..369231c8f8a30 --- /dev/null +++ b/documentation/src/refine-theme/icons/minus-rectangle.tsx @@ -0,0 +1,26 @@ +import * as React from "react"; +import type { SVGProps } from "react"; + +export const MinusRectangle = (props: SVGProps) => ( + + + + +); diff --git a/documentation/src/refine-theme/icons/plus-rectangle.tsx b/documentation/src/refine-theme/icons/plus-rectangle.tsx new file mode 100644 index 0000000000000..5a2000b803b54 --- /dev/null +++ b/documentation/src/refine-theme/icons/plus-rectangle.tsx @@ -0,0 +1,25 @@ +import * as React from "react"; +import type { SVGProps } from "react"; + +export const PlusRectangle = (props: SVGProps) => ( + + + + +); diff --git a/documentation/src/refine-theme/shadcn/select.tsx b/documentation/src/refine-theme/shadcn/select.tsx new file mode 100644 index 0000000000000..f401e0a912271 --- /dev/null +++ b/documentation/src/refine-theme/shadcn/select.tsx @@ -0,0 +1,184 @@ +"use client"; + +import * as React from "react"; +import { + CheckIcon, + ChevronDownIcon, + ChevronUpIcon, +} from "@radix-ui/react-icons"; +import * as SelectPrimitive from "@radix-ui/react-select"; + +import { cn } from "./utils"; + +const Select = ({ + ...props +}: React.ComponentProps) => { + return ; +}; + +const SelectGroup = SelectPrimitive.Group; + +const SelectValue = SelectPrimitive.Value; + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => { + return ( + span]:line-clamp-1 [&>span]:w-full", + className, + )} + {...props} + > + {children} + + + + + ); +}); +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName; + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName; + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)); +SelectContent.displayName = SelectPrimitive.Content.displayName; + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectLabel.displayName = SelectPrimitive.Label.displayName; + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +SelectItem.displayName = SelectPrimitive.Item.displayName; + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectSeparator.displayName = SelectPrimitive.Separator.displayName; + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +}; diff --git a/documentation/src/refine-theme/shadcn/separator.tsx b/documentation/src/refine-theme/shadcn/separator.tsx new file mode 100644 index 0000000000000..ecef45d386a37 --- /dev/null +++ b/documentation/src/refine-theme/shadcn/separator.tsx @@ -0,0 +1,31 @@ +"use client"; + +import * as React from "react"; +import * as SeparatorPrimitive from "@radix-ui/react-separator"; + +import { cn } from "./utils"; + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref, + ) => ( + + ), +); +Separator.displayName = SeparatorPrimitive.Root.displayName; + +export { Separator }; diff --git a/documentation/src/refine-theme/shadcn/utils.ts b/documentation/src/refine-theme/shadcn/utils.ts new file mode 100644 index 0000000000000..365058cebd7d2 --- /dev/null +++ b/documentation/src/refine-theme/shadcn/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/documentation/static/assets/most-popular-badge-dark.png b/documentation/static/assets/most-popular-badge-dark.png new file mode 100644 index 0000000000000..3bd9b5be32d6f Binary files /dev/null and b/documentation/static/assets/most-popular-badge-dark.png differ diff --git a/documentation/static/assets/most-popular-badge-light.png b/documentation/static/assets/most-popular-badge-light.png new file mode 100644 index 0000000000000..9974cff8c0c2b Binary files /dev/null and b/documentation/static/assets/most-popular-badge-light.png differ diff --git a/documentation/static/assets/pricing-card-checkmark-blue.png b/documentation/static/assets/pricing-card-checkmark-blue.png new file mode 100644 index 0000000000000..7f5288f4fa2cf Binary files /dev/null and b/documentation/static/assets/pricing-card-checkmark-blue.png differ diff --git a/documentation/static/assets/pricing-card-checkmark-green.png b/documentation/static/assets/pricing-card-checkmark-green.png new file mode 100644 index 0000000000000..728e6d75de840 Binary files /dev/null and b/documentation/static/assets/pricing-card-checkmark-green.png differ diff --git a/documentation/static/assets/pricing-card-checkmark-purple.png b/documentation/static/assets/pricing-card-checkmark-purple.png new file mode 100644 index 0000000000000..ac45fd1802c12 Binary files /dev/null and b/documentation/static/assets/pricing-card-checkmark-purple.png differ diff --git a/documentation/tailwind.config.js b/documentation/tailwind.config.js index 6b499eed0660e..1c4a0ec067b8a 100644 --- a/documentation/tailwind.config.js +++ b/documentation/tailwind.config.js @@ -176,7 +176,12 @@ module.exports = { backdropBlur: { "header-blur": "12px", }, + backgroundImage: { + "pricing-card-pro-dark": + "radial-gradient(100% 124.29% at 100% 0%, rgba(8, 126, 164, 0.5) 0%, rgba(35, 39, 47, 0) 50%) ,radial-gradient(100% 124.29% at 0% 100%, rgba(8, 126, 164, 0.25) 0%, rgba(35, 39, 47, 0) 50%)", + "pricing-card-pro-light": + "radial-gradient(146.45% 100% at 100% 100%, rgba(255, 255, 255, 0) 0%, rgba(88, 196, 220, 0.125) 50%, rgba(255, 255, 255, 0) 100%)", "landing-noise": [ "url(https://refine.ams3.cdn.digitaloceanspaces.com/website/static/assets/landing-noise.webp)", ], @@ -973,6 +978,7 @@ module.exports = { }, plugins: [ require("@tailwindcss/typography"), + require("tailwindcss-animate"), plugin(({ addVariant }) => { addVariant("light", `[data-theme="light"] &`); }),