La lumière naturelle ne se résume pas à la taille des ouvertures. Elle dépend de l'orientation, des vues, des usages et des protections.
Un bon cadrage permet de gagner en confort sans multiplier les effets spectaculaires.
1ScssPhp\ScssPhp\Exception\CompilerException {#8563 #message: "Undefined mixin atelier-kicker: line: 193, column: 21" #code: 0 #file: "/app/vendor/scssphp/scssphp/src/Compiler.php" #line: 6179: { {ScssPhp\ScssPhp\Compiler->error($msg, ...$args) … › ›return new CompilerException($msg);›}} {ScssPhp\ScssPhp\Compiler->compileChild($child, OutputBlock $out) … ›if (! $mixin) {›throw $this->error("Undefined mixin $name");›}} {ScssPhp\ScssPhp\Compiler->compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '') … ›} else {›$ret = $this->compileChild($stm, $out);›}} {ScssPhp\ScssPhp\Compiler->compileBlock(Block $block) … › ›$this->compileChildrenNoReturn($block->children, $out, $block->selfParent);› } {ScssPhp\ScssPhp\Compiler->compileChild($child, OutputBlock $out) … ›case Type::T_BLOCK:›$this->compileBlock($child[1]);›break;} {ScssPhp\ScssPhp\Compiler->compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '') … ›} else {›$ret = $this->compileChild($stm, $out);›}} {ScssPhp\ScssPhp\Compiler->compileBlock(Block $block) … › ›$this->compileChildrenNoReturn($block->children, $out, $block->selfParent);› } {ScssPhp\ScssPhp\Compiler->compileChild($child, OutputBlock $out) … ›case Type::T_BLOCK:›$this->compileBlock($child[1]);›break;} {ScssPhp\ScssPhp\Compiler->compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '') … ›} else {›$ret = $this->compileChild($stm, $out);›}} {ScssPhp\ScssPhp\Compiler->compileRoot(Block $rootBlock) … › ›$this->compileChildrenNoReturn($rootBlock->children, $this->scope);›assert($this->scope !== null);} {ScssPhp\ScssPhp\Compiler->compileString($source, $path = null) … ›$this->injectVariables($this->registeredVars);›$this->compileRoot($tree);›$this->popEnv();} {App\Twig\TwigExtension->App\Twig\Traits\{closure} … › ›$css = $compiler->compileString($scss)->getCss();›$entityName = $entity?->__toString();} {App\Service\Cache\MemoryCacheService::App\Service\Cache\{closure} … ›$item->tag($tags);›return $function($item);›});} {Symfony\Component\Cache\LockRegistry::compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, ?Closure $setMetadata = null, ?LoggerInterface $logger = null): mixed … › ›$value = $callback($item, $save);› } {Symfony\Component\Cache\Adapter\TagAwareAdapter->Symfony\Component\Cache\Traits\{closure} … ›try {›$value = ($this->callbackWrapper)($callback, $item, $save, $pool, function (CacheItem $item) use ($setMetadata, $startTime, &$metadata) {›$setMetadata($item, $startTime, $metadata);} {Symfony\Component\Cache\Adapter\TagAwareAdapter->contractsGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, ?array &$metadata = null, ?LoggerInterface $logger = null): mixed … ›$save = true;›$item->set($callback($item, $save));›if ($save) {} {Symfony\Component\Cache\Adapter\TagAwareAdapter->doGet(AdapterInterface $pool, string $key, callable $callback, ?float $beta, ?array &$metadata = null): mixed … › ›return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata, &$metadata, $key) {›// don't wrap nor save recursive calls} {Symfony\Component\Cache\Adapter\TagAwareAdapter->get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed … ›{›return $this->doGet($this, $key, $callback, $beta, $metadata);›}} {App\Service\Cache\MemoryCacheService::getValue(App\Service\Cache\CacheTagsEnum|string $name, callable $function, array $tags = [], bool $ignoreLanguage = false, bool $ignoreMediaType = false, bool $ignoreRole = false, array $suffixes = []): mixed … › ›return $cache->get($name, function (CacheItem $item) use ($function, $tags) {›$item->tag($tags);} {App\Service\Cache\Strategy\MemoryAndHttpCacheStrategy::getValue(App\Service\Cache\CacheTagsEnum|string $name, callable $function, array $tags = [], bool $ignoreLanguage = false, bool $ignoreMediaType = false, bool $ignoreRole = false, array $suffixes = []): mixed … ›{›return MemoryCacheService::getValue($name, $function, $tags, $ignoreLanguage, $ignoreMediaType, $ignoreRole, $suffixes);›}} {App\Service\Cache\CacheManager::getValue(App\Service\Cache\CacheTagsEnum|string $name, callable $function, array $tags = [], bool $ignoreLanguage = false, bool $ignoreMediaType = false, bool $ignoreRole = false, array $suffixes = []): mixed … ›{›return (self::getCacheStrategyClass())::getValue($name, $function, $tags, $ignoreLanguage, $ignoreMediaType, $ignoreRole, $suffixes);›}} {App\Twig\TwigExtension->filter_scss(?string $scss, ?string $randomBlockId = null, ?AbstractEvolutEntity $entity = null): ?string … ›$mediaType = SessionContextService::getContext(SessionContextEnum::MANUAL_MEDIA_TYPE) ?? SessionContextService::getContext(SessionContextEnum::ACTUAL_MEDIA_TYPE);›return CacheManager::getValue(sprintf('scss_rendering_for_%s_%s_%s_%s', $randomBlockId, md5($scss), $language, $mediaType),›function () use ($scss, $randomBlockId, $entity) {} {__TwigTemplate_de3f5a5383dba55f0089769a14095e32->block_bloc_styles(array $context, array $blocks = []): iterable … ›yield " ";›yield $this->extensions['App\Twig\TwigExtension']->filter_decode_html($this->extensions['App\Twig\TwigExtension']->filter_scss(CoreExtension::getAttribute($this->env, $this->source, ($context["bloc"] ?? null), "scss", [], "any", false, false, false, 17), CoreExtension::getAttribute($this->env, $this->source, ($context["bloc"] ?? null), "blocId", [], "any", false, false, false, 17), ($context["bloc"] ?? null)));›yield "} {Twig\Template->yieldBlock($name, array $context, array $blocks = [], $useBlocks = true, ?self $templateContext = null): iterable … ›try {›yield from $template->$block($context, $blocks);›} catch (Error $e) {} {__TwigTemplate_de3f5a5383dba55f0089769a14095e32->doDisplay(array $context, array $blocks = []): iterable … ›// line 13›yield from $this->unwrap()->yieldBlock('bloc_styles', $context, $blocks);›// line 44} {Twig\Template->yield(array $context, array $blocks = []): iterable … ›try {›yield from $this->doDisplay($context, $blocks);›} catch (Error $e) {} {__TwigTemplate_3dac8488c739450518b10b9760b9254b->doDisplay(array $context, array $blocks = []): iterable … ›$this->parent = $this->loadTemplate("blocs/Bloc.html.twig", "blocs/global/bloc_with_header.html.twig", 3);›yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks));›}} {Twig\Template->yield(array $context, array $blocks = []): iterable … ›try {›yield from $this->doDisplay($context, $blocks);›} catch (Error $e) {} {__TwigTemplate_6b57b105b45e51a70cfc162472edc3fd->doDisplay(array $context, array $blocks = []): iterable … ›$this->parent = $this->loadTemplate("blocs/global/bloc_with_header.html.twig", "blocs/ContentBloc.html.twig", 2);›yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks));›}} {Twig\Template->yield(array $context, array $blocks = []): iterable … ›try {›yield from $this->doDisplay($context, $blocks);›} catch (Error $e) {} {__TwigTemplate_423c0fd090ec7fbc4f373b8126c9baeb->block_include_bloc(array $context, array $blocks = []): iterable … ›yield " ";›yield from $this->loadTemplate((("blocs/" . $this->extensions['App\Twig\TwigExtension']->filter_class(CoreExtension::getAttribute($this->env, $this->source, ($context["blocPage"] ?? null), "bloc", [], "any", false, false, false, 6))) . ".html.twig"), "blocs/CustomPage.html.twig", 6)->unwrap()->yield(CoreExtension::merge($context, ["bloc" => CoreExtension::getAttribute($this->env, $this->source, ($context["blocPage"] ?? null), "bloc", [], "any", false, false, false, 6), "nodump" => true, "form" => ($context["form"] ?? null)]));›// line 7} {Twig\Template->yieldBlock($name, array $context, array $blocks = [], $useBlocks = true, ?self $templateContext = null): iterable … ›try {›yield from $template->$block($context, $blocks);›} catch (Error $e) {} {__TwigTemplate_423c0fd090ec7fbc4f373b8126c9baeb->block_blocPages(array $context, array $blocks = []): iterable … ›yield " ";›yield from $this->unwrap()->yieldBlock('include_bloc', $context, $blocks);›// line 8} {Twig\Template->yieldBlock($name, array $context, array $blocks = [], $useBlocks = true, ?self $templateContext = null): iterable … ›try {›yield from $template->$block($context, $blocks);›} catch (Error $e) {} {__TwigTemplate_8e47dc406ec905e42279cfc058629785->block_body(array $context, array $blocks = []): iterable … ›// line 54›yield from $this->unwrap()->yieldBlock('blocPages', $context, $blocks);›// line 61} {Twig\Template->yieldBlock($name, array $context, array $blocks = [], $useBlocks = true, ?self $templateContext = null): iterable … ›try {›yield from $template->$block($context, $blocks);›} catch (Error $e) {} {__TwigTemplate_f7de9678832f434a6f354facfb4e9091->{closure} … ›yield " ";›yield from $this->unwrap()->yieldBlock('body', $context, $blocks);›// line 131} {Twig\Extension\CoreExtension::captureOutput(iterable $body): string … ›try {›foreach ($body as $data) {›echo $data;} {__TwigTemplate_f7de9678832f434a6f354facfb4e9091->doDisplay(array $context, array $blocks = []): iterable … ›// line 123›$___internal_parse_0_ = ('' === $tmp = \Twig\Extension\CoreExtension::captureOutput((function () use (&$context, $macros, $blocks) {›// line 124} {Twig\Template->yield(array $context, array $blocks = []): iterable … ›try {›yield from $this->doDisplay($context, $blocks);›} catch (Error $e) {} {__TwigTemplate_8e47dc406ec905e42279cfc058629785->doDisplay(array $context, array $blocks = []): iterable … ›$this->parent = $this->loadTemplate("base.html.twig", "blocs/Page.html.twig", 2);›yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks));›}} {Twig\Template->yield(array $context, array $blocks = []): iterable … ›try {›yield from $this->doDisplay($context, $blocks);›} catch (Error $e) {} {__TwigTemplate_423c0fd090ec7fbc4f373b8126c9baeb->doDisplay(array $context, array $blocks = []): iterable … ›$this->parent = $this->loadTemplate("blocs/Page.html.twig", "blocs/CustomPage.html.twig", 1);›yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks));›}} {Twig\Template->yield(array $context, array $blocks = []): iterable … ›try {›yield from $this->doDisplay($context, $blocks);›} catch (Error $e) {} {Twig\Template->display(array $context, array $blocks = []): void … ›{›foreach ($this->yield($context, $blocks) as $data) {›echo $data;} {Twig\Template->render(array $context): string … ›try {›$this->display($context);›} catch (\Throwable $e) {} {Twig\TemplateWrapper->render(array $context = []): string … ›{›return $this->template->render($context);›}} {Twig\Environment->render($name, array $context = []): string … ›{›return $this->load($name)->render($context);›}} {Symfony\Bundle\FrameworkBundle\Controller\AbstractController->doRenderView(string $view, ?string $block, array $parameters, string $method): string … › ›return $this->container->get('twig')->render($view, $parameters);›}} {Symfony\Bundle\FrameworkBundle\Controller\AbstractController->doRender(string $view, ?string $block, array $parameters, ?Response $response, string $method): Response … ›{›$content = $this->doRenderView($view, $block, $parameters, $method);›$response ??= new Response();} {Symfony\Bundle\FrameworkBundle\Controller\AbstractController->render(string $view, array $parameters = [], ?Response $response = null): Response … ›{›return $this->doRender($view, null, $parameters, $response, __FUNCTION__);›}} {App\Controller\Base\WebsiteController->renderPage(?string $slug = null): Response … › ›return $this->render('blocs/' . TwigExtension::filter_class($page) . '.html.twig', [›'bloc' => $page,} {Symfony\Component\HttpKernel\HttpKernel->handleRaw(Request $request, int $type = self::MAIN_REQUEST): Response … ›// call controller›$response = $controller(...$arguments);› } {Symfony\Component\HttpKernel\HttpKernel->handle(Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true): Response … ›try {›return $response = $this->handleRaw($request, $type);›} catch (\Throwable $e) {} {Symfony\Component\HttpKernel\Kernel->handle(Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true): Response … ›try {›return $this->getHttpKernel()->handle($request, $type, $catch);›} finally {} {Symfony\Component\Runtime\Runner\Symfony\HttpKernelRunner->run(): int … ›{›$response = $this->kernel->handle($this->request);› } {require_once … ›->getRunner($app)›->run()›);} { › ›require_once dirname(__DIR__).'/vendor/autoload_runtime.php';› : { "/app/vendor/autoload_runtime.php" } } } }
2 """ .efebat-blog-detail { max-width: 100% !important; padding: 0 !important; }\n.article-layout { display: grid !important; grid-template-columns: 1fr 300px !important; gap: 60px !important; padding: 40px 0 80px !important; }\n.article-main { max-width: 800px !important; }\n.article-header { margin-bottom: 40px !important; }\n.article-category { @include atelier-kicker(var(--color3), false); margin-bottom: 20px !important; }\n.article-title { margin-bottom: 20px !important; @include atelier-section-title; font-size: clamp(38px, 5vw, 60px) !important; }\n.article-meta { display: flex !important; gap: 24px !important; color: var(--color2); font-size: 0.9rem !important; flex-wrap: wrap !important; margin-bottom: 0 !important; }\n.article-meta-item { display: inline-flex !important; align-items: center !important; gap: 8px !important; }\n.article-meta-item i { color: var(--color3) !important; }\n.article-featured-image { width: 100% !important; height: 420px !important; object-fit: cover !important; margin-bottom: 40px !important; box-shadow: var(--box-shadow) !important; }\n.article-content { line-height: 1.8 !important; font-size: 1.05rem !important; }\n.article-content h2 { margin: 44px 0 20px !important; @include atelier-section-title(2rem); }\n.article-content h3 { margin: 30px 0 15px !important; @include atelier-card-title(1.45rem); }\n.article-content p, .article-content li { color: var(--color2); }\n.article-content p { margin-bottom: 20px !important; }\n.article-content blockquote { border-left: 4px solid var(--color3) !important; padding: 20px 28px !important; background: var(--color4) !important; margin: 30px 0 !important; font-style: italic !important; color: var(--color2) !important; }\n.article-tags { display: flex !important; gap: 10px !important; flex-wrap: wrap !important; margin: 40px 0 !important; padding: 26px 0 !important; border-top: 1px solid var(--border-color) !important; border-bottom: 1px solid var(--border-color) !important; }\n\n.sidebar { min-width: 0 !important; }\n.recent-post { display: flex !important; gap: 14px !important; margin-bottom: 18px !important; padding-bottom: 18px !important; border-bottom: 1px solid var(--border-color) !important; min-width: 0 !important; }\n.recent-post:last-child { margin-bottom: 0 !important; padding-bottom: 0 !important; border-bottom: none !important; }\n.recent-post-image { width: 76px !important; height: 76px !important; max-width: 76px !important; flex: 0 0 76px !important; object-fit: cover !important; }\n.recent-post-content { min-width: 0 !important; flex: 1 1 auto !important; }\n.recent-post-content h4 { margin-bottom: 6px !important; @include atelier-card-title(0.95rem); line-height: 1.35 !important; }\n.recent-post-date { color: var(--color2); font-size: 0.84rem !important; }\n\n\n.article-content a,\n.recent-post-content a,\n.article-tags .tag {\n color: var(--color3) !important;\n text-decoration: none !important;\n border-bottom: 1px solid currentColor !important;\n transition: var(--transition) !important;\n}\n\n.article-content a:hover,\n.recent-post-content a:hover,\n.article-tags .tag:hover {\n color: var(--color1) !important;\n}\n\n.share-section {\n margin-top: 36px !important;\n padding-top: 28px !important;\n border-top: 1px solid var(--border-color) !important;\n}\n\n.share-title {\n margin-bottom: 16px !important;\n @include atelier-card-title(1.35rem);\n}\n\n.share-buttons {\n display: flex !important;\n align-items: center !important;\n gap: 10px !important;\n flex-wrap: wrap !important;\n}\n\n.share-btn {\n width: 42px !important;\n height: 42px !important;\n display: inline-flex !important;\n align-items: center !important;\n justify-content: center !important;\n background: var(--surface-color) !important;\n border: 1px solid var(--border-color) !important;\n color: var(--color1) !important;\n text-decoration: none !important;\n box-shadow: none !important;\n transition: var(--transition) !important;\n}\n\n.share-btn i {\n color: inherit !important;\n font-size: 0.95rem !important;\n}\n\n.share-btn:hover {\n background: var(--color1) !important;\n border-color: var(--color1) !important;\n color: var(--color4) !important;\n}\n """bloc_32c9d4b7-b263-4374-9b5f-49abfcfc3f7a *{color: red !important} #bloc_32c9d4b7-b263-4374-9b5f-49abfcfc3f7a .shape-divider-top path { fill: #6174d1 !important; } #bloc_32c9d4b7-b263-4374-9b5f-49abfcfc3f7a .shape-divider-bottom path { fill: #6174d1 !important; }

La lumière naturelle ne se résume pas à la taille des ouvertures. Elle dépend de l'orientation, des vues, des usages et des protections.
Un bon cadrage permet de gagner en confort sans multiplier les effets spectaculaires.