@rimelight/ui 0.0.5 → 0.0.7
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/LICENSE +21 -21
- package/package.json +22 -14
- package/src/components/BlogPost.astro +195 -0
- package/src/components/DynamicShowcase.astro +681 -0
- package/src/components/ExtendedCarousel.astro +107 -0
- package/src/components/FormattedDate.astro +6 -2
- package/src/components/Head.astro +153 -0
- package/src/components/ProjectPost.astro +197 -0
- package/src/components/RLHead.astro +3 -0
- package/src/components/ThemeToggle.astro +30 -42
- package/src/components/astro/RLAButton.astro +32 -42
- package/src/components/astro/RLAHeader.astro +75 -0
- package/src/components/nuxt/index.ts +1 -0
- package/src/components/vue/RLVButton.vue +50 -37
- package/src/components/vue/RLVHeader.vue +78 -0
- package/src/composables/index.ts +1 -1
- package/src/composables/{useComponentUI.ts → useUi.ts} +3 -3
- package/src/config/index.ts +0 -2
- package/src/config/site.config.ts +1 -1
- package/src/env.d.ts +13 -16
- package/src/integrations/ui.ts +106 -81
- package/src/integrations/vue-entrypoint.ts +6 -0
- package/src/middleware/sri.ts +2 -2
- package/src/styles/index.css +2 -0
- package/src/themes/button.theme.ts +350 -34
- package/src/themes/header.theme.ts +33 -0
- package/src/themes/index.ts +3 -1
- package/src/utils/index.ts +1 -2
- package/i18n-data.json +0 -186
- package/src/components/MissingTranslationBanner.astro +0 -39
- package/src/components/accordion/Accordion.astro +0 -257
- package/src/components/accordion/AccordionContent.astro +0 -34
- package/src/components/accordion/AccordionItem.astro +0 -29
- package/src/components/accordion/AccordionTrigger.astro +0 -33
- package/src/components/alert/Alert.astro +0 -34
- package/src/components/alert/AlertDescription.astro +0 -15
- package/src/components/alert/AlertTitle.astro +0 -17
- package/src/components/alert-dialog/AlertDialog.astro +0 -275
- package/src/components/alert-dialog/AlertDialogAction.astro +0 -46
- package/src/components/alert-dialog/AlertDialogCancel.astro +0 -46
- package/src/components/alert-dialog/AlertDialogContent.astro +0 -52
- package/src/components/alert-dialog/AlertDialogDescription.astro +0 -18
- package/src/components/alert-dialog/AlertDialogFooter.astro +0 -16
- package/src/components/alert-dialog/AlertDialogHeader.astro +0 -14
- package/src/components/alert-dialog/AlertDialogTitle.astro +0 -20
- package/src/components/alert-dialog/AlertDialogTrigger.astro +0 -47
- package/src/components/aspect-ratio/AspectRatio.astro +0 -32
- package/src/components/avatar/Avatar.astro +0 -29
- package/src/components/avatar/AvatarFallback.astro +0 -18
- package/src/components/avatar/AvatarImage.astro +0 -66
- package/src/components/badge/Badge.astro +0 -57
- package/src/components/breadcrumb/Breadcrumb.astro +0 -12
- package/src/components/breadcrumb/BreadcrumbEllipsis.astro +0 -29
- package/src/components/breadcrumb/BreadcrumbItem.astro +0 -15
- package/src/components/breadcrumb/BreadcrumbLink.astro +0 -24
- package/src/components/breadcrumb/BreadcrumbList.astro +0 -17
- package/src/components/breadcrumb/BreadcrumbPage.astro +0 -22
- package/src/components/breadcrumb/BreadcrumbSeparator.astro +0 -24
- package/src/components/button/Button.astro +0 -58
- package/src/components/button-group/ButtonGroup.astro +0 -64
- package/src/components/button-group/ButtonGroupSeparator.astro +0 -20
- package/src/components/button-group/ButtonGroupText.astro +0 -19
- package/src/components/card/Card.astro +0 -36
- package/src/components/card/CardAction.astro +0 -16
- package/src/components/card/CardContent.astro +0 -16
- package/src/components/card/CardDescription.astro +0 -16
- package/src/components/card/CardFooter.astro +0 -16
- package/src/components/card/CardHeader.astro +0 -19
- package/src/components/card/CardTitle.astro +0 -16
- package/src/components/carousel/Carousel.astro +0 -55
- package/src/components/carousel/CarouselContent.astro +0 -26
- package/src/components/carousel/CarouselItem.astro +0 -26
- package/src/components/carousel/CarouselNext.astro +0 -39
- package/src/components/carousel/CarouselPrevious.astro +0 -41
- package/src/components/carousel/carousel-script.ts +0 -188
- package/src/components/carousel/index.ts +0 -1
- package/src/components/checkbox/Checkbox.astro +0 -133
- package/src/components/collapsible/Collapsible.astro +0 -161
- package/src/components/collapsible/CollapsibleContent.astro +0 -22
- package/src/components/collapsible/CollapsibleTrigger.astro +0 -44
- package/src/components/dialog/Dialog.astro +0 -389
- package/src/components/dialog/DialogClose.astro +0 -35
- package/src/components/dialog/DialogContent.astro +0 -78
- package/src/components/dialog/DialogDescription.astro +0 -14
- package/src/components/dialog/DialogFooter.astro +0 -14
- package/src/components/dialog/DialogHeader.astro +0 -14
- package/src/components/dialog/DialogTitle.astro +0 -18
- package/src/components/dialog/DialogTrigger.astro +0 -47
- package/src/components/dropdown/Dropdown.astro +0 -604
- package/src/components/dropdown/DropdownContent.astro +0 -118
- package/src/components/dropdown/DropdownItem.astro +0 -48
- package/src/components/dropdown/DropdownLabel.astro +0 -29
- package/src/components/dropdown/DropdownSeparator.astro +0 -21
- package/src/components/dropdown/DropdownShortcut.astro +0 -17
- package/src/components/dropdown/DropdownSub.astro +0 -15
- package/src/components/dropdown/DropdownSubContent.astro +0 -39
- package/src/components/dropdown/DropdownSubTrigger.astro +0 -34
- package/src/components/dropdown/DropdownTrigger.astro +0 -52
- package/src/components/dropzone/Dropzone.astro +0 -236
- package/src/components/dropzone/DropzoneFilesList.astro +0 -26
- package/src/components/dropzone/DropzoneLoadingIndicator.astro +0 -10
- package/src/components/dropzone/DropzoneUploadIndicator.astro +0 -10
- package/src/components/embeds/YoutubeEmbed.astro +0 -94
- package/src/components/hero/Hero.astro +0 -166
- package/src/components/icons/Flag.astro +0 -62
- package/src/components/image/ExtendedImage.astro +0 -46
- package/src/components/image/Image.astro +0 -25
- package/src/components/input/Input.astro +0 -27
- package/src/components/input-group/InputGroup.astro +0 -28
- package/src/components/input-group/InputGroupAddon.astro +0 -76
- package/src/components/input-group/InputGroupButton.astro +0 -36
- package/src/components/input-group/InputGroupInput.astro +0 -18
- package/src/components/input-group/InputGroupText.astro +0 -17
- package/src/components/input-group/InputGroupTextarea.astro +0 -22
- package/src/components/input-otp/InputOtp.astro +0 -352
- package/src/components/input-otp/InputOtpGroup.astro +0 -16
- package/src/components/input-otp/InputOtpSeparator.astro +0 -25
- package/src/components/input-otp/InputOtpSlot.astro +0 -50
- package/src/components/input-otp/InputOtpTypes.ts +0 -6
- package/src/components/item/Item.astro +0 -52
- package/src/components/item/ItemActions.astro +0 -16
- package/src/components/item/ItemContent.astro +0 -16
- package/src/components/item/ItemDescription.astro +0 -19
- package/src/components/item/ItemFooter.astro +0 -16
- package/src/components/item/ItemGroup.astro +0 -16
- package/src/components/item/ItemHeader.astro +0 -16
- package/src/components/item/ItemMedia.astro +0 -40
- package/src/components/item/ItemSeparator.astro +0 -23
- package/src/components/item/ItemTitle.astro +0 -16
- package/src/components/kbd/Kbd.astro +0 -21
- package/src/components/kbd/KbdGroup.astro +0 -16
- package/src/components/label/Label.astro +0 -24
- package/src/components/marquee/Marquee.astro +0 -73
- package/src/components/native-select/NativeSelect.astro +0 -68
- package/src/components/native-select/NativeSelectOptGroup.astro +0 -15
- package/src/components/native-select/NativeSelectOption.astro +0 -15
- package/src/components/pagination/Pagination.astro +0 -20
- package/src/components/pagination/PaginationContent.astro +0 -16
- package/src/components/pagination/PaginationEllipsis.astro +0 -37
- package/src/components/pagination/PaginationItem.astro +0 -16
- package/src/components/pagination/PaginationLink.astro +0 -27
- package/src/components/pagination/PaginationNext.astro +0 -33
- package/src/components/pagination/PaginationPrevious.astro +0 -33
- package/src/components/popover/Popover.astro +0 -717
- package/src/components/popover/PopoverContent.astro +0 -102
- package/src/components/popover/PopoverDescription.astro +0 -14
- package/src/components/popover/PopoverHeader.astro +0 -14
- package/src/components/popover/PopoverTitle.astro +0 -14
- package/src/components/popover/PopoverTrigger.astro +0 -51
- package/src/components/progress/Progress.astro +0 -154
- package/src/components/prose/Prose.astro +0 -619
- package/src/components/radio-group/RadioGroup.astro +0 -162
- package/src/components/radio-group/RadioGroupItem.astro +0 -133
- package/src/components/radio-group/RadioGroupTypes.ts +0 -6
- package/src/components/section/Section.astro +0 -167
- package/src/components/select/Select.astro +0 -752
- package/src/components/select/SelectContent.astro +0 -94
- package/src/components/select/SelectGroup.astro +0 -9
- package/src/components/select/SelectItem.astro +0 -51
- package/src/components/select/SelectLabel.astro +0 -14
- package/src/components/select/SelectSearch.astro +0 -49
- package/src/components/select/SelectSeparator.astro +0 -12
- package/src/components/select/SelectTrigger.astro +0 -56
- package/src/components/select/SelectTypes.ts +0 -13
- package/src/components/select/SelectValue.astro +0 -19
- package/src/components/separator/Separator.astro +0 -36
- package/src/components/sheet/Sheet.astro +0 -15
- package/src/components/sheet/SheetClose.astro +0 -15
- package/src/components/sheet/SheetContent.astro +0 -89
- package/src/components/sheet/SheetDescription.astro +0 -16
- package/src/components/sheet/SheetFooter.astro +0 -16
- package/src/components/sheet/SheetHeader.astro +0 -16
- package/src/components/sheet/SheetTitle.astro +0 -16
- package/src/components/sheet/SheetTrigger.astro +0 -15
- package/src/components/sidebar/Sidebar.astro +0 -231
- package/src/components/sidebar/SidebarContent.astro +0 -25
- package/src/components/sidebar/SidebarFooter.astro +0 -22
- package/src/components/sidebar/SidebarGroup.astro +0 -22
- package/src/components/sidebar/SidebarGroupContent.astro +0 -22
- package/src/components/sidebar/SidebarGroupLabel.astro +0 -53
- package/src/components/sidebar/SidebarHeader.astro +0 -22
- package/src/components/sidebar/SidebarInput.astro +0 -24
- package/src/components/sidebar/SidebarInset.astro +0 -22
- package/src/components/sidebar/SidebarMenu.astro +0 -22
- package/src/components/sidebar/SidebarMenuAction.astro +0 -63
- package/src/components/sidebar/SidebarMenuBadge.astro +0 -31
- package/src/components/sidebar/SidebarMenuButton.astro +0 -124
- package/src/components/sidebar/SidebarMenuItem.astro +0 -22
- package/src/components/sidebar/SidebarMenuSkeleton.astro +0 -43
- package/src/components/sidebar/SidebarMenuSub.astro +0 -25
- package/src/components/sidebar/SidebarMenuSubButton.astro +0 -52
- package/src/components/sidebar/SidebarMenuSubItem.astro +0 -17
- package/src/components/sidebar/SidebarProvider.astro +0 -215
- package/src/components/sidebar/SidebarRail.astro +0 -72
- package/src/components/sidebar/SidebarSeparator.astro +0 -25
- package/src/components/sidebar/SidebarTrigger.astro +0 -69
- package/src/components/skeleton/Skeleton.astro +0 -14
- package/src/components/slider/Slider.astro +0 -425
- package/src/components/spinner/Spinner.astro +0 -23
- package/src/components/switch/Switch.astro +0 -192
- package/src/components/switch/SwitchTypes.ts +0 -6
- package/src/components/table/Table.astro +0 -20
- package/src/components/table/TableBody.astro +0 -18
- package/src/components/table/TableCaption.astro +0 -18
- package/src/components/table/TableCell.astro +0 -18
- package/src/components/table/TableFoot.astro +0 -18
- package/src/components/table/TableHead.astro +0 -18
- package/src/components/table/TableHeader.astro +0 -18
- package/src/components/table/TableRow.astro +0 -17
- package/src/components/tabs/Tabs.astro +0 -270
- package/src/components/tabs/TabsContent.astro +0 -28
- package/src/components/tabs/TabsList.astro +0 -23
- package/src/components/tabs/TabsTrigger.astro +0 -34
- package/src/components/textarea/Textarea.astro +0 -31
- package/src/components/toast/ToastDescription.astro +0 -22
- package/src/components/toast/ToastItem.astro +0 -56
- package/src/components/toast/ToastTemplate.astro +0 -27
- package/src/components/toast/ToastTitle.astro +0 -59
- package/src/components/toast/Toaster.astro +0 -981
- package/src/components/toast/index.ts +0 -1
- package/src/components/toast/toast-manager.ts +0 -234
- package/src/components/toggle/Toggle.astro +0 -174
- package/src/components/toggle/ToggleTypes.ts +0 -14
- package/src/components/tooltip/Tooltip.astro +0 -422
- package/src/components/tooltip/TooltipContent.astro +0 -83
- package/src/components/tooltip/TooltipTrigger.astro +0 -13
- package/src/components/video/Video.astro +0 -121
- package/src/config/cookies.ts +0 -5
- package/src/config/links.ts +0 -4
- package/src/domain/cms/index.ts +0 -1
- package/src/domain/cms/types.ts +0 -20
- package/src/domain/i18n/constants.ts +0 -21
- package/src/domain/i18n/cookie-storage.ts +0 -13
- package/src/domain/i18n/country-to-locale-map.ts +0 -67
- package/src/domain/i18n/fallbacks.generated.ts +0 -230
- package/src/domain/i18n/fetcher.ts +0 -278
- package/src/domain/i18n/flags.ts +0 -16
- package/src/domain/i18n/format.ts +0 -90
- package/src/domain/i18n/index.ts +0 -10
- package/src/domain/i18n/middleware/i18n.ts +0 -161
- package/src/domain/i18n/resolve-locale.ts +0 -55
- package/src/domain/i18n/runtime-constants.ts +0 -14
- package/src/domain/i18n/schema.ts +0 -29
- package/src/domain/index.ts +0 -4
- package/src/domain/seo/constants.ts +0 -6
- package/src/domain/seo/index.ts +0 -3
- package/src/domain/seo/services/index.ts +0 -3
- package/src/domain/seo/services/llms.ts +0 -56
- package/src/domain/seo/services/robots.ts +0 -12
- package/src/domain/seo/services/sitemap.ts +0 -56
- package/src/domain/seo/utils.ts +0 -36
- package/src/domain/theme/constants.ts +0 -6
- package/src/domain/theme/index.ts +0 -2
- package/src/domain/theme/schema.ts +0 -10
- package/src/i18n.generated.d.ts +0 -202
- package/src/lib/component-preview.ts +0 -73
- package/src/lib/index.ts +0 -6
- package/src/lib/remark/remark-modified-time.ts +0 -13
- package/src/lib/showcase-preview-elements.ts +0 -408
- package/src/lib/showcase-renderer.ts +0 -218
- package/src/lib/showcase-utils.ts +0 -189
- package/src/lib/turnstile.ts +0 -35
- package/src/lib/utils/starwind/positioning.ts +0 -318
- package/src/locales/de/blog.json +0 -9
- package/src/locales/de/common.json +0 -19
- package/src/locales/de/errors.json +0 -6
- package/src/locales/de/home.json +0 -20
- package/src/locales/de/messages.json +0 -8
- package/src/locales/de/nav.json +0 -13
- package/src/locales/de/projects.json +0 -9
- package/src/locales/de/services.json +0 -43
- package/src/locales/en/blog.json +0 -9
- package/src/locales/en/chat.json +0 -29
- package/src/locales/en/common.json +0 -19
- package/src/locales/en/cookie_notice.json +0 -11
- package/src/locales/en/editor.json +0 -24
- package/src/locales/en/errors.json +0 -6
- package/src/locales/en/home.json +0 -20
- package/src/locales/en/messages.json +0 -8
- package/src/locales/en/nav.json +0 -13
- package/src/locales/en/projects.json +0 -9
- package/src/locales/en/services.json +0 -43
- package/src/locales/es/blog.json +0 -9
- package/src/locales/es/common.json +0 -19
- package/src/locales/es/errors.json +0 -6
- package/src/locales/es/home.json +0 -20
- package/src/locales/es/messages.json +0 -8
- package/src/locales/es/nav.json +0 -13
- package/src/locales/es/projects.json +0 -9
- package/src/locales/es/services.json +0 -43
- package/src/locales/ja/blog.json +0 -9
- package/src/locales/ja/common.json +0 -19
- package/src/locales/ja/errors.json +0 -6
- package/src/locales/ja/home.json +0 -20
- package/src/locales/ja/messages.json +0 -8
- package/src/locales/ja/nav.json +0 -13
- package/src/locales/ja/projects.json +0 -9
- package/src/locales/ja/services.json +0 -43
- package/src/locales/pt/blog.json +0 -9
- package/src/locales/pt/chat.json +0 -29
- package/src/locales/pt/common.json +0 -19
- package/src/locales/pt/cookie_notice.json +0 -11
- package/src/locales/pt/editor.json +0 -24
- package/src/locales/pt/errors.json +0 -6
- package/src/locales/pt/home.json +0 -20
- package/src/locales/pt/messages.json +0 -8
- package/src/locales/pt/nav.json +0 -13
- package/src/locales/pt/projects.json +0 -9
- package/src/locales/pt/services.json +0 -43
- package/src/utils/server/cookies.ts +0 -98
- package/src/utils/server/index.ts +0 -1
- package/src/utils/shared/deep-merge.ts +0 -36
- package/src/utils/shared/index.ts +0 -3
- package/src/utils/shared/parse-boolean.ts +0 -14
- /package/src/utils/{shared/embed.ts → embed.ts} +0 -0
package/i18n-data.json
DELETED
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"key": "danielmarchi.dev:blog:de",
|
|
4
|
-
"value": "{\"meta_title\":\"Blog | Daniel Marchi\",\"hero_title\":\"Blog\",\"hero_description\":\"Meine Einblicke auf meiner Reise als Entwickler.\",\"latest_article\":\"Neuester Artikel\",\"latest\":\"Neu\",\"read_article\":\"Artikel lesen\",\"all_posts\":\"Alle Beiträge\"}"
|
|
5
|
-
},
|
|
6
|
-
{
|
|
7
|
-
"key": "danielmarchi.dev:common:de",
|
|
8
|
-
"value": "{\"seo\":{\"title\":\"Zero-JS i18n Astro Starter für Cloudflare Workers\",\"description\":\"Erstellen Sie mehrsprachige Apps schneller ohne Hydrations-Ballast. Volle Integration mit Cloudflare Workers & KV, automatisierte TypeScript-Generierung und Edge-Caching out-of-the-box.\"},\"nav\":{\"home\":\"Astro-Komponenten & Islands\",\"blog\":\"Beispiele für i18n mit Markdown\",\"mobileButton\":\"Menü\"},\"footer\":{\"license\":\"Unter der MIT-Lizenz.\"},\"notFound\":{\"title\":\"404 — Seite nicht gefunden\",\"message\":\"Die gesuchte Seite existiert nicht oder wurde verschoben.\",\"backToHome\":\"Zurück zur Startseite\"}}"
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"key": "danielmarchi.dev:errors:de",
|
|
12
|
-
"value": "{\"404_title\":\"Seite nicht gefunden\",\"404_description\":\"Die gesuchte Seite existiert nicht.\",\"500_title\":\"Interner Serverfehler\",\"500_description\":\"Auf unserer Seite ist etwas schiefgelaufen. Bitte versuchen Sie es später noch einmal.\"}"
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"key": "danielmarchi.dev:home:de",
|
|
16
|
-
"value": "{\"meta_title\":\"Daniel Marchi | Webentwickler\",\"meta_description\":\"Ich bin ein auf Astro und Hochleistungs-Websites spezialisierter Webentwickler.\",\"hero_title\":\"Hallo, ich bin Daniel Marchi\",\"hero_description\":\"Ich bin ein auf Astro und Hochleistungs-Websites spezialisierter Webentwickler.\",\"hero_view_components\":\"Komponenten anzeigen\",\"hero_contact_me\":\"Kontakt aufnehmen\",\"stack_title\":\"Moderne Webentwicklung, moderner Stack\",\"stack_description\":\"Ich helfe Einzelpersonen und Unternehmen beim Aufbau von Hochleistungs-Webanwendungen, die auf Edge-Plattformen bereitgestellt werden. Von der Architektur bis zum Deployment sorge ich dafür, dass Ihr Projekt auf Skalierbarkeit ausgelegt ist.\",\"stack_view_services\":\"Dienstleistungen ansehen\",\"stack_resume\":\"Lebenslauf\",\"marquee_title\":\"Aufgebaut und bereitgestellt mit diesen erstaunlichen Technologien:\",\"projects_title\":\"Aktuelle Projekte\",\"projects_description\":\"Eine Auswahl meiner neuesten technischen Arbeiten und Open-Source-Projekte.\",\"projects_view_all\":\"Alle Projekte anzeigen\",\"cta_title\":\"Bereit, etwas Erstaunliches aufzubauen?\",\"cta_description\":\"Ich stehe derzeit für neue Projekte und Beratungen zur Verfügung. Lassen Sie uns zusammenarbeiten, um Ihre Vision zum Leben zu erwecken.\",\"cta_contact\":\"Kontakt aufnehmen\",\"cta_resume\":\"Lebenslauf herunterladen\"}"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"key": "danielmarchi.dev:messages:de",
|
|
20
|
-
"value": "{\"errors\":{\"ui\":{\"MISSING_TRANSLATED_UI\":\"Entschuldigung, diese Seite ist in der ausgewählten Sprache noch nicht vollständig verfügbar.\",\"MISSING_TRANSLATED_CONTENT\":\"Entschuldigung, dieser Artikel ist in der ausgewählten Sprache noch nicht verfügbar.\"}}}"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"key": "danielmarchi.dev:nav:de",
|
|
24
|
-
"value": "{\"home\":\"Startseite\",\"projects\":\"Projekte\",\"blog\":\"Blog\",\"about\":\"Über mich\",\"services\":\"Dienstleistungen\",\"resume\":\"Lebenslauf\",\"contact\":\"Kontakt\",\"components\":\"Komponenten\",\"privacy_policy\":\"Datenschutzerklärung\",\"terms_of_service\":\"Nutzungsbedingungen\",\"cookie_policy\":\"Cookie-Richtlinie\"}"
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"key": "danielmarchi.dev:projects:de",
|
|
28
|
-
"value": "{\"meta_title\":\"Projekte | Daniel Marchi\",\"hero_title\":\"Projekte\",\"hero_description\":\"Eine Auswahl meiner Arbeiten und Open-Source-Beiträge.\",\"latest\":\"Neuestes Projekt\",\"latest_badge\":\"Neu\",\"view_project\":\"Projekt ansehen\",\"all\":\"Alle Projekte\"}"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"key": "danielmarchi.dev:services:de",
|
|
32
|
-
"value": "{\"meta_title\":\"Dienstleistungen | Daniel Marchi\",\"hero_title\":\"Premium Dienstleistungen\",\"hero_description\":\"Ich biete hochwertige Entwicklungs- und Designdienstleistungen an, um Ihr Unternehmen wachsen zu lassen und sich in der digitalen Landschaft hervorzuheben.\",\"capabilities_title\":\"Fähigkeiten\",\"capabilities_description\":\"Eine Übersicht über die Kerndienstleistungen, die ich meinen Kunden anbiete.\",\"web_dev_title\":\"Webentwicklung\",\"web_dev_description\":\"Erstellung hochperformanter, barrierefreier und skalierbarer Webanwendungen mit modernen Technologien wie Astro, Vue und Nuxt.\",\"ui_ux_title\":\"UI/UX Design\",\"ui_ux_description\":\"Erstellung intuitiver und visuell beeindruckender Benutzeroberflächen mit Fokus auf Benutzererfahrung und Markenidentität.\",\"perf_title\":\"Leistungsoptimierung\",\"perf_description\":\"Audit und Optimierung Ihrer Website für Geschwindigkeit, SEO und Barrierefreiheit, um perfekte Lighthouse-Scores zu erzielen.\",\"perf_security_title\":\"Leistung und Sicherheit\",\"perf_security_description\":\"Ihre Benutzer verdienen ein schnelles und sicheres Erlebnis. Ich erstelle Websites, die sofort geladen werden und auf allen Geräten einwandfrei funktionieren.\",\"testimonials_title\":\"Was unsere Benutzer sagen\",\"testimonials_description\":\"Schließen Sie sich Tausenden von Entwicklern an, die mit Astronaut die nächste Generation des Webs aufbauen.\",\"faq_title\":\"Häufig gestellte Fragen (FAQ)\",\"faq_description\":\"Alles, was Sie über Astronaut wissen müssen und wie Sie damit erstaunliche Dinge bauen können.\",\"cta_title\":\"Bereit loszulegen?\",\"cta_description\":\"Lassen Sie uns an Ihrem nächsten großen Projekt zusammenarbeiten. Ich stehe derzeit für freiberufliche Tätigkeit und Beratung zur Verfügung.\",\"cta_contact\":\"Kontakt aufnehmen\",\"cta_portfolio\":\"Portfolio ansehen\",\"badge_ceo\":\"CEO\",\"badge_founder\":\"Gründer\",\"badge_cto\":\"CTO\",\"badge_senior_ui\":\"Senior UI Engineer\",\"badge_chef\":\"Chef\",\"badge_product_designer\":\"Product Designer\",\"testimonial_1\":\"Astronaut ist zweifellos das beste Boilerplate, das ich je verwendet habe. Die Geschwindigkeit und die saubere Architektur passen perfekt dazu, wie ich bauen möchte.\",\"testimonial_2\":\"Die Komponentenbibliothek und die Art und Weise, wie sie Tailwind 4 handhabt, ist ein Game Changer. Ich konnte mein Projekt in Rekordzeit starten.\",\"testimonial_3\":\"Endlich ein Boilerplate, das sich nicht überladen anfühlt, mir aber alle Werkzeuge gibt, die ich brauche. Der SSR-Support auf Cloudflare ist fehlerfrei.\",\"testimonial_4\":\"Der beste Ausgangspunkt für jedes moderne Webprojekt. Die Entwicklererfahrung ist Weltklasse und die Leistung ist unschlagbar.\",\"testimonial_5\":\"Unglaubliche Liebe zum Detail in der Struktur. Es folgt allen Best Practices, ohne unnötige Komplexität hinzuzufügen.\",\"testimonial_6\":\"Alles läuft so reibungslos! Übergänge, Komponenten, Logik - alles funktioniert einfach. Beste Entscheidung für mein neuestes Startup.\",\"faq_category_general\":\"Allgemeines\",\"faq_q1\":\"Was ist Astronaut?\",\"faq_a1\":\"Astronaut ist ein produktionsbereites Boilerplate für Astro, das auf Geschwindigkeit, Leistung und Best Practices ausgelegt ist. Es verwendet Tailwind CSS 4, Nuxt UI-Muster und eine saubere Architektur.\",\"faq_q2\":\"Wie fange ich an?\",\"faq_a2\":\"Sie können einfach das Repository klonen, Abhängigkeiten mit pnpm installieren und den Dev-Server starten. Die Projektstruktur ist Standard-Astro, also werden Sie sich wie zu Hause fühlen.\",\"faq_category_technical\":\"Technisches\",\"faq_q3\":\"Unterstützt es Server-Side Rendering (SSR)?\",\"faq_a3\":\"Ja, Astronaut unterstützt SSR vollständig und ist standardmäßig für den Cloudflare Workers voreingestellt, was Ihnen das Beste aus beiden Welten bietet: statische Geschwindigkeit und dynamische Leistung.\"}"
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"key": "danielmarchi.dev:blog:en",
|
|
36
|
-
"value": "{\"meta_title\":\"Blog | Daniel Marchi\",\"hero_title\":\"Blog\",\"hero_description\":\"My insights throughout my journey as a developer.\",\"latest_article\":\"Latest Article\",\"latest\":\"Latest\",\"read_article\":\"Read Article\",\"all_posts\":\"All Posts\"}"
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"key": "danielmarchi.dev:chat:en",
|
|
40
|
-
"value": "{\"title\":\"Join a Chat Room\",\"description\":\"Enter a room name to start chatting\",\"heading\":\"Real-time Chat\",\"intro\":\"Enter a room name below to join a conversation. Each room is a unique Durable Object instance!\",\"label\":\"Room Name\",\"placeholder\":\"e.g. general, help, coffee-break\",\"button\":\"Join Room\",\"room\":{\"title\":\"Chat Room\",\"connecting\":\"Connecting…\",\"connected\":\"Connected\",\"disconnected\":\"Disconnected\",\"placeholder\":\"Type a message…\",\"send\":\"Send\",\"system\":{\"joining\":\"Joining room…\",\"error\":\"Connection error\",\"joined\":\"joined the room\",\"left\":\"left the room\",\"reconnecting\":\"Reconnecting in {delay} seconds... (attempt {attempt}/{max})\",\"fail_reconnect\":\"Failed to reconnect. Please refresh the page.\",\"no_connect\":\"Cannot send message: not connected\",\"prompt_user\":\"Enter your username:\",\"you\":\"(You)\",\"online_users\":\"Online Users:\"}}}"
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"key": "danielmarchi.dev:common:en",
|
|
44
|
-
"value": "{\"seo\":{\"title\":\"Zero-JS i18n Astro Starter for Cloudflare Workers\",\"description\":\"Ship multilingual apps faster without hydration bloat. Full integration with Cloudflare Workers & KV, automated TypeScript generation, and edge caching out of the box.\"},\"nav\":{\"home\":\"Astro components & islands\",\"blog\":\"Markdown i18n examples\",\"mobileButton\":\"Menu\"},\"footer\":{\"license\":\"Under the MIT license.\"},\"notFound\":{\"title\":\"404 — Page not found\",\"message\":\"The page you are looking for does not exist or has been moved.\",\"backToHome\":\"Go back to homepage\"}}"
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
"key": "danielmarchi.dev:cookie_notice:en",
|
|
48
|
-
"value": "{\"title\":\"Cookie Policy\",\"description\":\"This website does not use cookies, this is a sample of how it could work in your website as per your\",\"privacy_policy\":\"Privacy Policy\",\"reject_all\":\"Reject All\",\"accept_all\":\"Accept All\",\"accepted_toast\":\"Cookies Accepted\",\"accepted_description\":\"You have accepted all cookies.\",\"rejected_toast\":\"Cookies Rejected\",\"rejected_description\":\"You have rejected all cookies.\"}"
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"key": "danielmarchi.dev:editor:en",
|
|
52
|
-
"value": "{\"title\":\"Editor\",\"description\":\"Collaborative real-time document editor\",\"collaborative_editor\":\"Collaborative Editor\",\"status\":{\"connecting\":\"Connecting…\",\"connected\":\"Connected\",\"disconnected\":\"Disconnected\"},\"history\":\"History\",\"version_history\":\"Version History\",\"no_versions\":\"No versions yet.\",\"placeholder\":\"Start typing… your changes are synced in real-time.\",\"word_count\":{\"word\":\"word\",\"words\":\"words\",\"character\":\"character\",\"characters\":\"characters\"},\"save\":{\"saved\":\"Saved\"},\"restore_confirm\":\"Restore this version? Current content will be replaced.\"}"
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"key": "danielmarchi.dev:errors:en",
|
|
56
|
-
"value": "{\"404_title\":\"Page Not Found\",\"404_description\":\"The page you are looking for does not exist.\",\"500_title\":\"Internal Server Error\",\"500_description\":\"Something went wrong on our end. Please try again later.\"}"
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"key": "danielmarchi.dev:home:en",
|
|
60
|
-
"value": "{\"meta_title\":\"Daniel Marchi | Web Developer\",\"meta_description\":\"I'm a web developer specialized in Astro and high-performance websites.\",\"hero_title\":\"Hey, I'm Daniel Marchi\",\"hero_description\":\"I'm a web developer specialized in Astro and high-performance websites.\",\"hero_view_components\":\"View Components\",\"hero_contact_me\":\"Contact Me\",\"stack_title\":\"Modern Web, Modern Stack\",\"stack_description\":\"I help individuals and companies build high-performance web applications deployed on the edge. From architecture to deployment, I ensure your project is built for scale.\",\"stack_view_services\":\"View Services\",\"stack_resume\":\"Resume\",\"marquee_title\":\"Built and deployed with these amazing technologies:\",\"projects_title\":\"Recent Projects\",\"projects_description\":\"A selection of my latest technical work and open source projects.\",\"projects_view_all\":\"View All Projects\",\"cta_title\":\"Ready to Build Something Amazing?\",\"cta_description\":\"I'm currently available for new projects and consulting. Let's work together to bring your vision to life.\",\"cta_contact\":\"Get in Touch\",\"cta_resume\":\"Download Resume\"}"
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"key": "danielmarchi.dev:messages:en",
|
|
64
|
-
"value": "{\"errors\":{\"ui\":{\"MISSING_TRANSLATED_UI\":\"Sorry, this page is not yet fully available in your selected language.\",\"MISSING_TRANSLATED_CONTENT\":\"Sorry, this article is not yet available in your selected language.\"}}}"
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
"key": "danielmarchi.dev:nav:en",
|
|
68
|
-
"value": "{\"home\":\"Home\",\"projects\":\"Projects\",\"blog\":\"Blog\",\"about\":\"About\",\"services\":\"Services\",\"resume\":\"Resume\",\"contact\":\"Contact\",\"components\":\"Components\",\"privacy_policy\":\"Privacy Policy\",\"terms_of_service\":\"Terms of Service\",\"cookie_policy\":\"Cookie Policy\"}"
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"key": "danielmarchi.dev:projects:en",
|
|
72
|
-
"value": "{\"meta_title\":\"Projects | Daniel Marchi\",\"hero_title\":\"Projects\",\"hero_description\":\"A showcase of my work and open source contributions.\",\"latest\":\"Latest Project\",\"latest_badge\":\"Latest\",\"view_project\":\"View Project\",\"all\":\"All Projects\"}"
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
"key": "danielmarchi.dev:services:en",
|
|
76
|
-
"value": "{\"meta_title\":\"Services | Daniel Marchi\",\"hero_title\":\"Premium Services\",\"hero_description\":\"I provide high-quality development and design services to help your business grow and stand out in the digital landscape.\",\"capabilities_title\":\"Capabilities\",\"capabilities_description\":\"An overview of the core services I provide to my clients.\",\"web_dev_title\":\"Web Development\",\"web_dev_description\":\"Crafting high-performance, accessible, and scalable web applications using modern technologies like Astro, Vue, and Nuxt.\",\"ui_ux_title\":\"UI/UX Design\",\"ui_ux_description\":\"Creating intuitive and visually stunning user interfaces focusing on user experience and brand identity.\",\"perf_title\":\"Performance Optimization\",\"perf_description\":\"Audit and optimize your website for speed, SEO, and accessibility to achieve perfect Lighthouse scores.\",\"perf_security_title\":\"Performance & Security\",\"perf_security_description\":\"Your users deserve a fast and secure experience. I build websites that load instantly and perform flawlessly across all devices.\",\"testimonials_title\":\"What Our Users Say\",\"testimonials_description\":\"Join thousands of developers building the next generation of the web with Astronaut.\",\"faq_title\":\"Frequently Asked Questions\",\"faq_description\":\"Everything you need to know about Astronaut and how to build amazing things with it.\",\"cta_title\":\"Ready to Start?\",\"cta_description\":\"Let's collaborate on your next big project. I'm currently available for freelance work and consulting.\",\"cta_contact\":\"Get in Touch\",\"cta_portfolio\":\"View Portfolio\",\"badge_ceo\":\"CEO\",\"badge_founder\":\"Founder\",\"badge_cto\":\"CTO\",\"badge_senior_ui\":\"Senior UI Engineer\",\"badge_chef\":\"Chef\",\"badge_product_designer\":\"Product Designer\",\"testimonial_1\":\"Astronaut is hands down the best boilerplate I've ever used. The speed and clean architecture matching perfectly with how I want to build.\",\"testimonial_2\":\"The component library and the way it handles Tailwind 4 is a game changer. I was able to launch my project in record time.\",\"testimonial_3\":\"Finally a boilerplate that doesn't feel bloated but gives me all the tools I need. The SSR support on Cloudflare is flawless.\",\"testimonial_4\":\"The best starting point for any modern web project. The developer experience is world-class and the performance is unbeatable.\",\"testimonial_5\":\"Incredible attention to detail in the structure. It follows all the best practices without adding unnecessary complexity.\",\"testimonial_6\":\"Everything is so smooth! Transitions, components, logic - it all just clicks. Best decision for my latest startup.\",\"faq_category_general\":\"General\",\"faq_q1\":\"What is Astronaut?\",\"faq_a1\":\"Astronaut is a production-ready boilerplate for Astro, designed with speed, performance, and best practices in mind. It uses Tailwind CSS 4, Nuxt UI patterns, and a clean architecture.\",\"faq_q2\":\"How do I get started?\",\"faq_a2\":\"You can simply clone the repository, install dependencies with pnpm, and run the dev server. The project structure is standard Astro, so you'll feel right at home.\",\"faq_category_technical\":\"Technical\",\"faq_q3\":\"Does it support Server-Side Rendering (SSR)?\",\"faq_a3\":\"Yes, Astronaut fully supports SSR and is configured for deployment on Cloudflare Workers by default, giving you the best of both worlds: static speed and dynamic power.\"}"
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
"key": "danielmarchi.dev:blog:es",
|
|
80
|
-
"value": "{\"meta_title\":\"Blog | Daniel Marchi\",\"hero_title\":\"Blog\",\"hero_description\":\"Mis reflexiones a lo largo de mi viaje como desarrollador.\",\"latest_article\":\"Último artículo\",\"latest\":\"Último\",\"read_article\":\"Leer artículo\",\"all_posts\":\"Todos los artículos\"}"
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
"key": "danielmarchi.dev:common:es",
|
|
84
|
-
"value": "{\"seo\":{\"title\":\"Zero-JS i18n Astro Starter para Cloudflare Workers\",\"description\":\"Lance aplicaciones multilingües más rápido sin el peso de la hidratación. Integración total con Cloudflare Workers & KV, generación TypeScript automatizada y caché en el edge configurado.\"},\"nav\":{\"home\":\"Componentes e islas de Astro\",\"blog\":\"Ejemplos de i18n con Markdown\",\"mobileButton\":\"Menú\"},\"footer\":{\"license\":\"Bajo la licencia MIT.\"},\"notFound\":{\"title\":\"404 — Página no encontrada\",\"message\":\"La página que buscas no existe o ha sido movida.\",\"backToHome\":\"Volver a la página de inicio\"}}"
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
"key": "danielmarchi.dev:errors:es",
|
|
88
|
-
"value": "{\"404_title\":\"Página no encontrada\",\"404_description\":\"La página que busca no existe.\",\"500_title\":\"Error interno del servidor\",\"500_description\":\"Algo salió mal de nuestro lado. Por favor, inténtelo de nuevo más tarde.\"}"
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
"key": "danielmarchi.dev:home:es",
|
|
92
|
-
"value": "{\"meta_title\":\"Daniel Marchi | Desarrollador Web\",\"meta_description\":\"Soy un desarrollador web especializado en Astro y sitios web de alto rendimiento.\",\"hero_title\":\"Hola, soy Daniel Marchi\",\"hero_description\":\"Soy un desarrollador web especializado en Astro y sitios web de alto rendimiento.\",\"hero_view_components\":\"Ver Componentes\",\"hero_contact_me\":\"Contáctame\",\"stack_title\":\"Web Moderna, Stack Moderno\",\"stack_description\":\"Ayudo a individuos y empresas a construir aplicaciones web de alto rendimiento desplegadas en el edge. Desde la arquitectura hasta el despliegue, me aseguro de que su proyecto esté construido para escalar.\",\"stack_view_services\":\"Ver Servicios\",\"stack_resume\":\"Currículum\",\"marquee_title\":\"Construido y desplegado con estas increíbles tecnologías:\",\"projects_title\":\"Proyectos Recientes\",\"projects_description\":\"Una selección de mis trabajos técnicos más recientes y proyectos de código abierto.\",\"projects_view_all\":\"Ver Todos los Proyectos\",\"cta_title\":\"¿Listo para Construir Algo Increíble?\",\"cta_description\":\"Actualmente estoy disponible para nuevos proyectos y consultoría. Trabajemos juntos para dar vida a su visión.\",\"cta_contact\":\"Ponerse en Contacto\",\"cta_resume\":\"Descargar Currículum\"}"
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
"key": "danielmarchi.dev:messages:es",
|
|
96
|
-
"value": "{\"errors\":{\"ui\":{\"MISSING_TRANSLATED_UI\":\"Lo sentimos, esta página aún no está totalmente disponible en el idioma seleccionado.\",\"MISSING_TRANSLATED_CONTENT\":\"Lo sentimos, este artículo aún no está disponible en el idioma seleccionado.\"}}}"
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
"key": "danielmarchi.dev:nav:es",
|
|
100
|
-
"value": "{\"home\":\"Inicio\",\"projects\":\"Proyectos\",\"blog\":\"Blog\",\"about\":\"Sobre mí\",\"services\":\"Servicios\",\"resume\":\"Currículum\",\"contact\":\"Contacto\",\"components\":\"Componentes\",\"privacy_policy\":\"Política de Privacidad\",\"terms_of_service\":\"Términos de Servicio\",\"cookie_policy\":\"Política de Cookies\"}"
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
"key": "danielmarchi.dev:projects:es",
|
|
104
|
-
"value": "{\"meta_title\":\"Proyectos | Daniel Marchi\",\"hero_title\":\"Proyectos\",\"hero_description\":\"Una muestra de mi trabajo y contribuciones de código abierto.\",\"latest\":\"Último proyecto\",\"latest_badge\":\"Último\",\"view_project\":\"Ver proyecto\",\"all\":\"Todos los proyectos\"}"
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
"key": "danielmarchi.dev:services:es",
|
|
108
|
-
"value": "{\"meta_title\":\"Servicios | Daniel Marchi\",\"hero_title\":\"Servicios Premium\",\"hero_description\":\"Proporciono servicios de desarrollo y diseño de alta calidad para ayudar a que su negocio crezca y se destaque en el panorama digital.\",\"capabilities_title\":\"Capacidades\",\"capabilities_description\":\"Una visión general de los servicios principales que ofrezco a mis clientes.\",\"web_dev_title\":\"Desarrollo Web\",\"web_dev_description\":\"Creación de aplicaciones web de alto rendimiento, accesibles y escalables utilizando tecnologías modernas como Astro, Vue y Nuxt.\",\"ui_ux_title\":\"Diseño UI/UX\",\"ui_ux_description\":\"Creación de interfaces de usuario intuitivas y visualmente impresionantes enfocándose en la experiencia del usuario y la identidad de la marca.\",\"perf_title\":\"Optimización del Rendimiento\",\"perf_description\":\"Auditoría y optimización de su sitio web para velocidad, SEO y accesibilidad para lograr puntuaciones perfectas en Lighthouse.\",\"perf_security_title\":\"Rendimiento y Seguridad\",\"perf_security_description\":\"Sus usuarios merecen una experiencia rápida y segura. Construyo sitios web que se cargan instantáneamente y funcionan perfectamente en todos los dispositivos.\",\"testimonials_title\":\"Lo Que Dicen Nuestros Usuarios\",\"testimonials_description\":\"Únase a miles de desarrolladores que construyen la próxima generación de la web con Astronaut.\",\"faq_title\":\"Preguntas Frecuentes (FAQ)\",\"faq_description\":\"Todo lo que necesita saber sobre Astronaut y cómo construir cosas increíbles con él.\",\"cta_title\":\"¿Listo para Comenzar?\",\"cta_description\":\"Colaboremos en su próximo gran proyecto. Actualmente estoy disponible para trabajos independientes y consultoría.\",\"cta_contact\":\"Ponerse en Contacto\",\"cta_portfolio\":\"Ver Portafolio\",\"badge_ceo\":\"CEO\",\"badge_founder\":\"Fundador\",\"badge_cto\":\"CTO\",\"badge_senior_ui\":\"Ingeniero UI Sénior\",\"badge_chef\":\"Chef\",\"badge_product_designer\":\"Diseñador de Producto\",\"testimonial_1\":\"Astronaut es sin duda el mejor boilerplate que he usado. La velocidad y la arquitectura limpia encajan perfectamente con cómo quiero construir.\",\"testimonial_2\":\"La biblioteca de componentes y la forma en que maneja Tailwind 4 es un cambio de juego. Pude lanzar mi proyecto en un tiempo récord.\",\"testimonial_3\":\"Finalmente, un boilerplate que no se siente inflado pero que me brinda todas las herramientas que necesito. El soporte de SSR en Cloudflare es impecable.\",\"testimonial_4\":\"El mejor punto de partida para cualquier proyecto web moderno. La experiencia del desarrollador es de clase mundial y el rendimiento es insuperable.\",\"testimonial_5\":\"Increíble atención al detalle en la estructura. Sigue todas las mejores prácticas sin agregar complejidad innecesaria.\",\"testimonial_6\":\"¡Todo es tan fluido! Transiciones, componentes, lógica: todo simplemente funciona. La mejor decisión para nuestra última startup.\",\"faq_category_general\":\"General\",\"faq_q1\":\"¿Qué es Astronaut?\",\"faq_a1\":\"Astronaut es un boilerplate listo para producción para Astro, diseñado con la velocidad, el rendimiento y las mejores prácticas en mente. Utiliza Tailwind CSS 4, patrones de Nuxt UI y una arquitectura limpia.\",\"faq_q2\":\"¿Cómo empiezo?\",\"faq_a2\":\"Simplemente puede clonar el repositorio, instalar las dependências con pnpm y arrancar el servidor dev. La estructura del proyecto es estándar de Astro, así que se sentirá como en casa.\",\"faq_category_technical\":\"Técnico\",\"faq_q3\":\"¿Admite Renderizado en el Lado del Servidor (SSR)?\",\"faq_a3\":\"Sí, Astronaut admite totalmente SSR y está configurado para despliegue en Cloudflare Workers por defecto, ofreciéndole lo mejor de ambos mundos: velocidad de estático y potencia de dinâmico.\"}"
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"key": "danielmarchi.dev:blog:ja",
|
|
112
|
-
"value": "{\"meta_title\":\"ブログ | Daniel Marchi\",\"hero_title\":\"ブログ\",\"hero_description\":\"デベロッパーとしての歩みの中での気づきなどを発信しています。\",\"latest_article\":\"最新の記事\",\"latest\":\"最新\",\"read_article\":\"記事を読む\",\"all_posts\":\"すべての記事\"}"
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
"key": "danielmarchi.dev:common:ja",
|
|
116
|
-
"value": "{\"seo\":{\"title\":\"Cloudflare Workers 用 Zero-JS i18n Astro スターター\",\"description\":\"ハイドレーションの肥大化なしで、多言語アプリをより速く提供します。Cloudflare Workers & KV との完全な統合、自動化された TypeScript 生成、およびエッジキャッシングを標準装備しています。\"},\"nav\":{\"home\":\"Astro コンポーネント & アイランド\",\"blog\":\"Markdown による i18n の例\",\"mobileButton\":\"メニュー\"},\"footer\":{\"license\":\"MIT ライセンスの下で提供されています。\"},\"notFound\":{\"title\":\"404 — ページが見つかりません\",\"message\":\"お探しのページは存在しないか、移動されました。\",\"backToHome\":\"ホームページに戻る\"}}"
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
"key": "danielmarchi.dev:errors:ja",
|
|
120
|
-
"value": "{\"404_title\":\"ページが見つかりません\",\"404_description\":\"お探しのページは存在しません。\",\"500_title\":\"内部サーバーエラー\",\"500_description\":\"サーバー側で問題が発生しました。しばらくしてからもう一度お試しください。\"}"
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
"key": "danielmarchi.dev:home:ja",
|
|
124
|
-
"value": "{\"meta_title\":\"Daniel Marchi | Web Developer\",\"meta_description\":\"私はAstroとハイパフォーマンスなウェブサイトを専門とするウェブデベロッパーです。\",\"hero_title\":\"こんにちは、ダニエル・マルキです\",\"hero_description\":\"私はAstroとハイパフォーマンスなウェブサイトを専門とするウェブデベロッパーです。\",\"hero_view_components\":\"コンポーネントを表示\",\"hero_contact_me\":\"お問い合わせ\",\"stack_title\":\"モダンウェブ、モダンスタック\",\"stack_description\":\"エッジにデプロイされたハイパフォーマンスなウェブアプリケーションの構築を、個人および企業向けにサポートしています。アーキテクチャからデプロイまで、プロジェクトがスケールするように構築します。\",\"stack_view_services\":\"サービスを表示\",\"stack_resume\":\"履歴書\",\"marquee_title\":\"これらの素晴らしいテクノロジーで構築・デプロイされています:\",\"projects_title\":\"最近のプロジェクト\",\"projects_description\":\"最新の技術的な仕事とオープンソースプロジェクトのセレクション。\",\"projects_view_all\":\"すべてのプロジェクトを表示\",\"cta_title\":\"素晴らしいものを一緒に作りませんか?\",\"cta_description\":\"現在、新しいプロジェクトやコンサルティングを受け付けています。あなたのビジョンを形にするために一緒に働きましょう。\",\"cta_contact\":\"連絡を取る\",\"cta_resume\":\"履歴書をダウンロード\"}"
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
"key": "danielmarchi.dev:messages:ja",
|
|
128
|
-
"value": "{\"errors\":{\"ui\":{\"MISSING_TRANSLATED_UI\":\"申し訳ありませんが、このページは選択された言語でまだ完全に利用可能ではありません。\",\"MISSING_TRANSLATED_CONTENT\":\"申し訳ありませんが、この記事は選択された言語でまだ利用可能ではありません。\"}}}"
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
"key": "danielmarchi.dev:nav:ja",
|
|
132
|
-
"value": "{\"home\":\"ホーム\",\"projects\":\"プロジェクト\",\"blog\":\"ブログ\",\"about\":\"私について\",\"services\":\"サービス\",\"resume\":\"履歴書\",\"contact\":\"お問い合わせ\",\"components\":\"コンポーネント\",\"privacy_policy\":\"プライバシーポリシー\",\"terms_of_service\":\"利用規約\",\"cookie_policy\":\"クッキーポリシー\"}"
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
"key": "danielmarchi.dev:projects:ja",
|
|
136
|
-
"value": "{\"meta_title\":\"プロジェクト | Daniel Marchi\",\"hero_title\":\"プロジェクト\",\"hero_description\":\"私の仕事とオープンソースの貢献事例を展示します。\",\"latest\":\"最新のプロジェクト\",\"latest_badge\":\"最新\",\"view_project\":\"プロジェクトを見る\",\"all\":\"すべてのプロジェクト\"}"
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
"key": "danielmarchi.dev:services:ja",
|
|
140
|
-
"value": "{\"meta_title\":\"サービス | ダニエル・マルキ\",\"hero_title\":\"プレミアムサービス\",\"hero_description\":\"ビジネスの成長を支援し、デジタル環境で際立つ高品質な開発・デザインサービスを提供します。\",\"capabilities_title\":\"主要サービス\",\"capabilities_description\":\"クライアントに提供している主要なサービスの概要です。\",\"web_dev_title\":\"ウェブ開発\",\"web_dev_description\":\"Astro、Vue、Nuxt などの最新技術を活用し、高パフォーマンスでアクセシブル、拡張性のあるウェブアプリケーションを構築します。\",\"ui_ux_title\":\"UI/UX デザイン\",\"ui_ux_description\":\"ユーザーエクスペリエンスとブランドアイデンティティに焦点を当て、直感的で視覚的に美しいユーザーインターフェースを作成します。\",\"perf_title\":\"パフォーマンス最適化\",\"perf_description\":\"速度、SEO、アクセシビリティについてウェブサイトを監査および最適化し、完璧な Lighthouse スコアを目指します。\",\"perf_security_title\":\"パフォーマンスとセキュリティ\",\"perf_security_description\":\"ユーザーは高速で安全な体験を受ける権利があります。瞬時に読み込み、すべてのデバイスで完璧に動作するウェブサイトを構築します。\",\"testimonials_title\":\"ユーザーの声\",\"testimonials_description\":\"Astronaut を使って次世代のウェブを構築している何千人もの開発者の仲間入りをしましょう。\",\"faq_title\":\"よくある質問\",\"faq_description\":\"Astronaut について、およびそれを使って素晴らしいものを構築する方法について知っておくべきすべてのこと。\",\"cta_title\":\"始める準備はできましたか?\",\"cta_description\":\"次の大きなプロジェクトで協力しましょう。現在、フリーランスの仕事やコンサルティングを受け付けています。\",\"cta_contact\":\"お問い合わせ\",\"cta_portfolio\":\"ポートフォリオを見る\",\"badge_ceo\":\"CEO\",\"badge_founder\":\"創設者\",\"badge_cto\":\"CTO\",\"badge_senior_ui\":\"シニア UI エンジニア\",\"badge_chef\":\"シェフ\",\"badge_product_designer\":\"プロダクトデザイナー\",\"testimonial_1\":\"Astronaut は間違いなく私がこれまで使った中で最高のボイラープレートです。速度とクリーンなアーキテクチャが、私の構築したい方法と完璧にマッチしています。\",\"testimonial_2\":\"コンポーネントライブラリと Tailwind 4 の扱い方は革新的です。記録的な速さでプロジェクトを立ち上げることができました。\",\"testimonial_3\":\"ついに、肥大化せず、必要なツールをすべて提供してくれるボイラープレートに出会えました。Cloudflare 上での SSR サポートは完璧です。\",\"testimonial_4\":\"あらゆるモダンなウェブプロジェクトにとって最高の出発点です。開発者体験はワールドクラスで、パフォーマンスは他に類を見ません。\",\"testimonial_5\":\"構造への細部へのこだわりが素晴らしいです。不必要な複雑さを加えることなく、すべてのベストプラクティスに従っています。\",\"testimonial_6\":\"すべてがとてもスムーズです!トランジション、コンポーネント、ロジック - すべてがうまく噛み合っています。最新のスタートアップにとって最良の決断でした。\",\"faq_category_general\":\"全般\",\"faq_q1\":\"Astronaut とは何ですか?\",\"faq_a1\":\"Astronaut は、速度、パフォーマンス、ベストプラクティスを念頭に置いて設計された、Astro 用のプロダクション対応ボイラープレートです。Tailwind CSS 4、Nuxt UI パターン、クリーンなアーキテクチャを使用しています。\",\"faq_q2\":\"どのように始めればよいですか?\",\"faq_a2\":\"リポジトリをクローンし、pnpm で依存関係をインストールして、開発サーバーを実行するだけです。プロジェクト構造は標準的な Astro なので、すぐに慣れることができます。\",\"faq_category_technical\":\"技術\",\"faq_q3\":\"サーバーサイドレンダリング (SSR) をサポートしていますか?\",\"faq_a3\":\"はい、Astronaut は SSR を完全にサポートしており、デフォルトで Cloudflare Workers へのデプロイ用に構成されています。静的な速度と動的なパワーの両方の利点を提供します。\"}"
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
"key": "danielmarchi.dev:blog:pt",
|
|
144
|
-
"value": "{\"meta_title\":\"Blog | Daniel Marchi\",\"hero_title\":\"Blog\",\"hero_description\":\"Minhas reflexões ao longo da minha jornada como desenvolvedor.\",\"latest_article\":\"Artigo Mais Recente\",\"latest\":\"Último\",\"read_article\":\"Ler Artigo\",\"all_posts\":\"Todos os Artigos\"}"
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
"key": "danielmarchi.dev:chat:pt",
|
|
148
|
-
"value": "{\"title\":\"Entrar em uma Sala de Chat\",\"description\":\"Entre em uma sala para começar a conversar\",\"heading\":\"Chat em Tempo Real\",\"intro\":\"Entre em um nome de sala abaixo para participar de uma conversa. Cada sala é uma instância única de Durable Object!\",\"label\":\"Nome da Sala\",\"placeholder\":\"ex: geral, ajuda, cafe\",\"button\":\"Entrar na Sala\",\"room\":{\"title\":\"Sala de Chat\",\"connecting\":\"Conectando…\",\"connected\":\"Conectado\",\"disconnected\":\"Desconectado\",\"placeholder\":\"Digite uma mensagem…\",\"send\":\"Enviar\",\"system\":{\"joining\":\"Entrando na sala…\",\"error\":\"Erro de conexão\",\"joined\":\"entrou na sala\",\"left\":\"saiu da sala\",\"reconnecting\":\"Reconectando em {delay} segundos... (tentativa {attempt}/{max})\",\"fail_reconnect\":\"Falha ao reconectar. Por favor, atualize a página.\",\"no_connect\":\"Não é possível enviar mensagem: não conectado\",\"prompt_user\":\"Digite seu nome de usuário:\",\"you\":\"(Você)\",\"online_users\":\"Usuários Online:\"}}}"
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
"key": "danielmarchi.dev:common:pt",
|
|
152
|
-
"value": "{\"seo\":{\"title\":\"Zero-JS i18n Astro Starter para Cloudflare Workers\",\"description\":\"Lance apps multilíngues mais rápido sem o peso da hidratação. Integração total com Cloudflare Workers & KV, geração TypeScript automatizada e cache no edge configurado.\"},\"nav\":{\"home\":\"Componentes & islands do Astro\",\"blog\":\"Exemplos de i18n com Markdown\",\"mobileButton\":\"Menu\"},\"footer\":{\"license\":\"Sob a licença MIT.\"},\"notFound\":{\"title\":\"404 — Página não encontrada\",\"message\":\"A página que você procura não existe ou foi movida.\",\"backToHome\":\"Voltar para a página inicial\"}}"
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
"key": "danielmarchi.dev:cookie_notice:pt",
|
|
156
|
-
"value": "{\"title\":\"Política de Cookies\",\"description\":\"Este site não utiliza cookies, isto é um exemplo de como poderia funcionar no seu site de acordo com a sua\",\"privacy_policy\":\"Política de Privacidade\",\"reject_all\":\"Rejeitar Tudo\",\"accept_all\":\"Aceitar Tudo\",\"accepted_toast\":\"Cookies Aceitos\",\"accepted_description\":\"Você aceitou todos os cookies.\",\"rejected_toast\":\"Cookies Rejeitados\",\"rejected_description\":\"Você rejeitou todos os cookies.\"}"
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
"key": "danielmarchi.dev:editor:pt",
|
|
160
|
-
"value": "{\"title\":\"Editor\",\"description\":\"Editor de documentos colaborativo em tempo real\",\"collaborative_editor\":\"Editor Colaborativo\",\"status\":{\"connecting\":\"Conectando…\",\"connected\":\"Conectado\",\"disconnected\":\"Desconectado\"},\"history\":\"Histórico\",\"version_history\":\"Histórico de Versões\",\"no_versions\":\"Nenhuma versão ainda.\",\"placeholder\":\"Comece a digitar... suas mudanças são sincronizadas em tempo real.\",\"word_count\":{\"word\":\"palavra\",\"words\":\"palavras\",\"character\":\"caractere\",\"characters\":\"caracteres\"},\"save\":{\"saved\":\"Salvo\"},\"restore_confirm\":\"Restaurar esta versão? O conteúdo atual será substituído.\"}"
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
"key": "danielmarchi.dev:errors:pt",
|
|
164
|
-
"value": "{\"404_title\":\"Página Não Encontrada\",\"404_description\":\"A página que você está procurando não existe.\",\"500_title\":\"Erro Interno do Servidor\",\"500_description\":\"Algo deu errado do nosso lado. Por favor, tente novamente mais tarde.\"}"
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
"key": "danielmarchi.dev:home:pt",
|
|
168
|
-
"value": "{\"meta_title\":\"Daniel Marchi | Desenvolvedor Web\",\"meta_description\":\"Sou um desenvolvedor web especializado em Astro e websites de alta performance.\",\"hero_title\":\"Olá, eu sou Daniel Marchi\",\"hero_description\":\"Sou um desenvolvedor web especializado em Astro e websites de alta performance.\",\"hero_view_components\":\"Ver Componentes\",\"hero_contact_me\":\"Fale Comigo\",\"stack_title\":\"Web Moderna, Stack Moderna\",\"stack_description\":\"Ajudo indivíduos e empresas a construir aplicações web de alta performance distribuídas no edge. Da arquitetura ao deployment, garanto que o seu projeto seja construído para escala.\",\"stack_view_services\":\"Ver Serviços\",\"stack_resume\":\"Currículo\",\"marquee_title\":\"Construído e implementado com estas tecnologias incríveis:\",\"projects_title\":\"Projetos Recentes\",\"projects_description\":\"Uma seleção dos meus trabalhos técnicos mais recentes e projetos de código aberto.\",\"projects_view_all\":\"Ver Todos os Projetos\",\"cta_title\":\"Pronto para Construir Algo Incrível?\",\"cta_description\":\"Estou disponível para novos projetos e consultoria. Vamos trabalhar juntos para dar vida à sua visão.\",\"cta_contact\":\"Entre em Contato\",\"cta_resume\":\"Baixar Currículo\"}"
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
"key": "danielmarchi.dev:messages:pt",
|
|
172
|
-
"value": "{\"errors\":{\"ui\":{\"MISSING_TRANSLATED_UI\":\"Desculpe, esta página ainda não está totalmente disponível no idioma selecionado.\",\"MISSING_TRANSLATED_CONTENT\":\"Desculpe, este artigo ainda não está disponível no idioma selecionado.\"}}}"
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
"key": "danielmarchi.dev:nav:pt",
|
|
176
|
-
"value": "{\"home\":\"Início\",\"projects\":\"Projetos\",\"blog\":\"Blog\",\"about\":\"Sobre\",\"services\":\"Serviços\",\"resume\":\"Currículo\",\"contact\":\"Contato\",\"components\":\"Componentes\",\"privacy_policy\":\"Política de Privacidade\",\"terms_of_service\":\"Termos de Serviço\",\"cookie_policy\":\"Política de Cookies\"}"
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
"key": "danielmarchi.dev:projects:pt",
|
|
180
|
-
"value": "{\"meta_title\":\"Projetos | Daniel Marchi\",\"hero_title\":\"Projetos\",\"hero_description\":\"Uma vitrine do meu trabalho e contribuições de código aberto.\",\"latest\":\"Projeto Mais Recente\",\"latest_badge\":\"Último\",\"view_project\":\"Ver Projeto\",\"all\":\"Todos os Projetos\"}"
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
"key": "danielmarchi.dev:services:pt",
|
|
184
|
-
"value": "{\"meta_title\":\"Serviços | Daniel Marchi\",\"hero_title\":\"Serviços Premium\",\"hero_description\":\"Eu forneço serviços de desenvolvimento e design de alta qualidade para ajudar o seu negócio a crescer e se destacar no cenário digital.\",\"capabilities_title\":\"Capacidades\",\"capabilities_description\":\"Uma visão geral dos principais serviços que ofereço aos meus clientes.\",\"web_dev_title\":\"Desenvolvimento Web\",\"web_dev_description\":\"Criando aplicações web de alta performance, acessíveis e escaláveis usando tecnologias modernas como Astro, Vue e Nuxt.\",\"ui_ux_title\":\"Design UI/UX\",\"ui_ux_description\":\"Criando interfaces de usuário intuitivas e visualmente deslumbrantes, focando na experiência do usuário e na identidade da marca.\",\"perf_title\":\"Otimização de Performance\",\"perf_description\":\"Auditando e otimizando o seu site para velocidade, SEO e acessibilidade para alcançar pontuações perfeitas no Lighthouse.\",\"perf_security_title\":\"Performance e Segurança\",\"perf_security_description\":\"Seus usuários merecem uma experiência rápida e segura. Eu construo sites que carregam instantaneamente e funcionam perfeitamente em todos os dispositivos.\",\"testimonials_title\":\"O que Nossos Usuários Dizem\",\"testimonials_description\":\"Junte-se a milhares de desenvolvedores construindo a próxima geração da web com Astronaut.\",\"faq_title\":\"Perguntas Frequentes\",\"faq_description\":\"Tudo o que você precisa saber sobre o Astronaut e como construir coisas incríveis com ele.\",\"cta_title\":\"Pronto para Começar?\",\"cta_description\":\"Vamos colaborar no seu próximo grande projeto. Estou atualmente disponível para trabalho freelance e consultoria.\",\"cta_contact\":\"Entre em Contato\",\"cta_portfolio\":\"Ver Portfólio\",\"badge_ceo\":\"CEO\",\"badge_founder\":\"Fundador\",\"badge_cto\":\"CTO\",\"badge_senior_ui\":\"Engenheiro UI Sênior\",\"badge_chef\":\"Chef\",\"badge_product_designer\":\"Product Designer\",\"testimonial_1\":\"O Astronaut é, sem dúvida, o melhor boilerplate que já usei. A velocidade e a arquitetura limpa combinam perfeitamente com o modo como quero construir.\",\"testimonial_2\":\"A biblioteca de componentes e o modo como ela lida com o Tailwind 4 é um divisor de águas. Consegui lançar meu projeto em tempo recorde.\",\"testimonial_3\":\"Finalmente um boilerplate que não parece inchado, mas me dá todas as ferramentas de que preciso. O suporte SSR no Cloudflare é impecável.\",\"testimonial_4\":\"O melhor ponto de partida para qualquer projeto web moderno. A experiência do desenvolvedor é de classe mundial e a performance é imbatível.\",\"testimonial_5\":\"Atenção incrível aos detalhes na estrutura. Segue todas as melhores práticas sem adicionar complexidade desnecessária.\",\"testimonial_6\":\"Tudo é tão suave! Transições, componentes, lógica - tudo simplesmente funciona. Melhor decisão para minha startup mais recente.\",\"faq_category_general\":\"Geral\",\"faq_q1\":\"O que é o Astronaut?\",\"faq_a1\":\"O Astronaut é um boilerplate pronto para produção para o Astro, projetado com foco em velocidade, performance e melhores práticas. Ele usa Tailwind CSS 4, padrões Nuxt UI e uma arquitetura limpa.\",\"faq_q2\":\"Como eu começo?\",\"faq_a2\":\"Você pode simplesmente clonar o repositório, instalar as dependências com pnpm e rodar o servidor de desenvolvimento. A estrutura do projeto é o padrão do Astro, então você se sentirá em casa.\",\"faq_category_technical\":\"Técnico\",\"faq_q3\":\"Ele suporta Server-Side Rendering (SSR)?\",\"faq_a3\":\"Sim, o Astronaut suporta totalmente SSR e está configurado para implementação no Cloudflare Workers por padrão, oferecendo o melhor dos dois mundos: velocidade de estático e poder de dinâmico.\"}"
|
|
185
|
-
}
|
|
186
|
-
]
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { checkMissingTranslation } from '../domain/i18n/resolve-locale'
|
|
3
|
-
import { fetchTranslations } from '../domain/i18n/fetcher'
|
|
4
|
-
|
|
5
|
-
export interface MissingTranslationBannerProps {}
|
|
6
|
-
type Props = MissingTranslationBannerProps;
|
|
7
|
-
|
|
8
|
-
const missingType = checkMissingTranslation(
|
|
9
|
-
Astro.locals.uiLocale,
|
|
10
|
-
Astro.locals.isMissingContent
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
let bannerText: string | null = null
|
|
14
|
-
|
|
15
|
-
if (missingType) {
|
|
16
|
-
const { cfContext, translationLocale } = Astro.locals
|
|
17
|
-
const runtime = { cf: Astro.request.cf, cfContext }
|
|
18
|
-
const { messages } = await fetchTranslations(
|
|
19
|
-
runtime,
|
|
20
|
-
translationLocale,
|
|
21
|
-
['messages']
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
bannerText =
|
|
25
|
-
missingType === 'content'
|
|
26
|
-
? messages.errors.ui.MISSING_TRANSLATED_CONTENT ||
|
|
27
|
-
'Sorry, this article is not yet available in your selected language.'
|
|
28
|
-
: messages.errors.ui.MISSING_TRANSLATED_UI ||
|
|
29
|
-
'Sorry, this page is not yet fully available in your selected language.'
|
|
30
|
-
}
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
{
|
|
34
|
-
bannerText && (
|
|
35
|
-
<div class='rounded px-4 py-2 mb-8 max-w-160 mx-auto border border-amber-300 bg-amber-50 text-amber-900 dark:border-amber-600 dark:bg-amber-900/20 dark:text-amber-600 text-center'>
|
|
36
|
-
{bannerText}
|
|
37
|
-
</div>
|
|
38
|
-
)
|
|
39
|
-
}
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import type { HTMLAttributes } from "astro/types";
|
|
3
|
-
import { cv } from "css-variants";
|
|
4
|
-
|
|
5
|
-
export interface AccordionProps extends HTMLAttributes<"div"> {
|
|
6
|
-
/**
|
|
7
|
-
* The type of accordion. If "single", only one item can be open at a time.
|
|
8
|
-
*/
|
|
9
|
-
type?: "single" | "multiple";
|
|
10
|
-
/**
|
|
11
|
-
* The value of the item that should be open by default
|
|
12
|
-
*/
|
|
13
|
-
defaultValue?: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
type Props = AccordionProps;
|
|
17
|
-
|
|
18
|
-
export const accordion = cv({ base: "starwind-accordion" });
|
|
19
|
-
|
|
20
|
-
const { type = "single", defaultValue, class: className, ...rest } = Astro.props;
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
<div
|
|
24
|
-
class:list={[accordion(), className]}
|
|
25
|
-
data-type={type}
|
|
26
|
-
data-value={defaultValue}
|
|
27
|
-
{...rest}
|
|
28
|
-
data-slot="accordion"
|
|
29
|
-
>
|
|
30
|
-
<slot />
|
|
31
|
-
</div>
|
|
32
|
-
|
|
33
|
-
<script>
|
|
34
|
-
type AccordionType = "single" | "multiple";
|
|
35
|
-
type AccordionState = "open" | "closed";
|
|
36
|
-
|
|
37
|
-
/** Represents a single accordion item with its associated elements */
|
|
38
|
-
interface AccordionItem {
|
|
39
|
-
element: HTMLElement;
|
|
40
|
-
trigger: HTMLElement;
|
|
41
|
-
content: HTMLElement;
|
|
42
|
-
value: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Handles the functionality of an accordion component.
|
|
47
|
-
* Supports single and multiple open items, keyboard navigation,
|
|
48
|
-
* and maintains ARIA accessibility standards.
|
|
49
|
-
*/
|
|
50
|
-
class AccordionHandler {
|
|
51
|
-
private accordion: HTMLElement;
|
|
52
|
-
private type: AccordionType;
|
|
53
|
-
private items: AccordionItem[];
|
|
54
|
-
private itemsByValue: Map<string, AccordionItem>;
|
|
55
|
-
private accordionId: string;
|
|
56
|
-
private isInitialized: boolean = false;
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Creates a new AccordionHandler instance
|
|
60
|
-
* @param accordion - The root accordion element
|
|
61
|
-
* @param idx - Unique index for this accordion instance
|
|
62
|
-
*/
|
|
63
|
-
constructor(accordion: HTMLElement, idx: number) {
|
|
64
|
-
this.accordion = accordion;
|
|
65
|
-
this.type = (accordion.dataset.type || "single") as AccordionType;
|
|
66
|
-
this.accordionId = `starwind-accordion${idx}`;
|
|
67
|
-
|
|
68
|
-
// Cache all items and create lookup maps
|
|
69
|
-
this.items = this.initializeItems();
|
|
70
|
-
this.itemsByValue = new Map(this.items.map((item) => [item.value, item]));
|
|
71
|
-
|
|
72
|
-
this.setupItems();
|
|
73
|
-
this.setInitialState();
|
|
74
|
-
this.isInitialized = true;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Initializes accordion items by querying the DOM and setting up data structures
|
|
79
|
-
* @returns Array of AccordionItem objects
|
|
80
|
-
*/
|
|
81
|
-
private initializeItems(): AccordionItem[] {
|
|
82
|
-
return Array.from(this.accordion.querySelectorAll<HTMLElement>(".starwind-accordion-item"))
|
|
83
|
-
.map((element, idx) => {
|
|
84
|
-
const trigger = element.querySelector<HTMLElement>(".starwind-accordion-trigger");
|
|
85
|
-
const content = element.querySelector<HTMLElement>(".starwind-accordion-content");
|
|
86
|
-
const value = element.getAttribute("data-value") || String(idx);
|
|
87
|
-
|
|
88
|
-
if (!trigger || !content) return null;
|
|
89
|
-
|
|
90
|
-
return { element, trigger, content, value };
|
|
91
|
-
})
|
|
92
|
-
.filter((item): item is AccordionItem => item !== null);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Sets up initial state and event listeners for all accordion items
|
|
97
|
-
*/
|
|
98
|
-
private setupItems(): void {
|
|
99
|
-
this.items.forEach((item, idx) => {
|
|
100
|
-
this.setupAccessibility(item, idx);
|
|
101
|
-
this.setContentHeight(item.content);
|
|
102
|
-
this.setupEventListeners(item);
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Sets up ARIA attributes and IDs for accessibility
|
|
108
|
-
* @param item - The accordion item to setup
|
|
109
|
-
* @param idx - Index of the item
|
|
110
|
-
*/
|
|
111
|
-
private setupAccessibility(item: AccordionItem, idx: number): void {
|
|
112
|
-
const triggerId = `${this.accordionId}-t${idx}`;
|
|
113
|
-
const contentId = `${this.accordionId}-c${idx}`;
|
|
114
|
-
|
|
115
|
-
item.trigger.id = triggerId;
|
|
116
|
-
item.trigger.setAttribute("aria-controls", contentId);
|
|
117
|
-
item.trigger.setAttribute("aria-expanded", "false");
|
|
118
|
-
|
|
119
|
-
item.content.id = contentId;
|
|
120
|
-
item.content.setAttribute("aria-labelledby", triggerId);
|
|
121
|
-
item.content.setAttribute("role", "region");
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Calculates and sets the content height CSS variable for animations
|
|
126
|
-
* @param content - The content element to measure
|
|
127
|
-
*/
|
|
128
|
-
private setContentHeight(content: HTMLElement): void {
|
|
129
|
-
const contentInner = content.firstElementChild as HTMLElement;
|
|
130
|
-
if (contentInner) {
|
|
131
|
-
const height = contentInner.getBoundingClientRect().height;
|
|
132
|
-
content.style.setProperty("--starwind-accordion-content-height", `${height}px`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Sets the initial state based on the default value attribute
|
|
138
|
-
*/
|
|
139
|
-
private setInitialState(): void {
|
|
140
|
-
const defaultValue = this.accordion.dataset.value;
|
|
141
|
-
if (defaultValue) {
|
|
142
|
-
const item = this.itemsByValue.get(defaultValue);
|
|
143
|
-
if (item) {
|
|
144
|
-
this.setItemState(item, true);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Sets up click and keyboard event listeners for an accordion item
|
|
151
|
-
* @param item - The accordion item to setup listeners for
|
|
152
|
-
*/
|
|
153
|
-
private setupEventListeners(item: AccordionItem): void {
|
|
154
|
-
item.trigger.addEventListener("click", () => this.handleClick(item));
|
|
155
|
-
item.trigger.addEventListener("keydown", (e) => this.handleKeyDown(e, item));
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Handles click events on accordion triggers
|
|
160
|
-
* @param item - The clicked accordion item
|
|
161
|
-
*/
|
|
162
|
-
private handleClick(item: AccordionItem): void {
|
|
163
|
-
const isOpen = item.element.getAttribute("data-state") === "open";
|
|
164
|
-
this.toggleItem(item, !isOpen);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Handles keyboard navigation events
|
|
169
|
-
* @param event - The keyboard event
|
|
170
|
-
* @param item - The current accordion item
|
|
171
|
-
*/
|
|
172
|
-
private handleKeyDown(event: KeyboardEvent, item: AccordionItem): void {
|
|
173
|
-
const index = this.items.indexOf(item);
|
|
174
|
-
|
|
175
|
-
const keyActions: Record<string, () => void> = {
|
|
176
|
-
ArrowDown: () => this.focusItem(index + 1),
|
|
177
|
-
ArrowUp: () => this.focusItem(index - 1),
|
|
178
|
-
Home: () => this.focusItem(0),
|
|
179
|
-
End: () => this.focusItem(this.items.length - 1),
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
const action = keyActions[event.key];
|
|
183
|
-
if (action) {
|
|
184
|
-
event.preventDefault();
|
|
185
|
-
action();
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Focuses an accordion item by index with wrapping
|
|
191
|
-
* @param index - The target index to focus
|
|
192
|
-
*/
|
|
193
|
-
private focusItem(index: number): void {
|
|
194
|
-
if (this.items.length === 0) return;
|
|
195
|
-
const targetIndex = (index + this.items.length) % this.items.length;
|
|
196
|
-
this.items[targetIndex]?.trigger.focus();
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Toggles an accordion item's state
|
|
201
|
-
* @param item - The item to toggle
|
|
202
|
-
* @param shouldOpen - Whether the item should be opened
|
|
203
|
-
*/
|
|
204
|
-
private toggleItem(item: AccordionItem, shouldOpen: boolean): void {
|
|
205
|
-
if (this.type === "single" && shouldOpen) {
|
|
206
|
-
// Close other items if in single mode
|
|
207
|
-
this.items.forEach((otherItem) => {
|
|
208
|
-
if (otherItem !== item && otherItem.element.getAttribute("data-state") === "open") {
|
|
209
|
-
this.setItemState(otherItem, false);
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
this.setItemState(item, shouldOpen);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Sets the state of an accordion item
|
|
219
|
-
* @param item - The item to update
|
|
220
|
-
* @param isOpen - Whether the item should be open
|
|
221
|
-
*/
|
|
222
|
-
private setItemState(item: AccordionItem, isOpen: boolean): void {
|
|
223
|
-
const state: AccordionState = isOpen ? "open" : "closed";
|
|
224
|
-
|
|
225
|
-
// Skip animation during initial setup, enable for subsequent toggles
|
|
226
|
-
if (!this.isInitialized) {
|
|
227
|
-
item.content.style.setProperty("animation", "none");
|
|
228
|
-
} else {
|
|
229
|
-
item.content.style.removeProperty("animation");
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// Set content height variable for animations
|
|
233
|
-
this.setContentHeight(item.content);
|
|
234
|
-
|
|
235
|
-
item.element.setAttribute("data-state", state);
|
|
236
|
-
item.content.setAttribute("data-state", state);
|
|
237
|
-
item.trigger.setAttribute("data-state", state);
|
|
238
|
-
item.trigger.setAttribute("aria-expanded", isOpen.toString());
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Store instances in a WeakMap to avoid memory leaks
|
|
243
|
-
const accordionInstances = new WeakMap<HTMLElement, AccordionHandler>();
|
|
244
|
-
let accordionCounter = 0;
|
|
245
|
-
|
|
246
|
-
const setupAccordions = () => {
|
|
247
|
-
document.querySelectorAll<HTMLElement>(".starwind-accordion").forEach((accordion) => {
|
|
248
|
-
if (!accordionInstances.has(accordion)) {
|
|
249
|
-
accordionInstances.set(accordion, new AccordionHandler(accordion, accordionCounter++));
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
setupAccordions();
|
|
255
|
-
document.addEventListener("astro:after-swap", setupAccordions);
|
|
256
|
-
document.addEventListener("starwind:init", setupAccordions);
|
|
257
|
-
</script>
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
/**
|
|
3
|
-
* NOTE: style="animation: none;" makes it so the close animation doesn't run on page load
|
|
4
|
-
* It is later removed in the Accordion.astro script
|
|
5
|
-
*/
|
|
6
|
-
import type { HTMLAttributes } from "astro/types";
|
|
7
|
-
import { cv } from "css-variants";
|
|
8
|
-
|
|
9
|
-
export interface AccordionContentProps extends HTMLAttributes<"div"> {}
|
|
10
|
-
type Props = AccordionContentProps;
|
|
11
|
-
|
|
12
|
-
export const accordionContent = cv({
|
|
13
|
-
base: [
|
|
14
|
-
"starwind-accordion-content",
|
|
15
|
-
"transform-gpu overflow-hidden",
|
|
16
|
-
"data-[state=closed]:animate-accordion-up data-[state=closed]:h-0",
|
|
17
|
-
"data-[state=open]:animate-accordion-down",
|
|
18
|
-
],
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
const { class: className, ...rest } = Astro.props;
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
<div
|
|
25
|
-
class:list={[accordionContent(), className]}
|
|
26
|
-
data-state="closed"
|
|
27
|
-
style="animation: none;"
|
|
28
|
-
{...rest}
|
|
29
|
-
data-slot="accordion-content"
|
|
30
|
-
>
|
|
31
|
-
<div class="pt-0 pb-2xl">
|
|
32
|
-
<slot />
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import type { HTMLAttributes } from "astro/types";
|
|
3
|
-
import { cv } from "css-variants";
|
|
4
|
-
|
|
5
|
-
export interface AccordionItemProps extends HTMLAttributes<"div"> {
|
|
6
|
-
/**
|
|
7
|
-
* The value of the item
|
|
8
|
-
*/
|
|
9
|
-
value: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
type Props = AccordionItemProps;
|
|
13
|
-
|
|
14
|
-
export const accordionItem = cv({
|
|
15
|
-
base: "starwind-accordion-item border-b last:border-b-0",
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
const { value, class: className, ...rest } = Astro.props;
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
<div
|
|
22
|
-
class:list={[accordionItem(), className]}
|
|
23
|
-
data-value={value}
|
|
24
|
-
data-state="closed"
|
|
25
|
-
{...rest}
|
|
26
|
-
data-slot="accordion-item"
|
|
27
|
-
>
|
|
28
|
-
<slot />
|
|
29
|
-
</div>
|