mirror of
				https://github.com/chartdb/chartdb.git
				synced 2025-11-03 21:43:23 +00:00 
			
		
		
		
	fix(sidebar): add sidebar for diagram objects (#618)
* fix(sidebar): add sidebar for diagram objects * fix
This commit is contained in:
		
							
								
								
									
										478
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										478
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -18,7 +18,7 @@
 | 
				
			|||||||
                "@radix-ui/react-checkbox": "^1.1.1",
 | 
					                "@radix-ui/react-checkbox": "^1.1.1",
 | 
				
			||||||
                "@radix-ui/react-collapsible": "^1.1.0",
 | 
					                "@radix-ui/react-collapsible": "^1.1.0",
 | 
				
			||||||
                "@radix-ui/react-context-menu": "^2.2.1",
 | 
					                "@radix-ui/react-context-menu": "^2.2.1",
 | 
				
			||||||
                "@radix-ui/react-dialog": "^1.1.1",
 | 
					                "@radix-ui/react-dialog": "^1.1.6",
 | 
				
			||||||
                "@radix-ui/react-dropdown-menu": "^2.1.1",
 | 
					                "@radix-ui/react-dropdown-menu": "^2.1.1",
 | 
				
			||||||
                "@radix-ui/react-hover-card": "^1.1.1",
 | 
					                "@radix-ui/react-hover-card": "^1.1.1",
 | 
				
			||||||
                "@radix-ui/react-icons": "^1.3.0",
 | 
					                "@radix-ui/react-icons": "^1.3.0",
 | 
				
			||||||
@@ -27,18 +27,18 @@
 | 
				
			|||||||
                "@radix-ui/react-popover": "^1.1.1",
 | 
					                "@radix-ui/react-popover": "^1.1.1",
 | 
				
			||||||
                "@radix-ui/react-scroll-area": "1.2.0",
 | 
					                "@radix-ui/react-scroll-area": "1.2.0",
 | 
				
			||||||
                "@radix-ui/react-select": "^2.1.1",
 | 
					                "@radix-ui/react-select": "^2.1.1",
 | 
				
			||||||
                "@radix-ui/react-separator": "^1.1.0",
 | 
					                "@radix-ui/react-separator": "^1.1.2",
 | 
				
			||||||
                "@radix-ui/react-slot": "^1.1.1",
 | 
					                "@radix-ui/react-slot": "^1.1.2",
 | 
				
			||||||
                "@radix-ui/react-tabs": "^1.1.0",
 | 
					                "@radix-ui/react-tabs": "^1.1.0",
 | 
				
			||||||
                "@radix-ui/react-toast": "^1.2.1",
 | 
					                "@radix-ui/react-toast": "^1.2.1",
 | 
				
			||||||
                "@radix-ui/react-toggle": "^1.1.0",
 | 
					                "@radix-ui/react-toggle": "^1.1.0",
 | 
				
			||||||
                "@radix-ui/react-toggle-group": "^1.1.0",
 | 
					                "@radix-ui/react-toggle-group": "^1.1.0",
 | 
				
			||||||
                "@radix-ui/react-tooltip": "^1.1.2",
 | 
					                "@radix-ui/react-tooltip": "^1.1.8",
 | 
				
			||||||
                "@uidotdev/usehooks": "^2.4.1",
 | 
					                "@uidotdev/usehooks": "^2.4.1",
 | 
				
			||||||
                "@xyflow/react": "^12.3.1",
 | 
					                "@xyflow/react": "^12.3.1",
 | 
				
			||||||
                "ahooks": "^3.8.1",
 | 
					                "ahooks": "^3.8.1",
 | 
				
			||||||
                "ai": "^3.3.14",
 | 
					                "ai": "^3.3.14",
 | 
				
			||||||
                "class-variance-authority": "^0.7.0",
 | 
					                "class-variance-authority": "^0.7.1",
 | 
				
			||||||
                "clsx": "^2.1.1",
 | 
					                "clsx": "^2.1.1",
 | 
				
			||||||
                "cmdk": "^1.0.0",
 | 
					                "cmdk": "^1.0.0",
 | 
				
			||||||
                "dexie": "^4.0.8",
 | 
					                "dexie": "^4.0.8",
 | 
				
			||||||
@@ -1834,6 +1834,60 @@
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-dialog": {
 | 
				
			||||||
 | 
					            "version": "1.1.5",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.5.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/primitive": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-compose-refs": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-context": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-dismissable-layer": "1.1.4",
 | 
				
			||||||
 | 
					                "@radix-ui/react-focus-guards": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-focus-scope": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-id": "1.1.0",
 | 
				
			||||||
 | 
					                "@radix-ui/react-portal": "1.1.3",
 | 
				
			||||||
 | 
					                "@radix-ui/react-presence": "1.1.2",
 | 
				
			||||||
 | 
					                "@radix-ui/react-primitive": "2.0.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-slot": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-controllable-state": "1.1.0",
 | 
				
			||||||
 | 
					                "aria-hidden": "^1.2.4",
 | 
				
			||||||
 | 
					                "react-remove-scroll": "^2.6.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": {
 | 
				
			||||||
 | 
					            "version": "1.1.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-compose-refs": "1.1.1"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "node_modules/@radix-ui/react-arrow": {
 | 
					        "node_modules/@radix-ui/react-arrow": {
 | 
				
			||||||
            "version": "1.1.1",
 | 
					            "version": "1.1.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz",
 | 
				
			||||||
@@ -1969,6 +2023,24 @@
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": {
 | 
				
			||||||
 | 
					            "version": "1.1.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-compose-refs": "1.1.1"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "node_modules/@radix-ui/react-compose-refs": {
 | 
					        "node_modules/@radix-ui/react-compose-refs": {
 | 
				
			||||||
            "version": "1.1.1",
 | 
					            "version": "1.1.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
 | 
				
			||||||
@@ -2028,25 +2100,124 @@
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "node_modules/@radix-ui/react-dialog": {
 | 
					        "node_modules/@radix-ui/react-dialog": {
 | 
				
			||||||
            "version": "1.1.5",
 | 
					            "version": "1.1.6",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.5.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.6.tgz",
 | 
				
			||||||
            "integrity": "sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw==",
 | 
					            "integrity": "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==",
 | 
				
			||||||
            "license": "MIT",
 | 
					            "license": "MIT",
 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "@radix-ui/primitive": "1.1.1",
 | 
					                "@radix-ui/primitive": "1.1.1",
 | 
				
			||||||
                "@radix-ui/react-compose-refs": "1.1.1",
 | 
					                "@radix-ui/react-compose-refs": "1.1.1",
 | 
				
			||||||
                "@radix-ui/react-context": "1.1.1",
 | 
					                "@radix-ui/react-context": "1.1.1",
 | 
				
			||||||
                "@radix-ui/react-dismissable-layer": "1.1.4",
 | 
					                "@radix-ui/react-dismissable-layer": "1.1.5",
 | 
				
			||||||
                "@radix-ui/react-focus-guards": "1.1.1",
 | 
					                "@radix-ui/react-focus-guards": "1.1.1",
 | 
				
			||||||
                "@radix-ui/react-focus-scope": "1.1.1",
 | 
					                "@radix-ui/react-focus-scope": "1.1.2",
 | 
				
			||||||
                "@radix-ui/react-id": "1.1.0",
 | 
					                "@radix-ui/react-id": "1.1.0",
 | 
				
			||||||
                "@radix-ui/react-portal": "1.1.3",
 | 
					                "@radix-ui/react-portal": "1.1.4",
 | 
				
			||||||
                "@radix-ui/react-presence": "1.1.2",
 | 
					                "@radix-ui/react-presence": "1.1.2",
 | 
				
			||||||
                "@radix-ui/react-primitive": "2.0.1",
 | 
					                "@radix-ui/react-primitive": "2.0.2",
 | 
				
			||||||
                "@radix-ui/react-slot": "1.1.1",
 | 
					                "@radix-ui/react-slot": "1.1.2",
 | 
				
			||||||
                "@radix-ui/react-use-controllable-state": "1.1.0",
 | 
					                "@radix-ui/react-use-controllable-state": "1.1.0",
 | 
				
			||||||
                "aria-hidden": "^1.2.4",
 | 
					                "aria-hidden": "^1.2.4",
 | 
				
			||||||
                "react-remove-scroll": "^2.6.2"
 | 
					                "react-remove-scroll": "^2.6.3"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer": {
 | 
				
			||||||
 | 
					            "version": "1.1.5",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/primitive": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-compose-refs": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-primitive": "2.0.2",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-callback-ref": "1.1.0",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-escape-keydown": "1.1.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope": {
 | 
				
			||||||
 | 
					            "version": "1.1.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-compose-refs": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-primitive": "2.0.2",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-callback-ref": "1.1.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal": {
 | 
				
			||||||
 | 
					            "version": "1.1.4",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-primitive": "2.0.2",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-layout-effect": "1.1.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": {
 | 
				
			||||||
 | 
					            "version": "2.0.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-slot": "1.1.2"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "peerDependencies": {
 | 
					            "peerDependencies": {
 | 
				
			||||||
                "@types/react": "*",
 | 
					                "@types/react": "*",
 | 
				
			||||||
@@ -2295,6 +2466,24 @@
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": {
 | 
				
			||||||
 | 
					            "version": "1.1.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-compose-refs": "1.1.1"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "node_modules/@radix-ui/react-menubar": {
 | 
					        "node_modules/@radix-ui/react-menubar": {
 | 
				
			||||||
            "version": "1.1.5",
 | 
					            "version": "1.1.5",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.5.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.5.tgz",
 | 
				
			||||||
@@ -2364,6 +2553,24 @@
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": {
 | 
				
			||||||
 | 
					            "version": "1.1.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-compose-refs": "1.1.1"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "node_modules/@radix-ui/react-popper": {
 | 
					        "node_modules/@radix-ui/react-popper": {
 | 
				
			||||||
            "version": "1.2.1",
 | 
					            "version": "1.2.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.1.tgz",
 | 
				
			||||||
@@ -2467,6 +2674,24 @@
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": {
 | 
				
			||||||
 | 
					            "version": "1.1.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-compose-refs": "1.1.1"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "node_modules/@radix-ui/react-roving-focus": {
 | 
					        "node_modules/@radix-ui/react-roving-focus": {
 | 
				
			||||||
            "version": "1.1.1",
 | 
					            "version": "1.1.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz",
 | 
				
			||||||
@@ -2658,13 +2883,54 @@
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "node_modules/@radix-ui/react-separator": {
 | 
					        "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": {
 | 
				
			||||||
            "version": "1.1.1",
 | 
					            "version": "1.1.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==",
 | 
					            "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
 | 
				
			||||||
            "license": "MIT",
 | 
					            "license": "MIT",
 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "@radix-ui/react-primitive": "2.0.1"
 | 
					                "@radix-ui/react-compose-refs": "1.1.1"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-separator": {
 | 
				
			||||||
 | 
					            "version": "1.1.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-primitive": "2.0.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": {
 | 
				
			||||||
 | 
					            "version": "2.0.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-slot": "1.1.2"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "peerDependencies": {
 | 
					            "peerDependencies": {
 | 
				
			||||||
                "@types/react": "*",
 | 
					                "@types/react": "*",
 | 
				
			||||||
@@ -2682,9 +2948,9 @@
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "node_modules/@radix-ui/react-slot": {
 | 
					        "node_modules/@radix-ui/react-slot": {
 | 
				
			||||||
            "version": "1.1.1",
 | 
					            "version": "1.1.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
 | 
					            "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==",
 | 
				
			||||||
            "license": "MIT",
 | 
					            "license": "MIT",
 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "@radix-ui/react-compose-refs": "1.1.1"
 | 
					                "@radix-ui/react-compose-refs": "1.1.1"
 | 
				
			||||||
@@ -2818,23 +3084,175 @@
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "node_modules/@radix-ui/react-tooltip": {
 | 
					        "node_modules/@radix-ui/react-tooltip": {
 | 
				
			||||||
            "version": "1.1.7",
 | 
					            "version": "1.1.8",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.7.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz",
 | 
				
			||||||
            "integrity": "sha512-ss0s80BC0+g0+Zc53MvilcnTYSOi4mSuFWBPYPuTOFGjx+pUU+ZrmamMNwS56t8MTFlniA5ocjd4jYm/CdhbOg==",
 | 
					            "integrity": "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==",
 | 
				
			||||||
            "license": "MIT",
 | 
					            "license": "MIT",
 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "@radix-ui/primitive": "1.1.1",
 | 
					                "@radix-ui/primitive": "1.1.1",
 | 
				
			||||||
                "@radix-ui/react-compose-refs": "1.1.1",
 | 
					                "@radix-ui/react-compose-refs": "1.1.1",
 | 
				
			||||||
                "@radix-ui/react-context": "1.1.1",
 | 
					                "@radix-ui/react-context": "1.1.1",
 | 
				
			||||||
                "@radix-ui/react-dismissable-layer": "1.1.4",
 | 
					                "@radix-ui/react-dismissable-layer": "1.1.5",
 | 
				
			||||||
                "@radix-ui/react-id": "1.1.0",
 | 
					                "@radix-ui/react-id": "1.1.0",
 | 
				
			||||||
                "@radix-ui/react-popper": "1.2.1",
 | 
					                "@radix-ui/react-popper": "1.2.2",
 | 
				
			||||||
                "@radix-ui/react-portal": "1.1.3",
 | 
					                "@radix-ui/react-portal": "1.1.4",
 | 
				
			||||||
                "@radix-ui/react-presence": "1.1.2",
 | 
					                "@radix-ui/react-presence": "1.1.2",
 | 
				
			||||||
                "@radix-ui/react-primitive": "2.0.1",
 | 
					                "@radix-ui/react-primitive": "2.0.2",
 | 
				
			||||||
                "@radix-ui/react-slot": "1.1.1",
 | 
					                "@radix-ui/react-slot": "1.1.2",
 | 
				
			||||||
                "@radix-ui/react-use-controllable-state": "1.1.0",
 | 
					                "@radix-ui/react-use-controllable-state": "1.1.0",
 | 
				
			||||||
                "@radix-ui/react-visually-hidden": "1.1.1"
 | 
					                "@radix-ui/react-visually-hidden": "1.1.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-arrow": {
 | 
				
			||||||
 | 
					            "version": "1.1.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-primitive": "2.0.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": {
 | 
				
			||||||
 | 
					            "version": "1.1.5",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/primitive": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-compose-refs": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-primitive": "2.0.2",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-callback-ref": "1.1.0",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-escape-keydown": "1.1.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": {
 | 
				
			||||||
 | 
					            "version": "1.2.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@floating-ui/react-dom": "^2.0.0",
 | 
				
			||||||
 | 
					                "@radix-ui/react-arrow": "1.1.2",
 | 
				
			||||||
 | 
					                "@radix-ui/react-compose-refs": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-context": "1.1.1",
 | 
				
			||||||
 | 
					                "@radix-ui/react-primitive": "2.0.2",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-callback-ref": "1.1.0",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-layout-effect": "1.1.0",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-rect": "1.1.0",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-size": "1.1.0",
 | 
				
			||||||
 | 
					                "@radix-ui/rect": "1.1.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": {
 | 
				
			||||||
 | 
					            "version": "1.1.4",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-primitive": "2.0.2",
 | 
				
			||||||
 | 
					                "@radix-ui/react-use-layout-effect": "1.1.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-primitive": {
 | 
				
			||||||
 | 
					            "version": "2.0.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-slot": "1.1.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@types/react": "*",
 | 
				
			||||||
 | 
					                "@types/react-dom": "*",
 | 
				
			||||||
 | 
					                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
 | 
				
			||||||
 | 
					                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@types/react": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "@types/react-dom": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-visually-hidden": {
 | 
				
			||||||
 | 
					            "version": "1.1.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==",
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@radix-ui/react-primitive": "2.0.2"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "peerDependencies": {
 | 
					            "peerDependencies": {
 | 
				
			||||||
                "@types/react": "*",
 | 
					                "@types/react": "*",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								package.json
									
									
									
									
									
								
							@@ -22,7 +22,7 @@
 | 
				
			|||||||
        "@radix-ui/react-checkbox": "^1.1.1",
 | 
					        "@radix-ui/react-checkbox": "^1.1.1",
 | 
				
			||||||
        "@radix-ui/react-collapsible": "^1.1.0",
 | 
					        "@radix-ui/react-collapsible": "^1.1.0",
 | 
				
			||||||
        "@radix-ui/react-context-menu": "^2.2.1",
 | 
					        "@radix-ui/react-context-menu": "^2.2.1",
 | 
				
			||||||
        "@radix-ui/react-dialog": "^1.1.1",
 | 
					        "@radix-ui/react-dialog": "^1.1.6",
 | 
				
			||||||
        "@radix-ui/react-dropdown-menu": "^2.1.1",
 | 
					        "@radix-ui/react-dropdown-menu": "^2.1.1",
 | 
				
			||||||
        "@radix-ui/react-hover-card": "^1.1.1",
 | 
					        "@radix-ui/react-hover-card": "^1.1.1",
 | 
				
			||||||
        "@radix-ui/react-icons": "^1.3.0",
 | 
					        "@radix-ui/react-icons": "^1.3.0",
 | 
				
			||||||
@@ -31,18 +31,18 @@
 | 
				
			|||||||
        "@radix-ui/react-popover": "^1.1.1",
 | 
					        "@radix-ui/react-popover": "^1.1.1",
 | 
				
			||||||
        "@radix-ui/react-scroll-area": "1.2.0",
 | 
					        "@radix-ui/react-scroll-area": "1.2.0",
 | 
				
			||||||
        "@radix-ui/react-select": "^2.1.1",
 | 
					        "@radix-ui/react-select": "^2.1.1",
 | 
				
			||||||
        "@radix-ui/react-separator": "^1.1.0",
 | 
					        "@radix-ui/react-separator": "^1.1.2",
 | 
				
			||||||
        "@radix-ui/react-slot": "^1.1.1",
 | 
					        "@radix-ui/react-slot": "^1.1.2",
 | 
				
			||||||
        "@radix-ui/react-tabs": "^1.1.0",
 | 
					        "@radix-ui/react-tabs": "^1.1.0",
 | 
				
			||||||
        "@radix-ui/react-toast": "^1.2.1",
 | 
					        "@radix-ui/react-toast": "^1.2.1",
 | 
				
			||||||
        "@radix-ui/react-toggle": "^1.1.0",
 | 
					        "@radix-ui/react-toggle": "^1.1.0",
 | 
				
			||||||
        "@radix-ui/react-toggle-group": "^1.1.0",
 | 
					        "@radix-ui/react-toggle-group": "^1.1.0",
 | 
				
			||||||
        "@radix-ui/react-tooltip": "^1.1.2",
 | 
					        "@radix-ui/react-tooltip": "^1.1.8",
 | 
				
			||||||
        "@uidotdev/usehooks": "^2.4.1",
 | 
					        "@uidotdev/usehooks": "^2.4.1",
 | 
				
			||||||
        "@xyflow/react": "^12.3.1",
 | 
					        "@xyflow/react": "^12.3.1",
 | 
				
			||||||
        "ahooks": "^3.8.1",
 | 
					        "ahooks": "^3.8.1",
 | 
				
			||||||
        "ai": "^3.3.14",
 | 
					        "ai": "^3.3.14",
 | 
				
			||||||
        "class-variance-authority": "^0.7.0",
 | 
					        "class-variance-authority": "^0.7.1",
 | 
				
			||||||
        "clsx": "^2.1.1",
 | 
					        "clsx": "^2.1.1",
 | 
				
			||||||
        "cmdk": "^1.0.0",
 | 
					        "cmdk": "^1.0.0",
 | 
				
			||||||
        "dexie": "^4.0.8",
 | 
					        "dexie": "^4.0.8",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										135
									
								
								src/components/sheet/sheet.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								src/components/sheet/sheet.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,135 @@
 | 
				
			|||||||
 | 
					import * as React from 'react';
 | 
				
			||||||
 | 
					import * as SheetPrimitive from '@radix-ui/react-dialog';
 | 
				
			||||||
 | 
					import { cva, type VariantProps } from 'class-variance-authority';
 | 
				
			||||||
 | 
					import { cn } from '@/lib/utils';
 | 
				
			||||||
 | 
					import { Cross2Icon } from '@radix-ui/react-icons';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Sheet = SheetPrimitive.Root;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SheetTrigger = SheetPrimitive.Trigger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SheetClose = SheetPrimitive.Close;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SheetPortal = SheetPrimitive.Portal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SheetOverlay = React.forwardRef<
 | 
				
			||||||
 | 
					    React.ElementRef<typeof SheetPrimitive.Overlay>,
 | 
				
			||||||
 | 
					    React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					    <SheetPrimitive.Overlay
 | 
				
			||||||
 | 
					        className={cn(
 | 
				
			||||||
 | 
					            'fixed inset-0 z-50 bg-black/80  data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
 | 
				
			||||||
 | 
					            className
 | 
				
			||||||
 | 
					        )}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					        ref={ref}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const sheetVariants = cva(
 | 
				
			||||||
 | 
					    'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out',
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        variants: {
 | 
				
			||||||
 | 
					            side: {
 | 
				
			||||||
 | 
					                top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',
 | 
				
			||||||
 | 
					                bottom: 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',
 | 
				
			||||||
 | 
					                left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',
 | 
				
			||||||
 | 
					                right: 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        defaultVariants: {
 | 
				
			||||||
 | 
					            side: 'right',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface SheetContentProps
 | 
				
			||||||
 | 
					    extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,
 | 
				
			||||||
 | 
					        VariantProps<typeof sheetVariants> {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SheetContent = React.forwardRef<
 | 
				
			||||||
 | 
					    React.ElementRef<typeof SheetPrimitive.Content>,
 | 
				
			||||||
 | 
					    SheetContentProps
 | 
				
			||||||
 | 
					>(({ side = 'right', className, children, ...props }, ref) => (
 | 
				
			||||||
 | 
					    <SheetPortal>
 | 
				
			||||||
 | 
					        <SheetOverlay />
 | 
				
			||||||
 | 
					        <SheetPrimitive.Content
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            className={cn(sheetVariants({ side }), className)}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					            <SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
 | 
				
			||||||
 | 
					                <Cross2Icon className="size-4" />
 | 
				
			||||||
 | 
					                <span className="sr-only">Close</span>
 | 
				
			||||||
 | 
					            </SheetPrimitive.Close>
 | 
				
			||||||
 | 
					            {children}
 | 
				
			||||||
 | 
					        </SheetPrimitive.Content>
 | 
				
			||||||
 | 
					    </SheetPortal>
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					SheetContent.displayName = SheetPrimitive.Content.displayName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SheetHeader = ({
 | 
				
			||||||
 | 
					    className,
 | 
				
			||||||
 | 
					    ...props
 | 
				
			||||||
 | 
					}: React.HTMLAttributes<HTMLDivElement>) => (
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					        className={cn(
 | 
				
			||||||
 | 
					            'flex flex-col space-y-2 text-center sm:text-left',
 | 
				
			||||||
 | 
					            className
 | 
				
			||||||
 | 
					        )}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					SheetHeader.displayName = 'SheetHeader';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SheetFooter = ({
 | 
				
			||||||
 | 
					    className,
 | 
				
			||||||
 | 
					    ...props
 | 
				
			||||||
 | 
					}: React.HTMLAttributes<HTMLDivElement>) => (
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					        className={cn(
 | 
				
			||||||
 | 
					            'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',
 | 
				
			||||||
 | 
					            className
 | 
				
			||||||
 | 
					        )}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					SheetFooter.displayName = 'SheetFooter';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SheetTitle = React.forwardRef<
 | 
				
			||||||
 | 
					    React.ElementRef<typeof SheetPrimitive.Title>,
 | 
				
			||||||
 | 
					    React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					    <SheetPrimitive.Title
 | 
				
			||||||
 | 
					        ref={ref}
 | 
				
			||||||
 | 
					        className={cn('text-lg font-semibold text-foreground', className)}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					SheetTitle.displayName = SheetPrimitive.Title.displayName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SheetDescription = React.forwardRef<
 | 
				
			||||||
 | 
					    React.ElementRef<typeof SheetPrimitive.Description>,
 | 
				
			||||||
 | 
					    React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					    <SheetPrimitive.Description
 | 
				
			||||||
 | 
					        ref={ref}
 | 
				
			||||||
 | 
					        className={cn('text-sm text-muted-foreground', className)}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					SheetDescription.displayName = SheetPrimitive.Description.displayName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export {
 | 
				
			||||||
 | 
					    Sheet,
 | 
				
			||||||
 | 
					    SheetPortal,
 | 
				
			||||||
 | 
					    SheetOverlay,
 | 
				
			||||||
 | 
					    SheetTrigger,
 | 
				
			||||||
 | 
					    SheetClose,
 | 
				
			||||||
 | 
					    SheetContent,
 | 
				
			||||||
 | 
					    SheetHeader,
 | 
				
			||||||
 | 
					    SheetFooter,
 | 
				
			||||||
 | 
					    SheetTitle,
 | 
				
			||||||
 | 
					    SheetDescription,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										790
									
								
								src/components/sidebar/sidebar.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										790
									
								
								src/components/sidebar/sidebar.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,790 @@
 | 
				
			|||||||
 | 
					import * as React from 'react';
 | 
				
			||||||
 | 
					import { Slot } from '@radix-ui/react-slot';
 | 
				
			||||||
 | 
					import type { VariantProps } from 'class-variance-authority';
 | 
				
			||||||
 | 
					import { cva } from 'class-variance-authority';
 | 
				
			||||||
 | 
					import { useIsMobile } from '@/hooks/use-mobile';
 | 
				
			||||||
 | 
					import { cn } from '@/lib/utils';
 | 
				
			||||||
 | 
					import { Button } from '@/components/button/button';
 | 
				
			||||||
 | 
					import { Input } from '@/components/input/input';
 | 
				
			||||||
 | 
					import { Separator } from '@/components/separator/separator';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					    Sheet,
 | 
				
			||||||
 | 
					    SheetContent,
 | 
				
			||||||
 | 
					    SheetDescription,
 | 
				
			||||||
 | 
					    SheetHeader,
 | 
				
			||||||
 | 
					    SheetTitle,
 | 
				
			||||||
 | 
					} from '@/components/sheet/sheet';
 | 
				
			||||||
 | 
					import { Skeleton } from '@/components/skeleton/skeleton';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					    Tooltip,
 | 
				
			||||||
 | 
					    TooltipContent,
 | 
				
			||||||
 | 
					    TooltipProvider,
 | 
				
			||||||
 | 
					    TooltipTrigger,
 | 
				
			||||||
 | 
					} from '@/components/tooltip/tooltip';
 | 
				
			||||||
 | 
					import { ViewVerticalIcon } from '@radix-ui/react-icons';
 | 
				
			||||||
 | 
					import { useSidebar } from './use-sidebar';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SIDEBAR_COOKIE_NAME = 'sidebar_state';
 | 
				
			||||||
 | 
					const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
 | 
				
			||||||
 | 
					const SIDEBAR_WIDTH = '16rem';
 | 
				
			||||||
 | 
					const SIDEBAR_WIDTH_MOBILE = '18rem';
 | 
				
			||||||
 | 
					const SIDEBAR_WIDTH_ICON = '3rem';
 | 
				
			||||||
 | 
					const SIDEBAR_KEYBOARD_SHORTCUT = 'b';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SidebarContext = {
 | 
				
			||||||
 | 
					    state: 'expanded' | 'collapsed';
 | 
				
			||||||
 | 
					    open: boolean;
 | 
				
			||||||
 | 
					    setOpen: (open: boolean) => void;
 | 
				
			||||||
 | 
					    openMobile: boolean;
 | 
				
			||||||
 | 
					    setOpenMobile: (open: boolean) => void;
 | 
				
			||||||
 | 
					    isMobile: boolean;
 | 
				
			||||||
 | 
					    toggleSidebar: () => void;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarContext = React.createContext<SidebarContext | null>(null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarProvider = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'div'> & {
 | 
				
			||||||
 | 
					        defaultOpen?: boolean;
 | 
				
			||||||
 | 
					        open?: boolean;
 | 
				
			||||||
 | 
					        onOpenChange?: (open: boolean) => void;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					>(
 | 
				
			||||||
 | 
					    (
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            defaultOpen = true,
 | 
				
			||||||
 | 
					            open: openProp,
 | 
				
			||||||
 | 
					            onOpenChange: setOpenProp,
 | 
				
			||||||
 | 
					            className,
 | 
				
			||||||
 | 
					            style,
 | 
				
			||||||
 | 
					            children,
 | 
				
			||||||
 | 
					            ...props
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        ref
 | 
				
			||||||
 | 
					    ) => {
 | 
				
			||||||
 | 
					        const isMobile = useIsMobile();
 | 
				
			||||||
 | 
					        const [openMobile, setOpenMobile] = React.useState(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // This is the internal state of the sidebar.
 | 
				
			||||||
 | 
					        // We use openProp and setOpenProp for control from outside the component.
 | 
				
			||||||
 | 
					        const [_open, _setOpen] = React.useState(defaultOpen);
 | 
				
			||||||
 | 
					        const open = openProp ?? _open;
 | 
				
			||||||
 | 
					        const setOpen = React.useCallback(
 | 
				
			||||||
 | 
					            (value: boolean | ((value: boolean) => boolean)) => {
 | 
				
			||||||
 | 
					                const openState =
 | 
				
			||||||
 | 
					                    typeof value === 'function' ? value(open) : value;
 | 
				
			||||||
 | 
					                if (setOpenProp) {
 | 
				
			||||||
 | 
					                    setOpenProp(openState);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    _setOpen(openState);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // This sets the cookie to keep the sidebar state.
 | 
				
			||||||
 | 
					                document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            [setOpenProp, open]
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Helper to toggle the sidebar.
 | 
				
			||||||
 | 
					        const toggleSidebar = React.useCallback(() => {
 | 
				
			||||||
 | 
					            return isMobile
 | 
				
			||||||
 | 
					                ? setOpenMobile((open) => !open)
 | 
				
			||||||
 | 
					                : setOpen((open) => !open);
 | 
				
			||||||
 | 
					        }, [isMobile, setOpen, setOpenMobile]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Adds a keyboard shortcut to toggle the sidebar.
 | 
				
			||||||
 | 
					        React.useEffect(() => {
 | 
				
			||||||
 | 
					            const handleKeyDown = (event: KeyboardEvent) => {
 | 
				
			||||||
 | 
					                if (
 | 
				
			||||||
 | 
					                    event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
 | 
				
			||||||
 | 
					                    (event.metaKey || event.ctrlKey)
 | 
				
			||||||
 | 
					                ) {
 | 
				
			||||||
 | 
					                    event.preventDefault();
 | 
				
			||||||
 | 
					                    toggleSidebar();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            window.addEventListener('keydown', handleKeyDown);
 | 
				
			||||||
 | 
					            return () => window.removeEventListener('keydown', handleKeyDown);
 | 
				
			||||||
 | 
					        }, [toggleSidebar]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // We add a state so that we can do data-state="expanded" or "collapsed".
 | 
				
			||||||
 | 
					        // This makes it easier to style the sidebar with Tailwind classes.
 | 
				
			||||||
 | 
					        const state = open ? 'expanded' : 'collapsed';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const contextValue = React.useMemo<SidebarContext>(
 | 
				
			||||||
 | 
					            () => ({
 | 
				
			||||||
 | 
					                state,
 | 
				
			||||||
 | 
					                open,
 | 
				
			||||||
 | 
					                setOpen,
 | 
				
			||||||
 | 
					                isMobile,
 | 
				
			||||||
 | 
					                openMobile,
 | 
				
			||||||
 | 
					                setOpenMobile,
 | 
				
			||||||
 | 
					                toggleSidebar,
 | 
				
			||||||
 | 
					            }),
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                state,
 | 
				
			||||||
 | 
					                open,
 | 
				
			||||||
 | 
					                setOpen,
 | 
				
			||||||
 | 
					                isMobile,
 | 
				
			||||||
 | 
					                openMobile,
 | 
				
			||||||
 | 
					                setOpenMobile,
 | 
				
			||||||
 | 
					                toggleSidebar,
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return (
 | 
				
			||||||
 | 
					            <SidebarContext.Provider value={contextValue}>
 | 
				
			||||||
 | 
					                <TooltipProvider delayDuration={0}>
 | 
				
			||||||
 | 
					                    <div
 | 
				
			||||||
 | 
					                        style={
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                '--sidebar-width': SIDEBAR_WIDTH,
 | 
				
			||||||
 | 
					                                '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,
 | 
				
			||||||
 | 
					                                ...style,
 | 
				
			||||||
 | 
					                            } as React.CSSProperties
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        className={cn(
 | 
				
			||||||
 | 
					                            'group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar',
 | 
				
			||||||
 | 
					                            className
 | 
				
			||||||
 | 
					                        )}
 | 
				
			||||||
 | 
					                        ref={ref}
 | 
				
			||||||
 | 
					                        {...props}
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                        {children}
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                </TooltipProvider>
 | 
				
			||||||
 | 
					            </SidebarContext.Provider>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					SidebarProvider.displayName = 'SidebarProvider';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Sidebar = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'div'> & {
 | 
				
			||||||
 | 
					        side?: 'left' | 'right';
 | 
				
			||||||
 | 
					        variant?: 'sidebar' | 'floating' | 'inset';
 | 
				
			||||||
 | 
					        collapsible?: 'offcanvas' | 'icon' | 'none';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					>(
 | 
				
			||||||
 | 
					    (
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            side = 'left',
 | 
				
			||||||
 | 
					            variant = 'sidebar',
 | 
				
			||||||
 | 
					            collapsible = 'offcanvas',
 | 
				
			||||||
 | 
					            className,
 | 
				
			||||||
 | 
					            children,
 | 
				
			||||||
 | 
					            ...props
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        ref
 | 
				
			||||||
 | 
					    ) => {
 | 
				
			||||||
 | 
					        const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (collapsible === 'none') {
 | 
				
			||||||
 | 
					            return (
 | 
				
			||||||
 | 
					                <div
 | 
				
			||||||
 | 
					                    className={cn(
 | 
				
			||||||
 | 
					                        'flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground',
 | 
				
			||||||
 | 
					                        className
 | 
				
			||||||
 | 
					                    )}
 | 
				
			||||||
 | 
					                    ref={ref}
 | 
				
			||||||
 | 
					                    {...props}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                    {children}
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (isMobile) {
 | 
				
			||||||
 | 
					            return (
 | 
				
			||||||
 | 
					                <Sheet
 | 
				
			||||||
 | 
					                    open={openMobile}
 | 
				
			||||||
 | 
					                    onOpenChange={setOpenMobile}
 | 
				
			||||||
 | 
					                    {...props}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                    <SheetContent
 | 
				
			||||||
 | 
					                        data-sidebar="sidebar"
 | 
				
			||||||
 | 
					                        data-mobile="true"
 | 
				
			||||||
 | 
					                        className="w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
 | 
				
			||||||
 | 
					                        style={
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                '--sidebar-width': SIDEBAR_WIDTH_MOBILE,
 | 
				
			||||||
 | 
					                            } as React.CSSProperties
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        side={side}
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                        <SheetHeader className="sr-only">
 | 
				
			||||||
 | 
					                            <SheetTitle>Sidebar</SheetTitle>
 | 
				
			||||||
 | 
					                            <SheetDescription>
 | 
				
			||||||
 | 
					                                Displays the mobile sidebar.
 | 
				
			||||||
 | 
					                            </SheetDescription>
 | 
				
			||||||
 | 
					                        </SheetHeader>
 | 
				
			||||||
 | 
					                        <div className="flex size-full flex-col">
 | 
				
			||||||
 | 
					                            {children}
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					                    </SheetContent>
 | 
				
			||||||
 | 
					                </Sheet>
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return (
 | 
				
			||||||
 | 
					            <div
 | 
				
			||||||
 | 
					                ref={ref}
 | 
				
			||||||
 | 
					                className="group peer hidden text-sidebar-foreground md:block"
 | 
				
			||||||
 | 
					                data-state={state}
 | 
				
			||||||
 | 
					                data-collapsible={state === 'collapsed' ? collapsible : ''}
 | 
				
			||||||
 | 
					                data-variant={variant}
 | 
				
			||||||
 | 
					                data-side={side}
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					                {/* This is what handles the sidebar gap on desktop */}
 | 
				
			||||||
 | 
					                <div
 | 
				
			||||||
 | 
					                    className={cn(
 | 
				
			||||||
 | 
					                        'relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear',
 | 
				
			||||||
 | 
					                        'group-data-[collapsible=offcanvas]:w-0',
 | 
				
			||||||
 | 
					                        'group-data-[side=right]:rotate-180',
 | 
				
			||||||
 | 
					                        variant === 'floating' || variant === 'inset'
 | 
				
			||||||
 | 
					                            ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]'
 | 
				
			||||||
 | 
					                            : 'group-data-[collapsible=icon]:w-[--sidebar-width-icon]'
 | 
				
			||||||
 | 
					                    )}
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
 | 
					                <div
 | 
				
			||||||
 | 
					                    className={cn(
 | 
				
			||||||
 | 
					                        'fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex',
 | 
				
			||||||
 | 
					                        side === 'left'
 | 
				
			||||||
 | 
					                            ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'
 | 
				
			||||||
 | 
					                            : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',
 | 
				
			||||||
 | 
					                        // Adjust the padding for floating and inset variants.
 | 
				
			||||||
 | 
					                        variant === 'floating' || variant === 'inset'
 | 
				
			||||||
 | 
					                            ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]'
 | 
				
			||||||
 | 
					                            : 'group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l',
 | 
				
			||||||
 | 
					                        className
 | 
				
			||||||
 | 
					                    )}
 | 
				
			||||||
 | 
					                    {...props}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                    <div
 | 
				
			||||||
 | 
					                        data-sidebar="sidebar"
 | 
				
			||||||
 | 
					                        className="flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                        {children}
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					Sidebar.displayName = 'Sidebar';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarTrigger = React.forwardRef<
 | 
				
			||||||
 | 
					    React.ElementRef<typeof Button>,
 | 
				
			||||||
 | 
					    React.ComponentProps<typeof Button>
 | 
				
			||||||
 | 
					>(({ className, onClick, ...props }, ref) => {
 | 
				
			||||||
 | 
					    const { toggleSidebar } = useSidebar();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Button
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="trigger"
 | 
				
			||||||
 | 
					            variant="ghost"
 | 
				
			||||||
 | 
					            size="icon"
 | 
				
			||||||
 | 
					            className={cn('h-7 w-7', className)}
 | 
				
			||||||
 | 
					            onClick={(event) => {
 | 
				
			||||||
 | 
					                onClick?.(event);
 | 
				
			||||||
 | 
					                toggleSidebar();
 | 
				
			||||||
 | 
					            }}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					            <ViewVerticalIcon />
 | 
				
			||||||
 | 
					            <span className="sr-only">Toggle Sidebar</span>
 | 
				
			||||||
 | 
					        </Button>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarTrigger.displayName = 'SidebarTrigger';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarRail = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLButtonElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'button'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					    const { toggleSidebar } = useSidebar();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <button
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="rail"
 | 
				
			||||||
 | 
					            aria-label="Toggle Sidebar"
 | 
				
			||||||
 | 
					            tabIndex={-1}
 | 
				
			||||||
 | 
					            onClick={toggleSidebar}
 | 
				
			||||||
 | 
					            title="Toggle Sidebar"
 | 
				
			||||||
 | 
					            className={cn(
 | 
				
			||||||
 | 
					                'absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',
 | 
				
			||||||
 | 
					                '[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize',
 | 
				
			||||||
 | 
					                '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',
 | 
				
			||||||
 | 
					                'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar',
 | 
				
			||||||
 | 
					                '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',
 | 
				
			||||||
 | 
					                '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',
 | 
				
			||||||
 | 
					                className
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarRail.displayName = 'SidebarRail';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarInset = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'main'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <main
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            className={cn(
 | 
				
			||||||
 | 
					                'relative flex w-full flex-1 flex-col bg-background',
 | 
				
			||||||
 | 
					                'md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow',
 | 
				
			||||||
 | 
					                className
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarInset.displayName = 'SidebarInset';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarInput = React.forwardRef<
 | 
				
			||||||
 | 
					    React.ElementRef<typeof Input>,
 | 
				
			||||||
 | 
					    React.ComponentProps<typeof Input>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Input
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="input"
 | 
				
			||||||
 | 
					            className={cn(
 | 
				
			||||||
 | 
					                'h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring',
 | 
				
			||||||
 | 
					                className
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarInput.displayName = 'SidebarInput';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarHeader = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'div'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <div
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="header"
 | 
				
			||||||
 | 
					            className={cn('flex flex-col gap-2 p-2', className)}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarHeader.displayName = 'SidebarHeader';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarFooter = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'div'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <div
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="footer"
 | 
				
			||||||
 | 
					            className={cn('flex flex-col gap-2 p-2', className)}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarFooter.displayName = 'SidebarFooter';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarSeparator = React.forwardRef<
 | 
				
			||||||
 | 
					    React.ElementRef<typeof Separator>,
 | 
				
			||||||
 | 
					    React.ComponentProps<typeof Separator>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Separator
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="separator"
 | 
				
			||||||
 | 
					            className={cn('mx-2 w-auto bg-sidebar-border', className)}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarSeparator.displayName = 'SidebarSeparator';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarContent = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'div'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <div
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="content"
 | 
				
			||||||
 | 
					            className={cn(
 | 
				
			||||||
 | 
					                'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',
 | 
				
			||||||
 | 
					                className
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarContent.displayName = 'SidebarContent';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarGroup = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'div'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <div
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="group"
 | 
				
			||||||
 | 
					            className={cn(
 | 
				
			||||||
 | 
					                'relative flex w-full min-w-0 flex-col p-2',
 | 
				
			||||||
 | 
					                className
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarGroup.displayName = 'SidebarGroup';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarGroupLabel = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'div'> & { asChild?: boolean }
 | 
				
			||||||
 | 
					>(({ className, asChild = false, ...props }, ref) => {
 | 
				
			||||||
 | 
					    const Comp = asChild ? Slot : 'div';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Comp
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="group-label"
 | 
				
			||||||
 | 
					            className={cn(
 | 
				
			||||||
 | 
					                'flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',
 | 
				
			||||||
 | 
					                'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',
 | 
				
			||||||
 | 
					                className
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarGroupLabel.displayName = 'SidebarGroupLabel';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarGroupAction = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLButtonElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'button'> & { asChild?: boolean }
 | 
				
			||||||
 | 
					>(({ className, asChild = false, ...props }, ref) => {
 | 
				
			||||||
 | 
					    const Comp = asChild ? Slot : 'button';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Comp
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="group-action"
 | 
				
			||||||
 | 
					            className={cn(
 | 
				
			||||||
 | 
					                'absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',
 | 
				
			||||||
 | 
					                // Increases the hit area of the button on mobile.
 | 
				
			||||||
 | 
					                'after:absolute after:-inset-2 after:md:hidden',
 | 
				
			||||||
 | 
					                'group-data-[collapsible=icon]:hidden',
 | 
				
			||||||
 | 
					                className
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarGroupAction.displayName = 'SidebarGroupAction';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarGroupContent = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'div'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					        ref={ref}
 | 
				
			||||||
 | 
					        data-sidebar="group-content"
 | 
				
			||||||
 | 
					        className={cn('w-full text-sm', className)}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					SidebarGroupContent.displayName = 'SidebarGroupContent';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarMenu = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLUListElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'ul'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					    <ul
 | 
				
			||||||
 | 
					        ref={ref}
 | 
				
			||||||
 | 
					        data-sidebar="menu"
 | 
				
			||||||
 | 
					        className={cn('flex w-full min-w-0 flex-col gap-1', className)}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					SidebarMenu.displayName = 'SidebarMenu';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarMenuItem = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLLIElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'li'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					    <li
 | 
				
			||||||
 | 
					        ref={ref}
 | 
				
			||||||
 | 
					        data-sidebar="menu-item"
 | 
				
			||||||
 | 
					        className={cn('group/menu-item relative', className)}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					SidebarMenuItem.displayName = 'SidebarMenuItem';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const sidebarMenuButtonVariants = cva(
 | 
				
			||||||
 | 
					    'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        variants: {
 | 
				
			||||||
 | 
					            variant: {
 | 
				
			||||||
 | 
					                default:
 | 
				
			||||||
 | 
					                    'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',
 | 
				
			||||||
 | 
					                outline:
 | 
				
			||||||
 | 
					                    'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            size: {
 | 
				
			||||||
 | 
					                default: 'h-8 text-sm',
 | 
				
			||||||
 | 
					                sm: 'h-7 text-xs',
 | 
				
			||||||
 | 
					                lg: 'h-12 text-sm group-data-[collapsible=icon]:!p-0',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        defaultVariants: {
 | 
				
			||||||
 | 
					            variant: 'default',
 | 
				
			||||||
 | 
					            size: 'default',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarMenuButton = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLButtonElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'button'> & {
 | 
				
			||||||
 | 
					        asChild?: boolean;
 | 
				
			||||||
 | 
					        isActive?: boolean;
 | 
				
			||||||
 | 
					        tooltip?: string | React.ComponentProps<typeof TooltipContent>;
 | 
				
			||||||
 | 
					    } & VariantProps<typeof sidebarMenuButtonVariants>
 | 
				
			||||||
 | 
					>(
 | 
				
			||||||
 | 
					    (
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            asChild = false,
 | 
				
			||||||
 | 
					            isActive = false,
 | 
				
			||||||
 | 
					            variant = 'default',
 | 
				
			||||||
 | 
					            size = 'default',
 | 
				
			||||||
 | 
					            tooltip,
 | 
				
			||||||
 | 
					            className,
 | 
				
			||||||
 | 
					            ...props
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        ref
 | 
				
			||||||
 | 
					    ) => {
 | 
				
			||||||
 | 
					        const Comp = asChild ? Slot : 'button';
 | 
				
			||||||
 | 
					        const { isMobile, state } = useSidebar();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const button = (
 | 
				
			||||||
 | 
					            <Comp
 | 
				
			||||||
 | 
					                ref={ref}
 | 
				
			||||||
 | 
					                data-sidebar="menu-button"
 | 
				
			||||||
 | 
					                data-size={size}
 | 
				
			||||||
 | 
					                data-active={isActive}
 | 
				
			||||||
 | 
					                className={cn(
 | 
				
			||||||
 | 
					                    sidebarMenuButtonVariants({ variant, size }),
 | 
				
			||||||
 | 
					                    className
 | 
				
			||||||
 | 
					                )}
 | 
				
			||||||
 | 
					                {...props}
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!tooltip) {
 | 
				
			||||||
 | 
					            return button;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (typeof tooltip === 'string') {
 | 
				
			||||||
 | 
					            tooltip = {
 | 
				
			||||||
 | 
					                children: tooltip,
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return (
 | 
				
			||||||
 | 
					            <Tooltip>
 | 
				
			||||||
 | 
					                <TooltipTrigger asChild>{button}</TooltipTrigger>
 | 
				
			||||||
 | 
					                <TooltipContent
 | 
				
			||||||
 | 
					                    side="right"
 | 
				
			||||||
 | 
					                    align="center"
 | 
				
			||||||
 | 
					                    hidden={state !== 'collapsed' || isMobile}
 | 
				
			||||||
 | 
					                    {...tooltip}
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
 | 
					            </Tooltip>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					SidebarMenuButton.displayName = 'SidebarMenuButton';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarMenuAction = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLButtonElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'button'> & {
 | 
				
			||||||
 | 
					        asChild?: boolean;
 | 
				
			||||||
 | 
					        showOnHover?: boolean;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
 | 
				
			||||||
 | 
					    const Comp = asChild ? Slot : 'button';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Comp
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="menu-action"
 | 
				
			||||||
 | 
					            className={cn(
 | 
				
			||||||
 | 
					                'absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0',
 | 
				
			||||||
 | 
					                // Increases the hit area of the button on mobile.
 | 
				
			||||||
 | 
					                'after:absolute after:-inset-2 after:md:hidden',
 | 
				
			||||||
 | 
					                'peer-data-[size=sm]/menu-button:top-1',
 | 
				
			||||||
 | 
					                'peer-data-[size=default]/menu-button:top-1.5',
 | 
				
			||||||
 | 
					                'peer-data-[size=lg]/menu-button:top-2.5',
 | 
				
			||||||
 | 
					                'group-data-[collapsible=icon]:hidden',
 | 
				
			||||||
 | 
					                showOnHover &&
 | 
				
			||||||
 | 
					                    'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0',
 | 
				
			||||||
 | 
					                className
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarMenuAction.displayName = 'SidebarMenuAction';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarMenuBadge = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'div'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					        ref={ref}
 | 
				
			||||||
 | 
					        data-sidebar="menu-badge"
 | 
				
			||||||
 | 
					        className={cn(
 | 
				
			||||||
 | 
					            'pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground',
 | 
				
			||||||
 | 
					            'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',
 | 
				
			||||||
 | 
					            'peer-data-[size=sm]/menu-button:top-1',
 | 
				
			||||||
 | 
					            'peer-data-[size=default]/menu-button:top-1.5',
 | 
				
			||||||
 | 
					            'peer-data-[size=lg]/menu-button:top-2.5',
 | 
				
			||||||
 | 
					            'group-data-[collapsible=icon]:hidden',
 | 
				
			||||||
 | 
					            className
 | 
				
			||||||
 | 
					        )}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					SidebarMenuBadge.displayName = 'SidebarMenuBadge';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarMenuSkeleton = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLDivElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'div'> & {
 | 
				
			||||||
 | 
					        showIcon?: boolean;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					>(({ className, showIcon = false, ...props }, ref) => {
 | 
				
			||||||
 | 
					    // Random width between 50 to 90%.
 | 
				
			||||||
 | 
					    const width = React.useMemo(() => {
 | 
				
			||||||
 | 
					        return `${Math.floor(Math.random() * 40) + 50}%`;
 | 
				
			||||||
 | 
					    }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <div
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="menu-skeleton"
 | 
				
			||||||
 | 
					            className={cn(
 | 
				
			||||||
 | 
					                'flex h-8 items-center gap-2 rounded-md px-2',
 | 
				
			||||||
 | 
					                className
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					            {showIcon && (
 | 
				
			||||||
 | 
					                <Skeleton
 | 
				
			||||||
 | 
					                    className="size-4 rounded-md"
 | 
				
			||||||
 | 
					                    data-sidebar="menu-skeleton-icon"
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            <Skeleton
 | 
				
			||||||
 | 
					                className="h-4 max-w-[--skeleton-width] flex-1"
 | 
				
			||||||
 | 
					                data-sidebar="menu-skeleton-text"
 | 
				
			||||||
 | 
					                style={
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        '--skeleton-width': width,
 | 
				
			||||||
 | 
					                    } as React.CSSProperties
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarMenuSkeleton.displayName = 'SidebarMenuSkeleton';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarMenuSub = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLUListElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'ul'>
 | 
				
			||||||
 | 
					>(({ className, ...props }, ref) => (
 | 
				
			||||||
 | 
					    <ul
 | 
				
			||||||
 | 
					        ref={ref}
 | 
				
			||||||
 | 
					        data-sidebar="menu-sub"
 | 
				
			||||||
 | 
					        className={cn(
 | 
				
			||||||
 | 
					            'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5',
 | 
				
			||||||
 | 
					            'group-data-[collapsible=icon]:hidden',
 | 
				
			||||||
 | 
					            className
 | 
				
			||||||
 | 
					        )}
 | 
				
			||||||
 | 
					        {...props}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					SidebarMenuSub.displayName = 'SidebarMenuSub';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarMenuSubItem = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLLIElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'li'>
 | 
				
			||||||
 | 
					>(({ ...props }, ref) => <li ref={ref} {...props} />);
 | 
				
			||||||
 | 
					SidebarMenuSubItem.displayName = 'SidebarMenuSubItem';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const SidebarMenuSubButton = React.forwardRef<
 | 
				
			||||||
 | 
					    HTMLAnchorElement,
 | 
				
			||||||
 | 
					    React.ComponentProps<'a'> & {
 | 
				
			||||||
 | 
					        asChild?: boolean;
 | 
				
			||||||
 | 
					        size?: 'sm' | 'md';
 | 
				
			||||||
 | 
					        isActive?: boolean;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					>(({ asChild = false, size = 'md', isActive, className, ...props }, ref) => {
 | 
				
			||||||
 | 
					    const Comp = asChild ? Slot : 'a';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Comp
 | 
				
			||||||
 | 
					            ref={ref}
 | 
				
			||||||
 | 
					            data-sidebar="menu-sub-button"
 | 
				
			||||||
 | 
					            data-size={size}
 | 
				
			||||||
 | 
					            data-active={isActive}
 | 
				
			||||||
 | 
					            className={cn(
 | 
				
			||||||
 | 
					                'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground',
 | 
				
			||||||
 | 
					                'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',
 | 
				
			||||||
 | 
					                size === 'sm' && 'text-xs',
 | 
				
			||||||
 | 
					                size === 'md' && 'text-sm',
 | 
				
			||||||
 | 
					                'group-data-[collapsible=icon]:hidden',
 | 
				
			||||||
 | 
					                className
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					SidebarMenuSubButton.displayName = 'SidebarMenuSubButton';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export {
 | 
				
			||||||
 | 
					    Sidebar,
 | 
				
			||||||
 | 
					    SidebarContent,
 | 
				
			||||||
 | 
					    SidebarFooter,
 | 
				
			||||||
 | 
					    SidebarGroup,
 | 
				
			||||||
 | 
					    SidebarGroupAction,
 | 
				
			||||||
 | 
					    SidebarGroupContent,
 | 
				
			||||||
 | 
					    SidebarGroupLabel,
 | 
				
			||||||
 | 
					    SidebarHeader,
 | 
				
			||||||
 | 
					    SidebarInput,
 | 
				
			||||||
 | 
					    SidebarInset,
 | 
				
			||||||
 | 
					    SidebarMenu,
 | 
				
			||||||
 | 
					    SidebarMenuAction,
 | 
				
			||||||
 | 
					    SidebarMenuBadge,
 | 
				
			||||||
 | 
					    SidebarMenuButton,
 | 
				
			||||||
 | 
					    SidebarMenuItem,
 | 
				
			||||||
 | 
					    SidebarMenuSkeleton,
 | 
				
			||||||
 | 
					    SidebarMenuSub,
 | 
				
			||||||
 | 
					    SidebarMenuSubButton,
 | 
				
			||||||
 | 
					    SidebarMenuSubItem,
 | 
				
			||||||
 | 
					    SidebarProvider,
 | 
				
			||||||
 | 
					    SidebarRail,
 | 
				
			||||||
 | 
					    SidebarSeparator,
 | 
				
			||||||
 | 
					    SidebarTrigger,
 | 
				
			||||||
 | 
					    SidebarContext,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										11
									
								
								src/components/sidebar/use-sidebar.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/components/sidebar/use-sidebar.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					import React from 'react';
 | 
				
			||||||
 | 
					import { SidebarContext } from './sidebar';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const useSidebar = () => {
 | 
				
			||||||
 | 
					    const context = React.useContext(SidebarContext);
 | 
				
			||||||
 | 
					    if (!context) {
 | 
				
			||||||
 | 
					        throw new Error('useSidebar must be used within a SidebarProvider.');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return context;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										16
									
								
								src/components/skeleton/skeleton.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/components/skeleton/skeleton.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					import React from 'react';
 | 
				
			||||||
 | 
					import { cn } from '@/lib/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function Skeleton({
 | 
				
			||||||
 | 
					    className,
 | 
				
			||||||
 | 
					    ...props
 | 
				
			||||||
 | 
					}: React.HTMLAttributes<HTMLDivElement>) {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <div
 | 
				
			||||||
 | 
					            className={cn('animate-pulse rounded-md bg-primary/10', className)}
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { Skeleton };
 | 
				
			||||||
@@ -30,6 +30,14 @@
 | 
				
			|||||||
        --chart-4: 43 74% 66%;
 | 
					        --chart-4: 43 74% 66%;
 | 
				
			||||||
        --chart-5: 27 87% 67%;
 | 
					        --chart-5: 27 87% 67%;
 | 
				
			||||||
        --subtitle: 215.3 19.3% 34.5%;
 | 
					        --subtitle: 215.3 19.3% 34.5%;
 | 
				
			||||||
 | 
					        --sidebar-background: 0 0% 98%;
 | 
				
			||||||
 | 
					        --sidebar-foreground: 240 5.3% 26.1%;
 | 
				
			||||||
 | 
					        --sidebar-primary: 240 5.9% 10%;
 | 
				
			||||||
 | 
					        --sidebar-primary-foreground: 0 0% 98%;
 | 
				
			||||||
 | 
					        --sidebar-accent: 240 4.8% 95.9%;
 | 
				
			||||||
 | 
					        --sidebar-accent-foreground: 240 5.9% 10%;
 | 
				
			||||||
 | 
					        --sidebar-border: 220 13% 91%;
 | 
				
			||||||
 | 
					        --sidebar-ring: 217.2 91.2% 59.8%;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .dark {
 | 
					    .dark {
 | 
				
			||||||
@@ -58,6 +66,14 @@
 | 
				
			|||||||
        --chart-4: 280 65% 60%;
 | 
					        --chart-4: 280 65% 60%;
 | 
				
			||||||
        --chart-5: 340 75% 55%;
 | 
					        --chart-5: 340 75% 55%;
 | 
				
			||||||
        --subtitle: 212.7 26.8% 83.9%;
 | 
					        --subtitle: 212.7 26.8% 83.9%;
 | 
				
			||||||
 | 
					        --sidebar-background: 240 5.9% 10%;
 | 
				
			||||||
 | 
					        --sidebar-foreground: 240 4.8% 95.9%;
 | 
				
			||||||
 | 
					        --sidebar-primary: 224.3 76.3% 48%;
 | 
				
			||||||
 | 
					        --sidebar-primary-foreground: 0 0% 100%;
 | 
				
			||||||
 | 
					        --sidebar-accent: 240 3.7% 15.9%;
 | 
				
			||||||
 | 
					        --sidebar-accent-foreground: 240 4.8% 95.9%;
 | 
				
			||||||
 | 
					        --sidebar-border: 240 3.7% 15.9%;
 | 
				
			||||||
 | 
					        --sidebar-ring: 217.2 91.2% 59.8%;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								src/hooks/use-mobile.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/hooks/use-mobile.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					import * as React from 'react';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const MOBILE_BREAKPOINT = 768;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function useIsMobile() {
 | 
				
			||||||
 | 
					    const [isMobile, setIsMobile] = React.useState<boolean | undefined>(
 | 
				
			||||||
 | 
					        undefined
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    React.useEffect(() => {
 | 
				
			||||||
 | 
					        const mql = window.matchMedia(
 | 
				
			||||||
 | 
					            `(max-width: ${MOBILE_BREAKPOINT - 1}px)`
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        const onChange = () => {
 | 
				
			||||||
 | 
					            setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        mql.addEventListener('change', onChange);
 | 
				
			||||||
 | 
					        setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
 | 
				
			||||||
 | 
					        return () => mql.removeEventListener('change', onChange);
 | 
				
			||||||
 | 
					    }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return !!isMobile;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -9,6 +9,8 @@ import { Canvas } from './canvas/canvas';
 | 
				
			|||||||
import { useLayout } from '@/hooks/use-layout';
 | 
					import { useLayout } from '@/hooks/use-layout';
 | 
				
			||||||
import type { Diagram } from '@/lib/domain/diagram';
 | 
					import type { Diagram } from '@/lib/domain/diagram';
 | 
				
			||||||
import { cn } from '@/lib/utils';
 | 
					import { cn } from '@/lib/utils';
 | 
				
			||||||
 | 
					import { SidebarProvider } from '@/components/sidebar/sidebar';
 | 
				
			||||||
 | 
					import { EditorSidebar } from './editor-sidebar/editor-sidebar';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface EditorDesktopLayoutProps {
 | 
					export interface EditorDesktopLayoutProps {
 | 
				
			||||||
    initialDiagram?: Diagram;
 | 
					    initialDiagram?: Diagram;
 | 
				
			||||||
@@ -19,6 +21,12 @@ export const EditorDesktopLayout: React.FC<EditorDesktopLayoutProps> = ({
 | 
				
			|||||||
    const { isSidePanelShowed } = useLayout();
 | 
					    const { isSidePanelShowed } = useLayout();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
 | 
					        <SidebarProvider
 | 
				
			||||||
 | 
					            defaultOpen={false}
 | 
				
			||||||
 | 
					            open={false}
 | 
				
			||||||
 | 
					            className="h-full min-h-0"
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					            <EditorSidebar />
 | 
				
			||||||
            <ResizablePanelGroup direction="horizontal">
 | 
					            <ResizablePanelGroup direction="horizontal">
 | 
				
			||||||
                <ResizablePanel
 | 
					                <ResizablePanel
 | 
				
			||||||
                    defaultSize={25}
 | 
					                    defaultSize={25}
 | 
				
			||||||
@@ -30,11 +38,15 @@ export const EditorDesktopLayout: React.FC<EditorDesktopLayoutProps> = ({
 | 
				
			|||||||
                >
 | 
					                >
 | 
				
			||||||
                    <SidePanel />
 | 
					                    <SidePanel />
 | 
				
			||||||
                </ResizablePanel>
 | 
					                </ResizablePanel>
 | 
				
			||||||
            <ResizableHandle disabled={!isSidePanelShowed} />
 | 
					                <ResizableHandle
 | 
				
			||||||
 | 
					                    disabled={!isSidePanelShowed}
 | 
				
			||||||
 | 
					                    className={!isSidePanelShowed ? 'hidden' : ''}
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
                <ResizablePanel defaultSize={75}>
 | 
					                <ResizablePanel defaultSize={75}>
 | 
				
			||||||
                    <Canvas initialTables={initialDiagram?.tables ?? []} />
 | 
					                    <Canvas initialTables={initialDiagram?.tables ?? []} />
 | 
				
			||||||
                </ResizablePanel>
 | 
					                </ResizablePanel>
 | 
				
			||||||
            </ResizablePanelGroup>
 | 
					            </ResizablePanelGroup>
 | 
				
			||||||
 | 
					        </SidebarProvider>
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										84
									
								
								src/pages/editor-page/editor-sidebar/editor-sidebar.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/pages/editor-page/editor-sidebar/editor-sidebar.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
				
			|||||||
 | 
					import React, { useMemo } from 'react';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					    Sidebar,
 | 
				
			||||||
 | 
					    SidebarContent,
 | 
				
			||||||
 | 
					    SidebarGroup,
 | 
				
			||||||
 | 
					    SidebarGroupContent,
 | 
				
			||||||
 | 
					    SidebarGroupLabel,
 | 
				
			||||||
 | 
					    SidebarMenu,
 | 
				
			||||||
 | 
					    SidebarMenuButton,
 | 
				
			||||||
 | 
					    SidebarMenuItem,
 | 
				
			||||||
 | 
					} from '@/components/sidebar/sidebar';
 | 
				
			||||||
 | 
					import { SquareStack, Table, Workflow } from 'lucide-react';
 | 
				
			||||||
 | 
					import { useLayout } from '@/hooks/use-layout';
 | 
				
			||||||
 | 
					import { useTranslation } from 'react-i18next';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface SidebarItem {
 | 
				
			||||||
 | 
					    title: string;
 | 
				
			||||||
 | 
					    icon: React.FC;
 | 
				
			||||||
 | 
					    onClick: () => void;
 | 
				
			||||||
 | 
					    active: boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface EditorSidebarProps {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const EditorSidebar: React.FC<EditorSidebarProps> = () => {
 | 
				
			||||||
 | 
					    const { selectSidebarSection, selectedSidebarSection } = useLayout();
 | 
				
			||||||
 | 
					    const { t } = useTranslation();
 | 
				
			||||||
 | 
					    const items: SidebarItem[] = useMemo(
 | 
				
			||||||
 | 
					        () => [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                title: t('side_panel.tables_section.tables'),
 | 
				
			||||||
 | 
					                icon: Table,
 | 
				
			||||||
 | 
					                onClick: () => selectSidebarSection('tables'),
 | 
				
			||||||
 | 
					                active: selectedSidebarSection === 'tables',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                title: t('side_panel.relationships_section.relationships'),
 | 
				
			||||||
 | 
					                icon: Workflow,
 | 
				
			||||||
 | 
					                onClick: () => selectSidebarSection('relationships'),
 | 
				
			||||||
 | 
					                active: selectedSidebarSection === 'relationships',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                title: t('side_panel.dependencies_section.dependencies'),
 | 
				
			||||||
 | 
					                icon: SquareStack,
 | 
				
			||||||
 | 
					                onClick: () => selectSidebarSection('dependencies'),
 | 
				
			||||||
 | 
					                active: selectedSidebarSection === 'dependencies',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        [selectSidebarSection, selectedSidebarSection, t]
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Sidebar
 | 
				
			||||||
 | 
					            side="left"
 | 
				
			||||||
 | 
					            collapsible="icon"
 | 
				
			||||||
 | 
					            variant="sidebar"
 | 
				
			||||||
 | 
					            className="relative h-full"
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					            <SidebarContent>
 | 
				
			||||||
 | 
					                <SidebarGroup>
 | 
				
			||||||
 | 
					                    <SidebarGroupLabel />
 | 
				
			||||||
 | 
					                    <SidebarGroupContent>
 | 
				
			||||||
 | 
					                        <SidebarMenu>
 | 
				
			||||||
 | 
					                            {items.map((item) => (
 | 
				
			||||||
 | 
					                                <SidebarMenuItem key={item.title}>
 | 
				
			||||||
 | 
					                                    <SidebarMenuButton
 | 
				
			||||||
 | 
					                                        className="hover:bg-gray-200 data-[active=true]:bg-gray-100 data-[active=true]:text-pink-600 data-[active=true]:hover:bg-pink-100 dark:hover:bg-gray-800 dark:data-[active=true]:bg-gray-900 dark:data-[active=true]:text-pink-400 dark:data-[active=true]:hover:bg-pink-950"
 | 
				
			||||||
 | 
					                                        isActive={item.active}
 | 
				
			||||||
 | 
					                                        asChild
 | 
				
			||||||
 | 
					                                        tooltip={item.title}
 | 
				
			||||||
 | 
					                                    >
 | 
				
			||||||
 | 
					                                        <button onClick={item.onClick}>
 | 
				
			||||||
 | 
					                                            <item.icon />
 | 
				
			||||||
 | 
					                                            <span>{item.title}</span>
 | 
				
			||||||
 | 
					                                        </button>
 | 
				
			||||||
 | 
					                                    </SidebarMenuButton>
 | 
				
			||||||
 | 
					                                </SidebarMenuItem>
 | 
				
			||||||
 | 
					                            ))}
 | 
				
			||||||
 | 
					                        </SidebarMenu>
 | 
				
			||||||
 | 
					                    </SidebarGroupContent>
 | 
				
			||||||
 | 
					                </SidebarGroup>
 | 
				
			||||||
 | 
					            </SidebarContent>
 | 
				
			||||||
 | 
					        </Sidebar>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -16,6 +16,7 @@ import type { SelectBoxOption } from '@/components/select-box/select-box';
 | 
				
			|||||||
import { SelectBox } from '@/components/select-box/select-box';
 | 
					import { SelectBox } from '@/components/select-box/select-box';
 | 
				
			||||||
import { useChartDB } from '@/hooks/use-chartdb';
 | 
					import { useChartDB } from '@/hooks/use-chartdb';
 | 
				
			||||||
import { DependenciesSection } from './dependencies-section/dependencies-section';
 | 
					import { DependenciesSection } from './dependencies-section/dependencies-section';
 | 
				
			||||||
 | 
					import { useBreakpoint } from '@/hooks/use-breakpoint';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface SidePanelProps {}
 | 
					export interface SidePanelProps {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,6 +30,7 @@ export const SidePanel: React.FC<SidePanelProps> = () => {
 | 
				
			|||||||
        openSelectSchema,
 | 
					        openSelectSchema,
 | 
				
			||||||
        closeSelectSchema,
 | 
					        closeSelectSchema,
 | 
				
			||||||
    } = useLayout();
 | 
					    } = useLayout();
 | 
				
			||||||
 | 
					    const { isMd: isDesktop } = useBreakpoint('md');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const schemasOptions: SelectBoxOption[] = useMemo(
 | 
					    const schemasOptions: SelectBoxOption[] = useMemo(
 | 
				
			||||||
        () =>
 | 
					        () =>
 | 
				
			||||||
@@ -82,6 +84,7 @@ export const SidePanel: React.FC<SidePanelProps> = () => {
 | 
				
			|||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
            ) : null}
 | 
					            ) : null}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            {!isDesktop ? (
 | 
				
			||||||
                <div className="flex justify-center border-b pt-0.5">
 | 
					                <div className="flex justify-center border-b pt-0.5">
 | 
				
			||||||
                    <Select
 | 
					                    <Select
 | 
				
			||||||
                        value={selectedSidebarSection}
 | 
					                        value={selectedSidebarSection}
 | 
				
			||||||
@@ -114,6 +117,7 @@ export const SidePanel: React.FC<SidePanelProps> = () => {
 | 
				
			|||||||
                        </SelectContent>
 | 
					                        </SelectContent>
 | 
				
			||||||
                    </Select>
 | 
					                    </Select>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
 | 
					            ) : null}
 | 
				
			||||||
            {selectedSidebarSection === 'tables' ? (
 | 
					            {selectedSidebarSection === 'tables' ? (
 | 
				
			||||||
                <TablesSection />
 | 
					                <TablesSection />
 | 
				
			||||||
            ) : selectedSidebarSection === 'relationships' ? (
 | 
					            ) : selectedSidebarSection === 'relationships' ? (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,12 +10,15 @@ module.exports = {
 | 
				
			|||||||
    		center: true,
 | 
					    		center: true,
 | 
				
			||||||
    		padding: '2rem',
 | 
					    		padding: '2rem',
 | 
				
			||||||
    		screens: {
 | 
					    		screens: {
 | 
				
			||||||
                '2xl': '1400px',
 | 
					    			'2xl': '1400px'
 | 
				
			||||||
            },
 | 
					    		}
 | 
				
			||||||
    	},
 | 
					    	},
 | 
				
			||||||
    	extend: {
 | 
					    	extend: {
 | 
				
			||||||
    		fontFamily: {
 | 
					    		fontFamily: {
 | 
				
			||||||
                primary: ['"Raleway"', ...defaultTheme.fontFamily.sans],
 | 
					    			primary: [
 | 
				
			||||||
 | 
					    				'Raleway"',
 | 
				
			||||||
 | 
					                    ...defaultTheme.fontFamily.sans
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
    		},
 | 
					    		},
 | 
				
			||||||
    		colors: {
 | 
					    		colors: {
 | 
				
			||||||
    			border: 'hsl(var(--border))',
 | 
					    			border: 'hsl(var(--border))',
 | 
				
			||||||
@@ -26,70 +29,104 @@ module.exports = {
 | 
				
			|||||||
    			subtitle: 'hsl(var(--subtitle))',
 | 
					    			subtitle: 'hsl(var(--subtitle))',
 | 
				
			||||||
    			primary: {
 | 
					    			primary: {
 | 
				
			||||||
    				DEFAULT: 'hsl(var(--primary))',
 | 
					    				DEFAULT: 'hsl(var(--primary))',
 | 
				
			||||||
                    foreground: 'hsl(var(--primary-foreground))',
 | 
					    				foreground: 'hsl(var(--primary-foreground))'
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
    			secondary: {
 | 
					    			secondary: {
 | 
				
			||||||
    				DEFAULT: 'hsl(var(--secondary))',
 | 
					    				DEFAULT: 'hsl(var(--secondary))',
 | 
				
			||||||
                    foreground: 'hsl(var(--secondary-foreground))',
 | 
					    				foreground: 'hsl(var(--secondary-foreground))'
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
    			destructive: {
 | 
					    			destructive: {
 | 
				
			||||||
    				DEFAULT: 'hsl(var(--destructive))',
 | 
					    				DEFAULT: 'hsl(var(--destructive))',
 | 
				
			||||||
                    foreground: 'hsl(var(--destructive-foreground))',
 | 
					    				foreground: 'hsl(var(--destructive-foreground))'
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
    			muted: {
 | 
					    			muted: {
 | 
				
			||||||
    				DEFAULT: 'hsl(var(--muted))',
 | 
					    				DEFAULT: 'hsl(var(--muted))',
 | 
				
			||||||
                    foreground: 'hsl(var(--muted-foreground))',
 | 
					    				foreground: 'hsl(var(--muted-foreground))'
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
    			accent: {
 | 
					    			accent: {
 | 
				
			||||||
    				DEFAULT: 'hsl(var(--accent))',
 | 
					    				DEFAULT: 'hsl(var(--accent))',
 | 
				
			||||||
                    foreground: 'hsl(var(--accent-foreground))',
 | 
					    				foreground: 'hsl(var(--accent-foreground))'
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
    			popover: {
 | 
					    			popover: {
 | 
				
			||||||
    				DEFAULT: 'hsl(var(--popover))',
 | 
					    				DEFAULT: 'hsl(var(--popover))',
 | 
				
			||||||
                    foreground: 'hsl(var(--popover-foreground))',
 | 
					    				foreground: 'hsl(var(--popover-foreground))'
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
    			card: {
 | 
					    			card: {
 | 
				
			||||||
    				DEFAULT: 'hsl(var(--card))',
 | 
					    				DEFAULT: 'hsl(var(--card))',
 | 
				
			||||||
                    foreground: 'hsl(var(--card-foreground))',
 | 
					    				foreground: 'hsl(var(--card-foreground))'
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
 | 
					    			sidebar: {
 | 
				
			||||||
 | 
					    				DEFAULT: 'hsl(var(--sidebar-background))',
 | 
				
			||||||
 | 
					    				foreground: 'hsl(var(--sidebar-foreground))',
 | 
				
			||||||
 | 
					    				primary: 'hsl(var(--sidebar-primary))',
 | 
				
			||||||
 | 
					    				'primary-foreground': 'hsl(var(--sidebar-primary-foreground))',
 | 
				
			||||||
 | 
					    				accent: 'hsl(var(--sidebar-accent))',
 | 
				
			||||||
 | 
					    				'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',
 | 
				
			||||||
 | 
					    				border: 'hsl(var(--sidebar-border))',
 | 
				
			||||||
 | 
					    				ring: 'hsl(var(--sidebar-ring))'
 | 
				
			||||||
 | 
					    			}
 | 
				
			||||||
    		},
 | 
					    		},
 | 
				
			||||||
    		borderRadius: {
 | 
					    		borderRadius: {
 | 
				
			||||||
    			lg: 'var(--radius)',
 | 
					    			lg: 'var(--radius)',
 | 
				
			||||||
    			md: 'calc(var(--radius) - 2px)',
 | 
					    			md: 'calc(var(--radius) - 2px)',
 | 
				
			||||||
                sm: 'calc(var(--radius) - 4px)',
 | 
					    			sm: 'calc(var(--radius) - 4px)'
 | 
				
			||||||
    		},
 | 
					    		},
 | 
				
			||||||
    		keyframes: {
 | 
					    		keyframes: {
 | 
				
			||||||
    			'accordion-down': {
 | 
					    			'accordion-down': {
 | 
				
			||||||
                    from: { height: '0' },
 | 
					    				from: {
 | 
				
			||||||
                    to: { height: 'var(--radix-accordion-content-height)' },
 | 
					    					height: '0'
 | 
				
			||||||
 | 
					    				},
 | 
				
			||||||
 | 
					    				to: {
 | 
				
			||||||
 | 
					    					height: 'var(--radix-accordion-content-height)'
 | 
				
			||||||
 | 
					    				}
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
    			'accordion-up': {
 | 
					    			'accordion-up': {
 | 
				
			||||||
                    from: { height: 'var(--radix-accordion-content-height)' },
 | 
					    				from: {
 | 
				
			||||||
                    to: { height: '0' },
 | 
					    					height: 'var(--radix-accordion-content-height)'
 | 
				
			||||||
 | 
					    				},
 | 
				
			||||||
 | 
					    				to: {
 | 
				
			||||||
 | 
					    					height: '0'
 | 
				
			||||||
 | 
					    				}
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
    			scale: {
 | 
					    			scale: {
 | 
				
			||||||
                    '0%': { transform: 'scale(1)' },
 | 
					    				'0%': {
 | 
				
			||||||
                    '50%': { transform: 'scale(1.05)' },
 | 
					    					transform: 'scale(1)'
 | 
				
			||||||
                    '100%': { transform: 'scale(1)' },
 | 
					    				},
 | 
				
			||||||
 | 
					    				'50%': {
 | 
				
			||||||
 | 
					    					transform: 'scale(1.05)'
 | 
				
			||||||
 | 
					    				},
 | 
				
			||||||
 | 
					    				'100%': {
 | 
				
			||||||
 | 
					    					transform: 'scale(1)'
 | 
				
			||||||
 | 
					    				}
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
    			'scale-2': {
 | 
					    			'scale-2': {
 | 
				
			||||||
                    '0%': { transform: 'scale(1)' },
 | 
					    				'0%': {
 | 
				
			||||||
                    '50%': { transform: 'scale(1.05)' },
 | 
					    					transform: 'scale(1)'
 | 
				
			||||||
                    '100%': { transform: 'scale(1)' },
 | 
					    				},
 | 
				
			||||||
 | 
					    				'50%': {
 | 
				
			||||||
 | 
					    					transform: 'scale(1.05)'
 | 
				
			||||||
 | 
					    				},
 | 
				
			||||||
 | 
					    				'100%': {
 | 
				
			||||||
 | 
					    					transform: 'scale(1)'
 | 
				
			||||||
 | 
					    				}
 | 
				
			||||||
    			},
 | 
					    			},
 | 
				
			||||||
    			blink: {
 | 
					    			blink: {
 | 
				
			||||||
                    '0%, 100%': { opacity: '1' },
 | 
					    				'0%, 100%': {
 | 
				
			||||||
                    '50%': { opacity: '0' },
 | 
					    					opacity: '1'
 | 
				
			||||||
    				},
 | 
					    				},
 | 
				
			||||||
 | 
					    				'50%': {
 | 
				
			||||||
 | 
					    					opacity: '0'
 | 
				
			||||||
 | 
					    				}
 | 
				
			||||||
 | 
					    			}
 | 
				
			||||||
    		},
 | 
					    		},
 | 
				
			||||||
    		animation: {
 | 
					    		animation: {
 | 
				
			||||||
    			'accordion-down': 'accordion-down 0.2s ease-out',
 | 
					    			'accordion-down': 'accordion-down 0.2s ease-out',
 | 
				
			||||||
    			'accordion-up': 'accordion-up 0.2s ease-out',
 | 
					    			'accordion-up': 'accordion-up 0.2s ease-out',
 | 
				
			||||||
    			scale: 'scale 1s ease-in-out 1',
 | 
					    			scale: 'scale 1s ease-in-out 1',
 | 
				
			||||||
    			'scale-2': 'scale-2 1s ease-in-out 2',
 | 
					    			'scale-2': 'scale-2 1s ease-in-out 2',
 | 
				
			||||||
                blink: 'blink 1s infinite',
 | 
					    			blink: 'blink 1s infinite'
 | 
				
			||||||
            },
 | 
					    		}
 | 
				
			||||||
        },
 | 
					    	}
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    plugins: [require('tailwindcss-animate')],
 | 
					    plugins: [require('tailwindcss-animate')],
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user