diff --git a/README.md b/README.md index e79b61e..e4547c4 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ Welcome to the Brand SDK Apps Code Samples repository! Here, you'll find a serie - [**Secure Third-Party Request**](https://github.com/Frontify/sdk-apps-code-examples/tree/main/examples/secure-third-party-request){:target="_blank"}: A sample app that demonstrates how to securely request third-party services using our SDK. - [**App with user state example**](https://github.com/Frontify/sdk-apps-code-examples/tree/main/examples/app-with-state){:target="_blank"}: A sample app that demonstrates how to use the userState. - [**App Settings Example**](https://github.com/Frontify/sdk-apps-code-examples/tree/main/examples/app-settings){:target="_blank"}: A simple example of a Hello World app using `settings.ts` to customize app behavior. +- [**Bulk Action Surface**](https://github.com/Frontify/sdk-apps-code-examples/tree/main/examples/bulk-actions-app){:target="_blank"}: An App that shows how the Bulk Actions Surface can be used. Each example is accompanied by detailed documentation and comments within the code to help you understand how to utilize our SDK effectively. Whether you're just getting started or looking to implement specific features, these samples will guide you through the process. diff --git a/examples/bulk-actions-app/.gitignore b/examples/bulk-actions-app/.gitignore new file mode 100644 index 0000000..ea6ad68 --- /dev/null +++ b/examples/bulk-actions-app/.gitignore @@ -0,0 +1,25 @@ + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.localdist +.idea +.vscode + +# Editor directories and files +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.secret.json diff --git a/examples/bulk-actions-app/.prettierrc b/examples/bulk-actions-app/.prettierrc new file mode 100644 index 0000000..ca0c14e --- /dev/null +++ b/examples/bulk-actions-app/.prettierrc @@ -0,0 +1,5 @@ +{ + "printWidth": 120, + "tabWidth": 4, + "singleQuote": true +} diff --git a/examples/bulk-actions-app/.secret-example.json b/examples/bulk-actions-app/.secret-example.json new file mode 100644 index 0000000..d5e413d --- /dev/null +++ b/examples/bulk-actions-app/.secret-example.json @@ -0,0 +1,4 @@ +{ + "THIRD_PARTY_API_KEY": 1, + "__DONT_COMMIT_THIS_FILE_WITH_TOKENS__": true +} diff --git a/examples/bulk-actions-app/README.md b/examples/bulk-actions-app/README.md new file mode 100644 index 0000000..348477f --- /dev/null +++ b/examples/bulk-actions-app/README.md @@ -0,0 +1,42 @@ +# Hello World +This is a basic example of an App using the Bulk actions Surface. +## Information + +This app is the basic example to get you started with our platform. Even though it's simple, it comes pre-configured with our platform fonts, design system components, and styles. This ensures that you have a consistent look and feel across the application, adhering to our design standards right from the start. + +- **Platform Fonts:** The app is set up to use our standard fonts, ensuring typography consistency. +- **Design System Components and Styles:** The app includes [Fondue](https://fondue-components.frontify.com/), Frontify design system, making it easy to build complex UIs with a unified design language. + +For more details on how to customize and extend this app, please refer to the [documentation](https://developer.frontify.com/). + +### Requirements: + +- Node 20 +- Access to a Frontify Instance. + +### Setup +1. Install the dependencies + ``` + npm install + ``` + Or + ``` + pnpm install + ``` +2. Serve the app + ``` + npm run serve + ``` + Or + ``` + pnpm serve + ``` +3. Go to your Frontify Instance + +## Manifest Configuration + +The `manifest.json` file is a crucial part of your app setup. It allows your app to control where it surfaces within the platform. Your app can appear in various location, this app for example is only visible for the asset Bulk Actions. + +Additionally, the `manifest.json` file enables you to specify the types of files your app can work with formats like jpg, png, and more. + +For detailed information on configuring the `manifest.json` file, please refer to our [documentation](https://developer.frontify.com/). diff --git a/examples/bulk-actions-app/eslint.config.js b/examples/bulk-actions-app/eslint.config.js new file mode 100644 index 0000000..9d1c0c6 --- /dev/null +++ b/examples/bulk-actions-app/eslint.config.js @@ -0,0 +1,28 @@ +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + { ignores: ["dist"] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ["**/*.{ts,tsx}"], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + "react-hooks": reactHooks, + "react-refresh": reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + }, + } +); diff --git a/examples/bulk-actions-app/index.html b/examples/bulk-actions-app/index.html new file mode 100644 index 0000000..8c69fd7 --- /dev/null +++ b/examples/bulk-actions-app/index.html @@ -0,0 +1,17 @@ + + + + + + Frontify Sample App + + +
+ + + diff --git a/examples/bulk-actions-app/manifest.json b/examples/bulk-actions-app/manifest.json new file mode 100644 index 0000000..4de49bc --- /dev/null +++ b/examples/bulk-actions-app/manifest.json @@ -0,0 +1,658 @@ +{ + "appId": "", + "appType": "platform-app", + "name": "template-platform-app-tailwind", + "metadata": { + "version": 1 + }, + "permissions": { + "scopes": ["basic:read", "basic:write"] + }, + "surfaces": { + "mediaLibrary": { + "assetBulkActions": { + "title": "Bulk Rename Assets", + "filenameExtensions": [ + "aac", + "ac3", + "ai", + "aif", + "aifc", + "aiff", + "artboard", + "asc", + "atom", + "au", + "avi", + "bcpio", + "bin", + "bmp", + "cdf", + "cgm", + "class", + "cpio", + "cpt", + "csh", + "css", + "dcr", + "dif", + "dir", + "djv", + "djvu", + "dll", + "dms", + "dng", + "doc", + "docx", + "dotx", + "docm", + "dotm", + "dtd", + "dv", + "dvi", + "dxr", + "eps", + "etx", + "ez", + "flac", + "flv", + "gif", + "gram", + "grxml", + "gtar", + "hdf", + "heif", + "hqx", + "htm", + "html", + "ice", + "ico", + "ics", + "idml", + "ief", + "ifb", + "iges", + "igs", + "indd", + "indt", + "jnlp", + "jp2", + "jpe", + "jpeg", + "jpg", + "js", + "kar", + "latex", + "lha", + "lzh", + "m3u", + "m4a", + "m4b", + "m4p", + "m4r", + "m4u", + "m4v", + "mac", + "man", + "mathml", + "me", + "mesh", + "mid", + "midi", + "mif", + "mkv", + "mov", + "movie", + "mp2", + "mp3", + "mp4", + "mpe", + "mpeg", + "mpg", + "mpga", + "ms", + "msh", + "mts", + "mxu", + "nc", + "oda", + "ogg", + "pbm", + "pct", + "pdb", + "pdf", + "pgm", + "pgn", + "pic", + "pict", + "png", + "pnm", + "pnt", + "pntg", + "ppm", + "ppt", + "pptx", + "potx", + "ppsx", + "ppam", + "pptm", + "potm", + "ppsm", + "ps", + "psd", + "qt", + "qti", + "qtif", + "ra", + "ram", + "ras", + "rdf", + "rgb", + "rm", + "roff", + "rtf", + "rtx", + "sgm", + "sgml", + "shar", + "silo", + "sit", + "skd", + "sketch", + "skm", + "skp", + "skt", + "smi", + "smil", + "snd", + "so", + "spl", + "src", + "sv4cpio", + "sv4crc", + "svg", + "swf", + "t", + "tar", + "tcl", + "tex", + "texi", + "texinfo", + "tif", + "tiff", + "tr", + "tsv", + "txt", + "ustar", + "vcd", + "vrml", + "vxml", + "wav", + "wbmp", + "wbmxl", + "webm", + "webp", + "wml", + "wmlc", + "wmls", + "wmlsc", + "wmv", + "wrl", + "xbm", + "xht", + "xhtml", + "xls", + "xml", + "xpm", + "xsl", + "xlsx", + "xltx", + "xlsm", + "xltm", + "xlam", + "xlsb", + "xslt", + "xul", + "xwd", + "xyz", + "zip", + "tpl" + ] + } + }, + "iconLibrary": { + "assetBulkActions": { + "title": "Bulk Rename Assets", + "filenameExtensions": ["svg"] + } + }, + "logoLibrary": { + "assetBulkActions": { + "title": "Bulk Rename Assets", + "filenameExtensions": ["svg", "jpg", "jpeg", "ai", "eps", "png", "tif", "tiff"] + } + }, + "documentLibrary": { + "assetBulkActions": { + "title": "Bulk Rename Assets", + "filenameExtensions": [ + "aac", + "ac3", + "ai", + "aif", + "aifc", + "aiff", + "artboard", + "asc", + "atom", + "au", + "avi", + "bcpio", + "bin", + "bmp", + "cdf", + "cgm", + "class", + "cpio", + "cpt", + "csh", + "css", + "dcr", + "dif", + "dir", + "djv", + "djvu", + "dll", + "dms", + "dng", + "doc", + "docx", + "dotx", + "docm", + "dotm", + "dtd", + "dv", + "dvi", + "dxr", + "eps", + "etx", + "ez", + "flac", + "flv", + "gif", + "gram", + "grxml", + "gtar", + "hdf", + "heif", + "hqx", + "htm", + "html", + "ice", + "ico", + "ics", + "idml", + "ief", + "ifb", + "iges", + "igs", + "indd", + "indt", + "jnlp", + "jp2", + "jpe", + "jpeg", + "jpg", + "js", + "kar", + "latex", + "lha", + "lzh", + "m3u", + "m4a", + "m4b", + "m4p", + "m4r", + "m4u", + "m4v", + "mac", + "man", + "mathml", + "me", + "mesh", + "mid", + "midi", + "mif", + "mkv", + "mov", + "movie", + "mp2", + "mp3", + "mp4", + "mpe", + "mpeg", + "mpg", + "mpga", + "ms", + "msh", + "mts", + "mxu", + "nc", + "oda", + "ogg", + "pbm", + "pct", + "pdb", + "pdf", + "pgm", + "pgn", + "pic", + "pict", + "png", + "pnm", + "pnt", + "pntg", + "ppm", + "ppt", + "pptx", + "potx", + "ppsx", + "ppam", + "pptm", + "potm", + "ppsm", + "ps", + "psd", + "qt", + "qti", + "qtif", + "ra", + "ram", + "ras", + "rdf", + "rgb", + "rm", + "roff", + "rtf", + "rtx", + "sgm", + "sgml", + "shar", + "silo", + "sit", + "skd", + "sketch", + "skm", + "skp", + "skt", + "smi", + "smil", + "snd", + "so", + "spl", + "src", + "sv4cpio", + "sv4crc", + "svg", + "swf", + "t", + "tar", + "tcl", + "tex", + "texi", + "texinfo", + "tif", + "tiff", + "tr", + "tsv", + "txt", + "ustar", + "vcd", + "vrml", + "vxml", + "wav", + "wbmp", + "wbmxl", + "webm", + "webp", + "wml", + "wmlc", + "wmls", + "wmlsc", + "wmv", + "wrl", + "xbm", + "xht", + "xhtml", + "xls", + "xml", + "xpm", + "xsl", + "xlsx", + "xltx", + "xlsm", + "xltm", + "xlam", + "xlsb", + "xslt", + "xul", + "xwd", + "xyz", + "zip", + "tpl" + ] + } + }, + "workspace": { + "assetBulkActions": { + "title": "Bulk Rename Assets", + "filenameExtensions": [ + "aac", + "ac3", + "ai", + "aif", + "aifc", + "aiff", + "artboard", + "asc", + "atom", + "au", + "avi", + "bcpio", + "bin", + "bmp", + "cdf", + "cgm", + "class", + "cpio", + "cpt", + "csh", + "css", + "dcr", + "dif", + "dir", + "djv", + "djvu", + "dll", + "dms", + "dng", + "doc", + "docx", + "dotx", + "docm", + "dotm", + "dtd", + "dv", + "dvi", + "dxr", + "eps", + "etx", + "ez", + "flac", + "flv", + "gif", + "gram", + "grxml", + "gtar", + "hdf", + "heif", + "hqx", + "htm", + "html", + "ice", + "ico", + "ics", + "idml", + "ief", + "ifb", + "iges", + "igs", + "indd", + "indt", + "jnlp", + "jp2", + "jpe", + "jpeg", + "jpg", + "js", + "kar", + "latex", + "lha", + "lzh", + "m3u", + "m4a", + "m4b", + "m4p", + "m4r", + "m4u", + "m4v", + "mac", + "man", + "mathml", + "me", + "mesh", + "mid", + "midi", + "mif", + "mkv", + "mov", + "movie", + "mp2", + "mp3", + "mp4", + "mpe", + "mpeg", + "mpg", + "mpga", + "ms", + "msh", + "mts", + "mxu", + "nc", + "oda", + "ogg", + "pbm", + "pct", + "pdb", + "pdf", + "pgm", + "pgn", + "pic", + "pict", + "png", + "pnm", + "pnt", + "pntg", + "ppm", + "ppt", + "pptx", + "potx", + "ppsx", + "ppam", + "pptm", + "potm", + "ppsm", + "ps", + "psd", + "qt", + "qti", + "qtif", + "ra", + "ram", + "ras", + "rdf", + "rgb", + "rm", + "roff", + "rtf", + "rtx", + "sgm", + "sgml", + "shar", + "silo", + "sit", + "skd", + "sketch", + "skm", + "skp", + "skt", + "smi", + "smil", + "snd", + "so", + "spl", + "src", + "sv4cpio", + "sv4crc", + "svg", + "swf", + "t", + "tar", + "tcl", + "tex", + "texi", + "texinfo", + "tif", + "tiff", + "tr", + "tsv", + "txt", + "ustar", + "vcd", + "vrml", + "vxml", + "wav", + "wbmp", + "wbmxl", + "webm", + "webp", + "wml", + "wmlc", + "wmls", + "wmlsc", + "wmv", + "wrl", + "xbm", + "xht", + "xhtml", + "xls", + "xml", + "xpm", + "xsl", + "xlsx", + "xltx", + "xlsm", + "xltm", + "xlam", + "xlsb", + "xslt", + "xul", + "xwd", + "xyz", + "zip", + "tpl" + ] + } + } + } +} diff --git a/examples/bulk-actions-app/package.json b/examples/bulk-actions-app/package.json new file mode 100644 index 0000000..1333659 --- /dev/null +++ b/examples/bulk-actions-app/package.json @@ -0,0 +1,36 @@ +{ + "name": "bulk-actions-app", + "type": "module", + "version": "1.0.0", + "scripts": { + "serve": "frontify-cli serve", + "login": "frontify-cli login", + "deploy": "frontify-cli deploy", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@frontify/app-bridge-app": "^0.1.2", + "@frontify/fondue": "^12.2.16", + "@frontify/platform-app": "^0.1.11", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@eslint/js": "^9.9.0", + "@frontify/frontify-cli": "^5.7.8", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "autoprefixer": "^10.4.19", + "eslint": "^9.9.0", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.11", + "globals": "^15.9.0", + "postcss": "^8.4.38", + "prettier": "^3.2.5", + "tailwindcss": "^3.4.3", + "typescript": "^5.6.0", + "typescript-eslint": "^8.5.0" + } +} diff --git a/examples/bulk-actions-app/postcss.config.cjs b/examples/bulk-actions-app/postcss.config.cjs new file mode 100644 index 0000000..67cdf1a --- /dev/null +++ b/examples/bulk-actions-app/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/examples/bulk-actions-app/src/App.tsx b/examples/bulk-actions-app/src/App.tsx new file mode 100644 index 0000000..624efba --- /dev/null +++ b/examples/bulk-actions-app/src/App.tsx @@ -0,0 +1,237 @@ +import { AppBridgePlatformApp } from '@frontify/app-bridge-app'; +import { Heading, Stack, Text, TextInput } from '@frontify/fondue'; +import { Button, ScrollArea } from '@frontify/fondue/components'; +import { IconTypographyMultiple } from '@frontify/fondue/icons'; +import { useEffect, useMemo, useState } from 'react'; +import { getAssetsByIds, updateAssetTitle } from './helpers/graphql'; + +const highlightMatches = (filename: string, query: string, matchCase: boolean) => { + if (!query) { + return { highlightedText: filename, matchCount: 0 }; + } + + const parts = filename.split(new RegExp(`(${query})`, matchCase ? 'i' : 'gi')); + const matchCount = parts.filter((part) => { + return matchCase ? part === query : part.toLowerCase() === query.toLowerCase(); + }).length; + const highlightedText = parts.map((part, index) => { + if (matchCase ? part === query : part.toLowerCase() === query.toLowerCase()) { + return ( + + {part} + + ); + } + + return part; + }); + + return { highlightedText, matchCount }; +}; + +const quantify = (noun: 'asset' | 'match', count: number) => { + const plurals = { + asset: 'assets', + match: 'matches', + }; + + return `${count} ${count === 1 ? noun : plurals[noun]}`; +}; + +const getResultCount = (matchCount: number, assetCount: number) => { + if (matchCount === 0) { + return 'No matches'; + } + + return `${quantify('match', matchCount)} in ${quantify('asset', assetCount)}`; +}; + +const chunkArray = (array: string[], size: number) => { + const result = []; + for (let i = 0; i < array.length; i += size) { + result.push(array.slice(i, i + size)); + } + return result; +}; + +type Asset = { id: string; previewUrl: string; title: string; extension: string }; + +export const App = () => { + const appBridge = useMemo(() => new AppBridgePlatformApp(), []); + const context = appBridge.context().get(); + + const [assets, setAssets] = useState([]); + const [findText, setFindText] = useState(''); + const [replaceText, setReplaceText] = useState(''); + const [matchCount, setMatchCount] = useState(0); + const [matchingAssets, setMatchingAssets] = useState([]); + const [renamingInProgress, setRenamingInProgress] = useState(false); + const [progressMessage, setProgressMessage] = useState(''); + const [matchCase, setMatchCase] = useState(false); + + const assetsAreFetched = assets.length > 0; + const matchingAssetCount = matchingAssets.length; + + const handleFindTextChange = (value: string) => { + setProgressMessage(''); + setFindText(value); + }; + + const handleReplaceTextChange = (value: string) => { + setProgressMessage(''); + setReplaceText(value); + }; + + const renameAssets = async () => { + let index = 1; + + setRenamingInProgress(true); + + for (const asset of matchingAssets) { + setProgressMessage(`Renaming ${index} of ${quantify('asset', matchingAssetCount)} ...`); + + const newTitle = asset.title.replace(new RegExp(findText, 'gi'), replaceText); + + try { + const response = await appBridge.api({ + name: 'executeGraphQl', + payload: { + query: updateAssetTitle(asset.id, newTitle), + }, + }); + + asset.title = response.updateAsset.asset.title; + index++; + } catch (error) { + console.error(`Error renaming asset ${asset.id} from ${asset.title} to ${newTitle}`, error); + } + + setAssets(assets); + } + + setRenamingInProgress(false); + setMatchCount(0); + setProgressMessage(`Finished renaming ${quantify('asset', matchingAssetCount)}`); + }; + + useEffect(() => { + const fetchAssets = async () => { + if (context.surface !== 'assetBulkActions') { + return; + } + + const assetIds = context.selection.assets.ids; + const chunks = chunkArray(assetIds, 100); + const allAssets = []; + + for (const chunk of chunks) { + const response = await appBridge.api({ + name: 'executeGraphQl', + payload: { query: getAssetsByIds(chunk) }, + }); + + allAssets.push(...response.assets); + } + + setAssets(allAssets); + }; + + fetchAssets(); + }, [context.selection.assets.ids, appBridge, context.surface]); + + useEffect(() => { + let totalMatchCount = 0; + const matchedAssets: Asset[] = []; + + assets.forEach((asset) => { + const { matchCount } = highlightMatches(asset.title, findText, matchCase); + + if (matchCount > 0) { + matchedAssets.push(asset); + } + + totalMatchCount += matchCount; + }); + + setMatchCount(totalMatchCount); + setMatchingAssets(matchedAssets); + }, [findText, assets, matchCase]); + + return ( +
+ + Bulk Rename Assets + +
+
+
+ { }} + onBlur={() => { }} + extraActions={[ + { + icon: ( + + ), + onClick: () => setMatchCase(!matchCase), + title: 'Extra action A', + tooltip: { + content: `Match Case: ${matchCase ? 'on' : 'off'}`, + withArrow: true, + }, + }, + ]} + /> +
+ {getResultCount(matchCount, matchingAssetCount)} +
+
+
+ { }} + onBlur={() => { }} + /> +
+ +
+
+ {progressMessage} +
+
+ + {assetsAreFetched ? ( +
+ {assets.map((asset) => { + const { highlightedText } = highlightMatches(asset.title, findText, matchCase); + + return ( + + + {highlightedText} + .{asset.extension} + + + ); + })} +
+ ) : ( + + Gathering names of selected assets ... + + )} +
+
+ ); +}; diff --git a/examples/bulk-actions-app/src/helpers/graphql.ts b/examples/bulk-actions-app/src/helpers/graphql.ts new file mode 100644 index 0000000..38ef614 --- /dev/null +++ b/examples/bulk-actions-app/src/helpers/graphql.ts @@ -0,0 +1,27 @@ +export const getAssetsByIds = (assetIds: string[]) => ` + query GetAssetsByIds { + assets(ids: [${assetIds.map((id) => `"${id}"`)}]) { + id + title + ... on Image { + previewUrl + extension + } + } + } +`; + +export const updateAssetTitle = (assetId: string, newTitle: string) => ` + mutation UpdateAssetTitle { + updateAsset(input: {id: "${assetId}", data: {title: "${newTitle}"}}) { + asset { + id + title + ... on Image { + previewUrl + extension + } + } + } + } +`; diff --git a/examples/bulk-actions-app/src/index.ts b/examples/bulk-actions-app/src/index.ts new file mode 100644 index 0000000..3bd760f --- /dev/null +++ b/examples/bulk-actions-app/src/index.ts @@ -0,0 +1,11 @@ +import { defineApp } from '@frontify/platform-app'; + +import { App } from './App'; +import { settings } from './settings'; +import '@frontify/fondue/style'; +import 'tailwindcss/tailwind.css'; + +export default defineApp({ + app: App, + settings, +}); diff --git a/examples/bulk-actions-app/src/settings.ts b/examples/bulk-actions-app/src/settings.ts new file mode 100644 index 0000000..25a335a --- /dev/null +++ b/examples/bulk-actions-app/src/settings.ts @@ -0,0 +1,12 @@ +import { defineSettings } from '@frontify/platform-app'; + +export const settings = defineSettings({ + credentials: [ + { + type: 'input', + id: 'single-line', + label: 'Input field', + defaultValue: 'Input Field Value', + }, + ], +}); diff --git a/examples/bulk-actions-app/src/vite-env.d.ts b/examples/bulk-actions-app/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/examples/bulk-actions-app/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/bulk-actions-app/tailwind.config.ts b/examples/bulk-actions-app/tailwind.config.ts new file mode 100644 index 0000000..bbfd4d5 --- /dev/null +++ b/examples/bulk-actions-app/tailwind.config.ts @@ -0,0 +1,9 @@ +import { type Config } from 'tailwindcss'; + +export default { + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +} satisfies Config; diff --git a/examples/bulk-actions-app/tsconfig.app.json b/examples/bulk-actions-app/tsconfig.app.json new file mode 100644 index 0000000..dd60786 --- /dev/null +++ b/examples/bulk-actions-app/tsconfig.app.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/examples/bulk-actions-app/tsconfig.json b/examples/bulk-actions-app/tsconfig.json new file mode 100644 index 0000000..f6df6c7 --- /dev/null +++ b/examples/bulk-actions-app/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/examples/bulk-actions-app/tsconfig.node.json b/examples/bulk-actions-app/tsconfig.node.json new file mode 100644 index 0000000..82ac547 --- /dev/null +++ b/examples/bulk-actions-app/tsconfig.node.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "exclude": ["src"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e34b6a..daed952 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -130,6 +130,67 @@ importers: specifier: ^8.5.0 version: 8.5.0(eslint@9.10.0(jiti@1.21.0))(typescript@5.6.2) + examples/bulk-actions-app: + dependencies: + '@frontify/app-bridge-app': + specifier: ^0.1.2 + version: 0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@frontify/fondue': + specifier: ^12.2.16 + version: 12.2.16(@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.12.12)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(tailwindcss@3.4.3)(zustand@4.5.2(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1)) + '@frontify/platform-app': + specifier: ^0.1.11 + version: 0.1.11(@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.12.12)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(tailwindcss@3.4.3)(zustand@4.5.2(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1)) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@eslint/js': + specifier: ^9.9.0 + version: 9.10.0 + '@frontify/frontify-cli': + specifier: ^5.7.8 + version: 5.7.8(@types/node@20.12.12)(terser@5.31.0) + '@types/react': + specifier: ^18.3.3 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.45) + eslint: + specifier: ^9.9.0 + version: 9.10.0(jiti@1.21.0) + eslint-plugin-react-hooks: + specifier: ^5.1.0-rc.0 + version: 5.1.0-rc-fb9a90fa48-20240614(eslint@9.10.0(jiti@1.21.0)) + eslint-plugin-react-refresh: + specifier: ^0.4.11 + version: 0.4.11(eslint@9.10.0(jiti@1.21.0)) + globals: + specifier: ^15.9.0 + version: 15.9.0 + postcss: + specifier: ^8.4.38 + version: 8.4.45 + prettier: + specifier: ^3.2.5 + version: 3.2.5 + tailwindcss: + specifier: ^3.4.3 + version: 3.4.3 + typescript: + specifier: ^5.6.0 + version: 5.6.2 + typescript-eslint: + specifier: ^8.5.0 + version: 8.5.0(eslint@9.10.0(jiti@1.21.0))(typescript@5.6.2) + examples/hello-world: dependencies: '@frontify/app-bridge-app': @@ -981,6 +1042,12 @@ packages: react: ^18 react-dom: ^18 + '@frontify/app-bridge-app@0.1.2': + resolution: {integrity: sha512-8HRsQVV1U14yL8Ud6W1xypCfQQlRyjKJwkdKTx4oCIeXq+V30fX7KWlaTBFdJNUBBYLVG0yL8ueI5+lO5lgHIQ==} + peerDependencies: + react: ^18 + react-dom: ^18 + '@frontify/fondue-charts@1.8.14': resolution: {integrity: sha512-ymQdbpwk3BqmdPCtq4WI5TFDA3bQY6rya1o5y6lVTcsuZjQOWOqE3ZgjEWJUsBi8ymTXl6KPtAfSXHZQ1q/Hkw==} engines: {node: '>=18'} @@ -989,6 +1056,14 @@ packages: react: ^18 react-dom: ^18 + '@frontify/fondue-charts@1.8.15': + resolution: {integrity: sha512-dRFn/NYd9BKsECb/eKuOSQdOD2+UTwgtTNIPs5DDSQgljsDr2wPLoYmM0REq4h0SueG0fBmvE0aqJi/rVO0sGQ==} + engines: {node: '>=18'} + peerDependencies: + '@frontify/fondue-tokens': ^3.5.7 + react: ^18 + react-dom: ^18 + '@frontify/fondue-components@3.3.3': resolution: {integrity: sha512-Hyf/60ximskLmufvvyBp8FKsZm1Ii2nYohx7y//yuRPDBqdf8QFUJoFoFruCib3aBcMI0NduWChe2CWnlCmtRQ==} engines: {node: '>=18'} @@ -998,12 +1073,27 @@ packages: react: ^18 react-dom: ^18 + '@frontify/fondue-components@4.0.1': + resolution: {integrity: sha512-sIOeL1purJP2drS8O5o6jwE+my9qWQv+33ITRs0NKMRFXm4QbdUGELuAlhPZp64rn5Indo5oloNXYPukMybSmw==} + engines: {node: '>=18'} + peerDependencies: + '@frontify/fondue-icons': ^0.5.0 + '@frontify/fondue-tokens': ^3.5.7 + react: ^18 + react-dom: ^18 + '@frontify/fondue-icons@0.4.2': resolution: {integrity: sha512-i3dFH6N/qCBBvbJUopU/9rUDATii1vCt5yIUea3i7zpdHFupINQuG83aHA4dSFm18ofekqIqEiEPXy1fUND7Hw==} engines: {node: '>=18'} peerDependencies: react: ^18 + '@frontify/fondue-icons@0.5.0': + resolution: {integrity: sha512-Si16yGpFqbo57gD47FqNnvuzy+Y92UroPEMtd78cR73MwHI5tAK9i+8UoiKG2R1U35BCQCDkimRaX6Fv8IuclA==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 + '@frontify/fondue-tokens@3.5.7': resolution: {integrity: sha512-nvZZWIxK6pf0ZVsSN1CaNIJuJLmXoGnMDwwqjpX3vCeXt7SqBrlnmtDr3ZJc3NJwB4lR8g2pCET1sCKRQE7j5w==} peerDependencies: @@ -1016,6 +1106,13 @@ packages: react: ^18 react-dom: ^18 + '@frontify/fondue@12.2.16': + resolution: {integrity: sha512-JZKnLGmknxTyJuxeY2liuPWDUS057YhczEbWhrV0CDDpquqYTIkrlqk9XzNtnHZiOUSJokt8brLnGJuUGE2QVg==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 + react-dom: ^18 + '@frontify/frontify-cli@5.7.8': resolution: {integrity: sha512-rqnzcuXkVA9dO3GmZHRycwAj2bm4GGwVLX+uXvCqHAY85N87vc/YuW8eQZ7f9/waVw50+q5pKtrbMXI37qHUyg==} engines: {node: '>=18'} @@ -1197,6 +1294,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dialog@1.1.1': resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} peerDependencies: @@ -1354,6 +1460,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-presence@1.1.1': + resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} + 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.0.0': resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} peerDependencies: @@ -1467,6 +1586,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-tabs@1.1.1': + resolution: {integrity: sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw==} + 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-toggle-group@1.1.0': resolution: {integrity: sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==} peerDependencies: @@ -6469,6 +6601,11 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@frontify/app-bridge-app@0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@frontify/fondue-charts@1.8.14(@frontify/fondue-tokens@3.5.7(tailwindcss@3.4.3))(@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@frontify/fondue-tokens': 3.5.7(tailwindcss@3.4.3) @@ -6490,6 +6627,27 @@ snapshots: transitivePeerDependencies: - '@react-spring/web' + '@frontify/fondue-charts@1.8.15(@frontify/fondue-tokens@3.5.7(tailwindcss@3.4.3))(@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@frontify/fondue-tokens': 3.5.7(tailwindcss@3.4.3) + '@visx/axis': 3.10.1(react@18.3.1) + '@visx/glyph': 3.3.0(react@18.3.1) + '@visx/grid': 3.5.0(react@18.3.1) + '@visx/group': 3.3.0(react@18.3.1) + '@visx/hierarchy': 3.3.0(react@18.3.1) + '@visx/responsive': 3.10.2(react@18.3.1) + '@visx/scale': 3.5.0 + '@visx/shape': 3.5.0(react@18.3.1) + '@visx/text': 3.3.0(react@18.3.1) + '@visx/tooltip': 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@visx/xychart': 3.11.0(@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + lodash-es: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-font-face-observer: 1.2.2(react@18.3.1) + transitivePeerDependencies: + - '@react-spring/web' + '@frontify/fondue-components@3.3.3(@frontify/fondue-icons@0.4.2(react@18.3.1))(@frontify/fondue-tokens@3.5.7(tailwindcss@3.4.3))(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.3)': dependencies: '@frontify/fondue-icons': 0.4.2(react@18.3.1) @@ -6519,10 +6677,44 @@ snapshots: - '@types/react-dom' - tailwindcss + '@frontify/fondue-components@4.0.1(@frontify/fondue-icons@0.5.0(react@18.3.1))(@frontify/fondue-tokens@3.5.7(tailwindcss@3.4.3))(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.3)': + dependencies: + '@frontify/fondue-icons': 0.5.0(react@18.3.1) + '@frontify/fondue-tokens': 3.5.7(tailwindcss@3.4.3) + '@radix-ui/react-checkbox': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-label': 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-progress': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-scroll-area': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-select': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slider': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-switch': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tabs': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle-group': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + downshift: 9.0.8(react@18.3.1) + react: 18.3.1 + react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + tailwind-merge: 2.5.2 + tailwind-variants: 0.2.1(tailwindcss@3.4.3) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - tailwindcss + '@frontify/fondue-icons@0.4.2(react@18.3.1)': dependencies: react: 18.3.1 + '@frontify/fondue-icons@0.5.0(react@18.3.1)': + dependencies: + react: 18.3.1 + '@frontify/fondue-tokens@3.5.7(tailwindcss@3.4.3)': dependencies: tailwindcss: 3.4.3 @@ -6637,6 +6829,116 @@ snapshots: - tailwindcss - zustand + '@frontify/fondue@12.2.16(@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.12.12)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(tailwindcss@3.4.3)(zustand@4.5.2(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1))': + dependencies: + '@ctrl/tinycolor': 4.1.0 + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/modifiers': 7.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/sortable': 8.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + '@floating-ui/dom': 1.6.10 + '@frontify/fondue-charts': 1.8.15(@frontify/fondue-tokens@3.5.7(tailwindcss@3.4.3))(@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@frontify/fondue-components': 4.0.1(@frontify/fondue-icons@0.5.0(react@18.3.1))(@frontify/fondue-tokens@3.5.7(tailwindcss@3.4.3))(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.3) + '@frontify/fondue-icons': 0.5.0(react@18.3.1) + '@frontify/fondue-tokens': 3.5.7(tailwindcss@3.4.3) + '@popperjs/core': 2.11.8 + '@radix-ui/react-popover': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toolbar': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/accordion': 3.0.0-alpha.29(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/aria-modal-polyfill': 3.7.11(react@18.3.1) + '@react-aria/breadcrumbs': 3.5.16(react@18.3.1) + '@react-aria/button': 3.9.8(react@18.3.1) + '@react-aria/checkbox': 3.14.6(react@18.3.1) + '@react-aria/combobox': 3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/dialog': 3.5.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/link': 3.7.4(react@18.3.1) + '@react-aria/listbox': 3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/radio': 3.10.7(react@18.3.1) + '@react-aria/select': 3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/table': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/tooltip': 3.7.7(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-aria/visually-hidden': 3.8.15(react@18.3.1) + '@react-stately/checkbox': 3.6.8(react@18.3.1) + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/combobox': 3.9.2(react@18.3.1) + '@react-stately/list': 3.10.8(react@18.3.1) + '@react-stately/menu': 3.8.2(react@18.3.1) + '@react-stately/overlays': 3.6.10(react@18.3.1) + '@react-stately/radio': 3.10.7(react@18.3.1) + '@react-stately/select': 3.6.7(react@18.3.1) + '@react-stately/table': 3.12.2(react@18.3.1) + '@react-stately/toggle': 3.7.7(react@18.3.1) + '@react-stately/tooltip': 3.4.12(react@18.3.1) + '@react-stately/tree': 3.8.4(react@18.3.1) + '@react-types/dialog': 3.5.12(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@tailwindcss/forms': 0.5.9(tailwindcss@3.4.3) + '@udecode/plate-alignment': 31.0.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-autoformat': 31.0.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-basic-marks': 31.0.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-break': 31.0.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-code-block': 31.3.4(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-combobox': 31.0.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-common': 31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-core': 31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-emoji': 31.4.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-floating': 31.0.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-indent': 31.1.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-link': 31.0.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-list': 31.1.3(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-mention': 31.3.5(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-normalizers': 31.0.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-paragraph': 31.0.0(@udecode/plate-common@31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/plate-utils': 31.3.2(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/react-utils': 31.0.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@udecode/slate': 31.0.0(slate-history@0.100.0(slate@0.102.0))(slate@0.102.0) + '@udecode/slate-react': 31.0.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-history@0.100.0(slate@0.102.0))(slate-react@0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0))(slate@0.102.0) + '@udecode/slate-utils': 31.3.2(slate-history@0.100.0(slate@0.102.0))(slate@0.102.0) + '@udecode/utils': 31.0.0 + '@udecode/zustood': 2.0.0(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(zustand@4.5.2(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1)) + date-fns: 3.6.0 + escape-html: 1.0.3 + framer-motion: 10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + immer: 10.1.1 + is-hotkey: 0.2.0 + lodash-es: 4.17.21 + react: 18.3.1 + react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-datepicker: 6.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-dnd: 16.0.1(@types/node@20.12.12)(@types/react@18.3.3)(react@18.3.1) + react-dnd-html5-backend: 16.0.1 + react-dom: 18.3.1(react@18.3.1) + react-fast-compare: 3.2.2 + react-is: 18.3.1 + react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-textarea-autosize: 8.5.3(@types/react@18.3.3)(react@18.3.1) + remark-gfm: 3.0.1 + remark-parse: 10.0.2 + slate: 0.102.0 + slate-react: 0.102.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.102.0) + unified: 10.1.2 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - '@react-spring/web' + - '@types/hoist-non-react-statics' + - '@types/node' + - '@types/react' + - '@types/react-dom' + - react-native + - scheduler + - slate-history + - slate-hyperscript + - supports-color + - tailwindcss + - zustand + '@frontify/frontify-cli@5.7.8(@types/node@20.12.12)(terser@5.31.0)': dependencies: '@fastify/cors': 9.0.1 @@ -6687,7 +6989,7 @@ snapshots: '@frontify/sidebar-settings@0.9.22(@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.12.12)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(tailwindcss@3.4.3)(zustand@4.5.2(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1))': dependencies: - '@frontify/fondue': 12.2.11(@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.12.12)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(tailwindcss@3.4.3)(zustand@4.5.2(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1)) + '@frontify/fondue': 12.2.16(@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@20.12.12)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505)(slate-history@0.100.0(slate@0.102.0))(slate-hyperscript@0.100.0(slate@0.102.0))(tailwindcss@3.4.3)(zustand@4.5.2(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -6887,6 +7189,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-context@1.1.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -7063,6 +7371,16 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) @@ -7195,6 +7513,22 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-tabs@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-toggle-group@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -9179,6 +9513,16 @@ snapshots: postcss: 8.4.38 postcss-value-parser: 4.2.0 + autoprefixer@10.4.19(postcss@8.4.45): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001624 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.45 + postcss-value-parser: 4.2.0 + avvio@8.3.2: dependencies: '@fastify/error': 3.4.1