@blu1606/create-walrus-app 0.1.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/generator/file-ops.d.ts +8 -0
  2. package/dist/generator/file-ops.js +20 -0
  3. package/dist/generator/index.js +37 -22
  4. package/dist/generator/layers.d.ts +15 -2
  5. package/dist/generator/layers.js +38 -47
  6. package/dist/generator/types.d.ts +9 -1
  7. package/dist/index.js +1 -2
  8. package/dist/post-install/git.d.ts +8 -0
  9. package/dist/post-install/git.js +2 -0
  10. package/dist/post-install/index.d.ts +0 -1
  11. package/dist/post-install/index.js +2 -15
  12. package/dist/post-install/messages.js +1 -1
  13. package/package.json +68 -68
  14. package/{templates/base → presets/react-mysten-gallery}/.env.example +31 -31
  15. package/presets/react-mysten-gallery/.gitkeep +4 -0
  16. package/{templates/gallery → presets/react-mysten-gallery}/README.md +25 -22
  17. package/presets/react-mysten-gallery/package.json +34 -0
  18. package/presets/react-mysten-gallery/src/App.tsx +23 -0
  19. package/presets/react-mysten-gallery/src/components/features/file-card.tsx +89 -0
  20. package/{templates/gallery/src/components/GalleryGrid.tsx → presets/react-mysten-gallery/src/components/features/gallery-grid.tsx} +5 -5
  21. package/presets/react-mysten-gallery/src/components/features/upload-modal.tsx +69 -0
  22. package/{templates/react/src/components/WalletConnect.tsx → presets/react-mysten-gallery/src/components/features/wallet-connect.tsx} +1 -1
  23. package/presets/react-mysten-gallery/src/components/layout/app-layout.tsx +21 -0
  24. package/{templates/react/src/hooks/useStorage.ts → presets/react-mysten-gallery/src/hooks/use-download.ts} +2 -18
  25. package/presets/react-mysten-gallery/src/hooks/use-upload.ts +49 -0
  26. package/{templates/react/src/hooks/useWallet.ts → presets/react-mysten-gallery/src/hooks/use-wallet.ts} +2 -7
  27. package/presets/react-mysten-gallery/src/index.css +384 -0
  28. package/presets/react-mysten-gallery/src/index.ts +17 -0
  29. package/presets/react-mysten-gallery/src/lib/walrus/adapter.ts +197 -0
  30. package/presets/react-mysten-gallery/src/lib/walrus/client.ts +87 -0
  31. package/presets/react-mysten-gallery/src/lib/walrus/index.ts +4 -0
  32. package/presets/react-mysten-gallery/src/lib/walrus/types.ts +101 -0
  33. package/{templates/react → presets/react-mysten-gallery}/src/main.tsx +0 -1
  34. package/{templates/react → presets/react-mysten-gallery}/src/providers/WalletProvider.tsx +16 -1
  35. package/{templates/base → presets/react-mysten-gallery}/src/utils/env.ts +41 -41
  36. package/{templates/gallery → presets/react-mysten-gallery}/src/utils/index-manager.ts +2 -2
  37. package/presets/react-mysten-gallery/src/utils/mime-type.ts +97 -0
  38. package/presets/react-mysten-gallery/src/utils/preview-generator.ts +134 -0
  39. package/{templates/react → presets/react-mysten-gallery}/tsconfig.json +20 -8
  40. package/presets/react-mysten-simple-upload/.env.example +31 -0
  41. package/presets/react-mysten-simple-upload/.gitkeep +4 -0
  42. package/presets/react-mysten-simple-upload/index.html +13 -0
  43. package/{templates/react → presets/react-mysten-simple-upload}/package.json +13 -11
  44. package/presets/react-mysten-simple-upload/src/App.tsx +27 -0
  45. package/presets/react-mysten-simple-upload/src/components/features/file-preview.tsx +73 -0
  46. package/{templates/simple-upload/src/components/UploadForm.tsx → presets/react-mysten-simple-upload/src/components/features/upload-form.tsx} +15 -5
  47. package/presets/react-mysten-simple-upload/src/components/features/wallet-connect.tsx +21 -0
  48. package/presets/react-mysten-simple-upload/src/components/layout/app-layout.tsx +21 -0
  49. package/presets/react-mysten-simple-upload/src/hooks/use-download.ts +24 -0
  50. package/presets/react-mysten-simple-upload/src/hooks/use-upload.ts +49 -0
  51. package/presets/react-mysten-simple-upload/src/hooks/use-wallet.ts +11 -0
  52. package/presets/react-mysten-simple-upload/src/index.css +252 -0
  53. package/presets/react-mysten-simple-upload/src/index.ts +16 -0
  54. package/presets/react-mysten-simple-upload/src/lib/walrus/adapter.ts +197 -0
  55. package/presets/react-mysten-simple-upload/src/lib/walrus/client.ts +87 -0
  56. package/presets/react-mysten-simple-upload/src/lib/walrus/index.ts +4 -0
  57. package/{templates/base/src/adapters/storage.ts → presets/react-mysten-simple-upload/src/lib/walrus/types.ts} +83 -58
  58. package/presets/react-mysten-simple-upload/src/main.tsx +16 -0
  59. package/presets/react-mysten-simple-upload/src/providers/QueryProvider.tsx +18 -0
  60. package/presets/react-mysten-simple-upload/src/providers/WalletProvider.tsx +52 -0
  61. package/presets/react-mysten-simple-upload/src/utils/env.ts +41 -0
  62. package/presets/react-mysten-simple-upload/src/utils/mime-type.ts +97 -0
  63. package/presets/react-mysten-simple-upload/tsconfig.json +39 -0
  64. package/presets/react-mysten-simple-upload/tsconfig.node.json +10 -0
  65. package/presets/react-mysten-simple-upload/vite.config.ts +19 -0
  66. package/dist/__tests__/helpers/adapter-compliance.d.ts +0 -2
  67. package/dist/__tests__/helpers/adapter-compliance.js +0 -47
  68. package/dist/__tests__/helpers/fixtures.d.ts +0 -21
  69. package/dist/__tests__/helpers/fixtures.js +0 -30
  70. package/dist/__tests__/helpers/fs-helpers.d.ts +0 -12
  71. package/dist/__tests__/helpers/fs-helpers.js +0 -35
  72. package/dist/__tests__/helpers/index.d.ts +0 -4
  73. package/dist/__tests__/helpers/index.js +0 -4
  74. package/dist/__tests__/helpers/test-hooks.d.ts +0 -3
  75. package/dist/__tests__/helpers/test-hooks.js +0 -18
  76. package/dist/context.test.d.ts +0 -1
  77. package/dist/context.test.js +0 -98
  78. package/dist/generator/index.test.d.ts +0 -1
  79. package/dist/generator/index.test.js +0 -143
  80. package/dist/generator/layers.test.d.ts +0 -1
  81. package/dist/generator/layers.test.js +0 -92
  82. package/dist/generator/merge.test.d.ts +0 -1
  83. package/dist/generator/merge.test.js +0 -79
  84. package/dist/generator/transform.test.d.ts +0 -1
  85. package/dist/generator/transform.test.js +0 -51
  86. package/dist/matrix.test.d.ts +0 -1
  87. package/dist/matrix.test.js +0 -70
  88. package/dist/types.test.d.ts +0 -1
  89. package/dist/types.test.js +0 -65
  90. package/dist/utils/detect-pm.test.d.ts +0 -1
  91. package/dist/utils/detect-pm.test.js +0 -52
  92. package/dist/validator.test.d.ts +0 -1
  93. package/dist/validator.test.js +0 -96
  94. package/templates/base/README.md +0 -54
  95. package/templates/base/package.json +0 -19
  96. package/templates/base/src/types/index.ts +0 -9
  97. package/templates/base/src/types/walrus.ts +0 -22
  98. package/templates/base/src/utils/format.ts +0 -29
  99. package/templates/base/tsconfig.json +0 -19
  100. package/templates/gallery/package.json +0 -6
  101. package/templates/gallery/src/App.tsx +0 -21
  102. package/templates/gallery/src/components/FileCard.tsx +0 -27
  103. package/templates/gallery/src/components/UploadModal.tsx +0 -45
  104. package/templates/gallery/src/styles.css +0 -58
  105. package/templates/gallery/src/types/gallery.ts +0 -13
  106. package/templates/react/.eslintrc.json +0 -26
  107. package/templates/react/README.md +0 -80
  108. package/templates/react/src/App.tsx +0 -14
  109. package/templates/react/src/components/Layout.tsx +0 -21
  110. package/templates/react/src/dapp-kit.css +0 -1
  111. package/templates/react/src/index.css +0 -50
  112. package/templates/react/src/index.ts +0 -10
  113. package/templates/sdk-mysten/README.md +0 -65
  114. package/templates/sdk-mysten/package.json +0 -14
  115. package/templates/sdk-mysten/src/adapter.ts +0 -80
  116. package/templates/sdk-mysten/src/client.ts +0 -45
  117. package/templates/sdk-mysten/src/config.ts +0 -33
  118. package/templates/sdk-mysten/src/index.ts +0 -11
  119. package/templates/sdk-mysten/src/types.ts +0 -19
  120. package/templates/sdk-mysten/test/adapter.test.ts +0 -20
  121. package/templates/simple-upload/package.json +0 -6
  122. package/templates/simple-upload/src/App.tsx +0 -27
  123. package/templates/simple-upload/src/components/FilePreview.tsx +0 -40
  124. package/templates/simple-upload/src/styles.css +0 -33
  125. /package/{templates/react → presets/react-mysten-gallery}/index.html +0 -0
  126. /package/{templates/react → presets/react-mysten-gallery}/src/providers/QueryProvider.tsx +0 -0
  127. /package/{templates/react → presets/react-mysten-gallery}/tsconfig.node.json +0 -0
  128. /package/{templates/react → presets/react-mysten-gallery}/vite.config.ts +0 -0
  129. /package/{templates/simple-upload → presets/react-mysten-simple-upload}/README.md +0 -0
@@ -0,0 +1,73 @@
1
+ import { useState } from 'react';
2
+ import { useDownload, useMetadata } from '../../hooks/use-download.js';
3
+
4
+ export function FilePreview() {
5
+ const [blobId, setBlobId] = useState('');
6
+ const { data, isLoading, error } = useDownload(blobId);
7
+ const { data: metadata } = useMetadata(blobId);
8
+
9
+ const handleDownload = () => {
10
+ if (!data) return;
11
+
12
+ // Use original filename from metadata if available
13
+ let filename = metadata?.fileName || `walrus-${blobId.slice(0, 8)}`;
14
+
15
+ // If metadata doesn't have filename, auto-detect from content type
16
+ if (!metadata?.fileName) {
17
+ const contentType = metadata?.contentType || 'application/octet-stream';
18
+
19
+ if (contentType.startsWith('image/')) {
20
+ filename += `.${contentType.split('/')[1]}`;
21
+ } else if (contentType.startsWith('text/')) {
22
+ filename += '.txt';
23
+ } else if (contentType.includes('json')) {
24
+ filename += '.json';
25
+ } else {
26
+ filename += '.bin';
27
+ }
28
+ }
29
+
30
+ const contentType = metadata?.contentType || 'application/octet-stream';
31
+ const blob = new Blob([data as Uint8Array], { type: contentType });
32
+ const url = URL.createObjectURL(blob);
33
+ const a = document.createElement('a');
34
+ a.href = url;
35
+ a.download = filename;
36
+ a.click();
37
+ URL.revokeObjectURL(url);
38
+ };
39
+
40
+ // Auto-detect if data is text or JSON for preview
41
+ const canPreview = data && (typeof data === 'string' || data instanceof Uint8Array);
42
+ const preview = canPreview && typeof data === 'string'
43
+ ? data.slice(0, 200) // Show first 200 chars for text
44
+ : null;
45
+
46
+ return (
47
+ <div className="file-preview">
48
+ <input
49
+ type="text"
50
+ placeholder="Enter Blob ID"
51
+ value={blobId}
52
+ onChange={(e) => setBlobId(e.target.value)}
53
+ />
54
+
55
+ {isLoading && <p className="text-secondary">Loading...</p>}
56
+ {error && <p className="error">Error: {error.message}</p>}
57
+
58
+ {data && (
59
+ <div className="preview-content icon-list">
60
+ <p className="text-success">✓ Blob found <span className="text-secondary">({data.byteLength || data.length} bytes)</span></p>
61
+ {metadata?.fileName && <p className="text-secondary">File: <span className="text-accent">{metadata.fileName}</span></p>}
62
+ {metadata?.contentType && <p className="text-secondary">Type: <span className="text-accent">{metadata.contentType}</span></p>}
63
+ {preview && (
64
+ <pre>
65
+ {preview}...
66
+ </pre>
67
+ )}
68
+ <button onClick={handleDownload}>Download File</button>
69
+ </div>
70
+ )}
71
+ </div>
72
+ );
73
+ }
@@ -1,9 +1,11 @@
1
1
  import { useState } from 'react';
2
- import { useUpload } from '../hooks/useStorage.js';
2
+ import { useUpload } from '../../hooks/use-upload.js';
3
+ import { useWallet } from '../../hooks/use-wallet.js';
3
4
 
4
5
  export function UploadForm() {
5
6
  const [selectedFile, setSelectedFile] = useState<File | null>(null);
6
7
  const upload = useUpload();
8
+ const { isConnected } = useWallet();
7
9
 
8
10
  const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
9
11
  const file = e.target.files?.[0];
@@ -33,16 +35,24 @@ export function UploadForm() {
33
35
 
34
36
  {selectedFile && (
35
37
  <div className="file-info">
36
- <p>Selected: {selectedFile.name}</p>
37
- <p>Size: {(selectedFile.size / 1024).toFixed(2)} KB</p>
38
+ <p className="text-secondary">Selected: <span className="text-accent">{selectedFile.name}</span></p>
39
+ <p className="text-secondary">Size: <span className="text-accent">{(selectedFile.size / 1024).toFixed(2)} KB</span></p>
38
40
  </div>
39
41
  )}
40
42
 
43
+ {!isConnected && (
44
+ <p className="warning">⚠️ Please connect your wallet to upload files</p>
45
+ )}
46
+
41
47
  <button
42
48
  onClick={handleUpload}
43
- disabled={!selectedFile || upload.isPending}
49
+ disabled={!selectedFile || !isConnected || upload.isPending}
44
50
  >
45
- {upload.isPending ? 'Uploading...' : 'Upload to Walrus'}
51
+ {!isConnected
52
+ ? 'Connect Wallet First'
53
+ : upload.isPending
54
+ ? 'Uploading...'
55
+ : 'Upload to Walrus'}
46
56
  </button>
47
57
 
48
58
  {upload.isError && <p className="error">Error: {upload.error.message}</p>}
@@ -0,0 +1,21 @@
1
+ import { ConnectButton } from '@mysten/dapp-kit';
2
+ import { useWallet } from '../../hooks/use-wallet.js';
3
+
4
+ export function WalletConnect() {
5
+ const { isConnected, address } = useWallet();
6
+
7
+ return (
8
+ <div className="wallet-connect">
9
+ {isConnected ? (
10
+ <div className="wallet-info">
11
+ <span>
12
+ Connected: {address?.slice(0, 6)}...{address?.slice(-4)}
13
+ </span>
14
+ </div>
15
+ ) : (
16
+ <p>Please connect your wallet</p>
17
+ )}
18
+ <ConnectButton />
19
+ </div>
20
+ );
21
+ }
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from 'react';
2
+ import { WalletConnect } from '../features/wallet-connect.js';
3
+
4
+ interface LayoutProps {
5
+ children: ReactNode;
6
+ }
7
+
8
+ export function AppLayout({ children }: LayoutProps) {
9
+ return (
10
+ <div className="app-layout">
11
+ <header className="app-header">
12
+ <h1><span className="text-secondary">🌊</span> <span className="text-accent">Walrus</span> App</h1>
13
+ <WalletConnect />
14
+ </header>
15
+ <main className="app-main">{children}</main>
16
+ <footer className="app-footer">
17
+ <p className="text-secondary">Powered by <span className="text-accent">Walrus</span> & <span style={{ color: 'var(--walrus-accent-blue)' }}>Sui</span></p>
18
+ </footer>
19
+ </div>
20
+ );
21
+ }
@@ -0,0 +1,24 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { storageAdapter } from '../lib/walrus/index.js';
3
+
4
+ export function useDownload(blobId: string | null) {
5
+ return useQuery({
6
+ queryKey: ['blob', blobId],
7
+ queryFn: async () => {
8
+ if (!blobId) throw new Error('No blob ID provided');
9
+ return await storageAdapter.download(blobId);
10
+ },
11
+ enabled: !!blobId,
12
+ });
13
+ }
14
+
15
+ export function useMetadata(blobId: string | null) {
16
+ return useQuery({
17
+ queryKey: ['metadata', blobId],
18
+ queryFn: async () => {
19
+ if (!blobId) throw new Error('No blob ID provided');
20
+ return await storageAdapter.getMetadata(blobId);
21
+ },
22
+ enabled: !!blobId,
23
+ });
24
+ }
@@ -0,0 +1,49 @@
1
+ import { useMutation } from '@tanstack/react-query';
2
+ import { storageAdapter } from '../lib/walrus/index.js';
3
+ import type { UploadOptions, SignAndExecuteTransactionArgs } from '../lib/walrus/types.js';
4
+ import { useCurrentAccount, useSignAndExecuteTransaction, useSuiClient } from '@mysten/dapp-kit';
5
+
6
+ export function useUpload() {
7
+ const currentAccount = useCurrentAccount();
8
+ const { mutate: signAndExecute } = useSignAndExecuteTransaction();
9
+ const suiClient = useSuiClient();
10
+
11
+ return useMutation({
12
+ mutationFn: async ({
13
+ file,
14
+ options,
15
+ }: {
16
+ file: File;
17
+ options?: UploadOptions;
18
+ }) => {
19
+ if (!currentAccount) {
20
+ throw new Error('Wallet not connected. Please connect your wallet to upload files.');
21
+ }
22
+
23
+ // Wrap signAndExecute to return Promise
24
+ const signTransaction = (args: SignAndExecuteTransactionArgs) => {
25
+ return new Promise<{ digest: string }>((resolve, reject) => {
26
+ signAndExecute(
27
+ {
28
+ transaction: args.transaction,
29
+ },
30
+ {
31
+ onSuccess: (result) => resolve({ digest: result.digest }),
32
+ onError: (error) => reject(error),
33
+ }
34
+ );
35
+ });
36
+ };
37
+
38
+ const blobId = await storageAdapter.upload(file, {
39
+ ...options,
40
+ client: suiClient,
41
+ signer: {
42
+ address: currentAccount.address,
43
+ signAndExecuteTransaction: signTransaction,
44
+ },
45
+ });
46
+ return { blobId, file };
47
+ },
48
+ });
49
+ }
@@ -0,0 +1,11 @@
1
+ import { useCurrentAccount } from '@mysten/dapp-kit';
2
+
3
+ export function useWallet() {
4
+ const currentAccount = useCurrentAccount();
5
+
6
+ return {
7
+ isConnected: !!currentAccount,
8
+ address: currentAccount?.address,
9
+ account: currentAccount,
10
+ };
11
+ }
@@ -0,0 +1,252 @@
1
+ /* Dapp Kit styles */
2
+ @import '@mysten/dapp-kit/dist/index.css';
3
+
4
+ /* Google Fonts Import */
5
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;700&display=swap');
6
+
7
+ /* Global styles */
8
+ :root {
9
+ /* Pallette */
10
+ --walrus-bg-primary: #020617;
11
+ /* Deep Trench */
12
+ --walrus-bg-secondary: #0f172a;
13
+ /* Card/Section bg */
14
+ --walrus-surface: #1e293b;
15
+ /* Input, button bg */
16
+ --walrus-surface-hover: #334155;
17
+ /* Hover states */
18
+ --walrus-accent-cyan: #06b6d4;
19
+ /* Arctic Cyan - Primary Highlight */
20
+ --walrus-accent-blue: #4da2ff;
21
+ /* Sui Blue */
22
+ --walrus-accent-purple: #c084fc;
23
+ /* Secondary Accent */
24
+ --walrus-text-primary: #f8fafc;
25
+ /* Main Text */
26
+ --walrus-text-secondary: #94a3b8;
27
+ /* Muted Text */
28
+ --walrus-border: #334155;
29
+ /* Border Color */
30
+ --walrus-warning: #ef4444;
31
+ --walrus-success: #10b981;
32
+ --walrus-error: #ef4444;
33
+
34
+ /* Base Settings */
35
+ font-family: 'Inter', system-ui, sans-serif;
36
+ line-height: 1.5;
37
+ font-weight: 400;
38
+
39
+ color-scheme: dark;
40
+ color: var(--walrus-text-primary);
41
+ background-color: var(--walrus-bg-primary);
42
+
43
+ font-synthesis: none;
44
+ text-rendering: optimizeLegibility;
45
+ -webkit-font-smoothing: antialiased;
46
+ -moz-osx-font-smoothing: grayscale;
47
+ }
48
+
49
+ body {
50
+ margin: 0;
51
+ display: flex;
52
+ place-items: center;
53
+ min-width: 320px;
54
+ min-height: 100vh;
55
+ background-color: var(--walrus-bg-primary);
56
+ color: var(--walrus-text-primary);
57
+ }
58
+
59
+ #root {
60
+ max-width: 1280px;
61
+ margin: 0 auto;
62
+ padding: 2rem;
63
+ text-align: center;
64
+ width: 100%;
65
+ }
66
+
67
+ /* Typography Overrides */
68
+ h1,
69
+ h2,
70
+ h3,
71
+ h4,
72
+ h5,
73
+ h6 {
74
+ font-family: 'JetBrains Mono', monospace;
75
+ color: var(--walrus-text-primary);
76
+ }
77
+
78
+ h1 {
79
+ font-size: 3.2em;
80
+ line-height: 1.1;
81
+ }
82
+
83
+ h2 {
84
+ font-size: 2.5em;
85
+ }
86
+
87
+ h3 {
88
+ font-size: 1.5em;
89
+ }
90
+
91
+ a {
92
+ font-weight: 500;
93
+ color: var(--walrus-accent-blue);
94
+ text-decoration: inherit;
95
+ }
96
+
97
+ a:hover {
98
+ color: var(--walrus-accent-cyan);
99
+ }
100
+
101
+ /* Button Styling */
102
+ button {
103
+ border-radius: 8px;
104
+ border: 1px solid var(--walrus-border);
105
+ padding: 0.6em 1.2em;
106
+ font-size: 1em;
107
+ font-weight: 600;
108
+ font-family: inherit;
109
+ background-color: var(--walrus-surface);
110
+ color: var(--walrus-text-primary);
111
+ cursor: pointer;
112
+ transition: all 0.25s;
113
+ }
114
+
115
+ button:hover:not(:disabled) {
116
+ border-color: var(--walrus-accent-cyan);
117
+ background-color: var(--walrus-surface-hover);
118
+ box-shadow: 0 0 10px rgba(6, 182, 212, 0.2);
119
+ }
120
+
121
+ button:focus,
122
+ button:focus-visible {
123
+ outline: 4px auto var(--walrus-accent-cyan);
124
+ }
125
+
126
+ button:disabled {
127
+ opacity: 0.5;
128
+ cursor: not-allowed;
129
+ background-color: var(--walrus-bg-secondary);
130
+ }
131
+
132
+ /* Form Elements */
133
+ input {
134
+ background-color: var(--walrus-surface);
135
+ border: 1px solid var(--walrus-border);
136
+ color: var(--walrus-text-primary);
137
+ padding: 0.6em;
138
+ border-radius: 8px;
139
+ font-family: inherit;
140
+ font-size: 1em;
141
+ transition: border-color 0.2s;
142
+ }
143
+
144
+ input:focus {
145
+ outline: none;
146
+ border-color: var(--walrus-accent-cyan);
147
+ }
148
+
149
+ /* Utilities / Components */
150
+ .card {
151
+ background-color: var(--walrus-bg-secondary);
152
+ border: 1px solid var(--walrus-border);
153
+ border-radius: 12px;
154
+ padding: 2rem;
155
+ transition: all 0.2s;
156
+ }
157
+
158
+ .card:hover {
159
+ border-color: var(--walrus-accent-cyan);
160
+ box-shadow: 0 0 15px rgba(6, 182, 212, 0.15);
161
+ }
162
+
163
+ .badge {
164
+ display: inline-block;
165
+ padding: 0.2em 0.6em;
166
+ font-size: 0.85em;
167
+ font-weight: 500;
168
+ border-radius: 999px;
169
+ background-color: rgba(192, 132, 252, 0.15);
170
+ color: var(--walrus-accent-purple);
171
+ border: 1px solid rgba(192, 132, 252, 0.3);
172
+ }
173
+
174
+ .text-accent {
175
+ color: var(--walrus-accent-cyan);
176
+ }
177
+
178
+ .text-secondary {
179
+ color: var(--walrus-text-secondary);
180
+ }
181
+
182
+ .text-error {
183
+ color: var(--walrus-error);
184
+ }
185
+
186
+ .text-warning {
187
+ color: var(--walrus-warning);
188
+ }
189
+
190
+ /* App Specific Containers */
191
+ .simple-upload-app {
192
+ max-width: 900px;
193
+ margin: 0 auto;
194
+ display: flex;
195
+ flex-direction: column;
196
+ gap: 2rem;
197
+ }
198
+
199
+ /* Overriding section to look like cards */
200
+ section {
201
+ margin: 0;
202
+ padding: 2rem;
203
+ border: 1px solid var(--walrus-border);
204
+ background-color: var(--walrus-bg-secondary);
205
+ border-radius: 12px;
206
+ transition: border-color 0.2s;
207
+ }
208
+
209
+ section:hover {
210
+ border-color: var(--walrus-surface-hover);
211
+ }
212
+
213
+ section h3 {
214
+ margin-top: 0;
215
+ color: var(--walrus-accent-cyan);
216
+ }
217
+
218
+ .upload-form,
219
+ .file-preview {
220
+ display: flex;
221
+ flex-direction: column;
222
+ gap: 1.5rem;
223
+ align-items: stretch;
224
+ }
225
+
226
+ .file-info {
227
+ background: var(--walrus-bg-primary);
228
+ padding: 1rem;
229
+ border-radius: 8px;
230
+ border: 1px dashed var(--walrus-border);
231
+ text-align: left;
232
+ }
233
+
234
+ .error {
235
+ color: var(--walrus-error);
236
+ background: rgba(239, 68, 68, 0.1);
237
+ padding: 0.5rem;
238
+ border-radius: 4px;
239
+ }
240
+
241
+ .warning {
242
+ color: var(--walrus-warning);
243
+ }
244
+
245
+ /* Code/Pre blocks */
246
+ pre {
247
+ background: var(--walrus-bg-primary) !important;
248
+ color: var(--walrus-text-primary);
249
+ border: 1px solid var(--walrus-border);
250
+ border-radius: 8px;
251
+ font-family: 'JetBrains Mono', monospace;
252
+ }
@@ -0,0 +1,16 @@
1
+ // Re-export Walrus library
2
+ export * from './lib/walrus/index.js';
3
+
4
+ // Re-export features
5
+ export { UploadForm } from './components/features/upload-form.js';
6
+ export { FilePreview } from './components/features/file-preview.js';
7
+ export { WalletConnect } from './components/features/wallet-connect.js';
8
+
9
+ // Re-export hooks
10
+ export { useUpload } from './hooks/use-upload.js';
11
+ export { useDownload, useMetadata } from './hooks/use-download.js';
12
+ export { useWallet } from './hooks/use-wallet.js';
13
+
14
+ // Re-export layout
15
+ export { AppLayout } from './components/layout/app-layout.js';
16
+