create-fornix 0.2.0 → 0.3.0
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/archetypes/agency.json +332 -0
- package/dist/archetypes/gym.json +342 -0
- package/dist/archetypes/portfolio.json +258 -0
- package/dist/archetypes/restaurant.json +318 -0
- package/dist/archetypes/saas.json +311 -0
- package/dist/blocks/cta-strip/block.json +68 -0
- package/dist/blocks/cta-strip/cta-strip.astro +136 -0
- package/dist/blocks/cta-strip/default-content.json +9 -0
- package/dist/blocks/faq/block.json +62 -0
- package/dist/blocks/faq/default-content.json +31 -0
- package/dist/blocks/faq/faq.astro +167 -0
- package/dist/blocks/features-bento/block.json +27 -25
- package/dist/blocks/features-bento/default-content.json +28 -9
- package/dist/blocks/features-bento/features-bento.astro +138 -27
- package/dist/blocks/features-grid/block.json +25 -19
- package/dist/blocks/features-grid/default-content.json +21 -20
- package/dist/blocks/features-grid/features-grid.astro +138 -26
- package/dist/blocks/footer-columns/block.json +71 -0
- package/dist/blocks/footer-columns/default-content.json +32 -0
- package/dist/blocks/footer-columns/footer-columns.astro +276 -0
- package/dist/blocks/header-sticky/block.json +30 -38
- package/dist/blocks/header-sticky/header-sticky.astro +294 -32
- package/dist/blocks/hero-media/block.json +89 -0
- package/dist/blocks/hero-media/default-content.json +11 -0
- package/dist/blocks/hero-media/default-illustration.svg +37 -0
- package/dist/blocks/hero-media/hero-media.astro +140 -0
- package/dist/blocks/hero-text/block.json +68 -0
- package/dist/blocks/hero-text/default-content.json +9 -0
- package/dist/blocks/hero-text/hero-text.astro +88 -0
- package/dist/blocks/how-it-works/block.json +20 -27
- package/dist/blocks/how-it-works/default-content.json +18 -6
- package/dist/blocks/how-it-works/how-it-works.astro +157 -57
- package/dist/blocks/logo-cloud/block.json +20 -28
- package/dist/blocks/logo-cloud/default-content.json +7 -7
- package/dist/blocks/logo-cloud/logo-cloud.astro +117 -23
- package/dist/blocks/pricing-table/block.json +42 -105
- package/dist/blocks/pricing-table/default-content.json +45 -23
- package/dist/blocks/pricing-table/pricing-table.astro +220 -40
- package/dist/blocks/stats-strip/block.json +16 -32
- package/dist/blocks/stats-strip/default-content.json +5 -6
- package/dist/blocks/stats-strip/stats-strip.astro +81 -63
- package/dist/blocks/testimonials-grid/block.json +68 -0
- package/dist/blocks/testimonials-grid/default-content.json +48 -0
- package/dist/blocks/testimonials-grid/testimonials-grid.astro +199 -0
- package/dist/cli.js +837 -91
- package/dist/cli.js.map +1 -1
- package/dist/index.js +599 -77
- package/dist/index.js.map +1 -1
- package/dist/palettes/aurora.json +33 -0
- package/dist/palettes/ember.json +24 -5
- package/dist/palettes/fraktur.json +33 -0
- package/dist/palettes/obsidian.json +26 -7
- package/dist/palettes/paper.json +33 -0
- package/dist/palettes/sage.json +33 -0
- package/dist/palettes/terracotta.json +25 -6
- package/dist/primitives/Badge.astro +63 -0
- package/dist/primitives/Button.astro +136 -0
- package/dist/primitives/Card.astro +87 -0
- package/dist/primitives/Container.astro +60 -0
- package/dist/primitives/Eyebrow.astro +57 -0
- package/dist/primitives/Headline.astro +74 -0
- package/dist/primitives/Icon.astro +110 -0
- package/dist/primitives/Section.astro +71 -0
- package/dist/templates/astro.config.mjs.template +4 -0
- package/dist/templates/global.css.template +32 -0
- package/dist/templates/layout.astro.template +2 -3
- package/dist/templates/netlify.toml.template +16 -0
- package/dist/templates/site.config.ts.template +39 -0
- package/dist/templates/vercel.json.template +8 -0
- package/package.json +2 -2
- package/dist/blocks/about-stats/about-stats.astro +0 -72
- package/dist/blocks/about-stats/about-stats.css +0 -167
- package/dist/blocks/about-stats/block.json +0 -78
- package/dist/blocks/about-stats/default-content.json +0 -12
- package/dist/blocks/about-stats/schema.ts +0 -19
- package/dist/blocks/about-timeline/about-timeline.astro +0 -106
- package/dist/blocks/about-timeline/about-timeline.css +0 -261
- package/dist/blocks/about-timeline/block.json +0 -49
- package/dist/blocks/about-timeline/default-content.json +0 -14
- package/dist/blocks/about-timeline/schema.ts +0 -20
- package/dist/blocks/about-values/about-values.astro +0 -103
- package/dist/blocks/about-values/about-values.css +0 -242
- package/dist/blocks/about-values/block.json +0 -52
- package/dist/blocks/about-values/default-content.json +0 -37
- package/dist/blocks/about-values/schema.ts +0 -23
- package/dist/blocks/ai-og-images/block.json +0 -57
- package/dist/blocks/ai-og-images/default-content.json +0 -1
- package/dist/blocks/ai-og-images/og-api.ts +0 -25
- package/dist/blocks/ai-og-images/og-generator.ts +0 -80
- package/dist/blocks/analytics-cf/CfAnalytics.astro +0 -13
- package/dist/blocks/analytics-cf/block.json +0 -39
- package/dist/blocks/analytics-cf/default-content.json +0 -1
- package/dist/blocks/auth-better-auth/auth-api.ts +0 -15
- package/dist/blocks/auth-better-auth/auth.ts +0 -34
- package/dist/blocks/auth-better-auth/block.json +0 -99
- package/dist/blocks/auth-better-auth/default-content.json +0 -18
- package/dist/blocks/auth-better-auth/login.astro +0 -47
- package/dist/blocks/auth-better-auth/middleware.ts +0 -35
- package/dist/blocks/auth-better-auth/signup.astro +0 -45
- package/dist/blocks/blog-mdx/block.json +0 -48
- package/dist/blocks/blog-mdx/pages/[slug].astro +0 -39
- package/dist/blocks/blog-mdx/pages/index.astro +0 -37
- package/dist/blocks/blog-mdx/pages/rss.xml.ts +0 -17
- package/dist/blocks/blog-mdx/schema.ts +0 -8
- package/dist/blocks/callout/block.json +0 -46
- package/dist/blocks/callout/callout.astro +0 -44
- package/dist/blocks/callout/callout.css +0 -96
- package/dist/blocks/contact-form/block.json +0 -86
- package/dist/blocks/contact-form/contact-action.ts +0 -28
- package/dist/blocks/contact-form/contact-form.astro +0 -92
- package/dist/blocks/contact-form/contact-form.css +0 -90
- package/dist/blocks/contact-form/default-content.json +0 -10
- package/dist/blocks/contact-form/schema.ts +0 -14
- package/dist/blocks/contact-split/block.json +0 -41
- package/dist/blocks/contact-split/contact-split.astro +0 -84
- package/dist/blocks/contact-split/contact-split.css +0 -175
- package/dist/blocks/contact-split/default-content.json +0 -16
- package/dist/blocks/contact-split/schema.ts +0 -18
- package/dist/blocks/cta-banner/block.json +0 -55
- package/dist/blocks/cta-banner/cta-banner.astro +0 -35
- package/dist/blocks/cta-banner/cta-banner.css +0 -62
- package/dist/blocks/cta-banner/default-content.json +0 -6
- package/dist/blocks/cta-banner/schema.ts +0 -10
- package/dist/blocks/cta-newsletter/block.json +0 -62
- package/dist/blocks/cta-newsletter/cta-newsletter.astro +0 -49
- package/dist/blocks/cta-newsletter/cta-newsletter.css +0 -86
- package/dist/blocks/cta-newsletter/default-content.json +0 -7
- package/dist/blocks/cta-newsletter/schema.ts +0 -11
- package/dist/blocks/db-d1/block.json +0 -49
- package/dist/blocks/db-d1/db.ts +0 -21
- package/dist/blocks/db-d1/default-content.json +0 -1
- package/dist/blocks/db-d1/drizzle.config.ts +0 -7
- package/dist/blocks/db-d1/schema.ts +0 -20
- package/dist/blocks/docs-collection/block.json +0 -39
- package/dist/blocks/docs-collection/pages/[...slug].astro +0 -63
- package/dist/blocks/docs-collection/schema.ts +0 -7
- package/dist/blocks/email-resend/block.json +0 -45
- package/dist/blocks/email-resend/default-content.json +0 -1
- package/dist/blocks/email-resend/resend.ts +0 -9
- package/dist/blocks/faq-accordion/block.json +0 -61
- package/dist/blocks/faq-accordion/default-content.json +0 -11
- package/dist/blocks/faq-accordion/faq-accordion.astro +0 -45
- package/dist/blocks/faq-accordion/faq-accordion.css +0 -89
- package/dist/blocks/faq-accordion/schema.ts +0 -14
- package/dist/blocks/faq-home/block.json +0 -43
- package/dist/blocks/faq-home/default-content.json +0 -11
- package/dist/blocks/faq-home/faq-home.astro +0 -88
- package/dist/blocks/faq-home/faq-home.css +0 -150
- package/dist/blocks/faq-home/schema.ts +0 -14
- package/dist/blocks/features-bento/features-bento.css +0 -87
- package/dist/blocks/features-bento/schema.ts +0 -16
- package/dist/blocks/features-grid/features-grid.css +0 -83
- package/dist/blocks/features-grid/schema.ts +0 -19
- package/dist/blocks/footer-minimal/block.json +0 -91
- package/dist/blocks/footer-minimal/default-content.json +0 -10
- package/dist/blocks/footer-minimal/footer-minimal.astro +0 -42
- package/dist/blocks/footer-minimal/footer-minimal.css +0 -66
- package/dist/blocks/footer-minimal/schema.ts +0 -18
- package/dist/blocks/footer-rich/block.json +0 -132
- package/dist/blocks/footer-rich/default-content.json +0 -30
- package/dist/blocks/footer-rich/footer-rich.astro +0 -61
- package/dist/blocks/footer-rich/footer-rich.css +0 -89
- package/dist/blocks/footer-rich/schema.ts +0 -20
- package/dist/blocks/header-sticky/default-content.json +0 -11
- package/dist/blocks/header-sticky/header-sticky.css +0 -115
- package/dist/blocks/header-sticky/schema.ts +0 -15
- package/dist/blocks/header-transparent/block.json +0 -64
- package/dist/blocks/header-transparent/default-content.json +0 -10
- package/dist/blocks/header-transparent/header-transparent.astro +0 -51
- package/dist/blocks/header-transparent/header-transparent.css +0 -116
- package/dist/blocks/header-transparent/schema.ts +0 -15
- package/dist/blocks/hero-glass/block.json +0 -67
- package/dist/blocks/hero-glass/default-content.json +0 -9
- package/dist/blocks/hero-glass/hero-glass.astro +0 -99
- package/dist/blocks/hero-glass/hero-glass.css +0 -283
- package/dist/blocks/hero-glass/schema.ts +0 -13
- package/dist/blocks/hero-gradient/block.json +0 -80
- package/dist/blocks/hero-gradient/default-content.json +0 -7
- package/dist/blocks/hero-gradient/hero-gradient.astro +0 -39
- package/dist/blocks/hero-gradient/hero-gradient.css +0 -96
- package/dist/blocks/hero-gradient/schema.ts +0 -15
- package/dist/blocks/hero-split/block.json +0 -93
- package/dist/blocks/hero-split/default-content.json +0 -9
- package/dist/blocks/hero-split/hero-split.astro +0 -56
- package/dist/blocks/hero-split/hero-split.css +0 -101
- package/dist/blocks/hero-split/schema.ts +0 -13
- package/dist/blocks/hero-video/block.json +0 -84
- package/dist/blocks/hero-video/default-content.json +0 -8
- package/dist/blocks/hero-video/hero-video.astro +0 -48
- package/dist/blocks/hero-video/hero-video.css +0 -82
- package/dist/blocks/hero-video/schema.ts +0 -12
- package/dist/blocks/how-it-works/how-it-works.css +0 -186
- package/dist/blocks/how-it-works/schema.ts +0 -17
- package/dist/blocks/layout-dashboard/block.json +0 -52
- package/dist/blocks/layout-dashboard/default-content.json +0 -7
- package/dist/blocks/layout-dashboard/layout-dashboard.astro +0 -56
- package/dist/blocks/layout-docs/block.json +0 -41
- package/dist/blocks/layout-docs/default-content.json +0 -4
- package/dist/blocks/layout-docs/layout-docs.astro +0 -33
- package/dist/blocks/layout-marketing/block.json +0 -50
- package/dist/blocks/layout-marketing/default-content.json +0 -8
- package/dist/blocks/layout-marketing/layout-marketing.astro +0 -37
- package/dist/blocks/logo-cloud/logo-cloud.css +0 -74
- package/dist/blocks/logo-cloud/schema.ts +0 -14
- package/dist/blocks/payments-stripe/block.json +0 -55
- package/dist/blocks/payments-stripe/default-content.json +0 -1
- package/dist/blocks/payments-stripe/stripe.ts +0 -12
- package/dist/blocks/portfolio-grid/block.json +0 -65
- package/dist/blocks/portfolio-grid/default-content.json +0 -14
- package/dist/blocks/portfolio-grid/portfolio-grid.astro +0 -120
- package/dist/blocks/portfolio-grid/portfolio-grid.css +0 -193
- package/dist/blocks/portfolio-grid/schema.ts +0 -19
- package/dist/blocks/pricing-comparison/block.json +0 -169
- package/dist/blocks/pricing-comparison/default-content.json +0 -17
- package/dist/blocks/pricing-comparison/pricing-comparison.astro +0 -78
- package/dist/blocks/pricing-comparison/pricing-comparison.css +0 -111
- package/dist/blocks/pricing-comparison/schema.ts +0 -23
- package/dist/blocks/pricing-table/pricing-table.css +0 -137
- package/dist/blocks/pricing-table/schema.ts +0 -20
- package/dist/blocks/pricing-toggle/block.json +0 -53
- package/dist/blocks/pricing-toggle/default-content.json +0 -40
- package/dist/blocks/pricing-toggle/pricing-toggle.astro +0 -134
- package/dist/blocks/pricing-toggle/pricing-toggle.css +0 -256
- package/dist/blocks/pricing-toggle/schema.ts +0 -24
- package/dist/blocks/stats-strip/schema.ts +0 -13
- package/dist/blocks/stats-strip/stats-strip.css +0 -71
- package/dist/blocks/testimonials-carousel/block.json +0 -55
- package/dist/blocks/testimonials-carousel/default-content.json +0 -8
- package/dist/blocks/testimonials-carousel/schema.ts +0 -15
- package/dist/blocks/testimonials-carousel/testimonials-carousel.astro +0 -56
- package/dist/blocks/testimonials-carousel/testimonials-carousel.css +0 -99
- package/dist/blocks/testimonials-chat/block.json +0 -49
- package/dist/blocks/testimonials-chat/default-content.json +0 -56
- package/dist/blocks/testimonials-chat/schema.ts +0 -25
- package/dist/blocks/testimonials-chat/testimonials-chat.astro +0 -147
- package/dist/blocks/testimonials-chat/testimonials-chat.css +0 -257
- package/dist/blocks/testimonials-wall/block.json +0 -64
- package/dist/blocks/testimonials-wall/default-content.json +0 -12
- package/dist/blocks/testimonials-wall/schema.ts +0 -16
- package/dist/blocks/testimonials-wall/testimonials-wall.astro +0 -59
- package/dist/blocks/testimonials-wall/testimonials-wall.css +0 -82
- package/dist/blocks/theme-switcher/block.json +0 -38
- package/dist/blocks/theme-switcher/default-content.json +0 -3
- package/dist/blocks/theme-switcher/schema.ts +0 -10
- package/dist/blocks/theme-switcher/theme-switcher.astro +0 -133
- package/dist/blocks/theme-switcher/theme-switcher.css +0 -122
- package/dist/palettes/arctic.json +0 -14
- package/dist/palettes/charcoal.json +0 -14
- package/dist/palettes/copper.json +0 -14
- package/dist/palettes/corporate-blue.json +0 -14
- package/dist/palettes/cotton.json +0 -14
- package/dist/palettes/cream.json +0 -14
- package/dist/palettes/cyber-punk.json +0 -14
- package/dist/palettes/deep-sea.json +0 -14
- package/dist/palettes/desert-sand.json +0 -14
- package/dist/palettes/electric-violet.json +0 -14
- package/dist/palettes/executive.json +0 -14
- package/dist/palettes/fintech-dark.json +0 -14
- package/dist/palettes/forest.json +0 -14
- package/dist/palettes/frost.json +0 -14
- package/dist/palettes/glacier.json +0 -14
- package/dist/palettes/golden-hour.json +0 -14
- package/dist/palettes/health-clean.json +0 -14
- package/dist/palettes/luxury-gold.json +0 -14
- package/dist/palettes/midnight.json +0 -14
- package/dist/palettes/neon-tokyo.json +0 -14
- package/dist/palettes/ocean-breeze.json +0 -14
- package/dist/palettes/pearl.json +0 -14
- package/dist/palettes/slate-modern.json +0 -14
- package/dist/palettes/snow.json +0 -14
- package/dist/palettes/startup-bold.json +0 -14
- package/dist/palettes/storm.json +0 -14
- package/dist/palettes/sunset-glow.json +0 -14
- package/dist/palettes/trust.json +0 -14
- package/dist/palettes/void.json +0 -14
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"name": "portfolio",
|
|
4
|
+
"displayName": "Portfolio",
|
|
5
|
+
"description": "Independent designer portfolio. Editorial dark palette with display type. Home + Projects + Contact, with bento case studies and a personal voice throughout.",
|
|
6
|
+
"palette": "fraktur",
|
|
7
|
+
|
|
8
|
+
"site": {
|
|
9
|
+
"name": "Lior Halevi",
|
|
10
|
+
"tagline": "Independent product designer working on tools for serious people.",
|
|
11
|
+
"logo": { "type": "monogram", "text": "LH" },
|
|
12
|
+
"nav": [
|
|
13
|
+
{ "label": "Projects", "href": "/projects" },
|
|
14
|
+
{ "label": "Writing", "href": "/writing" },
|
|
15
|
+
{ "label": "Contact", "href": "/contact" }
|
|
16
|
+
],
|
|
17
|
+
"ctaPrimary": { "text": "Hire me", "href": "/contact" },
|
|
18
|
+
"ctaSecondary": { "text": "See projects", "href": "/projects" },
|
|
19
|
+
"social": {
|
|
20
|
+
"twitter": "liorhalevi",
|
|
21
|
+
"github": "liorhalevi",
|
|
22
|
+
"linkedin": "in/liorhalevi",
|
|
23
|
+
"bluesky": "liorhalevi.bsky.social"
|
|
24
|
+
},
|
|
25
|
+
"contact": {
|
|
26
|
+
"email": "lior@halevi.studio"
|
|
27
|
+
},
|
|
28
|
+
"legal": {
|
|
29
|
+
"copyright": "© 2026 Lior Halevi"
|
|
30
|
+
},
|
|
31
|
+
"meta": {
|
|
32
|
+
"twitterHandle": "liorhalevi"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
"pages": [
|
|
37
|
+
{
|
|
38
|
+
"slug": "",
|
|
39
|
+
"title": "Lior Halevi — Product designer",
|
|
40
|
+
"description": "Twelve years designing tools for engineers, traders, and researchers. Currently available for new projects starting Q3 2026.",
|
|
41
|
+
"blocks": [
|
|
42
|
+
{ "name": "header-sticky" },
|
|
43
|
+
{ "name": "hero-text" },
|
|
44
|
+
{ "name": "features-bento" },
|
|
45
|
+
{ "name": "testimonials-grid" },
|
|
46
|
+
{ "name": "cta-strip" },
|
|
47
|
+
{ "name": "footer-columns" }
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"slug": "projects",
|
|
52
|
+
"title": "Projects — Lior Halevi",
|
|
53
|
+
"description": "Selected client work and personal projects. Each entry has its own writeup with process, decisions, and what didn't work.",
|
|
54
|
+
"blocks": [
|
|
55
|
+
{ "name": "header-sticky" },
|
|
56
|
+
{ "name": "features-grid" },
|
|
57
|
+
{ "name": "testimonials-grid" },
|
|
58
|
+
{ "name": "footer-columns" }
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"slug": "contact",
|
|
63
|
+
"title": "Contact — Lior Halevi",
|
|
64
|
+
"description": "Let's see if there's a fit. Email is best.",
|
|
65
|
+
"blocks": [
|
|
66
|
+
{ "name": "header-sticky" },
|
|
67
|
+
{ "name": "faq" },
|
|
68
|
+
{ "name": "cta-strip" },
|
|
69
|
+
{ "name": "footer-columns" }
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
|
|
74
|
+
"content": {
|
|
75
|
+
"hero-text": {
|
|
76
|
+
"eyebrow": "Available Q3 2026",
|
|
77
|
+
"headline": "Tools for serious people, designed with care",
|
|
78
|
+
"subheadline": "I'm Lior. Twelve years designing software for people who use it eight hours a day — engineers, traders, researchers, builders. Currently taking on two new projects.",
|
|
79
|
+
"primaryCtaText": "See projects",
|
|
80
|
+
"primaryCtaHref": "/projects",
|
|
81
|
+
"secondaryCtaText": "Get in touch",
|
|
82
|
+
"secondaryCtaHref": "/contact"
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
"features-bento": {
|
|
86
|
+
"eyebrow": "Selected work",
|
|
87
|
+
"headline": "Eight projects worth showing",
|
|
88
|
+
"subheadline": "I pick a few projects each year that fit my craft. Here's a slice of what I've shipped.",
|
|
89
|
+
"features": [
|
|
90
|
+
{
|
|
91
|
+
"icon": "star",
|
|
92
|
+
"title": "Sextant — terminal-first trading platform",
|
|
93
|
+
"description": "Eighteen months designing a vim-keys-first interface for systematic traders. From order flow to chart annotations, every primitive was custom. Sextant closed a $30M Series B in March.",
|
|
94
|
+
"span": "large"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"icon": "check",
|
|
98
|
+
"title": "Helix — calendar discipline",
|
|
99
|
+
"description": "Three-month engagement on the focus rules UI. Shipped 12 weeks ahead of plan.",
|
|
100
|
+
"span": "default"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"icon": "external-link",
|
|
104
|
+
"title": "Lexura — analytics IDE",
|
|
105
|
+
"description": "Query editor, viz library, dashboard system. The whole notebook surface.",
|
|
106
|
+
"span": "default"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"icon": "arrow-right",
|
|
110
|
+
"title": "Vault HQ — secrets manager",
|
|
111
|
+
"description": "Redesigned the rotation flow that handles 4M secrets/month. Cut p99 task time from 6 minutes to 38 seconds.",
|
|
112
|
+
"span": "large"
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
"testimonials-grid": {
|
|
118
|
+
"eyebrow": "What people say",
|
|
119
|
+
"headline": "From the folks who've actually shipped with me",
|
|
120
|
+
"subheadline": "Honest words from past clients. Some of these are quoted from public posts; the rest I asked for permission.",
|
|
121
|
+
"items": [
|
|
122
|
+
{
|
|
123
|
+
"quote": "Lior thinks in product, not in screens. Half the engagement was redesigning workflows — the visual layer was the easy part.",
|
|
124
|
+
"author": "Maya Patel",
|
|
125
|
+
"role": "VP Eng",
|
|
126
|
+
"company": "Lexura",
|
|
127
|
+
"rating": 5
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"quote": "Best designer I've worked with for keyboard-driven interfaces. He defaults to power users and makes the casual path emerge from that.",
|
|
131
|
+
"author": "Anya Kowalski",
|
|
132
|
+
"role": "Co-founder",
|
|
133
|
+
"company": "Sextant",
|
|
134
|
+
"rating": 5
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"quote": "Showed up with a Figma file the first week and a working prototype the second. The pace was honestly intimidating.",
|
|
138
|
+
"author": "Diego Romero",
|
|
139
|
+
"role": "CTO",
|
|
140
|
+
"company": "Bloom Studio",
|
|
141
|
+
"rating": 5
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
},
|
|
145
|
+
|
|
146
|
+
"cta-strip": {
|
|
147
|
+
"headline": "Hire me for your next project",
|
|
148
|
+
"subheadline": "I work in 3- and 6-month engagements. Email me with what you're building and where you're stuck — I reply within two days.",
|
|
149
|
+
"primaryCtaText": "Email me",
|
|
150
|
+
"primaryCtaHref": "mailto:lior@halevi.studio",
|
|
151
|
+
"secondaryCtaText": "See projects first",
|
|
152
|
+
"secondaryCtaHref": "/projects",
|
|
153
|
+
"variant": "accent"
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
"footer-columns": {
|
|
157
|
+
"tagline": "Independent product designer. Tel Aviv → Berlin → wherever the work is. Available for new projects from Q3 2026.",
|
|
158
|
+
"columns": [
|
|
159
|
+
{
|
|
160
|
+
"title": "Work",
|
|
161
|
+
"links": [
|
|
162
|
+
{ "label": "Projects", "href": "/projects" },
|
|
163
|
+
{ "label": "Writing", "href": "/writing" },
|
|
164
|
+
{ "label": "CV", "href": "/cv.pdf" },
|
|
165
|
+
{ "label": "Speaking", "href": "/speaking" }
|
|
166
|
+
]
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"title": "Elsewhere",
|
|
170
|
+
"links": [
|
|
171
|
+
{ "label": "Twitter", "href": "https://twitter.com/liorhalevi" },
|
|
172
|
+
{ "label": "GitHub", "href": "https://github.com/liorhalevi" },
|
|
173
|
+
{ "label": "Bluesky", "href": "https://bsky.app/profile/liorhalevi.bsky.social" },
|
|
174
|
+
{ "label": "Read.cv", "href": "https://read.cv/liorhalevi" }
|
|
175
|
+
]
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"title": "Contact",
|
|
179
|
+
"links": [
|
|
180
|
+
{ "label": "lior@halevi.studio", "href": "mailto:lior@halevi.studio" },
|
|
181
|
+
{ "label": "Book a 30-min call", "href": "/contact" },
|
|
182
|
+
{ "label": "Newsletter (monthly)", "href": "/newsletter" }
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
"features-grid": {
|
|
189
|
+
"eyebrow": "All projects",
|
|
190
|
+
"headline": "Twelve years of selected work",
|
|
191
|
+
"subheadline": "Projects I'm willing to talk about publicly. Older client work under NDA isn't listed.",
|
|
192
|
+
"features": [
|
|
193
|
+
{
|
|
194
|
+
"icon": "star",
|
|
195
|
+
"title": "Sextant Trading Terminal",
|
|
196
|
+
"description": "2024–2026 · Lead designer · Vim-keys-first trading platform. Order flow, chart annotations, position management — every primitive custom."
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"icon": "external-link",
|
|
200
|
+
"title": "Helix Calendar",
|
|
201
|
+
"description": "2025 · Engagement · Focus-rules UI, daily brief composer, settings architecture. Shipped 12 weeks ahead of plan."
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"icon": "check",
|
|
205
|
+
"title": "Lexura Analytics",
|
|
206
|
+
"description": "2023–2024 · Lead designer · Notebook IDE, query editor, viz library, dashboard system. Powers 600+ data teams."
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"icon": "arrow-right",
|
|
210
|
+
"title": "Vault HQ",
|
|
211
|
+
"description": "2023 · Engagement · Secrets manager rotation flow. Cut p99 task time from 6 minutes to 38 seconds."
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"icon": "mail",
|
|
215
|
+
"title": "Föregång Magazine",
|
|
216
|
+
"description": "2022 · Lead designer · Quarterly print magazine with editorial website. The pages still hold up."
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"icon": "play",
|
|
220
|
+
"title": "Iron Forge App",
|
|
221
|
+
"description": "2021 · Engagement · Workout-tracking app for serious lifters. Vim-style command palette for set entry."
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
"faq": {
|
|
227
|
+
"eyebrow": "Before you write",
|
|
228
|
+
"headline": "Questions before we talk",
|
|
229
|
+
"subheadline": "Save us both time. If your situation isn't here, write anyway — but mention which of these is closest to your case.",
|
|
230
|
+
"items": [
|
|
231
|
+
{
|
|
232
|
+
"question": "What kinds of projects do you take on?",
|
|
233
|
+
"answer": "Tools for people who use them every day at work. Engineering tools, trading interfaces, analytics surfaces, developer products. I don't work on consumer apps, marketing pages, or sites that exist to advertise services."
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"question": "What's your rate?",
|
|
237
|
+
"answer": "€11,000/week for full-time engagements. Three-month minimum. I send a real estimate after the first conversation; rate-sheet questions before scope are usually a sign of a bad fit."
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"question": "Do you work in-person?",
|
|
241
|
+
"answer": "I'm based in Berlin. I travel for kickoff and one mid-engagement week. Otherwise remote — async-first, Loom-heavy, occasional pair sessions."
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"question": "Will you sign an NDA?",
|
|
245
|
+
"answer": "Yes, gladly. I sign yours; I don't have my own. I'm careful about what I show publicly — half my best work isn't on this site for that reason."
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"question": "Do you do logos?",
|
|
249
|
+
"answer": "No. I'm a product designer; I refer brand work to studios I trust (Atelier North in Stockholm is excellent)."
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"question": "How do you decide which projects to take?",
|
|
253
|
+
"answer": "Three filters: is the product for people who use it 8 hours a day, are the founders technical, and would I install it on my own machine. If all three are yes, I'm probably interested."
|
|
254
|
+
}
|
|
255
|
+
]
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"name": "restaurant",
|
|
4
|
+
"displayName": "Restaurant",
|
|
5
|
+
"description": "Wood-fire kitchen with a tight menu. Warm terracotta palette with serif type. Home + Menu + About + Contact, with dish bento and press mentions.",
|
|
6
|
+
"palette": "terracotta",
|
|
7
|
+
|
|
8
|
+
"site": {
|
|
9
|
+
"name": "Olea & Sale",
|
|
10
|
+
"tagline": "A wood-fire kitchen with a Mediterranean accent. Lisbon, since 2019.",
|
|
11
|
+
"logo": { "type": "monogram", "text": "O&S" },
|
|
12
|
+
"nav": [
|
|
13
|
+
{ "label": "Menu", "href": "/menu" },
|
|
14
|
+
{ "label": "About", "href": "/about" },
|
|
15
|
+
{ "label": "Contact", "href": "/contact" }
|
|
16
|
+
],
|
|
17
|
+
"ctaPrimary": { "text": "Book a table", "href": "/reservations" },
|
|
18
|
+
"ctaSecondary": { "text": "See the menu", "href": "/menu" },
|
|
19
|
+
"social": {
|
|
20
|
+
"instagram": "olea.e.sale",
|
|
21
|
+
"facebook": "oleaesale"
|
|
22
|
+
},
|
|
23
|
+
"contact": {
|
|
24
|
+
"email": "ola@oleasale.pt",
|
|
25
|
+
"phone": "+351 21 555 0182",
|
|
26
|
+
"address": "Rua das Salgadeiras 16, 1200-396 Lisboa"
|
|
27
|
+
},
|
|
28
|
+
"legal": {
|
|
29
|
+
"copyright": "© 2026 Olea & Sale Lda.",
|
|
30
|
+
"privacyHref": "/privacy"
|
|
31
|
+
},
|
|
32
|
+
"meta": {
|
|
33
|
+
"twitterHandle": "oleaesale"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
"pages": [
|
|
38
|
+
{
|
|
39
|
+
"slug": "",
|
|
40
|
+
"title": "Olea & Sale — Wood-fire kitchen in Lisbon",
|
|
41
|
+
"description": "A tight menu of wood-fire dishes built around the day's market. Open Tuesday through Saturday for dinner; Sundays for long lunches.",
|
|
42
|
+
"blocks": [
|
|
43
|
+
{ "name": "header-sticky" },
|
|
44
|
+
{ "name": "hero-media" },
|
|
45
|
+
{ "name": "features-grid" },
|
|
46
|
+
{ "name": "logo-cloud" },
|
|
47
|
+
{ "name": "testimonials-grid" },
|
|
48
|
+
{ "name": "cta-strip" },
|
|
49
|
+
{ "name": "footer-columns" }
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"slug": "menu",
|
|
54
|
+
"title": "Menu — Olea & Sale",
|
|
55
|
+
"description": "Tonight's menu, written this afternoon. We change roughly half the dishes each week, following what's at the market.",
|
|
56
|
+
"blocks": [
|
|
57
|
+
{ "name": "header-sticky" },
|
|
58
|
+
{ "name": "features-bento" },
|
|
59
|
+
{ "name": "footer-columns" }
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"slug": "about",
|
|
64
|
+
"title": "About — Olea & Sale",
|
|
65
|
+
"description": "Twelve seats, two cooks, one fire. Why we opened, who we cook for, and where the food comes from.",
|
|
66
|
+
"blocks": [
|
|
67
|
+
{ "name": "header-sticky" },
|
|
68
|
+
{ "name": "hero-text" },
|
|
69
|
+
{ "name": "how-it-works" },
|
|
70
|
+
{ "name": "footer-columns" }
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"slug": "contact",
|
|
75
|
+
"title": "Contact & Reservations — Olea & Sale",
|
|
76
|
+
"description": "Reservations open four weeks in advance. Walk-ins welcome at the bar.",
|
|
77
|
+
"blocks": [
|
|
78
|
+
{ "name": "header-sticky" },
|
|
79
|
+
{ "name": "faq" },
|
|
80
|
+
{ "name": "cta-strip" },
|
|
81
|
+
{ "name": "footer-columns" }
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
|
|
86
|
+
"content": {
|
|
87
|
+
"hero-media": {
|
|
88
|
+
"eyebrow": "Tuesday — Sunday",
|
|
89
|
+
"headline": "A wood-fire kitchen with a Mediterranean accent",
|
|
90
|
+
"subheadline": "Twelve seats, two cooks, one fire. We cook what's at the market that morning, on a wood grill, for the people who walked through the door that evening.",
|
|
91
|
+
"primaryCtaText": "Book a table",
|
|
92
|
+
"primaryCtaHref": "/reservations",
|
|
93
|
+
"secondaryCtaText": "See the menu",
|
|
94
|
+
"secondaryCtaHref": "/menu",
|
|
95
|
+
"mediaAlt": "A whole grilled sea bream on a ceramic plate with charred lemon and salsa verde, on a marble counter at Olea & Sale.",
|
|
96
|
+
"mediaPlacement": "right"
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
"features-grid": {
|
|
100
|
+
"eyebrow": "How we cook",
|
|
101
|
+
"headline": "Three things that don't change",
|
|
102
|
+
"subheadline": "The menu changes weekly. These don't.",
|
|
103
|
+
"features": [
|
|
104
|
+
{
|
|
105
|
+
"icon": "star",
|
|
106
|
+
"title": "Wood fire, every dish",
|
|
107
|
+
"description": "Holm-oak coals, no gas burner in the building. Every plate touches the grill or the wood oven at some point in its life."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"icon": "external-link",
|
|
111
|
+
"title": "Market in the morning, plate at night",
|
|
112
|
+
"description": "We buy at Ribeira Market most days. What's there sets the menu. If the dourada isn't right, the dourada isn't on the card."
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"icon": "check",
|
|
116
|
+
"title": "Twelve seats, two cooks",
|
|
117
|
+
"description": "You'll see us cook. We'll see you eat. It's harder to phone in a dish when you're three meters from the person eating it."
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"icon": "mail",
|
|
121
|
+
"title": "Wine from neighbours",
|
|
122
|
+
"description": "Almost the entire list is Portuguese, mostly from small producers we visit. Nothing on the list costs more than 65€."
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"icon": "arrow-right",
|
|
126
|
+
"title": "No corkage games",
|
|
127
|
+
"description": "Bring a bottle if you must — 12€ corkage, no eye-rolling. We'd rather you drink something you love."
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"icon": "play",
|
|
131
|
+
"title": "Long Sundays",
|
|
132
|
+
"description": "Sunday lunch starts at 1pm and stretches as long as you want it to. Last sitting at 3:30, but no one's counting."
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
"logo-cloud": {
|
|
138
|
+
"label": "Said about us",
|
|
139
|
+
"logos": [
|
|
140
|
+
{ "name": "The Guardian" },
|
|
141
|
+
{ "name": "Eater" },
|
|
142
|
+
{ "name": "Condé Nast Traveler" },
|
|
143
|
+
{ "name": "Time Out Lisboa" },
|
|
144
|
+
{ "name": "The New York Times" },
|
|
145
|
+
{ "name": "Monocle" }
|
|
146
|
+
]
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
"testimonials-grid": {
|
|
150
|
+
"eyebrow": "From the guestbook",
|
|
151
|
+
"headline": "What our guests say",
|
|
152
|
+
"subheadline": "We keep a paper guestbook by the door. A few entries we asked permission to share.",
|
|
153
|
+
"items": [
|
|
154
|
+
{
|
|
155
|
+
"quote": "The grilled octopus was the single best plate I had in three weeks of eating across Portugal. We came back for the carrots the next night, which sounds insane but is true.",
|
|
156
|
+
"author": "Maya Patel",
|
|
157
|
+
"role": "Guest",
|
|
158
|
+
"company": "London",
|
|
159
|
+
"rating": 5
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"quote": "Twelve seats, no English menu when we visited, two cooks who waved at our toddler. It's the restaurant I tell every friend about. I've sent six couples here in 2025.",
|
|
163
|
+
"author": "Diego Romero",
|
|
164
|
+
"role": "Guest",
|
|
165
|
+
"company": "Madrid",
|
|
166
|
+
"rating": 5
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"quote": "The wine list is one of the best in the city — short, all neighbours, all reasonable. Whoever buys for them is doing the city a service.",
|
|
170
|
+
"author": "Soren Mikkelsen",
|
|
171
|
+
"role": "Guest",
|
|
172
|
+
"company": "Copenhagen",
|
|
173
|
+
"rating": 5
|
|
174
|
+
}
|
|
175
|
+
]
|
|
176
|
+
},
|
|
177
|
+
|
|
178
|
+
"cta-strip": {
|
|
179
|
+
"headline": "Come find a seat",
|
|
180
|
+
"subheadline": "Reservations open four weeks ahead. Walk-ins welcome at the bar (six seats, first come).",
|
|
181
|
+
"primaryCtaText": "Book a table",
|
|
182
|
+
"primaryCtaHref": "/reservations",
|
|
183
|
+
"secondaryCtaText": "Call the restaurant",
|
|
184
|
+
"secondaryCtaHref": "tel:+351215550182",
|
|
185
|
+
"variant": "accent"
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
"footer-columns": {
|
|
189
|
+
"tagline": "Olea & Sale. Rua das Salgadeiras 16, Lisboa. Open Tue — Sun for dinner, Sundays for long lunches.",
|
|
190
|
+
"columns": [
|
|
191
|
+
{
|
|
192
|
+
"title": "Visit",
|
|
193
|
+
"links": [
|
|
194
|
+
{ "label": "Rua das Salgadeiras 16", "href": "https://maps.google.com/?q=Rua+das+Salgadeiras+16+Lisboa" },
|
|
195
|
+
{ "label": "1200-396 Lisboa", "href": "/contact" },
|
|
196
|
+
{ "label": "Tue — Sat · 7pm to 11pm", "href": "/contact" },
|
|
197
|
+
{ "label": "Sun · 1pm to 4pm", "href": "/contact" }
|
|
198
|
+
]
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"title": "Reservations",
|
|
202
|
+
"links": [
|
|
203
|
+
{ "label": "Book a table", "href": "/reservations" },
|
|
204
|
+
{ "label": "Private dining", "href": "/private" },
|
|
205
|
+
{ "label": "Gift vouchers", "href": "/vouchers" },
|
|
206
|
+
{ "label": "Group bookings", "href": "/groups" }
|
|
207
|
+
]
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"title": "Eat",
|
|
211
|
+
"links": [
|
|
212
|
+
{ "label": "Tonight's menu", "href": "/menu" },
|
|
213
|
+
{ "label": "Wine list", "href": "/wine" },
|
|
214
|
+
{ "label": "About the kitchen", "href": "/about" },
|
|
215
|
+
{ "label": "Press", "href": "/press" }
|
|
216
|
+
]
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
},
|
|
220
|
+
|
|
221
|
+
"features-bento": {
|
|
222
|
+
"eyebrow": "Tonight's plates",
|
|
223
|
+
"headline": "What's on the fire this week",
|
|
224
|
+
"subheadline": "Roughly half the menu changes each week. Here's what we're cooking right now. Allergens noted on the printed card.",
|
|
225
|
+
"features": [
|
|
226
|
+
{
|
|
227
|
+
"icon": "star",
|
|
228
|
+
"title": "Whole grilled sea bream",
|
|
229
|
+
"description": "Today's catch from Sesimbra, grilled over holm-oak coals with charred lemon, salsa verde, and the morning's bread. For two. 38€.",
|
|
230
|
+
"span": "large"
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"icon": "check",
|
|
234
|
+
"title": "Wood-fire octopus",
|
|
235
|
+
"description": "Slow-cooked, then finished over the grill. Smoked paprika oil, lima beans. 22€.",
|
|
236
|
+
"span": "default"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"icon": "external-link",
|
|
240
|
+
"title": "Charred carrots, dukkah",
|
|
241
|
+
"description": "From a farmer in Mafra. Tahini, honey, sumac. 9€.",
|
|
242
|
+
"span": "default"
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"icon": "arrow-right",
|
|
246
|
+
"title": "Côte de bœuf, for two",
|
|
247
|
+
"description": "Eight-week dry-aged Alentejana, 800g over the coals with rosemary salt. Bone-marrow on the side. 78€ for two, 30-min cook time. Order at the start of your meal.",
|
|
248
|
+
"span": "large"
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
},
|
|
252
|
+
|
|
253
|
+
"hero-text": {
|
|
254
|
+
"eyebrow": "About us",
|
|
255
|
+
"headline": "Twelve seats. Two cooks. One fire.",
|
|
256
|
+
"subheadline": "We opened Olea & Sale in 2019 because we missed the kind of restaurants where the cooks knew the guests by face and the food was honest about where it came from. So we built one.",
|
|
257
|
+
"primaryCtaText": "Book a table",
|
|
258
|
+
"primaryCtaHref": "/reservations",
|
|
259
|
+
"secondaryCtaText": "See the menu",
|
|
260
|
+
"secondaryCtaHref": "/menu"
|
|
261
|
+
},
|
|
262
|
+
|
|
263
|
+
"how-it-works": {
|
|
264
|
+
"eyebrow": "Where the food comes from",
|
|
265
|
+
"headline": "A short supply chain, by design",
|
|
266
|
+
"subheadline": "We can name the person who grew or caught almost everything on your plate. Here's roughly how that works.",
|
|
267
|
+
"steps": [
|
|
268
|
+
{
|
|
269
|
+
"icon": "external-link",
|
|
270
|
+
"title": "6:30am · Ribeira Market",
|
|
271
|
+
"description": "One of us is at the market every morning. We buy fish from the same three boats, vegetables from four farms, bread from a baker in Marvila."
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"icon": "check",
|
|
275
|
+
"title": "10am · Menu set",
|
|
276
|
+
"description": "Back at the kitchen by 9. By 10 the menu is written for that night. Printed by 4pm. What you read at your table is roughly five hours old."
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"icon": "arrow-right",
|
|
280
|
+
"title": "7pm · The fire is hot",
|
|
281
|
+
"description": "Holm-oak coals lit at 5pm; service starts at 7. From there it's two cooks, twelve seats, and three hours of focused work."
|
|
282
|
+
}
|
|
283
|
+
]
|
|
284
|
+
},
|
|
285
|
+
|
|
286
|
+
"faq": {
|
|
287
|
+
"eyebrow": "Before you visit",
|
|
288
|
+
"headline": "Questions guests ask",
|
|
289
|
+
"subheadline": "Email ola@oleasale.pt if yours isn't here — Ola reads everything personally.",
|
|
290
|
+
"items": [
|
|
291
|
+
{
|
|
292
|
+
"question": "How far in advance should I book?",
|
|
293
|
+
"answer": "Reservations open four weeks ahead, online, at 10am Lisbon time. Friday and Saturday usually go in the first few hours. Tuesday and Wednesday are easier."
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"question": "Do you take walk-ins?",
|
|
297
|
+
"answer": "Yes, at the bar — six seats, first come, first served. We hold those exclusively for walk-ins. Come early, especially on weekends."
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"question": "I have an allergy or dietary need. Can you accommodate?",
|
|
301
|
+
"answer": "Almost always — tell us when you book and we'll plan ahead. We're not a strict vegetarian kitchen but we always have 3–4 vegetable-led dishes a night."
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"question": "Is there a children's menu?",
|
|
305
|
+
"answer": "No children's menu, but children are welcome and we'll happily portion any dish for a small person. The whole fish for two is a hit with curious 8-year-olds."
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
"question": "Can I bring my own wine?",
|
|
309
|
+
"answer": "Yes — 12€ corkage, no eye-rolling, no minimum bottle value. We'd rather you drank something you loved than ordered to feel polite."
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
"question": "Do you do private events?",
|
|
313
|
+
"answer": "Yes, the full room can be booked for parties of 12. Email ola@oleasale.pt with a date and we'll send a sample menu and pricing."
|
|
314
|
+
}
|
|
315
|
+
]
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|