Desfruta da cultura portuguesa

Recorda-te da cultura portuguesa

A LUSOFILO é uma marca de roupa portuguesa onde tem como principal objetivo recordar e apreciar a cultura portuguesa, estejas a morar em Portugal, ou estejas a morar noutro país e sentes saudades dos nossos costumes.

Não precisas de ser português

A nossa marca também engloba pessoas que não sejam portuguesas, se alguma vez estiveste em Portugal e adoras-te esta cultura, então esta marca é para ti!

Contact Us

Ask us about our products or request support!

Campo obrigatório
Campo obrigatório
Campo obrigatório

By sending this message, you agree to our Privacy Policy and Personal Data Processing Terms.

Informações de contacto

// GENERATED from dc-runtime/src/*.ts — do not edit. Rebuild with `cd dc-runtime && bun run build`. "use strict"; (() => { var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); // src/react.ts function getReact() { const R = window.React; if (!R) throw new Error("dc-runtime: window.React is not available yet"); return R; } function getReactDOM() { const RD = window.ReactDOM; if (!RD) throw new Error("dc-runtime: window.ReactDOM is not available yet"); return RD; } var h = ((...args) => getReact().createElement( ...args )); // src/parse.ts function parseDcDocument(doc) { const dc = doc.querySelector("x-dc"); if (!dc) return null; const scriptEl = doc.querySelector("script[data-dc-script]"); const { props, preview } = parseDataProps( scriptEl?.getAttribute("data-props") ?? null ); return { template: dc.innerHTML, js: scriptEl ? scriptEl.textContent || "" : "", props, preview }; } function parseDcText(src) { const openMatch = /]*)?>/.exec(src); if (!openMatch) return null; const close = src.lastIndexOf(""); if (close === -1 || close < openMatch.index) return null; const template = src.slice(openMatch.index + openMatch[0].length, close); const doc = new DOMParser().parseFromString(src, "text/html"); const scriptEl = doc.querySelector("script[data-dc-script]"); const { props, preview } = parseDataProps( scriptEl?.getAttribute("data-props") ?? null ); return { template, js: scriptEl ? scriptEl.textContent || "" : "", props, preview }; } function parseDataProps(raw) { if (!raw) return { props: null, preview: null }; let parsed; try { parsed = JSON.parse(raw); } catch { return { props: null, preview: null }; } if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { return { props: null, preview: null }; } const obj = parsed; const preview = obj.$preview && typeof obj.$preview === "object" ? obj.$preview : null; const rest = {}; for (const k of Object.keys(obj)) { if (k[0] !== "$") rest[k] = obj[k]; } return { props: Object.keys(rest).length ? rest : null, preview }; } function dcNameFromPath(pathname) { let p = pathname || ""; try { p = decodeURIComponent(p); } catch { } const base = p.split("/").pop() || "Root"; return base.replace(/\.dc\.html$/, "").replace(/\.html?$/, "") || "Root"; } // src/boot.ts var BASE_CSS = ` .sc-placeholder{background:color-mix(in srgb,currentColor 8%,transparent); border:1px solid color-mix(in srgb,currentColor 50%,transparent); border-radius:2px;box-sizing:border-box;overflow:hidden} @keyframes sc-shine{0%{background-position:100% 50%}100%{background-position:0% 50%}} html.sc-dc-streaming .sc-placeholder, html.sc-dc-streaming .sc-interp.sc-missing{position:relative; background:color-mix(in srgb,currentColor 5%,transparent); border-color:transparent} html.sc-dc-streaming .sc-placeholder::before, html.sc-dc-streaming .sc-interp.sc-missing::before{content:''; position:absolute;inset:0;pointer-events:none; background:linear-gradient(90deg,rgba(217,119,87,0) 25%,rgba(247,225,211,.95) 37%,rgba(217,119,87,0) 63%); background-size:400% 100%;animation:sc-shine 1.4s ease infinite} html.sc-dc-streaming .sc-placeholder:nth-child(n+9 of .sc-placeholder)::before, html.sc-dc-streaming .sc-interp.sc-missing:nth-child(n+9 of .sc-interp.sc-missing)::before{animation:none; background:color-mix(in srgb,currentColor 8%,transparent)} .sc-placeholder-error{padding:4px 8px;font:11px/1.4 ui-monospace,monospace; color:color-mix(in srgb,currentColor 70%,transparent);word-break:break-word} .sc-interp.sc-missing{display:inline-block;width:2em;height:1em;overflow:hidden; vertical-align:text-bottom;background:rgba(255,255,255,.3);border:1px solid rgba(0,0,0,.5); border-radius:2px;box-sizing:border-box;color:transparent; user-select:none} .sc-interp.sc-unresolved{font-family:ui-monospace,monospace;font-size:.85em; color:color-mix(in srgb,currentColor 50%,transparent); background:color-mix(in srgb,currentColor 10%,transparent);border-radius:3px; padding:0 3px} .sc-host.sc-has-error{position:relative} .sc-logic-error{position:absolute;top:8px;left:8px;z-index:2147483647;max-width:60ch; padding:6px 10px;background:#b00020;color:#fff;font:12px/1.4 ui-monospace,monospace; border-radius:4px;white-space:pre-wrap;pointer-events:none} /* Mirrors PRINT_BASELINE_CSS in apps/web deck-stage-export.ts \u2014 keep both in sync until dc-runtime regains a build step. */ @media print { @page { margin: 0.5cm; } figure, table { break-inside: avoid; } #dc-root, #dc-root > .sc-host { height: auto; } *, *::before, *::after { print-color-adjust: exact; -webkit-print-color-adjust: exact; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; animation-delay: -99s !important; animation-duration: .001s !important; animation-iteration-count: 1 !important; animation-fill-mode: both !important; animation-play-state: running !important; transition-duration: 0s !important; } } `; var FULL_PAGE_CSS = "html,body{height:100%;margin:0}#dc-root,#dc-root>.sc-host{height:100%}"; function rootNameForDocument(doc, loc) { let bootPath = loc.pathname || ""; if (!/\.dc\.html?$/i.test(safeDecode(bootPath))) { try { bootPath = new URL(doc.baseURI || "/").pathname;