-
-
-
-
-
- #333333
+ { colors.map( ( color, key ) => {
+ return
+
+
{ color.name }
+
{ color.color }
+
-
-
-
-
+ } ) }
{ __( 'Color Schemes', i18n ) }
diff --git a/src/components/style-guide/popover.js b/src/components/style-guide/popover.js
index 83491ce291..9162d483d6 100644
--- a/src/components/style-guide/popover.js
+++ b/src/components/style-guide/popover.js
@@ -15,6 +15,7 @@ import { __ } from '@wordpress/i18n'
import { useMemo } from '@wordpress/element'
import { Popover, Button } from '@wordpress/components'
import { Icon, close as closeIcon } from '@wordpress/icons'
+import { useDesignSystem } from '~stackable/hooks'
const StyleGuidePopover = props => {
const { onClose } = props
@@ -25,6 +26,8 @@ const StyleGuidePopover = props => {
return [ el, el?.offsetWidth, el?.offsetHeight ]
}, [] )
+ const designSystem = useDesignSystem()
+
const style = width && height ? { '--width': `${ width }px`, '--height': `${ height }px` } : {}
return (
@@ -42,7 +45,7 @@ const StyleGuidePopover = props => {
{ __( 'Design System Style Guide', i18n ) }
-
+
)
}
diff --git a/src/hooks/index.js b/src/hooks/index.js
index 1242cda5ff..12dd1d4070 100644
--- a/src/hooks/index.js
+++ b/src/hooks/index.js
@@ -21,3 +21,4 @@ export * from './use-global-block-layout-defaults'
export * from './use-block-color-schemes'
export * from './use-preset-controls'
export * from './use-block-style-context'
+export * from './use-design-system'
diff --git a/src/hooks/use-design-system.js b/src/hooks/use-design-system.js
new file mode 100644
index 0000000000..40feef3441
--- /dev/null
+++ b/src/hooks/use-design-system.js
@@ -0,0 +1,15 @@
+import { useSelect } from '@wordpress/data'
+
+export const useDesignSystem = () => {
+ const { colors } = useSelect( select => {
+ const colors = select( 'stackable/global-colors' ).getSettings().stackableColors || []
+
+ // TODO: get other settings in the design system
+
+ return { colors }
+ }, [] )
+
+ return {
+ colors,
+ }
+}
From 37b66c94c08e26afdb036c958e8d3d04dc3cfd67 Mon Sep 17 00:00:00 2001
From: "bfintal@gmail.com" <>
Date: Wed, 6 Aug 2025 17:34:19 +0800
Subject: [PATCH 22/78] updated getting started
---
package-lock.json | 665 +++++++++++++++----
package.json | 2 +-
src/components/guided-modal-tour/editor.scss | 9 +-
src/welcome/admin.scss | 2 +-
src/welcome/getting-started-banner-bg.scss | 1 -
src/welcome/getting-started.js | 112 +++-
src/welcome/getting-started.scss | 294 +++++---
src/welcome/images/divider.svg | 15 +
src/welcome/images/quick-buttons-arrow.svg | 22 +
src/welcome/index.php | 2 +-
10 files changed, 869 insertions(+), 255 deletions(-)
delete mode 100644 src/welcome/getting-started-banner-bg.scss
create mode 100644 src/welcome/images/divider.svg
create mode 100644 src/welcome/images/quick-buttons-arrow.svg
diff --git a/package-lock.json b/package-lock.json
index a7a7f464f9..23d8b8506b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"license": "GPL-3.0",
"dependencies": {
"@wordpress/dom-ready": "^3.2.3",
- "@wordpress/icons": "^6.1.1",
+ "@wordpress/icons": "^10.27.0",
"bigpicture": "^2.5.3",
"canvas-confetti": "^1.9.3",
"classnames": "^2.2.6",
@@ -1838,11 +1838,11 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz",
- "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==",
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
"dependencies": {
- "regenerator-runtime": "^0.13.4"
+ "regenerator-runtime": "^0.14.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1861,6 +1861,11 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/runtime/node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
"node_modules/@babel/template": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz",
@@ -4966,9 +4971,9 @@
"dev": true
},
"node_modules/@types/prop-types": {
- "version": "15.7.4",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
- "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
+ "version": "15.7.15",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="
},
"node_modules/@types/q": {
"version": "1.5.5",
@@ -4977,21 +4982,23 @@
"dev": true
},
"node_modules/@types/react": {
- "version": "16.14.21",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.21.tgz",
- "integrity": "sha512-rY4DzPKK/4aohyWiDRHS2fotN5rhBSK6/rz1X37KzNna9HJyqtaGAbq9fVttrEPWF5ywpfIP1ITL8Xi2QZn6Eg==",
+ "version": "17.0.87",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.87.tgz",
+ "integrity": "sha512-wpg9AbtJ6agjA+BKYmhG6dRWEU/2DHYwMzCaBzsz137ft6IyuqZ5fI4ic1DWL4DrI03Zy78IyVE6ucrXl0mu4g==",
+ "dev": true,
"dependencies": {
"@types/prop-types": "*",
- "@types/scheduler": "*",
+ "@types/scheduler": "^0.16",
"csstype": "^3.0.2"
}
},
"node_modules/@types/react-dom": {
- "version": "16.9.14",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.14.tgz",
- "integrity": "sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A==",
- "dependencies": {
- "@types/react": "^16"
+ "version": "17.0.26",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz",
+ "integrity": "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==",
+ "dev": true,
+ "peerDependencies": {
+ "@types/react": "^17.0.0"
}
},
"node_modules/@types/responselike": {
@@ -5004,9 +5011,10 @@
}
},
"node_modules/@types/scheduler": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
- "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
+ "dev": true
},
"node_modules/@types/source-list-map": {
"version": "0.1.2",
@@ -5738,6 +5746,20 @@
"node": ">=12"
}
},
+ "node_modules/@wordpress/block-editor/node_modules/@wordpress/icons": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-6.3.0.tgz",
+ "integrity": "sha512-Vliw7QsFuTsrA05GZov4i3PQiLQOGO97PR2keUeY53fVZdeoJKv/nfDqOZxZCIts5jR2Mfje6P6hc/KlurxsKg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.16.0",
+ "@wordpress/element": "^4.1.1",
+ "@wordpress/primitives": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/@wordpress/block-serialization-default-parser": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-4.2.3.tgz",
@@ -5843,6 +5865,20 @@
"reakit-utils": "^0.15.1"
}
},
+ "node_modules/@wordpress/components/node_modules/@wordpress/icons": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-6.3.0.tgz",
+ "integrity": "sha512-Vliw7QsFuTsrA05GZov4i3PQiLQOGO97PR2keUeY53fVZdeoJKv/nfDqOZxZCIts5jR2Mfje6P6hc/KlurxsKg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.16.0",
+ "@wordpress/element": "^4.1.1",
+ "@wordpress/primitives": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/@wordpress/compose": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-5.0.6.tgz",
@@ -6010,26 +6046,38 @@
}
},
"node_modules/@wordpress/element": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-4.0.4.tgz",
- "integrity": "sha512-GbYVSZrHitOmupQCjb7cSlewVigXHorpZUBpvWnkU3rhyh1tF/N9qve3fgg7Q3s2szjtTP+eEutB+4mmkwHQOA==",
+ "version": "4.20.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-4.20.0.tgz",
+ "integrity": "sha512-Ou7EoGtGe4FUL6fKALINXJLKoSfyWTBJzkJfN2HzSgM1wira9EuWahl8MQN0HAUaWeOoDqMKPvnglfS+kC8JLA==",
+ "dev": true,
"dependencies": {
"@babel/runtime": "^7.16.0",
- "@types/react": "^16.9.0",
- "@types/react-dom": "^16.9.0",
- "@wordpress/escape-html": "^2.2.3",
- "lodash": "^4.17.21",
- "react": "^17.0.1",
- "react-dom": "^17.0.1"
+ "@types/react": "^17.0.37",
+ "@types/react-dom": "^17.0.11",
+ "@wordpress/escape-html": "^2.22.0",
+ "change-case": "^4.1.2",
+ "is-plain-object": "^5.0.0",
+ "react": "^17.0.2",
+ "react-dom": "^17.0.2"
},
"engines": {
"node": ">=12"
}
},
+ "node_modules/@wordpress/element/node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/@wordpress/escape-html": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.2.3.tgz",
- "integrity": "sha512-nYIwT8WzHfAzjjwHLiwDQWrzn4/gUNr5zud465XQszM2cAItN2wnC26/ovSpPomDGkvjcG0YltgnSqc1T62olA==",
+ "version": "2.58.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.58.0.tgz",
+ "integrity": "sha512-9YJXMNfzkrhHEVP1jFEhgijbZqW8Mt3NHIMZjIQoWtBf7QE86umpYpGGBXzYC0YlpGTRGzZTBwYaqFKxjeaSgA==",
+ "dev": true,
"dependencies": {
"@babel/runtime": "^7.16.0"
},
@@ -6155,16 +6203,121 @@
}
},
"node_modules/@wordpress/icons": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-6.1.1.tgz",
- "integrity": "sha512-UaFAOF8hqlEhjTm5kba0JwSDDeEgPSJToDJNADoz8jkxt22kEG5ACi9IaS0BRIy1X7kR6QaCE394v9+GkToE+g==",
+ "version": "10.27.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.27.0.tgz",
+ "integrity": "sha512-KeOz3aLtd7p+cA287gmGzpC9kIO1lxPBn/lDPkXfc8oz482XqNJKohdW/7ZMlEWx1uEcZUI+g3vfSA+gKDgjUQ==",
"dependencies": {
- "@babel/runtime": "^7.16.0",
- "@wordpress/element": "^4.0.4",
- "@wordpress/primitives": "^3.0.4"
+ "@babel/runtime": "7.25.7",
+ "@wordpress/element": "^6.27.0",
+ "@wordpress/primitives": "^4.27.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/icons/node_modules/@types/react": {
+ "version": "18.3.23",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz",
+ "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@wordpress/icons/node_modules/@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/icons/node_modules/@wordpress/element": {
+ "version": "6.27.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.27.0.tgz",
+ "integrity": "sha512-gHk4B0J0f7bEsDoUBdTm22vPQwmEWLZxyaojgRyx1ncE2IyktfmubD/q2NIcMEKh7p+Jq3ZUwzPcpchpvkH2mA==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@types/react": "^18.2.79",
+ "@types/react-dom": "^18.2.25",
+ "@wordpress/escape-html": "^3.27.0",
+ "change-case": "^4.1.2",
+ "is-plain-object": "^5.0.0",
+ "react": "^18.3.0",
+ "react-dom": "^18.3.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/icons/node_modules/@wordpress/escape-html": {
+ "version": "3.27.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.27.0.tgz",
+ "integrity": "sha512-1LBB/xOFBUySSmVpd2nFwIZ8fVnP8dLNFl0wLprHVLtW6ZcdykO2ITY9bkaHu2lZ9HLRgHL7A/3R7MsJ1azYkg==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/icons/node_modules/@wordpress/primitives": {
+ "version": "4.27.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.27.0.tgz",
+ "integrity": "sha512-ZIhpB4ZmZwMSsrELx4mzhRvxAoqgk8sSE3PaRt/ue4GXFoRRQgI3RVCwEdiNPcsQXId9lOQIhAJNDt5Wa0Fbgg==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/element": "^6.27.0",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/icons/node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@wordpress/icons/node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@wordpress/icons/node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/@wordpress/icons/node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
}
},
"node_modules/@wordpress/is-shallow-equal": {
@@ -6297,18 +6450,100 @@
}
},
"node_modules/@wordpress/primitives": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.0.4.tgz",
- "integrity": "sha512-yu3BEpr09vpPM0QOYGm5Kmwo/tfo7u7Ez4hN5+AL2dT53VNr3QOmDo0Ym7sewI7+GgU18H4VkAi1QOydrc4vDw==",
+ "version": "3.56.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.56.0.tgz",
+ "integrity": "sha512-NXBq1ODjl6inMWx/l7KCbATcjdoeIOqYeL9i9alqdAfWeKx1EH9PIvKWylIkqZk7erXxCxldiRkuyjTtwjNBxw==",
+ "dev": true,
"dependencies": {
"@babel/runtime": "^7.16.0",
- "@wordpress/element": "^4.0.4",
- "classnames": "^2.3.1"
+ "@wordpress/element": "^5.35.0",
+ "clsx": "^2.1.1"
},
"engines": {
"node": ">=12"
}
},
+ "node_modules/@wordpress/primitives/node_modules/@types/react": {
+ "version": "18.3.23",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz",
+ "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==",
+ "dev": true,
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@wordpress/primitives/node_modules/@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "dev": true,
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/primitives/node_modules/@wordpress/element": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-5.35.0.tgz",
+ "integrity": "sha512-puswpGcIdS+0A2g28uHriMkZqqRCmzFczue5Tk99VNtzBdehyk7Ae+DZ4xw5yT6GqYai8NTqv6MRwCB78uh5Mw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.16.0",
+ "@types/react": "^18.2.79",
+ "@types/react-dom": "^18.2.25",
+ "@wordpress/escape-html": "^2.58.0",
+ "change-case": "^4.1.2",
+ "is-plain-object": "^5.0.0",
+ "react": "^18.3.0",
+ "react-dom": "^18.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@wordpress/primitives/node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@wordpress/primitives/node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@wordpress/primitives/node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/@wordpress/primitives/node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
"node_modules/@wordpress/priority-queue": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-2.2.3.tgz",
@@ -9576,7 +9811,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
"integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "dev": true,
"dependencies": {
"pascal-case": "^3.1.2",
"tslib": "^2.0.3"
@@ -9665,7 +9899,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
"integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
- "dev": true,
"dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3",
@@ -9717,7 +9950,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz",
"integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==",
- "dev": true,
"dependencies": {
"camel-case": "^4.1.2",
"capital-case": "^1.0.4",
@@ -10363,6 +10595,14 @@
"safe-buffer": "~5.1.0"
}
},
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -10798,7 +11038,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz",
"integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==",
- "dev": true,
"dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3",
@@ -12420,7 +12659,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
"integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "dev": true,
"dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -17110,7 +17348,6 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz",
"integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==",
- "dev": true,
"dependencies": {
"capital-case": "^1.0.4",
"tslib": "^2.0.3"
@@ -24005,7 +24242,8 @@
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
},
"node_modules/lodash-es": {
"version": "4.17.21",
@@ -24285,7 +24523,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
"integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "dev": true,
"dependencies": {
"tslib": "^2.0.3"
}
@@ -25466,7 +25703,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
"integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "dev": true,
"dependencies": {
"lower-case": "^2.0.2",
"tslib": "^2.0.3"
@@ -26571,7 +26807,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
"integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "dev": true,
"dependencies": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -26682,7 +26917,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
"integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "dev": true,
"dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -26701,7 +26935,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz",
"integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==",
- "dev": true,
"dependencies": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -29439,7 +29672,8 @@
"node_modules/regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
+ "dev": true
},
"node_modules/regenerator-transform": {
"version": "0.14.5",
@@ -30443,7 +30677,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz",
"integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==",
- "dev": true,
"dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3",
@@ -30695,7 +30928,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
"integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
- "dev": true,
"dependencies": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -32906,8 +33138,7 @@
"node_modules/tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
- "dev": true
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
},
"node_modules/tsutils": {
"version": "3.21.0",
@@ -33371,7 +33602,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
"integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==",
- "dev": true,
"dependencies": {
"tslib": "^2.0.3"
}
@@ -33380,7 +33610,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
"integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
- "dev": true,
"dependencies": {
"tslib": "^2.0.3"
}
@@ -35844,11 +36073,18 @@
}
},
"@babel/runtime": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz",
- "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==",
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
"requires": {
- "regenerator-runtime": "^0.13.4"
+ "regenerator-runtime": "^0.14.0"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ }
}
},
"@babel/runtime-corejs3": {
@@ -38306,9 +38542,9 @@
"dev": true
},
"@types/prop-types": {
- "version": "15.7.4",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
- "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
+ "version": "15.7.15",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="
},
"@types/q": {
"version": "1.5.5",
@@ -38317,22 +38553,22 @@
"dev": true
},
"@types/react": {
- "version": "16.14.21",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.21.tgz",
- "integrity": "sha512-rY4DzPKK/4aohyWiDRHS2fotN5rhBSK6/rz1X37KzNna9HJyqtaGAbq9fVttrEPWF5ywpfIP1ITL8Xi2QZn6Eg==",
+ "version": "17.0.87",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.87.tgz",
+ "integrity": "sha512-wpg9AbtJ6agjA+BKYmhG6dRWEU/2DHYwMzCaBzsz137ft6IyuqZ5fI4ic1DWL4DrI03Zy78IyVE6ucrXl0mu4g==",
+ "dev": true,
"requires": {
"@types/prop-types": "*",
- "@types/scheduler": "*",
+ "@types/scheduler": "^0.16",
"csstype": "^3.0.2"
}
},
"@types/react-dom": {
- "version": "16.9.14",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.14.tgz",
- "integrity": "sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A==",
- "requires": {
- "@types/react": "^16"
- }
+ "version": "17.0.26",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz",
+ "integrity": "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==",
+ "dev": true,
+ "requires": {}
},
"@types/responselike": {
"version": "1.0.0",
@@ -38344,9 +38580,10 @@
}
},
"@types/scheduler": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
- "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
+ "dev": true
},
"@types/source-list-map": {
"version": "0.1.2",
@@ -38943,6 +39180,19 @@
"redux-multi": "^0.1.12",
"rememo": "^3.0.0",
"traverse": "^0.6.6"
+ },
+ "dependencies": {
+ "@wordpress/icons": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-6.3.0.tgz",
+ "integrity": "sha512-Vliw7QsFuTsrA05GZov4i3PQiLQOGO97PR2keUeY53fVZdeoJKv/nfDqOZxZCIts5jR2Mfje6P6hc/KlurxsKg==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.16.0",
+ "@wordpress/element": "^4.1.1",
+ "@wordpress/primitives": "^3.1.1"
+ }
+ }
}
},
"@wordpress/block-serialization-default-parser": {
@@ -39033,6 +39283,19 @@
"reakit": "^1.3.8",
"rememo": "^3.0.0",
"uuid": "^8.3.0"
+ },
+ "dependencies": {
+ "@wordpress/icons": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-6.3.0.tgz",
+ "integrity": "sha512-Vliw7QsFuTsrA05GZov4i3PQiLQOGO97PR2keUeY53fVZdeoJKv/nfDqOZxZCIts5jR2Mfje6P6hc/KlurxsKg==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.16.0",
+ "@wordpress/element": "^4.1.1",
+ "@wordpress/primitives": "^3.1.1"
+ }
+ }
}
},
"@wordpress/compose": {
@@ -39161,23 +39424,34 @@
}
},
"@wordpress/element": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-4.0.4.tgz",
- "integrity": "sha512-GbYVSZrHitOmupQCjb7cSlewVigXHorpZUBpvWnkU3rhyh1tF/N9qve3fgg7Q3s2szjtTP+eEutB+4mmkwHQOA==",
+ "version": "4.20.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-4.20.0.tgz",
+ "integrity": "sha512-Ou7EoGtGe4FUL6fKALINXJLKoSfyWTBJzkJfN2HzSgM1wira9EuWahl8MQN0HAUaWeOoDqMKPvnglfS+kC8JLA==",
+ "dev": true,
"requires": {
"@babel/runtime": "^7.16.0",
- "@types/react": "^16.9.0",
- "@types/react-dom": "^16.9.0",
- "@wordpress/escape-html": "^2.2.3",
- "lodash": "^4.17.21",
- "react": "^17.0.1",
- "react-dom": "^17.0.1"
+ "@types/react": "^17.0.37",
+ "@types/react-dom": "^17.0.11",
+ "@wordpress/escape-html": "^2.22.0",
+ "change-case": "^4.1.2",
+ "is-plain-object": "^5.0.0",
+ "react": "^17.0.2",
+ "react-dom": "^17.0.2"
+ },
+ "dependencies": {
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true
+ }
}
},
"@wordpress/escape-html": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.2.3.tgz",
- "integrity": "sha512-nYIwT8WzHfAzjjwHLiwDQWrzn4/gUNr5zud465XQszM2cAItN2wnC26/ovSpPomDGkvjcG0YltgnSqc1T62olA==",
+ "version": "2.58.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.58.0.tgz",
+ "integrity": "sha512-9YJXMNfzkrhHEVP1jFEhgijbZqW8Mt3NHIMZjIQoWtBf7QE86umpYpGGBXzYC0YlpGTRGzZTBwYaqFKxjeaSgA==",
+ "dev": true,
"requires": {
"@babel/runtime": "^7.16.0"
}
@@ -39264,13 +39538,93 @@
}
},
"@wordpress/icons": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-6.1.1.tgz",
- "integrity": "sha512-UaFAOF8hqlEhjTm5kba0JwSDDeEgPSJToDJNADoz8jkxt22kEG5ACi9IaS0BRIy1X7kR6QaCE394v9+GkToE+g==",
+ "version": "10.27.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.27.0.tgz",
+ "integrity": "sha512-KeOz3aLtd7p+cA287gmGzpC9kIO1lxPBn/lDPkXfc8oz482XqNJKohdW/7ZMlEWx1uEcZUI+g3vfSA+gKDgjUQ==",
"requires": {
- "@babel/runtime": "^7.16.0",
- "@wordpress/element": "^4.0.4",
- "@wordpress/primitives": "^3.0.4"
+ "@babel/runtime": "7.25.7",
+ "@wordpress/element": "^6.27.0",
+ "@wordpress/primitives": "^4.27.0"
+ },
+ "dependencies": {
+ "@types/react": {
+ "version": "18.3.23",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz",
+ "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==",
+ "requires": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "requires": {}
+ },
+ "@wordpress/element": {
+ "version": "6.27.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.27.0.tgz",
+ "integrity": "sha512-gHk4B0J0f7bEsDoUBdTm22vPQwmEWLZxyaojgRyx1ncE2IyktfmubD/q2NIcMEKh7p+Jq3ZUwzPcpchpvkH2mA==",
+ "requires": {
+ "@babel/runtime": "7.25.7",
+ "@types/react": "^18.2.79",
+ "@types/react-dom": "^18.2.25",
+ "@wordpress/escape-html": "^3.27.0",
+ "change-case": "^4.1.2",
+ "is-plain-object": "^5.0.0",
+ "react": "^18.3.0",
+ "react-dom": "^18.3.0"
+ }
+ },
+ "@wordpress/escape-html": {
+ "version": "3.27.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.27.0.tgz",
+ "integrity": "sha512-1LBB/xOFBUySSmVpd2nFwIZ8fVnP8dLNFl0wLprHVLtW6ZcdykO2ITY9bkaHu2lZ9HLRgHL7A/3R7MsJ1azYkg==",
+ "requires": {
+ "@babel/runtime": "7.25.7"
+ }
+ },
+ "@wordpress/primitives": {
+ "version": "4.27.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.27.0.tgz",
+ "integrity": "sha512-ZIhpB4ZmZwMSsrELx4mzhRvxAoqgk8sSE3PaRt/ue4GXFoRRQgI3RVCwEdiNPcsQXId9lOQIhAJNDt5Wa0Fbgg==",
+ "requires": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/element": "^6.27.0",
+ "clsx": "^2.1.1"
+ }
+ },
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+ },
+ "react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ }
+ },
+ "scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ }
}
},
"@wordpress/is-shallow-equal": {
@@ -39368,13 +39722,83 @@
"dev": true
},
"@wordpress/primitives": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.0.4.tgz",
- "integrity": "sha512-yu3BEpr09vpPM0QOYGm5Kmwo/tfo7u7Ez4hN5+AL2dT53VNr3QOmDo0Ym7sewI7+GgU18H4VkAi1QOydrc4vDw==",
+ "version": "3.56.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.56.0.tgz",
+ "integrity": "sha512-NXBq1ODjl6inMWx/l7KCbATcjdoeIOqYeL9i9alqdAfWeKx1EH9PIvKWylIkqZk7erXxCxldiRkuyjTtwjNBxw==",
+ "dev": true,
"requires": {
"@babel/runtime": "^7.16.0",
- "@wordpress/element": "^4.0.4",
- "classnames": "^2.3.1"
+ "@wordpress/element": "^5.35.0",
+ "clsx": "^2.1.1"
+ },
+ "dependencies": {
+ "@types/react": {
+ "version": "18.3.23",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz",
+ "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==",
+ "dev": true,
+ "requires": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "@wordpress/element": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-5.35.0.tgz",
+ "integrity": "sha512-puswpGcIdS+0A2g28uHriMkZqqRCmzFczue5Tk99VNtzBdehyk7Ae+DZ4xw5yT6GqYai8NTqv6MRwCB78uh5Mw==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.16.0",
+ "@types/react": "^18.2.79",
+ "@types/react-dom": "^18.2.25",
+ "@wordpress/escape-html": "^2.58.0",
+ "change-case": "^4.1.2",
+ "is-plain-object": "^5.0.0",
+ "react": "^18.3.0",
+ "react-dom": "^18.3.0"
+ }
+ },
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true
+ },
+ "react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ }
+ },
+ "scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ }
}
},
"@wordpress/priority-queue": {
@@ -41853,7 +42277,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
"integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "dev": true,
"requires": {
"pascal-case": "^3.1.2",
"tslib": "^2.0.3"
@@ -41911,7 +42334,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
"integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
- "dev": true,
"requires": {
"no-case": "^3.0.4",
"tslib": "^2.0.3",
@@ -41954,7 +42376,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz",
"integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==",
- "dev": true,
"requires": {
"camel-case": "^4.1.2",
"capital-case": "^1.0.4",
@@ -42458,6 +42879,11 @@
}
}
},
+ "clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="
+ },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -42845,7 +43271,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz",
"integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==",
- "dev": true,
"requires": {
"no-case": "^3.0.4",
"tslib": "^2.0.3",
@@ -44145,7 +44570,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
"integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "dev": true,
"requires": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -47847,7 +48271,6 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz",
"integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==",
- "dev": true,
"requires": {
"capital-case": "^1.0.4",
"tslib": "^2.0.3"
@@ -53162,7 +53585,8 @@
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
},
"lodash-es": {
"version": "4.17.21",
@@ -53394,7 +53818,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
"integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "dev": true,
"requires": {
"tslib": "^2.0.3"
}
@@ -54314,7 +54737,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
"integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "dev": true,
"requires": {
"lower-case": "^2.0.2",
"tslib": "^2.0.3"
@@ -55151,7 +55573,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
"integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "dev": true,
"requires": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -55240,7 +55661,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
"integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "dev": true,
"requires": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -55256,7 +55676,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz",
"integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==",
- "dev": true,
"requires": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -57271,7 +57690,8 @@
"regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
+ "dev": true
},
"regenerator-transform": {
"version": "0.14.5",
@@ -58055,7 +58475,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz",
"integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==",
- "dev": true,
"requires": {
"no-case": "^3.0.4",
"tslib": "^2.0.3",
@@ -58258,7 +58677,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
"integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
- "dev": true,
"requires": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -60010,8 +60428,7 @@
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
- "dev": true
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
},
"tsutils": {
"version": "3.21.0",
@@ -60355,7 +60772,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
"integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==",
- "dev": true,
"requires": {
"tslib": "^2.0.3"
}
@@ -60364,7 +60780,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
"integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
- "dev": true,
"requires": {
"tslib": "^2.0.3"
}
diff --git a/package.json b/package.json
index 72420b1c38..ada0d9751a 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
"bugs": "https://wordpress.org/support/plugin/stackable-ultimate-gutenberg-blocks",
"dependencies": {
"@wordpress/dom-ready": "^3.2.3",
- "@wordpress/icons": "^6.1.1",
+ "@wordpress/icons": "^10.27.0",
"bigpicture": "^2.5.3",
"canvas-confetti": "^1.9.3",
"classnames": "^2.2.6",
diff --git a/src/components/guided-modal-tour/editor.scss b/src/components/guided-modal-tour/editor.scss
index 95d0a03225..d2b0e51442 100644
--- a/src/components/guided-modal-tour/editor.scss
+++ b/src/components/guided-modal-tour/editor.scss
@@ -16,6 +16,7 @@
margin-left: var(--offset-x);
margin-top: var(--offset-y);
overflow: visible;
+ border-radius: 16px;
--wp-admin-theme-color: #f00069;
--wp-admin-theme-color-darker-10: #e0003c;
@@ -44,14 +45,18 @@
transform: scale(1);
}
+ .components-button {
+ border-radius: 4px;
+ }
+
.components-modal__content {
- padding: 20px;
+ padding: 2em;
margin: 0;
position: relative;
overflow: visible;
z-index: 1;
box-shadow: 0 22px 200px 4px #0005;
- border-radius: 4px;
+ border-radius: 16px;
// border: 1px solid #f00069ad;
}
.components-modal__header {
diff --git a/src/welcome/admin.scss b/src/welcome/admin.scss
index 7ae5428349..ca63bac39b 100644
--- a/src/welcome/admin.scss
+++ b/src/welcome/admin.scss
@@ -3,7 +3,7 @@
*/
:root {
- --stk-welcome-primary: #dd2590;
+ --stk-welcome-primary: #f00069;
--stk-welcome-secondary: #101828;
--stk-welcome-light-border: #d0d5dd;
}
diff --git a/src/welcome/getting-started-banner-bg.scss b/src/welcome/getting-started-banner-bg.scss
deleted file mode 100644
index e6baab493f..0000000000
--- a/src/welcome/getting-started-banner-bg.scss
+++ /dev/null
@@ -1 +0,0 @@
-$--s-banner-bg: 'data:image/svg+xml,
';
diff --git a/src/welcome/getting-started.js b/src/welcome/getting-started.js
index 336aebcada..f8670033f9 100644
--- a/src/welcome/getting-started.js
+++ b/src/welcome/getting-started.js
@@ -6,11 +6,20 @@ import SVGTutorialsIcon from './images/tutorials.svg'
import SVGDocsIcon from './images/docs.svg'
import SVGCommunityIcon from './images/user.svg'
import SVGArrowUpRightIcon from './images/arrow-up-right.svg'
+import SVGDivider from './images/divider.svg'
+import SVGQuickButtonsArrow from './images/quick-buttons-arrow.svg'
/**
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n'
+import {
+ Icon,
+ addTemplate as addTemplateIcon,
+ styles as stylesIcon,
+ scheduled as scheduledIcon,
+ brush as brushIcon,
+} from '@wordpress/icons'
/**
* External dependencies
@@ -102,22 +111,98 @@ const EssentialsCard = ( {
export const GettingStarted = () => {
return <>
-
+
-
{ __( 'Unleash the Full Potential of the WordPress Block Editor by Turning It into a Page Builder', i18n ) }
-
{ __( 'Learn the essentials in just a few minutes by watching this video. Scroll down to see more quick tutorials.', i18n ) }
+
{ __( 'Welcome to Stackable', i18n ) }
+ { /*
{ __( 'Let\'s build something amazing!', i18n ) }
*/ }
+
{ __( 'Welcome to Your New Block Editor Workflow!', i18n ) }
+
+
+
+
+
+
+ { __( 'Quick Start', i18n ) }
+
+
+
+
+
+
+
{ __( 'Build Pages in Seconds', i18n ) }
+
{ __( 'Jump straight into our Design Library and insert polished, pre-built sections β no more blank-page overwhelm.', i18n ) }
+
+
+
+
+
+
+
+
+
+
{ __( 'Apply Global Styles Instantly', i18n ) }
+
{ __( 'Set your brand\'s colors, fonts, and spacing once in the Design System β every Stackable block updates automatically.', i18n ) }
+
+
+
+
+ { /* TODO: Hide this for now */ }
+
+
+
+
+
+
{ __( 'Start with a Complete Site Kit', i18n ) }
+
{ __( 'Pick a ready-made website template to kickstart your project β fully built layouts and styles, just swap in your content.', i18n ) }
+
+
+
-
-
+ { /* TODO: Hide this for now */ }
+
+
+
+
+
+
{ __( 'Pre-set Design Systems', i18n ) }
+
{ __( 'Browse curated Design System presets β apply a professional look instantly without building from scratch.', i18n ) }
+
+
+
-
+
+
+
+
+
{ __( 'Getting Started with Stackable', i18n ) }
+
{ __( 'Watch this video to get started with Stackable in within 5 minutes.', i18n ) }
+
+
+
+
+
{ __( 'Resources', i18n ) }
+
{ generalProps.map( ( item, key ) => {
return
@@ -134,17 +219,6 @@ export const GettingStarted = () => {
} ) }
-
-
-
-
-
{ __( 'Check out our library of tutorials and guides', i18n ) }
-
-
-
-
>
}
diff --git a/src/welcome/getting-started.scss b/src/welcome/getting-started.scss
index 5cde6d7bf9..74e19c30fb 100644
--- a/src/welcome/getting-started.scss
+++ b/src/welcome/getting-started.scss
@@ -2,32 +2,53 @@
* Styles used by the Getting Started section.
*/
-@import "getting-started-banner-bg";
+@mixin s-shadow {
+ box-shadow: rgba(0, 0, 0, 0.05) 0px 6px 24px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px;
+ transition: all 0.3s ease-in-out;
+ &:hover {
+ box-shadow: rgba(100, 100, 111, 0.2) 0px 7px 29px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px;
+ }
+}
+
+.settings_page_stackable-getting-started {
+ .s-body {
+ max-width: 1200px;
+ margin: 0 auto;
+ }
+}
.s-getting-started {
- background-color: #fff;
+ background-color: #f0f0f1;
overflow-x: auto;
.s-getting-started__centered {
- margin-bottom: 64px !important;
+ justify-content: center;
+ display: flex;
+ flex-direction: column;
}
- .title,
- .subtitle {
+ .tag {
text-align: center;
+ color: #f00069;
+ border: 1px solid #f0006933;
+ padding: 4px 16px;
+ border-radius: 30px;
+ background-color: #f0006933;
}
.title {
- margin: 8px;
- margin-bottom: 24px;
- font-weight: 600;
+ font-weight: 700;
font-size: 32px;
line-height: 1.2;
- }
-
- .subtitle {
- font-weight: 300;
- margin-bottom: 24px;
+ margin: 0;
+
+ span {
+ background-image: linear-gradient(30deg, #f00069, #d000ff);
+ -webkit-background-clip: text;
+ background-clip: text;
+ -webkit-text-fill-color: transparent;
+ color: transparent;
+ }
}
.s-video-wrapper {
@@ -36,7 +57,7 @@
margin-bottom: 24px;
&.s-card-top {
- margin: -20px -20px 20px;
+ margin: -1.5em -1.5em 1.5em;
}
.s-video {
@@ -45,7 +66,6 @@
}
&.s-getting-started-video .s-video {
- width: 700px;
max-width: 100%;
min-width: unset;
}
@@ -58,7 +78,7 @@
}
.s-secondary-button {
- background: var(--stk-welcome-secondary) !important;
+ background: var(--stk-welcome-primary) !important;
border-radius: 4px;
font-weight: 600;
transition: all 0.1s ease-in-out;
@@ -88,9 +108,10 @@
.s-card-header {
h2 {
- font-size: 25px;
- font-weight: 500;
- padding-top: 25px;
+ margin: 2em 0 1em;
+ font-weight: 700;
+ font-size: 32px;
+ line-height: 1.2;
}
div {
@@ -119,11 +140,7 @@
max-width: 1200px;
&.s-card-general .s-card {
- box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;
- transition: 0.3s;
- &:hover {
- box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px, rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
- }
+ @include s-shadow;
}
.s-card-link {
@@ -132,101 +149,79 @@
cursor: pointer;
text-decoration: none;
}
-
.s-card {
- padding: 20px;
- border-radius: 5px;
- border: 1px solid #1018280f;
- display: flex;
- flex-direction: column;
width: calc(30% - 32px);
-
- .s-card-title {
- margin-bottom: 16px;
- }
- .s-card-subtitle {
- margin-bottom: 0;
- }
-
- .s-card-title,
- .s-card-subtitle {
- margin-top: 0;
- }
-
- .s-video-wrapper {
- align-items: center;
- }
-
- .s-icon-wrapper {
- border: 1px solid #eaecf0;
- border-radius: 8px;
- padding: 10px;
- display: flex;
- align-items: center;
- max-width: fit-content;
- margin-bottom: 20px;
- }
-
- .s-bottom-icon-wrapper {
- display: flex;
- justify-content: flex-end;
- }
-
- svg {
- height: 24px;
- width: 24px;
- }
-
}
}
- .s-getting-started__footer-banner {
- position: relative;
- left: 0;
- right: 0;
- margin: auto;
- margin-bottom: 56px;
- background-image: url($--s-banner-bg);
- background-size: cover;
- background-position: center;
- border-radius: 8px;
+ .s-card {
+ padding: 1.5em;
+ display: flex;
+ flex-direction: column;
+ border-radius: 16px;
+ @include s-shadow;
+ background: #fff;
+ overflow: hidden;
+
+ .s-card-title,
+ h3 {
+ margin: 0 0 0.5em;
+ }
+ .s-card-subtitle,
+ p {
+ margin: 0;
+ }
+ > *:last-child {
+ margin-bottom: 0;
+ }
- .s-banner-wrapper {
- padding: 36px 80px;
+ .s-video-wrapper {
+ align-items: center;
+ }
+
+ .s-icon-wrapper {
+ border: 1px solid #eaecf0;
+ border-radius: 8px;
+ padding: 10px;
display: flex;
- justify-content: space-between;
- z-index: 1;
- position: relative;
+ align-items: center;
+ max-width: fit-content;
+ margin-bottom: 20px;
+ }
- .s-banner-content {
- max-width: 350px;
- color: #fff;
- font-weight: 300;
+ .s-bottom-icon-wrapper {
+ display: flex;
+ justify-content: flex-end;
+ }
- h2 {
- font-size: 32px;
- font-weight: 700;
- color: #fff;
- line-height: 32px;
- margin: 0;
- }
- }
+ svg {
+ height: 24px;
+ width: 24px;
+ }
- .s-button-container {
- align-items: flex-end;
- margin-bottom: 0;
+ }
- }
- }
+ .s-divider {
+ width: 250px;
+ margin: 64px auto;
+ display: block;
}
}
-@media screen and (min-width: 800px) {
- .s-getting-started__centered {
- max-width: 900px;
- margin: 0 auto;
- padding: 0 24px;
- }
+.s-getting-started__centered {
+ color: #fff;
+ box-sizing: border-box;
+ width: calc(100% + 100px);
+ background-position: center;
+ background-size: cover;
+ margin-bottom: 100px;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.5em;
+}
+body.settings_page_stackable-getting-started .s-body-container > .s-getting-started__centered:first-child {
+ margin-top: -40px !important;
}
@media screen and (max-width: 1200px) {
@@ -237,3 +232,92 @@
width: 330px !important;
}
}
+
+.s-getting-started__quick-start-wrapper {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 40px;
+ margin: 1em 0 64px;
+ align-items: flex-start;
+
+ .s-getting-started-video {
+ flex-direction: column;
+ border-radius: 16px;
+ @include s-shadow;
+ overflow: hidden;
+ }
+
+ .s-quick-buttons-wrapper {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+ .s-card {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ gap: 24px;
+
+ @media screen and (max-width: 1200px) {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+ }
+ }
+ .s-quick-button-icon {
+ background: #4770f8;
+ fill: #fff;
+ display: flex;
+ padding: 8px;
+ border-radius: 8px;
+ }
+ // Succeeding icon colors are different.
+ .s-card:nth-child(3) {
+ .s-quick-button-icon {
+ background: #f00069;
+ }
+ }
+ .s-card:nth-child(4) {
+ .s-quick-button-icon {
+ background: #d000ff;
+ }
+ }
+ .s-card:nth-child(5) {
+ .s-quick-button-icon {
+ background: #f89347;
+ }
+ }
+ .s-quick-button-button {
+ white-space: nowrap;
+ }
+
+ .s-quick-button-description {
+ > *:first-child {
+ margin-top: 0;
+ }
+ > *:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ .s-quick-buttons-arrow {
+ position: absolute;
+ bottom: 100%;
+ display: flex;
+ flex-direction: row-reverse;
+ margin-bottom: -20px;
+ right: 69px;
+ svg {
+ width: 64px;
+ transform: scaleX(-1);
+ }
+ span {
+ margin-top: 7px;
+ font-size: 18px;
+ color: #402933;
+ transform: rotate(-4deg);
+ font-family: Rockwell, "Rockwell Nova", "Roboto Slab", "DejaVu Serif", "Sitka Small", serif;
+ }
+ }
+}
diff --git a/src/welcome/images/divider.svg b/src/welcome/images/divider.svg
new file mode 100644
index 0000000000..55c2933300
--- /dev/null
+++ b/src/welcome/images/divider.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/src/welcome/images/quick-buttons-arrow.svg b/src/welcome/images/quick-buttons-arrow.svg
new file mode 100644
index 0000000000..6e29c6aa0f
--- /dev/null
+++ b/src/welcome/images/quick-buttons-arrow.svg
@@ -0,0 +1,22 @@
+
\ No newline at end of file
diff --git a/src/welcome/index.php b/src/welcome/index.php
index 459a73e8b3..f178b3231f 100644
--- a/src/welcome/index.php
+++ b/src/welcome/index.php
@@ -265,7 +265,7 @@ public function stackable_getting_started_content() {
print_tabs() ?>
-
Date: Thu, 7 Aug 2025 08:33:03 +0800
Subject: [PATCH 23/78] added color schemes, adjusted style guide styles
---
src/components/style-guide/editor.scss | 152 ++++++++++--
src/components/style-guide/index.js | 329 ++++++++++++++++---------
src/components/style-guide/popover.js | 56 ++++-
3 files changed, 397 insertions(+), 140 deletions(-)
diff --git a/src/components/style-guide/editor.scss b/src/components/style-guide/editor.scss
index ab435a6a5c..1db722b6bf 100644
--- a/src/components/style-guide/editor.scss
+++ b/src/components/style-guide/editor.scss
@@ -1,8 +1,27 @@
+$guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
+@mixin guide-titles {
+ font-family: $guide-font-family;
+ font-size: 1.1em;
+ font-weight: 400;
+}
+
.ugb-style-guide {
+ &,
+ p {
+ font-size: 16px;
+ }
+
.ugb-style-guide__content {
+ background: #fff; // This is needed for the export
padding: 70px;
}
+ .ugb-style-guide__title {
+ font-family: $guide-font-family;
+ font-size: 1.1em;
+ font-weight: 400;
+ }
+
.ugb-style-guide__columns {
display: grid;
grid-template-columns: 1fr 1fr;
@@ -10,43 +29,118 @@
}
.ugb-style-guide__section-title {
- font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
- font-size: 2em;
+ font-family: $guide-font-family;
+ font-size: 32.44px;
font-weight: 700;
border-bottom: 1px solid #eee;
line-height: 1.2;
padding: 0 0 8px;
margin-bottom: 1em;
&:not(:first-child) {
- margin-top: 2em;
+ margin-top: 2.5em;
}
}
.ugb-style-guide__section-subheading {
- font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
- font-size: 1.1em;
+ font-family: $guide-font-family;
+ font-size: 25.63px;
font-weight: 400;
margin-bottom: 1em;
+ color: #999;
&:not(:first-child) {
- margin-top: 1.5em;
+ margin-top: 2.5em;
}
}
- .ugb-style-guide__label {
- font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
- font-size: 1em;
- font-weight: 500;
+
+ // Color Schemes
+
+ .ugb-style-guide__color-container {
+ border-radius: 16px;
+ border: 1px solid #eee;
+ padding: 24px;
+ }
+
+ .ugb-style-guide__color-schemes {
+ gap: 20px;
+ margin-top: 20px;
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+
+ .ugb-style-guide__color-scheme-title {
+ margin: 0 0 48px;
+ }
+ }
+
+ .ugb-style-guide__color-scheme__subtitle {
+ font-size: 14.22px;
+ margin-bottom: 8px;
line-height: 1;
+ }
- p:first-child {
- margin: 0;
+ .ugb-style-guide__color-scheme__heading {
+ font-size: 28.83px;
+ font-weight: 600;
+ margin-bottom: 24px;
+ line-height: 1.2;
+ }
+
+ .ugb-style-guide__color-scheme__body {
+ font-size: 16px;
+ line-height: 1.6;
+ a:hover {
+ color: var(--hover-color) !important;
}
+ }
+
+ .ugb-style-guide__color-scheme__links {
+ display: flex;
+ gap: 16px;
+ margin-top: 24px;
+ }
- p:last-child {
- margin-top: 4px;
- margin-bottom: 0;
+ .ugb-style-guide__color-scheme__button,
+ .ugb-style-guide__color-scheme__button--outline {
+ padding: 12px 24px;
+ border: 0;
+ border-radius: 4px;
+ }
+ .ugb-style-guide__color-scheme__button {
+ &:hover {
+ background-color: var(--hover-background-color) !important;
+ color: var(--hover-color) !important;
+ }
+ }
+ .ugb-style-guide__color-scheme__button--outline {
+ background: transparent;
+ border-width: 2px;
+ border-style: solid;
+ &:hover {
+ border-color: var(--hover-border-color) !important;
+ color: var(--hover-color) !important;
}
}
+ .ugb-style-guide__color-scheme__colors {
+ margin-top: 16px;
+ p {
+ margin: 0;
+ line-height: 1.6;
+ font-size: 14.22px;
+ }
+ }
+
+ .ugb-style-guide__color-indicator {
+ border: 1px solid #eee;
+ width: 1em;
+ height: 1em;
+ border-radius: 100%;
+ display: inline-block;
+ vertical-align: middle;
+ margin: -4px 4px 0;
+ }
+
+ // Colors
+
.ugb-style-guide__colors {
gap: 20px;
margin-top: 20px;
@@ -54,18 +148,32 @@
flex-wrap: wrap;
.ugb-style-guide__column {
flex: 1 1 200px;
- height: 100px;
- border-radius: 10px;
- border: 1px solid #eee;
+ height: 130px;
display: flex;
align-items: flex-end;
- padding: 12px;
+ max-width: calc(50% - 10px);
}
}
+ .ugb-style-guide__color-label {
+ @include guide-titles;
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 1.2;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ }
}
-.ugb-style-guide-popover__title {
+.ugb-style-guide-popover__heading {
margin: 70px 70px 0;
+ .ugb-style-guide-popover__title {
+ margin-inline-end: 150px;
+ font-size: 39.81px;
+ }
+ .ugb-style-guide-popover__description {
+ max-width: 50%;
+ }
}
.ugb-style-guide__print-button {
@@ -83,10 +191,6 @@
margin-top: 10px;
}
- .ugb-style-guide__print-button {
- margin: -1em 70px 0 0;
- }
-
> .components-popover__content {
margin-top: 20px;
margin-left: 20px;
diff --git a/src/components/style-guide/index.js b/src/components/style-guide/index.js
index fe43f41524..4f8b6cfc2f 100644
--- a/src/components/style-guide/index.js
+++ b/src/components/style-guide/index.js
@@ -6,92 +6,233 @@ import { i18n } from 'stackable'
/**
* Internal dependencies
*/
-import { toPng } from 'html-to-image'
import { isDarkColor } from '~stackable/util'
/**
* WordPress dependencies
*/
-import { sprintf, __ } from '@wordpress/i18n'
-import {
- RawHTML, useRef, useState,
-} from '@wordpress/element'
-import { Icon, download as downloadIcon } from '@wordpress/icons'
-import { Button } from '@wordpress/components'
-import { createBlock, serialize } from '@wordpress/blocks'
+import { __ } from '@wordpress/i18n'
+// import { RawHTML } from '@wordpress/element'
+// import { createBlock, serialize } from '@wordpress/blocks'
export { default as StyleGuidePopover } from './popover'
+// DUMMY DATA
+const DUMMY_COLOR_SCHEMES = [
+ {
+ name: 'Base Color Scheme',
+ key: 'color-scheme-1',
+ backgroundColor: {
+ name: undefined,
+ color: '#EBE9E1',
+ hoverColor: undefined,
+ },
+ headingColor: {
+ name: undefined,
+ color: '#E43D12',
+ hoverColor: undefined,
+ },
+ textColor: {
+ name: undefined,
+ color: '#E43D12',
+ hoverColor: undefined,
+ },
+ linkColor: {
+ name: undefined,
+ color: '#EFB11D',
+ hoverColor: undefined,
+ },
+ accentColor: {
+ name: undefined,
+ color: '#FFA2B6',
+ hoverColor: undefined,
+ },
+ buttonColor: {
+ name: undefined,
+ color: '#D6536D',
+ hoverColor: '#E43D12',
+ },
+ buttonTextColor: {
+ name: undefined,
+ color: '#EBE9E1',
+ hoverColor: undefined,
+ },
+ buttonOutlineColor: {
+ name: undefined,
+ color: '#D6536D',
+ hoverColor: '#E43D12',
+ },
+ },
+ {
+ name: 'Background Color Scheme',
+ key: 'color-scheme-2',
+ backgroundColor: {
+ name: undefined,
+ color: '#E2E8FA',
+ hoverColor: undefined,
+ },
+ headingColor: {
+ name: undefined,
+ color: '#0A21C0',
+ hoverColor: undefined,
+ },
+ textColor: {
+ name: undefined,
+ color: '#050A44',
+ hoverColor: undefined,
+ },
+ linkColor: {
+ name: undefined,
+ color: '#2C2E3A',
+ hoverColor: undefined,
+ },
+ accentColor: {
+ name: undefined,
+ color: '#7988F7',
+ hoverColor: undefined,
+ },
+ buttonColor: {
+ name: undefined,
+ color: '#050A44',
+ hoverColor: '#E43D12',
+ },
+ buttonTextColor: {
+ name: undefined,
+ color: '#B3B4BD',
+ hoverColor: undefined,
+ },
+ buttonOutlineColor: {
+ name: undefined,
+ color: '#050A44',
+ hoverColor: undefined,
+ },
+ },
+]
+
+const LONG_TEXT = [
+ // Translators: This is placeholder text used in the style guide.
+ __( 'They didn\'t plan to build a life around shared walls and hand-me-down furniture, but somehow, it worked.', i18n ),
+ // Translators: This is placeholder text used in the style guide.
+ __( 'Morning routines bled into late-night talks, and even the silence felt familiar.', i18n ),
+ // Translators: This is placeholder text used in the style guide.
+ __( 'Careers shifted, relationships changed, and expectations rarely lined up with reality.', i18n ),
+ // Translators: This is placeholder text used in the style guide.
+ __( 'But there was always time for inside jokes, spontaneous distractions, and someone to show up, even without being asked.', i18n ),
+ // Translators: This is placeholder text used in the style guide.
+ __( 'Each of them brought something differentβquiet patience, loud opinions, unexpected wisdom.', i18n ),
+ // Translators: This is placeholder text used in the style guide.
+ __( 'Change arrived slowly, then all at once. Some said goodbye, some stayed longer, and some simply evolved.', i18n ),
+]
+
// TODO: This is not yet finished
const StyleGuide = props => {
const { designSystem } = props
- const { colors } = designSystem
-
- const styleGuideRef = useRef( null )
+ const {
+ colors,
+ colorSchemes = DUMMY_COLOR_SCHEMES,
+ contentRef = null,
+ } = designSystem
return (
<>
-
-
-
-
{ __( 'Colors', i18n ) }
-
{ __( 'Color Palette', i18n ) }
-
- { colors.map( ( color, key ) => {
- return
-
-
{ color.name }
-
{ color.color }
+
+
+
{ __( 'Colors', i18n ) }
+
+ { colorSchemes && <>
+
{ __( 'Color Schemes', i18n ) }
+
+ { colorSchemes.map( ( colorScheme, i ) => {
+ return (
+
+
+
{ colorScheme.name }
+ { /* TODO: Kae: the fonts and sizes here should be based on the design system */ }
+
{ __( 'Subtitle', i18n ) }
+
{ __( 'Headings', i18n ) }
+
+
+
+ { /* TODO: Kae: the button looks here should be based on the design system */ }
+
+
+
+
+
+
+
+
+
+
{ __( 'Background Color', i18n ) }{ `: ` }{ colorScheme.backgroundColor.name || colorScheme.backgroundColor.color }
+
{ __( 'Heading Color', i18n ) }{ `: ` }{ colorScheme.headingColor.name || colorScheme.headingColor.color }
+
{ __( 'Text Color', i18n ) }{ `: ` }{ colorScheme.textColor.name || colorScheme.textColor.color }
+
{ __( 'Link Color', i18n ) }{ `: ` }{ colorScheme.linkColor.name || colorScheme.linkColor.color }
+
{ __( 'Accent Color', i18n ) }{ `: ` }{ colorScheme.accentColor.name || colorScheme.accentColor.color }
+
{ __( 'Button Color', i18n ) }{ `: ` }{ colorScheme.buttonColor.name || colorScheme.buttonColor.color }
+
{ __( 'Button Text Color', i18n ) }{ `: ` }{ colorScheme.buttonTextColor.name || colorScheme.buttonTextColor.color }
+
{ __( 'Button Outline Color', i18n ) }{ `: ` }{ colorScheme.buttonOutlineColor.name || colorScheme.buttonOutlineColor.color }
+
+
+ )
+ } ) }
+
+ > }
+
+ { colors && <>
+
{ __( 'Global Color Palette', i18n ) }
+
+ { colors.map( ( color, key ) => {
+ return
+
+
{ color.name }
+
{ color.color }
+
-
- } ) }
-
+ } ) }
+
+ > }
-
{ __( 'Color Schemes', i18n ) }
+ { /* TODO: Kae: Also add the color scheme colors here */ }
-
{ __( 'Typography', i18n ) }
+
{ __( 'Typography', i18n ) }
-
{ __( 'Titles & Headings', i18n ) }
-
-
-
-
-
-
+ { __( 'Titles & Headings', i18n ) }
+ { __( 'Heading 1', i18n ) }
+ { __( 'Heading 2', i18n ) }
+ { __( 'Heading 3', i18n ) }
+ { __( 'Heading 4', i18n ) }
+ { __( 'Heading 5', i18n ) }
+ { __( 'Heading 6', i18n ) }
-
{ __( 'Body Text', i18n ) }
-
+
{ __( 'Body Text', i18n ) }
+
{ LONG_TEXT[ 0 ] } { LONG_TEXT[ 1 ] }
+
{ LONG_TEXT[ 2 ] } { LONG_TEXT[ 3 ] }
@@ -102,52 +243,18 @@ const StyleGuide = props => {
export default StyleGuide
-const ExportButton = props => {
- const { printRef } = props
- const [ isExporting, setIsExporting ] = useState( false )
-
- const handlePrint = () => {
- setIsExporting( true )
- toPng( printRef.current, { cacheBust: true } )
- .then( dataUrl => {
- const link = document.createElement( 'a' )
- link.download = 'style-guide.png'
- link.href = dataUrl
- link.click()
- setIsExporting( false )
- } )
- .catch( err => {
- alert( sprintf( __( 'Error exporting style guide: %s', i18n ), err.message || err ) ) // eslint-disable-line no-alert
- setIsExporting( false )
- } )
- }
-
- return (
-
}
- isBusy={ isExporting }
- disabled={ isExporting }
- >
- { __( 'Export', i18n ) }
-
- )
-}
-
-const RenderBlock = props => {
- const {
- blockName, attributes, innerBlocks,
- } = props
+// const RenderBlock = props => {
+// const {
+// blockName, attributes, innerBlocks,
+// } = props
- return (
-
- { serialize( createBlock(
- blockName,
- attributes,
- innerBlocks
- ) ) }
-
- )
-}
+// return (
+//
+// { serialize( createBlock(
+// blockName,
+// attributes,
+// innerBlocks
+// ) ) }
+//
+// )
+// }
diff --git a/src/components/style-guide/popover.js b/src/components/style-guide/popover.js
index 9162d483d6..8738e36484 100644
--- a/src/components/style-guide/popover.js
+++ b/src/components/style-guide/popover.js
@@ -7,18 +7,24 @@ import { i18n } from 'stackable'
* Internal dependencies
*/
import { StyleGuide } from '~stackable/components'
+import { toPng } from 'html-to-image'
/**
* WordPress dependencies
*/
-import { __ } from '@wordpress/i18n'
-import { useMemo } from '@wordpress/element'
+import { __, sprintf } from '@wordpress/i18n'
+import {
+ useMemo, useState, useRef,
+} from '@wordpress/element'
import { Popover, Button } from '@wordpress/components'
-import { Icon, close as closeIcon } from '@wordpress/icons'
+import {
+ Icon, close as closeIcon, download as downloadIcon,
+} from '@wordpress/icons'
import { useDesignSystem } from '~stackable/hooks'
const StyleGuidePopover = props => {
const { onClose } = props
+ const styleGuideRef = useRef( null )
// On load, look for the .interface-interface-skeleton__content and position over it.
const [ editorStylesWrapper, width, height ] = useMemo( () => {
@@ -44,10 +50,50 @@ const StyleGuidePopover = props => {
>
-
{ __( 'Design System Style Guide', i18n ) }
-
+
+
+
{ __( 'Design System Style Guide', i18n ) }
+
+ { __( 'Welcome to your Style Guide! Here you can see a live preview of your design system in action. Any changes you make to your design settings will instantly update here.', i18n ) }
+
+
+
)
}
export default StyleGuidePopover
+
+const ExportButton = props => {
+ const { printRef } = props
+ const [ isExporting, setIsExporting ] = useState( false )
+
+ const handlePrint = () => {
+ setIsExporting( true )
+ toPng( printRef.current, { cacheBust: true } )
+ .then( dataUrl => {
+ const link = document.createElement( 'a' )
+ link.download = 'style-guide.png'
+ link.href = dataUrl
+ link.click()
+ setIsExporting( false )
+ } )
+ .catch( err => {
+ alert( sprintf( __( 'Error exporting style guide: %s', i18n ), err.message || err ) ) // eslint-disable-line no-alert
+ setIsExporting( false )
+ } )
+ }
+
+ return (
+
}
+ isBusy={ isExporting }
+ disabled={ isExporting }
+ >
+ { __( 'Export', i18n ) }
+
+ )
+}
From fe122d01d5b096fd4e562088b28a6e2895c7905b Mon Sep 17 00:00:00 2001
From: "bfintal@gmail.com" <>
Date: Thu, 7 Aug 2025 09:09:20 +0800
Subject: [PATCH 24/78] updated typography
---
src/components/style-guide/editor.scss | 42 +++++--
src/components/style-guide/index.js | 152 ++++++++++++++++++++++---
2 files changed, 173 insertions(+), 21 deletions(-)
diff --git a/src/components/style-guide/editor.scss b/src/components/style-guide/editor.scss
index 1db722b6bf..c8eedba446 100644
--- a/src/components/style-guide/editor.scss
+++ b/src/components/style-guide/editor.scss
@@ -25,16 +25,14 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
.ugb-style-guide__columns {
display: grid;
grid-template-columns: 1fr 1fr;
- gap: 50px;
+ gap: 24px;
}
.ugb-style-guide__section-title {
font-family: $guide-font-family;
font-size: 32.44px;
font-weight: 700;
- border-bottom: 1px solid #eee;
line-height: 1.2;
- padding: 0 0 8px;
margin-bottom: 1em;
&:not(:first-child) {
margin-top: 2.5em;
@@ -47,6 +45,9 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
font-weight: 400;
margin-bottom: 1em;
color: #999;
+ border-bottom: 1px solid #eee;
+ margin-bottom: 32px;
+ padding: 0 0 16px;
&:not(:first-child) {
margin-top: 2.5em;
}
@@ -61,8 +62,8 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
}
.ugb-style-guide__color-schemes {
- gap: 20px;
- margin-top: 20px;
+ gap: 24px;
+ margin-top: 24px;
display: grid;
grid-template-columns: repeat(3, 1fr);
@@ -142,8 +143,8 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
// Colors
.ugb-style-guide__colors {
- gap: 20px;
- margin-top: 20px;
+ gap: 25px;
+ margin-top: 24px;
display: flex;
flex-wrap: wrap;
.ugb-style-guide__column {
@@ -164,6 +165,33 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
flex-direction: column;
gap: 4px;
}
+
+ // Typography
+
+ .ugb-style-guide__typography-headings {
+ grid-template-columns: 1fr 1fr 1fr;
+ }
+
+ .ugb-style-guide__typography-container {
+ margin: 32px 0;
+ > *:not(div) {
+ line-height: 1;
+ margin: 0 !important;
+ }
+ }
+
+ .ugb-style-guide__typography-body {
+ .ugb-style-guide__column:first-child {
+ grid-column: 1 / 3;
+ max-width: 80%;
+ }
+ }
+
+ .ugb-style-guide__typography-label {
+ font-size: 14.22px;
+ color: #bbb;
+ margin-top: 8px;
+ }
}
.ugb-style-guide-popover__heading {
margin: 70px 70px 0;
diff --git a/src/components/style-guide/index.js b/src/components/style-guide/index.js
index 4f8b6cfc2f..99d7d2470d 100644
--- a/src/components/style-guide/index.js
+++ b/src/components/style-guide/index.js
@@ -126,12 +126,11 @@ const LONG_TEXT = [
// TODO: This is not yet finished
const StyleGuide = props => {
- const { designSystem } = props
+ const { designSystem, contentRef = null } = props
const {
colors,
colorSchemes = DUMMY_COLOR_SCHEMES,
- contentRef = null,
} = designSystem
return (
@@ -141,6 +140,7 @@ const StyleGuide = props => {
{ __( 'Colors', i18n ) }
+ { /* TODO: Kae: the color schemes should always output at least 2 entries: 1 base color scheme and 1 background color scheme even at their default states. */ }
{ colorSchemes && <>
{ __( 'Color Schemes', i18n ) }
@@ -202,7 +202,7 @@ const StyleGuide = props => {
> }
- { colors && <>
+ { !! colors.length && <>
{ __( 'Global Color Palette', i18n ) }
{ colors.map( ( color, key ) => {
@@ -219,20 +219,144 @@ const StyleGuide = props => {
{ /* TODO: Kae: Also add the color scheme colors here */ }
{ __( 'Typography', i18n ) }
-
+
+
+
+
{ __( 'Desktop', i18n ) }
+
+
{ __( 'Heading 1', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 2', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 3', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 4', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 5', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 6', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Body', i18n ) }
+
System Font / Normal / 16px
+
+
+
{ __( 'Subtitle', i18n ) }
+
System Font / Normal / 16px
+
+
+
{ __( 'Button', i18n ) }
+
System Font / Bold / 16px
+
+
+
+
+
{ __( 'Tablet', i18n ) }
+
+
{ __( 'Heading 1', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 2', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 3', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 4', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 5', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 6', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Body', i18n ) }
+
System Font / Normal / 16px
+
+
+
{ __( 'Subtitle', i18n ) }
+
System Font / Normal / 16px
+
+
+
{ __( 'Button', i18n ) }
+
System Font / Bold / 16px
+
+
+
+
+
{ __( 'Mobile', i18n ) }
+
+
{ __( 'Heading 1', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 2', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 3', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 4', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 5', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Heading 6', i18n ) }
+
DM Sans / Bold / 36px
+
+
+
{ __( 'Body', i18n ) }
+
System Font / Normal / 16px
+
+
+
{ __( 'Subtitle', i18n ) }
+
System Font / Normal / 16px
+
+
+
{ __( 'Button', i18n ) }
+
System Font / Bold / 16px
+
+
+
+
+
+
+
{ __( 'Desktop', i18n ) }
+
{ __( 'Built on the Moments Between', i18n ) }
+
{ LONG_TEXT[ 0 ] } { LONG_TEXT[ 1 ] } { LONG_TEXT[ 2 ] }
+
-
{ __( 'Titles & Headings', i18n ) }
-
{ __( 'Heading 1', i18n ) }
-
{ __( 'Heading 2', i18n ) }
-
{ __( 'Heading 3', i18n ) }
-
{ __( 'Heading 4', i18n ) }
-
{ __( 'Heading 5', i18n ) }
-
{ __( 'Heading 6', i18n ) }
+
{ __( 'Tablet', i18n ) }
+
{ __( 'Built on the Moments Between', i18n ) }
+
{ LONG_TEXT[ 1 ] } { LONG_TEXT[ 2 ] } { LONG_TEXT[ 3 ] }
-
{ __( 'Body Text', i18n ) }
-
{ LONG_TEXT[ 0 ] } { LONG_TEXT[ 1 ] }
-
{ LONG_TEXT[ 2 ] } { LONG_TEXT[ 3 ] }
+
{ __( 'Mobile', i18n ) }
+
{ __( 'Built on the Moments Between', i18n ) }
+
{ LONG_TEXT[ 2 ] } { LONG_TEXT[ 1 ] } { LONG_TEXT[ 2 ] }
From 3cc4f77e9838eae6b1706d6131142bf4d8b1849c Mon Sep 17 00:00:00 2001
From: "bfintal@gmail.com" <>
Date: Thu, 7 Aug 2025 14:19:14 +0800
Subject: [PATCH 25/78] added getting started
---
plugin.php | 1 +
src/components/guided-modal-tour/index.js | 47 ++++++++++-
.../guided-modal-tour/tour-steps.js | 81 ++++++++++++-------
.../guided-modal-tour/tour-trigger.js | 40 +++++++++
src/components/modal-design-library/modal.js | 2 +-
.../design-library-button.js | 2 +-
src/plugins/global-settings/index.js | 2 +-
src/welcome/getting-started.js | 38 +++++++--
src/welcome/getting-started.php | 58 +++++++++++++
src/welcome/getting-started.scss | 33 +++++++-
src/welcome/images/check.svg | 1 +
11 files changed, 265 insertions(+), 40 deletions(-)
create mode 100644 src/components/guided-modal-tour/tour-trigger.js
create mode 100644 src/welcome/getting-started.php
create mode 100644 src/welcome/images/check.svg
diff --git a/plugin.php b/plugin.php
index a5ef877083..292ea99bb4 100644
--- a/plugin.php
+++ b/plugin.php
@@ -269,6 +269,7 @@ function is_frontend() {
/**
* Welcome screen.
*/
+require_once( plugin_dir_path( __FILE__ ) . 'src/welcome/getting-started.php' );
if ( is_admin() ) {
require_once( plugin_dir_path( __FILE__ ) . 'src/welcome/index.php' );
require_once( plugin_dir_path( __FILE__ ) . 'src/welcome/news.php' );
diff --git a/src/components/guided-modal-tour/index.js b/src/components/guided-modal-tour/index.js
index 984759f366..1eeace1ed3 100644
--- a/src/components/guided-modal-tour/index.js
+++ b/src/components/guided-modal-tour/index.js
@@ -2,13 +2,14 @@
* Internal dependencies
*/
import { TOUR_STEPS } from './tour-steps'
+import './tour-trigger'
/**
* External dependencies
*/
import {
i18n,
- guidedTourStates, // TODO: This doesn't exist yet. The state should be loaded here from localize values, this should be an object with the tour ID as the key and the state as the value.
+ guidedTourStates,
} from 'stackable'
import classNames from 'classnames'
import confetti from 'canvas-confetti'
@@ -19,6 +20,7 @@ import confetti from 'canvas-confetti'
import {
Modal, Flex, Button,
} from '@wordpress/components'
+import { models } from '@wordpress/api'
import { __ } from '@wordpress/i18n'
import {
Icon, arrowRight, arrowLeft, info,
@@ -36,7 +38,10 @@ const GuidedModalTour = props => {
} = props
// On mount, check if the tour has been completed, if so, don't show it.
- const [ isDone, setIsDone ] = useState( guidedTourStates?.[ tourId ] )
+ const [ isDone, setIsDone ] = useState( guidedTourStates.includes( tourId ) )
+
+ // We need this to prevent the tour from being shown again if it's just completed.
+ const [ justCompleted, setJustCompleted ] = useState( false )
const {
steps = [],
@@ -44,6 +49,10 @@ const GuidedModalTour = props => {
hasConfetti = true,
} = TOUR_STEPS[ tourId ]
+ if ( justCompleted ) {
+ return null
+ }
+
// If there is a condition, check if it's met, if not, don't show the tour.
// condition can be true, false, or null. true will show the tour (even if
// it's already done), false will not show the tour, null will show the tour
@@ -65,8 +74,23 @@ const GuidedModalTour = props => {
steps={ steps }
hasConfetti={ hasConfetti }
onClose={ () => {
- // TODO: Save the tour state to the database that we finished it.
setIsDone( true )
+ setJustCompleted( true )
+
+ // Update the stackable_guided_tour_states setting
+ if ( ! guidedTourStates.includes( tourId ) ) {
+ // eslint-disable-next-line camelcase
+ const settings = new models.Settings( { stackable_guided_tour_states: [ ...guidedTourStates, tourId ] } )
+ settings.save()
+ }
+
+ // Soft update the global variable to prevent the tour from being shown again.
+ guidedTourStates.push( tourId )
+
+ // Remove the "tour" GET parameter from the URL so conditions won't get triggered again.
+ const url = new URL( window.location.href )
+ url.searchParams.delete( 'tour' )
+ window.history.replaceState( null, '', url.toString() )
} }
/>
}
@@ -331,6 +355,21 @@ const ModalTour = props => {
}
}, [ glowTarget, currentStep, isVisible, isVisibleDelayed, isTransitioning, forceRefresh ] )
+ // When unmounted, do not call onClose. So we need to do this handler on our own.
+ useEffect( () => {
+ const handleHeaderClick = () => {
+ onClose()
+ }
+ if ( modalRef.current ) {
+ modalRef.current.querySelector( '.components-modal__header' ).addEventListener( 'click', handleHeaderClick )
+ }
+ return () => {
+ if ( modalRef.current ) {
+ modalRef.current.querySelector( '.components-modal__header' ).removeEventListener( 'click', handleHeaderClick )
+ }
+ }
+ }, [ modalRef.current, onClose ] )
+
if ( ! isVisible ) {
return null
}
@@ -341,7 +380,7 @@ const ModalTour = props => {
overlayClassName="ugb-tour-modal--overlay"
shouldCloseOnClickOutside={ false }
size={ size }
- onRequestClose={ onClose }
+ // onRequestClose={ onClose } // Do not use onRequestClose, it will cause the tour finish
className={ classNames( 'ugb-tour-modal', `ugb-tour-modal--${ position }`, {
'ugb-tour-modal--visible': isVisible,
'ugb-tour-modal--visible-delayed': isVisibleDelayed,
diff --git a/src/components/guided-modal-tour/tour-steps.js b/src/components/guided-modal-tour/tour-steps.js
index e870548ddd..ddcbced700 100644
--- a/src/components/guided-modal-tour/tour-steps.js
+++ b/src/components/guided-modal-tour/tour-steps.js
@@ -47,7 +47,33 @@ import { createInterpolateElement } from '@wordpress/element'
*/
export const TOUR_STEPS = {
- 'design-system-welcome': {
+ editor: {
+ hasConfetti: false,
+ condition: () => { // If provided, true will show the tour (even if it's already done), false will not show the tour, null will show the tour only once.
+ // Do not show the tour if there is a GET parameter that shows another tour.
+ return window?.location?.search?.includes( 'tour=' ) ? false : null
+ },
+ steps: [
+ {
+ title: 'π ' + __( 'Welcome to Stackable', i18n ),
+ description: __( 'We\'re excited to have you here. Let\'s get you started by opening the Design Library.', i18n ),
+ help: createInterpolateElement( __( 'Click the
Design Library button to continue.', i18n ), {
+ strong:
,
+ } ),
+ // size: 'medium',
+ anchor: '.ugb-insert-library-button',
+ position: 'bottom',
+ nextEventTarget: '.ugb-insert-library-button',
+ glowTarget: '.ugb-insert-library-button',
+ showNext: false,
+ },
+ ],
+ },
+ 'design-system': {
+ condition: () => { // If provided, true will show the tour (even if it's already done), false will not show the tour, null will show the tour only once.
+ // Force show the tour if there is a GET parameter tour=design-system
+ return window?.location?.search?.includes( 'tour=design-system' ) ? true : null
+ },
steps: [
{
title: 'π ' + __( 'Welcome to Your Design System', i18n ),
@@ -77,33 +103,10 @@ export const TOUR_STEPS = {
// TODO: this is not yet finished
],
},
- 'editor-welcome': {
- hasConfetti: false,
- condition: () => { // If provided, true will show the tour (even if it's already done), false will not show the tour, null will show the tour only once.
- // Do not show the tour if there is a GET parameter that shows another tour.
- return window?.location?.search?.includes( 'tour=' ) ? false : null
- },
- steps: [
- {
- title: 'π ' + __( 'Welcome to Stackable', i18n ),
- description: __( 'We\'re excited to have you here. Let\'s get you started by opening the Design Library.', i18n ),
- help: createInterpolateElement( __( 'Click the
Design Library button to continue.', i18n ), {
- strong:
,
- } ),
- // size: 'medium',
- anchor: '.ugb-insert-library-button',
- position: 'bottom',
- nextEventTarget: '.ugb-insert-library-button',
- glowTarget: '.ugb-insert-library-button',
- showNext: false,
- },
- ],
- },
- 'design-library-welcome': {
+ 'design-library': {
condition: () => { // If provided, true will show the tour (even if it's already done), false will not show the tour, null will show the tour only once.
- // TODO: The new quick button in the getting started area should open the editor with `tour=design-library-welcome`
- // Force show the tour if there is a GET parameter tour=design-library-welcome
- return window?.location?.search?.includes( 'tour=design-library-welcome' ) ? true : null
+ // Force show the tour if there is a GET parameter tour=design-library
+ return window?.location?.search?.includes( 'tour=design-library' ) ? true : null
},
steps: [
{
@@ -169,4 +172,28 @@ export const TOUR_STEPS = {
},
],
},
+ 'site-kit': {
+ condition: () => { // If provided, true will show the tour (even if it's already done), false will not show the tour, null will show the tour only once.
+ // Force show the tour if there is a GET parameter tour=site-kit
+ return window?.location?.search?.includes( 'tour=site-kit' ) ? true : null
+ },
+ steps: [
+ {
+ title: 'π ' + __( 'Welcome to Site Kits', i18n ),
+ description: '', // Not yet available.
+ },
+ ],
+ },
+ 'design-system-picker': {
+ condition: () => { // If provided, true will show the tour (even if it's already done), false will not show the tour, null will show the tour only once.
+ // Force show the tour if there is a GET parameter tour=design-system-picker
+ return window?.location?.search?.includes( 'tour=design-system-picker' ) ? true : null
+ },
+ steps: [
+ {
+ title: 'π ' + __( 'Welcome to The Design System Picker', i18n ),
+ description: '', // Not yet available.
+ },
+ ],
+ },
}
diff --git a/src/components/guided-modal-tour/tour-trigger.js b/src/components/guided-modal-tour/tour-trigger.js
new file mode 100644
index 0000000000..ffcfbfd8ca
--- /dev/null
+++ b/src/components/guided-modal-tour/tour-trigger.js
@@ -0,0 +1,40 @@
+/**
+ * This is a plugin that triggers a guided modal tour.
+ * It is used to trigger a guided modal tour when a user visits a page with a GET parameter `tour=tourId`.
+ * This is also in charge of clicking/opening things needed for the tour.
+ */
+
+import { registerPlugin } from '@wordpress/plugins'
+import { useEffect } from '@wordpress/element'
+import { dispatch } from '@wordpress/data'
+
+const TourTrigger = () => {
+ useEffect( () => {
+ // Check th
+ const tourId = window?.location?.search?.includes( 'tour=' ) ? window?.location?.search?.split( 'tour=' )[ 1 ] : null
+ switch ( tourId ) {
+ case 'editor':
+ // When the editor tour is to be shown, no need to do anything here.
+ break
+ case 'design-library':
+ // When the design library tour is to be shown, simluate a click on the design library button.
+ setTimeout( () => {
+ document.querySelector( '.ugb-insert-library-button' )?.click()
+ }, 500 )
+ break
+ case 'design-system':
+ // When the design system tour is to be shown, open the sidebar
+ setTimeout( () => {
+ dispatch( 'core/edit-post' )?.openGeneralSidebar( 'stackable-global-settings/sidebar' ) // For Block Editor
+ }, 500 )
+ }
+ }, [] )
+
+ return null
+}
+
+registerPlugin( 'stackable-guided-modal-tour-trigger', {
+ render: TourTrigger,
+ icon: () => null,
+ showInSidebar: false,
+} )
diff --git a/src/components/modal-design-library/modal.js b/src/components/modal-design-library/modal.js
index 0a7b718768..e3bd8094f1 100644
--- a/src/components/modal-design-library/modal.js
+++ b/src/components/modal-design-library/modal.js
@@ -217,7 +217,7 @@ export const ModalDesignLibrary = props => {
>
-
+
@@ -165,7 +183,12 @@ export const GettingStarted = () => {
{ __( 'Pick a ready-made website template to kickstart your project β fully built layouts and styles, just swap in your content.', i18n ) }
@@ -181,7 +204,12 @@ export const GettingStarted = () => {
{ __( 'Browse curated Design System presets β apply a professional look instantly without building from scratch.', i18n ) }
diff --git a/src/welcome/getting-started.php b/src/welcome/getting-started.php
new file mode 100644
index 0000000000..d6f3f71c74
--- /dev/null
+++ b/src/welcome/getting-started.php
@@ -0,0 +1,58 @@
+ 'array',
+ 'description' => __( 'An array of strings representing completed block tours.', STACKABLE_I18N ),
+ 'sanitize_callback' => array( $this, 'sanitize_array_setting' ),
+ 'show_in_rest' => array(
+ 'schema' => array(
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ ),
+ ),
+ 'default' => array(),
+ )
+ );
+ }
+
+ public function sanitize_array_setting( $input ) {
+ return array_map( 'sanitize_text_field', $input );
+ }
+
+ public function add_localize_script( $args ) {
+ $args['guidedTourStates'] = get_option( 'stackable_guided_tour_states', array() );
+ return $args;
+ }
+ }
+
+ new Stackable_Getting_Started_Screen();
+}
\ No newline at end of file
diff --git a/src/welcome/getting-started.scss b/src/welcome/getting-started.scss
index 74e19c30fb..51aa539429 100644
--- a/src/welcome/getting-started.scss
+++ b/src/welcome/getting-started.scss
@@ -202,7 +202,7 @@
}
.s-divider {
- width: 250px;
+ width: 150px;
margin: 64px auto;
display: block;
}
@@ -320,4 +320,35 @@ body.settings_page_stackable-getting-started .s-body-container > .s-getting-star
font-family: Rockwell, "Rockwell Nova", "Roboto Slab", "DejaVu Serif", "Sitka Small", serif;
}
}
+
+ .s-quick-button-toggle-indicator {
+ width: 18px;
+ display: inline-block;
+ background: #0000002b;
+ border-radius: 100%;
+ height: 18px;
+ vertical-align: middle;
+ margin-inline: -8px 12px;
+ margin-top: -3px;
+ box-sizing: border-box;
+ position: relative;
+ svg {
+ position: absolute;
+ fill: #23ff8a;
+ top: -4px;
+ left: -1px;
+ filter: drop-shadow(1px 1px 2px #0006);
+ }
+ }
+ .s-button:not(.s-button--checked) {
+ .s-quick-button-toggle-indicator svg {
+ display: none;
+ }
+ }
+ .s-button.s-button--checked {
+ background: #555 !important;
+ .s-quick-button-toggle-indicator {
+ background: #0000004f;
+ }
+ }
}
diff --git a/src/welcome/images/check.svg b/src/welcome/images/check.svg
new file mode 100644
index 0000000000..babf439f50
--- /dev/null
+++ b/src/welcome/images/check.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
From 6aa1c50e014b583989d97cb0735e3ff646d947ab Mon Sep 17 00:00:00 2001
From: "bfintal@gmail.com" <>
Date: Thu, 7 Aug 2025 14:22:37 +0800
Subject: [PATCH 26/78] make sure style guide doesn't overlap with design
system popovers
---
src/components/style-guide/editor.scss | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/components/style-guide/editor.scss b/src/components/style-guide/editor.scss
index c8eedba446..9617a30ee3 100644
--- a/src/components/style-guide/editor.scss
+++ b/src/components/style-guide/editor.scss
@@ -209,6 +209,7 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
}
.ugb-style-guide-popover {
box-shadow: rgba(50, 50, 93, 0.25) 0px 30px 60px -12px, rgba(0, 0, 0, 0.3) 0px 18px 36px -18px;
+ z-index: 100000;
.ugb-style-guide-popover__close-button {
height: 40px;
From b3678f044a94a520c2f4576cab551e1b6d267496 Mon Sep 17 00:00:00 2001
From: "bfintal@gmail.com" <>
Date: Thu, 7 Aug 2025 14:50:24 +0800
Subject: [PATCH 27/78] fixed ui of color schemes
---
src/components/style-guide/editor.scss | 41 +++++++++++++++++++++-----
src/components/style-guide/index.js | 13 +++++++-
src/components/style-guide/popover.js | 2 +-
3 files changed, 47 insertions(+), 9 deletions(-)
diff --git a/src/components/style-guide/editor.scss b/src/components/style-guide/editor.scss
index 9617a30ee3..c35d0c25b7 100644
--- a/src/components/style-guide/editor.scss
+++ b/src/components/style-guide/editor.scss
@@ -47,28 +47,56 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
color: #999;
border-bottom: 1px solid #eee;
margin-bottom: 32px;
- padding: 0 0 16px;
+ padding: 0 0 0.5em;
&:not(:first-child) {
margin-top: 2.5em;
}
}
+ .ugb-style-guide__section-subheading--small {
+ font-family: $guide-font-family;
+ font-size: 16px;
+ font-weight: 400;
+ color: #999;
+ border-bottom: 1px solid #eee;
+ margin-bottom: 0.5em;
+ padding: 0 0 0.25em;
+ margin-top: 0;
+ &:not(:first-child) {
+ margin-top: 1.5em;
+ }
+ }
+
// Color Schemes
.ugb-style-guide__color-container {
border-radius: 16px;
border: 1px solid #eee;
padding: 24px;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .ugb-style-guide__color-scheme {
+ position: sticky;
+ top: 0;
}
.ugb-style-guide__color-schemes {
gap: 24px;
- margin-top: 24px;
display: grid;
- grid-template-columns: repeat(3, 1fr);
+ grid-template-columns: 1fr;
.ugb-style-guide__color-scheme-title {
- margin: 0 0 48px;
+ margin: 0;
+ grid-column: 1 / 3;
+ }
+
+ .ugb-style-guide__column {
+ display: grid;
+ grid-template-columns: 1fr 300px;
+ gap: 24px;
+ align-items: flex-start;
}
}
@@ -81,7 +109,7 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
.ugb-style-guide__color-scheme__heading {
font-size: 28.83px;
font-weight: 600;
- margin-bottom: 24px;
+ margin-bottom: 16px;
line-height: 1.2;
}
@@ -96,7 +124,7 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
.ugb-style-guide__color-scheme__links {
display: flex;
gap: 16px;
- margin-top: 24px;
+ margin-top: 32px;
}
.ugb-style-guide__color-scheme__button,
@@ -122,7 +150,6 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
}
.ugb-style-guide__color-scheme__colors {
- margin-top: 16px;
p {
margin: 0;
line-height: 1.6;
diff --git a/src/components/style-guide/index.js b/src/components/style-guide/index.js
index 99d7d2470d..37f222016f 100644
--- a/src/components/style-guide/index.js
+++ b/src/components/style-guide/index.js
@@ -147,8 +147,8 @@ const StyleGuide = props => {
{ colorSchemes.map( ( colorScheme, i ) => {
return (
+
{ colorScheme.name }
-
{ colorScheme.name }
{ /* TODO: Kae: the fonts and sizes here should be based on the design system */ }
{ __( 'Subtitle', i18n ) }
{ __( 'Headings', i18n ) }
@@ -157,6 +157,8 @@ const StyleGuide = props => {
{ LONG_TEXT[ i % 6 ] }
{ LONG_TEXT[ ( i + 1 ) % 6 ] }
+
+ { LONG_TEXT[ ( i + 2 ) % 6 ] }
{ /* eslint-disable-next-line jsx-a11y/anchor-is-valid */ }
e.preventDefault() } style={ {
@@ -187,6 +189,7 @@ const StyleGuide = props => {
+
{ __( 'Base Colors', i18n ) }
{ __( 'Background Color', i18n ) }{ `: ` }{ colorScheme.backgroundColor.name || colorScheme.backgroundColor.color }
{ __( 'Heading Color', i18n ) }{ `: ` }{ colorScheme.headingColor.name || colorScheme.headingColor.color }
{ __( 'Text Color', i18n ) }{ `: ` }{ colorScheme.textColor.name || colorScheme.textColor.color }
@@ -195,6 +198,14 @@ const StyleGuide = props => {
{ __( 'Button Color', i18n ) }{ `: ` }{ colorScheme.buttonColor.name || colorScheme.buttonColor.color }
{ __( 'Button Text Color', i18n ) }{ `: ` }{ colorScheme.buttonTextColor.name || colorScheme.buttonTextColor.color }
{ __( 'Button Outline Color', i18n ) }{ `: ` }{ colorScheme.buttonOutlineColor.name || colorScheme.buttonOutlineColor.color }
+
{ __( 'Hover Colors', i18n ) }
+
{ __( 'Button Color', i18n ) }{ `: ` }{ colorScheme.buttonColor.name || colorScheme.buttonColor.color }
+
{ __( 'Button Text Color', i18n ) }{ `: ` }{ colorScheme.buttonTextColor.name || colorScheme.buttonTextColor.color }
+
{ __( 'Button Outline Color', i18n ) }{ `: ` }{ colorScheme.buttonOutlineColor.name || colorScheme.buttonOutlineColor.color }
+
{ __( 'Parent Hovered Colors', i18n ) }
+
{ __( 'Background Color', i18n ) }{ `: ` }{ colorScheme.backgroundColor.name || colorScheme.backgroundColor.color }
+
{ __( 'Heading Color', i18n ) }{ `: ` }{ colorScheme.headingColor.name || colorScheme.headingColor.color }
+
{ __( 'Text Color', i18n ) }{ `: ` }{ colorScheme.textColor.name || colorScheme.textColor.color }
)
diff --git a/src/components/style-guide/popover.js b/src/components/style-guide/popover.js
index 8738e36484..3d3a587a3f 100644
--- a/src/components/style-guide/popover.js
+++ b/src/components/style-guide/popover.js
@@ -93,7 +93,7 @@ const ExportButton = props => {
isBusy={ isExporting }
disabled={ isExporting }
>
- { __( 'Export', i18n ) }
+ { __( 'Export as Image', i18n ) }
)
}
From 0e8409a269d8f7266047ae862e883cc2d70e70e6 Mon Sep 17 00:00:00 2001
From: "bfintal@gmail.com" <>
Date: Thu, 7 Aug 2025 14:53:20 +0800
Subject: [PATCH 28/78] fix color text alignment
---
src/components/style-guide/editor.scss | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/components/style-guide/editor.scss b/src/components/style-guide/editor.scss
index c35d0c25b7..6758c2df23 100644
--- a/src/components/style-guide/editor.scss
+++ b/src/components/style-guide/editor.scss
@@ -73,8 +73,10 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
border-radius: 16px;
border: 1px solid #eee;
padding: 24px;
- display: flex;
- flex-direction: column;
+ &.ugb-style-guide__color-scheme {
+ display: flex;
+ flex-direction: column;
+ }
}
.ugb-style-guide__color-scheme {
From 02490b374ac4a3af229d8cb5ec76e24708215d49 Mon Sep 17 00:00:00 2001
From: "bfintal@gmail.com" <>
Date: Thu, 7 Aug 2025 16:48:57 +0800
Subject: [PATCH 29/78] complete style guide
---
.config/rules.js | 2 +-
src/components/style-guide/editor.scss | 105 ++++++++++++++++++
.../style-guide/images/hero-bg.webp | Bin 0 -> 101176 bytes
.../style-guide/images/media-text.webp | Bin 0 -> 40702 bytes
src/components/style-guide/images/readme.txt | 2 +
src/components/style-guide/index.js | 88 ++++++++++++++-
6 files changed, 195 insertions(+), 2 deletions(-)
create mode 100644 src/components/style-guide/images/hero-bg.webp
create mode 100644 src/components/style-guide/images/media-text.webp
create mode 100644 src/components/style-guide/images/readme.txt
diff --git a/.config/rules.js b/.config/rules.js
index 33e1cd2f12..7396bef40b 100644
--- a/.config/rules.js
+++ b/.config/rules.js
@@ -39,7 +39,7 @@ module.exports = [
],
},
{
- test: /\.(png|jpg|gif)$/,
+ test: /\.(png|jpg|gif|webp)$/,
use: [
{
loader: 'file-loader',
diff --git a/src/components/style-guide/editor.scss b/src/components/style-guide/editor.scss
index 6758c2df23..3ecd284fcb 100644
--- a/src/components/style-guide/editor.scss
+++ b/src/components/style-guide/editor.scss
@@ -221,6 +221,111 @@ $guide-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Ro
color: #bbb;
margin-top: 8px;
}
+
+ // Web Elements
+
+ .ugb-style-guide__elements {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 24px;
+ }
+
+ .ugb-style-guide__elements__images img {
+ width: 60%;
+ height: auto;
+ }
+
+ // Design System Preview
+
+ .ugb-style-guide__preview {
+ border-radius: 16px;
+ overflow: hidden;
+ box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;
+ }
+
+ .ugb-style-guide__preview-mock-browser {
+ background: #222;
+ padding: 8px 16px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ }
+ .ugb-style-guide__preview-mock-browser__buttons {
+ display: flex;
+ gap: 8px;
+ inset-inline-start: 16px;
+ position: absolute;
+ }
+ .ugb-style-guide__preview-mock-browser__button {
+ height: 10px;
+ width: 10px;
+ background: #999;
+ border-radius: 100%;
+ }
+ .ugb-style-guide__preview-mock-browser__url {
+ font-size: 12px;
+ color: #888;
+ }
+ .ugb-style-guide__preview-mock-browser__resize-handle {
+ inset-inline-start: 16px;
+ }
+
+ .ugb-style-guide__preview-hero {
+ // Fade the background image
+ background: linear-gradient(to bottom, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7)), var(--bg-image);
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+ // TODO: These should all be the design system: background padding.
+ padding: 100px 50px;
+ text-align: center;
+ color: #fff;
+ }
+
+ .ugb-style-guide__preview-content {
+ padding: 50px;
+ // TODO: These should all be the design system: background padding.
+ > h2,
+ p {
+ text-align: center;
+ }
+ }
+ .ugb-style-guide__preview-content__grid {
+ margin-top: 36px;
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ // TODO: These should all be the design system
+ gap: 24px;
+ }
+
+ .ugb-style-guide__preview-content__grid-item {
+ text-align: center;
+ // TODO: These should all be the design system for containers
+ background: #fff;
+ padding: 24px;
+ box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;
+ }
+
+ .ugb-style-guide__preview-content-2 {
+ // TODO: These should all be the design system
+ background: #eee;
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 24px;
+ padding: 50px;
+ .ugb-style-guide__preview-content__media {
+ img {
+ object-fit: cover;
+ width: 100%;
+ height: 400px;
+ // TODO: use image border radius and shadow
+ }
+ }
+ .ugb-style-guide__preview-content__text {
+ padding-top: 50px;
+ }
+ }
}
.ugb-style-guide-popover__heading {
margin: 70px 70px 0;
diff --git a/src/components/style-guide/images/hero-bg.webp b/src/components/style-guide/images/hero-bg.webp
new file mode 100644
index 0000000000000000000000000000000000000000..e1f17e4e519a84b7d52dc2ee2417d1f7a6b0cf8c
GIT binary patch
literal 101176
zcmV(~K+nHYNk&F6iva*vMM6+kP&gnYiva*oz66~CDue@A0zQ#GnMoz1A|WgGi*T?K
z31@A;XF3`s#K1=z_bm0o+-eO{XzKAk&HbGGFFL#WkF)PU4+NfNZ3
bek%Rf{LeBz^*V3b@Ad!sf7E#A`ls@r`ajM42Yze)cm9v~uUucc|J(kn{cnbD
z;r_q>r~0p9A96n5|9kv*t6%H+)BCUdA7DQ&|MhsXev|&cut)0uR=@N={r|=Pk?VKs
z&)dI&zv+LKJUVTF`DA*VJb%R?$H$mV#xR2)9$_;W!VG;GXN`jJXA3_%x>sqY7s>R!
z-abPpR0?kvB&-sNvJTQ07v%QPO(0Y_!mXji9dp3%xiK2wi#dqpluW8B{PdRmJ%i||
zW$N!F5EcD3XX4H)JrX;xDm(vQVe`~g>kSp>FpVeVw3{Muw-J+
ziA&CFfQAfev0ljsHloG38$5r-B9A7)?FQA2(m2-2jSQU2mVap|aXdq&Y$a7fa2mg=
zg1PZ^?s}%uSy31^n7Kqo%f@DR8>VE@n8pxeVk&1L%qr6#X;GygO-!}q&`icKiac>!gK)ncF?~wA)aWwcb-l22JUn{}SMuoL
zRTu8jQ#CIR2s37mgK6A>XO5yw5v)hlF$K8(^PQi#V0Z;ya{l9p{AMwP7_S%7(+iu@
zn!aJqb0HBEm!<9?WPq4tcBNm1*IgzE1r&$yaYiSAI*g8r0k=pzZb1-WJblb-b+zdo
z_Sq1D-|1#jSoUeE0ke+x8PRok^+*DG7Ug2%ty_O{35Jot0#Qg4q5Tbll(PSsWvtb2
zg;*KsdM}50cQ?VA-JmsIgcxz;lp2qFPLzAz;1vsjCL`s>hh*W0Sz9wys
zWm5S(v};HqGTlIf&SU44FX-GK+p23H|A(l*g|zdTkgh?8q#cOSBjxS*dyfg3MEjnmI?>_iqGMW$*p>pJO7cT8(VR~y*k0n6GY#fE!sB;C_m;<|EqGqCWv
z+S{#Pc9%txFyz;-t336QIQ)WboQ|Y_v80Xu-`v9Sg$Sr`
z6Hn(iRA0|^P!*6)7jqq=-|?TVV(HM=no}1-_W}DNy^$iu6PJegLS_ZI
zixGeT6e?l=;l$oFtT9xc)nkMr4&X_ZX@~U}0s#5xf9q9SgxyIQw^B$d?25?yJ=b0?
zX^Yi(JG+AW(dzn_4|+k-6sxTLvSe#0?$0hl}#tuq3+;tp$p{=N&0S-l1
z2a5)D+M^R_=QoIK^v{|YJspm{WGbx`3v2PsF8AUg$7yKi^x$iWqR_nlwXKyN@45>z*=X(=D_1|EFY4
z5K-^aav7o{T=^^Fr{kT6*5%N0{H)~cqy5G4QmRwE<|(vOZO7+P}$Io&=0hgTKiO15#m+0WDA@Lx7KkP
zY3yFRXDn#N>p2TF;jlWkPoAGH7SkArOlZ_0ka=oeij*Vr(i+9Eatu$mcQ6M>*Iv~E
z=@je6#5Ph*a+ieiiMuAPa5SFp0%`4i=>*CBRw{6`PvJTDhhl3hb(jsD=A@^xN&|zs
z?EAB8ip0#2*jBHKRR#tbVF3B-_ZCl+O7k{F0WbZZFiD=we;4zpZ&)_!L7!ZQ=
zsA>CMIqYEl&ufwWxZy&=RK*nqp?rMZe*QWMJxp=RXOfTP7$R$7ax}$;9?ifi_>zUb
zHMUj+_duS>E
^7NMDv
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