generated from polymech/site-template
latest
This commit is contained in:
parent
48127f4534
commit
c39bfa3b7b
5
public/js/cdn.min.js
vendored
Normal file
5
public/js/cdn.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
public/js/flowbite.min.js
vendored
Normal file
2
public/js/flowbite.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
113
src/components/library/howto.astro
Normal file
113
src/components/library/howto.astro
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
---
|
||||||
|
// Import required components and interfaces
|
||||||
|
import { IHowto } from "@/model/howto";
|
||||||
|
import { Gallery } from "@polymech/astro-base";
|
||||||
|
import { Img } from 'imagetools/components';
|
||||||
|
import { i18n as Translate } from "@polymech/astro-base";
|
||||||
|
|
||||||
|
// Define props interface with Astro typing
|
||||||
|
interface Props {
|
||||||
|
howto: IHowto;
|
||||||
|
}
|
||||||
|
// Get the howto data from props
|
||||||
|
const { howto } = Astro.props;
|
||||||
|
import BaseLayout from "@/layouts/BaseLayout.astro";
|
||||||
|
import Wrapper from "@/components/containers/Wrapper.astro";
|
||||||
|
|
||||||
|
---
|
||||||
|
<BaseLayout class="markdown-content">
|
||||||
|
<Wrapper>
|
||||||
|
<div class="howto-container max-w-4xl mx-auto p-4">
|
||||||
|
<!-- Header section -->
|
||||||
|
<header class="mb-8">
|
||||||
|
<h1 class="text-3xl font-bold mb-2">
|
||||||
|
<Translate>{howto.title}</Translate>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<!-- Cover image -->
|
||||||
|
<div class="mb-4">
|
||||||
|
<img
|
||||||
|
src={howto.cover_image.downloadUrl || ""}
|
||||||
|
alt={"none"}
|
||||||
|
attributes={{
|
||||||
|
img: { class: "w-full h-64 object-cover rounded-lg" }
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Metadata -->
|
||||||
|
<div class="flex flex-wrap gap-4 mb-4 text-sm text-gray-600">
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Difficulty:</span>
|
||||||
|
<Translate>{howto.difficulty_level}</Translate>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Time:</span>
|
||||||
|
<Translate>{howto.time}</Translate>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Views:</span> {howto.total_views}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Created by:</span> {howto._createdBy}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Country:</span> {howto.creatorCountry}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Description -->
|
||||||
|
<div class="bg-gray-50 p-4 rounded-lg">
|
||||||
|
<p class="whitespace-pre-line">
|
||||||
|
<Translate>{howto.description}</Translate>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<!-- Steps -->
|
||||||
|
<div class="steps-container space-y-12">
|
||||||
|
{howto.steps.map((step, index) => (
|
||||||
|
<div class="step-item" id={`step-${index + 1}`}>
|
||||||
|
<h2 class="text-2xl font-semibold mb-4">
|
||||||
|
<span class="inline-block bg-blue-500 text-white w-8 h-8 rounded-full text-center leading-8 mr-2">
|
||||||
|
{index + 1}
|
||||||
|
</span>
|
||||||
|
<Translate>{step.title}</Translate>
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<!-- Step content -->
|
||||||
|
<div class="step-content mb-6">
|
||||||
|
<p class="whitespace-pre-line mb-4">
|
||||||
|
<Translate>{step.text}</Translate>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{step.images && step.images.length > 0 && (
|
||||||
|
<div class="step-images">
|
||||||
|
{step.images.map(img => (
|
||||||
|
<img src={img.downloadUrl || ""} alt="alt" />
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<!-- Footer information -->
|
||||||
|
<footer class="mt-12 pt-6 border-t border-gray-200">
|
||||||
|
<div class="flex justify-between items-center">
|
||||||
|
<div>
|
||||||
|
<span class="text-sm text-gray-500">
|
||||||
|
<Translate>Created</Translate>: {new Date(howto._created).toLocaleDateString()}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="text-sm text-gray-500">
|
||||||
|
<span>
|
||||||
|
<Translate>Found useful by</Translate>: {howto.votedUsefulBy.length} <Translate>people</Translate>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</Wrapper>
|
||||||
|
</BaseLayout>
|
||||||
187
src/components/polymech/PricingTiers.astro
Normal file
187
src/components/polymech/PricingTiers.astro
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
---
|
||||||
|
const pricingPlans = [
|
||||||
|
{
|
||||||
|
name: "Individual",
|
||||||
|
monthlyPrice: "149",
|
||||||
|
annualPrice: "100",
|
||||||
|
description: "For freelancers and independent designers",
|
||||||
|
features: [
|
||||||
|
"Unlimited access to all design assets",
|
||||||
|
"Good plan for a freelancer and solo designer",
|
||||||
|
"Support for basic web development",
|
||||||
|
"Work on up to 3 product design projects",
|
||||||
|
"Only one user per account",
|
||||||
|
"Commercial use",
|
||||||
|
],
|
||||||
|
unavailableFeatures: [
|
||||||
|
"Licensed for teams, startups, agencies and corporates",
|
||||||
|
"Several users per account",
|
||||||
|
"Commercial use",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Startup",
|
||||||
|
monthlyPrice: "249",
|
||||||
|
annualPrice: "300",
|
||||||
|
description: " Best choice for any size team or agency",
|
||||||
|
features: [
|
||||||
|
"Everything included in the Individual plan",
|
||||||
|
"Licensed for teams, startups, agencies and corporates",
|
||||||
|
"Several users per account",
|
||||||
|
"Commercial use",
|
||||||
|
],
|
||||||
|
unavailableFeatures: [
|
||||||
|
"Missing advanced 3D design tools",
|
||||||
|
"Without premium system collaboration",
|
||||||
|
"Standard support",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Company",
|
||||||
|
monthlyPrice: "50",
|
||||||
|
annualPrice: "600",
|
||||||
|
description: "For businesses aiming to lead in innovation.",
|
||||||
|
features: [
|
||||||
|
"Everything included in the Individual plan",
|
||||||
|
"Everything included in the Startup plan",
|
||||||
|
"Unlimited licensed for teams, startups, agencies and corporates",
|
||||||
|
"Unlimited users per account",
|
||||||
|
"Commercial use",
|
||||||
|
],
|
||||||
|
unavailableFeatures: [],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
---
|
||||||
|
|
||||||
|
<section x-data="{annual: false}">
|
||||||
|
<div
|
||||||
|
class="flex flex-col gap-12 h-full justify-between p-4 text-center pt-20">
|
||||||
|
<div class="max-w-xl mx-auto">
|
||||||
|
<h1
|
||||||
|
class="text-lg text-neutral-600 font-mono tracking-tight text-balance">
|
||||||
|
Become a member today and unlock unlimited access.
|
||||||
|
</h1>
|
||||||
|
<p class="text-sm text-balance text-neutral-500">
|
||||||
|
Enroll in our membership program today at a discounted rate and enjoy
|
||||||
|
full access to our incredible lineup of products.
|
||||||
|
</p>
|
||||||
|
<div class="max-w-sm mx-auto">
|
||||||
|
<div
|
||||||
|
class="overflow-hidden inline-flex mt-6 z-0 h-14 rounded-lg p-0.5 w-full bg-white">
|
||||||
|
<button
|
||||||
|
class="text-xs text-black w-full block font-medium px-8 py-2 transition rounded-lg border border-transparent"
|
||||||
|
@click="annual = false"
|
||||||
|
:class="annual == false ? 'bg-neutral-100 border text-black ' : ''"
|
||||||
|
type="button"
|
||||||
|
>Monthly</button
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="text-xs text-black w-full block font-medium px-8 py-2 transition rounded-lg border border-transparent"
|
||||||
|
@click="annual = true"
|
||||||
|
:class="annual == true ? 'bg-neutral-100 border text-black' : ''"
|
||||||
|
type="button"
|
||||||
|
>Annual ( save 25% )</button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="grid lg:grid-cols-3 gap-2 py-2">
|
||||||
|
{
|
||||||
|
pricingPlans.map((plan) => (
|
||||||
|
<>
|
||||||
|
<div class="flex flex-col h-full bg-white p-4 rounded-xl">
|
||||||
|
<div class=" h-full flex flex-col ">
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div class="flex justify-between items-center">
|
||||||
|
<h3
|
||||||
|
id="tier-essential"
|
||||||
|
class="text-lg text-neutral-600 font-mono tracking-tight uppercase">
|
||||||
|
{plan.name}
|
||||||
|
</h3>
|
||||||
|
<p class="flex items-baseline gap-x-1 text-lg text-neutral-600 font-mono tracking-tight">
|
||||||
|
<span>
|
||||||
|
<span x-show="!annual">${plan.monthlyPrice}</span>
|
||||||
|
<span x-show="annual">${plan.annualPrice}</span>
|
||||||
|
</span>
|
||||||
|
<span class="text-xs">
|
||||||
|
/m
|
||||||
|
<span
|
||||||
|
x-show="annual"
|
||||||
|
style="display: none;">
|
||||||
|
(billed annually)
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4 text-sm text-neutral-500">
|
||||||
|
{plan.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="mt-8">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
title="link to your page"
|
||||||
|
aria-label="your label"
|
||||||
|
class="relative group overflow-hidden pl-4 font-mono h-14 flex space-x-6 items-center bg-orange-500 hover:bg-black duration-300 rounded-xl w-full justify-between">
|
||||||
|
<span class="relative uppercase text-xs text-white">
|
||||||
|
Add to cart
|
||||||
|
</span>
|
||||||
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
|
class="w-12 text-white transition duration-300 -translate-y-7 group-hover:translate-y-7">
|
||||||
|
<div class="h-14 flex">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="1.5"
|
||||||
|
stroke="currentColor"
|
||||||
|
class="size-6 m-auto fill-white">
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M17.25 8.25 21 12m0 0-3.75 3.75M21 12H3"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="h-14 flex">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="1.5"
|
||||||
|
stroke="currentColor"
|
||||||
|
class="size-6 m-auto fill-white">
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M17.25 8.25 21 12m0 0-3.75 3.75M21 12H3"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ul class="mt-6 text-xs space-y-1 font-mono uppercase text-neutral-500">
|
||||||
|
{plan.features.map((feature) => (
|
||||||
|
<li class="inline-flex items-start gap-3 ">
|
||||||
|
<span>+</span>
|
||||||
|
{feature}
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
{plan.unavailableFeatures.map((feature) => (
|
||||||
|
<li class="inline-flex items-start gap-3 opacity-60">
|
||||||
|
<span>−</span> {feature}
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
9
src/config/cli.ts
Normal file
9
src/config/cli.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import cli from 'yargs'
|
||||||
|
import { hideBin } from 'yargs/helpers'
|
||||||
|
import { } from './network.js'
|
||||||
|
|
||||||
|
const argv = cli(hideBin(process.argv)).parse()
|
||||||
|
|
||||||
|
export const options = () => {
|
||||||
|
console.log('Options: ', argv)
|
||||||
|
}
|
||||||
88
src/config/config.json
Normal file
88
src/config/config.json
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
"site": {
|
||||||
|
"title": "Polymech",
|
||||||
|
"base_url": "https://polymech.io/",
|
||||||
|
"description" : "",
|
||||||
|
"base_path": "/",
|
||||||
|
"trailing_slash": false,
|
||||||
|
"favicon": "/images/favicon.png",
|
||||||
|
"logo": "/images/logo.png",
|
||||||
|
"logo_darkmode": "/images/logo-darkmode.png",
|
||||||
|
"logo_width": "150",
|
||||||
|
"logo_height": "33",
|
||||||
|
"logo_text": "Polymech Logo",
|
||||||
|
"image": {
|
||||||
|
"default": "/images/default-image.png",
|
||||||
|
"error": "/images/error-image.png",
|
||||||
|
"alt": "Astrofront",
|
||||||
|
"src": "https://assets.osr-plastic.org/machines//assets/newsletter/common/products/extruders/overview-3.jpg"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"footer_left": [
|
||||||
|
{
|
||||||
|
"href": "/infopages/privacy",
|
||||||
|
"text": "Privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "/infopages/contact",
|
||||||
|
"text": "Contact"
|
||||||
|
} ,
|
||||||
|
{
|
||||||
|
"href": "/newsletter/newsletter_2024_09_en-hugo-release.html",
|
||||||
|
"text": "Newsletter"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"footer_right": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"settings": {
|
||||||
|
"search": true,
|
||||||
|
"account": true,
|
||||||
|
"sticky_header": true,
|
||||||
|
"theme_switcher": true,
|
||||||
|
"default_theme": "system"
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"contact_form_action": "#",
|
||||||
|
"copyright": "Designed And Developed by [Themefisher](https://themefisher.com/)"
|
||||||
|
},
|
||||||
|
"navigation_button": {
|
||||||
|
"enable": true,
|
||||||
|
"label": "Get Started",
|
||||||
|
"link": "https://github.com/themefisher/astrofront"
|
||||||
|
},
|
||||||
|
"ecommerce": {
|
||||||
|
"brand": "Polymech",
|
||||||
|
"currencySymbol": "",
|
||||||
|
"currencyCode": "EUR"
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"country": "Spain",
|
||||||
|
"city": "Barcelona",
|
||||||
|
"author": "Polymech",
|
||||||
|
"author_bio": "I am in, if its true",
|
||||||
|
"author_url": "https://polymech.io/",
|
||||||
|
"image": "/images/og-image.png",
|
||||||
|
"description": "Polymech is a plastic prototyping company that offers product design services.",
|
||||||
|
"keywords": "Plastic, Prototyping, Product Design, Opensource"
|
||||||
|
},
|
||||||
|
"shopify": {
|
||||||
|
"currencySymbol": "",
|
||||||
|
"currencyCode": "EUR",
|
||||||
|
"collections": {
|
||||||
|
"hero_slider": "hidden-homepage-carousel",
|
||||||
|
"featured_products": "featured-products"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pages":{
|
||||||
|
"home":{
|
||||||
|
"hero": "https://assets.osr-plastic.org/machines//assets/newsletter/common/products/extruders/overview-3.jpg",
|
||||||
|
"blog":{
|
||||||
|
"store": "resources"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tracking": {
|
||||||
|
"googleAnalytics": "G-RW6Q6EG3J0"
|
||||||
|
}
|
||||||
|
}
|
||||||
170
src/config/config.ts
Normal file
170
src/config/config.ts
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
import * as path from 'path'
|
||||||
|
import { IMAGE_PRESET, E_BROADBAND_SPEED } from "./network.js"
|
||||||
|
import { resolve, template } from '@polymech/commons'
|
||||||
|
import { sync as read } from '@polymech/fs/read'
|
||||||
|
import { sanitizeUri } from 'micromark-util-sanitize-uri'
|
||||||
|
|
||||||
|
export const OSR_ROOT = () => path.resolve(resolve("${OSR_ROOT}"))
|
||||||
|
|
||||||
|
export const LOGGING_NAMESPACE = 'polymech-site'
|
||||||
|
export const TRANSLATE_CONTENT = true
|
||||||
|
export const LANGUAGES = ['en', 'ar', 'de', 'ja', 'es', 'zh', 'fr']
|
||||||
|
export const LANGUAGES_PROD = ['en', 'es', 'ar', 'de', 'ja', 'zh', 'fr', 'nl', 'it', 'pt']
|
||||||
|
export const isRTL = (lang) => lang === 'ar'
|
||||||
|
|
||||||
|
// i18n constants
|
||||||
|
export const I18N_STORE = (root, lang) => `${root}/i18n-store/store-${lang}.json`
|
||||||
|
export const I18N_SOURCE_LANGUAGE = 'en'
|
||||||
|
export const I18N_CACHE = true
|
||||||
|
export const I18N_ASSET_PATH = "${SRC_DIR}/${SRC_NAME}-${DST_LANG}${SRC_EXT}"
|
||||||
|
|
||||||
|
// Products
|
||||||
|
export const PRODUCT_ROOT = () => path.resolve(resolve("${OSR_ROOT}/products"))
|
||||||
|
export const PRODUCT_BRANCHES = read(path.join(PRODUCT_ROOT(), 'config/machines.json'), 'json')
|
||||||
|
export const PRODUCT_GLOB = '**/config.json'
|
||||||
|
|
||||||
|
// Product compiler
|
||||||
|
export const PRODUCT_CONFIG = (product) =>
|
||||||
|
path.resolve(resolve(`${PRODUCT_ROOT()}/${product}/config.json`, false,
|
||||||
|
{
|
||||||
|
product
|
||||||
|
}))
|
||||||
|
export const PRODUCT_DIR = (product) => path.resolve(resolve(`${PRODUCT_ROOT()}/${product}`))
|
||||||
|
export const PRODUCT_HUGO_TEMPLATE = './osr/hugo/root.html'
|
||||||
|
export const PRODUCTS_TARGET_SRC = './src/content/en/retail'
|
||||||
|
export const PRODUCTS_TARGET = (lang) => `./content/${lang}/products`
|
||||||
|
|
||||||
|
// Product assets
|
||||||
|
|
||||||
|
export const ASSETS_LOCAL = false
|
||||||
|
export const ASSETS_GLOB = '*.+(JPG|jpg|jpeg|png|PNG|gif)'
|
||||||
|
// OSRL - Language
|
||||||
|
export const IS_DEV = true
|
||||||
|
export const OSRL_ENV = 'astro-release'
|
||||||
|
export const OSRL_ENV_DEV = 'astro-debug'
|
||||||
|
export const OSRL_ENVIRONMENT = IS_DEV ? OSRL_ENV_DEV : OSRL_ENV
|
||||||
|
export const OSRL_MODULE_NAME = 'polymech.io'
|
||||||
|
export const OSRL_PRODUCT_PROFILE = './src/config/profile.json'
|
||||||
|
export const OSRL_LANG_FLAVOR = 'osr'
|
||||||
|
|
||||||
|
// Products
|
||||||
|
export const ENABLED_PRODUCTS = "${OSR_ROOT}/products/config/machines.json"
|
||||||
|
export const PRODUCT_SPECS = (rel) => `${PRODUCT_ROOT()}/${rel}/specs.xlsx`
|
||||||
|
|
||||||
|
// Tasks
|
||||||
|
export const TASK_CONFIG_LOG_DIRECTORY = './config/'
|
||||||
|
|
||||||
|
// Task: compile:content
|
||||||
|
export const TASK_COMPILE_CONTENT = true
|
||||||
|
export const TASK_COMPILE_CONTENT_CACHE = false
|
||||||
|
|
||||||
|
// Task - Logging
|
||||||
|
export const TASK_LOG_DIRECTORY = './logs/'
|
||||||
|
|
||||||
|
// Task - Retail Config
|
||||||
|
export const REGISTER_PRODUCT_TASKS = true
|
||||||
|
export const RETAIL_PRODUCT_BRANCH = 'site'
|
||||||
|
export const PROJECTS_BRANCH = 'projects'
|
||||||
|
export const RETAIL_COMPILE_CACHE = false
|
||||||
|
export const RETAIL_MEDIA_CACHE = true
|
||||||
|
export const RETAIL_LOG_LEVEL_I18N_PRODUCT_ASSETS = 'info'
|
||||||
|
|
||||||
|
export const ConvertProductMedia = true
|
||||||
|
export const TranslateProductAssets = false
|
||||||
|
export const PopulateProductDefaults = true
|
||||||
|
|
||||||
|
// CAD
|
||||||
|
export const CAD_MAIN_MATCH = (product) => `${product}/cad*/*Global*.+(SLDASM)`
|
||||||
|
export const CAD_CAM_MAIN_MATCH = (product) => `${product}/cad*/*-CNC*.+(SLDASM)`
|
||||||
|
|
||||||
|
export const CAD_CACHE = true
|
||||||
|
export const CAD_EXPORT_CONFIGURATIONS = false
|
||||||
|
export const CAD_EXPORT_SUB_COMPONENTS = true
|
||||||
|
export const CAD_MODEL_FILE_PATH = (SOURCE, CONFIGURATION = '') =>
|
||||||
|
SOURCE.replace('.json', `${CONFIGURATION ? '-' + CONFIGURATION : ''}.tree.json`)
|
||||||
|
export const CAD_DEFAULT_CONFIGURATION = 'Default'
|
||||||
|
export const CAD_RENDERER = 'solidworks'
|
||||||
|
export const CAD_RENDERER_VIEW = 'Render'
|
||||||
|
export const CAD_RENDERER_QUALITY = 1
|
||||||
|
export const CAD_EXTENSIONS = ['.STEP', '.html']
|
||||||
|
export const CAD_MODEL_EXT = '.tree.json'
|
||||||
|
|
||||||
|
export const CAD_URL = (file: string, variables: Record<string, string>) =>
|
||||||
|
sanitizeUri(template("${OSR_MACHINES_ASSETS_URL}/${file}", { file, ...variables }))
|
||||||
|
|
||||||
|
export const ASSET_URL = (file: string, variables: Record<string, string>) =>
|
||||||
|
sanitizeUri(template("${OSR_MACHINES_ASSETS_URL}/products/${product_rel_min}/${file}", { file, ...variables }))
|
||||||
|
|
||||||
|
export const ITEM_ASSET_URL = (variables: Record<string, string>) =>
|
||||||
|
template("${OSR_MACHINES_ASSETS_URL}/${ITEM_REL}/${assetPath}/${filePath}", variables)
|
||||||
|
|
||||||
|
|
||||||
|
//back compat - osr-cad
|
||||||
|
export const parseBoolean = (value: string): boolean => {
|
||||||
|
return value === '1' || value.toLowerCase() === 'true';
|
||||||
|
}
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Rendering
|
||||||
|
export const SHOW_DESCRIPTION = false
|
||||||
|
export const SHOW_LICENSE = true
|
||||||
|
export const SHOW_RENDERINGS = true
|
||||||
|
|
||||||
|
export const SHOW_TABS = false
|
||||||
|
export const SHOW_GALLERY = true
|
||||||
|
export const SHOW_FILES = true
|
||||||
|
export const SHOW_SPECS = true
|
||||||
|
export const SHOW_CHECKOUT = true
|
||||||
|
export const SHOW_CONTACT = true
|
||||||
|
export const SHOW_3D_PREVIEW = true
|
||||||
|
export const SHOW_RESOURCES = true
|
||||||
|
export const SHOW_DEBUG = false
|
||||||
|
export const SHOW_SAMPLES = true
|
||||||
|
export const SHOW_README = false
|
||||||
|
export const SHOW_RELATED = true
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Plugins
|
||||||
|
|
||||||
|
// RSS
|
||||||
|
export const RSS_CONFIG =
|
||||||
|
{
|
||||||
|
title: 'Polymech RSS Feed',
|
||||||
|
description: '',
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Defaults
|
||||||
|
export const DEFAULT_IMAGE_URL = 'https://picsum.photos/640/640'
|
||||||
|
export const default_image = () => {
|
||||||
|
return {
|
||||||
|
alt: 'none',
|
||||||
|
src: DEFAULT_IMAGE_URL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export const DEFAULT_LICENSE = `CERN Open Source Hardware License`
|
||||||
|
export const DEFAULT_CONTACT = `sales@plastic-hub.com`
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Optimization
|
||||||
|
|
||||||
|
export const O_IMAGE = IMAGE_PRESET[E_BROADBAND_SPEED.MEDIUM]
|
||||||
|
export const IMAGE_SETTINGS =
|
||||||
|
{
|
||||||
|
GALLERY: {
|
||||||
|
SHOW_TITLE: true,
|
||||||
|
SHOW_DESCRIPTION: false,
|
||||||
|
SIZES_THUMB: O_IMAGE.sizes_thumbs,
|
||||||
|
SIZES_LARGE: O_IMAGE.sizes_large,
|
||||||
|
SIZES_REGULAR: O_IMAGE.sizes_medium
|
||||||
|
},
|
||||||
|
LIGHTBOX: {
|
||||||
|
SHOW_TITLE: true,
|
||||||
|
SHOW_DESCRIPTION: true,
|
||||||
|
SIZES_THUMB: O_IMAGE.sizes_thumbs,
|
||||||
|
SIZES_LARGE: O_IMAGE.sizes_large,
|
||||||
|
SIZES_REGULAR: O_IMAGE.sizes_medium
|
||||||
|
}
|
||||||
|
}
|
||||||
41
src/config/navigation.ts
Normal file
41
src/config/navigation.ts
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import { translate } from '../base/i18n.js'
|
||||||
|
import { I18N_SOURCE_LANGUAGE } from 'config/config.js'
|
||||||
|
import config from "./config.json" with { type: "json" }
|
||||||
|
import pMap from 'p-map'
|
||||||
|
|
||||||
|
export const items = async (opts: { locale: string }) => {
|
||||||
|
const _T = async (text: string) => await translate(text, I18N_SOURCE_LANGUAGE, opts.locale)
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
"href": `/${opts.locale}`,
|
||||||
|
"title": _T("Home"),
|
||||||
|
"ariaLabel": "Home",
|
||||||
|
"class": "hover:text-orange-600"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": `/${opts.locale}/infopages/resources`,
|
||||||
|
"title": _T("Resources"),
|
||||||
|
"ariaLabel": "Resources",
|
||||||
|
"class": "hover:text-orange-600"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
const isAbsoluteUrl = (url: string): boolean => /^[a-zA-Z]+:/.test(url);
|
||||||
|
|
||||||
|
const createFooterLinks = async (items: any[], locale: string) => {
|
||||||
|
const _T = async (text: string) => await translate(text, I18N_SOURCE_LANGUAGE, locale);
|
||||||
|
|
||||||
|
return await pMap(items, async (item) => {
|
||||||
|
const translatedText = await _T(item.text); // Single translation call
|
||||||
|
|
||||||
|
return {
|
||||||
|
"href": isAbsoluteUrl(item.href) ? item.href : `/${locale}${item.href}`,
|
||||||
|
"title": translatedText, // Use cached translation
|
||||||
|
"ariaLabel": translatedText, // Use cached translation
|
||||||
|
"class": "hover:text-orange-600"
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const footer_left = (locale: string) => createFooterLinks(config.footer_left, locale);
|
||||||
|
export const footer_right = (locale: string) => createFooterLinks(config.footer_right, locale);
|
||||||
49
src/config/network.ts
Normal file
49
src/config/network.ts
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import { z } from "zod"
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Optimizations
|
||||||
|
|
||||||
|
// Image optimization (imagetools breakpoints & min widths)
|
||||||
|
|
||||||
|
export enum E_BROADBAND_SPEED {
|
||||||
|
SLOW = "slow",
|
||||||
|
MEDIUM = "medium",
|
||||||
|
FAST = "fast",
|
||||||
|
}
|
||||||
|
|
||||||
|
const imageConfigSchema = z.object({
|
||||||
|
sizes_medium: z.string(),
|
||||||
|
sizes_thumbs: z.string(),
|
||||||
|
sizes_large: z.string(),
|
||||||
|
})
|
||||||
|
const imagesSchema = z.object({
|
||||||
|
[E_BROADBAND_SPEED.SLOW]: imageConfigSchema,
|
||||||
|
[E_BROADBAND_SPEED.MEDIUM]: imageConfigSchema,
|
||||||
|
[E_BROADBAND_SPEED.FAST]: imageConfigSchema,
|
||||||
|
});
|
||||||
|
|
||||||
|
type Images = z.infer<typeof imagesSchema>;
|
||||||
|
|
||||||
|
export const IMAGE_PRESET: Images =
|
||||||
|
{
|
||||||
|
[E_BROADBAND_SPEED.SLOW]: {
|
||||||
|
// For 2g connections: smaller image widths help performance. (Middle East & Africa)
|
||||||
|
sizes_medium: "(min-width: 100px) 100px, 100vw",
|
||||||
|
sizes_thumbs: "(min-width: 80px) 80px, 80vw",
|
||||||
|
sizes_large: "(min-width: 320px) 320px, 320vw",
|
||||||
|
},
|
||||||
|
[E_BROADBAND_SPEED.MEDIUM]:
|
||||||
|
{
|
||||||
|
// For 3g connections: a moderate size image for a balance of quality and speed.
|
||||||
|
sizes_medium: "(min-width: 400px) 400px, 400vw",
|
||||||
|
sizes_thumbs: "(min-width: 120px) 120px, 120vw",
|
||||||
|
sizes_large: "(min-width: 1024px) 1024px, 1024vw",
|
||||||
|
},
|
||||||
|
[E_BROADBAND_SPEED.FAST]:
|
||||||
|
{
|
||||||
|
// For 4g connections: larger images for high-resolution displays.
|
||||||
|
sizes_medium: "(min-width: 1024px) 1024px, 1024vw",
|
||||||
|
sizes_thumbs: "(min-width: 180px) 180px, 180vw",
|
||||||
|
sizes_large: "(min-width: 1200px) 1200px, 1200vw"
|
||||||
|
}
|
||||||
|
}
|
||||||
43
src/config/profile.json
Normal file
43
src/config/profile.json
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"includes": [],
|
||||||
|
"variables": {
|
||||||
|
"PRODUCT_ROOT": "${root}/${product}/",
|
||||||
|
"abs_url": "https://assets.osr-plastic.org",
|
||||||
|
"CACHE": "${root}/cache/",
|
||||||
|
"CACHE_URL": "${abs_url}/cache/",
|
||||||
|
"GIT_REPO": "https://git.polymech.io/",
|
||||||
|
"OSR_MACHINES_ASSETS_URL":"https://assets.osr-plastic.org",
|
||||||
|
"PRODUCTS_ASSETS_URL":"https://assets.osr-plastic.org/${product_rel}",
|
||||||
|
"OSR_FILES_WEB":"https://files.polymech.io/files/machines",
|
||||||
|
"PRODUCTS_FILES_URL":"${OSR_FILES_WEB}/${product_rel}",
|
||||||
|
"DISCORD":"https://discord.gg/s8K7yKwBRc"
|
||||||
|
},
|
||||||
|
"env": {
|
||||||
|
"astro-release":{
|
||||||
|
"includes": [
|
||||||
|
"${PRODUCT_ROOT}"
|
||||||
|
],
|
||||||
|
"variables": {
|
||||||
|
"OSR_MACHINES_ASSETS_URL":"https://assets.osr-plastic.org/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"astro-debug":{
|
||||||
|
"includes": [
|
||||||
|
"${PRODUCT_ROOT}"
|
||||||
|
],
|
||||||
|
"variables": {
|
||||||
|
"OSR_MACHINES_ASSETS_URL":"https://assets.osr-plastic.org",
|
||||||
|
"showCart": false,
|
||||||
|
"showPrice": false,
|
||||||
|
"showResources": false,
|
||||||
|
"showShipping": false,
|
||||||
|
"showPaymentTerms": false,
|
||||||
|
"showHowtos": false,
|
||||||
|
"showRenderings": true,
|
||||||
|
"debug": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
24
src/config/social.json
Normal file
24
src/config/social.json
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"main": [
|
||||||
|
{
|
||||||
|
"name": "facebook",
|
||||||
|
"icon": "FaFacebookF",
|
||||||
|
"link": "https://www.facebook.com/themefisher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "twitter",
|
||||||
|
"icon": "FaXTwitter",
|
||||||
|
"link": "https://x.com/themefisher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "linkedin",
|
||||||
|
"icon": "FaLinkedinIn",
|
||||||
|
"link": "https://bd.linkedin.com/company/themefisher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "github",
|
||||||
|
"icon": "FaGithub",
|
||||||
|
"link": "https://github.com/themefisher/astrofront"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
8
src/config/stores.json
Normal file
8
src/config/stores.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"shop":{
|
||||||
|
"title": "Shop",
|
||||||
|
"description": "",
|
||||||
|
"items":"${OSR_ROOT}/products/products/**/config.json",
|
||||||
|
"root":"${OSR_ROOT}/products"
|
||||||
|
}
|
||||||
|
}
|
||||||
44
src/config/theme.json
Normal file
44
src/config/theme.json
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"colors": {
|
||||||
|
"default": {
|
||||||
|
"theme_color": {
|
||||||
|
"primary": "#121212",
|
||||||
|
"body": "#fff",
|
||||||
|
"border": "#eaeaea",
|
||||||
|
"theme_light": "#f2f2f2",
|
||||||
|
"theme_dark": "#000"
|
||||||
|
},
|
||||||
|
"text_color": {
|
||||||
|
"default": "#444",
|
||||||
|
"dark": "#000",
|
||||||
|
"light": "#666"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"darkmode": {
|
||||||
|
"theme_color": {
|
||||||
|
"primary": "#fff",
|
||||||
|
"body": "#252525",
|
||||||
|
"border": "#3E3E3E",
|
||||||
|
"theme_light": "#222222",
|
||||||
|
"theme_dark": "#000"
|
||||||
|
},
|
||||||
|
"text_color": {
|
||||||
|
"default": "#DDD",
|
||||||
|
"dark": "#fff",
|
||||||
|
"light": "#DDD"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fonts": {
|
||||||
|
"font_family": {
|
||||||
|
"primary": "Karla:wght@400;500;700",
|
||||||
|
"primary_type": "sans-serif",
|
||||||
|
"secondary": "",
|
||||||
|
"secondary_type": ""
|
||||||
|
},
|
||||||
|
"font_size": {
|
||||||
|
"base": "16",
|
||||||
|
"scale": "1.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
231
src/model/.kbot/completion.json
Normal file
231
src/model/.kbot/completion.json
Normal file
File diff suppressed because one or more lines are too long
38
src/model/.kbot/content.json
Normal file
38
src/model/.kbot/content.json
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": "I'll help you create a minimal Astro component based on the provided interface and sample data. I'll create the component at ../components/libary/howto.astro with styling using Tailwind CSS.",
|
||||||
|
"timestamp": "2025-03-19T21:39:46.000Z",
|
||||||
|
"service": "collector:onContent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": "\n\nI've created a minimal Astro component that follows your requirements:\n\n1. Uses Tailwind CSS for styling\n2. Uses the specified image components:\n - `Img` from 'imagetools/components' for single images\n - `GalleryK` from '@polymech/components/Gallery.astro' for multiple images\n3. No React or additional dependencies\n4. Implements the full IHowto interface\n\nThe component includes:\n- A header section with:\n - Title\n - Creator info\n - Difficulty level\n - Time required\n - Cover image\n - Description\n- Steps section with:\n - Step title\n - Step text\n - Step images using GalleryK component\n- Footer with:\n - View count\n - Number of users who found it useful\n\nThe layout is responsive and uses Tailwind's utility classes for styling. Each step is visually separated with a left border and proper spacing.\n\nTo use this component, you would import it and pass a howto object that matches the IHowto interface:\n\n```astro\n---\nimport Howto from '../components/libary/howto.astro'\nconst howtoData = {...} // Your howto data\n---\n\n<Howto howto={howtoData} />\n```\n\nWould you like me to make any adjustments to the component?",
|
||||||
|
"timestamp": "2025-03-19T21:39:57.421Z",
|
||||||
|
"service": "collector:onContent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": "I'll create a new Astro component for the IHowto interface using the sample data you provided. This will be a minimal component using Tailwind for styling and following your requirements for image handling.",
|
||||||
|
"timestamp": "2025-03-19T21:44:48.770Z",
|
||||||
|
"service": "collector:onContent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": "I've created the Howto Astro component based on your requirements. Here's a summary of what the component includes:\n\n1. **Component Structure**:\n - Header section with title, difficulty level, time required, views, and downloads\n - Description section with proper formatting\n - Cover image using the `<Img>` component\n - Step-by-step instructions with titles, descriptions, and images\n - Footer with author information and user votes\n\n2. **Image Handling**:\n - Single images use `<Img>` from 'imagetools/components'\n - Multiple images use `<Gallery>` from \"@polymech/components/Gallery.astro\"\n - Images include proper alt text and responsive styling\n\n3. **Styling**:\n - Uses Tailwind CSS classes for styling\n - Responsive design with proper spacing and typography\n - Clean, readable layout\n\n4. **Data Handling**:\n - Properly imports and uses the IHowto interface\n - Handles all the required properties from the sample data\n - Includes a utility function to format dates\n\nThe component is now saved at `../components/libary/howto.astro`. You can use it by passing an IHowto object to the component.\n\nDo you need any adjustments or have questions about the implementation?",
|
||||||
|
"timestamp": "2025-03-19T21:45:01.273Z",
|
||||||
|
"service": "collector:onContent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": "I'll create a minimal Astro component for the IHowto interface using the specifications you provided. The component will use Tailwind for styling, the requested image components, and will follow the other preferences you've outlined.",
|
||||||
|
"timestamp": "2025-03-19T21:52:18.654Z",
|
||||||
|
"service": "collector:onContent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": "I've created the Astro component for the IHowto interface as requested. Let me explain what I've implemented:\n\n## Component Structure\n\nThe component is located at `../components/libary/howto.astro` and includes:\n\n1. **Header Section**:\n - Title with translation support\n - Cover image using the `<Img>` component\n - Metadata display (difficulty, time, views, creator, country)\n - Description with translation support\n\n2. **Steps Section**:\n - Each step is numbered and includes:\n - Step title with translation\n - Step text content with translation\n - Image gallery using the `<Gallery>` component for step images\n\n3. **Footer Section**:\n - Creation date\n - Number of people who found it useful\n\n## Key Features\n\n- Used Tailwind CSS for styling as requested\n- Implemented the `<Translate>` component for all text content\n- Used `<Img>` component for single images with proper class attributes\n- Used `<Gallery>` component for multiple images\n- No React or additional dependencies\n- Follows the IHowto interface structure exactly\n\nThe component handles all the data from the provided IHowto sample data and displays it in a clean, responsive layout. It can be used by simply passing an IHowto object as a prop.\n\nIs there anything specific about the component you'd like me to explain or modify?",
|
||||||
|
"timestamp": "2025-03-19T21:52:31.537Z",
|
||||||
|
"service": "collector:onContent"
|
||||||
|
}
|
||||||
|
]
|
||||||
168
src/model/.kbot/openai-message.json
Normal file
168
src/model/.kbot/openai-message.json
Normal file
File diff suppressed because one or more lines are too long
127
src/model/.kbot/params.json
Normal file
127
src/model/.kbot/params.json
Normal file
File diff suppressed because one or more lines are too long
35
src/model/.kbot/tool-call-result.json
Normal file
35
src/model/.kbot/tool-call-result.json
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": {
|
||||||
|
"file": {
|
||||||
|
"path": "../components/libary/howto.astro",
|
||||||
|
"content": "LS0tCmludGVyZmFjZSBQcm9wcyB7CiAgaG93dG86IElIb3d0bwp9Cgpjb25zdCB7IGhvd3RvIH0gPSBBc3Ryby5wcm9wczsKCmltcG9ydCB7IEltZyB9IGZyb20gJ2ltYWdldG9vbHMvY29tcG9uZW50cycKaW1wb3J0IEdhbGxlcnlLIGZyb20gJ0Bwb2x5bWVjaC9jb21wb25lbnRzL0dhbGxlcnkuYXN0cm8nCi0tLQo8YXJ0aWNsZSBjbGFzcz0ibWF4LXctNHhsIG14LWF1dG8gcHktOCBweC00Ij4KICA8aGVhZGVyIGNsYXNzPSJtYi04Ij4KICAgIDxoMSBjbGFzcz0idGV4dC0zeGwgZm9udC1ib2xkIG1iLTQiPnt7IGhvd3RvLnRpdGxlIH19PC9oMT4KICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTQgbWItNCI+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj5CeSB7eyBob3d0by5fY3JlYXRlZEJ5IH19PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+4oCiPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+RGlmZmljdWx0eTogeyB7IGhvd3RvLmRpZmZpY3VsdHlfbGV2ZWwgfX08L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj7igKI8L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj5UaW1lOiB7eyBob3d0by50aW1lIH19PC9zcGFuPgogICAgPC9kaXY+CiAgICA8SW1nIHNyYz17aG93dG8uY292ZXJfaW1hZ2UuZG93bmxvYWRVcmx9IGFsdD17aG93dG8udGl0bGV9IGNsYXNzPSJ3LWZ1bGwgaC02NCBvYmplY3QtY292ZXIgcm91bmRlZC1sZyBtYi00Ii8+CiAgICA8cCBjbGFzcz0idGV4dC1sZyB0ZXh0LWdyYXktNzAwIj57eyBob3d0by5kZXNjcmlwdGlvbiB9fTwvcD4KICA8L2hlYWRlcj4KCiAgPGRpdiBjbGFzcz0ic3BhY2UteS0xMCI+CiAgICB7eyBob3d0by5zdGVwcy5tYXAoKHN0ZXAsIGluZGV4KSA9PiAoCiAgICAgIDxzZWN0aW9uIGtleT17c3RlcC5fYW5pbWF0aW9uS2V5fSBjbGFzcz0iYm9yZGVyLWwgYm9yZGVyLWdyYXktMjAwIHBsLTQiPgogICAgICAgIDxoMiBjbGFzcz0idGV4dC14bCBmb250LWJvbGQgbWItMyI+U3RlcCB7eyBpbmRleCArIDEgfX06IHt7IHN0ZXAudGl0bGUgfX08L2gyPgogICAgICAgIDxwIGNsYXNzPSJtYi00Ij57eyBzdGVwLnRleHQgfX08L3A+CiAgICAgICAgeyMgaWYgc3RlcC5pbWFnZXM/Lmxlbmd0aCB9fQogICAgICAgICAgPEdhbGxlcnlLCgogICAgICAgICAgICBpbWFnZXM9e3N0ZXAuaW1hZ2VzLm1hcChpbWcgPT4gKHsKICAgICAgICAgICAgICBzcmM6IGltZy5kb3dubG9hZFVybCwKICAgICAgICAgICAgICBhbHQ6IGAke2hvd3RvLnRpdGxlfSAtICR7c3RlcC50aXRsZX1gCiAgICAgICAgICAgIH0pKX0KICAgICAgICAgICAgY2xhc3M9Im10LTQgcm91bmRlZC1sZyIKICAgICAgICAgIC8+CiAgICAgICAgeyMvIGlmIH0KICAgICAgPC9zZWN0aW9uPgogICAgKSkgfX0KICA8L2Rpdj4KCiAgPGZvb3RlciBjbGFzcz0ibXQtOCBwdC04IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCI+CiAgICA8ZGl2IGNsYXNzPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC00Ij4KICAgICAgPHNwYW4gY2xhc3M9InRleHQtc20iPnt7IGhvd3RvLnRvdGFsX3ZpZXdzIH19IHZpZXdzPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+4oCiPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+eyB7IGhvd3RvLnZvdGVkVXNlZnVsQnkubGVuZ3RoIH19IGZvdW5kIHVzZWZ1bDwvc3Bhbj4KICAgIDwvZGl2PgogIDwvZm9vdGVyPgo8L2FydGljbGU+Cg=="
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"timestamp": "2025-03-19T21:39:46.006Z",
|
||||||
|
"service": "collector:onFunctionCallResult"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": {
|
||||||
|
"file": {
|
||||||
|
"path": "../components/libary/howto.astro",
|
||||||
|
"content": "LS0tCmltcG9ydCB7IEltZyB9IGZyb20gJ2ltYWdldG9vbHMvY29tcG9uZW50cyc7CmltcG9ydCB7IEdhbGxlcnkgfSBmcm9tICJAcG9seW1lY2gvY29tcG9uZW50cy9HYWxsZXJ5LmFzdHJvIjsKaW1wb3J0IHsgSUhvd3RvIH0gZnJvbSAiQC9tb2RlbC9ob3d0by5qcyI7CgppbnRlcmZhY2UgUHJvcHMgewogIGhvd3RvOiBJSG93dG87Cn0KCmNvbnN0IHsgaG93dG8gfSA9IEFzdHJvLnByb3BzOwoKY29uc3QgZm9ybWF0RGF0ZSA9IChkYXRlU3RyaW5nOiBzdHJpbmcpID0+IHsKICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cmluZyk7CiAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7Cn07Ci0tLQoKPGFydGljbGUgY2xhc3M9Im1heC13LTR4bCBteC1hdXRvIHAtNCBiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy1zbSI+CiAgPGhlYWRlciBjbGFzcz0ibWItOCI+CiAgICA8aDEgY2xhc3M9InRleHQtM3hsIGZvbnQtYm9sZCBtYi0yIHRleHQtZ3JheS04MDAiPntob3d0by50aXRsZX08L2gxPgogICAgCiAgICA8ZGl2IGNsYXNzPSJmbGV4IGZsZXgtd3JhcCBnYXAtNCB0ZXh0LXNtIHRleHQtZ3JheS02MDAgbWItNCI+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPkRpZmZpY3VsdHk6PC9zcGFuPgogICAgICAgIDxzcGFuPntob3d0by5kaWZmaWN1bHR5X2xldmVsfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPlRpbWU6PC9zcGFuPgogICAgICAgIDxzcGFuPntob3d0by50aW1lfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPlZpZXdzOjwvc3Bhbj4KICAgICAgICA8c3Bhbj57aG93dG8udG90YWxfdmlld3N9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEiPgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LW1lZGl1bSI+RG93bmxvYWRzOjwvc3Bhbj4KICAgICAgICA8c3Bhbj57aG93dG8udG90YWxfZG93bmxvYWRzfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIAogICAgPHAgY2xhc3M9InRleHQtZ3JheS03MDAgd2hpdGVzcGFjZS1wcmUtbGluZSBiZy1ncmF5LTUwIHAtNCByb3VuZGVkLW1kIj57aG93dG8uZGVzY3JpcHRpb259PC9wPgogIDwvaGVhZGVyPgogIAogIHtob3d0by5jb3Zlcl9pbWFnZSAmJiAoCiAgICA8ZGl2IGNsYXNzPSJtYi04Ij4KICAgICAgPEltZyAKICAgICAgICBzcmM9e2hvd3RvLmNvdmVyX2ltYWdlLmRvd25sb2FkVXJsfSAKICAgICAgICBhbHQ9e2hvd3RvLnRpdGxlfSAKICAgICAgICBjbGFzcz0idy1mdWxsIGgtYXV0byByb3VuZGVkLWxnIHNoYWRvdy1tZCIKICAgICAgLz4KICAgIDwvZGl2PgogICl9CiAgCiAgPGRpdiBjbGFzcz0ic3BhY2UteS0xMiI+CiAgICB7aG93dG8uc3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKAogICAgICA8c2VjdGlvbiBjbGFzcz0iYm9yZGVyLXQgcHQtNiI+CiAgICAgICAgPGgyIGNsYXNzPSJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIG1iLTMgdGV4dC1ncmF5LTgwMCI+U3RlcCB7aW5kZXggKyAxfToge3N0ZXAudGl0bGV9PC9oMj4KICAgICAgICA8cCBjbGFzcz0ibWItNiB3aGl0ZXNwYWNlLXByZS1saW5lIHRleHQtZ3JheS03MDAiPntzdGVwLnRleHR9PC9wPgogICAgICAgIAogICAgICAgIHtzdGVwLmltYWdlcyAmJiBzdGVwLmltYWdlcy5sZW5ndGggPiAwICYmICgKICAgICAgICAgIDxkaXYgY2xhc3M9Im10LTQiPgogICAgICAgICAgICB7c3RlcC5pbWFnZXMubGVuZ3RoID09PSAxID8gKAogICAgICAgICAgICAgIDxJbWcgCiAgICAgICAgICAgICAgICBzcmM9e3N0ZXAuaW1hZ2VzWzBdLmRvd25sb2FkVXJsfSAKICAgICAgICAgICAgICAgIGFsdD17YFN0ZXAgJHtpbmRleCArIDF9OiAke3N0ZXAudGl0bGV9YH0gCiAgICAgICAgICAgICAgICBjbGFzcz0idy1mdWxsIGgtYXV0byByb3VuZGVkLWxnIHNoYWRvdy1zbSIKICAgICAgICAgICAgICAvPgogICAgICAgICAgICApIDogKAogICAgICAgICAgICAgIDxHYWxsZXJ5IAogICAgICAgICAgICAgICAgaW1hZ2VzPXtzdGVwLmltYWdlcy5tYXAoaW1nID0+ICh7CiAgICAgICAgICAgICAgICAgIHNyYzogaW1nLmRvd25sb2FkVXJsLAogICAgICAgICAgICAgICAgICBhbHQ6IGBTdGVwICR7aW5kZXggKyAxfTogJHtzdGVwLnRpdGxlfWAKICAgICAgICAgICAgICAgIH0pKX0gCiAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgICl9CiAgICAgIDwvc2VjdGlvbj4KICAgICkpfQogIDwvZGl2PgogIAogIDxmb290ZXIgY2xhc3M9Im10LTEyIHB0LTYgYm9yZGVyLXQgdGV4dC1ncmF5LTYwMCB0ZXh0LXNtIj4KICAgIDxkaXYgY2xhc3M9ImZsZXggZmxleC1jb2wgc206ZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGdhcC00Ij4KICAgICAgPGRpdj4KICAgICAgICA8cCBjbGFzcz0ibWItMSI+Q3JlYXRlZCBieTogPHNwYW4gY2xhc3M9ImZvbnQtbWVkaXVtIj57aG93dG8uX2NyZWF0ZWRCeX08L3NwYW4+PC9wPgogICAgICAgIDxwPkNyZWF0ZWQgb246IDxzcGFuIGNsYXNzPSJmb250LW1lZGl1bSI+e2Zvcm1hdERhdGUoaG93dG8uX2NyZWF0ZWQpfTwvc3Bhbj48L3A+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iYmctZ3JheS01MCBweS0yIHB4LTQgcm91bmRlZCB0ZXh0LWNlbnRlciI+CiAgICAgICAgPHAgY2xhc3M9ImZvbnQtbWVkaXVtIj57aG93dG8udm90ZWRVc2VmdWxCeS5sZW5ndGh9IHBlb3BsZSBmb3VuZCB0aGlzIHVzZWZ1bDwvcD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Zvb3Rlcj4KPC9hcnRpY2xlPgo="
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"timestamp": "2025-03-19T21:44:48.776Z",
|
||||||
|
"service": "collector:onFunctionCallResult"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": {
|
||||||
|
"file": {
|
||||||
|
"path": "../components/libary/howto.astro",
|
||||||
|
"content": "LS0tCi8vIEltcG9ydCByZXF1aXJlZCBjb21wb25lbnRzIGFuZCBpbnRlcmZhY2VzCmltcG9ydCB7IElIb3d0byB9IGZyb20gIkAvbW9kZWwvaG93dG8uanMiOwppbXBvcnQgeyBHYWxsZXJ5IH0gZnJvbSAiQHBvbHltZWNoL2FzdHJvLWJhc2UiOwppbXBvcnQgeyBJbWcgfSBmcm9tICdpbWFnZXRvb2xzL2NvbXBvbmVudHMnOwppbXBvcnQgVHJhbnNsYXRlIGZyb20gIkAvcG9seW1lY2gvYXN0cm8tYmFzZS9pMThuLmFzdHJvIjsKCi8vIERlZmluZSBwcm9wcyBpbnRlcmZhY2Ugd2l0aCBBc3RybyB0eXBpbmcKaW50ZXJmYWNlIFByb3BzIHsKICBob3d0bzogSUhvd3RvOwp9CgkvLyBHZXQgdGhlIGhvd3RvIGRhdGEgZnJvbSBwcm9wcwpjb25zdCB7IGhvd3RvIH0gPSBBc3Ryby5wcm9wczsKLS0tCgo8ZGl2IGNsYXNzPSJob3d0by1jb250YWluZXIgbWF4LXctNHhsIG14LWF1dG8gcC00Ij4KICA8IS0tIEhlYWRlciBzZWN0aW9uIC0tPgogIDxoZWFkZXIgY2xhc3M9Im1iLTgiPgogICAgPGgxIGNsYXNzPSJ0ZXh0LTN4bCBmb250LWJvbGQgbWItMiI+CiAgICAgIDxUcmFuc2xhdGU+e2hvd3RvLnRpdGxlfTwvVHJhbnNsYXRlPgogICAgPC9oMT4KICAgIAogICAgPCEtLSBDb3ZlciBpbWFnZSAtLT4KICAgIDxkaXYgY2xhc3M9Im1iLTQiPgogICAgICA8SW1nIAogICAgICAgIHNyYz17aG93dG8uY292ZXJfaW1hZ2UuZG93bmxvYWRVcmx9IAogICAgICAgIGF0dHJpYnV0ZXM9e3sKICAgICAgICAgIGltZzogeyBjbGFzczogInctZnVsbCBoLTY0IG9iamVjdC1jb3ZlciByb3VuZGVkLWxnIiB9CiAgICAgICAgfX0KICAgICAgLz4KICAgIDwvZGl2PgogICAgCiAgICA8IS0tIE1ldGFkYXRhIC0tPgogICAgPGRpdiBjbGFzcz0iZmxleCBmbGV4LXdyYXAgZ2FwLTQgbWItNCB0ZXh0LXNtIHRleHQtZ3JheS02MDAiPgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5EaWZmaWN1bHR5Ojwvc3Bhbj4gCiAgICAgICAgPFRyYW5zbGF0ZT57aG93dG8uZGlmZmljdWx0eV9sZXZlbH08L1RyYW5zbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPHNwYW4gY2xhc3M9ImZvbnQtc2VtaWJvbGQiPlRpbWU6PC9zcGFuPiAKICAgICAgICA8VHJhbnNsYXRlPntob3d0by50aW1lfTwvVHJhbnNsYXRlPgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1zZW1pYm9sZCI+Vmlld3M6PC9zcGFuPiB7aG93dG8udG90YWxfdmlld3N9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5DcmVhdGVkIGJ5Ojwvc3Bhbj4ge2hvd3RvLl9jcmVhdGVkQnl9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5Db3VudHJ5Ojwvc3Bhbj4ge2hvd3RvLmNyZWF0b3JDb3VudHJ5fQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgCiAgICA8IS0tIERlc2NyaXB0aW9uIC0tPgogICAgPGRpdiBjbGFzcz0iYmctZ3JheS01MCBwLTQgcm91bmRlZC1sZyI+CiAgICAgIDxwIGNsYXNzPSJ3aGl0ZXNwYWNlLXByZS1saW5lIj4KICAgICAgICA8VHJhbnNsYXRlPntob3d0by5kZXNjcmlwdGlvbn08L1RyYW5zbGF0ZT4KICAgICAgPC9wPgogICAgPC9kaXY+CiAgPC9oZWFkZXI+CiAgCiAgPCEtLSBTdGVwcyAtLT4KICA8ZGl2IGNsYXNzPSJzdGVwcy1jb250YWluZXIgc3BhY2UteS0xMiI+CiAgICB7aG93dG8uc3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKAogICAgICA8ZGl2IGNsYXNzPSJzdGVwLWl0ZW0iIGlkPXtgc3RlcC0ke2luZGV4ICsgMX1gfT4KICAgICAgICA8aDIgY2xhc3M9InRleHQtMnhsIGZvbnQtc2VtaWJvbGQgbWItNCI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5saW5lLWJsb2NrIGJnLWJsdWUtNTAwIHRleHQtd2hpdGUgdy04IGgtOCByb3VuZGVkLWZ1bGwgdGV4dC1jZW50ZXIgbGVhZGluZy04IG1yLTIiPgogICAgICAgICAgICB7aW5kZXggKyAxfQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPFRyYW5zbGF0ZT57c3RlcC50aXRsZX08L1RyYW5zbGF0ZT4KICAgICAgICA8L2gyPgogICAgICAgIAogICAgICAgIDwhLS0gU3RlcCBjb250ZW50IC0tPgogICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtY29udGVudCBtYi02Ij4KICAgICAgICAgIDxwIGNsYXNzPSJ3aGl0ZXNwYWNlLXByZS1saW5lIG1iLTQiPgogICAgICAgICAgICA8VHJhbnNsYXRlPntzdGVwLnRleHR9PC9UcmFuc2xhdGU+CiAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPCEtLSBTdGVwIGltYWdlcyAtLT4KICAgICAgICB7c3RlcC5pbWFnZXMgJiYgc3RlcC5pbWFnZXMubGVuZ3RoID4gMCAmJiAoCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWltYWdlcyI+CiAgICAgICAgICAgIDxHYWxsZXJ5IGltYWdlcz17c3RlcC5pbWFnZXMubWFwKGltZyA9PiAoewogICAgICAgICAgICAgIHNyYzogaW1nLmRvd25sb2FkVXJsLAogICAgICAgICAgICAgIGFsdDogYEltYWdlIGZvciBzdGVwICR7aW5kZXggKyAxfTogJHtzdGVwLnRpdGxlfWAKICAgICAgICAgICAgfSkpfSAvPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgKX0KICAgICAgPC9kaXY+CiAgICApKX0KICA8L2Rpdj4KICA8IS0tIEZvb3RlciBpbmZvcm1hdGlvbiAtLT4KICA8Zm9vdGVyIGNsYXNzPSJtdC0xMiBwdC02IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCI+CiAgICA8ZGl2IGNsYXNzPSJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIiPgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIHRleHQtZ3JheS01MDAiPgogICAgICAgICAgPFRyYW5zbGF0ZT5DcmVhdGVkPC9UcmFuc2xhdGU+OiB7bmV3IERhdGUoaG93dG8uX2NyZWF0ZWQpLnRvTG9jYWxlRGF0ZVN0cmluZygpfQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRleHQtc20gdGV4dC1ncmF5LTUwMCI+CiAgICAgICAgPHNwYW4+CiAgICAgICAgICA8VHJhbnNsYXRlPkZvdW5kIHVzZWZ1bCBieTwvVHJhbnNsYXRlPjoge2hvd3RvLnZvdGVkVXNlZnVsQnkubGVuZ3RofSA8VHJhbnNsYXRlPnBlb3BsZTwvVHJhbnNsYXRlPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Zvb3Rlcj4KPC9kaXY+"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"timestamp": "2025-03-19T21:52:18.660Z",
|
||||||
|
"service": "collector:onFunctionCallResult"
|
||||||
|
}
|
||||||
|
]
|
||||||
56
src/model/.kbot/tool-call.json
Normal file
56
src/model/.kbot/tool-call.json
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": {
|
||||||
|
"name": "write_file",
|
||||||
|
"arguments": {
|
||||||
|
"file": {
|
||||||
|
"path": "../components/libary/howto.astro",
|
||||||
|
"content": "LS0tCmludGVyZmFjZSBQcm9wcyB7CiAgaG93dG86IElIb3d0bwp9Cgpjb25zdCB7IGhvd3RvIH0gPSBBc3Ryby5wcm9wczsKCmltcG9ydCB7IEltZyB9IGZyb20gJ2ltYWdldG9vbHMvY29tcG9uZW50cycKaW1wb3J0IEdhbGxlcnlLIGZyb20gJ0Bwb2x5bWVjaC9jb21wb25lbnRzL0dhbGxlcnkuYXN0cm8nCi0tLQo8YXJ0aWNsZSBjbGFzcz0ibWF4LXctNHhsIG14LWF1dG8gcHktOCBweC00Ij4KICA8aGVhZGVyIGNsYXNzPSJtYi04Ij4KICAgIDxoMSBjbGFzcz0idGV4dC0zeGwgZm9udC1ib2xkIG1iLTQiPnt7IGhvd3RvLnRpdGxlIH19PC9oMT4KICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTQgbWItNCI+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj5CeSB7eyBob3d0by5fY3JlYXRlZEJ5IH19PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+4oCiPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+RGlmZmljdWx0eTogeyB7IGhvd3RvLmRpZmZpY3VsdHlfbGV2ZWwgfX08L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj7igKI8L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj5UaW1lOiB7eyBob3d0by50aW1lIH19PC9zcGFuPgogICAgPC9kaXY+CiAgICA8SW1nIHNyYz17aG93dG8uY292ZXJfaW1hZ2UuZG93bmxvYWRVcmx9IGFsdD17aG93dG8udGl0bGV9IGNsYXNzPSJ3LWZ1bGwgaC02NCBvYmplY3QtY292ZXIgcm91bmRlZC1sZyBtYi00Ii8+CiAgICA8cCBjbGFzcz0idGV4dC1sZyB0ZXh0LWdyYXktNzAwIj57eyBob3d0by5kZXNjcmlwdGlvbiB9fTwvcD4KICA8L2hlYWRlcj4KCiAgPGRpdiBjbGFzcz0ic3BhY2UteS0xMCI+CiAgICB7eyBob3d0by5zdGVwcy5tYXAoKHN0ZXAsIGluZGV4KSA9PiAoCiAgICAgIDxzZWN0aW9uIGtleT17c3RlcC5fYW5pbWF0aW9uS2V5fSBjbGFzcz0iYm9yZGVyLWwgYm9yZGVyLWdyYXktMjAwIHBsLTQiPgogICAgICAgIDxoMiBjbGFzcz0idGV4dC14bCBmb250LWJvbGQgbWItMyI+U3RlcCB7eyBpbmRleCArIDEgfX06IHt7IHN0ZXAudGl0bGUgfX08L2gyPgogICAgICAgIDxwIGNsYXNzPSJtYi00Ij57eyBzdGVwLnRleHQgfX08L3A+CiAgICAgICAgeyMgaWYgc3RlcC5pbWFnZXM/Lmxlbmd0aCB9fQogICAgICAgICAgPEdhbGxlcnlLCgogICAgICAgICAgICBpbWFnZXM9e3N0ZXAuaW1hZ2VzLm1hcChpbWcgPT4gKHsKICAgICAgICAgICAgICBzcmM6IGltZy5kb3dubG9hZFVybCwKICAgICAgICAgICAgICBhbHQ6IGAke2hvd3RvLnRpdGxlfSAtICR7c3RlcC50aXRsZX1gCiAgICAgICAgICAgIH0pKX0KICAgICAgICAgICAgY2xhc3M9Im10LTQgcm91bmRlZC1sZyIKICAgICAgICAgIC8+CiAgICAgICAgeyMvIGlmIH0KICAgICAgPC9zZWN0aW9uPgogICAgKSkgfX0KICA8L2Rpdj4KCiAgPGZvb3RlciBjbGFzcz0ibXQtOCBwdC04IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCI+CiAgICA8ZGl2IGNsYXNzPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC00Ij4KICAgICAgPHNwYW4gY2xhc3M9InRleHQtc20iPnt7IGhvd3RvLnRvdGFsX3ZpZXdzIH19IHZpZXdzPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+4oCiPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+eyB7IGhvd3RvLnZvdGVkVXNlZnVsQnkubGVuZ3RoIH19IGZvdW5kIHVzZWZ1bDwvc3Bhbj4KICAgIDwvZGl2PgogIDwvZm9vdGVyPgo8L2FydGljbGU+Cg=="
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"parsed_arguments": null,
|
||||||
|
"timestamp": "2025-03-19T21:39:45.998Z",
|
||||||
|
"sessionId": "1742420336274",
|
||||||
|
"prompt": "./prompt.md"
|
||||||
|
},
|
||||||
|
"timestamp": "2025-03-19T21:39:45.999Z",
|
||||||
|
"service": "collector:onToolCall"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": {
|
||||||
|
"name": "write_file",
|
||||||
|
"arguments": {
|
||||||
|
"file": {
|
||||||
|
"path": "../components/libary/howto.astro",
|
||||||
|
"content": "LS0tCmltcG9ydCB7IEltZyB9IGZyb20gJ2ltYWdldG9vbHMvY29tcG9uZW50cyc7CmltcG9ydCB7IEdhbGxlcnkgfSBmcm9tICJAcG9seW1lY2gvY29tcG9uZW50cy9HYWxsZXJ5LmFzdHJvIjsKaW1wb3J0IHsgSUhvd3RvIH0gZnJvbSAiQC9tb2RlbC9ob3d0by5qcyI7CgppbnRlcmZhY2UgUHJvcHMgewogIGhvd3RvOiBJSG93dG87Cn0KCmNvbnN0IHsgaG93dG8gfSA9IEFzdHJvLnByb3BzOwoKY29uc3QgZm9ybWF0RGF0ZSA9IChkYXRlU3RyaW5nOiBzdHJpbmcpID0+IHsKICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cmluZyk7CiAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7Cn07Ci0tLQoKPGFydGljbGUgY2xhc3M9Im1heC13LTR4bCBteC1hdXRvIHAtNCBiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy1zbSI+CiAgPGhlYWRlciBjbGFzcz0ibWItOCI+CiAgICA8aDEgY2xhc3M9InRleHQtM3hsIGZvbnQtYm9sZCBtYi0yIHRleHQtZ3JheS04MDAiPntob3d0by50aXRsZX08L2gxPgogICAgCiAgICA8ZGl2IGNsYXNzPSJmbGV4IGZsZXgtd3JhcCBnYXAtNCB0ZXh0LXNtIHRleHQtZ3JheS02MDAgbWItNCI+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPkRpZmZpY3VsdHk6PC9zcGFuPgogICAgICAgIDxzcGFuPntob3d0by5kaWZmaWN1bHR5X2xldmVsfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPlRpbWU6PC9zcGFuPgogICAgICAgIDxzcGFuPntob3d0by50aW1lfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPlZpZXdzOjwvc3Bhbj4KICAgICAgICA8c3Bhbj57aG93dG8udG90YWxfdmlld3N9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEiPgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LW1lZGl1bSI+RG93bmxvYWRzOjwvc3Bhbj4KICAgICAgICA8c3Bhbj57aG93dG8udG90YWxfZG93bmxvYWRzfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIAogICAgPHAgY2xhc3M9InRleHQtZ3JheS03MDAgd2hpdGVzcGFjZS1wcmUtbGluZSBiZy1ncmF5LTUwIHAtNCByb3VuZGVkLW1kIj57aG93dG8uZGVzY3JpcHRpb259PC9wPgogIDwvaGVhZGVyPgogIAogIHtob3d0by5jb3Zlcl9pbWFnZSAmJiAoCiAgICA8ZGl2IGNsYXNzPSJtYi04Ij4KICAgICAgPEltZyAKICAgICAgICBzcmM9e2hvd3RvLmNvdmVyX2ltYWdlLmRvd25sb2FkVXJsfSAKICAgICAgICBhbHQ9e2hvd3RvLnRpdGxlfSAKICAgICAgICBjbGFzcz0idy1mdWxsIGgtYXV0byByb3VuZGVkLWxnIHNoYWRvdy1tZCIKICAgICAgLz4KICAgIDwvZGl2PgogICl9CiAgCiAgPGRpdiBjbGFzcz0ic3BhY2UteS0xMiI+CiAgICB7aG93dG8uc3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKAogICAgICA8c2VjdGlvbiBjbGFzcz0iYm9yZGVyLXQgcHQtNiI+CiAgICAgICAgPGgyIGNsYXNzPSJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIG1iLTMgdGV4dC1ncmF5LTgwMCI+U3RlcCB7aW5kZXggKyAxfToge3N0ZXAudGl0bGV9PC9oMj4KICAgICAgICA8cCBjbGFzcz0ibWItNiB3aGl0ZXNwYWNlLXByZS1saW5lIHRleHQtZ3JheS03MDAiPntzdGVwLnRleHR9PC9wPgogICAgICAgIAogICAgICAgIHtzdGVwLmltYWdlcyAmJiBzdGVwLmltYWdlcy5sZW5ndGggPiAwICYmICgKICAgICAgICAgIDxkaXYgY2xhc3M9Im10LTQiPgogICAgICAgICAgICB7c3RlcC5pbWFnZXMubGVuZ3RoID09PSAxID8gKAogICAgICAgICAgICAgIDxJbWcgCiAgICAgICAgICAgICAgICBzcmM9e3N0ZXAuaW1hZ2VzWzBdLmRvd25sb2FkVXJsfSAKICAgICAgICAgICAgICAgIGFsdD17YFN0ZXAgJHtpbmRleCArIDF9OiAke3N0ZXAudGl0bGV9YH0gCiAgICAgICAgICAgICAgICBjbGFzcz0idy1mdWxsIGgtYXV0byByb3VuZGVkLWxnIHNoYWRvdy1zbSIKICAgICAgICAgICAgICAvPgogICAgICAgICAgICApIDogKAogICAgICAgICAgICAgIDxHYWxsZXJ5IAogICAgICAgICAgICAgICAgaW1hZ2VzPXtzdGVwLmltYWdlcy5tYXAoaW1nID0+ICh7CiAgICAgICAgICAgICAgICAgIHNyYzogaW1nLmRvd25sb2FkVXJsLAogICAgICAgICAgICAgICAgICBhbHQ6IGBTdGVwICR7aW5kZXggKyAxfTogJHtzdGVwLnRpdGxlfWAKICAgICAgICAgICAgICAgIH0pKX0gCiAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgICl9CiAgICAgIDwvc2VjdGlvbj4KICAgICkpfQogIDwvZGl2PgogIAogIDxmb290ZXIgY2xhc3M9Im10LTEyIHB0LTYgYm9yZGVyLXQgdGV4dC1ncmF5LTYwMCB0ZXh0LXNtIj4KICAgIDxkaXYgY2xhc3M9ImZsZXggZmxleC1jb2wgc206ZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGdhcC00Ij4KICAgICAgPGRpdj4KICAgICAgICA8cCBjbGFzcz0ibWItMSI+Q3JlYXRlZCBieTogPHNwYW4gY2xhc3M9ImZvbnQtbWVkaXVtIj57aG93dG8uX2NyZWF0ZWRCeX08L3NwYW4+PC9wPgogICAgICAgIDxwPkNyZWF0ZWQgb246IDxzcGFuIGNsYXNzPSJmb250LW1lZGl1bSI+e2Zvcm1hdERhdGUoaG93dG8uX2NyZWF0ZWQpfTwvc3Bhbj48L3A+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iYmctZ3JheS01MCBweS0yIHB4LTQgcm91bmRlZCB0ZXh0LWNlbnRlciI+CiAgICAgICAgPHAgY2xhc3M9ImZvbnQtbWVkaXVtIj57aG93dG8udm90ZWRVc2VmdWxCeS5sZW5ndGh9IHBlb3BsZSBmb3VuZCB0aGlzIHVzZWZ1bDwvcD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Zvb3Rlcj4KPC9hcnRpY2xlPgo="
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"parsed_arguments": null,
|
||||||
|
"timestamp": "2025-03-19T21:44:48.766Z",
|
||||||
|
"sessionId": "1742420623820",
|
||||||
|
"prompt": "./prompt.md"
|
||||||
|
},
|
||||||
|
"timestamp": "2025-03-19T21:44:48.768Z",
|
||||||
|
"service": "collector:onToolCall"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "debug",
|
||||||
|
"message": {
|
||||||
|
"name": "write_file",
|
||||||
|
"arguments": {
|
||||||
|
"file": {
|
||||||
|
"path": "../components/libary/howto.astro",
|
||||||
|
"content": "LS0tCi8vIEltcG9ydCByZXF1aXJlZCBjb21wb25lbnRzIGFuZCBpbnRlcmZhY2VzCmltcG9ydCB7IElIb3d0byB9IGZyb20gIkAvbW9kZWwvaG93dG8uanMiOwppbXBvcnQgeyBHYWxsZXJ5IH0gZnJvbSAiQHBvbHltZWNoL2FzdHJvLWJhc2UiOwppbXBvcnQgeyBJbWcgfSBmcm9tICdpbWFnZXRvb2xzL2NvbXBvbmVudHMnOwppbXBvcnQgVHJhbnNsYXRlIGZyb20gIkAvcG9seW1lY2gvYXN0cm8tYmFzZS9pMThuLmFzdHJvIjsKCi8vIERlZmluZSBwcm9wcyBpbnRlcmZhY2Ugd2l0aCBBc3RybyB0eXBpbmcKaW50ZXJmYWNlIFByb3BzIHsKICBob3d0bzogSUhvd3RvOwp9CgkvLyBHZXQgdGhlIGhvd3RvIGRhdGEgZnJvbSBwcm9wcwpjb25zdCB7IGhvd3RvIH0gPSBBc3Ryby5wcm9wczsKLS0tCgo8ZGl2IGNsYXNzPSJob3d0by1jb250YWluZXIgbWF4LXctNHhsIG14LWF1dG8gcC00Ij4KICA8IS0tIEhlYWRlciBzZWN0aW9uIC0tPgogIDxoZWFkZXIgY2xhc3M9Im1iLTgiPgogICAgPGgxIGNsYXNzPSJ0ZXh0LTN4bCBmb250LWJvbGQgbWItMiI+CiAgICAgIDxUcmFuc2xhdGU+e2hvd3RvLnRpdGxlfTwvVHJhbnNsYXRlPgogICAgPC9oMT4KICAgIAogICAgPCEtLSBDb3ZlciBpbWFnZSAtLT4KICAgIDxkaXYgY2xhc3M9Im1iLTQiPgogICAgICA8SW1nIAogICAgICAgIHNyYz17aG93dG8uY292ZXJfaW1hZ2UuZG93bmxvYWRVcmx9IAogICAgICAgIGF0dHJpYnV0ZXM9e3sKICAgICAgICAgIGltZzogeyBjbGFzczogInctZnVsbCBoLTY0IG9iamVjdC1jb3ZlciByb3VuZGVkLWxnIiB9CiAgICAgICAgfX0KICAgICAgLz4KICAgIDwvZGl2PgogICAgCiAgICA8IS0tIE1ldGFkYXRhIC0tPgogICAgPGRpdiBjbGFzcz0iZmxleCBmbGV4LXdyYXAgZ2FwLTQgbWItNCB0ZXh0LXNtIHRleHQtZ3JheS02MDAiPgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5EaWZmaWN1bHR5Ojwvc3Bhbj4gCiAgICAgICAgPFRyYW5zbGF0ZT57aG93dG8uZGlmZmljdWx0eV9sZXZlbH08L1RyYW5zbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPHNwYW4gY2xhc3M9ImZvbnQtc2VtaWJvbGQiPlRpbWU6PC9zcGFuPiAKICAgICAgICA8VHJhbnNsYXRlPntob3d0by50aW1lfTwvVHJhbnNsYXRlPgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1zZW1pYm9sZCI+Vmlld3M6PC9zcGFuPiB7aG93dG8udG90YWxfdmlld3N9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5DcmVhdGVkIGJ5Ojwvc3Bhbj4ge2hvd3RvLl9jcmVhdGVkQnl9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5Db3VudHJ5Ojwvc3Bhbj4ge2hvd3RvLmNyZWF0b3JDb3VudHJ5fQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgCiAgICA8IS0tIERlc2NyaXB0aW9uIC0tPgogICAgPGRpdiBjbGFzcz0iYmctZ3JheS01MCBwLTQgcm91bmRlZC1sZyI+CiAgICAgIDxwIGNsYXNzPSJ3aGl0ZXNwYWNlLXByZS1saW5lIj4KICAgICAgICA8VHJhbnNsYXRlPntob3d0by5kZXNjcmlwdGlvbn08L1RyYW5zbGF0ZT4KICAgICAgPC9wPgogICAgPC9kaXY+CiAgPC9oZWFkZXI+CiAgCiAgPCEtLSBTdGVwcyAtLT4KICA8ZGl2IGNsYXNzPSJzdGVwcy1jb250YWluZXIgc3BhY2UteS0xMiI+CiAgICB7aG93dG8uc3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKAogICAgICA8ZGl2IGNsYXNzPSJzdGVwLWl0ZW0iIGlkPXtgc3RlcC0ke2luZGV4ICsgMX1gfT4KICAgICAgICA8aDIgY2xhc3M9InRleHQtMnhsIGZvbnQtc2VtaWJvbGQgbWItNCI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5saW5lLWJsb2NrIGJnLWJsdWUtNTAwIHRleHQtd2hpdGUgdy04IGgtOCByb3VuZGVkLWZ1bGwgdGV4dC1jZW50ZXIgbGVhZGluZy04IG1yLTIiPgogICAgICAgICAgICB7aW5kZXggKyAxfQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPFRyYW5zbGF0ZT57c3RlcC50aXRsZX08L1RyYW5zbGF0ZT4KICAgICAgICA8L2gyPgogICAgICAgIAogICAgICAgIDwhLS0gU3RlcCBjb250ZW50IC0tPgogICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtY29udGVudCBtYi02Ij4KICAgICAgICAgIDxwIGNsYXNzPSJ3aGl0ZXNwYWNlLXByZS1saW5lIG1iLTQiPgogICAgICAgICAgICA8VHJhbnNsYXRlPntzdGVwLnRleHR9PC9UcmFuc2xhdGU+CiAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPCEtLSBTdGVwIGltYWdlcyAtLT4KICAgICAgICB7c3RlcC5pbWFnZXMgJiYgc3RlcC5pbWFnZXMubGVuZ3RoID4gMCAmJiAoCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWltYWdlcyI+CiAgICAgICAgICAgIDxHYWxsZXJ5IGltYWdlcz17c3RlcC5pbWFnZXMubWFwKGltZyA9PiAoewogICAgICAgICAgICAgIHNyYzogaW1nLmRvd25sb2FkVXJsLAogICAgICAgICAgICAgIGFsdDogYEltYWdlIGZvciBzdGVwICR7aW5kZXggKyAxfTogJHtzdGVwLnRpdGxlfWAKICAgICAgICAgICAgfSkpfSAvPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgKX0KICAgICAgPC9kaXY+CiAgICApKX0KICA8L2Rpdj4KICA8IS0tIEZvb3RlciBpbmZvcm1hdGlvbiAtLT4KICA8Zm9vdGVyIGNsYXNzPSJtdC0xMiBwdC02IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCI+CiAgICA8ZGl2IGNsYXNzPSJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIiPgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIHRleHQtZ3JheS01MDAiPgogICAgICAgICAgPFRyYW5zbGF0ZT5DcmVhdGVkPC9UcmFuc2xhdGU+OiB7bmV3IERhdGUoaG93dG8uX2NyZWF0ZWQpLnRvTG9jYWxlRGF0ZVN0cmluZygpfQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRleHQtc20gdGV4dC1ncmF5LTUwMCI+CiAgICAgICAgPHNwYW4+CiAgICAgICAgICA8VHJhbnNsYXRlPkZvdW5kIHVzZWZ1bCBieTwvVHJhbnNsYXRlPjoge2hvd3RvLnZvdGVkVXNlZnVsQnkubGVuZ3RofSA8VHJhbnNsYXRlPnBlb3BsZTwvVHJhbnNsYXRlPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Zvb3Rlcj4KPC9kaXY+"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"parsed_arguments": null,
|
||||||
|
"timestamp": "2025-03-19T21:52:18.651Z",
|
||||||
|
"sessionId": "1742421057357",
|
||||||
|
"prompt": "./prompt.md"
|
||||||
|
},
|
||||||
|
"timestamp": "2025-03-19T21:52:18.652Z",
|
||||||
|
"service": "collector:onToolCall"
|
||||||
|
}
|
||||||
|
]
|
||||||
187
src/model/howto.json
Normal file
187
src/model/howto.json
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
{
|
||||||
|
"_createdBy": "gus-merckel",
|
||||||
|
"mentions": [],
|
||||||
|
"_deleted": false,
|
||||||
|
"fileLink": "",
|
||||||
|
"slug": "cut-out-shapes-out-of-plastic-sheets-with-a-cnc-",
|
||||||
|
"_modified": "2023-10-27T18:09:36.519Z",
|
||||||
|
"previousSlugs": [
|
||||||
|
"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-"
|
||||||
|
],
|
||||||
|
"_created": "2023-08-23T18:20:09.098Z",
|
||||||
|
"description": "In this how to, I will show you our process to cut HDPE Sheets using a X-Carve CNC.\n\nHere is the full video in spanish with subtitles https://www.youtube.com/watch?v=4LrrFz802To ",
|
||||||
|
"votedUsefulBy": [
|
||||||
|
"sigolene",
|
||||||
|
"mattia",
|
||||||
|
"uillinoispreciousplastics"
|
||||||
|
],
|
||||||
|
"creatorCountry": "mx",
|
||||||
|
"total_downloads": 0,
|
||||||
|
"title": "Cut out shapes out of plastic sheets with a CNC ",
|
||||||
|
"time": "< 5 hours",
|
||||||
|
"files": [],
|
||||||
|
"difficulty_level": "Medium",
|
||||||
|
"_id": "038gjWgLjiyYknbEjDeI",
|
||||||
|
"tags": {
|
||||||
|
"RTCBJAFa05YBVVBy0KeO": true
|
||||||
|
},
|
||||||
|
"total_views": 232,
|
||||||
|
"_contentModifiedTimestamp": "2023-08-23T18:20:09.098Z",
|
||||||
|
"cover_image": {
|
||||||
|
"name": "IMG_20200605_142311.jpg",
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg",
|
||||||
|
"type": "image/jpeg",
|
||||||
|
"fullPath": "uploads/howtos/038gjWgLjiyYknbEjDeI/IMG_20200605_142311.jpg",
|
||||||
|
"updated": "2021-04-05T15:09:00.605Z",
|
||||||
|
"size": 124661,
|
||||||
|
"timeCreated": "2021-04-05T15:09:00.605Z",
|
||||||
|
"contentType": "image/jpeg"
|
||||||
|
},
|
||||||
|
"comments": [],
|
||||||
|
"moderatorFeedback": "",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"title": "Measure the plastic sheet",
|
||||||
|
"text": "For this step we need to measure our plastic sheet: Height, Width and Thickness. Our X-Carve machine works with the CAM Software EASEL, for me, the easiest software for CNC milling out there. \n\nThe cool thing about Easel (https://easel.inventables.com/) is that you can \"simulate\" your actual material and THEY EVEN HAVE HDPE 2-Colors in their cutting material lists!!\n\n\n",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/1.jpg",
|
||||||
|
"name": "1.jpg",
|
||||||
|
"size": 74095,
|
||||||
|
"type": "image/jpeg",
|
||||||
|
"timeCreated": "2021-03-26T19:42:05.766Z",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F1.jpg?alt=media&token=293d733d-05a5-494a-9340-47f4564f1939",
|
||||||
|
"updated": "2021-03-26T19:42:05.766Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"timeCreated": "2021-03-26T19:42:05.669Z",
|
||||||
|
"updated": "2021-03-26T19:42:05.669Z",
|
||||||
|
"size": 69665,
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F2.jpg?alt=media&token=004f50f1-97ac-4df4-9ba9-f463aa4cbca3",
|
||||||
|
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/2.jpg",
|
||||||
|
"name": "2.jpg",
|
||||||
|
"type": "image/jpeg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_animationKey": "unique1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Using the CNC clamps from the X-Carve, secure the sheet to the table, ",
|
||||||
|
"_animationKey": "unique2",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"updated": "2021-03-26T19:42:06.249Z",
|
||||||
|
"size": 55544,
|
||||||
|
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/3.jpg",
|
||||||
|
"timeCreated": "2021-03-26T19:42:06.249Z",
|
||||||
|
"name": "3.jpg",
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F3.jpg?alt=media&token=0b9c1914-1c75-429e-b34a-1e2b3706edef",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"type": "image/jpeg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Secure sheet "
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Choosing a file to cut ",
|
||||||
|
"text": "Now we go to our illustrator, such as Inkscape to design a vector file or download and open source one frome https://thenounproject.com/.\n\nWe download the SVG file, which is an open source vector format and import it to Easel. \n",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F4.jpg?alt=media&token=1cd2d49d-9335-4bb1-ac2a-e625322ca604",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"timeCreated": "2021-03-26T19:42:06.727Z",
|
||||||
|
"updated": "2021-03-26T19:42:06.727Z",
|
||||||
|
"name": "4.jpg",
|
||||||
|
"size": 42952,
|
||||||
|
"type": "image/jpeg",
|
||||||
|
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/4.jpg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": 69255,
|
||||||
|
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/5.jpg",
|
||||||
|
"updated": "2021-03-26T19:42:06.833Z",
|
||||||
|
"timeCreated": "2021-03-26T19:42:06.833Z",
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F5.jpg?alt=media&token=7cca786a-7d47-43bb-900b-b8d101c276b4",
|
||||||
|
"name": "5.jpg",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"type": "image/jpeg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_animationKey": "unique3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Now with the file we can choose the width we want to carve/cut and then we go to cut and start the wizzard:\n- We check that the sheet is fixed.\n- We also specify the cutting bit, we are using a 1/8 flat flute bit. \n- We tell the machine where the coordinate 0-0 is, which we always choose as the down left corner.\n- We raise the bit, turn on the Router!!!\n\nAND PUM THE MAGIC BEGINS!!",
|
||||||
|
"title": "Follow the cutting Wizzard",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"timeCreated": "2021-03-26T19:42:07.493Z",
|
||||||
|
"size": 72226,
|
||||||
|
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/6.jpg",
|
||||||
|
"updated": "2021-03-26T19:42:07.493Z",
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F6.jpg?alt=media&token=ba7195dd-7771-435f-a188-057457697332",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"type": "image/jpeg",
|
||||||
|
"name": "6.jpg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/7.jpg",
|
||||||
|
"size": 52424,
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F7.jpg?alt=media&token=a3d5820c-cfe2-484e-8f76-f861ab8b756d",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"type": "image/jpeg",
|
||||||
|
"timeCreated": "2021-03-26T19:42:07.308Z",
|
||||||
|
"updated": "2021-03-26T19:42:07.308Z",
|
||||||
|
"name": "7.jpg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/8.jpg",
|
||||||
|
"name": "8.jpg",
|
||||||
|
"type": "image/jpeg",
|
||||||
|
"timeCreated": "2021-03-26T19:42:07.346Z",
|
||||||
|
"size": 55264,
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F8.jpg?alt=media&token=1c9816d7-3a99-4f41-8d3c-acc2670240f6",
|
||||||
|
"updated": "2021-03-26T19:42:07.346Z"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_animationKey": "uniquenisc2v"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "You take now your glasses or object and postprocess them and of course show it to your friends, family and so on.\n\n\n",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/9.jpg",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"timeCreated": "2021-03-26T19:42:08.147Z",
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F9.jpg?alt=media&token=4dcfe37d-e1ad-41e5-a590-40b4c37c5e1a",
|
||||||
|
"name": "9.jpg",
|
||||||
|
"updated": "2021-03-26T19:42:08.147Z",
|
||||||
|
"type": "image/jpeg",
|
||||||
|
"size": 82214
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_animationKey": "uniquesgl34",
|
||||||
|
"title": "Post-production and show case"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_animationKey": "uniquem4y0yi",
|
||||||
|
"title": "Hack it and try it yourself",
|
||||||
|
"text": "You can try this project with other types of CNC machines, even manual Routers or manual saw, as I did on this video: https://youtu.be/gxkcffQD3eQ, but the important thing is that you share what you do and help this community to grow!!!\n\nShare your ideas and comments!",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"timeCreated": "2021-04-05T15:09:01.445Z",
|
||||||
|
"fullPath": "uploads/howtos/038gjWgLjiyYknbEjDeI/IMG_20200605_142311.jpg",
|
||||||
|
"type": "image/jpeg",
|
||||||
|
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg?alt=media&token=f94152ff-f923-4054-a3ad-d8ec588856fa",
|
||||||
|
"size": 124661,
|
||||||
|
"updated": "2021-04-05T15:09:01.445Z",
|
||||||
|
"name": "IMG_20200605_142311.jpg"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"moderation": "accepted"
|
||||||
|
}
|
||||||
7
src/model/howto.sh
Normal file
7
src/model/howto.sh
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
kbotd --preferences ./todos-howto.md \
|
||||||
|
--include=./howto.ts \
|
||||||
|
--include=./howto.json \
|
||||||
|
--disable=terminal,git,npm,user,interact,search,email,web \
|
||||||
|
--disableTools=read_file,read_files,list_files,file_exists,web \
|
||||||
|
--model=anthropic/claude-3.7-sonnet:thinking
|
||||||
|
|
||||||
63
src/model/howto.ts
Normal file
63
src/model/howto.ts
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
|
||||||
|
export interface IHowto {
|
||||||
|
_createdBy: string
|
||||||
|
mentions: any[]
|
||||||
|
_deleted: boolean
|
||||||
|
fileLink: string
|
||||||
|
slug: string
|
||||||
|
_modified: string
|
||||||
|
previousSlugs: string[]
|
||||||
|
_created: string
|
||||||
|
description: string
|
||||||
|
votedUsefulBy: string[]
|
||||||
|
creatorCountry: string
|
||||||
|
total_downloads: number
|
||||||
|
title: string
|
||||||
|
time: string
|
||||||
|
files: any[]
|
||||||
|
difficulty_level: string
|
||||||
|
_id: string
|
||||||
|
tags?: Tags
|
||||||
|
total_views: number
|
||||||
|
_contentModifiedTimestamp: string
|
||||||
|
cover_image: CoverImage
|
||||||
|
comments: any[]
|
||||||
|
moderatorFeedback: string
|
||||||
|
steps: Step[]
|
||||||
|
moderation: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Tags {
|
||||||
|
[key: string]: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CoverImage {
|
||||||
|
name: string
|
||||||
|
downloadUrl: string
|
||||||
|
type: string
|
||||||
|
fullPath: string
|
||||||
|
updated: string
|
||||||
|
size: number
|
||||||
|
timeCreated: string
|
||||||
|
contentType: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Step {
|
||||||
|
title: string
|
||||||
|
text: string
|
||||||
|
images: Image[]
|
||||||
|
_animationKey: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Image {
|
||||||
|
updated: string
|
||||||
|
size: number
|
||||||
|
fullPath: string
|
||||||
|
timeCreated: string
|
||||||
|
name: string
|
||||||
|
downloadUrl: string
|
||||||
|
contentType: string
|
||||||
|
type: string
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
15
src/model/todos-howto.md
Normal file
15
src/model/todos-howto.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
## Todos
|
||||||
|
|
||||||
|
- skip checked
|
||||||
|
- for Astro, tailwind
|
||||||
|
- no react or additional dependencies
|
||||||
|
- for images, use import { Gallery } from "@polymech/astro-base", eg: <Gallery images={item.assets.gallery} /> whereby image:src,alt. Single images are handled there as well
|
||||||
|
- for single images, use import { Img } from 'imagetools/components', <Img src="..."> wherby classes can be added as follows:
|
||||||
|
attributes={{
|
||||||
|
img: { class: "classes ..." }
|
||||||
|
}}
|
||||||
|
- IHowto: import { IHowto } from "@/model/howto.js"
|
||||||
|
- For text, use <Translate>{text}</Translate> (import { i18n as Translate } from "@polymech/astro-base")
|
||||||
|
- use default sample data if needed
|
||||||
|
|
||||||
|
- [ ] create minimal Astro component for the given interface ("IHowto") and sample data ../components/libary/howto.astro
|
||||||
31
src/pages/tests/assets.astro
Normal file
31
src/pages/tests/assets.astro
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
import path from "node:path"
|
||||||
|
import BaseLayout from "@/layouts/BaseLayout.astro"
|
||||||
|
import Wrapper from "@/components/containers/Wrapper.astro"
|
||||||
|
import { Img, Picture } from "imagetools/components"
|
||||||
|
import { getCollection } from "astro:content"
|
||||||
|
import KBot from "@/components/polymech/kbot.astro"
|
||||||
|
import Image from "@/components/polymech/image.astro"
|
||||||
|
const locale = Astro.currentLocale
|
||||||
|
const store = `${locale}/store/`
|
||||||
|
const src = `./public/products/overview-3.jpg`
|
||||||
|
const abs = path.resolve(src)
|
||||||
|
---
|
||||||
|
|
||||||
|
<BaseLayout>
|
||||||
|
<Wrapper variant="standard" class="py-4">
|
||||||
|
<section>
|
||||||
|
<div class="py-2 space-y-2">
|
||||||
|
<div class="grid md:grid-cols-1 lg:grid-cols-1 gap-4" >
|
||||||
|
<Image src={abs}
|
||||||
|
alt="Overview"
|
||||||
|
sizes={"(min-width: 1024px) 1024px, 1024vw"}
|
||||||
|
format={"png"}
|
||||||
|
breakpoints={[800,1200]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</Wrapper
|
||||||
|
></BaseLayout
|
||||||
|
>
|
||||||
7
src/pages/tests/components.astro
Normal file
7
src/pages/tests/components.astro
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
import { foo, i18n as Translate } from "@polymech/astro-base"
|
||||||
|
import Howto from "@/components/library/howto.astro"
|
||||||
|
import test from "@/model/howto.json"
|
||||||
|
---
|
||||||
|
<Translate language="es">Hallo</Translate>
|
||||||
|
<Howto howto={test} />
|
||||||
27
src/pages/tests/map.astro
Normal file
27
src/pages/tests/map.astro
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
import BaseLayout from "@/layouts/BaseLayout.astro"
|
||||||
|
import Wrapper from "@/components/containers/Wrapper.astro"
|
||||||
|
import { getCollection } from "astro:content"
|
||||||
|
import KBot from "@/components/polymech/kbot.astro"
|
||||||
|
const locale = Astro.currentLocale
|
||||||
|
const store = `${locale}/store/`
|
||||||
|
|
||||||
|
import Map from "@/components/polymech/map.astro"
|
||||||
|
|
||||||
|
const mapOptions = {
|
||||||
|
zoom: 9,
|
||||||
|
api_key: "AIzaSyCHsscCXksisHKMnUihOxl2X1mKny-qrqk"
|
||||||
|
}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<BaseLayout>
|
||||||
|
<Wrapper variant="standard" class="py-4">
|
||||||
|
<section>
|
||||||
|
<div class="py-2 space-y-2">
|
||||||
|
<Map options={mapOptions} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</Wrapper
|
||||||
|
></BaseLayout
|
||||||
|
>
|
||||||
38
src/pages/tests/overview.astro
Normal file
38
src/pages/tests/overview.astro
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
import BaseLayout from "@/layouts/BaseLayout.astro";
|
||||||
|
|
||||||
|
import Wrapper from "@/components/containers/Wrapper.astro";
|
||||||
|
import { getCollection } from "astro:content";
|
||||||
|
import KBot from "@/components/polymech/kbot.astro";
|
||||||
|
const allProducts = await getCollection("store");
|
||||||
|
const locale = Astro.currentLocale
|
||||||
|
const store = `${locale}/store/`
|
||||||
|
---
|
||||||
|
|
||||||
|
<BaseLayout>
|
||||||
|
<Wrapper variant="standard" class="py-4">
|
||||||
|
<section>
|
||||||
|
<div class="py-2 space-y-2">
|
||||||
|
<div class="grid md:grid-cols-1 lg:grid-cols-1 gap-4" >
|
||||||
|
<KBot template="research" filters="code" cache dst="./temp/software.md">
|
||||||
|
Summarize the following packages, as markdown, add a table
|
||||||
|
https://git.polymech.io/osr-plastic/osr-cad
|
||||||
|
https://git.polymech.io/osr-plastic/osr-code-bot
|
||||||
|
</KBot>
|
||||||
|
|
||||||
|
<KBot template="research" filters="code" cache dst="./temp/forum.md">
|
||||||
|
Top posts, as markdown, add a table, with links and image preview
|
||||||
|
https://forum.osr-plastic.org/
|
||||||
|
</KBot>
|
||||||
|
|
||||||
|
<KBot template="research" filters="code" cache dst="./temp/kbot.md">
|
||||||
|
Short summary, as markdown
|
||||||
|
https://www.npmjs.com/package/@plastichub/kbot
|
||||||
|
</KBot>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</Wrapper
|
||||||
|
></BaseLayout
|
||||||
|
>
|
||||||
Loading…
Reference in New Issue
Block a user