
    g                        U d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z
 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQ ddlRmSZT erTddlUZUdd	lmZmVZVmWZW eUj                  d
k\  rddlmYZY nddlZmYZY eUj                  dk\  rddlm[Z[ nddlZm[Z[ ddl\m]Z]  e[d      Z^g dZ_	 	 	 	 	 	 ddZ`ddZaeTj                  ZbeTj                  ZceTj                  Zddeed<   	 deed<   	 ddZfe
dd       Zge
d d       Zgd!dZg	 	 	 	 	 	 d"dZhy)#z)Customizing chart configuration defaults.    )annotations)wraps)TYPE_CHECKINGAny)overload)FAreaConfigKwdsAutoSizeParamsKwdsAxisConfigKwdsAxisResolveMapKwdsBarConfigKwdsBindCheckboxKwdsBindDirectKwdsBindInputKwdsBindRadioSelectKwdsBindRangeKwdsBoxPlotConfigKwdsBrushConfigKwdsCompositionConfigKwds
ConfigKwdsDateTimeKwdsDerivedStreamKwdsErrorBandConfigKwdsErrorBarConfigKwds$FeatureGeometryGeoJsonPropertiesKwdsFormatConfigKwdsGeoJsonFeatureCollectionKwdsGeoJsonFeatureKwdsGeometryCollectionKwdsGradientStopKwdsHeaderConfigKwdsIntervalSelectionConfigKwds&IntervalSelectionConfigWithoutTypeKwdsLegendConfigKwdsLegendResolveMapKwdsLegendStreamBindingKwdsLinearGradientKwdsLineConfigKwdsLineStringKwds
LocaleKwdsMarkConfigKwdsMergedStreamKwdsMultiLineStringKwdsMultiPointKwdsMultiPolygonKwdsNumberLocaleKwdsOverlayMarkDefKwdsPaddingKwds	PointKwdsPointSelectionConfigKwds#PointSelectionConfigWithoutTypeKwdsPolygonKwdsProjectionConfigKwdsProjectionKwdsRadialGradientKwdsRangeConfigKwdsRectConfigKwdsResolveKwds
RowColKwdsScaleConfigKwdsScaleInvalidDataConfigKwdsScaleResolveMapKwdsSelectionConfigKwdsStepKwdsStyleConfigIndexKwdsThemeConfigTickConfigKwdsTimeIntervalStepKwdsTimeLocaleKwdsTitleConfigKwdsTitleParamsKwdsTooltipContentKwdsTopLevelSelectionParameterKwdsVariableParameterKwdsViewBackgroundKwdsViewConfigKwds)themesN)r   CallableLiteral)      )LiteralString)rQ   
   )	ParamSpec)PluginP)Mr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r'   r(   r&   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   activeenablegetnamesoptionsregister
unregisterc                    d fd}|S )a=  
    Decorator for registering a theme function.

    Parameters
    ----------
    name
        Unique name assigned in registry.
    enable
        Auto-enable the wrapped theme.

    Examples
    --------
    Register and enable a theme::

        import altair as alt
        from altair import theme


        @theme.register("param_font_size", enable=True)
        def custom_theme() -> theme.ThemeConfig:
            sizes = 12, 14, 16, 18, 20
            return {
                "autosize": {"contains": "content", "resize": True},
                "background": "#F3F2F1",
                "config": {
                    "axisX": {"labelFontSize": sizes[1], "titleFontSize": sizes[1]},
                    "axisY": {"labelFontSize": sizes[1], "titleFontSize": sizes[1]},
                    "font": "'Lato', 'Segoe UI', Tahoma, Verdana, sans-serif",
                    "headerColumn": {"labelFontSize": sizes[1]},
                    "headerFacet": {"labelFontSize": sizes[1]},
                    "headerRow": {"labelFontSize": sizes[1]},
                    "legend": {"labelFontSize": sizes[0], "titleFontSize": sizes[1]},
                    "text": {"fontSize": sizes[0]},
                    "title": {"fontSize": sizes[-1]},
                },
                "height": {"step": 28},
                "width": 350,
            }

    We can then see the ``name`` parameter displayed when checking::

        theme.active
        "param_font_size"

    Until another theme has been enabled, all charts will use defaults set in ``custom_theme()``::

        from vega_datasets import data

        source = data.stocks()
        lines = (
            alt.Chart(source, title=alt.Title("Stocks"))
            .mark_line()
            .encode(x="date:T", y="price:Q", color="symbol:N")
        )
        lines.interactive(bind_y=False)

    c               x     t                rt        j                         t               d fd       }|S )Nc                      | i |S N )argskwargsfuncs     A/var/www/openai/venv/lib/python3.12/site-packages/altair/theme.pywrapperz+register.<locals>.decorate.<locals>.wrapper   s    (((    )rd   zP.argsre   zP.kwargsreturnrC   )	_register_themesrY   _wraps)rf   rh   rY   names   ` rg   decoratezregister.<locals>.decorate   s9    $NN4 		) 
	) ri   )rf   Plugin[ThemeConfig]rj   rp   rc   )rn   rY   ro   s   `` rg   r]   r]      s    ~	 Ori   c                X    t        | d      }|d| dt               }t        |      |S )z
    Remove and return a previously registered theme.

    Parameters
    ----------
    name
        Unique name assigned during ``alt.theme.register``.

    Raises
    ------
    TypeError
        When ``name`` has not been registered.
    NzFound no theme named z! in registry.
Registered themes:
)rk   r[   	TypeError)rn   pluginmsgs      rg   r^   r^     sC     tT"F~#D8 ,#wk 	
 nri   strrX   dict[str, Any]r\   c                     t         S rb   )__all__rc   ri   rg   __dir__ry   %  s    Nri   c                     y rb   rc   rn   s    rg   __getattr__r|   )  s    14ri   c                     y rb   rc   r{   s    rg   r|   r|   +  s    =@ri   c                    | dk(  rt         j                  S | dk(  rt         j                  S dt        d| }t	        |      )NrX   r\   zmodule z has no attribute )rl   rX   r\   __name__AttributeError)rn   rt   s     rg   r|   r|   -  sD    x~~		|#5dX>S!!ri   c                   | t         j                  j                  | d       S t        j                  |      r|t         j                  | <   |S t	        |      j
                  d|}t        |      )Nz is not a callable theme

)rl   _pluginspopplugin_typetyper   rr   )rn   fnrt   s      rg   rk   rk   7  sk     
z##D$//			R	 !#	b""%%A"Hnri   )rn   rS   rY   boolrj   z4Callable[[Plugin[ThemeConfig]], Plugin[ThemeConfig]])rn   rS   rj   rp   )rj   z	list[str])rn   zLiteral['active']rj   ru   )rn   zLiteral['options']rj   rv   )rn   ru   rj   r   )rn   rS   r   Plugin[ThemeConfig] | Nonerj   r   )i__doc__
__future__r   	functoolsr   rm   typingr   r   r   	_overload!altair.vegalite.v5.schema._configr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   altair.vegalite.v5.themerN   rl   sysrO   rP   version_inforS   typing_extensionsrU   altair.utils.plugin_registryrV   rW   rx   r]   r^   rY   rZ   r[   __annotations__ry   r|   rk   rc   ri   rg   <module>r      si   / " % % (G G G G G G G G G G G G G G G G G GP 7--
7"(3
7"$/3#ANbJ
J$(J9JZ4 
kk 4	  3  4  4
 @  @"


7

ri   