@happyvertical/smrt-products 0.36.8 → 0.37.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/chunks/{ProductForm-BLRguem5.js → ProductForm-CU0UvKEF.js} +3 -90
- package/dist/lib/chunks/ProductForm-CU0UvKEF.js.map +1 -0
- package/dist/lib/components.js +1 -1
- package/dist/lib/index.js +1 -1
- package/dist/lib/lib/i18n.js +93 -0
- package/dist/lib/lib/i18n.js.map +1 -0
- package/dist/lib/manifest.json +80 -23
- package/dist/lib/smrt-knowledge.json +8 -5
- package/package.json +8 -8
- package/dist/lib/chunks/ProductForm-BLRguem5.js.map +0 -1
|
@@ -2,7 +2,8 @@ import "svelte/internal/disclose-version";
|
|
|
2
2
|
import * as $ from "svelte/internal/client";
|
|
3
3
|
import { Button } from "@happyvertical/smrt-ui/ui";
|
|
4
4
|
import { Form, Input, Textarea } from "@happyvertical/smrt-ui/forms";
|
|
5
|
-
import {
|
|
5
|
+
import { useI18n } from "@happyvertical/smrt-ui/i18n";
|
|
6
|
+
import { M } from "../lib/i18n.js";
|
|
6
7
|
var root_1$1 = $.from_html(`<div class="product-manufacturer svelte-11ja2cl"> </div>`);
|
|
7
8
|
var root_2$1 = $.from_html(`<div class="product-model svelte-11ja2cl"> </div>`);
|
|
8
9
|
var root_3$1 = $.from_html(`<p class="product-description svelte-11ja2cl"> </p>`);
|
|
@@ -137,94 +138,6 @@ function ProductCard($$anchor, $$props) {
|
|
|
137
138
|
$.append($$anchor, div);
|
|
138
139
|
$.pop();
|
|
139
140
|
}
|
|
140
|
-
const M = defineMessages({
|
|
141
|
-
// App
|
|
142
|
-
"products.app.categories_coming_soon": "Category management coming soon...",
|
|
143
|
-
"products.app.analytics_coming_soon": "Analytics dashboard coming soon...",
|
|
144
|
-
// AppLayout
|
|
145
|
-
"products.app_layout.service_title": "Product Service",
|
|
146
|
-
"products.app_layout.footer_copyright": "2024 SMRT Product Service - Auto-generated with ❤️",
|
|
147
|
-
"products.app_layout.api_docs": "API Docs",
|
|
148
|
-
"products.app_layout.mcp_tools": "MCP Tools",
|
|
149
|
-
// DemoPage
|
|
150
|
-
"products.demo_page.title": "SMRT Framework Demo",
|
|
151
|
-
"products.demo_page.subtitle": "Define Once, Consume Everywhere - Progressive Customization",
|
|
152
|
-
"products.demo_page.custom_components_tab": "Custom Components",
|
|
153
|
-
"products.demo_page.auto_generated_heading": "Auto-Generated UI from SMRT Object",
|
|
154
|
-
"products.demo_page.auto_generated_description": "This form is automatically generated from the Product class definition.\n The field types, labels, and validation rules are inferred from the TypeScript schema.",
|
|
155
|
-
"products.demo_page.generated_form_heading": "Generated Form",
|
|
156
|
-
"products.demo_page.auto_form_title": "Auto-Generated Product Form",
|
|
157
|
-
"products.demo_page.generated_display_heading": "Generated Display",
|
|
158
|
-
"products.demo_page.custom_components_heading": "Custom Components with SMRT Integration",
|
|
159
|
-
"products.demo_page.custom_components_description": "These are hand-crafted components that still leverage the SMRT data structure\n but provide custom UI/UX for specific business requirements.",
|
|
160
|
-
"products.demo_page.custom_form_heading": "Custom Form",
|
|
161
|
-
"products.demo_page.custom_display_heading": "Custom Display",
|
|
162
|
-
"products.demo_page.progressive_heading": "Progressive Customization",
|
|
163
|
-
"products.demo_page.progressive_description": "Start with auto-generated components, then progressively customize as needed.\n Both approaches use the same underlying SMRT Product model.",
|
|
164
|
-
"products.demo_page.feature_zero_config": "✅ Zero configuration",
|
|
165
|
-
"products.demo_page.feature_instant_ui": "✅ Instant UI from schema",
|
|
166
|
-
"products.demo_page.feature_type_safe": "✅ Type-safe by default",
|
|
167
|
-
"products.demo_page.feature_prototyping": "⚡ Perfect for prototyping",
|
|
168
|
-
"products.demo_page.custom_components_label": "🎨 Custom Components",
|
|
169
|
-
"products.demo_page.feature_tailored_ux": "✅ Tailored UX",
|
|
170
|
-
"products.demo_page.feature_business_workflows": "✅ Business-specific workflows",
|
|
171
|
-
"products.demo_page.feature_advanced_interactions": "✅ Advanced interactions",
|
|
172
|
-
"products.demo_page.simple_auto_form_title": "Auto Form",
|
|
173
|
-
"products.demo_page.benefits_heading": "SMRT Framework Benefits",
|
|
174
|
-
"products.demo_page.benefit_define_once_label": "Define Once:",
|
|
175
|
-
"products.demo_page.benefit_define_once_text": "Product class with @smrt decorator",
|
|
176
|
-
"products.demo_page.benefit_auto_generate_label": "Auto-Generate:",
|
|
177
|
-
"products.demo_page.benefit_auto_generate_text": "REST APIs, MCP tools, TypeScript clients, default UI",
|
|
178
|
-
"products.demo_page.benefit_progressive_label": "Progressive Enhancement:",
|
|
179
|
-
"products.demo_page.benefit_progressive_text": "Start with defaults, customize as needed",
|
|
180
|
-
"products.demo_page.benefit_type_safety_label": "Type Safety:",
|
|
181
|
-
"products.demo_page.benefit_type_safety_text": "End-to-end TypeScript integration",
|
|
182
|
-
"products.demo_page.benefit_multiple_consumption_label": "Multiple Consumption:",
|
|
183
|
-
"products.demo_page.benefit_multiple_consumption_text": "Library, federation, standalone",
|
|
184
|
-
// ProductsPage
|
|
185
|
-
"products.products_page.description": "Manage your product catalog with auto-generated CRUD operations, \n real-time updates, and AI-powered tools via MCP.",
|
|
186
|
-
"products.products_page.auto_generated_text": "REST API endpoints automatically created from @smrt() decorated Product class",
|
|
187
|
-
"products.products_page.ai_ready_heading": "🤖 AI Ready",
|
|
188
|
-
"products.products_page.ai_ready_text": "MCP tools available for Claude and other AI models to interact with products",
|
|
189
|
-
"products.products_page.federatable_text": "Components can be consumed by other applications via module federation",
|
|
190
|
-
"products.products_page.library_text": "Install as NPM package: npm install @have/smrt-template",
|
|
191
|
-
// ProductForm
|
|
192
|
-
"products.product_form.name_label": "Product Name *",
|
|
193
|
-
"products.product_form.name_placeholder": "Enter product name",
|
|
194
|
-
"products.product_form.description_placeholder": "Product description (optional)",
|
|
195
|
-
"products.product_form.category_placeholder": "Product category",
|
|
196
|
-
"products.product_form.tags_placeholder": "tag1, tag2, tag3",
|
|
197
|
-
"products.product_form.tags_hint": "Separate tags with commas",
|
|
198
|
-
"products.product_form.in_stock_label": "In Stock",
|
|
199
|
-
// TestComponent
|
|
200
|
-
"products.test_component.title": "Test Component",
|
|
201
|
-
// AutoForm
|
|
202
|
-
"products.auto_form.subtitle": "Auto-generated from SMRT Product model",
|
|
203
|
-
"products.auto_form.debug_summary": "Form Data (Debug)",
|
|
204
|
-
// FieldRenderer
|
|
205
|
-
"products.field_renderer.array_hint": "Enter values separated by commas",
|
|
206
|
-
"products.field_renderer.object_hint": "Enter valid JSON",
|
|
207
|
-
// CategoryManager
|
|
208
|
-
"products.category_manager.title": "Category Manager",
|
|
209
|
-
"products.category_manager.subtitle": "Manage product categories",
|
|
210
|
-
"products.category_manager.coming_soon": "Category management feature coming soon...",
|
|
211
|
-
"products.category_manager.will_include": "This will include:",
|
|
212
|
-
"products.category_manager.create_edit": "Create and edit categories",
|
|
213
|
-
"products.category_manager.organize_hierarchy": "Organize category hierarchy",
|
|
214
|
-
"products.category_manager.manage_permissions": "Manage category permissions",
|
|
215
|
-
"products.category_manager.analytics": "Category analytics",
|
|
216
|
-
// ProductCatalog
|
|
217
|
-
"products.product_catalog.title": "Product Catalog",
|
|
218
|
-
"products.product_catalog.in_stock": "in stock",
|
|
219
|
-
"products.product_catalog.total_value": "Total value:",
|
|
220
|
-
"products.product_catalog.search_placeholder": "Search products...",
|
|
221
|
-
"products.product_catalog.all_categories": "All Categories",
|
|
222
|
-
"products.product_catalog.add_product": "Add Product",
|
|
223
|
-
"products.product_catalog.loading": "Loading products...",
|
|
224
|
-
"products.product_catalog.empty": "No products yet. Create your first product to get started!",
|
|
225
|
-
"products.product_catalog.create_first": "Create First Product",
|
|
226
|
-
"products.product_catalog.no_match": "No products match your search criteria."
|
|
227
|
-
});
|
|
228
141
|
var root_2 = $.from_html(`<span class="error-message svelte-1hh5ovx"> </span>`);
|
|
229
142
|
var root_3 = $.from_html(`<span class="error-message svelte-1hh5ovx"> </span>`);
|
|
230
143
|
var root_1 = $.from_html(`<div class="form-group svelte-1hh5ovx"><label for="name" class="svelte-1hh5ovx"> </label> <!> <!></div> <div class="form-group svelte-1hh5ovx"><label for="description" class="svelte-1hh5ovx">Description</label> <!></div> <div class="form-row svelte-1hh5ovx"><div class="form-group svelte-1hh5ovx"><label for="price" class="svelte-1hh5ovx">Price *</label> <!> <!></div> <div class="form-group svelte-1hh5ovx"><label for="category" class="svelte-1hh5ovx">Category</label> <!></div></div> <div class="form-group svelte-1hh5ovx"><label for="tags" class="svelte-1hh5ovx">Tags</label> <!> <small class="form-hint svelte-1hh5ovx"> </small></div> <div class="form-group svelte-1hh5ovx"><label class="checkbox-label svelte-1hh5ovx"><input type="checkbox" class="form-checkbox svelte-1hh5ovx"/> </label></div> <div class="form-actions svelte-1hh5ovx"><!> <!></div>`, 1);
|
|
@@ -514,4 +427,4 @@ export {
|
|
|
514
427
|
ProductCard as P,
|
|
515
428
|
ProductForm as a
|
|
516
429
|
};
|
|
517
|
-
//# sourceMappingURL=ProductForm-
|
|
430
|
+
//# sourceMappingURL=ProductForm-CU0UvKEF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductForm-CU0UvKEF.js","sources":["../../../src/lib/components/ProductCard.svelte","../../../src/lib/components/ProductForm.svelte"],"sourcesContent":["<script lang=\"ts\">\nimport { Button } from '@happyvertical/smrt-ui/ui';\nimport type { ProductData } from '../types';\n\ninterface Props {\n product: ProductData;\n onEdit?: (product: ProductData) => void;\n onDelete?: (id: string) => void;\n}\n\nconst { product, onEdit, onDelete }: Props = $props();\n</script>\n\n<div class=\"product-card\">\n <div class=\"product-header\">\n <h3 class=\"product-name\">{product.name}</h3>\n {#if product.manufacturer}\n <div class=\"product-manufacturer\">{product.manufacturer}</div>\n {/if}\n </div>\n\n {#if product.model}\n <div class=\"product-model\">Model: {product.model}</div>\n {/if}\n\n {#if product.description}\n <p class=\"product-description\">{product.description}</p>\n {/if}\n\n <div class=\"product-meta\">\n {#if product.category}\n <div class=\"product-category\">Category: {product.category}</div>\n {/if}\n \n {#if product.tags && product.tags.length > 0}\n <div class=\"product-tags\">\n {#each product.tags as tag}\n <span class=\"tag\">{tag}</span>\n {/each}\n </div>\n {/if}\n </div>\n \n <div class=\"product-actions\">\n {#if onEdit}\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onclick={() => onEdit?.(product)}>\n Edit\n </Button>\n {/if}\n\n {#if onDelete}\n <Button type=\"button\" variant=\"danger\" size=\"sm\" onclick={() => onDelete?.(product.id)}>\n Delete\n </Button>\n {/if}\n </div>\n</div>\n\n<style>\n .product-card {\n border: 1px solid var(--smrt-color-outline-variant, #e2e8f0);\n border-radius: var(--smrt-radius-md, 8px);\n padding: 1rem;\n background: var(--smrt-color-surface, #fff);\n box-shadow: var(--smrt-elevation-1, 0 1px 3px color-mix(in srgb, var(--smrt-color-shadow, #000) 10%, transparent));\n transition: box-shadow 0.2s;\n }\n\n .product-card:hover {\n box-shadow: var(--smrt-elevation-2, 0 4px 6px color-mix(in srgb, var(--smrt-color-shadow, #000) 10%, transparent));\n }\n \n .product-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 0.5rem;\n }\n \n .product-name {\n margin: 0;\n font-size: var(--smrt-typography-title-medium-size, 1.125rem);\n font-weight: var(--smrt-typography-weight-semibold, 600);\n color: var(--smrt-color-on-surface, #1f2937);\n }\n\n .product-manufacturer {\n font-size: var(--smrt-typography-title-small-size, 0.875rem);\n font-weight: var(--smrt-typography-weight-medium, 500);\n color: var(--smrt-color-on-surface-variant, #6b7280);\n }\n\n .product-model {\n font-size: var(--smrt-typography-body-medium-size, 0.875rem);\n color: var(--smrt-color-on-surface-variant, #6b7280);\n margin-bottom: 0.5rem;\n }\n\n .product-category {\n font-size: var(--smrt-typography-label-medium-size, 0.75rem);\n font-weight: var(--smrt-typography-weight-medium, 500);\n color: var(--smrt-color-on-surface, #374151);\n background: var(--smrt-color-surface-container, #f3f4f6);\n padding: 0.25rem 0.5rem;\n border-radius: var(--smrt-radius-sm, 4px);\n display: inline-block;\n margin-bottom: 0.5rem;\n }\n \n .product-description {\n margin: 0.5rem 0;\n color: var(--smrt-color-on-surface-variant, #6b7280);\n font-size: var(--smrt-typography-body-medium-size, 0.875rem);\n line-height: var(--smrt-typography-body-medium-line-height, 1.4);\n }\n \n .product-meta {\n margin: 0.75rem 0;\n }\n \n \n .product-tags {\n margin-top: 0.5rem;\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n }\n \n .tag {\n background: var(--smrt-color-surface-container, #f3f4f6);\n color: var(--smrt-color-on-surface, #374151);\n padding: 0.125rem 0.5rem;\n border-radius: var(--smrt-radius-full, 9999px);\n font-size: var(--smrt-typography-label-medium-size, 0.75rem);\n }\n\n .product-actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 1rem;\n padding-top: 0.75rem;\n border-top: 1px solid var(--smrt-color-outline-variant, #f3f4f6);\n }\n</style>","<script lang=\"ts\">\nimport { Form, Input, Textarea } from '@happyvertical/smrt-ui/forms';\nimport { useI18n } from '@happyvertical/smrt-ui/i18n';\nimport { Button } from '@happyvertical/smrt-ui/ui';\nimport { M } from '../i18n.js';\nimport type { ProductData } from '../types';\n\nconst { t } = useI18n();\n\ninterface Props {\n product?: Partial<ProductData>;\n onSubmit: (product: Partial<ProductData>) => void;\n onCancel?: () => void;\n loading?: boolean;\n}\n\nconst { product = {}, onSubmit, onCancel, loading = false }: Props = $props();\n\nconst formData = $state({\n name: product.name || '',\n description: product.description || '',\n price: product.price || 0,\n inStock: product.inStock ?? true,\n category: product.category || '',\n tags: product.tags?.join(', ') || '',\n});\n\nlet errors = $state<Record<string, string>>({});\n\nfunction validateForm() {\n errors = {};\n\n if (!formData.name.trim()) {\n errors.name = 'Product name is required';\n }\n\n if (formData.price < 0) {\n errors.price = 'Price must be non-negative';\n }\n\n return Object.keys(errors).length === 0;\n}\n\nfunction handleSubmit(event: Event) {\n event.preventDefault();\n\n if (!validateForm()) {\n return;\n }\n\n const productData: Partial<ProductData> = {\n ...product,\n name: formData.name.trim(),\n description: formData.description.trim() || undefined,\n price: formData.price,\n inStock: formData.inStock,\n category: formData.category.trim(),\n tags: formData.tags\n ? formData.tags\n .split(',')\n .map((tag) => tag.trim())\n .filter(Boolean)\n : [],\n };\n\n onSubmit(productData);\n}\n</script>\n\n<div class=\"product-form-shell\">\n <Form onsubmit={handleSubmit} class=\"product-form\">\n <div class=\"form-group\">\n <label for=\"name\">{t(M['products.product_form.name_label'])}</label>\n <Input\n id=\"name\"\n type=\"text\"\n bind:value={formData.name}\n disabled={loading}\n class={errors.name ? 'error' : ''}\n placeholder={t(M['products.product_form.name_placeholder'])}\n />\n {#if errors.name}\n <span class=\"error-message\">{errors.name}</span>\n {/if}\n </div>\n\n <div class=\"form-group\">\n <label for=\"description\">Description</label>\n <Textarea\n id=\"description\"\n bind:value={formData.description}\n disabled={loading}\n placeholder={t(M['products.product_form.description_placeholder'])}\n rows={3}\n ></Textarea>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label for=\"price\">Price *</label>\n <Input\n id=\"price\"\n type=\"number\"\n step=\"0.01\"\n min=\"0\"\n bind:value={formData.price}\n disabled={loading}\n class={errors.price ? 'error' : ''}\n placeholder=\"0.00\"\n />\n {#if errors.price}\n <span class=\"error-message\">{errors.price}</span>\n {/if}\n </div>\n\n <div class=\"form-group\">\n <label for=\"category\">Category</label>\n <Input\n id=\"category\"\n type=\"text\"\n bind:value={formData.category}\n disabled={loading}\n placeholder={t(M['products.product_form.category_placeholder'])}\n />\n </div>\n </div>\n\n <div class=\"form-group\">\n <label for=\"tags\">Tags</label>\n <Input\n id=\"tags\"\n type=\"text\"\n bind:value={formData.tags}\n disabled={loading}\n placeholder={t(M['products.product_form.tags_placeholder'])}\n />\n <small class=\"form-hint\">{t(M['products.product_form.tags_hint'])}</small>\n </div>\n\n <div class=\"form-group\">\n <label class=\"checkbox-label\">\n <!-- raw-primitive-allow: native checkbox; no Provider-free checkbox primitive (Toggle is a switch with different semantics, CheckboxInput requires a Provider) -->\n <input\n type=\"checkbox\"\n bind:checked={formData.inStock}\n disabled={loading}\n class=\"form-checkbox\"\n />\n {t(M['products.product_form.in_stock_label'])}\n </label>\n </div>\n\n <div class=\"form-actions\">\n {#if onCancel}\n <Button type=\"button\" variant=\"secondary\" onclick={onCancel} disabled={loading}>\n Cancel\n </Button>\n {/if}\n\n <Button type=\"submit\" variant=\"primary\" disabled={loading}>\n {#if loading}\n Saving...\n {:else}\n {product.id ? 'Update Product' : 'Create Product'}\n {/if}\n </Button>\n </div>\n </Form>\n</div>\n\n<style>\n .product-form-shell :global(.product-form) {\n max-width: 500px;\n padding: 1.5rem;\n background: var(--smrt-color-surface, #fff);\n border-radius: var(--smrt-radius-md, 8px);\n border: 1px solid var(--smrt-color-outline-variant, #e2e8f0);\n }\n\n .form-group {\n margin-bottom: 1rem;\n }\n\n .form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n }\n\n label {\n display: block;\n margin-bottom: 0.25rem;\n font-weight: var(--smrt-typography-weight-medium, 500);\n color: var(--smrt-color-on-surface, #374151);\n font-size: var(--smrt-typography-label-large-size, 0.875rem);\n }\n\n /* Error border on the migrated <Input>. The primitive renders the inner\n <input class=\"input error\"> inside its own component, so the scoped class\n can't reach it without :global (#1589). */\n .product-form-shell :global(.input.error) {\n border-color: var(--smrt-color-error, #dc2626);\n }\n\n .checkbox-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n }\n \n .form-checkbox {\n width: auto;\n }\n \n .form-hint {\n color: var(--smrt-color-on-surface-variant, #6b7280);\n font-size: var(--smrt-typography-body-small-size, 0.75rem);\n margin-top: 0.25rem;\n }\n\n .error-message {\n color: var(--smrt-color-error, #dc2626);\n font-size: var(--smrt-typography-label-medium-size, 0.75rem);\n margin-top: 0.25rem;\n display: block;\n }\n\n .form-actions {\n display: flex;\n gap: 0.75rem;\n justify-content: flex-end;\n margin-top: 1.5rem;\n padding-top: 1rem;\n border-top: 1px solid var(--smrt-color-outline-variant, #f3f4f6);\n }\n</style>"],"names":["root","root_1","root_2","root_3","$$anchor"],"mappings":";;;;;;;;;;;;;wCAAA;;MAaC,MAAGA,OAAA;AACD,MAAA,gBADF,GAAG;AAEC,MAAA,aADF,KAAG;qBACD,IAAE,IAAA;UAAF,EAAE;uBAAF,IAAE,CAAA;;;UAEA,QAAGC,SAAA;2BAAH,OAAG,IAAA;cAAH,KAAG;iEAAuC,YAAY,CAAA;0BAAtD,KAAG;AAAA;;0BADO,aAAY,UAAA,UAAA;AAAA;;UAF1B,KAAG;yBAAH,OAAG,CAAA;;;UAQD,QAAGC,SAAA;2BAAH,KAAG;cAAH,KAAG;2EAAuC,SAAK,EAAA,EAAA,CAAA;0BAA/C,KAAG;AAAA;;0BADO,MAAK,UAAA,YAAA;AAAA;;;;;UAKf,IAACC,SAAA;2BAAD,GAAC,IAAA;cAAD,CAAC;iEAAsC,WAAW,CAAA;0BAAlD,CAAC;AAAA;;0BADS,YAAW,UAAA,YAAA;AAAA;;MAIvB,QAAG,EAAA,QAAA,QAAA,CAAA;uBAAH,KAAG;;;UAEC,QAAG,OAAA;2BAAH,KAAG;cAAH,KAAG;8EAA6C,YAAQ,EAAA,EAAA,CAAA;0BAAxD,KAAG;AAAA;;0BADO,SAAQ,UAAA,YAAA;AAAA;;;;;UAKlB,QAAG,OAAA;aAAH,OAAG,IAAA,MAAA,QAAA,QACa,MAAI,EAAA,OAAA,CAAAC,WAAI,QAAG;YACvB,OAAI,OAAA;6BAAJ,MAAI,IAAA;gBAAJ,IAAI;yDAAc,GAAG,CAAA,CAAA;4BAArB,IAAI;AAAA;cAFR,KAAG;0BAAH,KAAG;AAAA;;AADO,UAAA,QAAA,QAAA,QAAI,QAAA,QAAY,KAAK,SAAS,EAAC,UAAA,YAAA;AAAA;;UAL7C,KAAG;AAcH,MAAA,kBAdA,OAAG,CAAA;uBAcH,KAAG;;;AAEC,aAAMA,WAAA;AAAA;;;;;;;;;;;;;;;;;;;AAMN,aAAMA,WAAA;AAAA;;;0DAA4E,EAAE;AAAA;;;;;;;;;;;;UARxF,KAAG;UA9BL,GAAG;2DAEkC,IAAI,CAAA;qBAFzC,GAAG;;AAFI;;;;;wCCXR;;AAOQ,QAAA,EAAA,EAAC,IAAK,QAAO;QASb,UAAO,EAAA,KAAA,SAAA,WAAA,IAAA,OAAA,CAAA,EAAA,GAA2B,wCAAU,KAAK;QAEnD,WAAQ,EAAA,MAAA;AAAA,IACZ,MAAM,UAAQ,QAAQ;AAAA,IACtB,aAAa,UAAQ,eAAe;AAAA,IACpC,OAAO,UAAQ,SAAS;AAAA,IACxB,SAAS,UAAQ,WAAW;AAAA,IAC5B,UAAU,UAAQ,YAAY;AAAA,IAC9B,MAAM,QAAO,EAAC,MAAM,KAAK,IAAI,KAAK;AAAA;AAGhC,MAAA,SAAS,EAAA,MAAM,EAAA,MAAA,CAAA,CAAA,CAAA;AAEV,WAAA,eAAe;UACtB,QAAM,CAAA,GAAA,IAAA;AAED,QAAA,CAAA,SAAS,KAAK,QAAQ;YACzB,MAAM,EAAC,OAAO;AAAA,IAChB;AAEI,QAAA,SAAS,QAAQ,GAAG;YACtB,MAAM,EAAC,QAAQ;AAAA,IACjB;AAEO,WAAA,OAAO,KAAI,EAAA,IAAC,MAAM,CAAA,EAAE,WAAW;AAAA,EACxC;WAES,aAAa,OAAc;AAClC,UAAM,eAAc;AAEf,QAAA,CAAA,aAAY,GAAI;;IAErB;UAEM,cAAiC;AAAA,SAClC,QAAO;AAAA,MACV,MAAM,SAAS,KAAK,KAAI;AAAA,MACxB,aAAa,SAAS,YAAY,KAAI,KAAM;AAAA,MAC5C,OAAO,SAAS;AAAA,MAChB,SAAS,SAAS;AAAA,MAClB,UAAU,SAAS,SAAS,KAAI;AAAA,MAChC,MAAM,SAAS,OACX,SAAS,KACN,MAAM,GAAG,EACT,IAAG,CAAE,QAAQ,IAAI,MAAI,EACrB,OAAO,OAAO;;qBAId,WAAW;AAAA,EACtB;MAGC,MAAG,KAAA;qBAAH,GAAG;AACD,OAAI,MAAA;AAAA,cAAW;AAAA;;;UACb,QAAG,EAAA,YAAA,QAAA;AACD,UAAA,gBADF,KAAG;yBACD,OAAK,IAAA;cAAL,KAAK;6BAAL,OAAK,CAAA;;AAMG,YAAA,KAAA,EAAA,QAAA,MAAA,EAAA,IAAA,MAAM,EAAC,OAAO,UAAU,EAAE;iCACpB,EAAE,EAAE,wCAAwC,CAAA,CAAA;AAN1D,cAAI,QAAA;AAAA;;;mBAIO,QAAO;AAAA;;;;;;;cADjB,QAAU;AAAE,mBAAA,SAAS;AAAA;cAArB,MAAU,SAAA;AAAE,qBAAS,OAAI;AAAA;;;;;;cAMxB,OAAI,OAAA;+BAAJ,MAAI,IAAA;kBAAJ,IAAI;AAAwB,YAAA,gBAAA,MAAA,EAAA,SAAA,QAAA,EAAA,IAAA,MAAM,EAAC,IAAI,CAAA;8BAAvC,IAAI;AAAA;;AADF,cAAA,EAAA,IAAA,MAAM,EAAC,KAAI,UAAA,UAAA;AAAA;;cAVjB,KAAG;AAeH,UAAA,kBAfA,OAAG,CAAA;qCAeH,KAAG,GAAA,CAAA;;iCAMa,EAAE,EAAE,+CAA+C,CAAA,CAAA;AAJjE,iBAAO,QAAA;AAAA;;mBAGI,QAAO;AAAA;;;;gBAEX;AAAA,cAHN,QAAU;AAAE,mBAAA,SAAS;AAAA;cAArB,MAAU,SAAA;AAAE,qBAAS,cAAW;AAAA;;;cAJnC,KAAG;AAWH,UAAA,kBAXA,OAAG,CAAA;AAYD,UAAA,gBADF,KAAG;qCACD,KAAG,GAAA,CAAA;;AASO,YAAA,KAAA,EAAA,QAAA,MAAA,EAAA,IAAA,MAAM,EAAC,QAAQ,UAAU,EAAE;AAPnC,cAAI,QAAA;AAAA;;;;;mBAMO,QAAO;AAAA;;;;;cADjB,QAAU;AAAE,mBAAA,SAAS;AAAA;cAArB,MAAU,SAAA;AAAE,qBAAS,QAAK;AAAA;;;;;;cAMzB,SAAI,OAAA;+BAAJ,QAAI,IAAA;kBAAJ,MAAI;AAAwB,YAAA,gBAAA,MAAA,EAAA,SAAA,QAAA,EAAA,IAAA,MAAM,EAAC,KAAK,CAAA;8BAAxC,MAAI;AAAA;;AADF,cAAA,EAAA,IAAA,MAAM,EAAC,MAAK,UAAA,YAAA;AAAA;;cAZlB,KAAG;AAiBH,UAAA,kBAjBA,OAAG,CAAA;qCAiBH,KAAG,GAAA,CAAA;;iCAOa,EAAE,EAAE,4CAA4C,CAAA,CAAA;AAL9D,cAAI,QAAA;AAAA;;;mBAIO,QAAO;AAAA;;;;cADjB,QAAU;AAAE,mBAAA,SAAS;AAAA;cAArB,MAAU,SAAA;AAAE,qBAAS,WAAQ;AAAA;;;cALhC,KAAG;cAlBL,KAAG;AA8BH,UAAA,kBA9BA,OAAG,CAAA;qCA8BH,KAAG,GAAA,CAAA;;iCAOa,EAAE,EAAE,wCAAwC,CAAA,CAAA;AAL1D,cAAI,QAAA;AAAA;;;mBAIO,QAAO;AAAA;;;;cADjB,QAAU;AAAE,mBAAA,SAAS;AAAA;cAArB,MAAU,SAAA;AAAE,qBAAS,OAAI;AAAA;;;UAI1B,QAAK,EAAA,QAAA,QAAA,CAAA;2BAAL,OAAK,IAAA;cAAL,KAAK;cATP,KAAG;AAYH,UAAA,kBAZA,OAAG,CAAA;AAaD,UAAA,kBADF,KAAG;AAGC,UAAA,gBAFF,OAAK;8BAEH,KAAI;6BAAJ,KAAI;cAFN,OAAK;cADP,KAAG;AAaH,UAAA,kBAbA,OAAG,CAAA;2BAaH,KAAG;;;AAEC,iBAAMA,WAAA;AAAA;;;;;;qBAAgE,QAAO;AAAA;;;;;;;;;;;;;;AAK/E,aAAM,QAAA;AAAA;;;iBAA2C,QAAO;AAAA;;;;;;;;;;;AAIpD,gBAAA,gBAAA,MAAA,EAAA,SAAA,QAAA,QAAO,EAAC,KAAK,mBAAmB,gBAAgB,CAAA;;;;kBAH9C,QAAO,EAAA,UAAA,YAAA;AAAA,kBAAA,UAAA,WAAA,EAAA;AAAA;;;;;;cARf,KAAG;;;;;AAVC,2BAGW,QAAO;;;;gBAzEF,EAAE,EAAE,kCAAkC,CAAA;AAAA,gBAgE/B,EAAE,EAAE,iCAAiC,CAAA;AAAA,gBAY5D,EAAE,EAAE,sCAAsC,CAAA;AAAA;;AAN1C,QAAA,aAAA,aAEe,SAAS,SAAO,CAAA,YAAhB,SAAS,UAAO,OAAA;;;;;UA3EvC,GAAG;qBAAH,GAAG;;AAFI;"}
|
package/dist/lib/components.js
CHANGED
package/dist/lib/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { default as default3 } from "@smrt/mcp";
|
|
|
6
6
|
import { default as default4 } from "@smrt/routes";
|
|
7
7
|
import { C, M, P, a, S } from "./chunks/SkuCollection-f_a3k93c.js";
|
|
8
8
|
import { ProductAssetCollection } from "./chunks/ProductAssetCollection-B93HdSlX.js";
|
|
9
|
-
import { P as P2, a as a2 } from "./chunks/ProductForm-
|
|
9
|
+
import { P as P2, a as a2 } from "./chunks/ProductForm-CU0UvKEF.js";
|
|
10
10
|
import { a as a3 } from "./chunks/index-i3-ci1FB.js";
|
|
11
11
|
import { P as Product, C as Category } from "./chunks/Sku-sl6xf1PR.js";
|
|
12
12
|
import { M as M2, a as a4, b, c, S as S2 } from "./chunks/Sku-sl6xf1PR.js";
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { defineMessages } from "@happyvertical/smrt-ui/i18n";
|
|
2
|
+
const M = defineMessages({
|
|
3
|
+
// App
|
|
4
|
+
"products.app.categories_coming_soon": "Category management coming soon...",
|
|
5
|
+
"products.app.analytics_coming_soon": "Analytics dashboard coming soon...",
|
|
6
|
+
// AppLayout
|
|
7
|
+
"products.app_layout.service_title": "Product Service",
|
|
8
|
+
"products.app_layout.footer_copyright": "2024 SMRT Product Service - Auto-generated with ❤️",
|
|
9
|
+
"products.app_layout.api_docs": "API Docs",
|
|
10
|
+
"products.app_layout.mcp_tools": "MCP Tools",
|
|
11
|
+
// DemoPage
|
|
12
|
+
"products.demo_page.title": "SMRT Framework Demo",
|
|
13
|
+
"products.demo_page.subtitle": "Define Once, Consume Everywhere - Progressive Customization",
|
|
14
|
+
"products.demo_page.custom_components_tab": "Custom Components",
|
|
15
|
+
"products.demo_page.auto_generated_heading": "Auto-Generated UI from SMRT Object",
|
|
16
|
+
"products.demo_page.auto_generated_description": "This form is automatically generated from the Product class definition.\n The field types, labels, and validation rules are inferred from the TypeScript schema.",
|
|
17
|
+
"products.demo_page.generated_form_heading": "Generated Form",
|
|
18
|
+
"products.demo_page.auto_form_title": "Auto-Generated Product Form",
|
|
19
|
+
"products.demo_page.generated_display_heading": "Generated Display",
|
|
20
|
+
"products.demo_page.custom_components_heading": "Custom Components with SMRT Integration",
|
|
21
|
+
"products.demo_page.custom_components_description": "These are hand-crafted components that still leverage the SMRT data structure\n but provide custom UI/UX for specific business requirements.",
|
|
22
|
+
"products.demo_page.custom_form_heading": "Custom Form",
|
|
23
|
+
"products.demo_page.custom_display_heading": "Custom Display",
|
|
24
|
+
"products.demo_page.progressive_heading": "Progressive Customization",
|
|
25
|
+
"products.demo_page.progressive_description": "Start with auto-generated components, then progressively customize as needed.\n Both approaches use the same underlying SMRT Product model.",
|
|
26
|
+
"products.demo_page.feature_zero_config": "✅ Zero configuration",
|
|
27
|
+
"products.demo_page.feature_instant_ui": "✅ Instant UI from schema",
|
|
28
|
+
"products.demo_page.feature_type_safe": "✅ Type-safe by default",
|
|
29
|
+
"products.demo_page.feature_prototyping": "⚡ Perfect for prototyping",
|
|
30
|
+
"products.demo_page.custom_components_label": "🎨 Custom Components",
|
|
31
|
+
"products.demo_page.feature_tailored_ux": "✅ Tailored UX",
|
|
32
|
+
"products.demo_page.feature_business_workflows": "✅ Business-specific workflows",
|
|
33
|
+
"products.demo_page.feature_advanced_interactions": "✅ Advanced interactions",
|
|
34
|
+
"products.demo_page.simple_auto_form_title": "Auto Form",
|
|
35
|
+
"products.demo_page.benefits_heading": "SMRT Framework Benefits",
|
|
36
|
+
"products.demo_page.benefit_define_once_label": "Define Once:",
|
|
37
|
+
"products.demo_page.benefit_define_once_text": "Product class with @smrt decorator",
|
|
38
|
+
"products.demo_page.benefit_auto_generate_label": "Auto-Generate:",
|
|
39
|
+
"products.demo_page.benefit_auto_generate_text": "REST APIs, MCP tools, TypeScript clients, default UI",
|
|
40
|
+
"products.demo_page.benefit_progressive_label": "Progressive Enhancement:",
|
|
41
|
+
"products.demo_page.benefit_progressive_text": "Start with defaults, customize as needed",
|
|
42
|
+
"products.demo_page.benefit_type_safety_label": "Type Safety:",
|
|
43
|
+
"products.demo_page.benefit_type_safety_text": "End-to-end TypeScript integration",
|
|
44
|
+
"products.demo_page.benefit_multiple_consumption_label": "Multiple Consumption:",
|
|
45
|
+
"products.demo_page.benefit_multiple_consumption_text": "Library, federation, standalone",
|
|
46
|
+
// ProductsPage
|
|
47
|
+
"products.products_page.description": "Manage your product catalog with auto-generated CRUD operations, \n real-time updates, and AI-powered tools via MCP.",
|
|
48
|
+
"products.products_page.auto_generated_text": "REST API endpoints automatically created from @smrt() decorated Product class",
|
|
49
|
+
"products.products_page.ai_ready_heading": "🤖 AI Ready",
|
|
50
|
+
"products.products_page.ai_ready_text": "MCP tools available for Claude and other AI models to interact with products",
|
|
51
|
+
"products.products_page.federatable_text": "Components can be consumed by other applications via module federation",
|
|
52
|
+
"products.products_page.library_text": "Install as NPM package: npm install @have/smrt-template",
|
|
53
|
+
// ProductForm
|
|
54
|
+
"products.product_form.name_label": "Product Name *",
|
|
55
|
+
"products.product_form.name_placeholder": "Enter product name",
|
|
56
|
+
"products.product_form.description_placeholder": "Product description (optional)",
|
|
57
|
+
"products.product_form.category_placeholder": "Product category",
|
|
58
|
+
"products.product_form.tags_placeholder": "tag1, tag2, tag3",
|
|
59
|
+
"products.product_form.tags_hint": "Separate tags with commas",
|
|
60
|
+
"products.product_form.in_stock_label": "In Stock",
|
|
61
|
+
// TestComponent
|
|
62
|
+
"products.test_component.title": "Test Component",
|
|
63
|
+
// AutoForm
|
|
64
|
+
"products.auto_form.subtitle": "Auto-generated from SMRT Product model",
|
|
65
|
+
"products.auto_form.debug_summary": "Form Data (Debug)",
|
|
66
|
+
// FieldRenderer
|
|
67
|
+
"products.field_renderer.array_hint": "Enter values separated by commas",
|
|
68
|
+
"products.field_renderer.object_hint": "Enter valid JSON",
|
|
69
|
+
// CategoryManager
|
|
70
|
+
"products.category_manager.title": "Category Manager",
|
|
71
|
+
"products.category_manager.subtitle": "Manage product categories",
|
|
72
|
+
"products.category_manager.coming_soon": "Category management feature coming soon...",
|
|
73
|
+
"products.category_manager.will_include": "This will include:",
|
|
74
|
+
"products.category_manager.create_edit": "Create and edit categories",
|
|
75
|
+
"products.category_manager.organize_hierarchy": "Organize category hierarchy",
|
|
76
|
+
"products.category_manager.manage_permissions": "Manage category permissions",
|
|
77
|
+
"products.category_manager.analytics": "Category analytics",
|
|
78
|
+
// ProductCatalog
|
|
79
|
+
"products.product_catalog.title": "Product Catalog",
|
|
80
|
+
"products.product_catalog.in_stock": "in stock",
|
|
81
|
+
"products.product_catalog.total_value": "Total value:",
|
|
82
|
+
"products.product_catalog.search_placeholder": "Search products...",
|
|
83
|
+
"products.product_catalog.all_categories": "All Categories",
|
|
84
|
+
"products.product_catalog.add_product": "Add Product",
|
|
85
|
+
"products.product_catalog.loading": "Loading products...",
|
|
86
|
+
"products.product_catalog.empty": "No products yet. Create your first product to get started!",
|
|
87
|
+
"products.product_catalog.create_first": "Create First Product",
|
|
88
|
+
"products.product_catalog.no_match": "No products match your search criteria."
|
|
89
|
+
});
|
|
90
|
+
export {
|
|
91
|
+
M
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sources":["../../../src/lib/i18n.ts"],"sourcesContent":["import { defineMessages } from '@happyvertical/smrt-ui/i18n';\n\nexport const M = defineMessages({\n // App\n 'products.app.categories_coming_soon': 'Category management coming soon...',\n 'products.app.analytics_coming_soon': 'Analytics dashboard coming soon...',\n\n // AppLayout\n 'products.app_layout.service_title': 'Product Service',\n 'products.app_layout.footer_copyright':\n '2024 SMRT Product Service - Auto-generated with ❤️',\n 'products.app_layout.api_docs': 'API Docs',\n 'products.app_layout.mcp_tools': 'MCP Tools',\n\n // DemoPage\n 'products.demo_page.title': 'SMRT Framework Demo',\n 'products.demo_page.subtitle':\n 'Define Once, Consume Everywhere - Progressive Customization',\n 'products.demo_page.custom_components_tab': 'Custom Components',\n 'products.demo_page.auto_generated_heading':\n 'Auto-Generated UI from SMRT Object',\n 'products.demo_page.auto_generated_description':\n 'This form is automatically generated from the Product class definition.\\n The field types, labels, and validation rules are inferred from the TypeScript schema.',\n 'products.demo_page.generated_form_heading': 'Generated Form',\n 'products.demo_page.auto_form_title': 'Auto-Generated Product Form',\n 'products.demo_page.generated_display_heading': 'Generated Display',\n 'products.demo_page.custom_components_heading':\n 'Custom Components with SMRT Integration',\n 'products.demo_page.custom_components_description':\n 'These are hand-crafted components that still leverage the SMRT data structure\\n but provide custom UI/UX for specific business requirements.',\n 'products.demo_page.custom_form_heading': 'Custom Form',\n 'products.demo_page.custom_display_heading': 'Custom Display',\n 'products.demo_page.progressive_heading': 'Progressive Customization',\n 'products.demo_page.progressive_description':\n 'Start with auto-generated components, then progressively customize as needed.\\n Both approaches use the same underlying SMRT Product model.',\n 'products.demo_page.feature_zero_config': '✅ Zero configuration',\n 'products.demo_page.feature_instant_ui': '✅ Instant UI from schema',\n 'products.demo_page.feature_type_safe': '✅ Type-safe by default',\n 'products.demo_page.feature_prototyping': '⚡ Perfect for prototyping',\n 'products.demo_page.custom_components_label': '🎨 Custom Components',\n 'products.demo_page.feature_tailored_ux': '✅ Tailored UX',\n 'products.demo_page.feature_business_workflows':\n '✅ Business-specific workflows',\n 'products.demo_page.feature_advanced_interactions':\n '✅ Advanced interactions',\n 'products.demo_page.simple_auto_form_title': 'Auto Form',\n 'products.demo_page.benefits_heading': 'SMRT Framework Benefits',\n 'products.demo_page.benefit_define_once_label': 'Define Once:',\n 'products.demo_page.benefit_define_once_text':\n 'Product class with @smrt decorator',\n 'products.demo_page.benefit_auto_generate_label': 'Auto-Generate:',\n 'products.demo_page.benefit_auto_generate_text':\n 'REST APIs, MCP tools, TypeScript clients, default UI',\n 'products.demo_page.benefit_progressive_label': 'Progressive Enhancement:',\n 'products.demo_page.benefit_progressive_text':\n 'Start with defaults, customize as needed',\n 'products.demo_page.benefit_type_safety_label': 'Type Safety:',\n 'products.demo_page.benefit_type_safety_text':\n 'End-to-end TypeScript integration',\n 'products.demo_page.benefit_multiple_consumption_label':\n 'Multiple Consumption:',\n 'products.demo_page.benefit_multiple_consumption_text':\n 'Library, federation, standalone',\n\n // ProductsPage\n 'products.products_page.description':\n 'Manage your product catalog with auto-generated CRUD operations, \\n real-time updates, and AI-powered tools via MCP.',\n 'products.products_page.auto_generated_text':\n 'REST API endpoints automatically created from @smrt() decorated Product class',\n 'products.products_page.ai_ready_heading': '🤖 AI Ready',\n 'products.products_page.ai_ready_text':\n 'MCP tools available for Claude and other AI models to interact with products',\n 'products.products_page.federatable_text':\n 'Components can be consumed by other applications via module federation',\n 'products.products_page.library_text':\n 'Install as NPM package: npm install @have/smrt-template',\n\n // ProductForm\n 'products.product_form.name_label': 'Product Name *',\n 'products.product_form.name_placeholder': 'Enter product name',\n 'products.product_form.description_placeholder':\n 'Product description (optional)',\n 'products.product_form.category_placeholder': 'Product category',\n 'products.product_form.tags_placeholder': 'tag1, tag2, tag3',\n 'products.product_form.tags_hint': 'Separate tags with commas',\n 'products.product_form.in_stock_label': 'In Stock',\n\n // TestComponent\n 'products.test_component.title': 'Test Component',\n\n // AutoForm\n 'products.auto_form.subtitle': 'Auto-generated from SMRT Product model',\n 'products.auto_form.debug_summary': 'Form Data (Debug)',\n\n // FieldRenderer\n 'products.field_renderer.array_hint': 'Enter values separated by commas',\n 'products.field_renderer.object_hint': 'Enter valid JSON',\n\n // CategoryManager\n 'products.category_manager.title': 'Category Manager',\n 'products.category_manager.subtitle': 'Manage product categories',\n 'products.category_manager.coming_soon':\n 'Category management feature coming soon...',\n 'products.category_manager.will_include': 'This will include:',\n 'products.category_manager.create_edit': 'Create and edit categories',\n 'products.category_manager.organize_hierarchy': 'Organize category hierarchy',\n 'products.category_manager.manage_permissions': 'Manage category permissions',\n 'products.category_manager.analytics': 'Category analytics',\n\n // ProductCatalog\n 'products.product_catalog.title': 'Product Catalog',\n 'products.product_catalog.in_stock': 'in stock',\n 'products.product_catalog.total_value': 'Total value:',\n 'products.product_catalog.search_placeholder': 'Search products...',\n 'products.product_catalog.all_categories': 'All Categories',\n 'products.product_catalog.add_product': 'Add Product',\n 'products.product_catalog.loading': 'Loading products...',\n 'products.product_catalog.empty':\n 'No products yet. Create your first product to get started!',\n 'products.product_catalog.create_first': 'Create First Product',\n 'products.product_catalog.no_match':\n 'No products match your search criteria.',\n});\n"],"names":[],"mappings":";AAEO,MAAM,IAAI,eAAe;AAAA;AAAA,EAE9B,uCAAuC;AAAA,EACvC,sCAAsC;AAAA;AAAA,EAGtC,qCAAqC;AAAA,EACrC,wCACE;AAAA,EACF,gCAAgC;AAAA,EAChC,iCAAiC;AAAA;AAAA,EAGjC,4BAA4B;AAAA,EAC5B,+BACE;AAAA,EACF,4CAA4C;AAAA,EAC5C,6CACE;AAAA,EACF,iDACE;AAAA,EACF,6CAA6C;AAAA,EAC7C,sCAAsC;AAAA,EACtC,gDAAgD;AAAA,EAChD,gDACE;AAAA,EACF,oDACE;AAAA,EACF,0CAA0C;AAAA,EAC1C,6CAA6C;AAAA,EAC7C,0CAA0C;AAAA,EAC1C,8CACE;AAAA,EACF,0CAA0C;AAAA,EAC1C,yCAAyC;AAAA,EACzC,wCAAwC;AAAA,EACxC,0CAA0C;AAAA,EAC1C,8CAA8C;AAAA,EAC9C,0CAA0C;AAAA,EAC1C,iDACE;AAAA,EACF,oDACE;AAAA,EACF,6CAA6C;AAAA,EAC7C,uCAAuC;AAAA,EACvC,gDAAgD;AAAA,EAChD,+CACE;AAAA,EACF,kDAAkD;AAAA,EAClD,iDACE;AAAA,EACF,gDAAgD;AAAA,EAChD,+CACE;AAAA,EACF,gDAAgD;AAAA,EAChD,+CACE;AAAA,EACF,yDACE;AAAA,EACF,wDACE;AAAA;AAAA,EAGF,sCACE;AAAA,EACF,8CACE;AAAA,EACF,2CAA2C;AAAA,EAC3C,wCACE;AAAA,EACF,2CACE;AAAA,EACF,uCACE;AAAA;AAAA,EAGF,oCAAoC;AAAA,EACpC,0CAA0C;AAAA,EAC1C,iDACE;AAAA,EACF,8CAA8C;AAAA,EAC9C,0CAA0C;AAAA,EAC1C,mCAAmC;AAAA,EACnC,wCAAwC;AAAA;AAAA,EAGxC,iCAAiC;AAAA;AAAA,EAGjC,+BAA+B;AAAA,EAC/B,oCAAoC;AAAA;AAAA,EAGpC,sCAAsC;AAAA,EACtC,uCAAuC;AAAA;AAAA,EAGvC,mCAAmC;AAAA,EACnC,sCAAsC;AAAA,EACtC,yCACE;AAAA,EACF,0CAA0C;AAAA,EAC1C,yCAAyC;AAAA,EACzC,gDAAgD;AAAA,EAChD,gDAAgD;AAAA,EAChD,uCAAuC;AAAA;AAAA,EAGvC,kCAAkC;AAAA,EAClC,qCAAqC;AAAA,EACrC,wCAAwC;AAAA,EACxC,+CAA+C;AAAA,EAC/C,2CAA2C;AAAA,EAC3C,wCAAwC;AAAA,EACxC,oCAAoC;AAAA,EACpC,kCACE;AAAA,EACF,yCAAyC;AAAA,EACzC,qCACE;AACJ,CAAC;"}
|
package/dist/lib/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "1.0.0",
|
|
3
|
-
"timestamp":
|
|
3
|
+
"timestamp": 1782792521825,
|
|
4
4
|
"packageName": "@happyvertical/smrt-products",
|
|
5
|
-
"packageVersion": "0.
|
|
5
|
+
"packageVersion": "0.37.1",
|
|
6
6
|
"objects": {
|
|
7
7
|
"@happyvertical/smrt-products:CategoryCollection": {
|
|
8
8
|
"name": "categorycollection",
|
|
@@ -939,7 +939,7 @@
|
|
|
939
939
|
"parameters": [
|
|
940
940
|
{
|
|
941
941
|
"name": "data",
|
|
942
|
-
"type": "
|
|
942
|
+
"type": "Record<string>",
|
|
943
943
|
"optional": false
|
|
944
944
|
}
|
|
945
945
|
],
|
|
@@ -951,7 +951,7 @@
|
|
|
951
951
|
"name": "getFields",
|
|
952
952
|
"async": true,
|
|
953
953
|
"parameters": [],
|
|
954
|
-
"returnType": "any",
|
|
954
|
+
"returnType": "Promise<any>",
|
|
955
955
|
"isStatic": false,
|
|
956
956
|
"isPublic": true
|
|
957
957
|
},
|
|
@@ -1060,7 +1060,7 @@
|
|
|
1060
1060
|
},
|
|
1061
1061
|
{
|
|
1062
1062
|
"name": "options",
|
|
1063
|
-
"type": "
|
|
1063
|
+
"type": "AiOperationOptions",
|
|
1064
1064
|
"optional": true
|
|
1065
1065
|
}
|
|
1066
1066
|
],
|
|
@@ -1079,7 +1079,7 @@
|
|
|
1079
1079
|
},
|
|
1080
1080
|
{
|
|
1081
1081
|
"name": "options",
|
|
1082
|
-
"type": "
|
|
1082
|
+
"type": "AiOperationOptions",
|
|
1083
1083
|
"optional": true
|
|
1084
1084
|
}
|
|
1085
1085
|
],
|
|
@@ -1093,7 +1093,7 @@
|
|
|
1093
1093
|
"parameters": [
|
|
1094
1094
|
{
|
|
1095
1095
|
"name": "options",
|
|
1096
|
-
"type": "
|
|
1096
|
+
"type": "AiOperationOptions",
|
|
1097
1097
|
"optional": true
|
|
1098
1098
|
}
|
|
1099
1099
|
],
|
|
@@ -1123,6 +1123,25 @@
|
|
|
1123
1123
|
"isStatic": false,
|
|
1124
1124
|
"isPublic": true
|
|
1125
1125
|
},
|
|
1126
|
+
"_setLoadedRelationship": {
|
|
1127
|
+
"name": "_setLoadedRelationship",
|
|
1128
|
+
"async": false,
|
|
1129
|
+
"parameters": [
|
|
1130
|
+
{
|
|
1131
|
+
"name": "fieldName",
|
|
1132
|
+
"type": "string",
|
|
1133
|
+
"optional": false
|
|
1134
|
+
},
|
|
1135
|
+
{
|
|
1136
|
+
"name": "value",
|
|
1137
|
+
"type": "any",
|
|
1138
|
+
"optional": false
|
|
1139
|
+
}
|
|
1140
|
+
],
|
|
1141
|
+
"returnType": "void",
|
|
1142
|
+
"isStatic": false,
|
|
1143
|
+
"isPublic": true
|
|
1144
|
+
},
|
|
1126
1145
|
"loadRelated": {
|
|
1127
1146
|
"name": "loadRelated",
|
|
1128
1147
|
"async": true,
|
|
@@ -1226,7 +1245,7 @@
|
|
|
1226
1245
|
"optional": false
|
|
1227
1246
|
}
|
|
1228
1247
|
],
|
|
1229
|
-
"returnType": "Promise
|
|
1248
|
+
"returnType": "Promise",
|
|
1230
1249
|
"isStatic": false,
|
|
1231
1250
|
"isPublic": true
|
|
1232
1251
|
},
|
|
@@ -1240,7 +1259,7 @@
|
|
|
1240
1259
|
"optional": true
|
|
1241
1260
|
}
|
|
1242
1261
|
],
|
|
1243
|
-
"returnType": "Promise<Map<string
|
|
1262
|
+
"returnType": "Promise<Map<string>>",
|
|
1244
1263
|
"isStatic": false,
|
|
1245
1264
|
"isPublic": true
|
|
1246
1265
|
},
|
|
@@ -1638,7 +1657,7 @@
|
|
|
1638
1657
|
"parameters": [
|
|
1639
1658
|
{
|
|
1640
1659
|
"name": "data",
|
|
1641
|
-
"type": "
|
|
1660
|
+
"type": "Record<string>",
|
|
1642
1661
|
"optional": false
|
|
1643
1662
|
}
|
|
1644
1663
|
],
|
|
@@ -1650,7 +1669,7 @@
|
|
|
1650
1669
|
"name": "getFields",
|
|
1651
1670
|
"async": true,
|
|
1652
1671
|
"parameters": [],
|
|
1653
|
-
"returnType": "any",
|
|
1672
|
+
"returnType": "Promise<any>",
|
|
1654
1673
|
"isStatic": false,
|
|
1655
1674
|
"isPublic": true
|
|
1656
1675
|
},
|
|
@@ -1759,7 +1778,7 @@
|
|
|
1759
1778
|
},
|
|
1760
1779
|
{
|
|
1761
1780
|
"name": "options",
|
|
1762
|
-
"type": "
|
|
1781
|
+
"type": "AiOperationOptions",
|
|
1763
1782
|
"optional": true
|
|
1764
1783
|
}
|
|
1765
1784
|
],
|
|
@@ -1778,7 +1797,7 @@
|
|
|
1778
1797
|
},
|
|
1779
1798
|
{
|
|
1780
1799
|
"name": "options",
|
|
1781
|
-
"type": "
|
|
1800
|
+
"type": "AiOperationOptions",
|
|
1782
1801
|
"optional": true
|
|
1783
1802
|
}
|
|
1784
1803
|
],
|
|
@@ -1792,7 +1811,7 @@
|
|
|
1792
1811
|
"parameters": [
|
|
1793
1812
|
{
|
|
1794
1813
|
"name": "options",
|
|
1795
|
-
"type": "
|
|
1814
|
+
"type": "AiOperationOptions",
|
|
1796
1815
|
"optional": true
|
|
1797
1816
|
}
|
|
1798
1817
|
],
|
|
@@ -1822,6 +1841,25 @@
|
|
|
1822
1841
|
"isStatic": false,
|
|
1823
1842
|
"isPublic": true
|
|
1824
1843
|
},
|
|
1844
|
+
"_setLoadedRelationship": {
|
|
1845
|
+
"name": "_setLoadedRelationship",
|
|
1846
|
+
"async": false,
|
|
1847
|
+
"parameters": [
|
|
1848
|
+
{
|
|
1849
|
+
"name": "fieldName",
|
|
1850
|
+
"type": "string",
|
|
1851
|
+
"optional": false
|
|
1852
|
+
},
|
|
1853
|
+
{
|
|
1854
|
+
"name": "value",
|
|
1855
|
+
"type": "any",
|
|
1856
|
+
"optional": false
|
|
1857
|
+
}
|
|
1858
|
+
],
|
|
1859
|
+
"returnType": "void",
|
|
1860
|
+
"isStatic": false,
|
|
1861
|
+
"isPublic": true
|
|
1862
|
+
},
|
|
1825
1863
|
"loadRelated": {
|
|
1826
1864
|
"name": "loadRelated",
|
|
1827
1865
|
"async": true,
|
|
@@ -1925,7 +1963,7 @@
|
|
|
1925
1963
|
"optional": false
|
|
1926
1964
|
}
|
|
1927
1965
|
],
|
|
1928
|
-
"returnType": "Promise
|
|
1966
|
+
"returnType": "Promise",
|
|
1929
1967
|
"isStatic": false,
|
|
1930
1968
|
"isPublic": true
|
|
1931
1969
|
},
|
|
@@ -1939,7 +1977,7 @@
|
|
|
1939
1977
|
"optional": true
|
|
1940
1978
|
}
|
|
1941
1979
|
],
|
|
1942
|
-
"returnType": "Promise<Map<string
|
|
1980
|
+
"returnType": "Promise<Map<string>>",
|
|
1943
1981
|
"isStatic": false,
|
|
1944
1982
|
"isPublic": true
|
|
1945
1983
|
},
|
|
@@ -2416,7 +2454,7 @@
|
|
|
2416
2454
|
"parameters": [
|
|
2417
2455
|
{
|
|
2418
2456
|
"name": "data",
|
|
2419
|
-
"type": "
|
|
2457
|
+
"type": "Record<string>",
|
|
2420
2458
|
"optional": false
|
|
2421
2459
|
}
|
|
2422
2460
|
],
|
|
@@ -2428,7 +2466,7 @@
|
|
|
2428
2466
|
"name": "getFields",
|
|
2429
2467
|
"async": true,
|
|
2430
2468
|
"parameters": [],
|
|
2431
|
-
"returnType": "any",
|
|
2469
|
+
"returnType": "Promise<any>",
|
|
2432
2470
|
"isStatic": false,
|
|
2433
2471
|
"isPublic": true
|
|
2434
2472
|
},
|
|
@@ -2537,7 +2575,7 @@
|
|
|
2537
2575
|
},
|
|
2538
2576
|
{
|
|
2539
2577
|
"name": "options",
|
|
2540
|
-
"type": "
|
|
2578
|
+
"type": "AiOperationOptions",
|
|
2541
2579
|
"optional": true
|
|
2542
2580
|
}
|
|
2543
2581
|
],
|
|
@@ -2556,7 +2594,7 @@
|
|
|
2556
2594
|
},
|
|
2557
2595
|
{
|
|
2558
2596
|
"name": "options",
|
|
2559
|
-
"type": "
|
|
2597
|
+
"type": "AiOperationOptions",
|
|
2560
2598
|
"optional": true
|
|
2561
2599
|
}
|
|
2562
2600
|
],
|
|
@@ -2570,7 +2608,7 @@
|
|
|
2570
2608
|
"parameters": [
|
|
2571
2609
|
{
|
|
2572
2610
|
"name": "options",
|
|
2573
|
-
"type": "
|
|
2611
|
+
"type": "AiOperationOptions",
|
|
2574
2612
|
"optional": true
|
|
2575
2613
|
}
|
|
2576
2614
|
],
|
|
@@ -2600,6 +2638,25 @@
|
|
|
2600
2638
|
"isStatic": false,
|
|
2601
2639
|
"isPublic": true
|
|
2602
2640
|
},
|
|
2641
|
+
"_setLoadedRelationship": {
|
|
2642
|
+
"name": "_setLoadedRelationship",
|
|
2643
|
+
"async": false,
|
|
2644
|
+
"parameters": [
|
|
2645
|
+
{
|
|
2646
|
+
"name": "fieldName",
|
|
2647
|
+
"type": "string",
|
|
2648
|
+
"optional": false
|
|
2649
|
+
},
|
|
2650
|
+
{
|
|
2651
|
+
"name": "value",
|
|
2652
|
+
"type": "any",
|
|
2653
|
+
"optional": false
|
|
2654
|
+
}
|
|
2655
|
+
],
|
|
2656
|
+
"returnType": "void",
|
|
2657
|
+
"isStatic": false,
|
|
2658
|
+
"isPublic": true
|
|
2659
|
+
},
|
|
2603
2660
|
"loadRelated": {
|
|
2604
2661
|
"name": "loadRelated",
|
|
2605
2662
|
"async": true,
|
|
@@ -2703,7 +2760,7 @@
|
|
|
2703
2760
|
"optional": false
|
|
2704
2761
|
}
|
|
2705
2762
|
],
|
|
2706
|
-
"returnType": "Promise
|
|
2763
|
+
"returnType": "Promise",
|
|
2707
2764
|
"isStatic": false,
|
|
2708
2765
|
"isPublic": true
|
|
2709
2766
|
},
|
|
@@ -2717,7 +2774,7 @@
|
|
|
2717
2774
|
"optional": true
|
|
2718
2775
|
}
|
|
2719
2776
|
],
|
|
2720
|
-
"returnType": "Promise<Map<string
|
|
2777
|
+
"returnType": "Promise<Map<string>>",
|
|
2721
2778
|
"isStatic": false,
|
|
2722
2779
|
"isPublic": true
|
|
2723
2780
|
},
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"generatedAt": "2026-06-
|
|
3
|
+
"generatedAt": "2026-06-30T04:08:45.391Z",
|
|
4
4
|
"packageName": "@happyvertical/smrt-products",
|
|
5
|
-
"packageVersion": "0.
|
|
5
|
+
"packageVersion": "0.37.1",
|
|
6
6
|
"sourceManifestPath": "dist/lib/manifest.json",
|
|
7
7
|
"agentDocPath": "AGENTS.md",
|
|
8
8
|
"sourceHashes": {
|
|
9
|
-
"manifest": "
|
|
10
|
-
"packageJson": "
|
|
9
|
+
"manifest": "81cb5f5f82bcf914a17a03f5745eccac91c6adcd86a9a39bf60f4a61ff47c42b",
|
|
10
|
+
"packageJson": "d1ffa2a4c5db6eccdf04bd4778b7f008b415352974555cafc79f919cedc38959",
|
|
11
11
|
"agents": "ede6063b72600b84908e1e32216fbbdd69d70d309f0b23c2add338ad080702d4"
|
|
12
12
|
},
|
|
13
13
|
"exports": [
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"svelte": "^5.46.4",
|
|
46
46
|
"svelte-check": "^4.3.5",
|
|
47
47
|
"typescript": "^5.9.3",
|
|
48
|
-
"vite": "^7.3.
|
|
48
|
+
"vite": "^7.3.6",
|
|
49
49
|
"vitest": "^4.0.17"
|
|
50
50
|
},
|
|
51
51
|
"smrtDependencies": [
|
|
@@ -271,6 +271,7 @@
|
|
|
271
271
|
}
|
|
272
272
|
],
|
|
273
273
|
"methods": [
|
|
274
|
+
"_setLoadedRelationship",
|
|
274
275
|
"classifyConstraintError",
|
|
275
276
|
"clearEmbeddings",
|
|
276
277
|
"delete",
|
|
@@ -498,6 +499,7 @@
|
|
|
498
499
|
],
|
|
499
500
|
"relationships": [],
|
|
500
501
|
"methods": [
|
|
502
|
+
"_setLoadedRelationship",
|
|
501
503
|
"addAsset",
|
|
502
504
|
"classifyConstraintError",
|
|
503
505
|
"clearEmbeddings",
|
|
@@ -714,6 +716,7 @@
|
|
|
714
716
|
],
|
|
715
717
|
"relationships": [],
|
|
716
718
|
"methods": [
|
|
719
|
+
"_setLoadedRelationship",
|
|
717
720
|
"addAsset",
|
|
718
721
|
"classifyConstraintError",
|
|
719
722
|
"clearEmbeddings",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-products",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.1",
|
|
4
4
|
"description": "SMRT products module: triple-purpose microservice template for standalone apps, federated modules, and NPM libraries",
|
|
5
5
|
"author": "HappyVertical",
|
|
6
6
|
"type": "module",
|
|
@@ -55,11 +55,11 @@
|
|
|
55
55
|
"@happyvertical/utils": "^0.74.10",
|
|
56
56
|
"cors": "^2.8.5",
|
|
57
57
|
"express": "^5.2.1",
|
|
58
|
-
"@happyvertical/smrt-assets": "0.
|
|
59
|
-
"@happyvertical/smrt-core": "0.
|
|
60
|
-
"@happyvertical/smrt-scanner": "0.
|
|
61
|
-
"@happyvertical/smrt-tenancy": "0.
|
|
62
|
-
"@happyvertical/smrt-ui": "0.
|
|
58
|
+
"@happyvertical/smrt-assets": "0.37.1",
|
|
59
|
+
"@happyvertical/smrt-core": "0.37.1",
|
|
60
|
+
"@happyvertical/smrt-scanner": "0.37.1",
|
|
61
|
+
"@happyvertical/smrt-tenancy": "0.37.1",
|
|
62
|
+
"@happyvertical/smrt-ui": "0.37.1"
|
|
63
63
|
},
|
|
64
64
|
"peerDependencies": {
|
|
65
65
|
"svelte": "^5.46.4"
|
|
@@ -80,9 +80,9 @@
|
|
|
80
80
|
"svelte": "^5.46.4",
|
|
81
81
|
"svelte-check": "^4.3.5",
|
|
82
82
|
"typescript": "^5.9.3",
|
|
83
|
-
"vite": "^7.3.
|
|
83
|
+
"vite": "^7.3.6",
|
|
84
84
|
"vitest": "^4.0.17",
|
|
85
|
-
"@happyvertical/smrt-vitest": "0.
|
|
85
|
+
"@happyvertical/smrt-vitest": "0.37.1"
|
|
86
86
|
},
|
|
87
87
|
"keywords": [
|
|
88
88
|
"smrt",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProductForm-BLRguem5.js","sources":["../../../src/lib/components/ProductCard.svelte","../../../src/lib/i18n.ts","../../../src/lib/components/ProductForm.svelte"],"sourcesContent":["<script lang=\"ts\">\nimport { Button } from '@happyvertical/smrt-ui/ui';\nimport type { ProductData } from '../types';\n\ninterface Props {\n product: ProductData;\n onEdit?: (product: ProductData) => void;\n onDelete?: (id: string) => void;\n}\n\nconst { product, onEdit, onDelete }: Props = $props();\n</script>\n\n<div class=\"product-card\">\n <div class=\"product-header\">\n <h3 class=\"product-name\">{product.name}</h3>\n {#if product.manufacturer}\n <div class=\"product-manufacturer\">{product.manufacturer}</div>\n {/if}\n </div>\n\n {#if product.model}\n <div class=\"product-model\">Model: {product.model}</div>\n {/if}\n\n {#if product.description}\n <p class=\"product-description\">{product.description}</p>\n {/if}\n\n <div class=\"product-meta\">\n {#if product.category}\n <div class=\"product-category\">Category: {product.category}</div>\n {/if}\n \n {#if product.tags && product.tags.length > 0}\n <div class=\"product-tags\">\n {#each product.tags as tag}\n <span class=\"tag\">{tag}</span>\n {/each}\n </div>\n {/if}\n </div>\n \n <div class=\"product-actions\">\n {#if onEdit}\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onclick={() => onEdit?.(product)}>\n Edit\n </Button>\n {/if}\n\n {#if onDelete}\n <Button type=\"button\" variant=\"danger\" size=\"sm\" onclick={() => onDelete?.(product.id)}>\n Delete\n </Button>\n {/if}\n </div>\n</div>\n\n<style>\n .product-card {\n border: 1px solid var(--smrt-color-outline-variant, #e2e8f0);\n border-radius: var(--smrt-radius-md, 8px);\n padding: 1rem;\n background: var(--smrt-color-surface, #fff);\n box-shadow: var(--smrt-elevation-1, 0 1px 3px color-mix(in srgb, var(--smrt-color-shadow, #000) 10%, transparent));\n transition: box-shadow 0.2s;\n }\n\n .product-card:hover {\n box-shadow: var(--smrt-elevation-2, 0 4px 6px color-mix(in srgb, var(--smrt-color-shadow, #000) 10%, transparent));\n }\n \n .product-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 0.5rem;\n }\n \n .product-name {\n margin: 0;\n font-size: var(--smrt-typography-title-medium-size, 1.125rem);\n font-weight: var(--smrt-typography-weight-semibold, 600);\n color: var(--smrt-color-on-surface, #1f2937);\n }\n\n .product-manufacturer {\n font-size: var(--smrt-typography-title-small-size, 0.875rem);\n font-weight: var(--smrt-typography-weight-medium, 500);\n color: var(--smrt-color-on-surface-variant, #6b7280);\n }\n\n .product-model {\n font-size: var(--smrt-typography-body-medium-size, 0.875rem);\n color: var(--smrt-color-on-surface-variant, #6b7280);\n margin-bottom: 0.5rem;\n }\n\n .product-category {\n font-size: var(--smrt-typography-label-medium-size, 0.75rem);\n font-weight: var(--smrt-typography-weight-medium, 500);\n color: var(--smrt-color-on-surface, #374151);\n background: var(--smrt-color-surface-container, #f3f4f6);\n padding: 0.25rem 0.5rem;\n border-radius: var(--smrt-radius-sm, 4px);\n display: inline-block;\n margin-bottom: 0.5rem;\n }\n \n .product-description {\n margin: 0.5rem 0;\n color: var(--smrt-color-on-surface-variant, #6b7280);\n font-size: var(--smrt-typography-body-medium-size, 0.875rem);\n line-height: var(--smrt-typography-body-medium-line-height, 1.4);\n }\n \n .product-meta {\n margin: 0.75rem 0;\n }\n \n \n .product-tags {\n margin-top: 0.5rem;\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n }\n \n .tag {\n background: var(--smrt-color-surface-container, #f3f4f6);\n color: var(--smrt-color-on-surface, #374151);\n padding: 0.125rem 0.5rem;\n border-radius: var(--smrt-radius-full, 9999px);\n font-size: var(--smrt-typography-label-medium-size, 0.75rem);\n }\n\n .product-actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 1rem;\n padding-top: 0.75rem;\n border-top: 1px solid var(--smrt-color-outline-variant, #f3f4f6);\n }\n</style>","import { defineMessages } from '@happyvertical/smrt-ui/i18n';\n\nexport const M = defineMessages({\n // App\n 'products.app.categories_coming_soon': 'Category management coming soon...',\n 'products.app.analytics_coming_soon': 'Analytics dashboard coming soon...',\n\n // AppLayout\n 'products.app_layout.service_title': 'Product Service',\n 'products.app_layout.footer_copyright':\n '2024 SMRT Product Service - Auto-generated with ❤️',\n 'products.app_layout.api_docs': 'API Docs',\n 'products.app_layout.mcp_tools': 'MCP Tools',\n\n // DemoPage\n 'products.demo_page.title': 'SMRT Framework Demo',\n 'products.demo_page.subtitle':\n 'Define Once, Consume Everywhere - Progressive Customization',\n 'products.demo_page.custom_components_tab': 'Custom Components',\n 'products.demo_page.auto_generated_heading':\n 'Auto-Generated UI from SMRT Object',\n 'products.demo_page.auto_generated_description':\n 'This form is automatically generated from the Product class definition.\\n The field types, labels, and validation rules are inferred from the TypeScript schema.',\n 'products.demo_page.generated_form_heading': 'Generated Form',\n 'products.demo_page.auto_form_title': 'Auto-Generated Product Form',\n 'products.demo_page.generated_display_heading': 'Generated Display',\n 'products.demo_page.custom_components_heading':\n 'Custom Components with SMRT Integration',\n 'products.demo_page.custom_components_description':\n 'These are hand-crafted components that still leverage the SMRT data structure\\n but provide custom UI/UX for specific business requirements.',\n 'products.demo_page.custom_form_heading': 'Custom Form',\n 'products.demo_page.custom_display_heading': 'Custom Display',\n 'products.demo_page.progressive_heading': 'Progressive Customization',\n 'products.demo_page.progressive_description':\n 'Start with auto-generated components, then progressively customize as needed.\\n Both approaches use the same underlying SMRT Product model.',\n 'products.demo_page.feature_zero_config': '✅ Zero configuration',\n 'products.demo_page.feature_instant_ui': '✅ Instant UI from schema',\n 'products.demo_page.feature_type_safe': '✅ Type-safe by default',\n 'products.demo_page.feature_prototyping': '⚡ Perfect for prototyping',\n 'products.demo_page.custom_components_label': '🎨 Custom Components',\n 'products.demo_page.feature_tailored_ux': '✅ Tailored UX',\n 'products.demo_page.feature_business_workflows':\n '✅ Business-specific workflows',\n 'products.demo_page.feature_advanced_interactions':\n '✅ Advanced interactions',\n 'products.demo_page.simple_auto_form_title': 'Auto Form',\n 'products.demo_page.benefits_heading': 'SMRT Framework Benefits',\n 'products.demo_page.benefit_define_once_label': 'Define Once:',\n 'products.demo_page.benefit_define_once_text':\n 'Product class with @smrt decorator',\n 'products.demo_page.benefit_auto_generate_label': 'Auto-Generate:',\n 'products.demo_page.benefit_auto_generate_text':\n 'REST APIs, MCP tools, TypeScript clients, default UI',\n 'products.demo_page.benefit_progressive_label': 'Progressive Enhancement:',\n 'products.demo_page.benefit_progressive_text':\n 'Start with defaults, customize as needed',\n 'products.demo_page.benefit_type_safety_label': 'Type Safety:',\n 'products.demo_page.benefit_type_safety_text':\n 'End-to-end TypeScript integration',\n 'products.demo_page.benefit_multiple_consumption_label':\n 'Multiple Consumption:',\n 'products.demo_page.benefit_multiple_consumption_text':\n 'Library, federation, standalone',\n\n // ProductsPage\n 'products.products_page.description':\n 'Manage your product catalog with auto-generated CRUD operations, \\n real-time updates, and AI-powered tools via MCP.',\n 'products.products_page.auto_generated_text':\n 'REST API endpoints automatically created from @smrt() decorated Product class',\n 'products.products_page.ai_ready_heading': '🤖 AI Ready',\n 'products.products_page.ai_ready_text':\n 'MCP tools available for Claude and other AI models to interact with products',\n 'products.products_page.federatable_text':\n 'Components can be consumed by other applications via module federation',\n 'products.products_page.library_text':\n 'Install as NPM package: npm install @have/smrt-template',\n\n // ProductForm\n 'products.product_form.name_label': 'Product Name *',\n 'products.product_form.name_placeholder': 'Enter product name',\n 'products.product_form.description_placeholder':\n 'Product description (optional)',\n 'products.product_form.category_placeholder': 'Product category',\n 'products.product_form.tags_placeholder': 'tag1, tag2, tag3',\n 'products.product_form.tags_hint': 'Separate tags with commas',\n 'products.product_form.in_stock_label': 'In Stock',\n\n // TestComponent\n 'products.test_component.title': 'Test Component',\n\n // AutoForm\n 'products.auto_form.subtitle': 'Auto-generated from SMRT Product model',\n 'products.auto_form.debug_summary': 'Form Data (Debug)',\n\n // FieldRenderer\n 'products.field_renderer.array_hint': 'Enter values separated by commas',\n 'products.field_renderer.object_hint': 'Enter valid JSON',\n\n // CategoryManager\n 'products.category_manager.title': 'Category Manager',\n 'products.category_manager.subtitle': 'Manage product categories',\n 'products.category_manager.coming_soon':\n 'Category management feature coming soon...',\n 'products.category_manager.will_include': 'This will include:',\n 'products.category_manager.create_edit': 'Create and edit categories',\n 'products.category_manager.organize_hierarchy': 'Organize category hierarchy',\n 'products.category_manager.manage_permissions': 'Manage category permissions',\n 'products.category_manager.analytics': 'Category analytics',\n\n // ProductCatalog\n 'products.product_catalog.title': 'Product Catalog',\n 'products.product_catalog.in_stock': 'in stock',\n 'products.product_catalog.total_value': 'Total value:',\n 'products.product_catalog.search_placeholder': 'Search products...',\n 'products.product_catalog.all_categories': 'All Categories',\n 'products.product_catalog.add_product': 'Add Product',\n 'products.product_catalog.loading': 'Loading products...',\n 'products.product_catalog.empty':\n 'No products yet. Create your first product to get started!',\n 'products.product_catalog.create_first': 'Create First Product',\n 'products.product_catalog.no_match':\n 'No products match your search criteria.',\n});\n","<script lang=\"ts\">\nimport { Form, Input, Textarea } from '@happyvertical/smrt-ui/forms';\nimport { useI18n } from '@happyvertical/smrt-ui/i18n';\nimport { Button } from '@happyvertical/smrt-ui/ui';\nimport { M } from '../i18n.js';\nimport type { ProductData } from '../types';\n\nconst { t } = useI18n();\n\ninterface Props {\n product?: Partial<ProductData>;\n onSubmit: (product: Partial<ProductData>) => void;\n onCancel?: () => void;\n loading?: boolean;\n}\n\nconst { product = {}, onSubmit, onCancel, loading = false }: Props = $props();\n\nconst formData = $state({\n name: product.name || '',\n description: product.description || '',\n price: product.price || 0,\n inStock: product.inStock ?? true,\n category: product.category || '',\n tags: product.tags?.join(', ') || '',\n});\n\nlet errors = $state<Record<string, string>>({});\n\nfunction validateForm() {\n errors = {};\n\n if (!formData.name.trim()) {\n errors.name = 'Product name is required';\n }\n\n if (formData.price < 0) {\n errors.price = 'Price must be non-negative';\n }\n\n return Object.keys(errors).length === 0;\n}\n\nfunction handleSubmit(event: Event) {\n event.preventDefault();\n\n if (!validateForm()) {\n return;\n }\n\n const productData: Partial<ProductData> = {\n ...product,\n name: formData.name.trim(),\n description: formData.description.trim() || undefined,\n price: formData.price,\n inStock: formData.inStock,\n category: formData.category.trim(),\n tags: formData.tags\n ? formData.tags\n .split(',')\n .map((tag) => tag.trim())\n .filter(Boolean)\n : [],\n };\n\n onSubmit(productData);\n}\n</script>\n\n<div class=\"product-form-shell\">\n <Form onsubmit={handleSubmit} class=\"product-form\">\n <div class=\"form-group\">\n <label for=\"name\">{t(M['products.product_form.name_label'])}</label>\n <Input\n id=\"name\"\n type=\"text\"\n bind:value={formData.name}\n disabled={loading}\n class={errors.name ? 'error' : ''}\n placeholder={t(M['products.product_form.name_placeholder'])}\n />\n {#if errors.name}\n <span class=\"error-message\">{errors.name}</span>\n {/if}\n </div>\n\n <div class=\"form-group\">\n <label for=\"description\">Description</label>\n <Textarea\n id=\"description\"\n bind:value={formData.description}\n disabled={loading}\n placeholder={t(M['products.product_form.description_placeholder'])}\n rows={3}\n ></Textarea>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label for=\"price\">Price *</label>\n <Input\n id=\"price\"\n type=\"number\"\n step=\"0.01\"\n min=\"0\"\n bind:value={formData.price}\n disabled={loading}\n class={errors.price ? 'error' : ''}\n placeholder=\"0.00\"\n />\n {#if errors.price}\n <span class=\"error-message\">{errors.price}</span>\n {/if}\n </div>\n\n <div class=\"form-group\">\n <label for=\"category\">Category</label>\n <Input\n id=\"category\"\n type=\"text\"\n bind:value={formData.category}\n disabled={loading}\n placeholder={t(M['products.product_form.category_placeholder'])}\n />\n </div>\n </div>\n\n <div class=\"form-group\">\n <label for=\"tags\">Tags</label>\n <Input\n id=\"tags\"\n type=\"text\"\n bind:value={formData.tags}\n disabled={loading}\n placeholder={t(M['products.product_form.tags_placeholder'])}\n />\n <small class=\"form-hint\">{t(M['products.product_form.tags_hint'])}</small>\n </div>\n\n <div class=\"form-group\">\n <label class=\"checkbox-label\">\n <!-- raw-primitive-allow: native checkbox; no Provider-free checkbox primitive (Toggle is a switch with different semantics, CheckboxInput requires a Provider) -->\n <input\n type=\"checkbox\"\n bind:checked={formData.inStock}\n disabled={loading}\n class=\"form-checkbox\"\n />\n {t(M['products.product_form.in_stock_label'])}\n </label>\n </div>\n\n <div class=\"form-actions\">\n {#if onCancel}\n <Button type=\"button\" variant=\"secondary\" onclick={onCancel} disabled={loading}>\n Cancel\n </Button>\n {/if}\n\n <Button type=\"submit\" variant=\"primary\" disabled={loading}>\n {#if loading}\n Saving...\n {:else}\n {product.id ? 'Update Product' : 'Create Product'}\n {/if}\n </Button>\n </div>\n </Form>\n</div>\n\n<style>\n .product-form-shell :global(.product-form) {\n max-width: 500px;\n padding: 1.5rem;\n background: var(--smrt-color-surface, #fff);\n border-radius: var(--smrt-radius-md, 8px);\n border: 1px solid var(--smrt-color-outline-variant, #e2e8f0);\n }\n\n .form-group {\n margin-bottom: 1rem;\n }\n\n .form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n }\n\n label {\n display: block;\n margin-bottom: 0.25rem;\n font-weight: var(--smrt-typography-weight-medium, 500);\n color: var(--smrt-color-on-surface, #374151);\n font-size: var(--smrt-typography-label-large-size, 0.875rem);\n }\n\n /* Error border on the migrated <Input>. The primitive renders the inner\n <input class=\"input error\"> inside its own component, so the scoped class\n can't reach it without :global (#1589). */\n .product-form-shell :global(.input.error) {\n border-color: var(--smrt-color-error, #dc2626);\n }\n\n .checkbox-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n }\n \n .form-checkbox {\n width: auto;\n }\n \n .form-hint {\n color: var(--smrt-color-on-surface-variant, #6b7280);\n font-size: var(--smrt-typography-body-small-size, 0.75rem);\n margin-top: 0.25rem;\n }\n\n .error-message {\n color: var(--smrt-color-error, #dc2626);\n font-size: var(--smrt-typography-label-medium-size, 0.75rem);\n margin-top: 0.25rem;\n display: block;\n }\n\n .form-actions {\n display: flex;\n gap: 0.75rem;\n justify-content: flex-end;\n margin-top: 1.5rem;\n padding-top: 1rem;\n border-top: 1px solid var(--smrt-color-outline-variant, #f3f4f6);\n }\n</style>"],"names":["root","root_1","root_2","root_3","$$anchor"],"mappings":"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"}
|