@alpaca-editor/core 1.0.3897 → 1.0.3899
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.
- package/dist/components/ui/CardConnector.d.ts +3 -0
- package/dist/components/ui/CardConnector.js +6 -0
- package/dist/components/ui/CardConnector.js.map +1 -0
- package/dist/components/ui/button.js +1 -1
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/card.d.ts +12 -0
- package/dist/components/ui/card.js +10 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/config/config.js +7 -0
- package/dist/config/config.js.map +1 -1
- package/dist/editor/MobileLayout.js +15 -4
- package/dist/editor/MobileLayout.js.map +1 -1
- package/dist/editor/Titlebar.js +1 -1
- package/dist/editor/Titlebar.js.map +1 -1
- package/dist/editor/client/EditorClient.d.ts +13 -4
- package/dist/editor/client/EditorClient.js +34 -11
- package/dist/editor/client/EditorClient.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +3 -1
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/control-center/QuotaInfo.js +76 -26
- package/dist/editor/control-center/QuotaInfo.js.map +1 -1
- package/dist/editor/control-center/WebSocketMessages.d.ts +1 -0
- package/dist/editor/control-center/WebSocketMessages.js +66 -0
- package/dist/editor/control-center/WebSocketMessages.js.map +1 -0
- package/dist/editor/services/aiService.d.ts +1 -0
- package/dist/editor/services/aiService.js +4 -1
- package/dist/editor/services/aiService.js.map +1 -1
- package/dist/editor/sidebar/SidebarView.js +14 -14
- package/dist/editor/sidebar/SidebarView.js.map +1 -1
- package/dist/editor/ui/Icons.d.ts +3 -1
- package/dist/editor/ui/Icons.js +2 -2
- package/dist/editor/ui/Icons.js.map +1 -1
- package/dist/editor/ui/SimpleTabs.js +1 -1
- package/dist/editor/ui/SimpleTabs.js.map +1 -1
- package/dist/editor/ui/Splitter.d.ts +1 -0
- package/dist/editor/ui/Splitter.js +119 -58
- package/dist/editor/ui/Splitter.js.map +1 -1
- package/dist/fonts/index.d.ts +4 -0
- package/dist/fonts/index.js +9 -0
- package/dist/fonts/index.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/page-wizard/WizardBox.d.ts +2 -8
- package/dist/page-wizard/WizardBox.js +3 -5
- package/dist/page-wizard/WizardBox.js.map +1 -1
- package/dist/page-wizard/WizardSteps.d.ts +4 -2
- package/dist/page-wizard/WizardSteps.js +41 -62
- package/dist/page-wizard/WizardSteps.js.map +1 -1
- package/dist/page-wizard/steps/CollectStep.js +10 -10
- package/dist/page-wizard/steps/CollectStep.js.map +1 -1
- package/dist/page-wizard/steps/CreatePage.js +6 -3
- package/dist/page-wizard/steps/CreatePage.js.map +1 -1
- package/dist/page-wizard/steps/Generate.js +27 -5
- package/dist/page-wizard/steps/Generate.js.map +1 -1
- package/dist/page-wizard/steps/ImagesStep.js +46 -44
- package/dist/page-wizard/steps/ImagesStep.js.map +1 -1
- package/dist/page-wizard/steps/SelectStep.js +11 -19
- package/dist/page-wizard/steps/SelectStep.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/splash-screen/NewPage.js +12 -11
- package/dist/splash-screen/NewPage.js.map +1 -1
- package/dist/splash-screen/SplashScreen.js +8 -7
- package/dist/splash-screen/SplashScreen.js.map +1 -1
- package/dist/styles.css +179 -104
- package/package.json +1 -1
- package/src/components/ui/CardConnector.tsx +21 -0
- package/src/components/ui/button.tsx +1 -1
- package/src/components/ui/card.tsx +44 -0
- package/src/config/config.tsx +7 -0
- package/src/editor/MobileLayout.tsx +20 -7
- package/src/editor/Titlebar.tsx +1 -1
- package/src/editor/client/EditorClient.tsx +53 -15
- package/src/editor/client/editContext.ts +9 -1
- package/src/editor/control-center/QuotaInfo.tsx +225 -95
- package/src/editor/control-center/WebSocketMessages.tsx +155 -0
- package/src/editor/services/aiService.ts +4 -1
- package/src/editor/sidebar/SidebarView.tsx +46 -44
- package/src/editor/ui/Icons.tsx +2 -3
- package/src/editor/ui/SimpleTabs.tsx +1 -1
- package/src/editor/ui/Splitter.tsx +152 -80
- package/src/fonts/index.ts +10 -0
- package/src/index.ts +9 -1
- package/src/page-wizard/WizardBox.tsx +3 -39
- package/src/page-wizard/WizardSteps.tsx +231 -161
- package/src/page-wizard/steps/CollectStep.tsx +10 -11
- package/src/page-wizard/steps/CreatePage.tsx +130 -84
- package/src/page-wizard/steps/Generate.tsx +45 -17
- package/src/page-wizard/steps/ImagesStep.tsx +161 -141
- package/src/page-wizard/steps/SelectStep.tsx +92 -76
- package/src/revision.ts +2 -2
- package/src/splash-screen/NewPage.tsx +107 -80
- package/src/splash-screen/SplashScreen.tsx +49 -33
- package/styles.css +38 -0
|
@@ -4,11 +4,14 @@ import { useEditContext } from "../../editor/client/editContext";
|
|
|
4
4
|
import { executePrompt } from "../../editor/services/aiService";
|
|
5
5
|
import { createWizardAiContext } from "../service";
|
|
6
6
|
import { classNames } from "primereact/utils";
|
|
7
|
-
import { Splitter, SplitterPanel } from "../../editor/ui/Splitter";
|
|
8
7
|
import { InputTextarea } from "primereact/inputtextarea";
|
|
9
8
|
import { StepComponentProps } from "../../config/types";
|
|
10
9
|
import { ActionButton } from "../../components/ActionButton";
|
|
11
10
|
import Generate from "./Generate";
|
|
11
|
+
import { WizardBox } from "../WizardBox";
|
|
12
|
+
import { WizardBoxConnector } from "../WizardBoxConnector";
|
|
13
|
+
import { Settings, CheckSquare } from "lucide-react";
|
|
14
|
+
|
|
12
15
|
type Option = {
|
|
13
16
|
title: string;
|
|
14
17
|
description: string;
|
|
@@ -174,82 +177,95 @@ export function SelectStep({
|
|
|
174
177
|
);
|
|
175
178
|
}
|
|
176
179
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
180
|
+
return (
|
|
181
|
+
<div className="flex h-full">
|
|
182
|
+
<WizardBox
|
|
183
|
+
title="Configuration"
|
|
184
|
+
icon={<Settings />}
|
|
185
|
+
description="Configure instructions and regenerate options"
|
|
186
|
+
className="w-96"
|
|
187
|
+
>
|
|
188
|
+
<div className="flex h-full flex-col items-stretch">
|
|
189
|
+
<div className="relative flex-1">
|
|
190
|
+
<div className="absolute inset-0 overflow-y-auto pr-6">
|
|
191
|
+
<h3 className="text-sm font-bold">Instructions</h3>
|
|
192
|
+
<InputTextarea
|
|
193
|
+
className="h-48 w-full text-sm"
|
|
194
|
+
value={instructions}
|
|
195
|
+
onChange={(e) => setInstructions(e.target.value)}
|
|
196
|
+
placeholder="Enter instructions for the options"
|
|
197
|
+
/>
|
|
198
|
+
</div>
|
|
185
199
|
</div>
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
return (
|
|
198
|
-
<div
|
|
199
|
-
key={option.id}
|
|
200
|
-
className={classNames(
|
|
201
|
-
"mb-3 flex items-center rounded border-2 bg-white p-3",
|
|
202
|
-
index % 2 === 0
|
|
203
|
-
? "animate-fadeRight"
|
|
204
|
-
: "animate-fadeLeft",
|
|
205
|
-
isSelected
|
|
206
|
-
? "text-canvas-pink border-canvas-pink"
|
|
207
|
-
: "border-gray-300 text-gray-600",
|
|
208
|
-
)}
|
|
209
|
-
onClick={() => handleOptionSelect(option)}
|
|
210
|
-
>
|
|
211
|
-
<div className="flex flex-1 cursor-pointer flex-col">
|
|
212
|
-
<div className="font-medium">{option.title}</div>
|
|
213
|
-
<div className="text-xs text-gray-600">
|
|
214
|
-
{option.description}
|
|
215
|
-
</div>
|
|
216
|
-
</div>
|
|
217
|
-
{isSelected && (
|
|
218
|
-
<div className="text-canvas-pink ml-2">✓</div>
|
|
219
|
-
)}
|
|
220
|
-
</div>
|
|
221
|
-
);
|
|
222
|
-
})
|
|
223
|
-
)}
|
|
200
|
+
<div className="py-2">
|
|
201
|
+
<ActionButton
|
|
202
|
+
onClick={generateOptions}
|
|
203
|
+
isLoading={loading}
|
|
204
|
+
disabled={loading}
|
|
205
|
+
loadingText="Thinking..."
|
|
206
|
+
className="w-full"
|
|
207
|
+
>
|
|
208
|
+
Regenerate Options
|
|
209
|
+
</ActionButton>
|
|
224
210
|
</div>
|
|
225
|
-
|
|
226
|
-
</
|
|
227
|
-
|
|
228
|
-
|
|
211
|
+
</div>
|
|
212
|
+
</WizardBox>
|
|
213
|
+
<WizardBoxConnector className="mt-6" />
|
|
214
|
+
<WizardBox
|
|
215
|
+
title="Select Options"
|
|
216
|
+
icon={<CheckSquare />}
|
|
217
|
+
description="Choose from the generated options below"
|
|
218
|
+
className="flex-1"
|
|
219
|
+
>
|
|
220
|
+
<div className="h-full">
|
|
221
|
+
{loading && (
|
|
222
|
+
<div className="flex h-full items-center justify-center">
|
|
223
|
+
<Generate title="Generating options..." />
|
|
224
|
+
</div>
|
|
225
|
+
)}
|
|
226
|
+
{!loading && (
|
|
227
|
+
<div>
|
|
228
|
+
{options.length === 0 ? (
|
|
229
|
+
<div className="p-4 text-gray-500">
|
|
230
|
+
No options available. Try refreshing the page.
|
|
231
|
+
</div>
|
|
232
|
+
) : (
|
|
233
|
+
options.map((option, index) => {
|
|
234
|
+
const isSelected = selectedOptions.includes(option.id);
|
|
229
235
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
236
|
+
return (
|
|
237
|
+
<div
|
|
238
|
+
key={option.id}
|
|
239
|
+
className={classNames(
|
|
240
|
+
"mb-3 flex items-center rounded border-2 bg-white p-3",
|
|
241
|
+
index % 2 === 0
|
|
242
|
+
? "animate-fadeRight"
|
|
243
|
+
: "animate-fadeLeft",
|
|
244
|
+
isSelected
|
|
245
|
+
? "text-theme-secondary border-theme-secondary"
|
|
246
|
+
: "border-gray-300 text-gray-600",
|
|
247
|
+
)}
|
|
248
|
+
onClick={() => handleOptionSelect(option)}
|
|
249
|
+
>
|
|
250
|
+
<div className="flex flex-1 cursor-pointer flex-col">
|
|
251
|
+
<div className="font-medium">{option.title}</div>
|
|
252
|
+
<div className="text-xs text-gray-600">
|
|
253
|
+
{option.description}
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
{isSelected && (
|
|
257
|
+
<div className="bg-theme-secondary ml-2 flex h-6 w-6 items-center justify-center rounded-full text-white">
|
|
258
|
+
✓
|
|
259
|
+
</div>
|
|
260
|
+
)}
|
|
261
|
+
</div>
|
|
262
|
+
);
|
|
263
|
+
})
|
|
264
|
+
)}
|
|
265
|
+
</div>
|
|
266
|
+
)}
|
|
267
|
+
</div>
|
|
268
|
+
</WizardBox>
|
|
269
|
+
</div>
|
|
270
|
+
);
|
|
255
271
|
}
|
package/src/revision.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = "1.0.
|
|
2
|
-
export const buildDate = "2025-05-
|
|
1
|
+
export const version = "1.0.3899";
|
|
2
|
+
export const buildDate = "2025-05-26 01:54:10";
|
|
@@ -20,6 +20,8 @@ import { ItemDescriptor } from "../editor/pageModel";
|
|
|
20
20
|
import { useDebouncedCallback } from "use-debounce";
|
|
21
21
|
import { getWizards } from "../page-wizard/service";
|
|
22
22
|
import { Wizard } from "../page-wizard/PageWizard";
|
|
23
|
+
import { Card } from "../components/ui/card";
|
|
24
|
+
import { CardConnector } from "../components/ui/CardConnector";
|
|
23
25
|
export function NewPage({ selectedItemId }: { selectedItemId?: string }) {
|
|
24
26
|
const [selectedItem, setSelectedItem] = useState<ItemDescriptor | null>(null);
|
|
25
27
|
const [isValid, setIsValid] = useState<boolean>(false);
|
|
@@ -143,90 +145,115 @@ export function NewPage({ selectedItemId }: { selectedItemId?: string }) {
|
|
|
143
145
|
};
|
|
144
146
|
|
|
145
147
|
return (
|
|
146
|
-
<div className="flex h-full
|
|
147
|
-
<div className="tour-pick-location flex
|
|
148
|
-
<
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
148
|
+
<div className="flex h-full flex-col bg-gray-50 p-4 md:flex-row">
|
|
149
|
+
<div className="tour-pick-location flex-1">
|
|
150
|
+
<Card
|
|
151
|
+
icon={<i className="pi pi-map-marker text-sm"></i>}
|
|
152
|
+
title="Pick Location"
|
|
153
|
+
description="Select where to create your new page"
|
|
154
|
+
noPadding
|
|
155
|
+
>
|
|
156
|
+
<div className="relative h-full">
|
|
157
|
+
<div className="absolute inset-0 overflow-auto">
|
|
158
|
+
<ScrollingContentTree
|
|
159
|
+
selectedItemId={selectedItem?.id || selectedItemId}
|
|
160
|
+
onSelectionChange={(selection) => {
|
|
161
|
+
const selected = selection[0] as ItemTreeNodeData;
|
|
162
|
+
if (selected) setSelectedItem(selected);
|
|
163
|
+
}}
|
|
164
|
+
/>
|
|
165
|
+
</div>
|
|
158
166
|
</div>
|
|
159
|
-
</
|
|
167
|
+
</Card>
|
|
160
168
|
</div>
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
{!insertOptions?.length && (
|
|
167
|
-
<div>No page templates available here.</div>
|
|
168
|
-
)}
|
|
169
|
-
{insertOptionsAndWizards?.map((option) => (
|
|
170
|
-
<div
|
|
171
|
-
key={option.id}
|
|
172
|
-
onClick={() => setSelectedTemplate(option.id)}
|
|
173
|
-
className={classNames(
|
|
174
|
-
"mb-2 flex cursor-pointer flex-col items-center bg-gray-100 p-2 text-sm",
|
|
175
|
-
selectedTemplate === option.id
|
|
176
|
-
? "tour-selected-template bg-gray-200 outline outline-2 outline-offset-2 outline-gray-200"
|
|
177
|
-
: "bg-gray-100",
|
|
178
|
-
)}
|
|
179
|
-
>
|
|
180
|
-
{
|
|
181
|
-
<img
|
|
182
|
-
src={getAbsoluteIconUrl(option.icon)}
|
|
183
|
-
width="32"
|
|
184
|
-
height="32"
|
|
185
|
-
></img>
|
|
186
|
-
}
|
|
187
|
-
{option.name}
|
|
188
|
-
</div>
|
|
189
|
-
))}
|
|
169
|
+
|
|
170
|
+
{/* Card Connector - only visible when location is selected */}
|
|
171
|
+
{selectedItem && (
|
|
172
|
+
<div className="hidden items-start justify-center pt-10 md:flex">
|
|
173
|
+
<CardConnector />
|
|
190
174
|
</div>
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
175
|
+
)}
|
|
176
|
+
|
|
177
|
+
{/* Second card - only visible when location is selected */}
|
|
178
|
+
{selectedItem && (
|
|
179
|
+
<div className="flex-1">
|
|
180
|
+
<Card
|
|
181
|
+
icon={<i className="pi pi-palette text-sm"></i>}
|
|
182
|
+
title="Choose Template or Wizard"
|
|
183
|
+
description="Select a template or wizard to create your page"
|
|
184
|
+
>
|
|
185
|
+
<div className="tour-choose-template">
|
|
186
|
+
<div className="flex min-h-12 flex-wrap gap-3">
|
|
187
|
+
{!insertOptions?.length && (
|
|
188
|
+
<div>No page templates available here.</div>
|
|
189
|
+
)}
|
|
190
|
+
{insertOptionsAndWizards?.map((option) => (
|
|
191
|
+
<div
|
|
192
|
+
key={option.id}
|
|
193
|
+
onClick={() => setSelectedTemplate(option.id)}
|
|
194
|
+
className={classNames(
|
|
195
|
+
"mb-2 flex cursor-pointer flex-col items-center rounded bg-gray-100 p-2 text-sm",
|
|
196
|
+
selectedTemplate === option.id
|
|
197
|
+
? "tour-selected-template bg-gray-200 outline outline-2 outline-offset-2 outline-gray-200"
|
|
198
|
+
: "bg-gray-100",
|
|
199
|
+
)}
|
|
200
|
+
>
|
|
201
|
+
{
|
|
202
|
+
<img
|
|
203
|
+
src={getAbsoluteIconUrl(option.icon)}
|
|
204
|
+
width="32"
|
|
205
|
+
height="32"
|
|
206
|
+
></img>
|
|
207
|
+
}
|
|
208
|
+
{option.name}
|
|
209
|
+
</div>
|
|
210
|
+
))}
|
|
226
211
|
</div>
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
212
|
+
{selectedTemplate &&
|
|
213
|
+
wizards?.find((x) => x.id === selectedTemplate) && (
|
|
214
|
+
<div className="mt-4">
|
|
215
|
+
<Button
|
|
216
|
+
onClick={launchWizard}
|
|
217
|
+
label="Start Wizard"
|
|
218
|
+
id="launch-wizard-button"
|
|
219
|
+
/>
|
|
220
|
+
</div>
|
|
221
|
+
)}
|
|
222
|
+
{selectedTemplate &&
|
|
223
|
+
insertOptions?.find((x) => x.id === selectedTemplate) && (
|
|
224
|
+
<div className="mt-6 border-t pt-4">
|
|
225
|
+
<div className="mb-3 text-base font-bold text-neutral-800">
|
|
226
|
+
Name Your Page
|
|
227
|
+
</div>
|
|
228
|
+
<InputText
|
|
229
|
+
className="w-full"
|
|
230
|
+
value={name}
|
|
231
|
+
id="new-page-name"
|
|
232
|
+
onChange={(e) => setName(e.target.value)}
|
|
233
|
+
onKeyDown={(ev) => {
|
|
234
|
+
if (ev.key === "Enter" && isValid) handleOk();
|
|
235
|
+
}}
|
|
236
|
+
data-testid="new-page-name"
|
|
237
|
+
/>
|
|
238
|
+
{validationMessage && (
|
|
239
|
+
<div className="mt-2 text-red-500">
|
|
240
|
+
{validationMessage}
|
|
241
|
+
</div>
|
|
242
|
+
)}
|
|
243
|
+
<div className="mt-4">
|
|
244
|
+
<Button
|
|
245
|
+
onClick={handleOk}
|
|
246
|
+
label="Create"
|
|
247
|
+
disabled={!isValid}
|
|
248
|
+
id="create-new-page-button"
|
|
249
|
+
/>
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
)}
|
|
253
|
+
</div>
|
|
254
|
+
</Card>
|
|
255
|
+
</div>
|
|
256
|
+
)}
|
|
230
257
|
</div>
|
|
231
258
|
);
|
|
232
259
|
}
|
|
@@ -10,6 +10,7 @@ import { usePathname, useRouter } from "next/navigation";
|
|
|
10
10
|
import { SimpleIconButton } from "../editor/ui/SimpleIconButton";
|
|
11
11
|
import { Spinner } from "../editor/ui/Spinner";
|
|
12
12
|
import { ItemDescriptor } from "../editor/pageModel";
|
|
13
|
+
import { Card } from "../components/ui/card";
|
|
13
14
|
|
|
14
15
|
export function SplashScreen() {
|
|
15
16
|
const savedHistory =
|
|
@@ -76,38 +77,53 @@ export function SplashScreen() {
|
|
|
76
77
|
const tabs: Tab[] = [
|
|
77
78
|
{
|
|
78
79
|
content: (
|
|
79
|
-
<div className="flex flex-1 gap-4 text-sm">
|
|
80
|
-
<div className="
|
|
81
|
-
<
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
80
|
+
<div className="flex flex-1 flex-col gap-4 text-sm md:flex-row">
|
|
81
|
+
<div className="flex-1">
|
|
82
|
+
<Card
|
|
83
|
+
icon={<i className="pi pi-sitemap text-sm"></i>}
|
|
84
|
+
title="Browse Content"
|
|
85
|
+
description="Navigate through your content structure"
|
|
86
|
+
noPadding
|
|
87
|
+
>
|
|
88
|
+
<div className="relative h-full">
|
|
89
|
+
<ScrollingContentTree
|
|
90
|
+
selectedItemId={selectedPage?.id}
|
|
91
|
+
onSelectionChange={(selection) => {
|
|
92
|
+
const selectedItem = selection[0];
|
|
93
|
+
if (selectedItem) {
|
|
94
|
+
loadItem(selectedItem);
|
|
95
|
+
}
|
|
96
|
+
}}
|
|
97
|
+
/>
|
|
98
|
+
</div>
|
|
99
|
+
</Card>
|
|
90
100
|
</div>
|
|
91
|
-
<div className="flex
|
|
92
|
-
<
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
101
|
+
<div className="flex-1 md:pl-4">
|
|
102
|
+
<Card
|
|
103
|
+
icon={<i className="pi pi-history text-sm"></i>}
|
|
104
|
+
title="Recent Pages"
|
|
105
|
+
description="Quick access to your recently viewed pages"
|
|
106
|
+
noPadding
|
|
107
|
+
>
|
|
108
|
+
<div className="relative h-full">
|
|
109
|
+
<ul className="absolute inset-0 overflow-auto p-6 pt-0">
|
|
110
|
+
{history?.map((page, index) => (
|
|
111
|
+
<li
|
|
112
|
+
key={index}
|
|
113
|
+
onMouseOver={() => setSelectedPage(page)}
|
|
114
|
+
onClick={() => loadItem(page)}
|
|
115
|
+
className="flex cursor-pointer items-center gap-2 rounded p-2 text-xs hover:bg-gray-100"
|
|
116
|
+
>
|
|
117
|
+
{page.icon && (
|
|
118
|
+
<img src={page.icon} width="16" height="16" />
|
|
119
|
+
)}{" "}
|
|
120
|
+
{page.name}{" "}
|
|
121
|
+
<span className="text-gray-500">({page.language})</span>
|
|
122
|
+
</li>
|
|
123
|
+
))}
|
|
124
|
+
</ul>
|
|
125
|
+
</div>
|
|
126
|
+
</Card>
|
|
111
127
|
</div>
|
|
112
128
|
</div>
|
|
113
129
|
),
|
|
@@ -128,7 +144,7 @@ export function SplashScreen() {
|
|
|
128
144
|
|
|
129
145
|
return (
|
|
130
146
|
<div className="flex h-full items-center justify-center bg-gray-100">
|
|
131
|
-
<div className="relative h-
|
|
147
|
+
<div className="relative h-full w-full space-y-8 rounded-lg bg-white p-4 shadow-lg md:h-3/4 md:w-2/3 md:p-8">
|
|
132
148
|
<div className="flex h-full flex-col">
|
|
133
149
|
<div className="flex flex-1 flex-col">
|
|
134
150
|
<SimpleTabs
|
|
@@ -147,7 +163,7 @@ export function SplashScreen() {
|
|
|
147
163
|
</div>
|
|
148
164
|
</div>
|
|
149
165
|
|
|
150
|
-
<div className="absolute top-0 right-0 p-2">
|
|
166
|
+
<div className="absolute top-0 right-0 hidden p-2 md:block">
|
|
151
167
|
<SimpleIconButton
|
|
152
168
|
icon="pi pi-times"
|
|
153
169
|
onClick={() =>
|
package/styles.css
CHANGED
|
@@ -1,11 +1,49 @@
|
|
|
1
|
+
/* Override default fonts to ensure Inter is used throughout */
|
|
2
|
+
* {
|
|
3
|
+
font-family:
|
|
4
|
+
var(--font-inter),
|
|
5
|
+
Inter,
|
|
6
|
+
-apple-system,
|
|
7
|
+
BlinkMacSystemFont,
|
|
8
|
+
"Segoe UI",
|
|
9
|
+
"Roboto",
|
|
10
|
+
"Oxygen",
|
|
11
|
+
"Ubuntu",
|
|
12
|
+
"Cantarell",
|
|
13
|
+
"Fira Sans",
|
|
14
|
+
"Droid Sans",
|
|
15
|
+
"Helvetica Neue",
|
|
16
|
+
sans-serif;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
html,
|
|
20
|
+
body {
|
|
21
|
+
font-family:
|
|
22
|
+
var(--font-inter),
|
|
23
|
+
Inter,
|
|
24
|
+
-apple-system,
|
|
25
|
+
BlinkMacSystemFont,
|
|
26
|
+
"Segoe UI",
|
|
27
|
+
"Roboto",
|
|
28
|
+
"Oxygen",
|
|
29
|
+
"Ubuntu",
|
|
30
|
+
"Cantarell",
|
|
31
|
+
"Fira Sans",
|
|
32
|
+
"Droid Sans",
|
|
33
|
+
"Helvetica Neue",
|
|
34
|
+
sans-serif;
|
|
35
|
+
}
|
|
36
|
+
|
|
1
37
|
@theme {
|
|
2
38
|
--font-geist-sans: "GeistSans";
|
|
3
39
|
--font-geist-mono: "GeistMono";
|
|
40
|
+
--font-inter: "Inter";
|
|
4
41
|
--color-canvas-red: #e32e52;
|
|
5
42
|
--color-canvas-pink: #e32e52;
|
|
6
43
|
--color-alpaca-blue: #209cfc;
|
|
7
44
|
--color-alpaca-blue-light: #41aafd;
|
|
8
45
|
--color-theme-secondary: #9650fb;
|
|
46
|
+
--color-theme-secondary-light: #f6eeff;
|
|
9
47
|
--color-neutral-350: #b4b4b4;
|
|
10
48
|
--text-2xs: 0.7rem;
|
|
11
49
|
--text-3xs: 0.6rem;
|