tangled
alpha
login
or
join now
whey.party
/
red-dwarf
82
fork
atom
an independent Bluesky client using Constellation, PDS Queries, and other services
reddwarf.app
frontend
spa
bluesky
reddwarf
microcosm
client
app
82
fork
atom
overview
issues
25
pulls
pipelines
post composer (no embeds yet)
rimar1337
4 months ago
06ea05da
9fc1ecc2
+1997
-94
6 changed files
expand all
collapse all
unified
split
package-lock.json
package.json
src
components
Composer.tsx
UniversalPostRenderer.tsx
routes
__root.tsx
utils
atoms.ts
+1681
package-lock.json
···
8
8
"dependencies": {
9
9
"@atproto/api": "^0.16.6",
10
10
"@atproto/oauth-client-browser": "^0.3.33",
11
11
+
"@radix-ui/react-dropdown-menu": "^2.1.16",
11
12
"@tailwindcss/vite": "^4.0.6",
12
13
"@tanstack/query-sync-storage-persister": "^5.85.6",
13
14
"@tanstack/react-devtools": "^0.2.2",
···
21
22
"idb-keyval": "^6.2.2",
22
23
"jotai": "^2.13.1",
23
24
"npm": "^11.6.2",
25
25
+
"radix-ui": "^1.4.3",
24
26
"react": "^19.0.0",
25
27
"react-dom": "^19.0.0",
26
28
"react-player": "^3.3.2",
···
1592
1594
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1593
1595
}
1594
1596
},
1597
1597
+
"node_modules/@floating-ui/core": {
1598
1598
+
"version": "1.7.3",
1599
1599
+
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
1600
1600
+
"integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
1601
1601
+
"dependencies": {
1602
1602
+
"@floating-ui/utils": "^0.2.10"
1603
1603
+
}
1604
1604
+
},
1605
1605
+
"node_modules/@floating-ui/dom": {
1606
1606
+
"version": "1.7.4",
1607
1607
+
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
1608
1608
+
"integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
1609
1609
+
"dependencies": {
1610
1610
+
"@floating-ui/core": "^1.7.3",
1611
1611
+
"@floating-ui/utils": "^0.2.10"
1612
1612
+
}
1613
1613
+
},
1614
1614
+
"node_modules/@floating-ui/react-dom": {
1615
1615
+
"version": "2.1.6",
1616
1616
+
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz",
1617
1617
+
"integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==",
1618
1618
+
"dependencies": {
1619
1619
+
"@floating-ui/dom": "^1.7.4"
1620
1620
+
},
1621
1621
+
"peerDependencies": {
1622
1622
+
"react": ">=16.8.0",
1623
1623
+
"react-dom": ">=16.8.0"
1624
1624
+
}
1625
1625
+
},
1626
1626
+
"node_modules/@floating-ui/utils": {
1627
1627
+
"version": "0.2.10",
1628
1628
+
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
1629
1629
+
"integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="
1630
1630
+
},
1595
1631
"node_modules/@humanfs/core": {
1596
1632
"version": "0.19.1",
1597
1633
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
···
1895
1931
"node": ">= 8"
1896
1932
}
1897
1933
},
1934
1934
+
"node_modules/@radix-ui/number": {
1935
1935
+
"version": "1.1.1",
1936
1936
+
"resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
1937
1937
+
"integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="
1938
1938
+
},
1939
1939
+
"node_modules/@radix-ui/primitive": {
1940
1940
+
"version": "1.1.3",
1941
1941
+
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
1942
1942
+
"integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="
1943
1943
+
},
1944
1944
+
"node_modules/@radix-ui/react-accessible-icon": {
1945
1945
+
"version": "1.1.7",
1946
1946
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz",
1947
1947
+
"integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==",
1948
1948
+
"dependencies": {
1949
1949
+
"@radix-ui/react-visually-hidden": "1.2.3"
1950
1950
+
},
1951
1951
+
"peerDependencies": {
1952
1952
+
"@types/react": "*",
1953
1953
+
"@types/react-dom": "*",
1954
1954
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1955
1955
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1956
1956
+
},
1957
1957
+
"peerDependenciesMeta": {
1958
1958
+
"@types/react": {
1959
1959
+
"optional": true
1960
1960
+
},
1961
1961
+
"@types/react-dom": {
1962
1962
+
"optional": true
1963
1963
+
}
1964
1964
+
}
1965
1965
+
},
1966
1966
+
"node_modules/@radix-ui/react-accordion": {
1967
1967
+
"version": "1.2.12",
1968
1968
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz",
1969
1969
+
"integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==",
1970
1970
+
"dependencies": {
1971
1971
+
"@radix-ui/primitive": "1.1.3",
1972
1972
+
"@radix-ui/react-collapsible": "1.1.12",
1973
1973
+
"@radix-ui/react-collection": "1.1.7",
1974
1974
+
"@radix-ui/react-compose-refs": "1.1.2",
1975
1975
+
"@radix-ui/react-context": "1.1.2",
1976
1976
+
"@radix-ui/react-direction": "1.1.1",
1977
1977
+
"@radix-ui/react-id": "1.1.1",
1978
1978
+
"@radix-ui/react-primitive": "2.1.3",
1979
1979
+
"@radix-ui/react-use-controllable-state": "1.2.2"
1980
1980
+
},
1981
1981
+
"peerDependencies": {
1982
1982
+
"@types/react": "*",
1983
1983
+
"@types/react-dom": "*",
1984
1984
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1985
1985
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1986
1986
+
},
1987
1987
+
"peerDependenciesMeta": {
1988
1988
+
"@types/react": {
1989
1989
+
"optional": true
1990
1990
+
},
1991
1991
+
"@types/react-dom": {
1992
1992
+
"optional": true
1993
1993
+
}
1994
1994
+
}
1995
1995
+
},
1996
1996
+
"node_modules/@radix-ui/react-alert-dialog": {
1997
1997
+
"version": "1.1.15",
1998
1998
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz",
1999
1999
+
"integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==",
2000
2000
+
"dependencies": {
2001
2001
+
"@radix-ui/primitive": "1.1.3",
2002
2002
+
"@radix-ui/react-compose-refs": "1.1.2",
2003
2003
+
"@radix-ui/react-context": "1.1.2",
2004
2004
+
"@radix-ui/react-dialog": "1.1.15",
2005
2005
+
"@radix-ui/react-primitive": "2.1.3",
2006
2006
+
"@radix-ui/react-slot": "1.2.3"
2007
2007
+
},
2008
2008
+
"peerDependencies": {
2009
2009
+
"@types/react": "*",
2010
2010
+
"@types/react-dom": "*",
2011
2011
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2012
2012
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2013
2013
+
},
2014
2014
+
"peerDependenciesMeta": {
2015
2015
+
"@types/react": {
2016
2016
+
"optional": true
2017
2017
+
},
2018
2018
+
"@types/react-dom": {
2019
2019
+
"optional": true
2020
2020
+
}
2021
2021
+
}
2022
2022
+
},
2023
2023
+
"node_modules/@radix-ui/react-arrow": {
2024
2024
+
"version": "1.1.7",
2025
2025
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz",
2026
2026
+
"integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==",
2027
2027
+
"dependencies": {
2028
2028
+
"@radix-ui/react-primitive": "2.1.3"
2029
2029
+
},
2030
2030
+
"peerDependencies": {
2031
2031
+
"@types/react": "*",
2032
2032
+
"@types/react-dom": "*",
2033
2033
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2034
2034
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2035
2035
+
},
2036
2036
+
"peerDependenciesMeta": {
2037
2037
+
"@types/react": {
2038
2038
+
"optional": true
2039
2039
+
},
2040
2040
+
"@types/react-dom": {
2041
2041
+
"optional": true
2042
2042
+
}
2043
2043
+
}
2044
2044
+
},
2045
2045
+
"node_modules/@radix-ui/react-aspect-ratio": {
2046
2046
+
"version": "1.1.7",
2047
2047
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz",
2048
2048
+
"integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==",
2049
2049
+
"dependencies": {
2050
2050
+
"@radix-ui/react-primitive": "2.1.3"
2051
2051
+
},
2052
2052
+
"peerDependencies": {
2053
2053
+
"@types/react": "*",
2054
2054
+
"@types/react-dom": "*",
2055
2055
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2056
2056
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2057
2057
+
},
2058
2058
+
"peerDependenciesMeta": {
2059
2059
+
"@types/react": {
2060
2060
+
"optional": true
2061
2061
+
},
2062
2062
+
"@types/react-dom": {
2063
2063
+
"optional": true
2064
2064
+
}
2065
2065
+
}
2066
2066
+
},
2067
2067
+
"node_modules/@radix-ui/react-avatar": {
2068
2068
+
"version": "1.1.10",
2069
2069
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz",
2070
2070
+
"integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==",
2071
2071
+
"dependencies": {
2072
2072
+
"@radix-ui/react-context": "1.1.2",
2073
2073
+
"@radix-ui/react-primitive": "2.1.3",
2074
2074
+
"@radix-ui/react-use-callback-ref": "1.1.1",
2075
2075
+
"@radix-ui/react-use-is-hydrated": "0.1.0",
2076
2076
+
"@radix-ui/react-use-layout-effect": "1.1.1"
2077
2077
+
},
2078
2078
+
"peerDependencies": {
2079
2079
+
"@types/react": "*",
2080
2080
+
"@types/react-dom": "*",
2081
2081
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2082
2082
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2083
2083
+
},
2084
2084
+
"peerDependenciesMeta": {
2085
2085
+
"@types/react": {
2086
2086
+
"optional": true
2087
2087
+
},
2088
2088
+
"@types/react-dom": {
2089
2089
+
"optional": true
2090
2090
+
}
2091
2091
+
}
2092
2092
+
},
2093
2093
+
"node_modules/@radix-ui/react-checkbox": {
2094
2094
+
"version": "1.3.3",
2095
2095
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz",
2096
2096
+
"integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==",
2097
2097
+
"dependencies": {
2098
2098
+
"@radix-ui/primitive": "1.1.3",
2099
2099
+
"@radix-ui/react-compose-refs": "1.1.2",
2100
2100
+
"@radix-ui/react-context": "1.1.2",
2101
2101
+
"@radix-ui/react-presence": "1.1.5",
2102
2102
+
"@radix-ui/react-primitive": "2.1.3",
2103
2103
+
"@radix-ui/react-use-controllable-state": "1.2.2",
2104
2104
+
"@radix-ui/react-use-previous": "1.1.1",
2105
2105
+
"@radix-ui/react-use-size": "1.1.1"
2106
2106
+
},
2107
2107
+
"peerDependencies": {
2108
2108
+
"@types/react": "*",
2109
2109
+
"@types/react-dom": "*",
2110
2110
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2111
2111
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2112
2112
+
},
2113
2113
+
"peerDependenciesMeta": {
2114
2114
+
"@types/react": {
2115
2115
+
"optional": true
2116
2116
+
},
2117
2117
+
"@types/react-dom": {
2118
2118
+
"optional": true
2119
2119
+
}
2120
2120
+
}
2121
2121
+
},
2122
2122
+
"node_modules/@radix-ui/react-collapsible": {
2123
2123
+
"version": "1.1.12",
2124
2124
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz",
2125
2125
+
"integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==",
2126
2126
+
"dependencies": {
2127
2127
+
"@radix-ui/primitive": "1.1.3",
2128
2128
+
"@radix-ui/react-compose-refs": "1.1.2",
2129
2129
+
"@radix-ui/react-context": "1.1.2",
2130
2130
+
"@radix-ui/react-id": "1.1.1",
2131
2131
+
"@radix-ui/react-presence": "1.1.5",
2132
2132
+
"@radix-ui/react-primitive": "2.1.3",
2133
2133
+
"@radix-ui/react-use-controllable-state": "1.2.2",
2134
2134
+
"@radix-ui/react-use-layout-effect": "1.1.1"
2135
2135
+
},
2136
2136
+
"peerDependencies": {
2137
2137
+
"@types/react": "*",
2138
2138
+
"@types/react-dom": "*",
2139
2139
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2140
2140
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2141
2141
+
},
2142
2142
+
"peerDependenciesMeta": {
2143
2143
+
"@types/react": {
2144
2144
+
"optional": true
2145
2145
+
},
2146
2146
+
"@types/react-dom": {
2147
2147
+
"optional": true
2148
2148
+
}
2149
2149
+
}
2150
2150
+
},
2151
2151
+
"node_modules/@radix-ui/react-collection": {
2152
2152
+
"version": "1.1.7",
2153
2153
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
2154
2154
+
"integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
2155
2155
+
"dependencies": {
2156
2156
+
"@radix-ui/react-compose-refs": "1.1.2",
2157
2157
+
"@radix-ui/react-context": "1.1.2",
2158
2158
+
"@radix-ui/react-primitive": "2.1.3",
2159
2159
+
"@radix-ui/react-slot": "1.2.3"
2160
2160
+
},
2161
2161
+
"peerDependencies": {
2162
2162
+
"@types/react": "*",
2163
2163
+
"@types/react-dom": "*",
2164
2164
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2165
2165
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2166
2166
+
},
2167
2167
+
"peerDependenciesMeta": {
2168
2168
+
"@types/react": {
2169
2169
+
"optional": true
2170
2170
+
},
2171
2171
+
"@types/react-dom": {
2172
2172
+
"optional": true
2173
2173
+
}
2174
2174
+
}
2175
2175
+
},
2176
2176
+
"node_modules/@radix-ui/react-compose-refs": {
2177
2177
+
"version": "1.1.2",
2178
2178
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
2179
2179
+
"integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
2180
2180
+
"peerDependencies": {
2181
2181
+
"@types/react": "*",
2182
2182
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2183
2183
+
},
2184
2184
+
"peerDependenciesMeta": {
2185
2185
+
"@types/react": {
2186
2186
+
"optional": true
2187
2187
+
}
2188
2188
+
}
2189
2189
+
},
2190
2190
+
"node_modules/@radix-ui/react-context": {
2191
2191
+
"version": "1.1.2",
2192
2192
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
2193
2193
+
"integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
2194
2194
+
"peerDependencies": {
2195
2195
+
"@types/react": "*",
2196
2196
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2197
2197
+
},
2198
2198
+
"peerDependenciesMeta": {
2199
2199
+
"@types/react": {
2200
2200
+
"optional": true
2201
2201
+
}
2202
2202
+
}
2203
2203
+
},
2204
2204
+
"node_modules/@radix-ui/react-context-menu": {
2205
2205
+
"version": "2.2.16",
2206
2206
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz",
2207
2207
+
"integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==",
2208
2208
+
"dependencies": {
2209
2209
+
"@radix-ui/primitive": "1.1.3",
2210
2210
+
"@radix-ui/react-context": "1.1.2",
2211
2211
+
"@radix-ui/react-menu": "2.1.16",
2212
2212
+
"@radix-ui/react-primitive": "2.1.3",
2213
2213
+
"@radix-ui/react-use-callback-ref": "1.1.1",
2214
2214
+
"@radix-ui/react-use-controllable-state": "1.2.2"
2215
2215
+
},
2216
2216
+
"peerDependencies": {
2217
2217
+
"@types/react": "*",
2218
2218
+
"@types/react-dom": "*",
2219
2219
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2220
2220
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2221
2221
+
},
2222
2222
+
"peerDependenciesMeta": {
2223
2223
+
"@types/react": {
2224
2224
+
"optional": true
2225
2225
+
},
2226
2226
+
"@types/react-dom": {
2227
2227
+
"optional": true
2228
2228
+
}
2229
2229
+
}
2230
2230
+
},
2231
2231
+
"node_modules/@radix-ui/react-dialog": {
2232
2232
+
"version": "1.1.15",
2233
2233
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
2234
2234
+
"integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
2235
2235
+
"dependencies": {
2236
2236
+
"@radix-ui/primitive": "1.1.3",
2237
2237
+
"@radix-ui/react-compose-refs": "1.1.2",
2238
2238
+
"@radix-ui/react-context": "1.1.2",
2239
2239
+
"@radix-ui/react-dismissable-layer": "1.1.11",
2240
2240
+
"@radix-ui/react-focus-guards": "1.1.3",
2241
2241
+
"@radix-ui/react-focus-scope": "1.1.7",
2242
2242
+
"@radix-ui/react-id": "1.1.1",
2243
2243
+
"@radix-ui/react-portal": "1.1.9",
2244
2244
+
"@radix-ui/react-presence": "1.1.5",
2245
2245
+
"@radix-ui/react-primitive": "2.1.3",
2246
2246
+
"@radix-ui/react-slot": "1.2.3",
2247
2247
+
"@radix-ui/react-use-controllable-state": "1.2.2",
2248
2248
+
"aria-hidden": "^1.2.4",
2249
2249
+
"react-remove-scroll": "^2.6.3"
2250
2250
+
},
2251
2251
+
"peerDependencies": {
2252
2252
+
"@types/react": "*",
2253
2253
+
"@types/react-dom": "*",
2254
2254
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2255
2255
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2256
2256
+
},
2257
2257
+
"peerDependenciesMeta": {
2258
2258
+
"@types/react": {
2259
2259
+
"optional": true
2260
2260
+
},
2261
2261
+
"@types/react-dom": {
2262
2262
+
"optional": true
2263
2263
+
}
2264
2264
+
}
2265
2265
+
},
2266
2266
+
"node_modules/@radix-ui/react-direction": {
2267
2267
+
"version": "1.1.1",
2268
2268
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
2269
2269
+
"integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
2270
2270
+
"peerDependencies": {
2271
2271
+
"@types/react": "*",
2272
2272
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2273
2273
+
},
2274
2274
+
"peerDependenciesMeta": {
2275
2275
+
"@types/react": {
2276
2276
+
"optional": true
2277
2277
+
}
2278
2278
+
}
2279
2279
+
},
2280
2280
+
"node_modules/@radix-ui/react-dismissable-layer": {
2281
2281
+
"version": "1.1.11",
2282
2282
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
2283
2283
+
"integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
2284
2284
+
"dependencies": {
2285
2285
+
"@radix-ui/primitive": "1.1.3",
2286
2286
+
"@radix-ui/react-compose-refs": "1.1.2",
2287
2287
+
"@radix-ui/react-primitive": "2.1.3",
2288
2288
+
"@radix-ui/react-use-callback-ref": "1.1.1",
2289
2289
+
"@radix-ui/react-use-escape-keydown": "1.1.1"
2290
2290
+
},
2291
2291
+
"peerDependencies": {
2292
2292
+
"@types/react": "*",
2293
2293
+
"@types/react-dom": "*",
2294
2294
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2295
2295
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2296
2296
+
},
2297
2297
+
"peerDependenciesMeta": {
2298
2298
+
"@types/react": {
2299
2299
+
"optional": true
2300
2300
+
},
2301
2301
+
"@types/react-dom": {
2302
2302
+
"optional": true
2303
2303
+
}
2304
2304
+
}
2305
2305
+
},
2306
2306
+
"node_modules/@radix-ui/react-dropdown-menu": {
2307
2307
+
"version": "2.1.16",
2308
2308
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz",
2309
2309
+
"integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==",
2310
2310
+
"dependencies": {
2311
2311
+
"@radix-ui/primitive": "1.1.3",
2312
2312
+
"@radix-ui/react-compose-refs": "1.1.2",
2313
2313
+
"@radix-ui/react-context": "1.1.2",
2314
2314
+
"@radix-ui/react-id": "1.1.1",
2315
2315
+
"@radix-ui/react-menu": "2.1.16",
2316
2316
+
"@radix-ui/react-primitive": "2.1.3",
2317
2317
+
"@radix-ui/react-use-controllable-state": "1.2.2"
2318
2318
+
},
2319
2319
+
"peerDependencies": {
2320
2320
+
"@types/react": "*",
2321
2321
+
"@types/react-dom": "*",
2322
2322
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2323
2323
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2324
2324
+
},
2325
2325
+
"peerDependenciesMeta": {
2326
2326
+
"@types/react": {
2327
2327
+
"optional": true
2328
2328
+
},
2329
2329
+
"@types/react-dom": {
2330
2330
+
"optional": true
2331
2331
+
}
2332
2332
+
}
2333
2333
+
},
2334
2334
+
"node_modules/@radix-ui/react-focus-guards": {
2335
2335
+
"version": "1.1.3",
2336
2336
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
2337
2337
+
"integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
2338
2338
+
"peerDependencies": {
2339
2339
+
"@types/react": "*",
2340
2340
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2341
2341
+
},
2342
2342
+
"peerDependenciesMeta": {
2343
2343
+
"@types/react": {
2344
2344
+
"optional": true
2345
2345
+
}
2346
2346
+
}
2347
2347
+
},
2348
2348
+
"node_modules/@radix-ui/react-focus-scope": {
2349
2349
+
"version": "1.1.7",
2350
2350
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
2351
2351
+
"integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
2352
2352
+
"dependencies": {
2353
2353
+
"@radix-ui/react-compose-refs": "1.1.2",
2354
2354
+
"@radix-ui/react-primitive": "2.1.3",
2355
2355
+
"@radix-ui/react-use-callback-ref": "1.1.1"
2356
2356
+
},
2357
2357
+
"peerDependencies": {
2358
2358
+
"@types/react": "*",
2359
2359
+
"@types/react-dom": "*",
2360
2360
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2361
2361
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2362
2362
+
},
2363
2363
+
"peerDependenciesMeta": {
2364
2364
+
"@types/react": {
2365
2365
+
"optional": true
2366
2366
+
},
2367
2367
+
"@types/react-dom": {
2368
2368
+
"optional": true
2369
2369
+
}
2370
2370
+
}
2371
2371
+
},
2372
2372
+
"node_modules/@radix-ui/react-form": {
2373
2373
+
"version": "0.1.8",
2374
2374
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz",
2375
2375
+
"integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==",
2376
2376
+
"dependencies": {
2377
2377
+
"@radix-ui/primitive": "1.1.3",
2378
2378
+
"@radix-ui/react-compose-refs": "1.1.2",
2379
2379
+
"@radix-ui/react-context": "1.1.2",
2380
2380
+
"@radix-ui/react-id": "1.1.1",
2381
2381
+
"@radix-ui/react-label": "2.1.7",
2382
2382
+
"@radix-ui/react-primitive": "2.1.3"
2383
2383
+
},
2384
2384
+
"peerDependencies": {
2385
2385
+
"@types/react": "*",
2386
2386
+
"@types/react-dom": "*",
2387
2387
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2388
2388
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2389
2389
+
},
2390
2390
+
"peerDependenciesMeta": {
2391
2391
+
"@types/react": {
2392
2392
+
"optional": true
2393
2393
+
},
2394
2394
+
"@types/react-dom": {
2395
2395
+
"optional": true
2396
2396
+
}
2397
2397
+
}
2398
2398
+
},
2399
2399
+
"node_modules/@radix-ui/react-hover-card": {
2400
2400
+
"version": "1.1.15",
2401
2401
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz",
2402
2402
+
"integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==",
2403
2403
+
"dependencies": {
2404
2404
+
"@radix-ui/primitive": "1.1.3",
2405
2405
+
"@radix-ui/react-compose-refs": "1.1.2",
2406
2406
+
"@radix-ui/react-context": "1.1.2",
2407
2407
+
"@radix-ui/react-dismissable-layer": "1.1.11",
2408
2408
+
"@radix-ui/react-popper": "1.2.8",
2409
2409
+
"@radix-ui/react-portal": "1.1.9",
2410
2410
+
"@radix-ui/react-presence": "1.1.5",
2411
2411
+
"@radix-ui/react-primitive": "2.1.3",
2412
2412
+
"@radix-ui/react-use-controllable-state": "1.2.2"
2413
2413
+
},
2414
2414
+
"peerDependencies": {
2415
2415
+
"@types/react": "*",
2416
2416
+
"@types/react-dom": "*",
2417
2417
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2418
2418
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2419
2419
+
},
2420
2420
+
"peerDependenciesMeta": {
2421
2421
+
"@types/react": {
2422
2422
+
"optional": true
2423
2423
+
},
2424
2424
+
"@types/react-dom": {
2425
2425
+
"optional": true
2426
2426
+
}
2427
2427
+
}
2428
2428
+
},
2429
2429
+
"node_modules/@radix-ui/react-id": {
2430
2430
+
"version": "1.1.1",
2431
2431
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
2432
2432
+
"integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
2433
2433
+
"dependencies": {
2434
2434
+
"@radix-ui/react-use-layout-effect": "1.1.1"
2435
2435
+
},
2436
2436
+
"peerDependencies": {
2437
2437
+
"@types/react": "*",
2438
2438
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2439
2439
+
},
2440
2440
+
"peerDependenciesMeta": {
2441
2441
+
"@types/react": {
2442
2442
+
"optional": true
2443
2443
+
}
2444
2444
+
}
2445
2445
+
},
2446
2446
+
"node_modules/@radix-ui/react-label": {
2447
2447
+
"version": "2.1.7",
2448
2448
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz",
2449
2449
+
"integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==",
2450
2450
+
"dependencies": {
2451
2451
+
"@radix-ui/react-primitive": "2.1.3"
2452
2452
+
},
2453
2453
+
"peerDependencies": {
2454
2454
+
"@types/react": "*",
2455
2455
+
"@types/react-dom": "*",
2456
2456
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2457
2457
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2458
2458
+
},
2459
2459
+
"peerDependenciesMeta": {
2460
2460
+
"@types/react": {
2461
2461
+
"optional": true
2462
2462
+
},
2463
2463
+
"@types/react-dom": {
2464
2464
+
"optional": true
2465
2465
+
}
2466
2466
+
}
2467
2467
+
},
2468
2468
+
"node_modules/@radix-ui/react-menu": {
2469
2469
+
"version": "2.1.16",
2470
2470
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz",
2471
2471
+
"integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==",
2472
2472
+
"dependencies": {
2473
2473
+
"@radix-ui/primitive": "1.1.3",
2474
2474
+
"@radix-ui/react-collection": "1.1.7",
2475
2475
+
"@radix-ui/react-compose-refs": "1.1.2",
2476
2476
+
"@radix-ui/react-context": "1.1.2",
2477
2477
+
"@radix-ui/react-direction": "1.1.1",
2478
2478
+
"@radix-ui/react-dismissable-layer": "1.1.11",
2479
2479
+
"@radix-ui/react-focus-guards": "1.1.3",
2480
2480
+
"@radix-ui/react-focus-scope": "1.1.7",
2481
2481
+
"@radix-ui/react-id": "1.1.1",
2482
2482
+
"@radix-ui/react-popper": "1.2.8",
2483
2483
+
"@radix-ui/react-portal": "1.1.9",
2484
2484
+
"@radix-ui/react-presence": "1.1.5",
2485
2485
+
"@radix-ui/react-primitive": "2.1.3",
2486
2486
+
"@radix-ui/react-roving-focus": "1.1.11",
2487
2487
+
"@radix-ui/react-slot": "1.2.3",
2488
2488
+
"@radix-ui/react-use-callback-ref": "1.1.1",
2489
2489
+
"aria-hidden": "^1.2.4",
2490
2490
+
"react-remove-scroll": "^2.6.3"
2491
2491
+
},
2492
2492
+
"peerDependencies": {
2493
2493
+
"@types/react": "*",
2494
2494
+
"@types/react-dom": "*",
2495
2495
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2496
2496
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2497
2497
+
},
2498
2498
+
"peerDependenciesMeta": {
2499
2499
+
"@types/react": {
2500
2500
+
"optional": true
2501
2501
+
},
2502
2502
+
"@types/react-dom": {
2503
2503
+
"optional": true
2504
2504
+
}
2505
2505
+
}
2506
2506
+
},
2507
2507
+
"node_modules/@radix-ui/react-menubar": {
2508
2508
+
"version": "1.1.16",
2509
2509
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz",
2510
2510
+
"integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==",
2511
2511
+
"dependencies": {
2512
2512
+
"@radix-ui/primitive": "1.1.3",
2513
2513
+
"@radix-ui/react-collection": "1.1.7",
2514
2514
+
"@radix-ui/react-compose-refs": "1.1.2",
2515
2515
+
"@radix-ui/react-context": "1.1.2",
2516
2516
+
"@radix-ui/react-direction": "1.1.1",
2517
2517
+
"@radix-ui/react-id": "1.1.1",
2518
2518
+
"@radix-ui/react-menu": "2.1.16",
2519
2519
+
"@radix-ui/react-primitive": "2.1.3",
2520
2520
+
"@radix-ui/react-roving-focus": "1.1.11",
2521
2521
+
"@radix-ui/react-use-controllable-state": "1.2.2"
2522
2522
+
},
2523
2523
+
"peerDependencies": {
2524
2524
+
"@types/react": "*",
2525
2525
+
"@types/react-dom": "*",
2526
2526
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2527
2527
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2528
2528
+
},
2529
2529
+
"peerDependenciesMeta": {
2530
2530
+
"@types/react": {
2531
2531
+
"optional": true
2532
2532
+
},
2533
2533
+
"@types/react-dom": {
2534
2534
+
"optional": true
2535
2535
+
}
2536
2536
+
}
2537
2537
+
},
2538
2538
+
"node_modules/@radix-ui/react-navigation-menu": {
2539
2539
+
"version": "1.2.14",
2540
2540
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz",
2541
2541
+
"integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==",
2542
2542
+
"dependencies": {
2543
2543
+
"@radix-ui/primitive": "1.1.3",
2544
2544
+
"@radix-ui/react-collection": "1.1.7",
2545
2545
+
"@radix-ui/react-compose-refs": "1.1.2",
2546
2546
+
"@radix-ui/react-context": "1.1.2",
2547
2547
+
"@radix-ui/react-direction": "1.1.1",
2548
2548
+
"@radix-ui/react-dismissable-layer": "1.1.11",
2549
2549
+
"@radix-ui/react-id": "1.1.1",
2550
2550
+
"@radix-ui/react-presence": "1.1.5",
2551
2551
+
"@radix-ui/react-primitive": "2.1.3",
2552
2552
+
"@radix-ui/react-use-callback-ref": "1.1.1",
2553
2553
+
"@radix-ui/react-use-controllable-state": "1.2.2",
2554
2554
+
"@radix-ui/react-use-layout-effect": "1.1.1",
2555
2555
+
"@radix-ui/react-use-previous": "1.1.1",
2556
2556
+
"@radix-ui/react-visually-hidden": "1.2.3"
2557
2557
+
},
2558
2558
+
"peerDependencies": {
2559
2559
+
"@types/react": "*",
2560
2560
+
"@types/react-dom": "*",
2561
2561
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2562
2562
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2563
2563
+
},
2564
2564
+
"peerDependenciesMeta": {
2565
2565
+
"@types/react": {
2566
2566
+
"optional": true
2567
2567
+
},
2568
2568
+
"@types/react-dom": {
2569
2569
+
"optional": true
2570
2570
+
}
2571
2571
+
}
2572
2572
+
},
2573
2573
+
"node_modules/@radix-ui/react-one-time-password-field": {
2574
2574
+
"version": "0.1.8",
2575
2575
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz",
2576
2576
+
"integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==",
2577
2577
+
"dependencies": {
2578
2578
+
"@radix-ui/number": "1.1.1",
2579
2579
+
"@radix-ui/primitive": "1.1.3",
2580
2580
+
"@radix-ui/react-collection": "1.1.7",
2581
2581
+
"@radix-ui/react-compose-refs": "1.1.2",
2582
2582
+
"@radix-ui/react-context": "1.1.2",
2583
2583
+
"@radix-ui/react-direction": "1.1.1",
2584
2584
+
"@radix-ui/react-primitive": "2.1.3",
2585
2585
+
"@radix-ui/react-roving-focus": "1.1.11",
2586
2586
+
"@radix-ui/react-use-controllable-state": "1.2.2",
2587
2587
+
"@radix-ui/react-use-effect-event": "0.0.2",
2588
2588
+
"@radix-ui/react-use-is-hydrated": "0.1.0",
2589
2589
+
"@radix-ui/react-use-layout-effect": "1.1.1"
2590
2590
+
},
2591
2591
+
"peerDependencies": {
2592
2592
+
"@types/react": "*",
2593
2593
+
"@types/react-dom": "*",
2594
2594
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2595
2595
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2596
2596
+
},
2597
2597
+
"peerDependenciesMeta": {
2598
2598
+
"@types/react": {
2599
2599
+
"optional": true
2600
2600
+
},
2601
2601
+
"@types/react-dom": {
2602
2602
+
"optional": true
2603
2603
+
}
2604
2604
+
}
2605
2605
+
},
2606
2606
+
"node_modules/@radix-ui/react-password-toggle-field": {
2607
2607
+
"version": "0.1.3",
2608
2608
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz",
2609
2609
+
"integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==",
2610
2610
+
"dependencies": {
2611
2611
+
"@radix-ui/primitive": "1.1.3",
2612
2612
+
"@radix-ui/react-compose-refs": "1.1.2",
2613
2613
+
"@radix-ui/react-context": "1.1.2",
2614
2614
+
"@radix-ui/react-id": "1.1.1",
2615
2615
+
"@radix-ui/react-primitive": "2.1.3",
2616
2616
+
"@radix-ui/react-use-controllable-state": "1.2.2",
2617
2617
+
"@radix-ui/react-use-effect-event": "0.0.2",
2618
2618
+
"@radix-ui/react-use-is-hydrated": "0.1.0"
2619
2619
+
},
2620
2620
+
"peerDependencies": {
2621
2621
+
"@types/react": "*",
2622
2622
+
"@types/react-dom": "*",
2623
2623
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2624
2624
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2625
2625
+
},
2626
2626
+
"peerDependenciesMeta": {
2627
2627
+
"@types/react": {
2628
2628
+
"optional": true
2629
2629
+
},
2630
2630
+
"@types/react-dom": {
2631
2631
+
"optional": true
2632
2632
+
}
2633
2633
+
}
2634
2634
+
},
2635
2635
+
"node_modules/@radix-ui/react-popover": {
2636
2636
+
"version": "1.1.15",
2637
2637
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz",
2638
2638
+
"integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==",
2639
2639
+
"dependencies": {
2640
2640
+
"@radix-ui/primitive": "1.1.3",
2641
2641
+
"@radix-ui/react-compose-refs": "1.1.2",
2642
2642
+
"@radix-ui/react-context": "1.1.2",
2643
2643
+
"@radix-ui/react-dismissable-layer": "1.1.11",
2644
2644
+
"@radix-ui/react-focus-guards": "1.1.3",
2645
2645
+
"@radix-ui/react-focus-scope": "1.1.7",
2646
2646
+
"@radix-ui/react-id": "1.1.1",
2647
2647
+
"@radix-ui/react-popper": "1.2.8",
2648
2648
+
"@radix-ui/react-portal": "1.1.9",
2649
2649
+
"@radix-ui/react-presence": "1.1.5",
2650
2650
+
"@radix-ui/react-primitive": "2.1.3",
2651
2651
+
"@radix-ui/react-slot": "1.2.3",
2652
2652
+
"@radix-ui/react-use-controllable-state": "1.2.2",
2653
2653
+
"aria-hidden": "^1.2.4",
2654
2654
+
"react-remove-scroll": "^2.6.3"
2655
2655
+
},
2656
2656
+
"peerDependencies": {
2657
2657
+
"@types/react": "*",
2658
2658
+
"@types/react-dom": "*",
2659
2659
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2660
2660
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2661
2661
+
},
2662
2662
+
"peerDependenciesMeta": {
2663
2663
+
"@types/react": {
2664
2664
+
"optional": true
2665
2665
+
},
2666
2666
+
"@types/react-dom": {
2667
2667
+
"optional": true
2668
2668
+
}
2669
2669
+
}
2670
2670
+
},
2671
2671
+
"node_modules/@radix-ui/react-popper": {
2672
2672
+
"version": "1.2.8",
2673
2673
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz",
2674
2674
+
"integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==",
2675
2675
+
"dependencies": {
2676
2676
+
"@floating-ui/react-dom": "^2.0.0",
2677
2677
+
"@radix-ui/react-arrow": "1.1.7",
2678
2678
+
"@radix-ui/react-compose-refs": "1.1.2",
2679
2679
+
"@radix-ui/react-context": "1.1.2",
2680
2680
+
"@radix-ui/react-primitive": "2.1.3",
2681
2681
+
"@radix-ui/react-use-callback-ref": "1.1.1",
2682
2682
+
"@radix-ui/react-use-layout-effect": "1.1.1",
2683
2683
+
"@radix-ui/react-use-rect": "1.1.1",
2684
2684
+
"@radix-ui/react-use-size": "1.1.1",
2685
2685
+
"@radix-ui/rect": "1.1.1"
2686
2686
+
},
2687
2687
+
"peerDependencies": {
2688
2688
+
"@types/react": "*",
2689
2689
+
"@types/react-dom": "*",
2690
2690
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2691
2691
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2692
2692
+
},
2693
2693
+
"peerDependenciesMeta": {
2694
2694
+
"@types/react": {
2695
2695
+
"optional": true
2696
2696
+
},
2697
2697
+
"@types/react-dom": {
2698
2698
+
"optional": true
2699
2699
+
}
2700
2700
+
}
2701
2701
+
},
2702
2702
+
"node_modules/@radix-ui/react-portal": {
2703
2703
+
"version": "1.1.9",
2704
2704
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
2705
2705
+
"integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
2706
2706
+
"dependencies": {
2707
2707
+
"@radix-ui/react-primitive": "2.1.3",
2708
2708
+
"@radix-ui/react-use-layout-effect": "1.1.1"
2709
2709
+
},
2710
2710
+
"peerDependencies": {
2711
2711
+
"@types/react": "*",
2712
2712
+
"@types/react-dom": "*",
2713
2713
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2714
2714
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2715
2715
+
},
2716
2716
+
"peerDependenciesMeta": {
2717
2717
+
"@types/react": {
2718
2718
+
"optional": true
2719
2719
+
},
2720
2720
+
"@types/react-dom": {
2721
2721
+
"optional": true
2722
2722
+
}
2723
2723
+
}
2724
2724
+
},
2725
2725
+
"node_modules/@radix-ui/react-presence": {
2726
2726
+
"version": "1.1.5",
2727
2727
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
2728
2728
+
"integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
2729
2729
+
"dependencies": {
2730
2730
+
"@radix-ui/react-compose-refs": "1.1.2",
2731
2731
+
"@radix-ui/react-use-layout-effect": "1.1.1"
2732
2732
+
},
2733
2733
+
"peerDependencies": {
2734
2734
+
"@types/react": "*",
2735
2735
+
"@types/react-dom": "*",
2736
2736
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2737
2737
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2738
2738
+
},
2739
2739
+
"peerDependenciesMeta": {
2740
2740
+
"@types/react": {
2741
2741
+
"optional": true
2742
2742
+
},
2743
2743
+
"@types/react-dom": {
2744
2744
+
"optional": true
2745
2745
+
}
2746
2746
+
}
2747
2747
+
},
2748
2748
+
"node_modules/@radix-ui/react-primitive": {
2749
2749
+
"version": "2.1.3",
2750
2750
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
2751
2751
+
"integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
2752
2752
+
"dependencies": {
2753
2753
+
"@radix-ui/react-slot": "1.2.3"
2754
2754
+
},
2755
2755
+
"peerDependencies": {
2756
2756
+
"@types/react": "*",
2757
2757
+
"@types/react-dom": "*",
2758
2758
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2759
2759
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2760
2760
+
},
2761
2761
+
"peerDependenciesMeta": {
2762
2762
+
"@types/react": {
2763
2763
+
"optional": true
2764
2764
+
},
2765
2765
+
"@types/react-dom": {
2766
2766
+
"optional": true
2767
2767
+
}
2768
2768
+
}
2769
2769
+
},
2770
2770
+
"node_modules/@radix-ui/react-progress": {
2771
2771
+
"version": "1.1.7",
2772
2772
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz",
2773
2773
+
"integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==",
2774
2774
+
"dependencies": {
2775
2775
+
"@radix-ui/react-context": "1.1.2",
2776
2776
+
"@radix-ui/react-primitive": "2.1.3"
2777
2777
+
},
2778
2778
+
"peerDependencies": {
2779
2779
+
"@types/react": "*",
2780
2780
+
"@types/react-dom": "*",
2781
2781
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2782
2782
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2783
2783
+
},
2784
2784
+
"peerDependenciesMeta": {
2785
2785
+
"@types/react": {
2786
2786
+
"optional": true
2787
2787
+
},
2788
2788
+
"@types/react-dom": {
2789
2789
+
"optional": true
2790
2790
+
}
2791
2791
+
}
2792
2792
+
},
2793
2793
+
"node_modules/@radix-ui/react-radio-group": {
2794
2794
+
"version": "1.3.8",
2795
2795
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz",
2796
2796
+
"integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==",
2797
2797
+
"dependencies": {
2798
2798
+
"@radix-ui/primitive": "1.1.3",
2799
2799
+
"@radix-ui/react-compose-refs": "1.1.2",
2800
2800
+
"@radix-ui/react-context": "1.1.2",
2801
2801
+
"@radix-ui/react-direction": "1.1.1",
2802
2802
+
"@radix-ui/react-presence": "1.1.5",
2803
2803
+
"@radix-ui/react-primitive": "2.1.3",
2804
2804
+
"@radix-ui/react-roving-focus": "1.1.11",
2805
2805
+
"@radix-ui/react-use-controllable-state": "1.2.2",
2806
2806
+
"@radix-ui/react-use-previous": "1.1.1",
2807
2807
+
"@radix-ui/react-use-size": "1.1.1"
2808
2808
+
},
2809
2809
+
"peerDependencies": {
2810
2810
+
"@types/react": "*",
2811
2811
+
"@types/react-dom": "*",
2812
2812
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2813
2813
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2814
2814
+
},
2815
2815
+
"peerDependenciesMeta": {
2816
2816
+
"@types/react": {
2817
2817
+
"optional": true
2818
2818
+
},
2819
2819
+
"@types/react-dom": {
2820
2820
+
"optional": true
2821
2821
+
}
2822
2822
+
}
2823
2823
+
},
2824
2824
+
"node_modules/@radix-ui/react-roving-focus": {
2825
2825
+
"version": "1.1.11",
2826
2826
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz",
2827
2827
+
"integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==",
2828
2828
+
"dependencies": {
2829
2829
+
"@radix-ui/primitive": "1.1.3",
2830
2830
+
"@radix-ui/react-collection": "1.1.7",
2831
2831
+
"@radix-ui/react-compose-refs": "1.1.2",
2832
2832
+
"@radix-ui/react-context": "1.1.2",
2833
2833
+
"@radix-ui/react-direction": "1.1.1",
2834
2834
+
"@radix-ui/react-id": "1.1.1",
2835
2835
+
"@radix-ui/react-primitive": "2.1.3",
2836
2836
+
"@radix-ui/react-use-callback-ref": "1.1.1",
2837
2837
+
"@radix-ui/react-use-controllable-state": "1.2.2"
2838
2838
+
},
2839
2839
+
"peerDependencies": {
2840
2840
+
"@types/react": "*",
2841
2841
+
"@types/react-dom": "*",
2842
2842
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2843
2843
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2844
2844
+
},
2845
2845
+
"peerDependenciesMeta": {
2846
2846
+
"@types/react": {
2847
2847
+
"optional": true
2848
2848
+
},
2849
2849
+
"@types/react-dom": {
2850
2850
+
"optional": true
2851
2851
+
}
2852
2852
+
}
2853
2853
+
},
2854
2854
+
"node_modules/@radix-ui/react-scroll-area": {
2855
2855
+
"version": "1.2.10",
2856
2856
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz",
2857
2857
+
"integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==",
2858
2858
+
"dependencies": {
2859
2859
+
"@radix-ui/number": "1.1.1",
2860
2860
+
"@radix-ui/primitive": "1.1.3",
2861
2861
+
"@radix-ui/react-compose-refs": "1.1.2",
2862
2862
+
"@radix-ui/react-context": "1.1.2",
2863
2863
+
"@radix-ui/react-direction": "1.1.1",
2864
2864
+
"@radix-ui/react-presence": "1.1.5",
2865
2865
+
"@radix-ui/react-primitive": "2.1.3",
2866
2866
+
"@radix-ui/react-use-callback-ref": "1.1.1",
2867
2867
+
"@radix-ui/react-use-layout-effect": "1.1.1"
2868
2868
+
},
2869
2869
+
"peerDependencies": {
2870
2870
+
"@types/react": "*",
2871
2871
+
"@types/react-dom": "*",
2872
2872
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2873
2873
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2874
2874
+
},
2875
2875
+
"peerDependenciesMeta": {
2876
2876
+
"@types/react": {
2877
2877
+
"optional": true
2878
2878
+
},
2879
2879
+
"@types/react-dom": {
2880
2880
+
"optional": true
2881
2881
+
}
2882
2882
+
}
2883
2883
+
},
2884
2884
+
"node_modules/@radix-ui/react-select": {
2885
2885
+
"version": "2.2.6",
2886
2886
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz",
2887
2887
+
"integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==",
2888
2888
+
"dependencies": {
2889
2889
+
"@radix-ui/number": "1.1.1",
2890
2890
+
"@radix-ui/primitive": "1.1.3",
2891
2891
+
"@radix-ui/react-collection": "1.1.7",
2892
2892
+
"@radix-ui/react-compose-refs": "1.1.2",
2893
2893
+
"@radix-ui/react-context": "1.1.2",
2894
2894
+
"@radix-ui/react-direction": "1.1.1",
2895
2895
+
"@radix-ui/react-dismissable-layer": "1.1.11",
2896
2896
+
"@radix-ui/react-focus-guards": "1.1.3",
2897
2897
+
"@radix-ui/react-focus-scope": "1.1.7",
2898
2898
+
"@radix-ui/react-id": "1.1.1",
2899
2899
+
"@radix-ui/react-popper": "1.2.8",
2900
2900
+
"@radix-ui/react-portal": "1.1.9",
2901
2901
+
"@radix-ui/react-primitive": "2.1.3",
2902
2902
+
"@radix-ui/react-slot": "1.2.3",
2903
2903
+
"@radix-ui/react-use-callback-ref": "1.1.1",
2904
2904
+
"@radix-ui/react-use-controllable-state": "1.2.2",
2905
2905
+
"@radix-ui/react-use-layout-effect": "1.1.1",
2906
2906
+
"@radix-ui/react-use-previous": "1.1.1",
2907
2907
+
"@radix-ui/react-visually-hidden": "1.2.3",
2908
2908
+
"aria-hidden": "^1.2.4",
2909
2909
+
"react-remove-scroll": "^2.6.3"
2910
2910
+
},
2911
2911
+
"peerDependencies": {
2912
2912
+
"@types/react": "*",
2913
2913
+
"@types/react-dom": "*",
2914
2914
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2915
2915
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2916
2916
+
},
2917
2917
+
"peerDependenciesMeta": {
2918
2918
+
"@types/react": {
2919
2919
+
"optional": true
2920
2920
+
},
2921
2921
+
"@types/react-dom": {
2922
2922
+
"optional": true
2923
2923
+
}
2924
2924
+
}
2925
2925
+
},
2926
2926
+
"node_modules/@radix-ui/react-separator": {
2927
2927
+
"version": "1.1.7",
2928
2928
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz",
2929
2929
+
"integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==",
2930
2930
+
"dependencies": {
2931
2931
+
"@radix-ui/react-primitive": "2.1.3"
2932
2932
+
},
2933
2933
+
"peerDependencies": {
2934
2934
+
"@types/react": "*",
2935
2935
+
"@types/react-dom": "*",
2936
2936
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2937
2937
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2938
2938
+
},
2939
2939
+
"peerDependenciesMeta": {
2940
2940
+
"@types/react": {
2941
2941
+
"optional": true
2942
2942
+
},
2943
2943
+
"@types/react-dom": {
2944
2944
+
"optional": true
2945
2945
+
}
2946
2946
+
}
2947
2947
+
},
2948
2948
+
"node_modules/@radix-ui/react-slider": {
2949
2949
+
"version": "1.3.6",
2950
2950
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz",
2951
2951
+
"integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==",
2952
2952
+
"dependencies": {
2953
2953
+
"@radix-ui/number": "1.1.1",
2954
2954
+
"@radix-ui/primitive": "1.1.3",
2955
2955
+
"@radix-ui/react-collection": "1.1.7",
2956
2956
+
"@radix-ui/react-compose-refs": "1.1.2",
2957
2957
+
"@radix-ui/react-context": "1.1.2",
2958
2958
+
"@radix-ui/react-direction": "1.1.1",
2959
2959
+
"@radix-ui/react-primitive": "2.1.3",
2960
2960
+
"@radix-ui/react-use-controllable-state": "1.2.2",
2961
2961
+
"@radix-ui/react-use-layout-effect": "1.1.1",
2962
2962
+
"@radix-ui/react-use-previous": "1.1.1",
2963
2963
+
"@radix-ui/react-use-size": "1.1.1"
2964
2964
+
},
2965
2965
+
"peerDependencies": {
2966
2966
+
"@types/react": "*",
2967
2967
+
"@types/react-dom": "*",
2968
2968
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2969
2969
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2970
2970
+
},
2971
2971
+
"peerDependenciesMeta": {
2972
2972
+
"@types/react": {
2973
2973
+
"optional": true
2974
2974
+
},
2975
2975
+
"@types/react-dom": {
2976
2976
+
"optional": true
2977
2977
+
}
2978
2978
+
}
2979
2979
+
},
2980
2980
+
"node_modules/@radix-ui/react-slot": {
2981
2981
+
"version": "1.2.3",
2982
2982
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
2983
2983
+
"integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
2984
2984
+
"dependencies": {
2985
2985
+
"@radix-ui/react-compose-refs": "1.1.2"
2986
2986
+
},
2987
2987
+
"peerDependencies": {
2988
2988
+
"@types/react": "*",
2989
2989
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2990
2990
+
},
2991
2991
+
"peerDependenciesMeta": {
2992
2992
+
"@types/react": {
2993
2993
+
"optional": true
2994
2994
+
}
2995
2995
+
}
2996
2996
+
},
2997
2997
+
"node_modules/@radix-ui/react-switch": {
2998
2998
+
"version": "1.2.6",
2999
2999
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz",
3000
3000
+
"integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==",
3001
3001
+
"dependencies": {
3002
3002
+
"@radix-ui/primitive": "1.1.3",
3003
3003
+
"@radix-ui/react-compose-refs": "1.1.2",
3004
3004
+
"@radix-ui/react-context": "1.1.2",
3005
3005
+
"@radix-ui/react-primitive": "2.1.3",
3006
3006
+
"@radix-ui/react-use-controllable-state": "1.2.2",
3007
3007
+
"@radix-ui/react-use-previous": "1.1.1",
3008
3008
+
"@radix-ui/react-use-size": "1.1.1"
3009
3009
+
},
3010
3010
+
"peerDependencies": {
3011
3011
+
"@types/react": "*",
3012
3012
+
"@types/react-dom": "*",
3013
3013
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
3014
3014
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3015
3015
+
},
3016
3016
+
"peerDependenciesMeta": {
3017
3017
+
"@types/react": {
3018
3018
+
"optional": true
3019
3019
+
},
3020
3020
+
"@types/react-dom": {
3021
3021
+
"optional": true
3022
3022
+
}
3023
3023
+
}
3024
3024
+
},
3025
3025
+
"node_modules/@radix-ui/react-tabs": {
3026
3026
+
"version": "1.1.13",
3027
3027
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz",
3028
3028
+
"integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==",
3029
3029
+
"dependencies": {
3030
3030
+
"@radix-ui/primitive": "1.1.3",
3031
3031
+
"@radix-ui/react-context": "1.1.2",
3032
3032
+
"@radix-ui/react-direction": "1.1.1",
3033
3033
+
"@radix-ui/react-id": "1.1.1",
3034
3034
+
"@radix-ui/react-presence": "1.1.5",
3035
3035
+
"@radix-ui/react-primitive": "2.1.3",
3036
3036
+
"@radix-ui/react-roving-focus": "1.1.11",
3037
3037
+
"@radix-ui/react-use-controllable-state": "1.2.2"
3038
3038
+
},
3039
3039
+
"peerDependencies": {
3040
3040
+
"@types/react": "*",
3041
3041
+
"@types/react-dom": "*",
3042
3042
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
3043
3043
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3044
3044
+
},
3045
3045
+
"peerDependenciesMeta": {
3046
3046
+
"@types/react": {
3047
3047
+
"optional": true
3048
3048
+
},
3049
3049
+
"@types/react-dom": {
3050
3050
+
"optional": true
3051
3051
+
}
3052
3052
+
}
3053
3053
+
},
3054
3054
+
"node_modules/@radix-ui/react-toast": {
3055
3055
+
"version": "1.2.15",
3056
3056
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz",
3057
3057
+
"integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==",
3058
3058
+
"dependencies": {
3059
3059
+
"@radix-ui/primitive": "1.1.3",
3060
3060
+
"@radix-ui/react-collection": "1.1.7",
3061
3061
+
"@radix-ui/react-compose-refs": "1.1.2",
3062
3062
+
"@radix-ui/react-context": "1.1.2",
3063
3063
+
"@radix-ui/react-dismissable-layer": "1.1.11",
3064
3064
+
"@radix-ui/react-portal": "1.1.9",
3065
3065
+
"@radix-ui/react-presence": "1.1.5",
3066
3066
+
"@radix-ui/react-primitive": "2.1.3",
3067
3067
+
"@radix-ui/react-use-callback-ref": "1.1.1",
3068
3068
+
"@radix-ui/react-use-controllable-state": "1.2.2",
3069
3069
+
"@radix-ui/react-use-layout-effect": "1.1.1",
3070
3070
+
"@radix-ui/react-visually-hidden": "1.2.3"
3071
3071
+
},
3072
3072
+
"peerDependencies": {
3073
3073
+
"@types/react": "*",
3074
3074
+
"@types/react-dom": "*",
3075
3075
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
3076
3076
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3077
3077
+
},
3078
3078
+
"peerDependenciesMeta": {
3079
3079
+
"@types/react": {
3080
3080
+
"optional": true
3081
3081
+
},
3082
3082
+
"@types/react-dom": {
3083
3083
+
"optional": true
3084
3084
+
}
3085
3085
+
}
3086
3086
+
},
3087
3087
+
"node_modules/@radix-ui/react-toggle": {
3088
3088
+
"version": "1.1.10",
3089
3089
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz",
3090
3090
+
"integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==",
3091
3091
+
"dependencies": {
3092
3092
+
"@radix-ui/primitive": "1.1.3",
3093
3093
+
"@radix-ui/react-primitive": "2.1.3",
3094
3094
+
"@radix-ui/react-use-controllable-state": "1.2.2"
3095
3095
+
},
3096
3096
+
"peerDependencies": {
3097
3097
+
"@types/react": "*",
3098
3098
+
"@types/react-dom": "*",
3099
3099
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
3100
3100
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3101
3101
+
},
3102
3102
+
"peerDependenciesMeta": {
3103
3103
+
"@types/react": {
3104
3104
+
"optional": true
3105
3105
+
},
3106
3106
+
"@types/react-dom": {
3107
3107
+
"optional": true
3108
3108
+
}
3109
3109
+
}
3110
3110
+
},
3111
3111
+
"node_modules/@radix-ui/react-toggle-group": {
3112
3112
+
"version": "1.1.11",
3113
3113
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz",
3114
3114
+
"integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==",
3115
3115
+
"dependencies": {
3116
3116
+
"@radix-ui/primitive": "1.1.3",
3117
3117
+
"@radix-ui/react-context": "1.1.2",
3118
3118
+
"@radix-ui/react-direction": "1.1.1",
3119
3119
+
"@radix-ui/react-primitive": "2.1.3",
3120
3120
+
"@radix-ui/react-roving-focus": "1.1.11",
3121
3121
+
"@radix-ui/react-toggle": "1.1.10",
3122
3122
+
"@radix-ui/react-use-controllable-state": "1.2.2"
3123
3123
+
},
3124
3124
+
"peerDependencies": {
3125
3125
+
"@types/react": "*",
3126
3126
+
"@types/react-dom": "*",
3127
3127
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
3128
3128
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3129
3129
+
},
3130
3130
+
"peerDependenciesMeta": {
3131
3131
+
"@types/react": {
3132
3132
+
"optional": true
3133
3133
+
},
3134
3134
+
"@types/react-dom": {
3135
3135
+
"optional": true
3136
3136
+
}
3137
3137
+
}
3138
3138
+
},
3139
3139
+
"node_modules/@radix-ui/react-toolbar": {
3140
3140
+
"version": "1.1.11",
3141
3141
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz",
3142
3142
+
"integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==",
3143
3143
+
"dependencies": {
3144
3144
+
"@radix-ui/primitive": "1.1.3",
3145
3145
+
"@radix-ui/react-context": "1.1.2",
3146
3146
+
"@radix-ui/react-direction": "1.1.1",
3147
3147
+
"@radix-ui/react-primitive": "2.1.3",
3148
3148
+
"@radix-ui/react-roving-focus": "1.1.11",
3149
3149
+
"@radix-ui/react-separator": "1.1.7",
3150
3150
+
"@radix-ui/react-toggle-group": "1.1.11"
3151
3151
+
},
3152
3152
+
"peerDependencies": {
3153
3153
+
"@types/react": "*",
3154
3154
+
"@types/react-dom": "*",
3155
3155
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
3156
3156
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3157
3157
+
},
3158
3158
+
"peerDependenciesMeta": {
3159
3159
+
"@types/react": {
3160
3160
+
"optional": true
3161
3161
+
},
3162
3162
+
"@types/react-dom": {
3163
3163
+
"optional": true
3164
3164
+
}
3165
3165
+
}
3166
3166
+
},
3167
3167
+
"node_modules/@radix-ui/react-tooltip": {
3168
3168
+
"version": "1.2.8",
3169
3169
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz",
3170
3170
+
"integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==",
3171
3171
+
"dependencies": {
3172
3172
+
"@radix-ui/primitive": "1.1.3",
3173
3173
+
"@radix-ui/react-compose-refs": "1.1.2",
3174
3174
+
"@radix-ui/react-context": "1.1.2",
3175
3175
+
"@radix-ui/react-dismissable-layer": "1.1.11",
3176
3176
+
"@radix-ui/react-id": "1.1.1",
3177
3177
+
"@radix-ui/react-popper": "1.2.8",
3178
3178
+
"@radix-ui/react-portal": "1.1.9",
3179
3179
+
"@radix-ui/react-presence": "1.1.5",
3180
3180
+
"@radix-ui/react-primitive": "2.1.3",
3181
3181
+
"@radix-ui/react-slot": "1.2.3",
3182
3182
+
"@radix-ui/react-use-controllable-state": "1.2.2",
3183
3183
+
"@radix-ui/react-visually-hidden": "1.2.3"
3184
3184
+
},
3185
3185
+
"peerDependencies": {
3186
3186
+
"@types/react": "*",
3187
3187
+
"@types/react-dom": "*",
3188
3188
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
3189
3189
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3190
3190
+
},
3191
3191
+
"peerDependenciesMeta": {
3192
3192
+
"@types/react": {
3193
3193
+
"optional": true
3194
3194
+
},
3195
3195
+
"@types/react-dom": {
3196
3196
+
"optional": true
3197
3197
+
}
3198
3198
+
}
3199
3199
+
},
3200
3200
+
"node_modules/@radix-ui/react-use-callback-ref": {
3201
3201
+
"version": "1.1.1",
3202
3202
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
3203
3203
+
"integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
3204
3204
+
"peerDependencies": {
3205
3205
+
"@types/react": "*",
3206
3206
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3207
3207
+
},
3208
3208
+
"peerDependenciesMeta": {
3209
3209
+
"@types/react": {
3210
3210
+
"optional": true
3211
3211
+
}
3212
3212
+
}
3213
3213
+
},
3214
3214
+
"node_modules/@radix-ui/react-use-controllable-state": {
3215
3215
+
"version": "1.2.2",
3216
3216
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
3217
3217
+
"integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
3218
3218
+
"dependencies": {
3219
3219
+
"@radix-ui/react-use-effect-event": "0.0.2",
3220
3220
+
"@radix-ui/react-use-layout-effect": "1.1.1"
3221
3221
+
},
3222
3222
+
"peerDependencies": {
3223
3223
+
"@types/react": "*",
3224
3224
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3225
3225
+
},
3226
3226
+
"peerDependenciesMeta": {
3227
3227
+
"@types/react": {
3228
3228
+
"optional": true
3229
3229
+
}
3230
3230
+
}
3231
3231
+
},
3232
3232
+
"node_modules/@radix-ui/react-use-effect-event": {
3233
3233
+
"version": "0.0.2",
3234
3234
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
3235
3235
+
"integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
3236
3236
+
"dependencies": {
3237
3237
+
"@radix-ui/react-use-layout-effect": "1.1.1"
3238
3238
+
},
3239
3239
+
"peerDependencies": {
3240
3240
+
"@types/react": "*",
3241
3241
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3242
3242
+
},
3243
3243
+
"peerDependenciesMeta": {
3244
3244
+
"@types/react": {
3245
3245
+
"optional": true
3246
3246
+
}
3247
3247
+
}
3248
3248
+
},
3249
3249
+
"node_modules/@radix-ui/react-use-escape-keydown": {
3250
3250
+
"version": "1.1.1",
3251
3251
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
3252
3252
+
"integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
3253
3253
+
"dependencies": {
3254
3254
+
"@radix-ui/react-use-callback-ref": "1.1.1"
3255
3255
+
},
3256
3256
+
"peerDependencies": {
3257
3257
+
"@types/react": "*",
3258
3258
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3259
3259
+
},
3260
3260
+
"peerDependenciesMeta": {
3261
3261
+
"@types/react": {
3262
3262
+
"optional": true
3263
3263
+
}
3264
3264
+
}
3265
3265
+
},
3266
3266
+
"node_modules/@radix-ui/react-use-is-hydrated": {
3267
3267
+
"version": "0.1.0",
3268
3268
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz",
3269
3269
+
"integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==",
3270
3270
+
"dependencies": {
3271
3271
+
"use-sync-external-store": "^1.5.0"
3272
3272
+
},
3273
3273
+
"peerDependencies": {
3274
3274
+
"@types/react": "*",
3275
3275
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3276
3276
+
},
3277
3277
+
"peerDependenciesMeta": {
3278
3278
+
"@types/react": {
3279
3279
+
"optional": true
3280
3280
+
}
3281
3281
+
}
3282
3282
+
},
3283
3283
+
"node_modules/@radix-ui/react-use-layout-effect": {
3284
3284
+
"version": "1.1.1",
3285
3285
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
3286
3286
+
"integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
3287
3287
+
"peerDependencies": {
3288
3288
+
"@types/react": "*",
3289
3289
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3290
3290
+
},
3291
3291
+
"peerDependenciesMeta": {
3292
3292
+
"@types/react": {
3293
3293
+
"optional": true
3294
3294
+
}
3295
3295
+
}
3296
3296
+
},
3297
3297
+
"node_modules/@radix-ui/react-use-previous": {
3298
3298
+
"version": "1.1.1",
3299
3299
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz",
3300
3300
+
"integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==",
3301
3301
+
"peerDependencies": {
3302
3302
+
"@types/react": "*",
3303
3303
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3304
3304
+
},
3305
3305
+
"peerDependenciesMeta": {
3306
3306
+
"@types/react": {
3307
3307
+
"optional": true
3308
3308
+
}
3309
3309
+
}
3310
3310
+
},
3311
3311
+
"node_modules/@radix-ui/react-use-rect": {
3312
3312
+
"version": "1.1.1",
3313
3313
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz",
3314
3314
+
"integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==",
3315
3315
+
"dependencies": {
3316
3316
+
"@radix-ui/rect": "1.1.1"
3317
3317
+
},
3318
3318
+
"peerDependencies": {
3319
3319
+
"@types/react": "*",
3320
3320
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3321
3321
+
},
3322
3322
+
"peerDependenciesMeta": {
3323
3323
+
"@types/react": {
3324
3324
+
"optional": true
3325
3325
+
}
3326
3326
+
}
3327
3327
+
},
3328
3328
+
"node_modules/@radix-ui/react-use-size": {
3329
3329
+
"version": "1.1.1",
3330
3330
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
3331
3331
+
"integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
3332
3332
+
"dependencies": {
3333
3333
+
"@radix-ui/react-use-layout-effect": "1.1.1"
3334
3334
+
},
3335
3335
+
"peerDependencies": {
3336
3336
+
"@types/react": "*",
3337
3337
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3338
3338
+
},
3339
3339
+
"peerDependenciesMeta": {
3340
3340
+
"@types/react": {
3341
3341
+
"optional": true
3342
3342
+
}
3343
3343
+
}
3344
3344
+
},
3345
3345
+
"node_modules/@radix-ui/react-visually-hidden": {
3346
3346
+
"version": "1.2.3",
3347
3347
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz",
3348
3348
+
"integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==",
3349
3349
+
"dependencies": {
3350
3350
+
"@radix-ui/react-primitive": "2.1.3"
3351
3351
+
},
3352
3352
+
"peerDependencies": {
3353
3353
+
"@types/react": "*",
3354
3354
+
"@types/react-dom": "*",
3355
3355
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
3356
3356
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
3357
3357
+
},
3358
3358
+
"peerDependenciesMeta": {
3359
3359
+
"@types/react": {
3360
3360
+
"optional": true
3361
3361
+
},
3362
3362
+
"@types/react-dom": {
3363
3363
+
"optional": true
3364
3364
+
}
3365
3365
+
}
3366
3366
+
},
3367
3367
+
"node_modules/@radix-ui/rect": {
3368
3368
+
"version": "1.1.1",
3369
3369
+
"resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz",
3370
3370
+
"integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="
3371
3371
+
},
1898
3372
"node_modules/@rolldown/pluginutils": {
1899
3373
"version": "1.0.0-beta.27",
1900
3374
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
···
3806
5280
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
3807
5281
"dev": true,
3808
5282
"license": "Python-2.0"
5283
5283
+
},
5284
5284
+
"node_modules/aria-hidden": {
5285
5285
+
"version": "1.2.6",
5286
5286
+
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
5287
5287
+
"integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
5288
5288
+
"dependencies": {
5289
5289
+
"tslib": "^2.0.0"
5290
5290
+
},
5291
5291
+
"engines": {
5292
5292
+
"node": ">=10"
5293
5293
+
}
3809
5294
},
3810
5295
"node_modules/aria-query": {
3811
5296
"version": "5.3.0",
···
4716
6201
"node": ">=8"
4717
6202
}
4718
6203
},
6204
6204
+
"node_modules/detect-node-es": {
6205
6205
+
"version": "1.1.0",
6206
6206
+
"resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
6207
6207
+
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
6208
6208
+
},
4719
6209
"node_modules/diff": {
4720
6210
"version": "8.0.2",
4721
6211
"resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz",
···
5735
7225
},
5736
7226
"funding": {
5737
7227
"url": "https://github.com/sponsors/ljharb"
7228
7228
+
}
7229
7229
+
},
7230
7230
+
"node_modules/get-nonce": {
7231
7231
+
"version": "1.0.1",
7232
7232
+
"resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
7233
7233
+
"integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
7234
7234
+
"engines": {
7235
7235
+
"node": ">=6"
5738
7236
}
5739
7237
},
5740
7238
"node_modules/get-proto": {
···
10338
11836
],
10339
11837
"license": "MIT"
10340
11838
},
11839
11839
+
"node_modules/radix-ui": {
11840
11840
+
"version": "1.4.3",
11841
11841
+
"resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz",
11842
11842
+
"integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==",
11843
11843
+
"dependencies": {
11844
11844
+
"@radix-ui/primitive": "1.1.3",
11845
11845
+
"@radix-ui/react-accessible-icon": "1.1.7",
11846
11846
+
"@radix-ui/react-accordion": "1.2.12",
11847
11847
+
"@radix-ui/react-alert-dialog": "1.1.15",
11848
11848
+
"@radix-ui/react-arrow": "1.1.7",
11849
11849
+
"@radix-ui/react-aspect-ratio": "1.1.7",
11850
11850
+
"@radix-ui/react-avatar": "1.1.10",
11851
11851
+
"@radix-ui/react-checkbox": "1.3.3",
11852
11852
+
"@radix-ui/react-collapsible": "1.1.12",
11853
11853
+
"@radix-ui/react-collection": "1.1.7",
11854
11854
+
"@radix-ui/react-compose-refs": "1.1.2",
11855
11855
+
"@radix-ui/react-context": "1.1.2",
11856
11856
+
"@radix-ui/react-context-menu": "2.2.16",
11857
11857
+
"@radix-ui/react-dialog": "1.1.15",
11858
11858
+
"@radix-ui/react-direction": "1.1.1",
11859
11859
+
"@radix-ui/react-dismissable-layer": "1.1.11",
11860
11860
+
"@radix-ui/react-dropdown-menu": "2.1.16",
11861
11861
+
"@radix-ui/react-focus-guards": "1.1.3",
11862
11862
+
"@radix-ui/react-focus-scope": "1.1.7",
11863
11863
+
"@radix-ui/react-form": "0.1.8",
11864
11864
+
"@radix-ui/react-hover-card": "1.1.15",
11865
11865
+
"@radix-ui/react-label": "2.1.7",
11866
11866
+
"@radix-ui/react-menu": "2.1.16",
11867
11867
+
"@radix-ui/react-menubar": "1.1.16",
11868
11868
+
"@radix-ui/react-navigation-menu": "1.2.14",
11869
11869
+
"@radix-ui/react-one-time-password-field": "0.1.8",
11870
11870
+
"@radix-ui/react-password-toggle-field": "0.1.3",
11871
11871
+
"@radix-ui/react-popover": "1.1.15",
11872
11872
+
"@radix-ui/react-popper": "1.2.8",
11873
11873
+
"@radix-ui/react-portal": "1.1.9",
11874
11874
+
"@radix-ui/react-presence": "1.1.5",
11875
11875
+
"@radix-ui/react-primitive": "2.1.3",
11876
11876
+
"@radix-ui/react-progress": "1.1.7",
11877
11877
+
"@radix-ui/react-radio-group": "1.3.8",
11878
11878
+
"@radix-ui/react-roving-focus": "1.1.11",
11879
11879
+
"@radix-ui/react-scroll-area": "1.2.10",
11880
11880
+
"@radix-ui/react-select": "2.2.6",
11881
11881
+
"@radix-ui/react-separator": "1.1.7",
11882
11882
+
"@radix-ui/react-slider": "1.3.6",
11883
11883
+
"@radix-ui/react-slot": "1.2.3",
11884
11884
+
"@radix-ui/react-switch": "1.2.6",
11885
11885
+
"@radix-ui/react-tabs": "1.1.13",
11886
11886
+
"@radix-ui/react-toast": "1.2.15",
11887
11887
+
"@radix-ui/react-toggle": "1.1.10",
11888
11888
+
"@radix-ui/react-toggle-group": "1.1.11",
11889
11889
+
"@radix-ui/react-toolbar": "1.1.11",
11890
11890
+
"@radix-ui/react-tooltip": "1.2.8",
11891
11891
+
"@radix-ui/react-use-callback-ref": "1.1.1",
11892
11892
+
"@radix-ui/react-use-controllable-state": "1.2.2",
11893
11893
+
"@radix-ui/react-use-effect-event": "0.0.2",
11894
11894
+
"@radix-ui/react-use-escape-keydown": "1.1.1",
11895
11895
+
"@radix-ui/react-use-is-hydrated": "0.1.0",
11896
11896
+
"@radix-ui/react-use-layout-effect": "1.1.1",
11897
11897
+
"@radix-ui/react-use-size": "1.1.1",
11898
11898
+
"@radix-ui/react-visually-hidden": "1.2.3"
11899
11899
+
},
11900
11900
+
"peerDependencies": {
11901
11901
+
"@types/react": "*",
11902
11902
+
"@types/react-dom": "*",
11903
11903
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
11904
11904
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
11905
11905
+
},
11906
11906
+
"peerDependenciesMeta": {
11907
11907
+
"@types/react": {
11908
11908
+
"optional": true
11909
11909
+
},
11910
11910
+
"@types/react-dom": {
11911
11911
+
"optional": true
11912
11912
+
}
11913
11913
+
}
11914
11914
+
},
10341
11915
"node_modules/react": {
10342
11916
"version": "19.1.1",
10343
11917
"resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz",
···
10399
11973
"node": ">=0.10.0"
10400
11974
}
10401
11975
},
11976
11976
+
"node_modules/react-remove-scroll": {
11977
11977
+
"version": "2.7.1",
11978
11978
+
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz",
11979
11979
+
"integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==",
11980
11980
+
"dependencies": {
11981
11981
+
"react-remove-scroll-bar": "^2.3.7",
11982
11982
+
"react-style-singleton": "^2.2.3",
11983
11983
+
"tslib": "^2.1.0",
11984
11984
+
"use-callback-ref": "^1.3.3",
11985
11985
+
"use-sidecar": "^1.1.3"
11986
11986
+
},
11987
11987
+
"engines": {
11988
11988
+
"node": ">=10"
11989
11989
+
},
11990
11990
+
"peerDependencies": {
11991
11991
+
"@types/react": "*",
11992
11992
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
11993
11993
+
},
11994
11994
+
"peerDependenciesMeta": {
11995
11995
+
"@types/react": {
11996
11996
+
"optional": true
11997
11997
+
}
11998
11998
+
}
11999
11999
+
},
12000
12000
+
"node_modules/react-remove-scroll-bar": {
12001
12001
+
"version": "2.3.8",
12002
12002
+
"resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
12003
12003
+
"integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
12004
12004
+
"dependencies": {
12005
12005
+
"react-style-singleton": "^2.2.2",
12006
12006
+
"tslib": "^2.0.0"
12007
12007
+
},
12008
12008
+
"engines": {
12009
12009
+
"node": ">=10"
12010
12010
+
},
12011
12011
+
"peerDependencies": {
12012
12012
+
"@types/react": "*",
12013
12013
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
12014
12014
+
},
12015
12015
+
"peerDependenciesMeta": {
12016
12016
+
"@types/react": {
12017
12017
+
"optional": true
12018
12018
+
}
12019
12019
+
}
12020
12020
+
},
12021
12021
+
"node_modules/react-style-singleton": {
12022
12022
+
"version": "2.2.3",
12023
12023
+
"resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
12024
12024
+
"integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
12025
12025
+
"dependencies": {
12026
12026
+
"get-nonce": "^1.0.0",
12027
12027
+
"tslib": "^2.0.0"
12028
12028
+
},
12029
12029
+
"engines": {
12030
12030
+
"node": ">=10"
12031
12031
+
},
12032
12032
+
"peerDependencies": {
12033
12033
+
"@types/react": "*",
12034
12034
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
12035
12035
+
},
12036
12036
+
"peerDependenciesMeta": {
12037
12037
+
"@types/react": {
12038
12038
+
"optional": true
12039
12039
+
}
12040
12040
+
}
12041
12041
+
},
10402
12042
"node_modules/readdirp": {
10403
12043
"version": "3.6.0",
10404
12044
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
···
11892
13532
"peer": true,
11893
13533
"dependencies": {
11894
13534
"punycode": "^2.1.0"
13535
13535
+
}
13536
13536
+
},
13537
13537
+
"node_modules/use-callback-ref": {
13538
13538
+
"version": "1.3.3",
13539
13539
+
"resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
13540
13540
+
"integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
13541
13541
+
"dependencies": {
13542
13542
+
"tslib": "^2.0.0"
13543
13543
+
},
13544
13544
+
"engines": {
13545
13545
+
"node": ">=10"
13546
13546
+
},
13547
13547
+
"peerDependencies": {
13548
13548
+
"@types/react": "*",
13549
13549
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
13550
13550
+
},
13551
13551
+
"peerDependenciesMeta": {
13552
13552
+
"@types/react": {
13553
13553
+
"optional": true
13554
13554
+
}
13555
13555
+
}
13556
13556
+
},
13557
13557
+
"node_modules/use-sidecar": {
13558
13558
+
"version": "1.1.3",
13559
13559
+
"resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
13560
13560
+
"integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
13561
13561
+
"dependencies": {
13562
13562
+
"detect-node-es": "^1.1.0",
13563
13563
+
"tslib": "^2.0.0"
13564
13564
+
},
13565
13565
+
"engines": {
13566
13566
+
"node": ">=10"
13567
13567
+
},
13568
13568
+
"peerDependencies": {
13569
13569
+
"@types/react": "*",
13570
13570
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
13571
13571
+
},
13572
13572
+
"peerDependenciesMeta": {
13573
13573
+
"@types/react": {
13574
13574
+
"optional": true
13575
13575
+
}
11895
13576
}
11896
13577
},
11897
13578
"node_modules/use-sync-external-store": {
+2
package.json
···
12
12
"dependencies": {
13
13
"@atproto/api": "^0.16.6",
14
14
"@atproto/oauth-client-browser": "^0.3.33",
15
15
+
"@radix-ui/react-dropdown-menu": "^2.1.16",
15
16
"@tailwindcss/vite": "^4.0.6",
16
17
"@tanstack/query-sync-storage-persister": "^5.85.6",
17
18
"@tanstack/react-devtools": "^0.2.2",
···
25
26
"idb-keyval": "^6.2.2",
26
27
"jotai": "^2.13.1",
27
28
"npm": "^11.6.2",
29
29
+
"radix-ui": "^1.4.3",
28
30
"react": "^19.0.0",
29
31
"react-dom": "^19.0.0",
30
32
"react-player": "^3.3.2",
+225
src/components/Composer.tsx
···
1
1
+
import { RichText } from "@atproto/api";
2
2
+
import { useAtom } from "jotai";
3
3
+
import { useEffect, useState } from "react";
4
4
+
5
5
+
import { useAuth } from "~/providers/UnifiedAuthProvider";
6
6
+
import { composerAtom } from "~/utils/atoms";
7
7
+
import { useQueryPost } from "~/utils/useQuery";
8
8
+
9
9
+
import { ProfileThing } from "./Login";
10
10
+
import { UniversalPostRendererATURILoader } from "./UniversalPostRenderer";
11
11
+
12
12
+
const MAX_POST_LENGTH = 300
13
13
+
14
14
+
export function Composer() {
15
15
+
const [composerState, setComposerState] = useAtom(composerAtom);
16
16
+
const { agent } = useAuth();
17
17
+
18
18
+
const [postText, setPostText] = useState("");
19
19
+
const [posting, setPosting] = useState(false);
20
20
+
const [postSuccess, setPostSuccess] = useState(false);
21
21
+
const [postError, setPostError] = useState<string | null>(null);
22
22
+
23
23
+
useEffect(() => {
24
24
+
setPostText("");
25
25
+
setPosting(false);
26
26
+
setPostSuccess(false);
27
27
+
setPostError(null);
28
28
+
}, [composerState.kind]);
29
29
+
30
30
+
const parentUri =
31
31
+
composerState.kind === "reply"
32
32
+
? composerState.parent
33
33
+
: composerState.kind === "quote"
34
34
+
? composerState.subject
35
35
+
: undefined;
36
36
+
37
37
+
const { data: parentPost, isLoading: isParentLoading } = useQueryPost(parentUri);
38
38
+
39
39
+
async function handlePost() {
40
40
+
if (!agent || !postText.trim() || postText.length > MAX_POST_LENGTH) return;
41
41
+
42
42
+
setPosting(true);
43
43
+
setPostError(null);
44
44
+
45
45
+
try {
46
46
+
const rt = new RichText({ text: postText });
47
47
+
await rt.detectFacets(agent);
48
48
+
49
49
+
const record: Record<string, unknown> = {
50
50
+
$type: "app.bsky.feed.post",
51
51
+
text: rt.text,
52
52
+
facets: rt.facets,
53
53
+
createdAt: new Date().toISOString(),
54
54
+
};
55
55
+
56
56
+
if (composerState.kind === "reply" && parentPost) {
57
57
+
record.reply = {
58
58
+
root: parentPost.value?.reply?.root ?? {
59
59
+
uri: parentPost.uri,
60
60
+
cid: parentPost.cid,
61
61
+
},
62
62
+
parent: {
63
63
+
uri: parentPost.uri,
64
64
+
cid: parentPost.cid,
65
65
+
},
66
66
+
};
67
67
+
}
68
68
+
69
69
+
if (composerState.kind === "quote" && parentPost) {
70
70
+
record.embed = {
71
71
+
$type: "app.bsky.embed.record",
72
72
+
record: {
73
73
+
uri: parentPost.uri,
74
74
+
cid: parentPost.cid,
75
75
+
},
76
76
+
};
77
77
+
}
78
78
+
79
79
+
await agent.com.atproto.repo.createRecord({
80
80
+
collection: "app.bsky.feed.post",
81
81
+
repo: agent.assertDid,
82
82
+
record,
83
83
+
});
84
84
+
85
85
+
setPostSuccess(true);
86
86
+
setPostText("");
87
87
+
88
88
+
setTimeout(() => {
89
89
+
setPostSuccess(false);
90
90
+
setComposerState({ kind: "closed" });
91
91
+
}, 1500);
92
92
+
} catch (e: any) {
93
93
+
setPostError(e?.message || "Failed to post");
94
94
+
} finally {
95
95
+
setPosting(false);
96
96
+
}
97
97
+
}
98
98
+
99
99
+
if (composerState.kind === "closed") {
100
100
+
return null;
101
101
+
}
102
102
+
103
103
+
const getPlaceholder = () => {
104
104
+
switch (composerState.kind) {
105
105
+
case "reply":
106
106
+
return "Post your reply";
107
107
+
case "quote":
108
108
+
return "Add a comment...";
109
109
+
case "root":
110
110
+
default:
111
111
+
return "What's happening?!";
112
112
+
}
113
113
+
};
114
114
+
115
115
+
const charsLeft = MAX_POST_LENGTH - postText.length;
116
116
+
const isPostButtonDisabled =
117
117
+
posting ||
118
118
+
!postText.trim() ||
119
119
+
isParentLoading ||
120
120
+
charsLeft < 0;
121
121
+
122
122
+
return (
123
123
+
<div className="fixed inset-0 z-50 flex items-start justify-center pt-10 sm:pt-20 bg-black/40 dark:bg-black/50">
124
124
+
<div className="bg-gray-50 dark:bg-gray-950 border border-gray-200 dark:border-gray-700 rounded-2xl shadow-xl w-full max-w-xl relative mx-4">
125
125
+
<div className="flex flex-row justify-between p-2">
126
126
+
<button
127
127
+
className="h-8 w-8 flex items-center justify-center rounded-full text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800"
128
128
+
onClick={() => !posting && setComposerState({ kind: "closed" })}
129
129
+
disabled={posting}
130
130
+
aria-label="Close"
131
131
+
>
132
132
+
<svg
133
133
+
xmlns="http://www.w3.org/2000/svg"
134
134
+
width="20"
135
135
+
height="20"
136
136
+
viewBox="0 0 24 24"
137
137
+
fill="none"
138
138
+
stroke="currentColor"
139
139
+
strokeWidth="2.5"
140
140
+
strokeLinecap="round"
141
141
+
strokeLinejoin="round"
142
142
+
>
143
143
+
<line x1="18" y1="6" x2="6" y2="18"></line>
144
144
+
<line x1="6" y1="6" x2="18" y2="18"></line>
145
145
+
</svg>
146
146
+
</button>
147
147
+
<div className="flex-1" />
148
148
+
<div className="flex items-center gap-4">
149
149
+
<span className={`text-sm ${charsLeft < 0 ? 'text-red-500' : 'text-gray-500'}`}>
150
150
+
{charsLeft}
151
151
+
</span>
152
152
+
153
153
+
<button
154
154
+
className="bg-gray-600 hover:bg-gray-700 text-white font-bold py-1 px-4 rounded-full disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
155
155
+
onClick={handlePost}
156
156
+
disabled={isPostButtonDisabled}
157
157
+
>
158
158
+
{posting ? "Posting..." : "Post"}
159
159
+
</button>
160
160
+
</div>
161
161
+
</div>
162
162
+
163
163
+
{postSuccess ? (
164
164
+
<div className="flex flex-col items-center justify-center py-16">
165
165
+
<span className="text-gray-500 text-6xl mb-4">✓</span>
166
166
+
<span className="text-xl font-bold text-black dark:text-white">Posted!</span>
167
167
+
</div>
168
168
+
) : (
169
169
+
<div className="px-4">
170
170
+
{(composerState.kind === "reply") && (
171
171
+
<div className="mb-1 -mx-4">
172
172
+
{isParentLoading ? (
173
173
+
<div className="text-sm text-gray-500 animate-pulse">
174
174
+
Loading parent post...
175
175
+
</div>
176
176
+
) : parentUri ? (
177
177
+
<UniversalPostRendererATURILoader atUri={parentUri} bottomReplyLine bottomBorder={false} />
178
178
+
) : (
179
179
+
<div className="text-sm text-red-500 rounded-lg border border-red-500/50 p-3">
180
180
+
Could not load parent post.
181
181
+
</div>
182
182
+
)}
183
183
+
</div>
184
184
+
)}
185
185
+
186
186
+
<div className="flex w-full gap-1 flex-col">
187
187
+
<ProfileThing agent={agent} large/>
188
188
+
<div className="flex pl-[50px]">
189
189
+
<textarea
190
190
+
className="w-full text-lg bg-transparent focus:outline-none resize-none placeholder:text-gray-500 text-black dark:text-white"
191
191
+
rows={5}
192
192
+
placeholder={getPlaceholder()}
193
193
+
value={postText}
194
194
+
onChange={(e) => setPostText(e.target.value)}
195
195
+
disabled={posting}
196
196
+
autoFocus
197
197
+
/>
198
198
+
</div>
199
199
+
</div>
200
200
+
{(composerState.kind === "quote") && (
201
201
+
<div className="mb-4 ml-[50px] rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden">
202
202
+
{isParentLoading ? (
203
203
+
<div className="text-sm text-gray-500 animate-pulse">
204
204
+
Loading parent post...
205
205
+
</div>
206
206
+
) : parentUri ? (
207
207
+
<UniversalPostRendererATURILoader atUri={parentUri} isQuote />
208
208
+
) : (
209
209
+
<div className="text-sm text-red-500 rounded-lg border border-red-500/50 p-3">
210
210
+
Could not load parent post.
211
211
+
</div>
212
212
+
)}
213
213
+
</div>
214
214
+
)}
215
215
+
216
216
+
{postError && (
217
217
+
<div className="text-red-500 text-sm my-2 text-center">{postError}</div>
218
218
+
)}
219
219
+
220
220
+
</div>
221
221
+
)}
222
222
+
</div>
223
223
+
</div>
224
224
+
);
225
225
+
}
+74
-15
src/components/UniversalPostRenderer.tsx
···
1
1
import { useNavigate } from "@tanstack/react-router";
2
2
import DOMPurify from "dompurify";
3
3
import { useAtom } from "jotai";
4
4
+
import { DropdownMenu } from "radix-ui";
4
5
import * as React from "react";
5
6
import { type SVGProps } from "react";
6
7
7
7
-
import { likedPostsAtom } from "~/utils/atoms";
8
8
+
import { composerAtom, likedPostsAtom } from "~/utils/atoms";
8
9
import { useHydratedEmbed } from "~/utils/useHydrated";
9
10
import {
10
11
useQueryConstellation,
···
36
37
nopics?: boolean;
37
38
lightboxCallback?: (d: LightboxProps) => void;
38
39
maxReplies?: number;
40
40
+
isQuote?: boolean;
39
41
}
40
42
41
43
// export async function cachedGetRecord({
···
146
148
nopics,
147
149
lightboxCallback,
148
150
maxReplies,
151
151
+
isQuote,
149
152
}: UniversalPostRendererATURILoaderProps) {
150
153
// /*mass comment*/ console.log("atUri", atUri);
151
154
//const { get, set } = usePersistentStore();
···
407
410
path: ".reply.parent.uri",
408
411
}
409
412
),
410
410
-
enabled: !!atUri && !!maxReplies,
413
413
+
enabled: !!atUri && !!maxReplies && !isQuote,
411
414
});
412
415
413
416
const {
···
419
422
420
423
// auto-fetch all pages
421
424
useEffect(() => {
422
422
-
if (!maxReplies) return;
425
425
+
if (!maxReplies || isQuote) return;
423
426
if (
424
427
infinitequeryresults.hasNextPage &&
425
428
!infinitequeryresults.isFetchingNextPage
···
443
446
//const [oldestOpsReply, setOldestOpsReply] = useState<string | undefined>(undefined);
444
447
445
448
const { oldestOpsReply, oldestOpsReplyElseNewestNonOpsReply } = (() => {
446
446
-
if (!replyAturis || replyAturis.length === 0 || !maxReplies)
449
449
+
if (isQuote || !replyAturis || replyAturis.length === 0 || !maxReplies)
447
450
return {
448
451
oldestOpsReply: undefined,
449
452
oldestOpsReplyElseNewestNonOpsReply: undefined,
···
524
527
nopics={nopics}
525
528
lightboxCallback={lightboxCallback}
526
529
maxReplies={maxReplies}
530
530
+
isQuote={isQuote}
527
531
/>
528
528
-
{oldestOpsReplyElseNewestNonOpsReply && (
532
532
+
{!isQuote && oldestOpsReplyElseNewestNonOpsReply && (
529
533
<>
530
534
{/* <span>hello {maxReplies}</span> */}
531
535
<UniversalPostRendererATURILoader
···
618
622
nopics,
619
623
lightboxCallback,
620
624
maxReplies,
625
625
+
isQuote,
621
626
}: {
622
627
postRecord: any;
623
628
profileRecord: any;
···
638
643
nopics?: boolean;
639
644
lightboxCallback?: (d: LightboxProps) => void;
640
645
maxReplies?: number;
646
646
+
isQuote?: boolean;
641
647
}) {
642
648
// /*mass comment*/ console.log(`received aturi: ${aturi} of post content: ${postRecord}`);
643
649
const navigate = useNavigate();
···
838
844
nopics={nopics}
839
845
lightboxCallback={lightboxCallback}
840
846
maxReplies={maxReplies}
847
847
+
isQuote={isQuote}
841
848
/>
842
849
</>
843
850
);
···
1322
1329
const [hasLiked, setHasLiked] = useState<boolean>(
1323
1330
post.uri in likedPosts || post.viewer?.like ? true : false
1324
1331
);
1332
1332
+
const [, setComposerPost] = useAtom(composerAtom);
1325
1333
const { agent } = useAuth();
1326
1334
const [likeUri, setLikeUri] = useState<string | undefined>(post.viewer?.like);
1327
1335
const [retweetUri, setRetweetUri] = useState<string | undefined>(
···
1459
1467
//left: 16 + (42 / 2),
1460
1468
width: 2,
1461
1469
//height: "100%",
1462
1462
-
height: isRepost ? "calc(16px + 1rem - 6px)" : topReplyLine ? 8 - 6 : 16 - 6,
1470
1470
+
height: isRepost
1471
1471
+
? "calc(16px + 1rem - 6px)"
1472
1472
+
: topReplyLine
1473
1473
+
? 8 - 6
1474
1474
+
: 16 - 6,
1463
1475
// background: theme.textSecondary,
1464
1476
//opacity: 0.5,
1465
1477
// no flex here
···
1473
1485
//top: isRepost ? "calc(16px + 1rem)" : 16,
1474
1486
//left: 16,
1475
1487
zIndex: 1,
1476
1476
-
top: isRepost ? "calc(16px + 1rem)" : isQuote ? 12 : topReplyLine ? 8 : 16,
1488
1488
+
top: isRepost
1489
1489
+
? "calc(16px + 1rem)"
1490
1490
+
: isQuote
1491
1491
+
? 12
1492
1492
+
: topReplyLine
1493
1493
+
? 8
1494
1494
+
: 16,
1477
1495
left: isQuote ? 12 : 16,
1478
1496
}}
1479
1497
onClick={onProfileClick}
···
1744
1762
}}
1745
1763
className="text-gray-500 dark:text-gray-400"
1746
1764
>
1747
1747
-
<span style={btnstyle}>
1748
1748
-
<MdiCommentOutline />
1749
1749
-
{post.replyCount}
1750
1750
-
</span>
1751
1765
<HitSlopButton
1752
1766
onClick={() => {
1753
1753
-
repostOrUnrepostPost();
1767
1767
+
setComposerPost({ kind: "reply", parent: post.uri });
1754
1768
}}
1755
1769
style={{
1756
1770
...btnstyle,
1757
1757
-
...(hasRetweeted ? { color: "#5CEFAA" } : {}),
1758
1771
}}
1759
1772
>
1760
1760
-
{hasRetweeted ? <MdiRepeatGreen /> : <MdiRepeat />}
1761
1761
-
{(post.repostCount || 0) + (hasRetweeted ? 1 : 0)}
1773
1773
+
<MdiCommentOutline />
1774
1774
+
{post.replyCount}
1762
1775
</HitSlopButton>
1776
1776
+
<DropdownMenu.Root modal={false}>
1777
1777
+
<DropdownMenu.Trigger asChild>
1778
1778
+
<div
1779
1779
+
style={{
1780
1780
+
...btnstyle,
1781
1781
+
...(hasRetweeted ? { color: "#5CEFAA" } : {}),
1782
1782
+
}}
1783
1783
+
aria-label="Repost or quote post"
1784
1784
+
>
1785
1785
+
{hasRetweeted ? <MdiRepeatGreen /> : <MdiRepeat />}
1786
1786
+
{post.repostCount ?? 0}
1787
1787
+
</div>
1788
1788
+
</DropdownMenu.Trigger>
1789
1789
+
1790
1790
+
<DropdownMenu.Portal>
1791
1791
+
<DropdownMenu.Content
1792
1792
+
align="start"
1793
1793
+
sideOffset={5}
1794
1794
+
className="bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 w-32 z-50 overflow-hidden"
1795
1795
+
>
1796
1796
+
<DropdownMenu.Item
1797
1797
+
onSelect={repostOrUnrepostPost}
1798
1798
+
className="px-3 py-2 text-sm flex items-center gap-2 cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-700"
1799
1799
+
>
1800
1800
+
<MdiRepeat
1801
1801
+
className={hasRetweeted ? "text-green-400" : ""}
1802
1802
+
/>
1803
1803
+
<span>{hasRetweeted ? "Undo Repost" : "Repost"}</span>
1804
1804
+
</DropdownMenu.Item>
1805
1805
+
1806
1806
+
<DropdownMenu.Item
1807
1807
+
onSelect={() => {
1808
1808
+
setComposerPost({
1809
1809
+
kind: "quote",
1810
1810
+
subject: post.uri,
1811
1811
+
});
1812
1812
+
}}
1813
1813
+
className="px-3 py-2 text-sm flex items-center gap-2 cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-700"
1814
1814
+
>
1815
1815
+
{/* You might want a specific quote icon here */}
1816
1816
+
<MdiCommentOutline />
1817
1817
+
<span>Quote</span>
1818
1818
+
</DropdownMenu.Item>
1819
1819
+
</DropdownMenu.Content>
1820
1820
+
</DropdownMenu.Portal>
1821
1821
+
</DropdownMenu.Root>
1763
1822
<HitSlopButton
1764
1823
onClick={() => {
1765
1824
likeOrUnlikePost();
+8
-79
src/routes/__root.tsx
···
12
12
useNavigate,
13
13
} from "@tanstack/react-router";
14
14
import { TanStackRouterDevtools } from "@tanstack/react-router-devtools";
15
15
-
import { useState } from "react";
15
15
+
import { useAtom } from "jotai";
16
16
import * as React from "react";
17
17
import { KeepAliveOutlet, KeepAliveProvider } from "tanstack-router-keepalive";
18
18
19
19
+
import { Composer } from "~/components/Composer";
19
20
import { DefaultCatchBoundary } from "~/components/DefaultCatchBoundary";
20
21
import Login from "~/components/Login";
21
22
import { NotFound } from "~/components/NotFound";
22
23
import { UnifiedAuthProvider, useAuth } from "~/providers/UnifiedAuthProvider";
24
24
+
import { composerAtom } from "~/utils/atoms";
23
25
import { seo } from "~/utils/seo";
24
26
25
27
export const Route = createRootRouteWithContext<{
···
117
119
? "profile"
118
120
: "home";
119
121
120
120
-
const [postOpen, setPostOpen] = useState(false);
121
121
-
const [postText, setPostText] = useState("");
122
122
-
const [posting, setPosting] = useState(false);
123
123
-
const [postSuccess, setPostSuccess] = useState(false);
124
124
-
const [postError, setPostError] = useState<string | null>(null);
125
125
-
126
126
-
async function handlePost() {
127
127
-
if (!agent) return;
128
128
-
setPosting(true);
129
129
-
setPostError(null);
130
130
-
try {
131
131
-
await agent.com.atproto.repo.createRecord({
132
132
-
collection: "app.bsky.feed.post",
133
133
-
repo: agent.assertDid,
134
134
-
record: {
135
135
-
$type: "app.bsky.feed.post",
136
136
-
text: postText,
137
137
-
createdAt: new Date().toISOString(),
138
138
-
},
139
139
-
});
140
140
-
setPostSuccess(true);
141
141
-
setPostText("");
142
142
-
setTimeout(() => {
143
143
-
setPostSuccess(false);
144
144
-
setPostOpen(false);
145
145
-
}, 1500);
146
146
-
} catch (e: any) {
147
147
-
setPostError(e?.message || "Failed to post");
148
148
-
} finally {
149
149
-
setPosting(false);
150
150
-
}
151
151
-
}
122
122
+
const [, setComposerPost] = useAtom(composerAtom);
152
123
153
124
return (
154
125
<>
155
155
-
{postOpen && (
156
156
-
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40">
157
157
-
<div className="bg-white dark:bg-gray-900 rounded-lg shadow-lg p-6 w-full max-w-md relative">
158
158
-
<button
159
159
-
className="absolute top-2 right-2 text-gray-400 hover:text-gray-700 dark:hover:text-gray-200"
160
160
-
onClick={() => !posting && setPostOpen(false)}
161
161
-
disabled={posting}
162
162
-
aria-label="Close"
163
163
-
>
164
164
-
×
165
165
-
</button>
166
166
-
<h2 className="text-lg font-bold mb-2">Create Post</h2>
167
167
-
{postSuccess ? (
168
168
-
<div className="flex flex-col items-center justify-center py-8">
169
169
-
<span className="text-green-500 text-4xl mb-2">✓</span>
170
170
-
<span className="text-green-600">Posted!</span>
171
171
-
</div>
172
172
-
) : (
173
173
-
<>
174
174
-
<textarea
175
175
-
className="w-full border rounded p-2 mb-2 dark:bg-gray-800 dark:border-gray-700"
176
176
-
rows={4}
177
177
-
placeholder="What's on your mind?"
178
178
-
value={postText}
179
179
-
onChange={(e) => setPostText(e.target.value)}
180
180
-
disabled={posting}
181
181
-
autoFocus
182
182
-
/>
183
183
-
{postError && (
184
184
-
<div className="text-red-500 text-sm mb-2">{postError}</div>
185
185
-
)}
186
186
-
<button
187
187
-
className="bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded disabled:opacity-50"
188
188
-
onClick={handlePost}
189
189
-
disabled={posting || !postText.trim()}
190
190
-
>
191
191
-
{posting ? "Posting..." : "Post"}
192
192
-
</button>
193
193
-
</>
194
194
-
)}
195
195
-
</div>
196
196
-
</div>
197
197
-
)}
126
126
+
<Composer />
198
127
199
128
<div className="min-h-screen flex justify-center bg-gray-50 dark:bg-gray-950">
200
129
<nav className="hidden lg:flex h-screen w-[250px] flex-col gap-0 p-4 dark:border-gray-800 sticky top-0 self-start">
···
300
229
InactiveIcon={<IconMdiPencilOutline className="w-6 h-6" />}
301
230
ActiveIcon={<IconMdiPencilOutline className="w-6 h-6" />}
302
231
//active={true}
303
303
-
onClickCallbback={() => setPostOpen(true)}
232
232
+
onClickCallbback={() => setComposerPost({ kind: 'root' })}
304
233
text="Post"
305
234
/>
306
235
</div>
···
540
469
InactiveIcon={<IconMdiPencilOutline className="w-6 h-6" />}
541
470
ActiveIcon={<IconMdiPencilOutline className="w-6 h-6" />}
542
471
//active={true}
543
543
-
onClickCallbback={() => setPostOpen(true)}
472
472
+
onClickCallbback={() => setComposerPost({ kind: 'root' })}
544
473
text="Post"
545
474
/>
546
475
</div>
···
550
479
<button
551
480
className="lg:hidden fixed bottom-22 right-4 z-50 bg-gray-200 dark:bg-gray-800 hover:bg-gray-300 dark:hover:bg-gray-700 rounded-2xl w-14 h-14 flex items-center justify-center transition-all"
552
481
style={{ boxShadow: "0 4px 24px 0 rgba(0,0,0,0.12)" }}
553
553
-
onClick={() => setPostOpen(true)}
482
482
+
onClick={() => setComposerPost({ kind: 'root' })}
554
483
type="button"
555
484
aria-label="Create Post"
556
485
>
+7
src/utils/atoms.ts
···
23
23
24
24
export const isAtTopAtom = atom<boolean>(true);
25
25
26
26
+
type ComposerState =
27
27
+
| { kind: 'closed' }
28
28
+
| { kind: 'root' }
29
29
+
| { kind: 'reply'; parent: string }
30
30
+
| { kind: 'quote'; subject: string };
31
31
+
export const composerAtom = atom<ComposerState>({ kind: 'closed' });
32
32
+
26
33
export const agentAtom = atom<Agent|null>(null);
27
34
export const authedAtom = atom<boolean>(false);