@cimplify/sdk 0.39.0 → 0.39.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/styles.css CHANGED
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-scroll-snap-strictness:proximity;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-1\/2{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.col-span-full{grid-column:1/-1}.container{width:100%}.mx-auto{margin-inline:auto}.-mt-px{margin-top:-1px}.mr-auto{margin-right:auto}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-\[3\/4\]{aspect-ratio:3/4}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-\[5\/2\]{aspect-ratio:5/2}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-square{aspect-ratio:1}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[11px\]{height:11px}.h-\[18px\]{height:18px}.h-\[72px\]{height:72px}.h-\[min\(600px\,calc\(100vh-6rem\)\)\]{height:min(600px,100vh - 6rem)}.h-fit{height:fit-content}.h-full{height:100%}.max-h-\[85vh\]{max-height:85vh}.max-h-\[92vh\]{max-height:92vh}.max-h-\[100px\]{max-height:100px}.min-h-\[20px\]{min-height:20px}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-2\/5{width:40%}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-\[6px\]{width:6px}.w-\[7px\]{width:7px}.w-\[11px\]{width:11px}.w-\[18px\]{width:18px}.w-\[72px\]{width:72px}.w-\[400px\]{width:400px}.w-full{width:100%}.max-w-\[85\%\]{max-width:85%}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[calc\(100vw-3rem\)\]{max-width:calc(100vw - 3rem)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-bottom-left{transform-origin:0 100%}.origin-bottom-right{transform-origin:100% 100%}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-none{resize:none}.snap-x{scroll-snap-type:x var(--tw-scroll-snap-strictness)}.snap-mandatory{--tw-scroll-snap-strictness:mandatory}.snap-start{scroll-snap-align:start}.list-none{list-style-type:none}.\[appearance\:textfield\]{appearance:textfield}.auto-cols-\[minmax\(220px\,1fr\)\]{grid-auto-columns:minmax(220px,1fr)}.grid-flow-col{grid-auto-flow:column}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border,oklch(90% 0 0))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:var(--radius,.5rem)}.rounded-\[10px\]{border-radius:10px}.rounded-\[14px\]{border-radius:14px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-tl{border-top-left-radius:var(--radius,.5rem)}.rounded-tr{border-top-right-radius:var(--radius,.5rem)}.rounded-br{border-bottom-right-radius:var(--radius,.5rem)}.rounded-bl{border-bottom-left-radius:var(--radius,.5rem)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-border{border-color:var(--color-border,oklch(90% 0 0))}.border-input{border-color:var(--color-input,oklch(90% 0 0))}.border-muted-foreground\/30{border-color:#6363634d}@supports (color:color-mix(in lab, red, red)){.border-muted-foreground\/30{border-color:color-mix(in oklab, var(--color-muted-foreground,oklch(50% 0 0)) 30%, transparent)}}.border-primary{border-color:var(--color-primary,oklch(50% .1 35))}.border-transparent{border-color:#0000}.border-t-foreground{border-top-color:var(--color-foreground,oklch(15% 0 0))}.bg-background{background-color:var(--color-background,oklch(99% 0 0))}.bg-background\/50{background-color:#fcfcfc80}@supports (color:color-mix(in lab, red, red)){.bg-background\/50{background-color:color-mix(in oklab, var(--color-background,oklch(99% 0 0)) 50%, transparent)}}.bg-background\/90{background-color:#fcfcfce6}@supports (color:color-mix(in lab, red, red)){.bg-background\/90{background-color:color-mix(in oklab, var(--color-background,oklch(99% 0 0)) 90%, transparent)}}.bg-background\/92{background-color:#fcfcfceb}@supports (color:color-mix(in lab, red, red)){.bg-background\/92{background-color:color-mix(in oklab, var(--color-background,oklch(99% 0 0)) 92%, transparent)}}.bg-border{background-color:var(--color-border,oklch(90% 0 0))}.bg-destructive{background-color:var(--color-destructive,oklch(50% .2 25))}.bg-destructive\/10{background-color:#bb061e1a}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--color-destructive,oklch(50% .2 25)) 10%, transparent)}}.bg-foreground{background-color:var(--color-foreground,oklch(15% 0 0))}.bg-foreground\/50{background-color:#0b0b0b80}@supports (color:color-mix(in lab, red, red)){.bg-foreground\/50{background-color:color-mix(in oklab, var(--color-foreground,oklch(15% 0 0)) 50%, transparent)}}.bg-muted{background-color:var(--color-muted,oklch(95% 0 0))}.bg-muted-foreground\/40{background-color:#63636366}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab, var(--color-muted-foreground,oklch(50% 0 0)) 40%, transparent)}}.bg-muted\/50{background-color:#eeeeee80}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--color-muted,oklch(95% 0 0)) 50%, transparent)}}.bg-primary{background-color:var(--color-primary,oklch(50% .1 35))}.bg-primary\/5{background-color:#934c3a0d}@supports (color:color-mix(in lab, red, red)){.bg-primary\/5{background-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 5%, transparent)}}.bg-primary\/10{background-color:#934c3a1a}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 10%, transparent)}}.bg-transparent{background-color:#0000}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.to-background{--tw-gradient-to:var(--color-background,oklch(99% 0 0));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.object-cover{object-fit:cover}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-\[inherit\]{font-family:inherit}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[22px\]{font-size:22px}.text-\[28px\]{font-size:28px}.text-\[clamp\(2\.25rem\,5vw\,3\.5rem\)\]{font-size:clamp(2.25rem,5vw,3.5rem)}.text-\[clamp\(2rem\,4vw\,2\.75rem\)\]{font-size:clamp(2rem,4vw,2.75rem)}.-tracking-\[0\.02em\]{--tw-tracking:calc(.02em * -1);letter-spacing:-.02em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[inherit\]{color:inherit}.text-background{color:var(--color-background,oklch(99% 0 0))}.text-border{color:var(--color-border,oklch(90% 0 0))}.text-destructive{color:var(--color-destructive,oklch(50% .2 25))}.text-destructive-foreground{color:var(--color-destructive-foreground,oklch(99% 0 0))}.text-foreground{color:var(--color-foreground,oklch(15% 0 0))}.text-muted-foreground{color:var(--color-muted-foreground,oklch(50% 0 0))}.text-muted-foreground\/30{color:#6363634d}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/30{color:color-mix(in oklab, var(--color-muted-foreground,oklch(50% 0 0)) 30%, transparent)}}.text-muted-foreground\/60{color:#63636399}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/60{color:color-mix(in oklab, var(--color-muted-foreground,oklch(50% 0 0)) 60%, transparent)}}.text-primary{color:var(--color-primary,oklch(50% .1 35))}.text-primary-foreground{color:var(--color-primary-foreground,oklch(99% 0 0))}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.accent-foreground{accent-color:var(--color-foreground,oklch(15% 0 0))}.accent-primary{accent-color:var(--color-primary,oklch(50% .1 35))}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-\[0_1px_3px_rgba\(0\,0\,0\,0\.04\)\,0_6px_24px_rgba\(0\,0\,0\,0\.06\)\]{--tw-shadow:0 1px 3px var(--tw-shadow-color,#0000000a), 0 6px 24px var(--tw-shadow-color,#0000000f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_4px_rgba\(0\,0\,0\,0\.10\)\,0_4px_12px_rgba\(0\,0\,0\,0\.08\)\]{--tw-shadow:0 1px 4px var(--tw-shadow-color,#0000001a), 0 4px 12px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-background{--tw-ring-color:var(--color-background,oklch(99% 0 0))}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\[1px\]{--tw-backdrop-blur:blur(1px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.ease-\[cubic-bezier\(0\.19\,1\,0\.22\,1\)\]{--tw-ease:cubic-bezier(.19,1,.22,1);transition-timing-function:cubic-bezier(.19,1,.22,1)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[cimplify\:checkout\]{cimplify:checkout}@media (hover:hover){.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:scale-\[1\.04\]:is(:where(.group):hover *){scale:1.04}.group-hover\:text-foreground:is(:where(.group):hover *){color:var(--color-foreground,oklch(15% 0 0))}.group-hover\:text-primary:is(:where(.group):hover *){color:var(--color-primary,oklch(50% .1 35))}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground,oklch(50% 0 0))}.focus-within\:border-foreground:focus-within{border-color:var(--color-foreground,oklch(15% 0 0))}.focus-within\:bg-background:focus-within{background-color:var(--color-background,oklch(99% 0 0))}@media (hover:hover){.hover\:-translate-y-\[1px\]:hover{--tw-translate-y:calc(1px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-y-px:hover{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:\!scale-110:hover{--tw-scale-x:110%!important;--tw-scale-y:110%!important;--tw-scale-z:110%!important;scale:var(--tw-scale-x) var(--tw-scale-y)!important}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.04\]:hover{scale:1.04}.hover\:scale-\[1\.08\]:hover{scale:1.08}.hover\:border-foreground:hover{border-color:var(--color-foreground,oklch(15% 0 0))}.hover\:border-primary:hover{border-color:var(--color-primary,oklch(50% .1 35))}.hover\:border-primary\/20:hover{border-color:#934c3a33}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/20:hover{border-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 20%, transparent)}}.hover\:border-primary\/40:hover{border-color:#934c3a66}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 40%, transparent)}}.hover\:border-primary\/50:hover{border-color:#934c3a80}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 50%, transparent)}}.hover\:\!bg-foreground:hover{background-color:var(--color-foreground,oklch(15% 0 0))!important}.hover\:bg-background:hover{background-color:var(--color-background,oklch(99% 0 0))}.hover\:bg-destructive\/10:hover{background-color:#bb061e1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab, var(--color-destructive,oklch(50% .2 25)) 10%, transparent)}}.hover\:bg-foreground\/90:hover{background-color:#0b0b0be6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-foreground\/90:hover{background-color:color-mix(in oklab, var(--color-foreground,oklch(15% 0 0)) 90%, transparent)}}.hover\:bg-muted:hover{background-color:var(--color-muted,oklch(95% 0 0))}.hover\:bg-muted\/70:hover{background-color:#eeeeeeb3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/70:hover{background-color:color-mix(in oklab, var(--color-muted,oklch(95% 0 0)) 70%, transparent)}}.hover\:bg-muted\/80:hover{background-color:#eeec}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/80:hover{background-color:color-mix(in oklab, var(--color-muted,oklch(95% 0 0)) 80%, transparent)}}.hover\:bg-primary\/90:hover{background-color:#934c3ae6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 90%, transparent)}}.hover\:\!text-background:hover{color:var(--color-background,oklch(99% 0 0))!important}.hover\:text-destructive:hover{color:var(--color-destructive,oklch(50% .2 25))}.hover\:text-foreground:hover{color:var(--color-foreground,oklch(15% 0 0))}.hover\:text-primary:hover{color:var(--color-primary,oklch(50% .1 35))}.hover\:text-primary\/80:hover{color:#934c3acc}@supports (color:color-mix(in lab, red, red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 80%, transparent)}}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-\[0_2px_6px_rgba\(0\,0\,0\,0\.04\)\,0_12px_40px_rgba\(0\,0\,0\,0\.10\)\]:hover{--tw-shadow:0 2px 6px var(--tw-shadow-color,#0000000a), 0 12px 40px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-primary:focus{border-color:var(--color-primary,oklch(50% .1 35))}.focus\:border-primary\/30:focus{border-color:#934c3a4d}@supports (color:color-mix(in lab, red, red)){.focus\:border-primary\/30:focus{border-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 30%, transparent)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-primary\/10:focus{--tw-ring-color:#934c3a1a}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/10:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 10%, transparent)}}.focus\:ring-primary\/20:focus{--tw-ring-color:#934c3a33}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/20:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 20%, transparent)}}.focus\:ring-ring:focus{--tw-ring-color:var(--color-ring,oklch(50% .1 35))}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.data-\[checked\]\:border-primary[data-checked]{border-color:var(--color-primary,oklch(50% .1 35))}.data-\[checked\]\:bg-primary\/5[data-checked]{background-color:#934c3a0d}@supports (color:color-mix(in lab, red, red)){.data-\[checked\]\:bg-primary\/5[data-checked]{background-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 5%, transparent)}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}[open]>.\[\[open\]\>\&\]\:rotate-180{rotate:180deg}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-scroll-snap-strictness{syntax:"*";inherits:false;initial-value:proximity}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-scroll-snap-strictness:proximity;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-1\/2{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.col-span-full{grid-column:1/-1}.container{width:100%}.mx-auto{margin-inline:auto}.-mt-px{margin-top:-1px}.mr-auto{margin-right:auto}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-\[3\/4\]{aspect-ratio:3/4}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-\[5\/2\]{aspect-ratio:5/2}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-square{aspect-ratio:1}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[11px\]{height:11px}.h-\[18px\]{height:18px}.h-\[72px\]{height:72px}.h-\[min\(600px\,calc\(100vh-6rem\)\)\]{height:min(600px,100vh - 6rem)}.h-fit{height:fit-content}.h-full{height:100%}.max-h-\[85vh\]{max-height:85vh}.max-h-\[92vh\]{max-height:92vh}.max-h-\[100px\]{max-height:100px}.min-h-\[20px\]{min-height:20px}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-2\/5{width:40%}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-\[6px\]{width:6px}.w-\[7px\]{width:7px}.w-\[11px\]{width:11px}.w-\[18px\]{width:18px}.w-\[72px\]{width:72px}.w-\[400px\]{width:400px}.w-full{width:100%}.max-w-\[85\%\]{max-width:85%}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[calc\(100vw-3rem\)\]{max-width:calc(100vw - 3rem)}.max-w-none{max-width:none}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-bottom-left{transform-origin:0 100%}.origin-bottom-right{transform-origin:100% 100%}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-none{resize:none}.snap-x{scroll-snap-type:x var(--tw-scroll-snap-strictness)}.snap-mandatory{--tw-scroll-snap-strictness:mandatory}.snap-start{scroll-snap-align:start}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.\[appearance\:textfield\]{appearance:textfield}.auto-cols-\[minmax\(220px\,1fr\)\]{grid-auto-columns:minmax(220px,1fr)}.grid-flow-col{grid-auto-flow:column}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border,oklch(90% 0 0))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:var(--radius,.5rem)}.rounded-\[10px\]{border-radius:10px}.rounded-\[14px\]{border-radius:14px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-tl{border-top-left-radius:var(--radius,.5rem)}.rounded-tr{border-top-right-radius:var(--radius,.5rem)}.rounded-br{border-bottom-right-radius:var(--radius,.5rem)}.rounded-bl{border-bottom-left-radius:var(--radius,.5rem)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-border{border-color:var(--color-border,oklch(90% 0 0))}.border-input{border-color:var(--color-input,oklch(90% 0 0))}.border-muted-foreground\/30{border-color:#6363634d}@supports (color:color-mix(in lab, red, red)){.border-muted-foreground\/30{border-color:color-mix(in oklab, var(--color-muted-foreground,oklch(50% 0 0)) 30%, transparent)}}.border-primary{border-color:var(--color-primary,oklch(50% .1 35))}.border-transparent{border-color:#0000}.border-t-foreground{border-top-color:var(--color-foreground,oklch(15% 0 0))}.bg-background{background-color:var(--color-background,oklch(99% 0 0))}.bg-background\/50{background-color:#fcfcfc80}@supports (color:color-mix(in lab, red, red)){.bg-background\/50{background-color:color-mix(in oklab, var(--color-background,oklch(99% 0 0)) 50%, transparent)}}.bg-background\/90{background-color:#fcfcfce6}@supports (color:color-mix(in lab, red, red)){.bg-background\/90{background-color:color-mix(in oklab, var(--color-background,oklch(99% 0 0)) 90%, transparent)}}.bg-background\/92{background-color:#fcfcfceb}@supports (color:color-mix(in lab, red, red)){.bg-background\/92{background-color:color-mix(in oklab, var(--color-background,oklch(99% 0 0)) 92%, transparent)}}.bg-border{background-color:var(--color-border,oklch(90% 0 0))}.bg-destructive{background-color:var(--color-destructive,oklch(50% .2 25))}.bg-destructive\/10{background-color:#bb061e1a}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--color-destructive,oklch(50% .2 25)) 10%, transparent)}}.bg-foreground{background-color:var(--color-foreground,oklch(15% 0 0))}.bg-foreground\/50{background-color:#0b0b0b80}@supports (color:color-mix(in lab, red, red)){.bg-foreground\/50{background-color:color-mix(in oklab, var(--color-foreground,oklch(15% 0 0)) 50%, transparent)}}.bg-foreground\/80{background-color:#0b0b0bcc}@supports (color:color-mix(in lab, red, red)){.bg-foreground\/80{background-color:color-mix(in oklab, var(--color-foreground,oklch(15% 0 0)) 80%, transparent)}}.bg-muted{background-color:var(--color-muted,oklch(95% 0 0))}.bg-muted-foreground\/40{background-color:#63636366}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab, var(--color-muted-foreground,oklch(50% 0 0)) 40%, transparent)}}.bg-muted\/50{background-color:#eeeeee80}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--color-muted,oklch(95% 0 0)) 50%, transparent)}}.bg-primary{background-color:var(--color-primary,oklch(50% .1 35))}.bg-primary\/5{background-color:#934c3a0d}@supports (color:color-mix(in lab, red, red)){.bg-primary\/5{background-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 5%, transparent)}}.bg-primary\/10{background-color:#934c3a1a}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 10%, transparent)}}.bg-transparent{background-color:#0000}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.to-background{--tw-gradient-to:var(--color-background,oklch(99% 0 0));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.object-cover{object-fit:cover}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-\[inherit\]{font-family:inherit}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[22px\]{font-size:22px}.text-\[28px\]{font-size:28px}.text-\[clamp\(2\.25rem\,5vw\,3\.5rem\)\]{font-size:clamp(2.25rem,5vw,3.5rem)}.text-\[clamp\(2rem\,4vw\,2\.75rem\)\]{font-size:clamp(2rem,4vw,2.75rem)}.-tracking-\[0\.02em\]{--tw-tracking:calc(.02em * -1);letter-spacing:-.02em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[inherit\]{color:inherit}.text-background{color:var(--color-background,oklch(99% 0 0))}.text-border{color:var(--color-border,oklch(90% 0 0))}.text-destructive{color:var(--color-destructive,oklch(50% .2 25))}.text-destructive-foreground{color:var(--color-destructive-foreground,oklch(99% 0 0))}.text-foreground{color:var(--color-foreground,oklch(15% 0 0))}.text-foreground\/90{color:#0b0b0be6}@supports (color:color-mix(in lab, red, red)){.text-foreground\/90{color:color-mix(in oklab, var(--color-foreground,oklch(15% 0 0)) 90%, transparent)}}.text-muted-foreground{color:var(--color-muted-foreground,oklch(50% 0 0))}.text-muted-foreground\/30{color:#6363634d}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/30{color:color-mix(in oklab, var(--color-muted-foreground,oklch(50% 0 0)) 30%, transparent)}}.text-muted-foreground\/60{color:#63636399}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/60{color:color-mix(in oklab, var(--color-muted-foreground,oklch(50% 0 0)) 60%, transparent)}}.text-muted-foreground\/80{color:#636363cc}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/80{color:color-mix(in oklab, var(--color-muted-foreground,oklch(50% 0 0)) 80%, transparent)}}.text-primary{color:var(--color-primary,oklch(50% .1 35))}.text-primary-foreground{color:var(--color-primary-foreground,oklch(99% 0 0))}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.accent-foreground{accent-color:var(--color-foreground,oklch(15% 0 0))}.accent-primary{accent-color:var(--color-primary,oklch(50% .1 35))}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-\[0_1px_3px_rgba\(0\,0\,0\,0\.04\)\,0_6px_24px_rgba\(0\,0\,0\,0\.06\)\]{--tw-shadow:0 1px 3px var(--tw-shadow-color,#0000000a), 0 6px 24px var(--tw-shadow-color,#0000000f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_4px_rgba\(0\,0\,0\,0\.10\)\,0_4px_12px_rgba\(0\,0\,0\,0\.08\)\]{--tw-shadow:0 1px 4px var(--tw-shadow-color,#0000001a), 0 4px 12px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-background{--tw-ring-color:var(--color-background,oklch(99% 0 0))}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\[1px\]{--tw-backdrop-blur:blur(1px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.ease-\[cubic-bezier\(0\.19\,1\,0\.22\,1\)\]{--tw-ease:cubic-bezier(.19,1,.22,1);transition-timing-function:cubic-bezier(.19,1,.22,1)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[cimplify\:checkout\]{cimplify:checkout}@media (hover:hover){.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:scale-\[1\.04\]:is(:where(.group):hover *){scale:1.04}.group-hover\:text-foreground:is(:where(.group):hover *){color:var(--color-foreground,oklch(15% 0 0))}.group-hover\:text-primary:is(:where(.group):hover *){color:var(--color-primary,oklch(50% .1 35))}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground,oklch(50% 0 0))}.focus-within\:border-foreground:focus-within{border-color:var(--color-foreground,oklch(15% 0 0))}.focus-within\:bg-background:focus-within{background-color:var(--color-background,oklch(99% 0 0))}@media (hover:hover){.hover\:-translate-y-\[1px\]:hover{--tw-translate-y:calc(1px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-y-px:hover{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:\!scale-110:hover{--tw-scale-x:110%!important;--tw-scale-y:110%!important;--tw-scale-z:110%!important;scale:var(--tw-scale-x) var(--tw-scale-y)!important}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.04\]:hover{scale:1.04}.hover\:scale-\[1\.08\]:hover{scale:1.08}.hover\:border-foreground:hover{border-color:var(--color-foreground,oklch(15% 0 0))}.hover\:border-primary:hover{border-color:var(--color-primary,oklch(50% .1 35))}.hover\:border-primary\/20:hover{border-color:#934c3a33}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/20:hover{border-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 20%, transparent)}}.hover\:border-primary\/40:hover{border-color:#934c3a66}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 40%, transparent)}}.hover\:border-primary\/50:hover{border-color:#934c3a80}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 50%, transparent)}}.hover\:\!bg-foreground:hover{background-color:var(--color-foreground,oklch(15% 0 0))!important}.hover\:bg-background:hover{background-color:var(--color-background,oklch(99% 0 0))}.hover\:bg-destructive\/10:hover{background-color:#bb061e1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab, var(--color-destructive,oklch(50% .2 25)) 10%, transparent)}}.hover\:bg-foreground\/90:hover{background-color:#0b0b0be6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-foreground\/90:hover{background-color:color-mix(in oklab, var(--color-foreground,oklch(15% 0 0)) 90%, transparent)}}.hover\:bg-muted:hover{background-color:var(--color-muted,oklch(95% 0 0))}.hover\:bg-muted\/70:hover{background-color:#eeeeeeb3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/70:hover{background-color:color-mix(in oklab, var(--color-muted,oklch(95% 0 0)) 70%, transparent)}}.hover\:bg-muted\/80:hover{background-color:#eeec}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/80:hover{background-color:color-mix(in oklab, var(--color-muted,oklch(95% 0 0)) 80%, transparent)}}.hover\:bg-primary\/90:hover{background-color:#934c3ae6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 90%, transparent)}}.hover\:\!text-background:hover{color:var(--color-background,oklch(99% 0 0))!important}.hover\:text-destructive:hover{color:var(--color-destructive,oklch(50% .2 25))}.hover\:text-foreground:hover{color:var(--color-foreground,oklch(15% 0 0))}.hover\:text-primary:hover{color:var(--color-primary,oklch(50% .1 35))}.hover\:text-primary\/80:hover{color:#934c3acc}@supports (color:color-mix(in lab, red, red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 80%, transparent)}}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-\[0_2px_6px_rgba\(0\,0\,0\,0\.04\)\,0_12px_40px_rgba\(0\,0\,0\,0\.10\)\]:hover{--tw-shadow:0 2px 6px var(--tw-shadow-color,#0000000a), 0 12px 40px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-primary:focus{border-color:var(--color-primary,oklch(50% .1 35))}.focus\:border-primary\/30:focus{border-color:#934c3a4d}@supports (color:color-mix(in lab, red, red)){.focus\:border-primary\/30:focus{border-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 30%, transparent)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-primary\/10:focus{--tw-ring-color:#934c3a1a}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/10:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 10%, transparent)}}.focus\:ring-primary\/20:focus{--tw-ring-color:#934c3a33}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/20:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 20%, transparent)}}.focus\:ring-ring:focus{--tw-ring-color:var(--color-ring,oklch(50% .1 35))}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.data-\[checked\]\:border-primary[data-checked]{border-color:var(--color-primary,oklch(50% .1 35))}.data-\[checked\]\:bg-primary\/5[data-checked]{background-color:#934c3a0d}@supports (color:color-mix(in lab, red, red)){.data-\[checked\]\:bg-primary\/5[data-checked]{background-color:color-mix(in oklab, var(--color-primary,oklch(50% .1 35)) 5%, transparent)}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}[open]>.\[\[open\]\>\&\]\:rotate-180{rotate:180deg}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-scroll-snap-strictness{syntax:"*";inherits:false;initial-value:proximity}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cimplify/sdk",
3
- "version": "0.39.0",
3
+ "version": "0.39.1",
4
4
  "description": "Cimplify Commerce SDK for storefronts",
5
5
  "keywords": [
6
6
  "cimplify",
@@ -0,0 +1,61 @@
1
+ import type { Metadata } from "next";
2
+
3
+ export const metadata: Metadata = {
4
+ title: "About — Akua's Bakery",
5
+ description:
6
+ "A family-run bakery in East Legon, Accra. Sourdough, croissants, and layered cakes — handcrafted since 2018.",
7
+ };
8
+
9
+ export default function AboutPage() {
10
+ return (
11
+ <article className="max-w-3xl mx-auto px-8 py-16">
12
+ <p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2">
13
+ Our story
14
+ </p>
15
+ <h1 className="font-serif text-[clamp(2.25rem,5vw,3.5rem)] font-semibold mb-6 -tracking-[0.02em]">
16
+ Bread is a love letter.
17
+ </h1>
18
+ <div className="prose prose-lg max-w-none space-y-5 text-foreground/90 leading-relaxed">
19
+ <p>
20
+ Akua started baking in 2018 from a converted shipping container in East
21
+ Legon, with a wood-fired oven, a 12-year-old sourdough starter, and a
22
+ stubborn belief that good bread shouldn't be a luxury.
23
+ </p>
24
+ <p>
25
+ Today, we bake out of a 200-square-metre kitchen on Independence Avenue,
26
+ milling our own heritage flour and supplying restaurants and homes
27
+ across Greater Accra. Every loaf, every croissant, every cake is mixed,
28
+ shaped, and baked by hand — usually by Akua, increasingly by a team of
29
+ ten she trained from scratch.
30
+ </p>
31
+ <p>
32
+ We're proud to source over 90% of our ingredients within Ghana: flour
33
+ from the Volta Region, butter from Tamale, hibiscus from local farmers
34
+ we've worked with for years. The remaining 10% is the chocolate, the
35
+ almonds, the tea — and we're working on that too.
36
+ </p>
37
+ <h2 className="font-serif text-3xl font-semibold mt-10 mb-3">What we believe</h2>
38
+ <ul className="space-y-3 list-disc pl-6">
39
+ <li>
40
+ <strong>Slow over fast.</strong> 24-hour ferments, double proofs,
41
+ cold lamination. There are no shortcuts that taste this good.
42
+ </li>
43
+ <li>
44
+ <strong>Local first.</strong> Ghanaian wheat, Ghanaian dairy,
45
+ Ghanaian hands. The economy we want is the economy we build.
46
+ </li>
47
+ <li>
48
+ <strong>People over yield.</strong> Every team member starts on the
49
+ bench, learning the doughs by feel. We pay above market and keep our
50
+ kitchen calm.
51
+ </li>
52
+ </ul>
53
+ <h2 className="font-serif text-3xl font-semibold mt-10 mb-3">Visit</h2>
54
+ <p>
55
+ 12 Independence Ave, Accra · open Tuesday–Sunday, 8am–8pm.
56
+ We close on Mondays so the team can rest and the ovens can rest.
57
+ </p>
58
+ </div>
59
+ </article>
60
+ );
61
+ }
@@ -0,0 +1,19 @@
1
+ "use client";
2
+
3
+ import { ProductGrid } from "@cimplify/sdk/react";
4
+ import type { Product } from "@cimplify/sdk";
5
+ import { StoreProductCard } from "@/components/store-product-card";
6
+
7
+ /**
8
+ * Client island for the category listing. Receives server-fetched products
9
+ * as props (serializable) and owns the `renderCard` function.
10
+ */
11
+ export function ListingClient({ products }: { products: Product[] }) {
12
+ return (
13
+ <ProductGrid
14
+ products={products}
15
+ emptyMessage="No products in this category yet."
16
+ renderCard={(p) => <StoreProductCard product={p} />}
17
+ />
18
+ );
19
+ }
@@ -1,15 +1,22 @@
1
1
  import type { Metadata } from "next";
2
+ import { Suspense } from "react";
2
3
  import Link from "next/link";
3
4
  import { notFound } from "next/navigation";
4
5
  import { cacheTag, cacheLife } from "next/cache";
5
- import { ProductGrid } from "@cimplify/sdk/react";
6
- import { getServerClient, tags, type Category, type Product } from "@cimplify/sdk/server";
7
- import { StoreProductCard } from "@/components/store-product-card";
6
+ import {
7
+ getServerClient,
8
+ tags,
9
+ type Category,
10
+ type Product,
11
+ } from "@cimplify/sdk/server";
12
+ import { ListingClient } from "./listing-client";
8
13
 
9
- async function getCategory(slug: string): Promise<{
14
+ interface CategoryData {
10
15
  category: Category;
11
16
  products: Product[];
12
- } | null> {
17
+ }
18
+
19
+ async function getCategory(slug: string): Promise<CategoryData | null> {
13
20
  "use cache";
14
21
  cacheTag(tags.categories());
15
22
  cacheLife("hours");
@@ -44,6 +51,18 @@ export default async function CategoryPage({
44
51
  params,
45
52
  }: {
46
53
  params: Promise<{ slug: string }>;
54
+ }) {
55
+ return (
56
+ <Suspense fallback={<CategorySkeleton />}>
57
+ <CategoryContent params={params} />
58
+ </Suspense>
59
+ );
60
+ }
61
+
62
+ async function CategoryContent({
63
+ params,
64
+ }: {
65
+ params: Promise<{ slug: string }>;
47
66
  }) {
48
67
  const { slug } = await params;
49
68
  const data = await getCategory(slug);
@@ -68,11 +87,7 @@ export default async function CategoryPage({
68
87
  {products.length} item{products.length === 1 ? "" : "s"}
69
88
  </p>
70
89
  </header>
71
- <ProductGrid
72
- products={products}
73
- emptyMessage="No products in this category yet."
74
- renderCard={(p) => <StoreProductCard product={p} />}
75
- />
90
+ <ListingClient products={products} />
76
91
  {products.length === 0 && (
77
92
  <p className="text-center mt-8">
78
93
  <Link href="/" className="text-primary font-semibold">
@@ -83,3 +98,20 @@ export default async function CategoryPage({
83
98
  </section>
84
99
  );
85
100
  }
101
+
102
+ function CategorySkeleton() {
103
+ return (
104
+ <section className="max-w-7xl mx-auto px-8 pt-12">
105
+ <header className="mb-8 text-center">
106
+ <div className="mx-auto h-3 w-20 bg-muted rounded mb-2 animate-pulse" />
107
+ <div className="mx-auto h-10 w-64 bg-muted rounded mb-2 animate-pulse" />
108
+ <div className="mx-auto h-4 w-80 bg-muted rounded animate-pulse" />
109
+ </header>
110
+ <div className="grid grid-cols-2 md:grid-cols-3 gap-4">
111
+ {Array.from({ length: 6 }).map((_, i) => (
112
+ <div key={i} className="aspect-square bg-muted rounded-2xl animate-pulse" />
113
+ ))}
114
+ </div>
115
+ </section>
116
+ );
117
+ }
@@ -0,0 +1,20 @@
1
+ "use client";
2
+
3
+ import { ProductGrid } from "@cimplify/sdk/react";
4
+ import type { Product } from "@cimplify/sdk";
5
+ import { StoreProductCard } from "@/components/store-product-card";
6
+
7
+ /**
8
+ * Client island for the collection listing. Receives server-fetched
9
+ * products as props (serializable) and owns the `renderCard` function
10
+ * (which can't cross the server/client boundary).
11
+ */
12
+ export function ListingClient({ products }: { products: Product[] }) {
13
+ return (
14
+ <ProductGrid
15
+ products={products}
16
+ emptyMessage="No products in this collection yet."
17
+ renderCard={(p) => <StoreProductCard product={p} />}
18
+ />
19
+ );
20
+ }
@@ -1,15 +1,22 @@
1
1
  import type { Metadata } from "next";
2
+ import { Suspense } from "react";
2
3
  import Link from "next/link";
3
4
  import { notFound } from "next/navigation";
4
5
  import { cacheTag, cacheLife } from "next/cache";
5
- import { ProductGrid } from "@cimplify/sdk/react";
6
- import { getServerClient, tags, type Collection, type Product } from "@cimplify/sdk/server";
7
- import { StoreProductCard } from "@/components/store-product-card";
6
+ import {
7
+ getServerClient,
8
+ tags,
9
+ type Collection,
10
+ type Product,
11
+ } from "@cimplify/sdk/server";
12
+ import { ListingClient } from "./listing-client";
8
13
 
9
- async function getCollection(slug: string): Promise<{
14
+ interface CollectionData {
10
15
  collection: Collection;
11
16
  products: Product[];
12
- } | null> {
17
+ }
18
+
19
+ async function getCollection(slug: string): Promise<CollectionData | null> {
13
20
  "use cache";
14
21
  cacheTag(tags.collections());
15
22
  cacheLife("hours");
@@ -44,6 +51,18 @@ export default async function CollectionPage({
44
51
  params,
45
52
  }: {
46
53
  params: Promise<{ slug: string }>;
54
+ }) {
55
+ return (
56
+ <Suspense fallback={<CollectionSkeleton />}>
57
+ <CollectionContent params={params} />
58
+ </Suspense>
59
+ );
60
+ }
61
+
62
+ async function CollectionContent({
63
+ params,
64
+ }: {
65
+ params: Promise<{ slug: string }>;
47
66
  }) {
48
67
  const { slug } = await params;
49
68
  const data = await getCollection(slug);
@@ -68,11 +87,7 @@ export default async function CollectionPage({
68
87
  {products.length} item{products.length === 1 ? "" : "s"}
69
88
  </p>
70
89
  </header>
71
- <ProductGrid
72
- products={products}
73
- emptyMessage="No products in this collection yet."
74
- renderCard={(p) => <StoreProductCard product={p} />}
75
- />
90
+ <ListingClient products={products} />
76
91
  {products.length === 0 && (
77
92
  <p className="text-center mt-8">
78
93
  <Link href="/" className="text-primary font-semibold">
@@ -83,3 +98,20 @@ export default async function CollectionPage({
83
98
  </section>
84
99
  );
85
100
  }
101
+
102
+ function CollectionSkeleton() {
103
+ return (
104
+ <section className="max-w-7xl mx-auto px-8 pt-12">
105
+ <header className="mb-8 text-center">
106
+ <div className="mx-auto h-3 w-20 bg-muted rounded mb-2 animate-pulse" />
107
+ <div className="mx-auto h-10 w-64 bg-muted rounded mb-2 animate-pulse" />
108
+ <div className="mx-auto h-4 w-80 bg-muted rounded animate-pulse" />
109
+ </header>
110
+ <div className="grid grid-cols-2 md:grid-cols-3 gap-4">
111
+ {Array.from({ length: 6 }).map((_, i) => (
112
+ <div key={i} className="aspect-square bg-muted rounded-2xl animate-pulse" />
113
+ ))}
114
+ </div>
115
+ </section>
116
+ );
117
+ }
@@ -0,0 +1,122 @@
1
+ import type { Metadata } from "next";
2
+
3
+ export const metadata: Metadata = {
4
+ title: "FAQ — Akua's Bakery",
5
+ description:
6
+ "Delivery, pickup, custom cakes, allergens, payment — answers to the questions we hear most often.",
7
+ };
8
+
9
+ interface QA {
10
+ q: string;
11
+ a: string;
12
+ }
13
+
14
+ const SECTIONS: { title: string; items: QA[] }[] = [
15
+ {
16
+ title: "Ordering & delivery",
17
+ items: [
18
+ {
19
+ q: "Where do you deliver?",
20
+ a: "Same-day delivery within Greater Accra for orders placed before 2pm. Outside Accra, we offer next-day shipping by partner courier — checkout will show the available options for your address.",
21
+ },
22
+ {
23
+ q: "Can I pick up my order?",
24
+ a: "Yes. Pickup is available 8am–8pm at our East Legon location, 12 Independence Avenue. Choose 'Pickup' at checkout and we'll have everything boxed and ready when you arrive.",
25
+ },
26
+ {
27
+ q: "How quickly will my order arrive?",
28
+ a: "Same-day delivery typically arrives within 2–4 hours of order confirmation. You'll get an SMS when the rider is en route.",
29
+ },
30
+ {
31
+ q: "Do you offer subscriptions?",
32
+ a: "Yes — our Weekly Loaf Subscription delivers a fresh loaf to your door every week. Pause or skip any time. See the Classes & Stays category for details.",
33
+ },
34
+ ],
35
+ },
36
+ {
37
+ title: "Custom cakes & celebrations",
38
+ items: [
39
+ {
40
+ q: "How much notice do you need for a custom cake?",
41
+ a: "48 hours minimum for tier cakes; 7 days for elaborate designs with sugar work or fondant figures. Book a free Custom Cake Consultation to walk through flavours, sizes, and decoration.",
42
+ },
43
+ {
44
+ q: "Can I bring my own design?",
45
+ a: "Absolutely — send us a reference image and we'll quote what's possible within your timeline and budget.",
46
+ },
47
+ {
48
+ q: "Do you do wedding cakes?",
49
+ a: "We do, with at least 6 weeks' notice. Tasting sessions are GH₵150 and credited toward your final order.",
50
+ },
51
+ ],
52
+ },
53
+ {
54
+ title: "Allergens & ingredients",
55
+ items: [
56
+ {
57
+ q: "Is your kitchen allergen-free?",
58
+ a: "No. Our kitchen handles wheat, dairy, eggs, and tree nuts. Cross-contamination is possible. Please let us know about severe allergies before ordering — we'll be honest about whether we can safely accommodate them.",
59
+ },
60
+ {
61
+ q: "Do you have vegan options?",
62
+ a: "Yes. The country sourdough, whole-wheat seed loaf, baguette, and most of the breads are vegan. The hibiscus drink (Sobolo) and orange juice are also vegan.",
63
+ },
64
+ {
65
+ q: "Where does your flour come from?",
66
+ a: "We mill our own heritage wheat flour from the Volta Region. The 25kg sack is available in our Merch & More category for home bakers and trade customers.",
67
+ },
68
+ ],
69
+ },
70
+ {
71
+ title: "Payment & returns",
72
+ items: [
73
+ {
74
+ q: "What payment methods do you accept?",
75
+ a: "Mobile Money (MTN, Telecel, AirtelTigo), Visa/Mastercard, and cash on delivery for Accra-based orders.",
76
+ },
77
+ {
78
+ q: "What's your return policy?",
79
+ a: "We don't accept returns on baked goods for food-safety reasons, but if anything is wrong with your order — quality, accuracy, or freshness — message us within 24 hours and we'll make it right or refund you.",
80
+ },
81
+ {
82
+ q: "Do you offer wholesale pricing?",
83
+ a: "Yes — our Heritage Flour 25kg sack ships with quantity-tier pricing, and we'd love to talk if you run a café or restaurant. Email hello@akuasbakery.test.",
84
+ },
85
+ ],
86
+ },
87
+ ];
88
+
89
+ export default function FaqPage() {
90
+ return (
91
+ <article className="max-w-3xl mx-auto px-8 py-16">
92
+ <p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2">
93
+ Frequently asked
94
+ </p>
95
+ <h1 className="font-serif text-[clamp(2.25rem,5vw,3.5rem)] font-semibold mb-10 -tracking-[0.02em]">
96
+ Questions, answered.
97
+ </h1>
98
+ <div className="space-y-12">
99
+ {SECTIONS.map((section) => (
100
+ <section key={section.title}>
101
+ <h2 className="font-serif text-2xl font-semibold mb-5">{section.title}</h2>
102
+ <dl className="space-y-6">
103
+ {section.items.map((item) => (
104
+ <div key={item.q}>
105
+ <dt className="font-medium text-foreground mb-1.5">{item.q}</dt>
106
+ <dd className="text-muted-foreground leading-relaxed">{item.a}</dd>
107
+ </div>
108
+ ))}
109
+ </dl>
110
+ </section>
111
+ ))}
112
+ </div>
113
+ <p className="mt-12 pt-8 border-t border-border text-sm text-muted-foreground">
114
+ Still stuck? Email{" "}
115
+ <a href="mailto:hello@akuasbakery.test" className="text-primary font-semibold hover:underline">
116
+ hello@akuasbakery.test
117
+ </a>{" "}
118
+ and a real human will reply within 24 hours.
119
+ </p>
120
+ </article>
121
+ );
122
+ }
@@ -1,4 +1,5 @@
1
1
  import type { Metadata } from "next";
2
+ import { Suspense } from "react";
2
3
  import { cacheTag, cacheLife } from "next/cache";
3
4
  import { getServerClient, tags, type Product } from "@cimplify/sdk/server";
4
5
  import { Hero } from "@/components/hero";
@@ -51,14 +52,46 @@ export default async function HomePage() {
51
52
  subtitle="Sourdough, croissants, cakes, and more — handcrafted in East Legon, delivered across Accra."
52
53
  />
53
54
  {collections.map(({ collection, products }) => (
54
- <CollectionStrip
55
+ <Suspense
55
56
  key={collection.id}
56
- collection={collection}
57
- products={products}
58
- collectionHref={`/collections/${collection.slug}`}
59
- />
57
+ fallback={<StripSkeleton title={collection.name} />}
58
+ >
59
+ <CollectionStrip
60
+ collection={collection}
61
+ products={products}
62
+ collectionHref={`/collections/${collection.slug}`}
63
+ />
64
+ </Suspense>
60
65
  ))}
61
- <CategoryGrid categories={categories} />
66
+ <Suspense fallback={<CategoryGridSkeleton />}>
67
+ <CategoryGrid categories={categories} />
68
+ </Suspense>
62
69
  </>
63
70
  );
64
71
  }
72
+
73
+ function StripSkeleton({ title }: { title: string }) {
74
+ return (
75
+ <section className="max-w-7xl mx-auto px-8 pt-12">
76
+ <h2 className="font-serif text-[28px] font-semibold m-0 mb-5">{title}</h2>
77
+ <div className="grid grid-flow-col auto-cols-[minmax(220px,1fr)] gap-4 overflow-x-auto pb-2">
78
+ {Array.from({ length: 5 }).map((_, i) => (
79
+ <div key={i} className="aspect-square bg-muted rounded-2xl animate-pulse" />
80
+ ))}
81
+ </div>
82
+ </section>
83
+ );
84
+ }
85
+
86
+ function CategoryGridSkeleton() {
87
+ return (
88
+ <section className="max-w-7xl mx-auto px-8 pt-14">
89
+ <div className="h-8 w-48 bg-muted rounded mb-5 animate-pulse" />
90
+ <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
91
+ {Array.from({ length: 6 }).map((_, i) => (
92
+ <div key={i} className="h-32 bg-muted rounded-2xl animate-pulse" />
93
+ ))}
94
+ </div>
95
+ </section>
96
+ );
97
+ }
@@ -0,0 +1,88 @@
1
+ import type { Metadata } from "next";
2
+
3
+ export const metadata: Metadata = {
4
+ title: "Privacy Policy — Akua's Bakery",
5
+ description:
6
+ "How Akua's Bakery collects, uses, and protects your personal data.",
7
+ };
8
+
9
+ export default function PrivacyPage() {
10
+ return (
11
+ <article className="max-w-3xl mx-auto px-8 py-16 prose prose-lg max-w-none">
12
+ <p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2 not-prose">
13
+ Privacy
14
+ </p>
15
+ <h1 className="font-serif text-[clamp(2.25rem,5vw,3.5rem)] font-semibold mb-2 -tracking-[0.02em]">
16
+ Privacy Policy
17
+ </h1>
18
+ <p className="text-sm text-muted-foreground not-prose mb-10">
19
+ Last updated: 1 May 2026
20
+ </p>
21
+
22
+ <section className="space-y-5 leading-relaxed text-foreground/90">
23
+ <h2 className="font-serif text-2xl font-semibold mt-0">What we collect</h2>
24
+ <p>
25
+ We collect only what we need to fulfil your order: your name, phone,
26
+ delivery address, email, and the items in your order. Payment details
27
+ are processed by our payment partners (Paystack, Stripe) and never
28
+ stored on our servers.
29
+ </p>
30
+
31
+ <h2 className="font-serif text-2xl font-semibold">How we use it</h2>
32
+ <ul className="list-disc pl-6 space-y-2">
33
+ <li>To prepare, deliver, and confirm your order.</li>
34
+ <li>To send order updates by SMS and email.</li>
35
+ <li>
36
+ To send occasional product news — only if you opted in. Unsubscribe
37
+ anytime in one click.
38
+ </li>
39
+ <li>
40
+ To analyse aggregated, anonymised browsing patterns so we can
41
+ improve the site.
42
+ </li>
43
+ </ul>
44
+
45
+ <h2 className="font-serif text-2xl font-semibold">Who we share it with</h2>
46
+ <p>
47
+ We share data only with the partners required to fulfil your order:
48
+ payment processors (Paystack, Stripe), delivery riders, and our
49
+ email/SMS providers. We do not sell or rent personal data to third
50
+ parties — ever.
51
+ </p>
52
+
53
+ <h2 className="font-serif text-2xl font-semibold">Cookies</h2>
54
+ <p>
55
+ We use a small number of strictly-necessary cookies to keep your cart
56
+ working and your session signed in. We don't use third-party
57
+ advertising or tracking cookies.
58
+ </p>
59
+
60
+ <h2 className="font-serif text-2xl font-semibold">Your rights</h2>
61
+ <p>
62
+ Under the Ghana Data Protection Act, 2012 (Act 843), you have the
63
+ right to access the data we hold about you, correct it, or have it
64
+ deleted. Email{" "}
65
+ <a
66
+ href="mailto:privacy@akuasbakery.test"
67
+ className="text-primary font-semibold hover:underline"
68
+ >
69
+ privacy@akuasbakery.test
70
+ </a>{" "}
71
+ and we'll respond within 14 days.
72
+ </p>
73
+
74
+ <h2 className="font-serif text-2xl font-semibold">Retention</h2>
75
+ <p>
76
+ We keep order records for 7 years to comply with Ghanaian tax law.
77
+ Marketing-list opt-ins are kept until you unsubscribe.
78
+ </p>
79
+
80
+ <h2 className="font-serif text-2xl font-semibold">Changes</h2>
81
+ <p>
82
+ If we make material changes to this policy, we'll email customers on
83
+ our marketing list and update the &quot;last updated&quot; date above.
84
+ </p>
85
+ </section>
86
+ </article>
87
+ );
88
+ }
@@ -0,0 +1,102 @@
1
+ import type { Metadata } from "next";
2
+
3
+ export const metadata: Metadata = {
4
+ title: "Terms of Service — Akua's Bakery",
5
+ description: "The rules of the road for ordering from Akua's Bakery.",
6
+ };
7
+
8
+ export default function TermsPage() {
9
+ return (
10
+ <article className="max-w-3xl mx-auto px-8 py-16 prose prose-lg max-w-none">
11
+ <p className="text-[11px] font-semibold uppercase tracking-[0.16em] text-primary mb-2 not-prose">
12
+ Terms of service
13
+ </p>
14
+ <h1 className="font-serif text-[clamp(2.25rem,5vw,3.5rem)] font-semibold mb-2 -tracking-[0.02em]">
15
+ Terms of Service
16
+ </h1>
17
+ <p className="text-sm text-muted-foreground not-prose mb-10">
18
+ Last updated: 1 May 2026
19
+ </p>
20
+
21
+ <section className="space-y-5 leading-relaxed text-foreground/90">
22
+ <h2 className="font-serif text-2xl font-semibold mt-0">1. Who we are</h2>
23
+ <p>
24
+ Akua's Bakery (&quot;we&quot;, &quot;us&quot;) is a bakery and pâtisserie operating
25
+ at 12 Independence Avenue, Accra, Ghana. By placing an order through this
26
+ website, you (&quot;you&quot;, &quot;customer&quot;) agree to these terms.
27
+ </p>
28
+
29
+ <h2 className="font-serif text-2xl font-semibold">2. Orders and acceptance</h2>
30
+ <p>
31
+ Placing an order constitutes an offer to buy. We confirm acceptance by
32
+ sending an order confirmation email or SMS. Until acceptance, we may
33
+ decline an order — we'll refund any payment in full, immediately.
34
+ </p>
35
+
36
+ <h2 className="font-serif text-2xl font-semibold">3. Pricing and payment</h2>
37
+ <p>
38
+ Prices are in Ghana Cedis (GH₵) and include VAT where applicable.
39
+ Payment is due at checkout via Mobile Money, card, or cash on delivery.
40
+ We reserve the right to correct typographical pricing errors before
41
+ fulfilment.
42
+ </p>
43
+
44
+ <h2 className="font-serif text-2xl font-semibold">4. Delivery and pickup</h2>
45
+ <p>
46
+ Delivery times are estimates, not guarantees. We're not liable for
47
+ delays caused by weather, traffic, or events outside our control. If
48
+ a rider can't reach you within 30 minutes of arrival, the order may be
49
+ returned to the kitchen — please make sure your address and phone are
50
+ correct.
51
+ </p>
52
+
53
+ <h2 className="font-serif text-2xl font-semibold">5. Custom cakes</h2>
54
+ <p>
55
+ Custom cake orders require a 50% deposit at booking and the balance
56
+ before pickup or dispatch. Cancellations more than 72 hours before the
57
+ event date receive a full refund of the deposit; within 72 hours,
58
+ the deposit is non-refundable.
59
+ </p>
60
+
61
+ <h2 className="font-serif text-2xl font-semibold">6. Allergens</h2>
62
+ <p>
63
+ Our kitchen handles wheat, dairy, eggs, and tree nuts. We can't
64
+ guarantee freedom from cross-contamination. Customers with severe
65
+ allergies order at their own risk.
66
+ </p>
67
+
68
+ <h2 className="font-serif text-2xl font-semibold">7. Returns</h2>
69
+ <p>
70
+ Baked goods are non-returnable for food-safety reasons. If something
71
+ is wrong with your order, contact us within 24 hours of delivery and
72
+ we'll replace it, refund it, or credit your account — your choice.
73
+ </p>
74
+
75
+ <h2 className="font-serif text-2xl font-semibold">8. Liability</h2>
76
+ <p>
77
+ To the maximum extent permitted by Ghanaian law, our liability for any
78
+ claim arising from this website or your order is limited to the value
79
+ of the order. We're not liable for indirect or consequential losses.
80
+ </p>
81
+
82
+ <h2 className="font-serif text-2xl font-semibold">9. Governing law</h2>
83
+ <p>
84
+ These terms are governed by the laws of Ghana. Disputes will be
85
+ resolved in the courts of Greater Accra.
86
+ </p>
87
+
88
+ <h2 className="font-serif text-2xl font-semibold">10. Contact</h2>
89
+ <p>
90
+ Questions? Email{" "}
91
+ <a
92
+ href="mailto:hello@akuasbakery.test"
93
+ className="text-primary font-semibold hover:underline"
94
+ >
95
+ hello@akuasbakery.test
96
+ </a>
97
+ .
98
+ </p>
99
+ </section>
100
+ </article>
101
+ );
102
+ }
@@ -0,0 +1,32 @@
1
+ "use client";
2
+
3
+ import Link from "next/link";
4
+ import { useCartCount } from "@/lib/cart";
5
+
6
+ /**
7
+ * Cart pill — dynamic island. Reads the live cart count via the SDK and
8
+ * renders a link to `/cart`. Wrap in `<Suspense fallback={<CartPillSkeleton/>}>`
9
+ * so the cached header chrome streams without blocking on the cart fetch.
10
+ */
11
+ export function CartPill() {
12
+ const { count } = useCartCount();
13
+ return (
14
+ <Link
15
+ href="/cart"
16
+ className="inline-flex items-center gap-1.5 px-3.5 py-2 rounded-full bg-foreground text-background text-xs font-semibold tracking-wide transition-transform hover:scale-105"
17
+ >
18
+ Cart · {count}
19
+ </Link>
20
+ );
21
+ }
22
+
23
+ export function CartPillSkeleton() {
24
+ return (
25
+ <span
26
+ aria-hidden
27
+ className="inline-flex items-center gap-1.5 px-3.5 py-2 rounded-full bg-foreground/80 text-background text-xs font-semibold tracking-wide"
28
+ >
29
+ Cart · …
30
+ </span>
31
+ );
32
+ }
@@ -1,19 +1,190 @@
1
- export function Footer() {
1
+ import Link from "next/link";
2
+
3
+ const SOCIALS: { label: string; href: string; svg: React.ReactNode }[] = [
4
+ {
5
+ label: "Instagram",
6
+ href: "https://instagram.com/akuasbakery",
7
+ svg: (
8
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" aria-hidden className="w-5 h-5">
9
+ <rect x="3" y="3" width="18" height="18" rx="5" />
10
+ <circle cx="12" cy="12" r="4" />
11
+ <circle cx="17.5" cy="6.5" r="0.75" fill="currentColor" />
12
+ </svg>
13
+ ),
14
+ },
15
+ {
16
+ label: "TikTok",
17
+ href: "https://tiktok.com/@akuasbakery",
18
+ svg: (
19
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden className="w-5 h-5">
20
+ <path d="M16 3v3.5a4.5 4.5 0 0 0 4.5 4.5V14a7.5 7.5 0 0 1-4.5-1.5V16a5 5 0 1 1-5-5v3a2 2 0 1 0 2 2V3z" />
21
+ </svg>
22
+ ),
23
+ },
24
+ {
25
+ label: "X",
26
+ href: "https://x.com/akuasbakery",
27
+ svg: (
28
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden className="w-5 h-5">
29
+ <path d="M18 2h3l-7.5 8.6L22 22h-6.6l-5-6.5L4 22H1l8-9.2L1.4 2H8l4.6 6 5.4-6z" />
30
+ </svg>
31
+ ),
32
+ },
33
+ {
34
+ label: "Facebook",
35
+ href: "https://facebook.com/akuasbakery",
36
+ svg: (
37
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden className="w-5 h-5">
38
+ <path d="M14 9V7a1 1 0 0 1 1-1h2V3h-3a4 4 0 0 0-4 4v2H8v3h2v9h3v-9h2.5l.5-3H13z" />
39
+ </svg>
40
+ ),
41
+ },
42
+ {
43
+ label: "WhatsApp",
44
+ href: "https://wa.me/233244000000",
45
+ svg: (
46
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden className="w-5 h-5">
47
+ <path d="M12 2a10 10 0 0 0-8.6 15l-1.4 5 5.2-1.4A10 10 0 1 0 12 2zm5 14.2c-.2.6-1.2 1.2-1.7 1.2-.5.1-1.1.1-1.7-.1-.4-.1-.9-.3-1.5-.6a8.4 8.4 0 0 1-3.7-3.4c-.7-1-1-1.8-1-2.5 0-.7.4-1.1.6-1.3.2-.2.4-.2.5-.2h.4c.1 0 .3 0 .4.3l.6 1.4c.1.2 0 .3 0 .4l-.3.4-.3.3c-.1.1-.2.2-.1.4.2.4.7 1.1 1.4 1.8.9.8 1.7 1.1 1.9 1.2.2.1.3.1.5-.1l.6-.7c.2-.2.3-.2.5-.1l1.4.7c.2.1.3.2.4.3.1.2.1.6 0 1z" />
48
+ </svg>
49
+ ),
50
+ },
51
+ ];
52
+
53
+ const SITEMAP: { title: string; links: { label: string; href: string }[] }[] = [
54
+ {
55
+ title: "Shop",
56
+ links: [
57
+ { label: "All products", href: "/shop" },
58
+ { label: "Breads", href: "/categories/breads" },
59
+ { label: "Pastries", href: "/categories/pastries" },
60
+ { label: "Cakes", href: "/categories/cakes" },
61
+ { label: "Drinks", href: "/categories/drinks" },
62
+ { label: "Merch & More", href: "/categories/merch" },
63
+ { label: "Classes & Stays", href: "/categories/classes" },
64
+ ],
65
+ },
66
+ {
67
+ title: "Bakery",
68
+ links: [
69
+ { label: "Our story", href: "/about" },
70
+ { label: "FAQ", href: "/faq" },
71
+ { label: "Visit us", href: "/about#visit" },
72
+ { label: "Wholesale", href: "/categories/merch" },
73
+ ],
74
+ },
75
+ {
76
+ title: "Help",
77
+ links: [
78
+ { label: "Contact", href: "mailto:hello@akuasbakery.test" },
79
+ { label: "Custom cakes", href: "/faq#custom-cakes--celebrations" },
80
+ { label: "Allergens", href: "/faq#allergens--ingredients" },
81
+ { label: "Delivery", href: "/faq#ordering--delivery" },
82
+ ],
83
+ },
84
+ {
85
+ title: "Legal",
86
+ links: [
87
+ { label: "Terms of Service", href: "/terms" },
88
+ { label: "Privacy Policy", href: "/privacy" },
89
+ ],
90
+ },
91
+ ];
92
+
93
+ export async function Footer() {
94
+ "use cache";
95
+ const year = new Date().getFullYear();
2
96
  return (
3
- <footer className="mt-12 px-8 py-10 text-center text-xs text-muted-foreground border-t border-border bg-card">
4
- <p className="m-0 font-serif text-base text-foreground">Akua's Bakery</p>
5
- <p className="mt-1 mb-3">12 Independence Ave, Accra · +233 244 000 000</p>
6
- <p className="m-0">
7
- Built with{" "}
8
- <a
9
- href="https://www.npmjs.com/package/@cimplify/sdk"
10
- target="_blank"
11
- rel="noopener noreferrer"
12
- className="font-semibold text-primary hover:underline"
13
- >
14
- @cimplify/sdk
15
- </a>
16
- </p>
97
+ <footer className="mt-16 border-t border-border bg-card text-sm">
98
+ <div className="max-w-7xl mx-auto px-8 pt-12 pb-8">
99
+ <div className="grid gap-10 md:grid-cols-[1.4fr_repeat(4,1fr)]">
100
+ <div>
101
+ <p className="font-serif text-2xl text-foreground m-0 mb-2">Akua&apos;s Bakery</p>
102
+ <p className="text-muted-foreground leading-relaxed mb-4 max-w-sm">
103
+ Family-run bakery in East Legon. Sourdough, croissants, layered
104
+ cakes — handcrafted since 2018, delivered across Accra.
105
+ </p>
106
+ <address className="not-italic text-muted-foreground space-y-1">
107
+ <p className="m-0">12 Independence Ave, Accra</p>
108
+ <p className="m-0">
109
+ <a href="tel:+233244000000" className="hover:text-foreground transition-colors">
110
+ +233 244 000 000
111
+ </a>
112
+ </p>
113
+ <p className="m-0">
114
+ <a
115
+ href="mailto:hello@akuasbakery.test"
116
+ className="hover:text-foreground transition-colors"
117
+ >
118
+ hello@akuasbakery.test
119
+ </a>
120
+ </p>
121
+ <p className="m-0 text-xs">Tue–Sun · 8am–8pm · closed Mondays</p>
122
+ </address>
123
+ <div className="flex items-center gap-3 mt-5">
124
+ {SOCIALS.map((s) => (
125
+ <a
126
+ key={s.label}
127
+ href={s.href}
128
+ aria-label={s.label}
129
+ target="_blank"
130
+ rel="noopener noreferrer"
131
+ className="inline-flex items-center justify-center w-9 h-9 rounded-full border border-border text-muted-foreground hover:text-foreground hover:border-foreground transition-colors"
132
+ >
133
+ {s.svg}
134
+ </a>
135
+ ))}
136
+ </div>
137
+ </div>
138
+ {SITEMAP.map((section) => (
139
+ <nav key={section.title} aria-labelledby={`footer-${section.title}`}>
140
+ <p
141
+ id={`footer-${section.title}`}
142
+ className="font-semibold text-foreground mb-3 text-[13px] uppercase tracking-[0.08em]"
143
+ >
144
+ {section.title}
145
+ </p>
146
+ <ul className="space-y-2 m-0 p-0 list-none">
147
+ {section.links.map((link) => (
148
+ <li key={link.label}>
149
+ <Link
150
+ href={link.href}
151
+ className="text-muted-foreground hover:text-foreground transition-colors"
152
+ >
153
+ {link.label}
154
+ </Link>
155
+ </li>
156
+ ))}
157
+ </ul>
158
+ </nav>
159
+ ))}
160
+ </div>
161
+
162
+ <div className="mt-12 pt-6 border-t border-border flex flex-col sm:flex-row items-center justify-between gap-3 text-xs text-muted-foreground">
163
+ <p className="m-0">© {year} Akua&apos;s Bakery. All rights reserved.</p>
164
+ <p className="m-0 inline-flex items-center gap-1.5">
165
+ <span className="text-muted-foreground/80">Powered by</span>
166
+ <a
167
+ href="https://app.cimplify.io"
168
+ target="_blank"
169
+ rel="noopener noreferrer"
170
+ aria-label="Cimplify"
171
+ className="inline-flex items-center gap-1 font-serif text-foreground hover:text-primary transition-colors"
172
+ >
173
+ <span className="font-semibold tracking-tight">Cimplify</span>
174
+ <svg
175
+ viewBox="0 0 12 12"
176
+ aria-hidden
177
+ className="w-3 h-3 opacity-70"
178
+ fill="none"
179
+ stroke="currentColor"
180
+ strokeWidth="1.5"
181
+ >
182
+ <path d="M3 9L9 3M9 3H4M9 3v5" strokeLinecap="round" strokeLinejoin="round" />
183
+ </svg>
184
+ </a>
185
+ </p>
186
+ </div>
187
+ </div>
17
188
  </footer>
18
189
  );
19
190
  }
@@ -1,41 +1,51 @@
1
- "use client";
2
-
3
1
  import Link from "next/link";
4
- import { usePathname } from "next/navigation";
5
- import { useCartCount } from "@/lib/cart";
2
+ import { Suspense } from "react";
3
+ import { NavLink } from "./nav-link";
4
+ import { CartPill, CartPillSkeleton } from "./cart-pill";
6
5
 
7
6
  const TAGLINE = "ACCRA · SINCE 2018";
8
7
 
9
- function navLinkClass(active: boolean) {
10
- return [
11
- "text-[13px] font-medium tracking-wide transition-colors",
12
- active ? "text-primary" : "text-muted-foreground hover:text-foreground",
13
- ].join(" ");
14
- }
15
-
8
+ /**
9
+ * Server-rendered header chrome. Brand mark + nav layout streams from the
10
+ * cache; the active-link styling and live cart count are dynamic islands
11
+ * mounted in their own Suspense boundaries so the chrome never blocks.
12
+ */
16
13
  export function Header() {
17
- const pathname = usePathname();
18
- const { count } = useCartCount();
19
14
  return (
20
15
  <header className="sticky top-0 z-30 flex items-center justify-between px-8 py-4 border-b border-border bg-background/90 backdrop-blur-md">
21
16
  <Link href="/" className="flex items-baseline gap-2">
22
17
  <span className="font-serif text-[22px] font-semibold -tracking-[0.02em]">
23
- Akua's Bakery
18
+ Akua&apos;s Bakery
24
19
  </span>
25
20
  <span className="text-[11px] font-medium uppercase tracking-[0.12em] text-muted-foreground">
26
21
  {TAGLINE}
27
22
  </span>
28
23
  </Link>
29
24
  <nav className="flex items-center gap-6">
30
- <Link href="/" className={navLinkClass(pathname === "/")}>Home</Link>
31
- <Link href="/shop" className={navLinkClass(pathname === "/shop")}>Shop</Link>
32
- <Link
33
- href="/cart"
34
- className="inline-flex items-center gap-1.5 px-3.5 py-2 rounded-full bg-foreground text-background text-xs font-semibold tracking-wide transition-transform hover:scale-105"
35
- >
36
- Cart · {count}
37
- </Link>
25
+ <Suspense fallback={<NavLinkFallback>Home</NavLinkFallback>}>
26
+ <NavLink href="/">Home</NavLink>
27
+ </Suspense>
28
+ <Suspense fallback={<NavLinkFallback>Shop</NavLinkFallback>}>
29
+ <NavLink href="/shop">Shop</NavLink>
30
+ </Suspense>
31
+ <Suspense fallback={<NavLinkFallback>About</NavLinkFallback>}>
32
+ <NavLink href="/about">About</NavLink>
33
+ </Suspense>
34
+ <Suspense fallback={<NavLinkFallback>FAQ</NavLinkFallback>}>
35
+ <NavLink href="/faq">FAQ</NavLink>
36
+ </Suspense>
37
+ <Suspense fallback={<CartPillSkeleton />}>
38
+ <CartPill />
39
+ </Suspense>
38
40
  </nav>
39
41
  </header>
40
42
  );
41
43
  }
44
+
45
+ function NavLinkFallback({ children }: { children: React.ReactNode }) {
46
+ return (
47
+ <span className="text-[13px] font-medium tracking-wide text-muted-foreground">
48
+ {children}
49
+ </span>
50
+ );
51
+ }
@@ -0,0 +1,20 @@
1
+ "use client";
2
+
3
+ import Link from "next/link";
4
+ import { usePathname } from "next/navigation";
5
+
6
+ export function NavLink({ href, children }: { href: string; children: React.ReactNode }) {
7
+ const pathname = usePathname();
8
+ const active = pathname === href;
9
+ return (
10
+ <Link
11
+ href={href}
12
+ className={[
13
+ "text-[13px] font-medium tracking-wide transition-colors",
14
+ active ? "text-primary" : "text-muted-foreground hover:text-foreground",
15
+ ].join(" ")}
16
+ >
17
+ {children}
18
+ </Link>
19
+ );
20
+ }
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useRouter, useSearchParams, usePathname } from "next/navigation";
3
+ import Link from "next/link";
4
4
  import {
5
5
  CardVariant,
6
6
  FoodProductCard,
@@ -60,39 +60,23 @@ interface Props {
60
60
 
61
61
  /**
62
62
  * Variant-aware product card that opens the URL-driven product modal on
63
- * click (`?product=<slug>`). Renders the underlying SDK variant card
64
- * (Food, Bundle, Composite, …) directly and supplies a `renderLink` that
65
- * intercepts navigation — so a single `<CardShell>`-rendered `<a>` tag
66
- * wraps the card (no nested anchors, no hydration error).
63
+ * click. Uses `next/link` with `?product=<slug>` so the link is statically
64
+ * pre-renderable — no `useSearchParams` dependency means cards don't
65
+ * become dynamic islands. The modal (which already reads `useSearchParams`
66
+ * inside a Suspense boundary in the root layout) handles the rest.
67
67
  */
68
68
  export function StoreProductCard({ product, variant }: Props) {
69
- const router = useRouter();
70
- const pathname = usePathname();
71
- const searchParams = useSearchParams();
72
-
73
69
  const slug = product.slug || product.id;
74
70
  const Card = VARIANT_CARDS[variant ?? resolveVariant(product)];
75
-
76
- const open = () => {
77
- const next = new URLSearchParams(searchParams?.toString() ?? "");
78
- next.set("product", slug);
79
- router.push(`${pathname}?${next.toString()}`, { scroll: false });
80
- };
71
+ const href = `?product=${encodeURIComponent(slug)}`;
81
72
 
82
73
  return (
83
74
  <Card
84
75
  product={product}
85
- renderLink={({ href, className, children }) => (
86
- <a
87
- href={href}
88
- className={className}
89
- onClick={(e) => {
90
- e.preventDefault();
91
- open();
92
- }}
93
- >
76
+ renderLink={({ className, children }) => (
77
+ <Link href={href} scroll={false} prefetch={false} className={className}>
94
78
  {children}
95
- </a>
79
+ </Link>
96
80
  )}
97
81
  />
98
82
  );
@@ -14,10 +14,9 @@ const MOCK_URL = process.env.NEXT_PUBLIC_CIMPLIFY_API_URL?.trim() || "http://127
14
14
  * pass the absolute URL through `<CimplifyProvider/>`).
15
15
  */
16
16
  const nextConfig: NextConfig = {
17
- // Enable Next 16's `cacheComponents` mode so we can use the `'use cache'`
18
- // directive + `cacheTag` / `cacheLife` from `next/cache` for SSR caching.
19
- // The Cimplify storefront's RSC pages depend on this — disable only if
20
- // you've migrated every server fetch to a different caching strategy.
17
+ // Enable Next 16's `cacheComponents` mode so we can use `'use cache'` +
18
+ // `cacheTag` / `cacheLife` for SSR caching. Cached chrome streams first,
19
+ // dynamic Suspense boundaries fill in when ready.
21
20
  cacheComponents: true,
22
21
  async rewrites() {
23
22
  return [