1import{r as u,j as e,i as R,m as z}from"./react-vendor-DTEXiHme.js";import{T as K,a as H,b,c as j}from"./tabs-C_TdZTlp.js";import{c as O,y as x,Z as C,i as D,_ as T,N as I,T as Y,s as w,a2 as G,a3 as V,a4 as Q,a5 as $,f as Z,a as J,B as q,a1 as P,z as v}from"./index-Cas2BA8G.js";import{I as X}from"./input-COMpcq49.js";import{T as ee}from"./textarea-Db7f5MqQ.js";import{L as N}from"./label-CPIAGVc8.js";import{S as te,a as ae,b as se,c as re,d as m}from"./select-Dd8j6Fts.js";import{C as ie,a as oe,b as ne}from"./collapsible-BFh2z4kF.js";import{s as ce,f as k}from"./format-CpEgwowc.js";import{t as le}from"./en-US-Ca8fhmg7.js";import{R as F}from"./rocket-CBk7Ppn2.js";import{W as de}from"./wrench-BYZfoqG1.js";import{S as W}from"./shield-check-CZN8d-nb.js";import{u as ue}from"./use-toast-DgHT1ktz.js";import{B as _}from"./book-open-QVT6dP1z.js";import{C as he}from"./circle-help-DH0PhjCT.js";import{T as pe}from"./ticket-check-C2Fjt1AO.js";import{S as me}from"./scroll-text-CM0WtmS5.js";import{S as L}from"./send-7xIYpK1r.js";import{H as ge}from"./history-Y1YHfrMP.js";import"./excel-CPlAJqTR.js";import"./radix-C8G44Doi.js";import"./toast-utils-DbfcVDp6.js";import"./copy-CFeQEnPt.js";/** 2 * @license lucide-react v0.462.0 - ISC 3 * 4 * This source code is licensed under the ISC license. 5 * See the LICENSE file in the root directory of this source tree. 6 */const fe=O("Bug",[["path",{d:"m8 2 1.88 1.88",key:"fmnt4t"}],["path",{d:"M14.12 3.88 16 2",key:"qol33r"}],["path",{d:"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1",key:"d7y7pr"}],["path",{d:"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6",key:"xs1cw7"}],["path",{d:"M12 20v-9",key:"1qisl0"}],["path",{d:"M6.53 9C4.6 8.8 3 7.1 3 5",key:"32zzws"}],["path",{d:"M6 13H2",key:"82j7cp"}],["path",{d:"M3 21c0-2.1 1.7-3.9 3.8-4",key:"4p0ekp"}],["path",{d:"M20.97 5c0 2.1-1.6 3.8-3.5 4",key:"18gb23"}],["path",{d:"M22 13h-4",key:"1jl80f"}],["path",{d:"M17.2 17c2.1.1 3.8 1.9 3.8 4",key:"k3fwyw"}]]);function xe(r,a){const t=a==null?void 0:a.weekStartsOn,n=le(r),i=n.getDay(),l=(i<t?-7:0)+6-(i-t);return n.setDate(n.getDate()+l),n.setHours(23,59,59,999),n}const U={feature:{label:"New Feature",icon:F,color:"bg-purple-500/15 text-purple-700 border-purple-500/30"},improvement:{label:"Improvement",icon:de,color:"bg-sky-500/15 text-sky-700 border-sky-500/30"},bugfix:{label:"Bug Fix",icon:fe,color:"bg-amber-500/15 text-amber-700 border-amber-500/30"},breaking:{label:"Breaking Change",icon:Y,color:"bg-red-500/15 text-red-700 border-red-500/30"},security:{label:"Security",icon:W,color:"bg-emerald-500/15 text-emerald-700 border-emerald-500/30"}},ye=()=>{const[r,a]=u.useState([]),[t,n]=u.useState(!0);if(u.useEffect(()=>{(async()=>{const{data:h}=await w.from("changelog_entries").select("id, title, description, category, version, published_at, approved_at").in("status",["approved","published"]).order("approved_at",{ascending:!1});a(h||[]),n(!1)})()},[]),t)return e.jsx("p",{className:"text-muted-foreground py-8 text-center",children:"Loading changelogâ¦"});if(r.length===0)return e.jsx("p",{className:"text-muted-foreground py-8 text-center",children:"No changelog entries yet. Check back soon!"});const i={};return r.forEach(l=>{const h=l.published_at||l.approved_at;if(!h){(i.Unknown||(i.Unknown=[])).push(l);return}const o=new Date(h),p=ce(o,{weekStartsOn:1}),g=xe(o,{weekStartsOn:1}),f=`${k(p,"MMM d")} â ${k(g,"MMM d, yyyy")}`;(i[f]||(i[f]=[])).push(l)}),e.jsx("div",{className:"space-y-8 max-w-3xl",children:Object.entries(i).map(([l,h])=>e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold text-foreground mb-3",children:l}),e.jsx("div",{className:"space-y-3",children:h.map(o=>{const p=U[o.category]||U.improvement,g=p.icon;return e.jsx(ie,{children:e.jsxs(x,{className:"border",children:[e.jsx(oe,{asChild:!0,children:e.jsxs(C,{className:"pb-2 cursor-pointer group",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx(D,{className:"h-4 w-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-90"}),e.jsx(g,{className:"h-4 w-4 text-muted-foreground"}),e.jsx(T,{className:"text-base",children:o.title}),e.jsx(I,{className:p.color,children:p.label}),o.version&&e.jsx(I,{variant:"outline",className:"text-xs",children:o.version})]}),(o.published_at||o.approved_at)&&e.jsx("p",{className:"text-xs text-muted-foreground pl-6",children:k(new Date(o.published_at||o.approved_at),"MMM d, yyyy")})]})}),e.jsx(ne,{children:e.jsx("div",{className:"px-6 pb-4",children:e.jsx("p",{className:"text-sm text-muted-foreground whitespace-pre-line",children:o.description})})})]})},o.id)})})]},l))})},be=[{category:"AI Credits & Usage",items:[{q:"What are AI credits and how are they consumed?",a:"AI credits are the unit of measurement for all AI-powered features in SKUuz, including content generation, image metadata extraction, and smart enrichment. Each time you generate a product description, feature bullet, SEO title, meta description, or other AI-powered field, credits are deducted based on the number of tokens processed by the AI model â this includes both input tokens (your prompt and product data) and output tokens (the generated content). You can monitor your current credit consumption in real time from the Control Panel dashboard, which displays a usage meter showing your remaining balance and consumption trend."},{q:"Where can I see how many AI credits I have left?",a:"Your remaining credits are displayed in the Control Panel usage meters on the dashboard. The meter shows your current usage as a percentage of your monthly allotment, along with the exact number of credits consumed and remaining. SKUuz also sends proactive threshold alerts at 25%, 50%, 75%, 90%, and 100% usage so you're never caught off guard. These alerts appear as in-app notifications that can be dismissed per billing period."},{q:"What happens when I run out of AI credits?",a:"When your monthly AI credit allotment is fully consumed, all AI-powered generation features are temporarily paused until the start of your next billing cycle. You'll see a clear notification in the Control Panel indicating that credits are exhausted. You can upgrade your plan at any time from the Control Panel to get a higher monthly allotment â the new limits take effect immediately. Your existing product data and manually-entered content are never affected; only AI generation features are paused."}
6,{q:"Which fields support AI content generation?",a:"By default, SKUuz ships with AI Field Prompts configured for Product Description, Short Description, SEO Title, Meta Description, and Feature Bullets. However, AI content generation is not limited to these fields â admins can create AI Field Prompts for any text-based attribute in the data model, including custom attributes and category-specific attributes. This means you can use AI to generate content for fields like Marketing Copy, Social Media Captions, Care Instructions, or any other text field you define."}]},{category:"Products & Data",items:[{q:"How do I bulk-import products?",a:"Navigate to Channels â Import in the PIM sidebar and click 'Upload File'. You can upload a CSV or Excel (.xlsx) file up to 100 MB. The guided wizard walks you through four steps: Upload â Map Columns (where SKUuz auto-suggests matches and lets you configure per-column transforms) â Dry Run Preview (Starter plan and above, showing exactly what will be created, updated, or skipped) â Run Import. You can also pull products directly from a connected Shopify channel or push data via the ERP Import API for automated ingestion."},{q:"What's the difference between product attributes and category-specific attributes?",a:"Product attributes apply universally to every product in your catalog â fields like Title, Description, Price, SKU, and Brand. Category-specific attributes are custom fields that only appear for products assigned to particular categories in your hierarchy. For example, 'Sleeve Length' might only apply to products categorised as Tops, while 'Wattage' only applies to Lighting. This keeps your data model clean and focused, showing each product only the fields that are relevant to its category."},{q:"What does the Published dot mean?",a:"The coloured dot next to each product indicates its current publish channel assignment status. A green dot means the product is assigned to at least one publish channel node â it's either already synced to Shopify or queued for the next publish. A yellow dot means the product exists in the PIM but has not been assigned to any channel node yet. This reflects the current assignment state, not historical publish status."},{q:"How does inline editing work in the data grid?",a:"Double-click any cell to enter edit mode. Text fields open an inline input, numbers show a numeric input with validation, booleans toggle on click, dates open a picker, and list fields open a searchable dropdown. Navigate with Tab, Enter, and Escape. Copy-paste works across rows and columns (including from Excel or Google Sheets), and Ctrl+Z / Cmd+Z undoes the last change."}]},{category:"Publishing & Shopify",items:[{q:"How does publishing to Shopify work?",a:"SKUuz compares your catalog data with the current state of products in Shopify. Products are categorised as Create (new to Shopify), Update (existing but with changed data), or Skip (no changes detected). You can review the 'Items to Sync' preview modal to see exactly what will happen, deselect individual products if needed, and then confirm the publish. SKUuz sends GraphQL mutations to Shopify using your configured field mappings, including support for native fields and custom metafields."},{q:"What is the Channel Listener?",a:"The Channel Listener (available on Growth plans and above) is a real-time monitoring feature that watches for product changes in your PIM and automatically queues them for syncing to Shopify. When you edit a mapped attribute, the Channel Listener detects the change, evaluates publish rules, and if the product passes all rules, adds it to the publish queue automatically. This eliminates manual publish triggers. Enable it per channel in the Control Panel, and monitor its activity in the Channel Listener Log."},{q:"What are publish rules?",a:"Publish rules are quality gates that control which products are eligible for publishing. Each rule evaluates product attributes against conditions you define â for example, 'Description is not empty', 'Image count > 0', and 'Price > 0'. SKUuz calculates a readiness score per product (percentage of rules passed) and only allows products that meet all rules to be published. Rules can target specific categories or apply globally, and can be scheduled to run automatically."}]},{category:"Account & Access",items:[{q:"What roles are available?",a:"SKUuz supports five roles with distinct permission levels: Owner (full organisation control including billing), Admin (data model and settings management), Manager (product management with import and publish access), Operator (product viewing and editing with restricted admin access), and Client (read-only catalog access with no Control Panel access). Roles are assigned from the Users section and enforced via database-level security policies."},{q:"How do I upgrade my plan?",a:"Navigate to Control Panel in the PIM sidebar. Your current plan tier is displayed at the top with a badge. Click 'Upgrade Plan' to open the plan selector, compare tiers side by side, choose monthly or annual billing, and complete the secure Stripe checkout. New limits and features take effect immediately."},{q:"How is my data kept secure?",a:"SKUuz uses enterprise-grade security including TLS encryption for all data in transit, encryption at rest, row-level security (RLS) policies that isolate every organisation's data at the database level, JWT-authenticated sessions, and encrypted storage for sensitive credentials like Shopify tokens and SFTP passwords. Your product data is never shared with third parties or used to train AI models."},{q:"Do I have to have Shopify to use SKUuz?",a:"No â SKUuz works with any e-commerce platform. While Shopify is our flagship integration, you can use SKUuz as a standalone PIM to centralise and enrich your catalog regardless of where you sell. If you operate on WooCommerce, BigCommerce, Magento, Amazon, or any other platform, we can build a dedicated connector tailored to your specific use case for a small one-time charge. If you are not yet a SKUuz user, visit the Contact page on our website to get in touch, or submit a Support Ticket from the tab above if you are already logged in."}]}],je=()=>e.jsx("div",{className:"space-y-6 max-w-3xl",children:be.map(r=>e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold text-foreground mb-2",children:r.category}),e.jsx(G,{type:"multiple",className:"space-y-1",children:r.items.map((a,t)=>e.jsxs(V,{value:`${r.category}-${t}`,className:"border rounded-lg px-4",children:[e.jsx(Q,{className:"text-sm text-left",children:a.q}),e.jsx($,{className:"text-sm text-muted-foreground",children:a.a})]},t))})]},r.category))}),we=r=>{switch(r){case"Received":return"secondary";case"In Process":return"default";
6case"Resolved":return"outline";case"Not Resolved":return"destructive";default:return"secondary"}},ve=()=>{const{toast:r}=ue(),{user:a,profile:t}=Z(),{currentOrg:n}=J(),[i,l]=u.useState(!1),[h,o]=u.useState(!1),[p,g]=u.useState(!0),[f,B]=u.useState([]),[d,y]=u.useState({subject:"",category:"",description:""}),A=async()=>{if(a!=null&&a.id){g(!0);try{const{data:s,error:c}=await w.from("support_tickets").select("*").eq("user_id",a.id).order("created_at",{ascending:!1});if(c)throw c;B(s||[])}catch(s){console.error("Failed to load tickets:",s)}finally{g(!1)}}};u.useEffect(()=>{A()},[a==null?void 0:a.id]);const E=async s=>{if(s.preventDefault(),!d.subject.trim()||!d.category||!d.description.trim()){r({title:"Please fill in all fields",variant:"destructive"});return}o(!0);try{const{data:c,error:M}=await w.from("support_tickets").insert({user_id:a==null?void 0:a.id,org_id:n==null?void 0:n.id,user_email:(t==null?void 0:t.email)||(a==null?void 0:a.email)||"",subject:d.subject.trim().slice(0,200),category:d.category,description:d.description.trim().slice(0,5e3),status:"Received"}).select().single();if(M)throw M;w.functions.invoke("send-notification",{body:{type:"support_ticket_created",payload:{ticketId:c==null?void 0:c.id,userEmail:(t==null?void 0:t.email)||(a==null?void 0:a.email)||"",userName:(t==null?void 0:t.full_name)||"",subject:d.subject.trim(),category:d.category,description:d.description.trim().slice(0,1e3)}}}).catch(console.error),r({title:"Support ticket submitted",description:"We'll get back to you shortly."}),y({subject:"",category:"",description:""}),l(!1),A()}catch(c){console.error("Ticket submission error:",c),r({title:"Failed to submit ticket",description:c.message,variant:"destructive"})}finally{o(!1)}};return e.jsxs("div",{className:"space-y-6 max-w-3xl",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"Your Support Tickets"}),e.jsxs(q,{onClick:()=>l(!i),size:"sm",children:[e.jsx(L,{className:"h-4 w-4 mr-2"}),i?"Cancel":"New Ticket"]})]}),i&&e.jsxs(x,{children:[e.jsxs(C,{children:[e.jsx(T,{className:"text-base",children:"Submit a Support Ticket"}),e.jsx(P,{children:"Describe your issue or question and we'll get back to you."})]}),e.jsx(v,{children:e.jsxs("form",{onSubmit:E,className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(N,{htmlFor:"ticket-subject",children:"Subject"}),e.jsx(X,{id:"ticket-subject",placeholder:"Brief summary",maxLength:200,value:d.subject,onChange:s=>y(c=>({...c,subject:s.target.value}))})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(N,{htmlFor:"ticket-category",children:"Category"}),e.jsxs(te,{value:d.category,onValueChange:s=>y(c=>({...c,category:s})),children:[e.jsx(ae,{id:"ticket-category",children:e.jsx(se,{placeholder:"Select a category"})}),e.jsxs(re,{children:[e.jsx(m,{value:"general",children:"General Question"}),e.jsx(m,{value:"bug",children:"Bug Report"}),e.jsx(m,{value:"ai_credits",children:"AI Credits & Billing"}),e.jsx(m,{value:"publishing",children:"Publishing & Shopify"}),e.jsx(m,{value:"import",children:"Import & Data"}),e.jsx(m,{value:"account",children:"Account & Access"}),e.jsx(m,{value:"feature_request",children:"Feature Request"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(N,{htmlFor:"ticket-desc",children:"Description"}),e.jsx(ee,{id:"ticket-desc",placeholder:"Describe your issueâ¦",rows:5,maxLength:5e3,value:d.description,onChange:s=>y(c=>({...c,description:s.target.value}))})]}),e.jsxs(q,{type:"submit",disabled:h,className:"w-full",children:[e.jsx(L,{className:"h-4 w-4 mr-2"}),h?"Submittingâ¦":"Submit Ticket"]})]})})]}),p?e.jsx("p",{className:"text-sm text-muted-foreground",children:"Loading ticketsâ¦"}):f.length===0?e.jsx(x,{children:e.jsxs(v,{className:"flex flex-col items-center gap-3 py-10",children:[e.jsx(ge,{className:"h-10 w-10 text-muted-foreground"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"No tickets submitted yet."})]})}):e.jsx("div",{className:"space-y-3",children:f.map(s=>e.jsxs(x,{children:[e.jsx(C,{className:"pb-2",children:e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"space-y-1 min-w-0",children:[e.jsx(T,{className:"text-sm font-medium truncate",children:s.subject}),e.jsxs(P,{className:"text-xs",children:[s.category," · ",k(new Date(s.created_at),"MMM d, yyyy 'at' h:mm a")]})]}),e.jsx(I,{variant:we(s.status),children:s.status})]})}),e.jsxs(v,{className:"space-y-2",children:[e.jsx("p",{className:"text-sm text-muted-foreground whitespace-pre-wrap",children:s.description}),s.admin_notes&&e.jsxs("div",{className:"mt-3 p-3 rounded-md bg-muted/50 border",children:[e.jsx("p",{className:"text-xs font-semibold text-foreground mb-1",children:"Support Response:"}),e.jsx("p",{className:"text-sm text-muted-foreground whitespace-pre-wrap",children:s.admin_notes})]})]})]},s.id))})]})},S=({icon:r,title:a,description:t,href:n})=>{const i=z();return e.jsx(x,{className:"cursor-pointer hover:border-primary/40 transition-colors",onClick:()=>i(n),children:e.jsxs(v,{className:"flex items-center gap-4 p-5",children:[e.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center shrink-0",children:e.jsx(r,{className:"h-5 w-5 text-primary"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"font-semibold text-foreground text-sm",children:a}),e.jsx("p",{className:"text-xs text-muted-foreground mt-0.5",children:t})]}),e.jsx(D,{className:"h-4 w-4 text-muted-foreground shrink-0"})]})})},Ge=()=>{const r=R(),a=z(),t=r.state,[n,i]=u.useState((t==null?void 0:t.tab)||"guides");return u.useEffect(()=>{(t==null?void 0:t.tab)==="user-guide"?a("/support/user-guide",{state:{section:t.section},replace:!0}):(t==null?void 0:t.tab)==="admin-guide"?a("/support/admin-guide",{state:{section:t.section},replace:!0}):(t==null?void 0:t.tab)==="quick-start"?a("/support/quick-start",{replace:!0}):t!=null&&t.tab&&i(t.tab)},[t,a]),e.jsx("div",{className:"h-full overflow-auto",children:e.jsxs("div",{className:"p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:"Knowledge Base & Support"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"Tutorials, frequently asked questions, and a way to reach our support team."})]}),e.jsxs(K,{value:n,onValueChange:i,className:"w-full",children:[e.jsxs(H,{
6className:"mb-4",children:[e.jsxs(b,{value:"guides",className:"gap-1.5",children:[e.jsx(_,{className:"h-4 w-4"}),"Guides"]}),e.jsxs(b,{value:"faqs",className:"gap-1.5",children:[e.jsx(he,{className:"h-4 w-4"}),"FAQs"]}),e.jsxs(b,{value:"support",className:"gap-1.5",children:[e.jsx(pe,{className:"h-4 w-4"}),"Support Tickets"]}),e.jsxs(b,{value:"changelog",className:"gap-1.5",children:[e.jsx(me,{className:"h-4 w-4"}),"Change Log"]})]}),e.jsx(j,{value:"guides",children:e.jsxs("div",{className:"max-w-2xl space-y-3",children:[e.jsx(S,{icon:F,title:"Quick Start Guide",description:"First-time setup walkthrough for new organizations",href:"/support/quick-start"}),e.jsx(S,{icon:_,title:"User Guide",description:"Comprehensive guide for all product management features",href:"/support/user-guide"}),e.jsx(S,{icon:W,title:"Admin Guide",description:"Configuration and administration reference for admins and owners",href:"/support/admin-guide"})]})}),e.jsx(j,{value:"faqs",children:e.jsx(je,{})}),e.jsx(j,{value:"support",children:e.jsx(ve,{})}),e.jsx(j,{value:"changelog",children:e.jsx(ye,{})})]})]})})};export{Ge as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.