Nicholai b20db98051
Some checks failed
CI / build-and-test (pull_request) Failing after 1m19s
feat(ci,flags,ops): ship end-to-end CI, feature-flag framework, gated surfaces, and ops docs
CI (.gitea/workflows/ci.yaml): lint → typecheck → vitest w/ coverage → OpenNext build → preview smoke → bundle-size budgets; Node 20; npm ci; artifacts; safe env; D1 dry-run scaffold.

Budgets: add scripts/budgets.mjs; TOTAL_STATIC_MAX_BYTES and MAX_ASSET_BYTES thresholds; report top offenders; fail on breach; README CI section.

Flags: add lib/flags.ts with typed booleans and safe defaults (ADMIN_ENABLED, ARTISTS_MODULE_ENABLED, UPLOADS_ADMIN_ENABLED, BOOKING_ENABLED, PUBLIC_APPOINTMENT_REQUESTS_ENABLED, REFERENCE_UPLOADS_PUBLIC_ENABLED, DEPOSITS_ENABLED, PUBLIC_DB_ARTISTS_ENABLED, ADVANCED_NAV_SCROLL_ANIMATIONS_ENABLED, STRICT_CI_GATES_ENABLED, ISR_CACHE_R2_ENABLED); robust parsing; client provider; unit tests.

Wiring: gate Admin shell and admin write APIs (503 JSON on uploads and artists writes); disable booking submit and short-circuit booking mutations when off; render static Hero/Artists when advanced animations off; tests for UI and API guards.

Ops: expand docs/prd/rollback-strategy.md with “Feature Flags Operations,” Cloudflare Dashboard and wrangler.toml steps, preview simulation, incident playbook, and post-toggle smoke checklist.

Release: add docs/releases/2025-09-19-feature-flags-rollout.md with last-good commit, preview/production flag matrices, rollback notes, and smoke results; link from rollback doc.

Chore: fix TS issues (gift-cards boolean handling, Lenis options, tailwind darkMode), remove next-on-pages peer conflict, update package.json scripts, configure Gitea act_runner label, open draft PR to trigger CI.

Refs: CI-1, FF-1, FF-2, FF-3, OPS-1
Impact: defaults preserve current behavior; no runtime changes unless flags flipped
2025-09-19 21:33:09 -06:00

1 line
14 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(()=>{var e={};e.id=385,e.ids=[385],e.modules={72934:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},55315:e=>{"use strict";e.exports=require("path")},17360:e=>{"use strict";e.exports=require("url")},59889:(e,t,a)=>{"use strict";a.r(t),a.d(t,{GlobalError:()=>n.a,__next_app__:()=>u,originalPathname:()=>h,pages:()=>d,routeModule:()=>p,tree:()=>c}),a(64471),a(40656),a(40509),a(70546);var s=a(30170),r=a(45002),i=a(83876),n=a.n(i),l=a(66299),o={};for(let e in l)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(o[e]=()=>l[e]);a.d(t,o);let c=["",{children:["privacy",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(a.bind(a,64471)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/privacy/page.tsx"]}]},{metadata:{icon:[async e=>(await Promise.resolve().then(a.bind(a,57481))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}]},{layout:[()=>Promise.resolve().then(a.bind(a,40656)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/layout.tsx"],error:[()=>Promise.resolve().then(a.bind(a,40509)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/error.tsx"],"not-found":[()=>Promise.resolve().then(a.bind(a,70546)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/not-found.tsx"],metadata:{icon:[async e=>(await Promise.resolve().then(a.bind(a,57481))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}],d=["/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/privacy/page.tsx"],h="/privacy/page",u={require:a,loadChunk:()=>Promise.resolve()},p=new s.AppPageRouteModule({definition:{kind:r.x.APP_PAGE,page:"/privacy/page",pathname:"/privacy",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:c}})},91565:(e,t,a)=>{Promise.resolve().then(a.bind(a,66696)),Promise.resolve().then(a.bind(a,39261)),Promise.resolve().then(a.bind(a,74750))},74750:(e,t,a)=>{"use strict";a.d(t,{PrivacyPage:()=>m});var s=a(97247),r=a(27757),i=a(2502),n=a(88964),l=a(26357),o=a(97792),c=a(26323);let d=(0,c.Z)("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]),h=(0,c.Z)("Cookie",[["path",{d:"M12 2a10 10 0 1 0 10 10 4 4 0 0 1-5-5 4 4 0 0 1-5-5",key:"laymnq"}],["path",{d:"M8.5 8.5v.01",key:"ue8clq"}],["path",{d:"M16 15.5v.01",key:"14dtrp"}],["path",{d:"M12 12v.01",key:"u5ubse"}],["path",{d:"M11 17v.01",key:"1hyl5a"}],["path",{d:"M7 14v.01",key:"uct60s"}]]),u=(0,c.Z)("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);var p=a(95389),x=a(79906);function m(){return(0,s.jsxs)("div",{className:"min-h-screen bg-black text-white",children:[(0,s.jsxs)("section",{className:"relative overflow-hidden",children:[s.jsx("div",{className:"absolute inset-0 opacity-[0.03]",children:s.jsx("img",{src:"/united-logo-full.jpg",alt:"",className:"w-full h-full object-cover object-center scale-150 blur-[2px]"})}),s.jsx("div",{className:"relative z-10 pt-28 pb-16 px-8 lg:px-16",children:(0,s.jsxs)("div",{className:"max-w-4xl mx-auto text-center",children:[s.jsx("h1",{className:"font-playfair text-5xl lg:text-7xl font-bold mb-6 tracking-tight",children:"Privacy Policy"}),s.jsx("p",{className:"text-xl text-gray-300 leading-relaxed max-w-3xl mx-auto",children:"We respect your privacy. This policy explains what information we collect, how we use it, and the choices you have. We keep it practical and transparent."}),s.jsx("div",{className:"mt-6",children:s.jsx(n.C,{variant:"outline",className:"border-white/30 text-white",children:"Last updated: 2025-09-16"})})]})})]}),s.jsx("section",{className:"px-8 lg:px-16",children:s.jsx("div",{className:"max-w-4xl mx-auto",children:(0,s.jsxs)(i.bZ,{className:"bg-white/5 border-white/10",children:[s.jsx(l.Z,{className:"h-5 w-5 text-white"}),(0,s.jsxs)(i.X,{className:"text-gray-300",children:["This Privacy Policy applies to united-tattoo.com and services offered by United Tattoo. For questions, email"," ",s.jsx(x.default,{href:"mailto:info@united-tattoo.com",className:"underline",children:"info@united-tattoo.com"})," or call"," ",s.jsx(x.default,{href:"tel:+17196989004",className:"underline",children:"(719) 698-9004"}),"."]})]})})}),s.jsx("section",{className:"px-8 lg:px-16 mt-12",children:(0,s.jsxs)("div",{className:"max-w-6xl mx-auto grid grid-cols-1 lg:grid-cols-2 gap-6",children:[(0,s.jsxs)(r.Zb,{className:"bg-white/5 border-white/10",children:[s.jsx(r.Ol,{children:(0,s.jsxs)(r.ll,{className:"text-white/90 flex items-center gap-2",children:[s.jsx(o.Z,{className:"w-5 h-5"})," Information We Collect"]})}),(0,s.jsxs)(r.aY,{className:"text-gray-300 space-y-3",children:[s.jsx("p",{children:"• Contact details (name, email, phone) when booking or contacting us."}),s.jsx("p",{children:"• Tattoo consultation details you provide (style, size, placement, references)."}),s.jsx("p",{children:"• Basic device/browser data for site functionality and security."}),s.jsx("p",{children:"• Optional social media links you share for portfolio references."})]})]}),(0,s.jsxs)(r.Zb,{className:"bg-white/5 border-white/10",children:[s.jsx(r.Ol,{children:(0,s.jsxs)(r.ll,{className:"text-white/90 flex items-center gap-2",children:[s.jsx(d,{className:"w-5 h-5"})," How We Use Your Info"]})}),(0,s.jsxs)(r.aY,{className:"text-gray-300 space-y-3",children:[s.jsx("p",{children:"• To schedule appointments and communicate about your booking."}),s.jsx("p",{children:"• To match you with an artist that fits your style and timeline."}),s.jsx("p",{children:"• To improve the website experience and studio operations."}),s.jsx("p",{children:"• To comply with health and safety regulations where applicable."})]})]}),(0,s.jsxs)(r.Zb,{className:"bg-white/5 border-white/10",children:[s.jsx(r.Ol,{children:(0,s.jsxs)(r.ll,{className:"text-white/90 flex items-center gap-2",children:[s.jsx(h,{className:"w-5 h-5"})," Cookies & Analytics"]})}),(0,s.jsxs)(r.aY,{className:"text-gray-300 space-y-3",children:[s.jsx("p",{children:"• We may use basic cookies for site functionality (e.g., forms, navigation)."}),s.jsx("p",{children:"• We may use privacy-friendly analytics to understand site usage at an aggregate level."}),s.jsx("p",{children:"• You can control cookies via your browser settings."})]})]}),(0,s.jsxs)(r.Zb,{className:"bg-white/5 border-white/10",children:[s.jsx(r.Ol,{children:(0,s.jsxs)(r.ll,{className:"text-white/90 flex items-center gap-2",children:[s.jsx(u,{className:"w-5 h-5"})," Sharing & Third Parties"]})}),(0,s.jsxs)(r.aY,{className:"text-gray-300 space-y-3",children:[s.jsx("p",{children:"• We do not sell your personal information."}),s.jsx("p",{children:"• We may share information with service providers (e.g., payment processors) to complete your request."}),s.jsx("p",{children:"• If legally required, we may disclose information to comply with applicable laws."})]})]}),(0,s.jsxs)(r.Zb,{className:"bg-white/5 border-white/10",children:[s.jsx(r.Ol,{children:(0,s.jsxs)(r.ll,{className:"text-white/90 flex items-center gap-2",children:[s.jsx(d,{className:"w-5 h-5"})," Retention & Security"]})}),(0,s.jsxs)(r.aY,{className:"text-gray-300 space-y-3",children:[s.jsx("p",{children:"• We retain information only as long as necessary for the purpose it was collected."}),s.jsx("p",{children:"• We implement reasonable safeguards to protect your information."}),s.jsx("p",{children:"• No method of transmission or storage is 100% secure, but we take your privacy seriously."})]})]}),(0,s.jsxs)(r.Zb,{className:"bg-white/5 border-white/10",children:[s.jsx(r.Ol,{children:(0,s.jsxs)(r.ll,{className:"text-white/90 flex items-center gap-2",children:[s.jsx(p.Z,{className:"w-5 h-5"})," Your Choices & Contact"]})}),(0,s.jsxs)(r.aY,{className:"text-gray-300 space-y-3",children:[s.jsx("p",{children:"• You can request updates, corrections, or deletion of your information where applicable."}),(0,s.jsxs)("p",{children:["• To exercise your choices, contact us at"," ",s.jsx(x.default,{href:"mailto:info@united-tattoo.com",className:"underline",children:"info@united-tattoo.com"})," ","or call"," ",s.jsx(x.default,{href:"tel:+17196989004",className:"underline",children:"(719) 698-9004"}),"."]}),s.jsx("p",{children:"• Well respond within a reasonable timeframe."})]})]}),(0,s.jsxs)(r.Zb,{className:"bg-white/5 border-white/10 lg:col-span-2",children:[s.jsx(r.Ol,{children:(0,s.jsxs)(r.ll,{className:"text-white/90 flex items-center gap-2",children:[s.jsx(l.Z,{className:"w-5 h-5"})," Updates to This Policy"]})}),s.jsx(r.aY,{className:"text-gray-300 space-y-3",children:s.jsx("p",{children:"We may update this Privacy Policy as our practices evolve. Well post the latest version on this page with the updated date. Continued use of our services means you accept any changes."})})]})]})}),s.jsx("section",{className:"px-8 lg:px-16 mt-12 pb-24",children:s.jsx("div",{className:"max-w-4xl mx-auto",children:s.jsx(r.Zb,{className:"bg-white/5 border-white/10",children:s.jsx(r.aY,{className:"p-6 text-gray-300",children:s.jsx("p",{children:"If you have privacy concerns, reach out. Were real humans and well help you out."})})})})})]})}},2502:(e,t,a)=>{"use strict";a.d(t,{Cd:()=>o,X:()=>c,bZ:()=>l});var s=a(97247);a(28964);var r=a(87972),i=a(25008);let n=(0,r.j)("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",{variants:{variant:{default:"bg-card text-card-foreground",destructive:"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90"}},defaultVariants:{variant:"default"}});function l({className:e,variant:t,...a}){return s.jsx("div",{"data-slot":"alert",role:"alert",className:(0,i.cn)(n({variant:t}),e),...a})}function o({className:e,...t}){return s.jsx("div",{"data-slot":"alert-title",className:(0,i.cn)("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",e),...t})}function c({className:e,...t}){return s.jsx("div",{"data-slot":"alert-description",className:(0,i.cn)("text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",e),...t})}},88964:(e,t,a)=>{"use strict";a.d(t,{C:()=>o});var s=a(97247);a(28964);var r=a(69008),i=a(87972),n=a(25008);let l=(0,i.j)("inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"}},defaultVariants:{variant:"default"}});function o({className:e,variant:t,asChild:a=!1,...i}){let o=a?r.g7:"span";return s.jsx(o,{"data-slot":"badge",className:(0,n.cn)(l({variant:t}),e),...i})}},76442:(e,t,a)=>{"use strict";a.d(t,{Z:()=>s});let s=(0,a(26323).Z)("ArrowUp",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]])},26357:(e,t,a)=>{"use strict";a.d(t,{Z:()=>s});let s=(0,a(26323).Z)("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]])},95389:(e,t,a)=>{"use strict";a.d(t,{Z:()=>s});let s=(0,a(26323).Z)("Mail",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]])},6683:(e,t,a)=>{"use strict";a.d(t,{Z:()=>s});let s=(0,a(26323).Z)("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]])},97792:(e,t,a)=>{"use strict";a.d(t,{Z:()=>s});let s=(0,a(26323).Z)("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]])},37013:(e,t,a)=>{"use strict";a.d(t,{Z:()=>s});let s=(0,a(26323).Z)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},64471:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>l});var s=a(72051),r=a(94604);let i=(0,a(45347).createProxy)(String.raw`/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/components/privacy-page.tsx#PrivacyPage`);var n=a(86006);function l(){return(0,s.jsxs)("main",{className:"min-h-screen",children:[s.jsx(r.W,{}),s.jsx("div",{className:"pt-16",children:s.jsx(i,{})}),s.jsx(n.$,{})]})}},54203:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ReflectAdapter",{enumerable:!0,get:function(){return a}});class a{static get(e,t,a){let s=Reflect.get(e,t,a);return"function"==typeof s?s.bind(e):s}static set(e,t,a,s){return Reflect.set(e,t,a,s)}static has(e,t){return Reflect.has(e,t)}static deleteProperty(e,t){return Reflect.deleteProperty(e,t)}}}};var t=require("../../webpack-runtime.js");t.C(e);var a=e=>t(t.s=e),s=t.X(0,[9379,5590,7598,9906,2222,5896],()=>a(59889));module.exports=s})();