alistair
2 years ago
240 changed files with 12 additions and 113016 deletions
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
# Run manually to reformat a file: |
||||
# clang-format -i --style=file <file> |
||||
Language: Cpp |
||||
BasedOnStyle: Google |
||||
IndentPPDirectives: AfterHash |
||||
IndentCaseLabels: false |
||||
AlwaysBreakTemplateDeclarations: false |
||||
DerivePointerAlignment: false |
@ -1,393 +0,0 @@
@@ -1,393 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.1...3.18) |
||||
|
||||
# Fallback for using newer policies on CMake <3.12. |
||||
if(${CMAKE_VERSION} VERSION_LESS 3.12) |
||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) |
||||
endif() |
||||
|
||||
# Determine if fmt is built as a subproject (using add_subdirectory) |
||||
# or if it is the master project. |
||||
if (NOT DEFINED FMT_MASTER_PROJECT) |
||||
set(FMT_MASTER_PROJECT OFF) |
||||
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) |
||||
set(FMT_MASTER_PROJECT ON) |
||||
message(STATUS "CMake version: ${CMAKE_VERSION}") |
||||
endif () |
||||
endif () |
||||
|
||||
# Joins arguments and places the results in ${result_var}. |
||||
function(join result_var) |
||||
set(result "") |
||||
foreach (arg ${ARGN}) |
||||
set(result "${result}${arg}") |
||||
endforeach () |
||||
set(${result_var} "${result}" PARENT_SCOPE) |
||||
endfunction() |
||||
|
||||
function(enable_module target) |
||||
if (MSVC) |
||||
set(BMI ${CMAKE_CURRENT_BINARY_DIR}/${target}.ifc) |
||||
target_compile_options(${target} |
||||
PRIVATE /interface /ifcOutput ${BMI} |
||||
INTERFACE /reference fmt=${BMI}) |
||||
endif () |
||||
set_target_properties(${target} PROPERTIES ADDITIONAL_CLEAN_FILES ${BMI}) |
||||
set_source_files_properties(${BMI} PROPERTIES GENERATED ON) |
||||
endfunction() |
||||
|
||||
include(CMakeParseArguments) |
||||
|
||||
# Sets a cache variable with a docstring joined from multiple arguments: |
||||
# set(<variable> <value>... CACHE <type> <docstring>...) |
||||
# This allows splitting a long docstring for readability. |
||||
function(set_verbose) |
||||
# cmake_parse_arguments is broken in CMake 3.4 (cannot parse CACHE) so use |
||||
# list instead. |
||||
list(GET ARGN 0 var) |
||||
list(REMOVE_AT ARGN 0) |
||||
list(GET ARGN 0 val) |
||||
list(REMOVE_AT ARGN 0) |
||||
list(REMOVE_AT ARGN 0) |
||||
list(GET ARGN 0 type) |
||||
list(REMOVE_AT ARGN 0) |
||||
join(doc ${ARGN}) |
||||
set(${var} ${val} CACHE ${type} ${doc}) |
||||
endfunction() |
||||
|
||||
# Set the default CMAKE_BUILD_TYPE to Release. |
||||
# This should be done before the project command since the latter can set |
||||
# CMAKE_BUILD_TYPE itself (it does so for nmake). |
||||
if (FMT_MASTER_PROJECT AND NOT CMAKE_BUILD_TYPE) |
||||
set_verbose(CMAKE_BUILD_TYPE Release CACHE STRING |
||||
"Choose the type of build, options are: None(CMAKE_CXX_FLAGS or " |
||||
"CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.") |
||||
endif () |
||||
|
||||
project(FMT CXX) |
||||
include(GNUInstallDirs) |
||||
set_verbose(FMT_INC_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE STRING |
||||
"Installation directory for include files, a relative path that " |
||||
"will be joined with ${CMAKE_INSTALL_PREFIX} or an absolute path.") |
||||
|
||||
option(FMT_PEDANTIC "Enable extra warnings and expensive tests." OFF) |
||||
option(FMT_WERROR "Halt the compilation with an error on compiler warnings." |
||||
OFF) |
||||
|
||||
# Options that control generation of various targets. |
||||
option(FMT_DOC "Generate the doc target." ${FMT_MASTER_PROJECT}) |
||||
option(FMT_INSTALL "Generate the install target." ${FMT_MASTER_PROJECT}) |
||||
option(FMT_TEST "Generate the test target." ${FMT_MASTER_PROJECT}) |
||||
option(FMT_FUZZ "Generate the fuzz target." OFF) |
||||
option(FMT_CUDA_TEST "Generate the cuda-test target." OFF) |
||||
option(FMT_OS "Include core requiring OS (Windows/Posix) " ON) |
||||
option(FMT_MODULE "Build a module instead of a traditional library." OFF) |
||||
option(FMT_SYSTEM_HEADERS "Expose headers with marking them as system." OFF) |
||||
|
||||
set(FMT_CAN_MODULE OFF) |
||||
if (CMAKE_CXX_STANDARD GREATER 17 AND |
||||
# msvc 16.10-pre4 |
||||
MSVC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.29.30035) |
||||
set(FMT_CAN_MODULE OFF) |
||||
endif () |
||||
if (NOT FMT_CAN_MODULE) |
||||
set(FMT_MODULE OFF) |
||||
message(STATUS "Module support is disabled.") |
||||
endif () |
||||
if (FMT_TEST AND FMT_MODULE) |
||||
# The tests require {fmt} to be compiled as traditional library |
||||
message(STATUS "Testing is incompatible with build mode 'module'.") |
||||
endif () |
||||
set(FMT_SYSTEM_HEADERS_ATTRIBUTE "") |
||||
if (FMT_SYSTEM_HEADERS) |
||||
set(FMT_SYSTEM_HEADERS_ATTRIBUTE SYSTEM) |
||||
endif () |
||||
|
||||
# Get version from core.h |
||||
file(READ include/fmt/core.h core_h) |
||||
if (NOT core_h MATCHES "FMT_VERSION ([0-9]+)([0-9][0-9])([0-9][0-9])") |
||||
message(FATAL_ERROR "Cannot get FMT_VERSION from core.h.") |
||||
endif () |
||||
# Use math to skip leading zeros if any. |
||||
math(EXPR CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1}) |
||||
math(EXPR CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2}) |
||||
math(EXPR CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3}) |
||||
join(FMT_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}. |
||||
${CPACK_PACKAGE_VERSION_PATCH}) |
||||
message(STATUS "Version: ${FMT_VERSION}") |
||||
|
||||
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") |
||||
|
||||
if (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) |
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) |
||||
endif () |
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} |
||||
"${CMAKE_CURRENT_SOURCE_DIR}/support/cmake") |
||||
|
||||
include(cxx14) |
||||
include(JoinPaths) |
||||
|
||||
list(FIND CMAKE_CXX_COMPILE_FEATURES "cxx_variadic_templates" index) |
||||
if (${index} GREATER -1) |
||||
# Use cxx_variadic_templates instead of more appropriate cxx_std_11 for |
||||
# compatibility with older CMake versions. |
||||
set(FMT_REQUIRED_FEATURES cxx_variadic_templates) |
||||
endif () |
||||
message(STATUS "Required features: ${FMT_REQUIRED_FEATURES}") |
||||
|
||||
if (FMT_MASTER_PROJECT AND NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET) |
||||
set_verbose(CMAKE_CXX_VISIBILITY_PRESET hidden CACHE STRING |
||||
"Preset for the export of private symbols") |
||||
set_property(CACHE CMAKE_CXX_VISIBILITY_PRESET PROPERTY STRINGS |
||||
hidden default) |
||||
endif () |
||||
|
||||
if (FMT_MASTER_PROJECT AND NOT DEFINED CMAKE_VISIBILITY_INLINES_HIDDEN) |
||||
set_verbose(CMAKE_VISIBILITY_INLINES_HIDDEN ON CACHE BOOL |
||||
"Whether to add a compile flag to hide symbols of inline functions") |
||||
endif () |
||||
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") |
||||
set(PEDANTIC_COMPILE_FLAGS -pedantic-errors -Wall -Wextra -pedantic |
||||
-Wold-style-cast -Wundef |
||||
-Wredundant-decls -Wwrite-strings -Wpointer-arith |
||||
-Wcast-qual -Wformat=2 -Wmissing-include-dirs |
||||
-Wcast-align |
||||
-Wctor-dtor-privacy -Wdisabled-optimization |
||||
-Winvalid-pch -Woverloaded-virtual |
||||
-Wconversion -Wundef |
||||
-Wno-ctor-dtor-privacy -Wno-format-nonliteral) |
||||
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6) |
||||
set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} |
||||
-Wno-dangling-else -Wno-unused-local-typedefs) |
||||
endif () |
||||
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) |
||||
set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wdouble-promotion |
||||
-Wtrampolines -Wzero-as-null-pointer-constant -Wuseless-cast |
||||
-Wvector-operation-performance -Wsized-deallocation -Wshadow) |
||||
endif () |
||||
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0) |
||||
set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wshift-overflow=2 |
||||
-Wnull-dereference -Wduplicated-cond) |
||||
endif () |
||||
set(WERROR_FLAG -Werror) |
||||
endif () |
||||
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") |
||||
set(PEDANTIC_COMPILE_FLAGS -Wall -Wextra -pedantic -Wconversion -Wundef |
||||
-Wdeprecated -Wweak-vtables -Wshadow |
||||
-Wno-gnu-zero-variadic-macro-arguments) |
||||
check_cxx_compiler_flag(-Wzero-as-null-pointer-constant HAS_NULLPTR_WARNING) |
||||
if (HAS_NULLPTR_WARNING) |
||||
set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} |
||||
-Wzero-as-null-pointer-constant) |
||||
endif () |
||||
set(WERROR_FLAG -Werror) |
||||
endif () |
||||
|
||||
if (MSVC) |
||||
set(PEDANTIC_COMPILE_FLAGS /W3) |
||||
set(WERROR_FLAG /WX) |
||||
endif () |
||||
|
||||
if (FMT_MASTER_PROJECT AND CMAKE_GENERATOR MATCHES "Visual Studio") |
||||
# If Microsoft SDK is installed create script run-msbuild.bat that |
||||
# calls SetEnv.cmd to set up build environment and runs msbuild. |
||||
# It is useful when building Visual Studio projects with the SDK |
||||
# toolchain rather than Visual Studio. |
||||
include(FindSetEnv) |
||||
if (WINSDK_SETENV) |
||||
set(MSBUILD_SETUP "call \"${WINSDK_SETENV}\"") |
||||
endif () |
||||
# Set FrameworkPathOverride to get rid of MSB3644 warnings. |
||||
join(netfxpath |
||||
"C:\\Program Files\\Reference Assemblies\\Microsoft\\Framework\\" |
||||
".NETFramework\\v4.0") |
||||
file(WRITE run-msbuild.bat " |
||||
${MSBUILD_SETUP} |
||||
${CMAKE_MAKE_PROGRAM} -p:FrameworkPathOverride=\"${netfxpath}\" %*") |
||||
endif () |
||||
|
||||
function(add_headers VAR) |
||||
set(headers ${${VAR}}) |
||||
foreach (header ${ARGN}) |
||||
set(headers ${headers} include/fmt/${header}) |
||||
endforeach() |
||||
set(${VAR} ${headers} PARENT_SCOPE) |
||||
endfunction() |
||||
|
||||
# Define the fmt library, its includes and the needed defines. |
||||
add_headers(FMT_HEADERS args.h chrono.h color.h compile.h core.h format.h |
||||
format-inl.h os.h ostream.h printf.h ranges.h std.h |
||||
xchar.h) |
||||
if (FMT_MODULE) |
||||
set(FMT_SOURCES src/fmt.cc) |
||||
elseif (FMT_OS) |
||||
set(FMT_SOURCES src/format.cc src/os.cc) |
||||
else() |
||||
set(FMT_SOURCES src/format.cc) |
||||
endif () |
||||
|
||||
add_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.rst) |
||||
add_library(fmt::fmt ALIAS fmt) |
||||
|
||||
if (FMT_WERROR) |
||||
target_compile_options(fmt PRIVATE ${WERROR_FLAG}) |
||||
endif () |
||||
if (FMT_PEDANTIC) |
||||
target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS}) |
||||
endif () |
||||
if (FMT_MODULE) |
||||
enable_module(fmt) |
||||
endif () |
||||
|
||||
target_compile_features(fmt INTERFACE ${FMT_REQUIRED_FEATURES}) |
||||
|
||||
target_include_directories(fmt ${FMT_SYSTEM_HEADERS_ATTRIBUTE} PUBLIC |
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> |
||||
$<INSTALL_INTERFACE:${FMT_INC_DIR}>) |
||||
|
||||
set(FMT_DEBUG_POSTFIX d CACHE STRING "Debug library postfix.") |
||||
|
||||
set_target_properties(fmt PROPERTIES |
||||
VERSION ${FMT_VERSION} SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR} |
||||
PUBLIC_HEADER "${FMT_HEADERS}" |
||||
DEBUG_POSTFIX "${FMT_DEBUG_POSTFIX}") |
||||
|
||||
# Set FMT_LIB_NAME for pkg-config fmt.pc. We cannot use the OUTPUT_NAME target |
||||
# property because it's not set by default. |
||||
set(FMT_LIB_NAME fmt) |
||||
if (CMAKE_BUILD_TYPE STREQUAL "Debug") |
||||
set(FMT_LIB_NAME ${FMT_LIB_NAME}${FMT_DEBUG_POSTFIX}) |
||||
endif () |
||||
|
||||
if (BUILD_SHARED_LIBS) |
||||
if (UNIX AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" AND |
||||
NOT EMSCRIPTEN) |
||||
# Fix rpmlint warning: |
||||
# unused-direct-shlib-dependency /usr/lib/libformat.so.1.1.0 /lib/libm.so.6. |
||||
target_link_libraries(fmt -Wl,--as-needed) |
||||
endif () |
||||
target_compile_definitions(fmt PRIVATE FMT_EXPORT INTERFACE FMT_SHARED) |
||||
endif () |
||||
if (FMT_SAFE_DURATION_CAST) |
||||
target_compile_definitions(fmt PUBLIC FMT_SAFE_DURATION_CAST) |
||||
endif() |
||||
|
||||
add_library(fmt-header-only INTERFACE) |
||||
add_library(fmt::fmt-header-only ALIAS fmt-header-only) |
||||
|
||||
target_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1) |
||||
target_compile_features(fmt-header-only INTERFACE ${FMT_REQUIRED_FEATURES}) |
||||
|
||||
target_include_directories(fmt-header-only ${FMT_SYSTEM_HEADERS_ATTRIBUTE} INTERFACE |
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> |
||||
$<INSTALL_INTERFACE:${FMT_INC_DIR}>) |
||||
|
||||
# Install targets. |
||||
if (FMT_INSTALL) |
||||
include(CMakePackageConfigHelpers) |
||||
set_verbose(FMT_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/fmt CACHE STRING |
||||
"Installation directory for cmake files, a relative path that " |
||||
"will be joined with ${CMAKE_INSTALL_PREFIX} or an absolute " |
||||
"path.") |
||||
set(version_config ${PROJECT_BINARY_DIR}/fmt-config-version.cmake) |
||||
set(project_config ${PROJECT_BINARY_DIR}/fmt-config.cmake) |
||||
set(pkgconfig ${PROJECT_BINARY_DIR}/fmt.pc) |
||||
set(targets_export_name fmt-targets) |
||||
|
||||
set_verbose(FMT_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE STRING |
||||
"Installation directory for libraries, a relative path that " |
||||
"will be joined to ${CMAKE_INSTALL_PREFIX} or an absolute path.") |
||||
|
||||
set_verbose(FMT_PKGCONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig CACHE PATH |
||||
"Installation directory for pkgconfig (.pc) files, a relative " |
||||
"path that will be joined with ${CMAKE_INSTALL_PREFIX} or an " |
||||
"absolute path.") |
||||
|
||||
# Generate the version, config and target files into the build directory. |
||||
write_basic_package_version_file( |
||||
${version_config} |
||||
VERSION ${FMT_VERSION} |
||||
COMPATIBILITY AnyNewerVersion) |
||||
|
||||
join_paths(libdir_for_pc_file "\${exec_prefix}" "${FMT_LIB_DIR}") |
||||
join_paths(includedir_for_pc_file "\${prefix}" "${FMT_INC_DIR}") |
||||
|
||||
configure_file( |
||||
"${PROJECT_SOURCE_DIR}/support/cmake/fmt.pc.in" |
||||
"${pkgconfig}" |
||||
@ONLY) |
||||
configure_package_config_file( |
||||
${PROJECT_SOURCE_DIR}/support/cmake/fmt-config.cmake.in |
||||
${project_config} |
||||
INSTALL_DESTINATION ${FMT_CMAKE_DIR}) |
||||
|
||||
set(INSTALL_TARGETS fmt fmt-header-only) |
||||
|
||||
# Install the library and headers. |
||||
install(TARGETS ${INSTALL_TARGETS} EXPORT ${targets_export_name} |
||||
LIBRARY DESTINATION ${FMT_LIB_DIR} |
||||
ARCHIVE DESTINATION ${FMT_LIB_DIR} |
||||
PUBLIC_HEADER DESTINATION "${FMT_INC_DIR}/fmt" |
||||
FRAMEWORK DESTINATION "." |
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) |
||||
|
||||
# Use a namespace because CMake provides better diagnostics for namespaced |
||||
# imported targets. |
||||
export(TARGETS ${INSTALL_TARGETS} NAMESPACE fmt:: |
||||
FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake) |
||||
|
||||
# Install version, config and target files. |
||||
install( |
||||
FILES ${project_config} ${version_config} |
||||
DESTINATION ${FMT_CMAKE_DIR}) |
||||
install(EXPORT ${targets_export_name} DESTINATION ${FMT_CMAKE_DIR} |
||||
NAMESPACE fmt::) |
||||
|
||||
install(FILES $<TARGET_PDB_FILE:${INSTALL_TARGETS}> |
||||
DESTINATION ${FMT_LIB_DIR} OPTIONAL) |
||||
install(FILES "${pkgconfig}" DESTINATION "${FMT_PKGCONFIG_DIR}") |
||||
endif () |
||||
|
||||
if (FMT_DOC) |
||||
add_subdirectory(doc) |
||||
endif () |
||||
|
||||
if (FMT_TEST) |
||||
enable_testing() |
||||
add_subdirectory(test) |
||||
endif () |
||||
|
||||
# Control fuzzing independent of the unit tests. |
||||
if (FMT_FUZZ) |
||||
add_subdirectory(test/fuzzing) |
||||
|
||||
# The FMT_FUZZ macro is used to prevent resource exhaustion in fuzzing |
||||
# mode and make fuzzing practically possible. It is similar to |
||||
# FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION but uses a different name to |
||||
# avoid interfering with fuzzing of projects that use {fmt}. |
||||
# See also https://llvm.org/docs/LibFuzzer.html#fuzzer-friendly-build-mode. |
||||
target_compile_definitions(fmt PUBLIC FMT_FUZZ) |
||||
endif () |
||||
|
||||
set(gitignore ${PROJECT_SOURCE_DIR}/.gitignore) |
||||
if (FMT_MASTER_PROJECT AND EXISTS ${gitignore}) |
||||
# Get the list of ignored files from .gitignore. |
||||
file (STRINGS ${gitignore} lines) |
||||
list(REMOVE_ITEM lines /doc/html) |
||||
foreach (line ${lines}) |
||||
string(REPLACE "." "[.]" line "${line}") |
||||
string(REPLACE "*" ".*" line "${line}") |
||||
set(ignored_files ${ignored_files} "${line}$" "${line}/") |
||||
endforeach () |
||||
set(ignored_files ${ignored_files} |
||||
/.git /breathe /format-benchmark sphinx/ .buildinfo .doctrees) |
||||
|
||||
set(CPACK_SOURCE_GENERATOR ZIP) |
||||
set(CPACK_SOURCE_IGNORE_FILES ${ignored_files}) |
||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME fmt-${FMT_VERSION}) |
||||
set(CPACK_PACKAGE_NAME fmt) |
||||
set(CPACK_RESOURCE_FILE_README ${PROJECT_SOURCE_DIR}/README.rst) |
||||
include(CPack) |
||||
endif () |
@ -1,20 +0,0 @@
@@ -1,20 +0,0 @@
|
||||
Contributing to {fmt} |
||||
===================== |
||||
|
||||
By submitting a pull request or a patch, you represent that you have the right |
||||
to license your contribution to the {fmt} project owners and the community, |
||||
agree that your contributions are licensed under the {fmt} license, and agree |
||||
to future changes to the licensing. |
||||
|
||||
All C++ code must adhere to [Google C++ Style Guide]( |
||||
https://google.github.io/styleguide/cppguide.html) with the following |
||||
exceptions: |
||||
|
||||
* Exceptions are permitted |
||||
* snake_case should be used instead of UpperCamelCase for function and type |
||||
names |
||||
|
||||
All documentation must adhere to the [Google Developer Documentation Style |
||||
Guide](https://developers.google.com/style). |
||||
|
||||
Thanks for contributing! |
@ -1,27 +0,0 @@
@@ -1,27 +0,0 @@
|
||||
Copyright (c) 2012 - present, Victor Zverovich |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining |
||||
a copy of this software and associated documentation files (the |
||||
"Software"), to deal in the Software without restriction, including |
||||
without limitation the rights to use, copy, modify, merge, publish, |
||||
distribute, sublicense, and/or sell copies of the Software, and to |
||||
permit persons to whom the Software is furnished to do so, subject to |
||||
the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be |
||||
included in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
|
||||
--- Optional exception to the license --- |
||||
|
||||
As an exception, if, as a result of your compiling your source code, portions |
||||
of this Software are embedded into a machine-executable object form of such |
||||
source code, you may redistribute such embedded portions in such object form |
||||
without including the above copyright and permission notices. |
@ -1,534 +0,0 @@
@@ -1,534 +0,0 @@
|
||||
.. image:: https://user-images.githubusercontent.com/ |
||||
576385/156254208-f5b743a9-88cf-439d-b0c0-923d53e8d551.png |
||||
:width: 25% |
||||
:alt: {fmt} |
||||
|
||||
.. image:: https://github.com/fmtlib/fmt/workflows/linux/badge.svg |
||||
:target: https://github.com/fmtlib/fmt/actions?query=workflow%3Alinux |
||||
|
||||
.. image:: https://github.com/fmtlib/fmt/workflows/macos/badge.svg |
||||
:target: https://github.com/fmtlib/fmt/actions?query=workflow%3Amacos |
||||
|
||||
.. image:: https://github.com/fmtlib/fmt/workflows/windows/badge.svg |
||||
:target: https://github.com/fmtlib/fmt/actions?query=workflow%3Awindows |
||||
|
||||
.. image:: https://ci.appveyor.com/api/projects/status/ehjkiefde6gucy1v?svg=true |
||||
:target: https://ci.appveyor.com/project/vitaut/fmt |
||||
|
||||
.. image:: https://oss-fuzz-build-logs.storage.googleapis.com/badges/fmt.svg |
||||
:alt: fmt is continuously fuzzed at oss-fuzz |
||||
:target: https://bugs.chromium.org/p/oss-fuzz/issues/list?\ |
||||
colspec=ID%20Type%20Component%20Status%20Proj%20Reported%20Owner%20\ |
||||
Summary&q=proj%3Dfmt&can=1 |
||||
|
||||
.. image:: https://img.shields.io/badge/stackoverflow-fmt-blue.svg |
||||
:alt: Ask questions at StackOverflow with the tag fmt |
||||
:target: https://stackoverflow.com/questions/tagged/fmt |
||||
|
||||
**{fmt}** is an open-source formatting library providing a fast and safe |
||||
alternative to C stdio and C++ iostreams. |
||||
|
||||
If you like this project, please consider donating to one of the funds that |
||||
help victims of the war in Ukraine: https://www.stopputin.net/. |
||||
|
||||
`Documentation <https://fmt.dev>`__ |
||||
|
||||
`Cheat Sheets <https://hackingcpp.com/cpp/libs/fmt.html>`__ |
||||
|
||||
Q&A: ask questions on `StackOverflow with the tag fmt |
||||
<https://stackoverflow.com/questions/tagged/fmt>`_. |
||||
|
||||
Try {fmt} in `Compiler Explorer <https://godbolt.org/z/Eq5763>`_. |
||||
|
||||
Features |
||||
-------- |
||||
|
||||
* Simple `format API <https://fmt.dev/latest/api.html>`_ with positional arguments |
||||
for localization |
||||
* Implementation of `C++20 std::format |
||||
<https://en.cppreference.com/w/cpp/utility/format>`__ |
||||
* `Format string syntax <https://fmt.dev/latest/syntax.html>`_ similar to Python's |
||||
`format <https://docs.python.org/3/library/stdtypes.html#str.format>`_ |
||||
* Fast IEEE 754 floating-point formatter with correct rounding, shortness and |
||||
round-trip guarantees |
||||
* Safe `printf implementation |
||||
<https://fmt.dev/latest/api.html#printf-formatting>`_ including the POSIX |
||||
extension for positional arguments |
||||
* Extensibility: `support for user-defined types |
||||
<https://fmt.dev/latest/api.html#formatting-user-defined-types>`_ |
||||
* High performance: faster than common standard library implementations of |
||||
``(s)printf``, iostreams, ``to_string`` and ``to_chars``, see `Speed tests`_ |
||||
and `Converting a hundred million integers to strings per second |
||||
<http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_ |
||||
* Small code size both in terms of source code with the minimum configuration |
||||
consisting of just three files, ``core.h``, ``format.h`` and ``format-inl.h``, |
||||
and compiled code; see `Compile time and code bloat`_ |
||||
* Reliability: the library has an extensive set of `tests |
||||
<https://github.com/fmtlib/fmt/tree/master/test>`_ and is `continuously fuzzed |
||||
<https://bugs.chromium.org/p/oss-fuzz/issues/list?colspec=ID%20Type%20 |
||||
Component%20Status%20Proj%20Reported%20Owner%20Summary&q=proj%3Dfmt&can=1>`_ |
||||
* Safety: the library is fully type safe, errors in format strings can be |
||||
reported at compile time, automatic memory management prevents buffer overflow |
||||
errors |
||||
* Ease of use: small self-contained code base, no external dependencies, |
||||
permissive MIT `license |
||||
<https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_ |
||||
* `Portability <https://fmt.dev/latest/index.html#portability>`_ with |
||||
consistent output across platforms and support for older compilers |
||||
* Clean warning-free codebase even on high warning levels such as |
||||
``-Wall -Wextra -pedantic`` |
||||
* Locale-independence by default |
||||
* Optional header-only configuration enabled with the ``FMT_HEADER_ONLY`` macro |
||||
|
||||
See the `documentation <https://fmt.dev>`_ for more details. |
||||
|
||||
Examples |
||||
-------- |
||||
|
||||
**Print to stdout** (`run <https://godbolt.org/z/Tevcjh>`_) |
||||
|
||||
.. code:: c++ |
||||
|
||||
#include <fmt/core.h> |
||||
|
||||
int main() { |
||||
fmt::print("Hello, world!\n"); |
||||
} |
||||
|
||||
**Format a string** (`run <https://godbolt.org/z/oK8h33>`_) |
||||
|
||||
.. code:: c++ |
||||
|
||||
std::string s = fmt::format("The answer is {}.", 42); |
||||
// s == "The answer is 42." |
||||
|
||||
**Format a string using positional arguments** (`run <https://godbolt.org/z/Yn7Txe>`_) |
||||
|
||||
.. code:: c++ |
||||
|
||||
std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy"); |
||||
// s == "I'd rather be happy than right." |
||||
|
||||
**Print chrono durations** (`run <https://godbolt.org/z/K8s4Mc>`_) |
||||
|
||||
.. code:: c++ |
||||
|
||||
#include <fmt/chrono.h> |
||||
|
||||
int main() { |
||||
using namespace std::literals::chrono_literals; |
||||
fmt::print("Default format: {} {}\n", 42s, 100ms); |
||||
fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s); |
||||
} |
||||
|
||||
Output:: |
||||
|
||||
Default format: 42s 100ms |
||||
strftime-like format: 03:15:30 |
||||
|
||||
**Print a container** (`run <https://godbolt.org/z/MxM1YqjE7>`_) |
||||
|
||||
.. code:: c++ |
||||
|
||||
#include <vector> |
||||
#include <fmt/ranges.h> |
||||
|
||||
int main() { |
||||
std::vector<int> v = {1, 2, 3}; |
||||
fmt::print("{}\n", v); |
||||
} |
||||
|
||||
Output:: |
||||
|
||||
[1, 2, 3] |
||||
|
||||
**Check a format string at compile time** |
||||
|
||||
.. code:: c++ |
||||
|
||||
std::string s = fmt::format("{:d}", "I am not a number"); |
||||
|
||||
This gives a compile-time error in C++20 because ``d`` is an invalid format |
||||
specifier for a string. |
||||
|
||||
**Write a file from a single thread** |
||||
|
||||
.. code:: c++ |
||||
|
||||
#include <fmt/os.h> |
||||
|
||||
int main() { |
||||
auto out = fmt::output_file("guide.txt"); |
||||
out.print("Don't {}", "Panic"); |
||||
} |
||||
|
||||
This can be `5 to 9 times faster than fprintf |
||||
<http://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html>`_. |
||||
|
||||
**Print with colors and text styles** |
||||
|
||||
.. code:: c++ |
||||
|
||||
#include <fmt/color.h> |
||||
|
||||
int main() { |
||||
fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold, |
||||
"Hello, {}!\n", "world"); |
||||
fmt::print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) | |
||||
fmt::emphasis::underline, "Hello, {}!\n", "мир"); |
||||
fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic, |
||||
"Hello, {}!\n", "世界"); |
||||
} |
||||
|
||||
Output on a modern terminal: |
||||
|
||||
.. image:: https://user-images.githubusercontent.com/ |
||||
576385/88485597-d312f600-cf2b-11ea-9cbe-61f535a86e28.png |
||||
|
||||
Benchmarks |
||||
---------- |
||||
|
||||
Speed tests |
||||
~~~~~~~~~~~ |
||||
|
||||
================= ============= =========== |
||||
Library Method Run Time, s |
||||
================= ============= =========== |
||||
libc printf 1.04 |
||||
libc++ std::ostream 3.05 |
||||
{fmt} 6.1.1 fmt::print 0.75 |
||||
Boost Format 1.67 boost::format 7.24 |
||||
Folly Format folly::format 2.23 |
||||
================= ============= =========== |
||||
|
||||
{fmt} is the fastest of the benchmarked methods, ~35% faster than ``printf``. |
||||
|
||||
The above results were generated by building ``tinyformat_test.cpp`` on macOS |
||||
10.14.6 with ``clang++ -O3 -DNDEBUG -DSPEED_TEST -DHAVE_FORMAT``, and taking the |
||||
best of three runs. In the test, the format string ``"%0.10f:%04d:%+g:%s:%p:%c:%%\n"`` |
||||
or equivalent is filled 2,000,000 times with output sent to ``/dev/null``; for |
||||
further details refer to the `source |
||||
<https://github.com/fmtlib/format-benchmark/blob/master/src/tinyformat-test.cc>`_. |
||||
|
||||
{fmt} is up to 20-30x faster than ``std::ostringstream`` and ``sprintf`` on |
||||
floating-point formatting (`dtoa-benchmark <https://github.com/fmtlib/dtoa-benchmark>`_) |
||||
and faster than `double-conversion <https://github.com/google/double-conversion>`_ and |
||||
`ryu <https://github.com/ulfjack/ryu>`_: |
||||
|
||||
.. image:: https://user-images.githubusercontent.com/576385/ |
||||
95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png |
||||
:target: https://fmt.dev/unknown_mac64_clang12.0.html |
||||
|
||||
Compile time and code bloat |
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
The script `bloat-test.py |
||||
<https://github.com/fmtlib/format-benchmark/blob/master/bloat-test.py>`_ |
||||
from `format-benchmark <https://github.com/fmtlib/format-benchmark>`_ |
||||
tests compile time and code bloat for nontrivial projects. |
||||
It generates 100 translation units and uses ``printf()`` or its alternative |
||||
five times in each to simulate a medium sized project. The resulting |
||||
executable size and compile time (Apple LLVM version 8.1.0 (clang-802.0.42), |
||||
macOS Sierra, best of three) is shown in the following tables. |
||||
|
||||
**Optimized build (-O3)** |
||||
|
||||
============= =============== ==================== ================== |
||||
Method Compile Time, s Executable size, KiB Stripped size, KiB |
||||
============= =============== ==================== ================== |
||||
printf 2.6 29 26 |
||||
printf+string 16.4 29 26 |
||||
iostreams 31.1 59 55 |
||||
{fmt} 19.0 37 34 |
||||
Boost Format 91.9 226 203 |
||||
Folly Format 115.7 101 88 |
||||
============= =============== ==================== ================== |
||||
|
||||
As you can see, {fmt} has 60% less overhead in terms of resulting binary code |
||||
size compared to iostreams and comes pretty close to ``printf``. Boost Format |
||||
and Folly Format have the largest overheads. |
||||
|
||||
``printf+string`` is the same as ``printf`` but with extra ``<string>`` |
||||
include to measure the overhead of the latter. |
||||
|
||||
**Non-optimized build** |
||||
|
||||
============= =============== ==================== ================== |
||||
Method Compile Time, s Executable size, KiB Stripped size, KiB |
||||
============= =============== ==================== ================== |
||||
printf 2.2 33 30 |
||||
printf+string 16.0 33 30 |
||||
iostreams 28.3 56 52 |
||||
{fmt} 18.2 59 50 |
||||
Boost Format 54.1 365 303 |
||||
Folly Format 79.9 445 430 |
||||
============= =============== ==================== ================== |
||||
|
||||
``libc``, ``lib(std)c++`` and ``libfmt`` are all linked as shared libraries to |
||||
compare formatting function overhead only. Boost Format is a |
||||
header-only library so it doesn't provide any linkage options. |
||||
|
||||
Running the tests |
||||
~~~~~~~~~~~~~~~~~ |
||||
|
||||
Please refer to `Building the library`__ for the instructions on how to build |
||||
the library and run the unit tests. |
||||
|
||||
__ https://fmt.dev/latest/usage.html#building-the-library |
||||
|
||||
Benchmarks reside in a separate repository, |
||||
`format-benchmarks <https://github.com/fmtlib/format-benchmark>`_, |
||||
so to run the benchmarks you first need to clone this repository and |
||||
generate Makefiles with CMake:: |
||||
|
||||
$ git clone --recursive https://github.com/fmtlib/format-benchmark.git |
||||
$ cd format-benchmark |
||||
$ cmake . |
||||
|
||||
Then you can run the speed test:: |
||||
|
||||
$ make speed-test |
||||
|
||||
or the bloat test:: |
||||
|
||||
$ make bloat-test |
||||
|
||||
Migrating code |
||||
-------------- |
||||
|
||||
`clang-tidy-fmt <https://github.com/mikecrowe/clang-tidy-fmt>`_ provides clang |
||||
tidy checks for converting occurrences of ``printf`` and ``fprintf`` to |
||||
``fmt::print``. |
||||
|
||||
Projects using this library |
||||
--------------------------- |
||||
|
||||
* `0 A.D. <https://play0ad.com/>`_: a free, open-source, cross-platform |
||||
real-time strategy game |
||||
|
||||
* `2GIS <https://2gis.ru/>`_: free business listings with a city map |
||||
|
||||
* `AMPL/MP <https://github.com/ampl/mp>`_: |
||||
an open-source library for mathematical programming |
||||
|
||||
* `Aseprite <https://github.com/aseprite/aseprite>`_: |
||||
animated sprite editor & pixel art tool |
||||
|
||||
* `AvioBook <https://www.aviobook.aero/en>`_: a comprehensive aircraft |
||||
operations suite |
||||
|
||||
* `Blizzard Battle.net <https://battle.net/>`_: an online gaming platform |
||||
|
||||
* `Celestia <https://celestia.space/>`_: real-time 3D visualization of space |
||||
|
||||
* `Ceph <https://ceph.com/>`_: a scalable distributed storage system |
||||
|
||||
* `ccache <https://ccache.dev/>`_: a compiler cache |
||||
|
||||
* `ClickHouse <https://github.com/ClickHouse/ClickHouse>`_: analytical database |
||||
management system |
||||
|
||||
* `CUAUV <https://cuauv.org/>`_: Cornell University's autonomous underwater |
||||
vehicle |
||||
|
||||
* `Drake <https://drake.mit.edu/>`_: a planning, control, and analysis toolbox |
||||
for nonlinear dynamical systems (MIT) |
||||
|
||||
* `Envoy <https://lyft.github.io/envoy/>`_: C++ L7 proxy and communication bus |
||||
(Lyft) |
||||
|
||||
* `FiveM <https://fivem.net/>`_: a modification framework for GTA V |
||||
|
||||
* `fmtlog <https://github.com/MengRao/fmtlog>`_: a performant fmtlib-style |
||||
logging library with latency in nanoseconds |
||||
|
||||
* `Folly <https://github.com/facebook/folly>`_: Facebook open-source library |
||||
|
||||
* `GemRB <https://gemrb.org/>`_: a portable open-source implementation of |
||||
Bioware’s Infinity Engine |
||||
|
||||
* `Grand Mountain Adventure |
||||
<https://store.steampowered.com/app/1247360/Grand_Mountain_Adventure/>`_: |
||||
a beautiful open-world ski & snowboarding game |
||||
|
||||
* `HarpyWar/pvpgn <https://github.com/pvpgn/pvpgn-server>`_: |
||||
Player vs Player Gaming Network with tweaks |
||||
|
||||
* `KBEngine <https://github.com/kbengine/kbengine>`_: an open-source MMOG server |
||||
engine |
||||
|
||||
* `Keypirinha <https://keypirinha.com/>`_: a semantic launcher for Windows |
||||
|
||||
* `Kodi <https://kodi.tv/>`_ (formerly xbmc): home theater software |
||||
|
||||
* `Knuth <https://kth.cash/>`_: high-performance Bitcoin full-node |
||||
|
||||
* `Microsoft Verona <https://github.com/microsoft/verona>`_: |
||||
research programming language for concurrent ownership |
||||
|
||||
* `MongoDB <https://mongodb.com/>`_: distributed document database |
||||
|
||||
* `MongoDB Smasher <https://github.com/duckie/mongo_smasher>`_: a small tool to |
||||
generate randomized datasets |
||||
|
||||
* `OpenSpace <https://openspaceproject.com/>`_: an open-source |
||||
astrovisualization framework |
||||
|
||||
* `PenUltima Online (POL) <https://www.polserver.com/>`_: |
||||
an MMO server, compatible with most Ultima Online clients |
||||
|
||||
* `PyTorch <https://github.com/pytorch/pytorch>`_: an open-source machine |
||||
learning library |
||||
|
||||
* `quasardb <https://www.quasardb.net/>`_: a distributed, high-performance, |
||||
associative database |
||||
|
||||
* `Quill <https://github.com/odygrd/quill>`_: asynchronous low-latency logging library |
||||
|
||||
* `QKW <https://github.com/ravijanjam/qkw>`_: generalizing aliasing to simplify |
||||
navigation, and executing complex multi-line terminal command sequences |
||||
|
||||
* `redis-cerberus <https://github.com/HunanTV/redis-cerberus>`_: a Redis cluster |
||||
proxy |
||||
|
||||
* `redpanda <https://vectorized.io/redpanda>`_: a 10x faster Kafka® replacement |
||||
for mission critical systems written in C++ |
||||
|
||||
* `rpclib <http://rpclib.net/>`_: a modern C++ msgpack-RPC server and client |
||||
library |
||||
|
||||
* `Salesforce Analytics Cloud |
||||
<https://www.salesforce.com/analytics-cloud/overview/>`_: |
||||
business intelligence software |
||||
|
||||
* `Scylla <https://www.scylladb.com/>`_: a Cassandra-compatible NoSQL data store |
||||
that can handle 1 million transactions per second on a single server |
||||
|
||||
* `Seastar <http://www.seastar-project.org/>`_: an advanced, open-source C++ |
||||
framework for high-performance server applications on modern hardware |
||||
|
||||
* `spdlog <https://github.com/gabime/spdlog>`_: super fast C++ logging library |
||||
|
||||
* `Stellar <https://www.stellar.org/>`_: financial platform |
||||
|
||||
* `Touch Surgery <https://www.touchsurgery.com/>`_: surgery simulator |
||||
|
||||
* `TrinityCore <https://github.com/TrinityCore/TrinityCore>`_: open-source |
||||
MMORPG framework |
||||
|
||||
* `Windows Terminal <https://github.com/microsoft/terminal>`_: the new Windows |
||||
terminal |
||||
|
||||
`More... <https://github.com/search?q=fmtlib&type=Code>`_ |
||||
|
||||
If you are aware of other projects using this library, please let me know |
||||
by `email <mailto:victor.zverovich@gmail.com>`_ or by submitting an |
||||
`issue <https://github.com/fmtlib/fmt/issues>`_. |
||||
|
||||
Motivation |
||||
---------- |
||||
|
||||
So why yet another formatting library? |
||||
|
||||
There are plenty of methods for doing this task, from standard ones like |
||||
the printf family of function and iostreams to Boost Format and FastFormat |
||||
libraries. The reason for creating a new library is that every existing |
||||
solution that I found either had serious issues or didn't provide |
||||
all the features I needed. |
||||
|
||||
printf |
||||
~~~~~~ |
||||
|
||||
The good thing about ``printf`` is that it is pretty fast and readily available |
||||
being a part of the C standard library. The main drawback is that it |
||||
doesn't support user-defined types. ``printf`` also has safety issues although |
||||
they are somewhat mitigated with `__attribute__ ((format (printf, ...)) |
||||
<https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html>`_ in GCC. |
||||
There is a POSIX extension that adds positional arguments required for |
||||
`i18n <https://en.wikipedia.org/wiki/Internationalization_and_localization>`_ |
||||
to ``printf`` but it is not a part of C99 and may not be available on some |
||||
platforms. |
||||
|
||||
iostreams |
||||
~~~~~~~~~ |
||||
|
||||
The main issue with iostreams is best illustrated with an example: |
||||
|
||||
.. code:: c++ |
||||
|
||||
std::cout << std::setprecision(2) << std::fixed << 1.23456 << "\n"; |
||||
|
||||
which is a lot of typing compared to printf: |
||||
|
||||
.. code:: c++ |
||||
|
||||
printf("%.2f\n", 1.23456); |
||||
|
||||
Matthew Wilson, the author of FastFormat, called this "chevron hell". iostreams |
||||
don't support positional arguments by design. |
||||
|
||||
The good part is that iostreams support user-defined types and are safe although |
||||
error handling is awkward. |
||||
|
||||
Boost Format |
||||
~~~~~~~~~~~~ |
||||
|
||||
This is a very powerful library which supports both ``printf``-like format |
||||
strings and positional arguments. Its main drawback is performance. According to |
||||
various benchmarks, it is much slower than other methods considered here. Boost |
||||
Format also has excessive build times and severe code bloat issues (see |
||||
`Benchmarks`_). |
||||
|
||||
FastFormat |
||||
~~~~~~~~~~ |
||||
|
||||
This is an interesting library which is fast, safe and has positional arguments. |
||||
However, it has significant limitations, citing its author: |
||||
|
||||
Three features that have no hope of being accommodated within the |
||||
current design are: |
||||
|
||||
* Leading zeros (or any other non-space padding) |
||||
* Octal/hexadecimal encoding |
||||
* Runtime width/alignment specification |
||||
|
||||
It is also quite big and has a heavy dependency, STLSoft, which might be too |
||||
restrictive for using it in some projects. |
||||
|
||||
Boost Spirit.Karma |
||||
~~~~~~~~~~~~~~~~~~ |
||||
|
||||
This is not really a formatting library but I decided to include it here for |
||||
completeness. As iostreams, it suffers from the problem of mixing verbatim text |
||||
with arguments. The library is pretty fast, but slower on integer formatting |
||||
than ``fmt::format_to`` with format string compilation on Karma's own benchmark, |
||||
see `Converting a hundred million integers to strings per second |
||||
<http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_. |
||||
|
||||
License |
||||
------- |
||||
|
||||
{fmt} is distributed under the MIT `license |
||||
<https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_. |
||||
|
||||
Documentation License |
||||
--------------------- |
||||
|
||||
The `Format String Syntax <https://fmt.dev/latest/syntax.html>`_ |
||||
section in the documentation is based on the one from Python `string module |
||||
documentation <https://docs.python.org/3/library/string.html#module-string>`_. |
||||
For this reason the documentation is distributed under the Python Software |
||||
Foundation license available in `doc/python-license.txt |
||||
<https://raw.github.com/fmtlib/fmt/master/doc/python-license.txt>`_. |
||||
It only applies if you distribute the documentation of {fmt}. |
||||
|
||||
Maintainers |
||||
----------- |
||||
|
||||
The {fmt} library is maintained by Victor Zverovich (`vitaut |
||||
<https://github.com/vitaut>`_) and Jonathan Müller (`foonathan |
||||
<https://github.com/foonathan>`_) with contributions from many other people. |
||||
See `Contributors <https://github.com/fmtlib/fmt/graphs/contributors>`_ and |
||||
`Releases <https://github.com/fmtlib/fmt/releases>`_ for some of the names. |
||||
Let us know if your contribution is not listed or mentioned incorrectly and |
||||
we'll make it right. |
@ -1,17 +0,0 @@
@@ -1,17 +0,0 @@
|
||||
find_program(DOXYGEN doxygen) |
||||
if (NOT DOXYGEN) |
||||
message(STATUS "Target 'doc' disabled (requires doxygen)") |
||||
return () |
||||
endif () |
||||
|
||||
find_package(PythonInterp QUIET REQUIRED) |
||||
|
||||
add_custom_target(doc |
||||
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/build.py |
||||
${FMT_VERSION} |
||||
SOURCES api.rst syntax.rst usage.rst build.py conf.py _templates/layout.html) |
||||
|
||||
include(GNUInstallDirs) |
||||
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/ |
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/fmt OPTIONAL |
||||
PATTERN ".doctrees" EXCLUDE) |
File diff suppressed because one or more lines are too long
Binary file not shown.
Before Width: | Height: | Size: 62 KiB |
Binary file not shown.
Binary file not shown.
@ -1,148 +0,0 @@
@@ -1,148 +0,0 @@
|
||||
{% extends "!layout.html" %} |
||||
|
||||
{% block extrahead %} |
||||
<meta name="description" content="Small, safe and fast formatting library"> |
||||
<meta name="keywords" content="C++, formatting, printf, string, library"> |
||||
<meta name="author" content="Victor Zverovich"> |
||||
<link rel="stylesheet" href="_static/fmt.css"> |
||||
{# Google Analytics #} |
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-20116650-4"></script> |
||||
<script> |
||||
window.dataLayer = window.dataLayer || []; |
||||
function gtag(){dataLayer.push(arguments);} |
||||
gtag('js', new Date()); |
||||
|
||||
gtag('config', 'UA-20116650-4'); |
||||
</script> |
||||
{% endblock %} |
||||
|
||||
{%- macro searchform(classes, button) %} |
||||
<form class="{{classes}}" role="search" action="{{ pathto('search') }}" |
||||
method="get"> |
||||
<div class="form-group"> |
||||
<input type="text" name="q" class="form-control" |
||||
{{ 'placeholder="Search"' if not button }} > |
||||
</div> |
||||
<input type="hidden" name="check_keywords" value="yes" /> |
||||
<input type="hidden" name="area" value="default" /> |
||||
{% if button %} |
||||
<input type="submit" class="btn btn-default" value="search"> |
||||
{% endif %} |
||||
</form> |
||||
{%- endmacro %} |
||||
|
||||
{% block header %} |
||||
<nav class="navbar navbar-inverse"> |
||||
<div class="tb-container"> |
||||
<div class="row"> |
||||
<div class="navbar-content"> |
||||
{# Brand and toggle get grouped for better mobile display #} |
||||
<div class="navbar-header"> |
||||
<button type="button" class="navbar-toggle collapsed" |
||||
data-toggle="collapse" data-target=".navbar-collapse"> |
||||
<span class="sr-only">Toggle navigation</span> |
||||
<span class="icon-bar"></span> |
||||
<span class="icon-bar"></span> |
||||
<span class="icon-bar"></span> |
||||
</button> |
||||
<a class="navbar-brand" href="index.html">{fmt}</a> |
||||
</div> |
||||
|
||||
{# Collect the nav links, forms, and other content for toggling #} |
||||
<div class="collapse navbar-collapse"> |
||||
<ul class="nav navbar-nav"> |
||||
<li class="dropdown"> |
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" |
||||
role="button" aria-expanded="false">{{ version }} |
||||
<span class="caret"></span></a> |
||||
<ul class="dropdown-menu" role="menu"> |
||||
{% for v in versions.split(',') %} |
||||
<li><a href="https://fmt.dev/{{v}}">{{v}}</a></li> |
||||
{% endfor %} |
||||
</ul> |
||||
</li> |
||||
{% for name in ['Contents', 'Usage', 'API', 'Syntax'] %} |
||||
{% if pagename == name.lower() %} |
||||
<li class="active"><a href="{{name.lower()}}.html">{{name}} |
||||
<span class="sr-only">(current)</span></a></li> |
||||
{%else%} |
||||
<li><a href="{{name.lower()}}.html">{{name}}</a></li> |
||||
{%endif%} |
||||
{% endfor %} |
||||
</ul> |
||||
{% if pagename != 'search' %} |
||||
{{ searchform('navbar-form navbar-right', False) }} |
||||
{%endif%} |
||||
</div> {# /.navbar-collapse #} |
||||
</div> {# /.col-md-offset-2 #} |
||||
</div> {# /.row #} |
||||
</div> {# /.tb-container #} |
||||
</nav> |
||||
{% if pagename == "index" %} |
||||
{% set download_url = 'https://github.com/fmtlib/fmt/releases/download' %} |
||||
<div class="jumbotron"> |
||||
<div class="tb-container"> |
||||
<h1>{fmt}</h1> |
||||
<p class="lead">A modern formatting library</p> |
||||
<div class="btn-group" role="group"> |
||||
{% set name = 'fmt' if version.split('.')[0]|int >= 3 else 'cppformat' %} |
||||
<a class="btn btn-success" |
||||
href="{{download_url}}/{{version}}/{{name}}-{{version}}.zip"> |
||||
<span class="glyphicon glyphicon-download"></span> Download |
||||
</a> |
||||
<button type="button" class="btn btn-success dropdown-toggle" |
||||
data-toggle="dropdown"><span class="caret"></span></button> |
||||
<ul class="dropdown-menu"> |
||||
{% for v in versions.split(',') %} |
||||
{% set name = 'fmt' if v.split('.')[0]|int >= 3 else 'cppformat' %} |
||||
<li><a href="{{download_url}}/{{v}}/{{name}}-{{v}}.zip">Version {{v}} |
||||
</a></li> |
||||
{% endfor %} |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
{% endif %} |
||||
{% endblock %} |
||||
|
||||
{# Disable relbars. #} |
||||
{% block relbar1 %} |
||||
{% endblock %} |
||||
{% block relbar2 %} |
||||
{% endblock %} |
||||
|
||||
{% block content %} |
||||
<div class="tb-container"> |
||||
<div class="row"> |
||||
{# Sidebar is currently disabled. |
||||
<div class="bs-sidebar"> |
||||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation"> |
||||
<div class="sphinxsidebarwrapper"> |
||||
{%- block sidebarlogo %} |
||||
{%- if logo %} |
||||
<p class="logo"><a href="{{ pathto(master_doc) }}"> |
||||
<img class="logo" src="{{ pathto('_static/' + logo, 1) }}" |
||||
alt="Logo"/> |
||||
</a></p> |
||||
{%- endif %} |
||||
{%- endblock %} |
||||
{%- for sidebartemplate in sidebars %} |
||||
{%- include sidebartemplate %} |
||||
{%- endfor %} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
#} |
||||
|
||||
<div class="content"> |
||||
{% block body %} {% endblock %} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
{% endblock %} |
||||
|
||||
{% block footer %} |
||||
{{ super() }} |
||||
{# Placed at the end of the document so the pages load faster. #} |
||||
<script src="_static/bootstrap.min.js"></script> |
||||
{% endblock %} |
@ -1,55 +0,0 @@
@@ -1,55 +0,0 @@
|
||||
{# |
||||
basic/search.html |
||||
~~~~~~~~~~~~~~~~~ |
||||
|
||||
Template for the search page. |
||||
|
||||
:copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. |
||||
:license: BSD, see LICENSE for details. |
||||
#} |
||||
{%- extends "layout.html" %} |
||||
{% set title = _('Search') %} |
||||
{% set script_files = script_files + ['_static/searchtools.js'] %} |
||||
{% block extrahead %} |
||||
<script type="text/javascript"> |
||||
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); }); |
||||
</script> |
||||
{# this is used when loading the search index using $.ajax fails, |
||||
such as on Chrome for documents on localhost #} |
||||
<script type="text/javascript" id="searchindexloader"></script> |
||||
{{ super() }} |
||||
{% endblock %} |
||||
{% block body %} |
||||
<h1 id="search-documentation">{{ _('Search') }}</h1> |
||||
<div id="fallback" class="admonition warning"> |
||||
<script type="text/javascript">$('#fallback').hide();</script> |
||||
<p> |
||||
{% trans %}Please activate JavaScript to enable the search |
||||
functionality.{% endtrans %} |
||||
</p> |
||||
</div> |
||||
<p> |
||||
{% trans %}From here you can search these documents. Enter your search |
||||
words into the box below and click "search". Note that the search |
||||
function will automatically search for all of the words. Pages |
||||
containing fewer words won't appear in the result list.{% endtrans %} |
||||
</p> |
||||
{{ searchform('form-inline', True) }} |
||||
{% if search_performed %} |
||||
<h2>{{ _('Search Results') }}</h2> |
||||
{% if not search_results %} |
||||
<p>{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}</p> |
||||
{% endif %} |
||||
{% endif %} |
||||
<div id="search-results"> |
||||
{% if search_results %} |
||||
<ul> |
||||
{% for href, caption, context in search_results %} |
||||
<li><a href="{{ pathto(item.href) }}">{{ caption }}</a> |
||||
<div class="context">{{ context|e }}</div> |
||||
</li> |
||||
{% endfor %} |
||||
</ul> |
||||
{% endif %} |
||||
</div> |
||||
{% endblock %} |
@ -1,617 +0,0 @@
@@ -1,617 +0,0 @@
|
||||
.. _string-formatting-api: |
||||
|
||||
************* |
||||
API Reference |
||||
************* |
||||
|
||||
The {fmt} library API consists of the following parts: |
||||
|
||||
* :ref:`fmt/core.h <core-api>`: the core API providing main formatting functions |
||||
for ``char``/UTF-8 with compile-time checks and minimal dependencies |
||||
* :ref:`fmt/format.h <format-api>`: the full format API providing additional |
||||
formatting functions and locale support |
||||
* :ref:`fmt/ranges.h <ranges-api>`: formatting of ranges and tuples |
||||
* :ref:`fmt/chrono.h <chrono-api>`: date and time formatting |
||||
* :ref:`fmt/std.h <std-api>`: formatters for standard library types |
||||
* :ref:`fmt/compile.h <compile-api>`: format string compilation |
||||
* :ref:`fmt/color.h <color-api>`: terminal color and text style |
||||
* :ref:`fmt/os.h <os-api>`: system APIs |
||||
* :ref:`fmt/ostream.h <ostream-api>`: ``std::ostream`` support |
||||
* :ref:`fmt/printf.h <printf-api>`: ``printf`` formatting |
||||
* :ref:`fmt/xchar.h <xchar-api>`: optional ``wchar_t`` support |
||||
|
||||
All functions and types provided by the library reside in namespace ``fmt`` and |
||||
macros have prefix ``FMT_``. |
||||
|
||||
.. _core-api: |
||||
|
||||
Core API |
||||
======== |
||||
|
||||
``fmt/core.h`` defines the core API which provides main formatting functions for |
||||
``char``/UTF-8 with compile-time checks. It has minimal include dependencies for |
||||
better compile times. This header is only beneficial when using {fmt} as a |
||||
library and not in the header-only mode. |
||||
|
||||
The following functions use :ref:`format string syntax <syntax>` |
||||
similar to that of Python's `str.format |
||||
<https://docs.python.org/3/library/stdtypes.html#str.format>`_. |
||||
They take *fmt* and *args* as arguments. |
||||
|
||||
*fmt* is a format string that contains literal text and replacement fields |
||||
surrounded by braces ``{}``. The fields are replaced with formatted arguments |
||||
in the resulting string. `~fmt::format_string` is a format string which can be |
||||
implicitly constructed from a string literal or a ``constexpr`` string and is |
||||
checked at compile time in C++20. To pass a runtime format string wrap it in |
||||
`fmt::runtime`. |
||||
|
||||
*args* is an argument list representing objects to be formatted. |
||||
|
||||
.. _format: |
||||
|
||||
.. doxygenfunction:: format(format_string<T...> fmt, T&&... args) -> std::string |
||||
.. doxygenfunction:: vformat(string_view fmt, format_args args) -> std::string |
||||
|
||||
.. doxygenfunction:: format_to(OutputIt out, format_string<T...> fmt, T&&... args) -> OutputIt |
||||
.. doxygenfunction:: format_to_n(OutputIt out, size_t n, format_string<T...> fmt, T&&... args) -> format_to_n_result<OutputIt> |
||||
.. doxygenfunction:: formatted_size(format_string<T...> fmt, T&&... args) -> size_t |
||||
|
||||
.. doxygenstruct:: fmt::format_to_n_result |
||||
:members: |
||||
|
||||
.. _print: |
||||
|
||||
.. doxygenfunction:: fmt::print(format_string<T...> fmt, T&&... args) |
||||
.. doxygenfunction:: fmt::vprint(string_view fmt, format_args args) |
||||
|
||||
.. doxygenfunction:: print(std::FILE *f, format_string<T...> fmt, T&&... args) |
||||
.. doxygenfunction:: vprint(std::FILE *f, string_view fmt, format_args args) |
||||
|
||||
Compile-Time Format String Checks |
||||
--------------------------------- |
||||
|
||||
Compile-time checks are enabled when using ``FMT_STRING``. They support built-in |
||||
and string types as well as user-defined types with ``constexpr`` ``parse`` |
||||
functions in their ``formatter`` specializations. |
||||
Requires C++14 and is a no-op in C++11. |
||||
|
||||
.. doxygendefine:: FMT_STRING |
||||
|
||||
To force the use of compile-time checks, define the preprocessor variable |
||||
``FMT_ENFORCE_COMPILE_STRING``. When set, functions accepting ``FMT_STRING`` |
||||
will fail to compile with regular strings. Runtime-checked |
||||
formatting is still possible using ``fmt::vformat``, ``fmt::vprint``, etc. |
||||
|
||||
.. doxygenclass:: fmt::basic_format_string |
||||
:members: |
||||
|
||||
.. doxygentypedef:: fmt::format_string |
||||
|
||||
.. doxygenfunction:: fmt::runtime(const S&) |
||||
|
||||
Named Arguments |
||||
--------------- |
||||
|
||||
.. doxygenfunction:: fmt::arg(const S&, const T&) |
||||
|
||||
Named arguments are not supported in compile-time checks at the moment. |
||||
|
||||
Argument Lists |
||||
-------------- |
||||
|
||||
You can create your own formatting function with compile-time checks and small |
||||
binary footprint, for example (https://godbolt.org/z/oba4Mc): |
||||
|
||||
.. code:: c++ |
||||
|
||||
#include <fmt/format.h> |
||||
|
||||
void vlog(const char* file, int line, fmt::string_view format, |
||||
fmt::format_args args) { |
||||
fmt::print("{}: {}: ", file, line); |
||||
fmt::vprint(format, args); |
||||
} |
||||
|
||||
template <typename S, typename... Args> |
||||
void log(const char* file, int line, const S& format, Args&&... args) { |
||||
vlog(file, line, format, fmt::make_format_args(args...)); |
||||
} |
||||
|
||||
#define MY_LOG(format, ...) \ |
||||
log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__) |
||||
|
||||
MY_LOG("invalid squishiness: {}", 42); |
||||
|
||||
Note that ``vlog`` is not parameterized on argument types which improves compile |
||||
times and reduces binary code size compared to a fully parameterized version. |
||||
|
||||
.. doxygenfunction:: fmt::make_format_args(const Args&...) |
||||
|
||||
.. doxygenclass:: fmt::format_arg_store |
||||
:members: |
||||
|
||||
.. doxygenclass:: fmt::dynamic_format_arg_store |
||||
:members: |
||||
|
||||
.. doxygenclass:: fmt::basic_format_args |
||||
:members: |
||||
|
||||
.. doxygentypedef:: fmt::format_args |
||||
|
||||
.. doxygenclass:: fmt::basic_format_arg |
||||
:members: |
||||
|
||||
.. doxygenclass:: fmt::basic_format_parse_context |
||||
:members: |
||||
|
||||
.. doxygenclass:: fmt::basic_format_context |
||||
:members: |
||||
|
||||
.. doxygentypedef:: fmt::format_context |
||||
|
||||
Compatibility |
||||
------------- |
||||
|
||||
.. doxygenclass:: fmt::basic_string_view |
||||
:members: |
||||
|
||||
.. doxygentypedef:: fmt::string_view |
||||
|
||||
Locale |
||||
------ |
||||
|
||||
All formatting is locale-independent by default. Use the ``'L'`` format |
||||
specifier to insert the appropriate number separator characters from the |
||||
locale:: |
||||
|
||||
#include <fmt/core.h> |
||||
#include <locale> |
||||
|
||||
std::locale::global(std::locale("en_US.UTF-8")); |
||||
auto s = fmt::format("{:L}", 1000000); // s == "1,000,000" |
||||
|
||||
.. _format-api: |
||||
|
||||
Format API |
||||
========== |
||||
|
||||
``fmt/format.h`` defines the full format API providing additional formatting |
||||
functions and locale support. |
||||
|
||||
.. _udt: |
||||
|
||||
Formatting User-Defined Types |
||||
----------------------------- |
||||
|
||||
The {fmt} library provides formatters for many standard C++ types. |
||||
See :ref:`fmt/ranges.h <ranges-api>` for ranges and tuples including standard |
||||
containers such as ``std::vector``, :ref:`fmt/chrono.h <chrono-api>` for date |
||||
and time formatting and :ref:`fmt/std.h <std-api>` for path and variant |
||||
formatting. |
||||
|
||||
To make a user-defined type formattable, specialize the ``formatter<T>`` struct |
||||
template and implement ``parse`` and ``format`` methods:: |
||||
|
||||
#include <fmt/format.h> |
||||
|
||||
struct point { |
||||
double x, y; |
||||
}; |
||||
|
||||
template <> struct fmt::formatter<point> { |
||||
// Presentation format: 'f' - fixed, 'e' - exponential. |
||||
char presentation = 'f'; |
||||
|
||||
// Parses format specifications of the form ['f' | 'e']. |
||||
constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
||||
// [ctx.begin(), ctx.end()) is a character range that contains a part of |
||||
// the format string starting from the format specifications to be parsed, |
||||
// e.g. in |
||||
// |
||||
// fmt::format("{:f} - point of interest", point{1, 2}); |
||||
// |
||||
// the range will contain "f} - point of interest". The formatter should |
||||
// parse specifiers until '}' or the end of the range. In this example |
||||
// the formatter should parse the 'f' specifier and return an iterator |
||||
// pointing to '}'. |
||||
|
||||
// Please also note that this character range may be empty, in case of |
||||
// the "{}" format string, so therefore you should check ctx.begin() |
||||
// for equality with ctx.end(). |
||||
|
||||
// Parse the presentation format and store it in the formatter: |
||||
auto it = ctx.begin(), end = ctx.end(); |
||||
if (it != end && (*it == 'f' || *it == 'e')) presentation = *it++; |
||||
|
||||
// Check if reached the end of the range: |
||||
if (it != end && *it != '}') throw format_error("invalid format"); |
||||
|
||||
// Return an iterator past the end of the parsed range: |
||||
return it; |
||||
} |
||||
|
||||
// Formats the point p using the parsed format specification (presentation) |
||||
// stored in this formatter. |
||||
template <typename FormatContext> |
||||
auto format(const point& p, FormatContext& ctx) const -> decltype(ctx.out()) { |
||||
// ctx.out() is an output iterator to write to. |
||||
return presentation == 'f' |
||||
? fmt::format_to(ctx.out(), "({:.1f}, {:.1f})", p.x, p.y) |
||||
: fmt::format_to(ctx.out(), "({:.1e}, {:.1e})", p.x, p.y); |
||||
} |
||||
}; |
||||
|
||||
Then you can pass objects of type ``point`` to any formatting function:: |
||||
|
||||
point p = {1, 2}; |
||||
std::string s = fmt::format("{:f}", p); |
||||
// s == "(1.0, 2.0)" |
||||
|
||||
You can also reuse existing formatters via inheritance or composition, for |
||||
example:: |
||||
|
||||
enum class color {red, green, blue}; |
||||
|
||||
template <> struct fmt::formatter<color>: formatter<string_view> { |
||||
// parse is inherited from formatter<string_view>. |
||||
template <typename FormatContext> |
||||
auto format(color c, FormatContext& ctx) const { |
||||
string_view name = "unknown"; |
||||
switch (c) { |
||||
case color::red: name = "red"; break; |
||||
case color::green: name = "green"; break; |
||||
case color::blue: name = "blue"; break; |
||||
} |
||||
return formatter<string_view>::format(name, ctx); |
||||
} |
||||
}; |
||||
|
||||
Since ``parse`` is inherited from ``formatter<string_view>`` it will recognize |
||||
all string format specifications, for example |
||||
|
||||
.. code-block:: c++ |
||||
|
||||
fmt::format("{:>10}", color::blue) |
||||
|
||||
will return ``" blue"``. |
||||
|
||||
You can also write a formatter for a hierarchy of classes:: |
||||
|
||||
#include <type_traits> |
||||
#include <fmt/format.h> |
||||
|
||||
struct A { |
||||
virtual ~A() {} |
||||
virtual std::string name() const { return "A"; } |
||||
}; |
||||
|
||||
struct B : A { |
||||
virtual std::string name() const { return "B"; } |
||||
}; |
||||
|
||||
template <typename T> |
||||
struct fmt::formatter<T, std::enable_if_t<std::is_base_of<A, T>::value, char>> : |
||||
fmt::formatter<std::string> { |
||||
template <typename FormatCtx> |
||||
auto format(const A& a, FormatCtx& ctx) const { |
||||
return fmt::formatter<std::string>::format(a.name(), ctx); |
||||
} |
||||
}; |
||||
|
||||
int main() { |
||||
B b; |
||||
A& a = b; |
||||
fmt::print("{}", a); // prints "B" |
||||
} |
||||
|
||||
If a type provides both a ``formatter`` specialization and an implicit |
||||
conversion to a formattable type, the specialization takes precedence over the |
||||
conversion. |
||||
|
||||
For enums {fmt} also provides the ``format_as`` extension API. To format an enum |
||||
via this API define ``format_as`` that takes this enum and converts it to the |
||||
underlying type. ``format_as`` should be defined in the same namespace as the |
||||
enum. |
||||
|
||||
Example (https://godbolt.org/z/r7vvGE1v7):: |
||||
|
||||
#include <fmt/format.h> |
||||
|
||||
namespace kevin_namespacy { |
||||
enum class film { |
||||
house_of_cards, american_beauty, se7en = 7 |
||||
}; |
||||
auto format_as(film f) { return fmt::underlying(f); } |
||||
} |
||||
|
||||
int main() { |
||||
fmt::print("{}\n", kevin_namespacy::film::se7en); // prints "7" |
||||
} |
||||
|
||||
Literal-Based API |
||||
----------------- |
||||
|
||||
The following user-defined literals are defined in ``fmt/format.h``. |
||||
|
||||
.. doxygenfunction:: operator""_a() |
||||
|
||||
Utilities |
||||
--------- |
||||
|
||||
.. doxygenfunction:: fmt::ptr(T p) -> const void* |
||||
.. doxygenfunction:: fmt::ptr(const std::unique_ptr<T> &p) -> const void* |
||||
.. doxygenfunction:: fmt::ptr(const std::shared_ptr<T> &p) -> const void* |
||||
|
||||
.. doxygenfunction:: fmt::underlying(Enum e) -> typename std::underlying_type<Enum>::type |
||||
|
||||
.. doxygenfunction:: fmt::to_string(const T &value) -> std::string |
||||
|
||||
.. doxygenfunction:: fmt::join(Range &&range, string_view sep) -> join_view<detail::iterator_t<Range>, detail::sentinel_t<Range>> |
||||
|
||||
.. doxygenfunction:: fmt::join(It begin, Sentinel end, string_view sep) -> join_view<It, Sentinel> |
||||
|
||||
.. doxygenfunction:: fmt::group_digits(T value) -> group_digits_view<T> |
||||
|
||||
.. doxygenclass:: fmt::detail::buffer |
||||
:members: |
||||
|
||||
.. doxygenclass:: fmt::basic_memory_buffer |
||||
:protected-members: |
||||
:members: |
||||
|
||||
System Errors |
||||
------------- |
||||
|
||||
{fmt} does not use ``errno`` to communicate errors to the user, but it may call |
||||
system functions which set ``errno``. Users should not make any assumptions |
||||
about the value of ``errno`` being preserved by library functions. |
||||
|
||||
.. doxygenfunction:: fmt::system_error |
||||
|
||||
.. doxygenfunction:: fmt::format_system_error |
||||
|
||||
Custom Allocators |
||||
----------------- |
||||
|
||||
The {fmt} library supports custom dynamic memory allocators. |
||||
A custom allocator class can be specified as a template argument to |
||||
:class:`fmt::basic_memory_buffer`:: |
||||
|
||||
using custom_memory_buffer = |
||||
fmt::basic_memory_buffer<char, fmt::inline_buffer_size, custom_allocator>; |
||||
|
||||
It is also possible to write a formatting function that uses a custom |
||||
allocator:: |
||||
|
||||
using custom_string = |
||||
std::basic_string<char, std::char_traits<char>, custom_allocator>; |
||||
|
||||
custom_string vformat(custom_allocator alloc, fmt::string_view format_str, |
||||
fmt::format_args args) { |
||||
auto buf = custom_memory_buffer(alloc); |
||||
fmt::vformat_to(std::back_inserter(buf), format_str, args); |
||||
return custom_string(buf.data(), buf.size(), alloc); |
||||
} |
||||
|
||||
template <typename ...Args> |
||||
inline custom_string format(custom_allocator alloc, |
||||
fmt::string_view format_str, |
||||
const Args& ... args) { |
||||
return vformat(alloc, format_str, fmt::make_format_args(args...)); |
||||
} |
||||
|
||||
The allocator will be used for the output container only. Formatting functions |
||||
normally don't do any allocations for built-in and string types except for |
||||
non-default floating-point formatting that occasionally falls back on |
||||
``sprintf``. |
||||
|
||||
.. _ranges-api: |
||||
|
||||
Range and Tuple Formatting |
||||
========================== |
||||
|
||||
The library also supports convenient formatting of ranges and tuples:: |
||||
|
||||
#include <fmt/ranges.h> |
||||
|
||||
std::tuple<char, int, float> t{'a', 1, 2.0f}; |
||||
// Prints "('a', 1, 2.0)" |
||||
fmt::print("{}", t); |
||||
|
||||
|
||||
NOTE: currently, the overload of ``fmt::join`` for iterables exists in the main |
||||
``format.h`` header, but expect this to change in the future. |
||||
|
||||
Using ``fmt::join``, you can separate tuple elements with a custom separator:: |
||||
|
||||
#include <fmt/ranges.h> |
||||
|
||||
std::tuple<int, char> t = {1, 'a'}; |
||||
// Prints "1, a" |
||||
fmt::print("{}", fmt::join(t, ", ")); |
||||
|
||||
.. _chrono-api: |
||||
|
||||
Date and Time Formatting |
||||
======================== |
||||
|
||||
``fmt/chrono.h`` provides formatters for |
||||
|
||||
* `std::chrono::duration <https://en.cppreference.com/w/cpp/chrono/duration>`_ |
||||
* `std::chrono::time_point |
||||
<https://en.cppreference.com/w/cpp/chrono/time_point>`_ |
||||
* `std::tm <https://en.cppreference.com/w/cpp/chrono/c/tm>`_ |
||||
|
||||
The format syntax is described in :ref:`chrono-specs`. |
||||
|
||||
**Example**:: |
||||
|
||||
#include <fmt/chrono.h> |
||||
|
||||
int main() { |
||||
std::time_t t = std::time(nullptr); |
||||
|
||||
// Prints "The date is 2020-11-07." (with the current date): |
||||
fmt::print("The date is {:%Y-%m-%d}.", fmt::localtime(t)); |
||||
|
||||
using namespace std::literals::chrono_literals; |
||||
|
||||
// Prints "Default format: 42s 100ms": |
||||
fmt::print("Default format: {} {}\n", 42s, 100ms); |
||||
|
||||
// Prints "strftime-like format: 03:15:30": |
||||
fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s); |
||||
} |
||||
|
||||
.. doxygenfunction:: localtime(std::time_t time) |
||||
|
||||
.. doxygenfunction:: gmtime(std::time_t time) |
||||
|
||||
.. _std-api: |
||||
|
||||
Standard Library Types Formatting |
||||
================================= |
||||
|
||||
``fmt/std.h`` provides formatters for: |
||||
|
||||
* `std::filesystem::path <std::filesystem::path>`_ |
||||
* `std::thread::id <https://en.cppreference.com/w/cpp/thread/thread/id>`_ |
||||
* `std::monostate <https://en.cppreference.com/w/cpp/utility/variant/monostate>`_ |
||||
* `std::variant <https://en.cppreference.com/w/cpp/utility/variant/variant>`_ |
||||
|
||||
Formatting Variants |
||||
------------------- |
||||
|
||||
A ``std::variant`` is only formattable if every variant alternative is formattable, and requires the |
||||
``__cpp_lib_variant`` `library feature <https://en.cppreference.com/w/cpp/feature_test>`_. |
||||
|
||||
**Example**:: |
||||
|
||||
#include <fmt/std.h> |
||||
|
||||
std::variant<char, float> v0{'x'}; |
||||
// Prints "variant('x')" |
||||
fmt::print("{}", v0); |
||||
|
||||
std::variant<std::monostate, char> v1; |
||||
// Prints "variant(monostate)" |
||||
|
||||
.. _compile-api: |
||||
|
||||
Format String Compilation |
||||
========================= |
||||
|
||||
``fmt/compile.h`` provides format string compilation enabled via the |
||||
``FMT_COMPILE`` macro or the ``_cf`` user-defined literal. Format strings |
||||
marked with ``FMT_COMPILE`` or ``_cf`` are parsed, checked and converted into |
||||
efficient formatting code at compile-time. This supports arguments of built-in |
||||
and string types as well as user-defined types with ``constexpr`` ``parse`` |
||||
functions in their ``formatter`` specializations. Format string compilation can |
||||
generate more binary code compared to the default API and is only recommended in |
||||
places where formatting is a performance bottleneck. |
||||
|
||||
.. doxygendefine:: FMT_COMPILE |
||||
|
||||
.. doxygenfunction:: operator""_cf() |
||||
|
||||
.. _color-api: |
||||
|
||||
Terminal Color and Text Style |
||||
============================= |
||||
|
||||
``fmt/color.h`` provides support for terminal color and text style output. |
||||
|
||||
.. doxygenfunction:: print(const text_style &ts, const S &format_str, const Args&... args) |
||||
|
||||
.. doxygenfunction:: fg(detail::color_type) |
||||
|
||||
.. doxygenfunction:: bg(detail::color_type) |
||||
|
||||
.. doxygenfunction:: styled(const T& value, text_style ts) |
||||
|
||||
.. _os-api: |
||||
|
||||
System APIs |
||||
=========== |
||||
|
||||
.. doxygenclass:: fmt::ostream |
||||
:members: |
||||
|
||||
.. doxygenfunction:: fmt::windows_error |
||||
:members: |
||||
|
||||
.. _ostream-api: |
||||
|
||||
``std::ostream`` Support |
||||
======================== |
||||
|
||||
``fmt/ostream.h`` provides ``std::ostream`` support including formatting of |
||||
user-defined types that have an overloaded insertion operator (``operator<<``). |
||||
In order to make a type formattable via ``std::ostream`` you should provide a |
||||
``formatter`` specialization inherited from ``ostream_formatter``:: |
||||
|
||||
#include <fmt/ostream.h> |
||||
|
||||
struct date { |
||||
int year, month, day; |
||||
|
||||
friend std::ostream& operator<<(std::ostream& os, const date& d) { |
||||
return os << d.year << '-' << d.month << '-' << d.day; |
||||
} |
||||
}; |
||||
|
||||
template <> struct fmt::formatter<date> : ostream_formatter {}; |
||||
|
||||
std::string s = fmt::format("The date is {}", date{2012, 12, 9}); |
||||
// s == "The date is 2012-12-9" |
||||
|
||||
.. doxygenfunction:: streamed(const T &) |
||||
|
||||
.. doxygenfunction:: print(std::ostream &os, format_string<T...> fmt, T&&... args) |
||||
|
||||
.. _printf-api: |
||||
|
||||
``printf`` Formatting |
||||
===================== |
||||
|
||||
The header ``fmt/printf.h`` provides ``printf``-like formatting functionality. |
||||
The following functions use `printf format string syntax |
||||
<https://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html>`_ with |
||||
the POSIX extension for positional arguments. Unlike their standard |
||||
counterparts, the ``fmt`` functions are type-safe and throw an exception if an |
||||
argument type doesn't match its format specification. |
||||
|
||||
.. doxygenfunction:: printf(const S &format_str, const T&... args) |
||||
|
||||
.. doxygenfunction:: fprintf(std::FILE *f, const S &fmt, const T&... args) -> int |
||||
|
||||
.. doxygenfunction:: sprintf(const S&, const T&...) |
||||
|
||||
.. _xchar-api: |
||||
|
||||
``wchar_t`` Support |
||||
=================== |
||||
|
||||
The optional header ``fmt/xchar.h`` provides support for ``wchar_t`` and exotic |
||||
character types. |
||||
|
||||
.. doxygenstruct:: fmt::is_char |
||||
|
||||
.. doxygentypedef:: fmt::wstring_view |
||||
|
||||
.. doxygentypedef:: fmt::wformat_context |
||||
|
||||
.. doxygenfunction:: fmt::to_wstring(const T &value) |
||||
|
||||
Compatibility with C++20 ``std::format`` |
||||
======================================== |
||||
|
||||
{fmt} implements nearly all of the `C++20 formatting library |
||||
<https://en.cppreference.com/w/cpp/utility/format>`_ with the following |
||||
differences: |
||||
|
||||
* Names are defined in the ``fmt`` namespace instead of ``std`` to avoid |
||||
collisions with standard library implementations. |
||||
* Width calculation doesn't use grapheme clusterization. The latter has been |
||||
implemented in a separate branch but hasn't been integrated yet. |
||||
* Most C++20 chrono types are not supported yet. |
@ -1,2 +0,0 @@
@@ -1,2 +0,0 @@
|
||||
Sphinx basic theme with Bootstrap support. Modifications are kept to |
||||
a minimum to simplify integration in case of changes to Sphinx theming. |
@ -1,208 +0,0 @@
@@ -1,208 +0,0 @@
|
||||
{# |
||||
basic/layout.html |
||||
~~~~~~~~~~~~~~~~~ |
||||
|
||||
Master layout template for Sphinx themes. |
||||
|
||||
:copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. |
||||
:license: BSD, see LICENSE for details. |
||||
#} |
||||
{%- block doctype -%} |
||||
<!DOCTYPE html> |
||||
{%- endblock %} |
||||
{%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %} |
||||
{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %} |
||||
{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and |
||||
(sidebars != []) %} |
||||
{%- set url_root = pathto('', 1) %} |
||||
{# XXX necessary? #} |
||||
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %} |
||||
{%- if not embedded and docstitle %} |
||||
{%- set titlesuffix = " — "|safe + docstitle|e %} |
||||
{%- else %} |
||||
{%- set titlesuffix = "" %} |
||||
{%- endif %} |
||||
|
||||
{%- macro relbar() %} |
||||
<div class="related" role="navigation" aria-label="related navigation"> |
||||
<h3>{{ _('Navigation') }}</h3> |
||||
<ul> |
||||
{%- for rellink in rellinks %} |
||||
<li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}> |
||||
<a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}" |
||||
{{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a> |
||||
{%- if not loop.first %}{{ reldelim2 }}{% endif %}</li> |
||||
{%- endfor %} |
||||
{%- block rootrellink %} |
||||
<li class="nav-item nav-item-0"><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li> |
||||
{%- endblock %} |
||||
{%- for parent in parents %} |
||||
<li class="nav-item nav-item-{{ loop.index }}"><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li> |
||||
{%- endfor %} |
||||
{%- block relbaritems %} {% endblock %} |
||||
</ul> |
||||
</div> |
||||
{%- endmacro %} |
||||
|
||||
{%- macro sidebar() %} |
||||
{%- if render_sidebar %} |
||||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation"> |
||||
<div class="sphinxsidebarwrapper"> |
||||
{%- block sidebarlogo %} |
||||
{%- if logo %} |
||||
<p class="logo"><a href="{{ pathto(master_doc) }}"> |
||||
<img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/> |
||||
</a></p> |
||||
{%- endif %} |
||||
{%- endblock %} |
||||
{%- if sidebars != None %} |
||||
{#- new style sidebar: explicitly include/exclude templates #} |
||||
{%- for sidebartemplate in sidebars %} |
||||
{%- include sidebartemplate %} |
||||
{%- endfor %} |
||||
{%- else %} |
||||
{#- old style sidebars: using blocks -- should be deprecated #} |
||||
{%- block sidebartoc %} |
||||
{%- include "localtoc.html" %} |
||||
{%- endblock %} |
||||
{%- block sidebarrel %} |
||||
{%- include "relations.html" %} |
||||
{%- endblock %} |
||||
{%- block sidebarsourcelink %} |
||||
{%- include "sourcelink.html" %} |
||||
{%- endblock %} |
||||
{%- if customsidebar %} |
||||
{%- include customsidebar %} |
||||
{%- endif %} |
||||
{%- block sidebarsearch %} |
||||
{%- include "searchbox.html" %} |
||||
{%- endblock %} |
||||
{%- endif %} |
||||
</div> |
||||
</div> |
||||
{%- endif %} |
||||
{%- endmacro %} |
||||
|
||||
{%- macro script() %} |
||||
<script type="text/javascript"> |
||||
var DOCUMENTATION_OPTIONS = { |
||||
URL_ROOT: '{{ url_root }}', |
||||
VERSION: '{{ release|e }}', |
||||
COLLAPSE_INDEX: false, |
||||
FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}', |
||||
LINK_SUFFIX: '{{ link_suffix }}', |
||||
SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}', |
||||
HAS_SOURCE: {{ has_source|lower }}, |
||||
SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}' |
||||
}; |
||||
</script> |
||||
{%- for scriptfile in script_files %} |
||||
{{ js_tag(scriptfile) }} |
||||
{%- endfor %} |
||||
{%- endmacro %} |
||||
|
||||
{%- macro css() %} |
||||
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" /> |
||||
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" /> |
||||
{%- for cssfile in css_files %} |
||||
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" /> |
||||
{%- endfor %} |
||||
{%- endmacro %} |
||||
|
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="{{ encoding }}"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||
{# The above 3 meta tags *must* come first in the head; any other head content |
||||
must come *after* these tags. #} |
||||
{{ metatags }} |
||||
{%- block htmltitle %} |
||||
<title>{{ title|striptags|e }}{{ titlesuffix }}</title> |
||||
{%- endblock %} |
||||
{{ css() }} |
||||
{%- if not embedded %} |
||||
{{ script() }} |
||||
{%- if use_opensearch %} |
||||
<link rel="search" type="application/opensearchdescription+xml" |
||||
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}" |
||||
href="{{ pathto('_static/opensearch.xml', 1) }}"/> |
||||
{%- endif %} |
||||
{%- if favicon %} |
||||
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/> |
||||
{%- endif %} |
||||
{%- endif %} |
||||
{%- block linktags %} |
||||
{%- if hasdoc('about') %} |
||||
<link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" /> |
||||
{%- endif %} |
||||
{%- if hasdoc('genindex') %} |
||||
<link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" /> |
||||
{%- endif %} |
||||
{%- if hasdoc('search') %} |
||||
<link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" /> |
||||
{%- endif %} |
||||
{%- if hasdoc('copyright') %} |
||||
<link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" /> |
||||
{%- endif %} |
||||
{%- if parents %} |
||||
<link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" /> |
||||
{%- endif %} |
||||
{%- if next %} |
||||
<link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" /> |
||||
{%- endif %} |
||||
{%- if prev %} |
||||
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" /> |
||||
{%- endif %} |
||||
{%- endblock %} |
||||
{%- block extrahead %} {% endblock %} |
||||
</head> |
||||
<body role="document"> |
||||
{%- block header %}{% endblock %} |
||||
|
||||
{%- block relbar1 %}{{ relbar() }}{% endblock %} |
||||
|
||||
{%- block content %} |
||||
{%- block sidebar1 %} {# possible location for sidebar #} {% endblock %} |
||||
|
||||
<div class="document"> |
||||
{%- block document %} |
||||
<div class="documentwrapper"> |
||||
{%- if render_sidebar %} |
||||
<div class="bodywrapper"> |
||||
{%- endif %} |
||||
<div class="body" role="main"> |
||||
{% block body %} {% endblock %} |
||||
</div> |
||||
{%- if render_sidebar %} |
||||
</div> |
||||
{%- endif %} |
||||
</div> |
||||
{%- endblock %} |
||||
|
||||
{%- block sidebar2 %}{{ sidebar() }}{% endblock %} |
||||
<div class="clearer"></div> |
||||
</div> |
||||
{%- endblock %} |
||||
|
||||
{%- block relbar2 %}{{ relbar() }}{% endblock %} |
||||
|
||||
{%- block footer %} |
||||
<div class="footer" role="contentinfo"> |
||||
{%- if show_copyright %} |
||||
{%- if hasdoc('copyright') %} |
||||
{% trans path=pathto('copyright'), copyright=copyright|e %}© <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %} |
||||
{%- else %} |
||||
{% trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %} |
||||
{%- endif %} |
||||
{%- endif %} |
||||
{%- if last_updated %} |
||||
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %} |
||||
{%- endif %} |
||||
{%- if show_sphinx %} |
||||
{% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx-doc.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %} |
||||
{%- endif %} |
||||
</div> |
||||
{%- endblock %} |
||||
</body> |
||||
</html> |
@ -1,2 +0,0 @@
@@ -1,2 +0,0 @@
|
||||
[theme] |
||||
inherit = basic |
@ -1,73 +0,0 @@
@@ -1,73 +0,0 @@
|
||||
// |
||||
// Alerts |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Base styles |
||||
// ------------------------- |
||||
|
||||
.alert { |
||||
padding: @alert-padding; |
||||
margin-bottom: @line-height-computed; |
||||
border: 1px solid transparent; |
||||
border-radius: @alert-border-radius; |
||||
|
||||
// Headings for larger alerts |
||||
h4 { |
||||
margin-top: 0; |
||||
// Specified for the h4 to prevent conflicts of changing @headings-color |
||||
color: inherit; |
||||
} |
||||
|
||||
// Provide class for links that match alerts |
||||
.alert-link { |
||||
font-weight: @alert-link-font-weight; |
||||
} |
||||
|
||||
// Improve alignment and spacing of inner content |
||||
> p, |
||||
> ul { |
||||
margin-bottom: 0; |
||||
} |
||||
|
||||
> p + p { |
||||
margin-top: 5px; |
||||
} |
||||
} |
||||
|
||||
// Dismissible alerts |
||||
// |
||||
// Expand the right padding and account for the close button's positioning. |
||||
|
||||
.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. |
||||
.alert-dismissible { |
||||
padding-right: (@alert-padding + 20); |
||||
|
||||
// Adjust close link position |
||||
.close { |
||||
position: relative; |
||||
top: -2px; |
||||
right: -21px; |
||||
color: inherit; |
||||
} |
||||
} |
||||
|
||||
// Alternate styles |
||||
// |
||||
// Generate contextual modifier classes for colorizing the alert. |
||||
|
||||
.alert-success { |
||||
.alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); |
||||
} |
||||
|
||||
.alert-info { |
||||
.alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); |
||||
} |
||||
|
||||
.alert-warning { |
||||
.alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); |
||||
} |
||||
|
||||
.alert-danger { |
||||
.alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); |
||||
} |
@ -1,66 +0,0 @@
@@ -1,66 +0,0 @@
|
||||
// |
||||
// Badges |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Base class |
||||
.badge { |
||||
display: inline-block; |
||||
min-width: 10px; |
||||
padding: 3px 7px; |
||||
font-size: @font-size-small; |
||||
font-weight: @badge-font-weight; |
||||
color: @badge-color; |
||||
line-height: @badge-line-height; |
||||
vertical-align: baseline; |
||||
white-space: nowrap; |
||||
text-align: center; |
||||
background-color: @badge-bg; |
||||
border-radius: @badge-border-radius; |
||||
|
||||
// Empty badges collapse automatically (not available in IE8) |
||||
&:empty { |
||||
display: none; |
||||
} |
||||
|
||||
// Quick fix for badges in buttons |
||||
.btn & { |
||||
position: relative; |
||||
top: -1px; |
||||
} |
||||
|
||||
.btn-xs &, |
||||
.btn-group-xs > .btn & { |
||||
top: 0; |
||||
padding: 1px 5px; |
||||
} |
||||
|
||||
// Hover state, but only for links |
||||
a& { |
||||
&:hover, |
||||
&:focus { |
||||
color: @badge-link-hover-color; |
||||
text-decoration: none; |
||||
cursor: pointer; |
||||
} |
||||
} |
||||
|
||||
// Account for badges in navs |
||||
.list-group-item.active > &, |
||||
.nav-pills > .active > a > & { |
||||
color: @badge-active-color; |
||||
background-color: @badge-active-bg; |
||||
} |
||||
|
||||
.list-group-item > & { |
||||
float: right; |
||||
} |
||||
|
||||
.list-group-item > & + & { |
||||
margin-right: 5px; |
||||
} |
||||
|
||||
.nav-pills > li > a > & { |
||||
margin-left: 3px; |
||||
} |
||||
} |
@ -1,50 +0,0 @@
@@ -1,50 +0,0 @@
|
||||
// Core variables and mixins |
||||
@import "variables.less"; |
||||
@import "mixins.less"; |
||||
|
||||
// Reset and dependencies |
||||
@import "normalize.less"; |
||||
@import "print.less"; |
||||
@import "glyphicons.less"; |
||||
|
||||
// Core CSS |
||||
@import "scaffolding.less"; |
||||
@import "type.less"; |
||||
@import "code.less"; |
||||
@import "grid.less"; |
||||
@import "tables.less"; |
||||
@import "forms.less"; |
||||
@import "buttons.less"; |
||||
|
||||
// Components |
||||
@import "component-animations.less"; |
||||
@import "dropdowns.less"; |
||||
@import "button-groups.less"; |
||||
@import "input-groups.less"; |
||||
@import "navs.less"; |
||||
@import "navbar.less"; |
||||
@import "breadcrumbs.less"; |
||||
@import "pagination.less"; |
||||
@import "pager.less"; |
||||
@import "labels.less"; |
||||
@import "badges.less"; |
||||
@import "jumbotron.less"; |
||||
@import "thumbnails.less"; |
||||
@import "alerts.less"; |
||||
@import "progress-bars.less"; |
||||
@import "media.less"; |
||||
@import "list-group.less"; |
||||
@import "panels.less"; |
||||
@import "responsive-embed.less"; |
||||
@import "wells.less"; |
||||
@import "close.less"; |
||||
|
||||
// Components w/ JavaScript |
||||
@import "modals.less"; |
||||
@import "tooltip.less"; |
||||
@import "popovers.less"; |
||||
@import "carousel.less"; |
||||
|
||||
// Utility classes |
||||
@import "utilities.less"; |
||||
@import "responsive-utilities.less"; |
@ -1,26 +0,0 @@
@@ -1,26 +0,0 @@
|
||||
// |
||||
// Breadcrumbs |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
.breadcrumb { |
||||
padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; |
||||
margin-bottom: @line-height-computed; |
||||
list-style: none; |
||||
background-color: @breadcrumb-bg; |
||||
border-radius: @border-radius-base; |
||||
|
||||
> li { |
||||
display: inline-block; |
||||
|
||||
+ li:before { |
||||
content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space |
||||
padding: 0 5px; |
||||
color: @breadcrumb-color; |
||||
} |
||||
} |
||||
|
||||
> .active { |
||||
color: @breadcrumb-active-color; |
||||
} |
||||
} |
@ -1,243 +0,0 @@
@@ -1,243 +0,0 @@
|
||||
// |
||||
// Button groups |
||||
// -------------------------------------------------- |
||||
|
||||
// Make the div behave like a button |
||||
.btn-group, |
||||
.btn-group-vertical { |
||||
position: relative; |
||||
display: inline-block; |
||||
vertical-align: middle; // match .btn alignment given font-size hack above |
||||
> .btn { |
||||
position: relative; |
||||
float: left; |
||||
// Bring the "active" button to the front |
||||
&:hover, |
||||
&:focus, |
||||
&:active, |
||||
&.active { |
||||
z-index: 2; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Prevent double borders when buttons are next to each other |
||||
.btn-group { |
||||
.btn + .btn, |
||||
.btn + .btn-group, |
||||
.btn-group + .btn, |
||||
.btn-group + .btn-group { |
||||
margin-left: -1px; |
||||
} |
||||
} |
||||
|
||||
// Optional: Group multiple button groups together for a toolbar |
||||
.btn-toolbar { |
||||
margin-left: -5px; // Offset the first child's margin |
||||
&:extend(.clearfix all); |
||||
|
||||
.btn-group, |
||||
.input-group { |
||||
float: left; |
||||
} |
||||
> .btn, |
||||
> .btn-group, |
||||
> .input-group { |
||||
margin-left: 5px; |
||||
} |
||||
} |
||||
|
||||
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { |
||||
border-radius: 0; |
||||
} |
||||
|
||||
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match |
||||
.btn-group > .btn:first-child { |
||||
margin-left: 0; |
||||
&:not(:last-child):not(.dropdown-toggle) { |
||||
.border-right-radius(0); |
||||
} |
||||
} |
||||
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it |
||||
.btn-group > .btn:last-child:not(:first-child), |
||||
.btn-group > .dropdown-toggle:not(:first-child) { |
||||
.border-left-radius(0); |
||||
} |
||||
|
||||
// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) |
||||
.btn-group > .btn-group { |
||||
float: left; |
||||
} |
||||
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { |
||||
border-radius: 0; |
||||
} |
||||
.btn-group > .btn-group:first-child:not(:last-child) { |
||||
> .btn:last-child, |
||||
> .dropdown-toggle { |
||||
.border-right-radius(0); |
||||
} |
||||
} |
||||
.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { |
||||
.border-left-radius(0); |
||||
} |
||||
|
||||
// On active and open, don't show outline |
||||
.btn-group .dropdown-toggle:active, |
||||
.btn-group.open .dropdown-toggle { |
||||
outline: 0; |
||||
} |
||||
|
||||
|
||||
// Sizing |
||||
// |
||||
// Remix the default button sizing classes into new ones for easier manipulation. |
||||
|
||||
.btn-group-xs > .btn { &:extend(.btn-xs); } |
||||
.btn-group-sm > .btn { &:extend(.btn-sm); } |
||||
.btn-group-lg > .btn { &:extend(.btn-lg); } |
||||
|
||||
|
||||
// Split button dropdowns |
||||
// ---------------------- |
||||
|
||||
// Give the line between buttons some depth |
||||
.btn-group > .btn + .dropdown-toggle { |
||||
padding-left: 8px; |
||||
padding-right: 8px; |
||||
} |
||||
.btn-group > .btn-lg + .dropdown-toggle { |
||||
padding-left: 12px; |
||||
padding-right: 12px; |
||||
} |
||||
|
||||
// The clickable button for toggling the menu |
||||
// Remove the gradient and set the same inset shadow as the :active state |
||||
.btn-group.open .dropdown-toggle { |
||||
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); |
||||
|
||||
// Show no shadow for `.btn-link` since it has no other button styles. |
||||
&.btn-link { |
||||
.box-shadow(none); |
||||
} |
||||
} |
||||
|
||||
|
||||
// Reposition the caret |
||||
.btn .caret { |
||||
margin-left: 0; |
||||
} |
||||
// Carets in other button sizes |
||||
.btn-lg .caret { |
||||
border-width: @caret-width-large @caret-width-large 0; |
||||
border-bottom-width: 0; |
||||
} |
||||
// Upside down carets for .dropup |
||||
.dropup .btn-lg .caret { |
||||
border-width: 0 @caret-width-large @caret-width-large; |
||||
} |
||||
|
||||
|
||||
// Vertical button groups |
||||
// ---------------------- |
||||
|
||||
.btn-group-vertical { |
||||
> .btn, |
||||
> .btn-group, |
||||
> .btn-group > .btn { |
||||
display: block; |
||||
float: none; |
||||
width: 100%; |
||||
max-width: 100%; |
||||
} |
||||
|
||||
// Clear floats so dropdown menus can be properly placed |
||||
> .btn-group { |
||||
&:extend(.clearfix all); |
||||
> .btn { |
||||
float: none; |
||||
} |
||||
} |
||||
|
||||
> .btn + .btn, |
||||
> .btn + .btn-group, |
||||
> .btn-group + .btn, |
||||
> .btn-group + .btn-group { |
||||
margin-top: -1px; |
||||
margin-left: 0; |
||||
} |
||||
} |
||||
|
||||
.btn-group-vertical > .btn { |
||||
&:not(:first-child):not(:last-child) { |
||||
border-radius: 0; |
||||
} |
||||
&:first-child:not(:last-child) { |
||||
border-top-right-radius: @border-radius-base; |
||||
.border-bottom-radius(0); |
||||
} |
||||
&:last-child:not(:first-child) { |
||||
border-bottom-left-radius: @border-radius-base; |
||||
.border-top-radius(0); |
||||
} |
||||
} |
||||
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { |
||||
border-radius: 0; |
||||
} |
||||
.btn-group-vertical > .btn-group:first-child:not(:last-child) { |
||||
> .btn:last-child, |
||||
> .dropdown-toggle { |
||||
.border-bottom-radius(0); |
||||
} |
||||
} |
||||
.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { |
||||
.border-top-radius(0); |
||||
} |
||||
|
||||
|
||||
// Justified button groups |
||||
// ---------------------- |
||||
|
||||
.btn-group-justified { |
||||
display: table; |
||||
width: 100%; |
||||
table-layout: fixed; |
||||
border-collapse: separate; |
||||
> .btn, |
||||
> .btn-group { |
||||
float: none; |
||||
display: table-cell; |
||||
width: 1%; |
||||
} |
||||
> .btn-group .btn { |
||||
width: 100%; |
||||
} |
||||
|
||||
> .btn-group .dropdown-menu { |
||||
left: auto; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Checkbox and radio options |
||||
// |
||||
// In order to support the browser's form validation feedback, powered by the |
||||
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use |
||||
// `display: none;` or `visibility: hidden;` as that also hides the popover. |
||||
// Simply visually hiding the inputs via `opacity` would leave them clickable in |
||||
// certain cases which is prevented by using `clip` and `pointer-events`. |
||||
// This way, we ensure a DOM element is visible to position the popover from. |
||||
// |
||||
// See https://github.com/twbs/bootstrap/pull/12794 and |
||||
// https://github.com/twbs/bootstrap/pull/14559 for more information. |
||||
|
||||
[data-toggle="buttons"] { |
||||
> .btn, |
||||
> .btn-group > .btn { |
||||
input[type="radio"], |
||||
input[type="checkbox"] { |
||||
position: absolute; |
||||
clip: rect(0,0,0,0); |
||||
pointer-events: none; |
||||
} |
||||
} |
||||
} |
@ -1,160 +0,0 @@
@@ -1,160 +0,0 @@
|
||||
// |
||||
// Buttons |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Base styles |
||||
// -------------------------------------------------- |
||||
|
||||
.btn { |
||||
display: inline-block; |
||||
margin-bottom: 0; // For input.btn |
||||
font-weight: @btn-font-weight; |
||||
text-align: center; |
||||
vertical-align: middle; |
||||
touch-action: manipulation; |
||||
cursor: pointer; |
||||
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 |
||||
border: 1px solid transparent; |
||||
white-space: nowrap; |
||||
.button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base); |
||||
.user-select(none); |
||||
|
||||
&, |
||||
&:active, |
||||
&.active { |
||||
&:focus, |
||||
&.focus { |
||||
.tab-focus(); |
||||
} |
||||
} |
||||
|
||||
&:hover, |
||||
&:focus, |
||||
&.focus { |
||||
color: @btn-default-color; |
||||
text-decoration: none; |
||||
} |
||||
|
||||
&:active, |
||||
&.active { |
||||
outline: 0; |
||||
background-image: none; |
||||
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); |
||||
} |
||||
|
||||
&.disabled, |
||||
&[disabled], |
||||
fieldset[disabled] & { |
||||
cursor: @cursor-disabled; |
||||
pointer-events: none; // Future-proof disabling of clicks |
||||
.opacity(.65); |
||||
.box-shadow(none); |
||||
} |
||||
} |
||||
|
||||
|
||||
// Alternate buttons |
||||
// -------------------------------------------------- |
||||
|
||||
.btn-default { |
||||
.button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); |
||||
} |
||||
.btn-primary { |
||||
.button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); |
||||
} |
||||
// Success appears as green |
||||
.btn-success { |
||||
.button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); |
||||
} |
||||
// Info appears as blue-green |
||||
.btn-info { |
||||
.button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); |
||||
} |
||||
// Warning appears as orange |
||||
.btn-warning { |
||||
.button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); |
||||
} |
||||
// Danger and error appear as red |
||||
.btn-danger { |
||||
.button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); |
||||
} |
||||
|
||||
|
||||
// Link buttons |
||||
// ------------------------- |
||||
|
||||
// Make a button look and behave like a link |
||||
.btn-link { |
||||
color: @link-color; |
||||
font-weight: normal; |
||||
border-radius: 0; |
||||
|
||||
&, |
||||
&:active, |
||||
&.active, |
||||
&[disabled], |
||||
fieldset[disabled] & { |
||||
background-color: transparent; |
||||
.box-shadow(none); |
||||
} |
||||
&, |
||||
&:hover, |
||||
&:focus, |
||||
&:active { |
||||
border-color: transparent; |
||||
} |
||||
&:hover, |
||||
&:focus { |
||||
color: @link-hover-color; |
||||
text-decoration: @link-hover-decoration; |
||||
background-color: transparent; |
||||
} |
||||
&[disabled], |
||||
fieldset[disabled] & { |
||||
&:hover, |
||||
&:focus { |
||||
color: @btn-link-disabled-color; |
||||
text-decoration: none; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Button Sizes |
||||
// -------------------------------------------------- |
||||
|
||||
.btn-lg { |
||||
// line-height: ensure even-numbered height of button next to large input |
||||
.button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); |
||||
} |
||||
.btn-sm { |
||||
// line-height: ensure proper height of button next to small input |
||||
.button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); |
||||
} |
||||
.btn-xs { |
||||
.button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small); |
||||
} |
||||
|
||||
|
||||
// Block button |
||||
// -------------------------------------------------- |
||||
|
||||
.btn-block { |
||||
display: block; |
||||
width: 100%; |
||||
} |
||||
|
||||
// Vertically space out multiple block buttons |
||||
.btn-block + .btn-block { |
||||
margin-top: 5px; |
||||
} |
||||
|
||||
// Specificity overrides |
||||
input[type="submit"], |
||||
input[type="reset"], |
||||
input[type="button"] { |
||||
&.btn-block { |
||||
width: 100%; |
||||
} |
||||
} |
@ -1,269 +0,0 @@
@@ -1,269 +0,0 @@
|
||||
// |
||||
// Carousel |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Wrapper for the slide container and indicators |
||||
.carousel { |
||||
position: relative; |
||||
} |
||||
|
||||
.carousel-inner { |
||||
position: relative; |
||||
overflow: hidden; |
||||
width: 100%; |
||||
|
||||
> .item { |
||||
display: none; |
||||
position: relative; |
||||
.transition(.6s ease-in-out left); |
||||
|
||||
// Account for jankitude on images |
||||
> img, |
||||
> a > img { |
||||
&:extend(.img-responsive); |
||||
line-height: 1; |
||||
} |
||||
|
||||
// WebKit CSS3 transforms for supported devices |
||||
@media all and (transform-3d), (-webkit-transform-3d) { |
||||
.transition-transform(~'0.6s ease-in-out'); |
||||
.backface-visibility(~'hidden'); |
||||
.perspective(1000); |
||||
|
||||
&.next, |
||||
&.active.right { |
||||
.translate3d(100%, 0, 0); |
||||
left: 0; |
||||
} |
||||
&.prev, |
||||
&.active.left { |
||||
.translate3d(-100%, 0, 0); |
||||
left: 0; |
||||
} |
||||
&.next.left, |
||||
&.prev.right, |
||||
&.active { |
||||
.translate3d(0, 0, 0); |
||||
left: 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
> .active, |
||||
> .next, |
||||
> .prev { |
||||
display: block; |
||||
} |
||||
|
||||
> .active { |
||||
left: 0; |
||||
} |
||||
|
||||
> .next, |
||||
> .prev { |
||||
position: absolute; |
||||
top: 0; |
||||
width: 100%; |
||||
} |
||||
|
||||
> .next { |
||||
left: 100%; |
||||
} |
||||
> .prev { |
||||
left: -100%; |
||||
} |
||||
> .next.left, |
||||
> .prev.right { |
||||
left: 0; |
||||
} |
||||
|
||||
> .active.left { |
||||
left: -100%; |
||||
} |
||||
> .active.right { |
||||
left: 100%; |
||||
} |
||||
|
||||
} |
||||
|
||||
// Left/right controls for nav |
||||
// --------------------------- |
||||
|
||||
.carousel-control { |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
bottom: 0; |
||||
width: @carousel-control-width; |
||||
.opacity(@carousel-control-opacity); |
||||
font-size: @carousel-control-font-size; |
||||
color: @carousel-control-color; |
||||
text-align: center; |
||||
text-shadow: @carousel-text-shadow; |
||||
// We can't have this transition here because WebKit cancels the carousel |
||||
// animation if you trip this while in the middle of another animation. |
||||
|
||||
// Set gradients for backgrounds |
||||
&.left { |
||||
#gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); |
||||
} |
||||
&.right { |
||||
left: auto; |
||||
right: 0; |
||||
#gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5)); |
||||
} |
||||
|
||||
// Hover/focus state |
||||
&:hover, |
||||
&:focus { |
||||
outline: 0; |
||||
color: @carousel-control-color; |
||||
text-decoration: none; |
||||
.opacity(.9); |
||||
} |
||||
|
||||
// Toggles |
||||
.icon-prev, |
||||
.icon-next, |
||||
.glyphicon-chevron-left, |
||||
.glyphicon-chevron-right { |
||||
position: absolute; |
||||
top: 50%; |
||||
z-index: 5; |
||||
display: inline-block; |
||||
} |
||||
.icon-prev, |
||||
.glyphicon-chevron-left { |
||||
left: 50%; |
||||
margin-left: -10px; |
||||
} |
||||
.icon-next, |
||||
.glyphicon-chevron-right { |
||||
right: 50%; |
||||
margin-right: -10px; |
||||
} |
||||
.icon-prev, |
||||
.icon-next { |
||||
width: 20px; |
||||
height: 20px; |
||||
margin-top: -10px; |
||||
line-height: 1; |
||||
font-family: serif; |
||||
} |
||||
|
||||
|
||||
.icon-prev { |
||||
&:before { |
||||
content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) |
||||
} |
||||
} |
||||
.icon-next { |
||||
&:before { |
||||
content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Optional indicator pips |
||||
// |
||||
// Add an unordered list with the following class and add a list item for each |
||||
// slide your carousel holds. |
||||
|
||||
.carousel-indicators { |
||||
position: absolute; |
||||
bottom: 10px; |
||||
left: 50%; |
||||
z-index: 15; |
||||
width: 60%; |
||||
margin-left: -30%; |
||||
padding-left: 0; |
||||
list-style: none; |
||||
text-align: center; |
||||
|
||||
li { |
||||
display: inline-block; |
||||
width: 10px; |
||||
height: 10px; |
||||
margin: 1px; |
||||
text-indent: -999px; |
||||
border: 1px solid @carousel-indicator-border-color; |
||||
border-radius: 10px; |
||||
cursor: pointer; |
||||
|
||||
// IE8-9 hack for event handling |
||||
// |
||||
// Internet Explorer 8-9 does not support clicks on elements without a set |
||||
// `background-color`. We cannot use `filter` since that's not viewed as a |
||||
// background color by the browser. Thus, a hack is needed. |
||||
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer |
||||
// |
||||
// For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we |
||||
// set alpha transparency for the best results possible. |
||||
background-color: #000 \9; // IE8 |
||||
background-color: rgba(0,0,0,0); // IE9 |
||||
} |
||||
.active { |
||||
margin: 0; |
||||
width: 12px; |
||||
height: 12px; |
||||
background-color: @carousel-indicator-active-bg; |
||||
} |
||||
} |
||||
|
||||
// Optional captions |
||||
// ----------------------------- |
||||
// Hidden by default for smaller viewports |
||||
.carousel-caption { |
||||
position: absolute; |
||||
left: 15%; |
||||
right: 15%; |
||||
bottom: 20px; |
||||
z-index: 10; |
||||
padding-top: 20px; |
||||
padding-bottom: 20px; |
||||
color: @carousel-caption-color; |
||||
text-align: center; |
||||
text-shadow: @carousel-text-shadow; |
||||
& .btn { |
||||
text-shadow: none; // No shadow for button elements in carousel-caption |
||||
} |
||||
} |
||||
|
||||
|
||||
// Scale up controls for tablets and up |
||||
@media screen and (min-width: @screen-sm-min) { |
||||
|
||||
// Scale up the controls a smidge |
||||
.carousel-control { |
||||
.glyphicon-chevron-left, |
||||
.glyphicon-chevron-right, |
||||
.icon-prev, |
||||
.icon-next { |
||||
width: 30px; |
||||
height: 30px; |
||||
margin-top: -15px; |
||||
font-size: 30px; |
||||
} |
||||
.glyphicon-chevron-left, |
||||
.icon-prev { |
||||
margin-left: -15px; |
||||
} |
||||
.glyphicon-chevron-right, |
||||
.icon-next { |
||||
margin-right: -15px; |
||||
} |
||||
} |
||||
|
||||
// Show and left align the captions |
||||
.carousel-caption { |
||||
left: 20%; |
||||
right: 20%; |
||||
padding-bottom: 30px; |
||||
} |
||||
|
||||
// Move up the indicators |
||||
.carousel-indicators { |
||||
bottom: 20px; |
||||
} |
||||
} |
@ -1,34 +0,0 @@
@@ -1,34 +0,0 @@
|
||||
// |
||||
// Close icons |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
.close { |
||||
float: right; |
||||
font-size: (@font-size-base * 1.5); |
||||
font-weight: @close-font-weight; |
||||
line-height: 1; |
||||
color: @close-color; |
||||
text-shadow: @close-text-shadow; |
||||
.opacity(.2); |
||||
|
||||
&:hover, |
||||
&:focus { |
||||
color: @close-color; |
||||
text-decoration: none; |
||||
cursor: pointer; |
||||
.opacity(.5); |
||||
} |
||||
|
||||
// Additional properties for button version |
||||
// iOS requires the button element instead of an anchor tag. |
||||
// If you want the anchor version, it requires `href="#"`. |
||||
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile |
||||
button& { |
||||
padding: 0; |
||||
cursor: pointer; |
||||
background: transparent; |
||||
border: 0; |
||||
-webkit-appearance: none; |
||||
} |
||||
} |
@ -1,69 +0,0 @@
@@ -1,69 +0,0 @@
|
||||
// |
||||
// Code (inline and block) |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Inline and block code styles |
||||
code, |
||||
kbd, |
||||
pre, |
||||
samp { |
||||
font-family: @font-family-monospace; |
||||
} |
||||
|
||||
// Inline code |
||||
code { |
||||
padding: 2px 4px; |
||||
font-size: 90%; |
||||
color: @code-color; |
||||
background-color: @code-bg; |
||||
border-radius: @border-radius-base; |
||||
} |
||||
|
||||
// User input typically entered via keyboard |
||||
kbd { |
||||
padding: 2px 4px; |
||||
font-size: 90%; |
||||
color: @kbd-color; |
||||
background-color: @kbd-bg; |
||||
border-radius: @border-radius-small; |
||||
box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); |
||||
|
||||
kbd { |
||||
padding: 0; |
||||
font-size: 100%; |
||||
font-weight: bold; |
||||
box-shadow: none; |
||||
} |
||||
} |
||||
|
||||
// Blocks of code |
||||
pre { |
||||
display: block; |
||||
padding: ((@line-height-computed - 1) / 2); |
||||
margin: 0 0 (@line-height-computed / 2); |
||||
font-size: (@font-size-base - 1); // 14px to 13px |
||||
line-height: @line-height-base; |
||||
word-break: break-all; |
||||
word-wrap: break-word; |
||||
color: @pre-color; |
||||
background-color: @pre-bg; |
||||
border: 1px solid @pre-border-color; |
||||
border-radius: @border-radius-base; |
||||
|
||||
// Account for some code outputs that place code tags in pre tags |
||||
code { |
||||
padding: 0; |
||||
font-size: inherit; |
||||
color: inherit; |
||||
white-space: pre-wrap; |
||||
background-color: transparent; |
||||
border-radius: 0; |
||||
} |
||||
} |
||||
|
||||
// Enable scrollable blocks of code |
||||
.pre-scrollable { |
||||
max-height: @pre-scrollable-max-height; |
||||
overflow-y: scroll; |
||||
} |
@ -1,33 +0,0 @@
@@ -1,33 +0,0 @@
|
||||
// |
||||
// Component animations |
||||
// -------------------------------------------------- |
||||
|
||||
// Heads up! |
||||
// |
||||
// We don't use the `.opacity()` mixin here since it causes a bug with text |
||||
// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. |
||||
|
||||
.fade { |
||||
opacity: 0; |
||||
.transition(opacity .15s linear); |
||||
&.in { |
||||
opacity: 1; |
||||
} |
||||
} |
||||
|
||||
.collapse { |
||||
display: none; |
||||
|
||||
&.in { display: block; } |
||||
tr&.in { display: table-row; } |
||||
tbody&.in { display: table-row-group; } |
||||
} |
||||
|
||||
.collapsing { |
||||
position: relative; |
||||
height: 0; |
||||
overflow: hidden; |
||||
.transition-property(~"height, visibility"); |
||||
.transition-duration(.35s); |
||||
.transition-timing-function(ease); |
||||
} |
@ -1,214 +0,0 @@
@@ -1,214 +0,0 @@
|
||||
// |
||||
// Dropdown menus |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Dropdown arrow/caret |
||||
.caret { |
||||
display: inline-block; |
||||
width: 0; |
||||
height: 0; |
||||
margin-left: 2px; |
||||
vertical-align: middle; |
||||
border-top: @caret-width-base dashed; |
||||
border-right: @caret-width-base solid transparent; |
||||
border-left: @caret-width-base solid transparent; |
||||
} |
||||
|
||||
// The dropdown wrapper (div) |
||||
.dropup, |
||||
.dropdown { |
||||
position: relative; |
||||
} |
||||
|
||||
// Prevent the focus on the dropdown toggle when closing dropdowns |
||||
.dropdown-toggle:focus { |
||||
outline: 0; |
||||
} |
||||
|
||||
// The dropdown menu (ul) |
||||
.dropdown-menu { |
||||
position: absolute; |
||||
top: 100%; |
||||
left: 0; |
||||
z-index: @zindex-dropdown; |
||||
display: none; // none by default, but block on "open" of the menu |
||||
float: left; |
||||
min-width: 160px; |
||||
padding: 5px 0; |
||||
margin: 2px 0 0; // override default ul |
||||
list-style: none; |
||||
font-size: @font-size-base; |
||||
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) |
||||
background-color: @dropdown-bg; |
||||
border: 1px solid @dropdown-fallback-border; // IE8 fallback |
||||
border: 1px solid @dropdown-border; |
||||
border-radius: @border-radius-base; |
||||
.box-shadow(0 6px 12px rgba(0,0,0,.175)); |
||||
background-clip: padding-box; |
||||
|
||||
// Aligns the dropdown menu to right |
||||
// |
||||
// Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` |
||||
&.pull-right { |
||||
right: 0; |
||||
left: auto; |
||||
} |
||||
|
||||
// Dividers (basically an hr) within the dropdown |
||||
.divider { |
||||
.nav-divider(@dropdown-divider-bg); |
||||
} |
||||
|
||||
// Links within the dropdown menu |
||||
> li > a { |
||||
display: block; |
||||
padding: 3px 20px; |
||||
clear: both; |
||||
font-weight: normal; |
||||
line-height: @line-height-base; |
||||
color: @dropdown-link-color; |
||||
white-space: nowrap; // prevent links from randomly breaking onto new lines |
||||
} |
||||
} |
||||
|
||||
// Hover/Focus state |
||||
.dropdown-menu > li > a { |
||||
&:hover, |
||||
&:focus { |
||||
text-decoration: none; |
||||
color: @dropdown-link-hover-color; |
||||
background-color: @dropdown-link-hover-bg; |
||||
} |
||||
} |
||||
|
||||
// Active state |
||||
.dropdown-menu > .active > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @dropdown-link-active-color; |
||||
text-decoration: none; |
||||
outline: 0; |
||||
background-color: @dropdown-link-active-bg; |
||||
} |
||||
} |
||||
|
||||
// Disabled state |
||||
// |
||||
// Gray out text and ensure the hover/focus state remains gray |
||||
|
||||
.dropdown-menu > .disabled > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @dropdown-link-disabled-color; |
||||
} |
||||
|
||||
// Nuke hover/focus effects |
||||
&:hover, |
||||
&:focus { |
||||
text-decoration: none; |
||||
background-color: transparent; |
||||
background-image: none; // Remove CSS gradient |
||||
.reset-filter(); |
||||
cursor: @cursor-disabled; |
||||
} |
||||
} |
||||
|
||||
// Open state for the dropdown |
||||
.open { |
||||
// Show the menu |
||||
> .dropdown-menu { |
||||
display: block; |
||||
} |
||||
|
||||
// Remove the outline when :focus is triggered |
||||
> a { |
||||
outline: 0; |
||||
} |
||||
} |
||||
|
||||
// Menu positioning |
||||
// |
||||
// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown |
||||
// menu with the parent. |
||||
.dropdown-menu-right { |
||||
left: auto; // Reset the default from `.dropdown-menu` |
||||
right: 0; |
||||
} |
||||
// With v3, we enabled auto-flipping if you have a dropdown within a right |
||||
// aligned nav component. To enable the undoing of that, we provide an override |
||||
// to restore the default dropdown menu alignment. |
||||
// |
||||
// This is only for left-aligning a dropdown menu within a `.navbar-right` or |
||||
// `.pull-right` nav component. |
||||
.dropdown-menu-left { |
||||
left: 0; |
||||
right: auto; |
||||
} |
||||
|
||||
// Dropdown section headers |
||||
.dropdown-header { |
||||
display: block; |
||||
padding: 3px 20px; |
||||
font-size: @font-size-small; |
||||
line-height: @line-height-base; |
||||
color: @dropdown-header-color; |
||||
white-space: nowrap; // as with > li > a |
||||
} |
||||
|
||||
// Backdrop to catch body clicks on mobile, etc. |
||||
.dropdown-backdrop { |
||||
position: fixed; |
||||
left: 0; |
||||
right: 0; |
||||
bottom: 0; |
||||
top: 0; |
||||
z-index: (@zindex-dropdown - 10); |
||||
} |
||||
|
||||
// Right aligned dropdowns |
||||
.pull-right > .dropdown-menu { |
||||
right: 0; |
||||
left: auto; |
||||
} |
||||
|
||||
// Allow for dropdowns to go bottom up (aka, dropup-menu) |
||||
// |
||||
// Just add .dropup after the standard .dropdown class and you're set, bro. |
||||
// TODO: abstract this so that the navbar fixed styles are not placed here? |
||||
|
||||
.dropup, |
||||
.navbar-fixed-bottom .dropdown { |
||||
// Reverse the caret |
||||
.caret { |
||||
border-top: 0; |
||||
border-bottom: @caret-width-base solid; |
||||
content: ""; |
||||
} |
||||
// Different positioning for bottom up menu |
||||
.dropdown-menu { |
||||
top: auto; |
||||
bottom: 100%; |
||||
margin-bottom: 2px; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Component alignment |
||||
// |
||||
// Reiterate per navbar.less and the modified component alignment there. |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
.navbar-right { |
||||
.dropdown-menu { |
||||
.dropdown-menu-right(); |
||||
} |
||||
// Necessary for overrides of the default right aligned menu. |
||||
// Will remove come v4 in all likelihood. |
||||
.dropdown-menu-left { |
||||
.dropdown-menu-left(); |
||||
} |
||||
} |
||||
} |
@ -1,574 +0,0 @@
@@ -1,574 +0,0 @@
|
||||
// |
||||
// Forms |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Normalize non-controls |
||||
// |
||||
// Restyle and baseline non-control form elements. |
||||
|
||||
fieldset { |
||||
padding: 0; |
||||
margin: 0; |
||||
border: 0; |
||||
// Chrome and Firefox set a `min-width: min-content;` on fieldsets, |
||||
// so we reset that to ensure it behaves more like a standard block element. |
||||
// See https://github.com/twbs/bootstrap/issues/12359. |
||||
min-width: 0; |
||||
} |
||||
|
||||
legend { |
||||
display: block; |
||||
width: 100%; |
||||
padding: 0; |
||||
margin-bottom: @line-height-computed; |
||||
font-size: (@font-size-base * 1.5); |
||||
line-height: inherit; |
||||
color: @legend-color; |
||||
border: 0; |
||||
border-bottom: 1px solid @legend-border-color; |
||||
} |
||||
|
||||
label { |
||||
display: inline-block; |
||||
max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141) |
||||
margin-bottom: 5px; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
|
||||
// Normalize form controls |
||||
// |
||||
// While most of our form styles require extra classes, some basic normalization |
||||
// is required to ensure optimum display with or without those classes to better |
||||
// address browser inconsistencies. |
||||
|
||||
// Override content-box in Normalize (* isn't specific enough) |
||||
input[type="search"] { |
||||
.box-sizing(border-box); |
||||
} |
||||
|
||||
// Position radios and checkboxes better |
||||
input[type="radio"], |
||||
input[type="checkbox"] { |
||||
margin: 4px 0 0; |
||||
margin-top: 1px \9; // IE8-9 |
||||
line-height: normal; |
||||
} |
||||
|
||||
// Set the height of file controls to match text inputs |
||||
input[type="file"] { |
||||
display: block; |
||||
} |
||||
|
||||
// Make range inputs behave like textual form controls |
||||
input[type="range"] { |
||||
display: block; |
||||
width: 100%; |
||||
} |
||||
|
||||
// Make multiple select elements height not fixed |
||||
select[multiple], |
||||
select[size] { |
||||
height: auto; |
||||
} |
||||
|
||||
// Focus for file, radio, and checkbox |
||||
input[type="file"]:focus, |
||||
input[type="radio"]:focus, |
||||
input[type="checkbox"]:focus { |
||||
.tab-focus(); |
||||
} |
||||
|
||||
// Adjust output element |
||||
output { |
||||
display: block; |
||||
padding-top: (@padding-base-vertical + 1); |
||||
font-size: @font-size-base; |
||||
line-height: @line-height-base; |
||||
color: @input-color; |
||||
} |
||||
|
||||
|
||||
// Common form controls |
||||
// |
||||
// Shared size and type resets for form controls. Apply `.form-control` to any |
||||
// of the following form controls: |
||||
// |
||||
// select |
||||
// textarea |
||||
// input[type="text"] |
||||
// input[type="password"] |
||||
// input[type="datetime"] |
||||
// input[type="datetime-local"] |
||||
// input[type="date"] |
||||
// input[type="month"] |
||||
// input[type="time"] |
||||
// input[type="week"] |
||||
// input[type="number"] |
||||
// input[type="email"] |
||||
// input[type="url"] |
||||
// input[type="search"] |
||||
// input[type="tel"] |
||||
// input[type="color"] |
||||
|
||||
.form-control { |
||||
display: block; |
||||
width: 100%; |
||||
height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) |
||||
padding: @padding-base-vertical @padding-base-horizontal; |
||||
font-size: @font-size-base; |
||||
line-height: @line-height-base; |
||||
color: @input-color; |
||||
background-color: @input-bg; |
||||
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 |
||||
border: 1px solid @input-border; |
||||
border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS. |
||||
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); |
||||
.transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s"); |
||||
|
||||
// Customize the `:focus` state to imitate native WebKit styles. |
||||
.form-control-focus(); |
||||
|
||||
// Placeholder |
||||
.placeholder(); |
||||
|
||||
// Disabled and read-only inputs |
||||
// |
||||
// HTML5 says that controls under a fieldset > legend:first-child won't be |
||||
// disabled if the fieldset is disabled. Due to implementation difficulty, we |
||||
// don't honor that edge case; we style them as disabled anyway. |
||||
&[disabled], |
||||
&[readonly], |
||||
fieldset[disabled] & { |
||||
background-color: @input-bg-disabled; |
||||
opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655 |
||||
} |
||||
|
||||
&[disabled], |
||||
fieldset[disabled] & { |
||||
cursor: @cursor-disabled; |
||||
} |
||||
|
||||
// Reset height for `textarea`s |
||||
textarea& { |
||||
height: auto; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Search inputs in iOS |
||||
// |
||||
// This overrides the extra rounded corners on search inputs in iOS so that our |
||||
// `.form-control` class can properly style them. Note that this cannot simply |
||||
// be added to `.form-control` as it's not specific enough. For details, see |
||||
// https://github.com/twbs/bootstrap/issues/11586. |
||||
|
||||
input[type="search"] { |
||||
-webkit-appearance: none; |
||||
} |
||||
|
||||
|
||||
// Special styles for iOS temporal inputs |
||||
// |
||||
// In Mobile Safari, setting `display: block` on temporal inputs causes the |
||||
// text within the input to become vertically misaligned. As a workaround, we |
||||
// set a pixel line-height that matches the given height of the input, but only |
||||
// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848 |
||||
|
||||
@media screen and (-webkit-min-device-pixel-ratio: 0) { |
||||
input[type="date"], |
||||
input[type="time"], |
||||
input[type="datetime-local"], |
||||
input[type="month"] { |
||||
line-height: @input-height-base; |
||||
|
||||
&.input-sm, |
||||
.input-group-sm & { |
||||
line-height: @input-height-small; |
||||
} |
||||
|
||||
&.input-lg, |
||||
.input-group-lg & { |
||||
line-height: @input-height-large; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Form groups |
||||
// |
||||
// Designed to help with the organization and spacing of vertical forms. For |
||||
// horizontal forms, use the predefined grid classes. |
||||
|
||||
.form-group { |
||||
margin-bottom: @form-group-margin-bottom; |
||||
} |
||||
|
||||
|
||||
// Checkboxes and radios |
||||
// |
||||
// Indent the labels to position radios/checkboxes as hanging controls. |
||||
|
||||
.radio, |
||||
.checkbox { |
||||
position: relative; |
||||
display: block; |
||||
margin-top: 10px; |
||||
margin-bottom: 10px; |
||||
|
||||
label { |
||||
min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text |
||||
padding-left: 20px; |
||||
margin-bottom: 0; |
||||
font-weight: normal; |
||||
cursor: pointer; |
||||
} |
||||
} |
||||
.radio input[type="radio"], |
||||
.radio-inline input[type="radio"], |
||||
.checkbox input[type="checkbox"], |
||||
.checkbox-inline input[type="checkbox"] { |
||||
position: absolute; |
||||
margin-left: -20px; |
||||
margin-top: 4px \9; |
||||
} |
||||
|
||||
.radio + .radio, |
||||
.checkbox + .checkbox { |
||||
margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing |
||||
} |
||||
|
||||
// Radios and checkboxes on same line |
||||
.radio-inline, |
||||
.checkbox-inline { |
||||
position: relative; |
||||
display: inline-block; |
||||
padding-left: 20px; |
||||
margin-bottom: 0; |
||||
vertical-align: middle; |
||||
font-weight: normal; |
||||
cursor: pointer; |
||||
} |
||||
.radio-inline + .radio-inline, |
||||
.checkbox-inline + .checkbox-inline { |
||||
margin-top: 0; |
||||
margin-left: 10px; // space out consecutive inline controls |
||||
} |
||||
|
||||
// Apply same disabled cursor tweak as for inputs |
||||
// Some special care is needed because <label>s don't inherit their parent's `cursor`. |
||||
// |
||||
// Note: Neither radios nor checkboxes can be readonly. |
||||
input[type="radio"], |
||||
input[type="checkbox"] { |
||||
&[disabled], |
||||
&.disabled, |
||||
fieldset[disabled] & { |
||||
cursor: @cursor-disabled; |
||||
} |
||||
} |
||||
// These classes are used directly on <label>s |
||||
.radio-inline, |
||||
.checkbox-inline { |
||||
&.disabled, |
||||
fieldset[disabled] & { |
||||
cursor: @cursor-disabled; |
||||
} |
||||
} |
||||
// These classes are used on elements with <label> descendants |
||||
.radio, |
||||
.checkbox { |
||||
&.disabled, |
||||
fieldset[disabled] & { |
||||
label { |
||||
cursor: @cursor-disabled; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Static form control text |
||||
// |
||||
// Apply class to a `p` element to make any string of text align with labels in |
||||
// a horizontal form layout. |
||||
|
||||
.form-control-static { |
||||
// Size it appropriately next to real form controls |
||||
padding-top: (@padding-base-vertical + 1); |
||||
padding-bottom: (@padding-base-vertical + 1); |
||||
// Remove default margin from `p` |
||||
margin-bottom: 0; |
||||
min-height: (@line-height-computed + @font-size-base); |
||||
|
||||
&.input-lg, |
||||
&.input-sm { |
||||
padding-left: 0; |
||||
padding-right: 0; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Form control sizing |
||||
// |
||||
// Build on `.form-control` with modifier classes to decrease or increase the |
||||
// height and font-size of form controls. |
||||
// |
||||
// The `.form-group-* form-control` variations are sadly duplicated to avoid the |
||||
// issue documented in https://github.com/twbs/bootstrap/issues/15074. |
||||
|
||||
.input-sm { |
||||
.input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small); |
||||
} |
||||
.form-group-sm { |
||||
.form-control { |
||||
.input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small); |
||||
} |
||||
.form-control-static { |
||||
height: @input-height-small; |
||||
padding: @padding-small-vertical @padding-small-horizontal; |
||||
font-size: @font-size-small; |
||||
line-height: @line-height-small; |
||||
min-height: (@line-height-computed + @font-size-small); |
||||
} |
||||
} |
||||
|
||||
.input-lg { |
||||
.input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large); |
||||
} |
||||
.form-group-lg { |
||||
.form-control { |
||||
.input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large); |
||||
} |
||||
.form-control-static { |
||||
height: @input-height-large; |
||||
padding: @padding-large-vertical @padding-large-horizontal; |
||||
font-size: @font-size-large; |
||||
line-height: @line-height-large; |
||||
min-height: (@line-height-computed + @font-size-large); |
||||
} |
||||
} |
||||
|
||||
|
||||
// Form control feedback states |
||||
// |
||||
// Apply contextual and semantic states to individual form controls. |
||||
|
||||
.has-feedback { |
||||
// Enable absolute positioning |
||||
position: relative; |
||||
|
||||
// Ensure icons don't overlap text |
||||
.form-control { |
||||
padding-right: (@input-height-base * 1.25); |
||||
} |
||||
} |
||||
// Feedback icon (requires .glyphicon classes) |
||||
.form-control-feedback { |
||||
position: absolute; |
||||
top: 0; |
||||
right: 0; |
||||
z-index: 2; // Ensure icon is above input groups |
||||
display: block; |
||||
width: @input-height-base; |
||||
height: @input-height-base; |
||||
line-height: @input-height-base; |
||||
text-align: center; |
||||
pointer-events: none; |
||||
} |
||||
.input-lg + .form-control-feedback { |
||||
width: @input-height-large; |
||||
height: @input-height-large; |
||||
line-height: @input-height-large; |
||||
} |
||||
.input-sm + .form-control-feedback { |
||||
width: @input-height-small; |
||||
height: @input-height-small; |
||||
line-height: @input-height-small; |
||||
} |
||||
|
||||
// Feedback states |
||||
.has-success { |
||||
.form-control-validation(@state-success-text; @state-success-text; @state-success-bg); |
||||
} |
||||
.has-warning { |
||||
.form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg); |
||||
} |
||||
.has-error { |
||||
.form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg); |
||||
} |
||||
|
||||
// Reposition feedback icon if input has visible label above |
||||
.has-feedback label { |
||||
|
||||
& ~ .form-control-feedback { |
||||
top: (@line-height-computed + 5); // Height of the `label` and its margin |
||||
} |
||||
&.sr-only ~ .form-control-feedback { |
||||
top: 0; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Help text |
||||
// |
||||
// Apply to any element you wish to create light text for placement immediately |
||||
// below a form control. Use for general help, formatting, or instructional text. |
||||
|
||||
.help-block { |
||||
display: block; // account for any element using help-block |
||||
margin-top: 5px; |
||||
margin-bottom: 10px; |
||||
color: lighten(@text-color, 25%); // lighten the text some for contrast |
||||
} |
||||
|
||||
|
||||
// Inline forms |
||||
// |
||||
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline |
||||
// forms begin stacked on extra small (mobile) devices and then go inline when |
||||
// viewports reach <768px. |
||||
// |
||||
// Requires wrapping inputs and labels with `.form-group` for proper display of |
||||
// default HTML form controls and our custom form controls (e.g., input groups). |
||||
// |
||||
// Heads up! This is mixin-ed into `.navbar-form` in navbars.less. |
||||
|
||||
.form-inline { |
||||
|
||||
// Kick in the inline |
||||
@media (min-width: @screen-sm-min) { |
||||
// Inline-block all the things for "inline" |
||||
.form-group { |
||||
display: inline-block; |
||||
margin-bottom: 0; |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
// In navbar-form, allow folks to *not* use `.form-group` |
||||
.form-control { |
||||
display: inline-block; |
||||
width: auto; // Prevent labels from stacking above inputs in `.form-group` |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
// Make static controls behave like regular ones |
||||
.form-control-static { |
||||
display: inline-block; |
||||
} |
||||
|
||||
.input-group { |
||||
display: inline-table; |
||||
vertical-align: middle; |
||||
|
||||
.input-group-addon, |
||||
.input-group-btn, |
||||
.form-control { |
||||
width: auto; |
||||
} |
||||
} |
||||
|
||||
// Input groups need that 100% width though |
||||
.input-group > .form-control { |
||||
width: 100%; |
||||
} |
||||
|
||||
.control-label { |
||||
margin-bottom: 0; |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
// Remove default margin on radios/checkboxes that were used for stacking, and |
||||
// then undo the floating of radios and checkboxes to match. |
||||
.radio, |
||||
.checkbox { |
||||
display: inline-block; |
||||
margin-top: 0; |
||||
margin-bottom: 0; |
||||
vertical-align: middle; |
||||
|
||||
label { |
||||
padding-left: 0; |
||||
} |
||||
} |
||||
.radio input[type="radio"], |
||||
.checkbox input[type="checkbox"] { |
||||
position: relative; |
||||
margin-left: 0; |
||||
} |
||||
|
||||
// Re-override the feedback icon. |
||||
.has-feedback .form-control-feedback { |
||||
top: 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Horizontal forms |
||||
// |
||||
// Horizontal forms are built on grid classes and allow you to create forms with |
||||
// labels on the left and inputs on the right. |
||||
|
||||
.form-horizontal { |
||||
|
||||
// Consistent vertical alignment of radios and checkboxes |
||||
// |
||||
// Labels also get some reset styles, but that is scoped to a media query below. |
||||
.radio, |
||||
.checkbox, |
||||
.radio-inline, |
||||
.checkbox-inline { |
||||
margin-top: 0; |
||||
margin-bottom: 0; |
||||
padding-top: (@padding-base-vertical + 1); // Default padding plus a border |
||||
} |
||||
// Account for padding we're adding to ensure the alignment and of help text |
||||
// and other content below items |
||||
.radio, |
||||
.checkbox { |
||||
min-height: (@line-height-computed + (@padding-base-vertical + 1)); |
||||
} |
||||
|
||||
// Make form groups behave like rows |
||||
.form-group { |
||||
.make-row(); |
||||
} |
||||
|
||||
// Reset spacing and right align labels, but scope to media queries so that |
||||
// labels on narrow viewports stack the same as a default form example. |
||||
@media (min-width: @screen-sm-min) { |
||||
.control-label { |
||||
text-align: right; |
||||
margin-bottom: 0; |
||||
padding-top: (@padding-base-vertical + 1); // Default padding plus a border |
||||
} |
||||
} |
||||
|
||||
// Validation states |
||||
// |
||||
// Reposition the icon because it's now within a grid column and columns have |
||||
// `position: relative;` on them. Also accounts for the grid gutter padding. |
||||
.has-feedback .form-control-feedback { |
||||
right: (@grid-gutter-width / 2); |
||||
} |
||||
|
||||
// Form group sizes |
||||
// |
||||
// Quick utility class for applying `.input-lg` and `.input-sm` styles to the |
||||
// inputs and labels within a `.form-group`. |
||||
.form-group-lg { |
||||
@media (min-width: @screen-sm-min) { |
||||
.control-label { |
||||
padding-top: ((@padding-large-vertical * @line-height-large) + 1); |
||||
} |
||||
} |
||||
} |
||||
.form-group-sm { |
||||
@media (min-width: @screen-sm-min) { |
||||
.control-label { |
||||
padding-top: (@padding-small-vertical + 1); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,305 +0,0 @@
@@ -1,305 +0,0 @@
|
||||
// |
||||
// Glyphicons for Bootstrap |
||||
// |
||||
// Since icons are fonts, they can be placed anywhere text is placed and are |
||||
// thus automatically sized to match the surrounding child. To use, create an |
||||
// inline element with the appropriate classes, like so: |
||||
// |
||||
// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a> |
||||
|
||||
// Import the fonts |
||||
@font-face { |
||||
font-family: 'Glyphicons Halflings'; |
||||
src: url('@{icon-font-path}@{icon-font-name}.eot'); |
||||
src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'), |
||||
url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'), |
||||
url('@{icon-font-path}@{icon-font-name}.woff') format('woff'), |
||||
url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'), |
||||
url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg'); |
||||
} |
||||
|
||||
// Catchall baseclass |
||||
.glyphicon { |
||||
position: relative; |
||||
top: 1px; |
||||
display: inline-block; |
||||
font-family: 'Glyphicons Halflings'; |
||||
font-style: normal; |
||||
font-weight: normal; |
||||
line-height: 1; |
||||
-webkit-font-smoothing: antialiased; |
||||
-moz-osx-font-smoothing: grayscale; |
||||
} |
||||
|
||||
// Individual icons |
||||
.glyphicon-asterisk { &:before { content: "\2a"; } } |
||||
.glyphicon-plus { &:before { content: "\2b"; } } |
||||
.glyphicon-euro, |
||||
.glyphicon-eur { &:before { content: "\20ac"; } } |
||||
.glyphicon-minus { &:before { content: "\2212"; } } |
||||
.glyphicon-cloud { &:before { content: "\2601"; } } |
||||
.glyphicon-envelope { &:before { content: "\2709"; } } |
||||
.glyphicon-pencil { &:before { content: "\270f"; } } |
||||
.glyphicon-glass { &:before { content: "\e001"; } } |
||||
.glyphicon-music { &:before { content: "\e002"; } } |
||||
.glyphicon-search { &:before { content: "\e003"; } } |
||||
.glyphicon-heart { &:before { content: "\e005"; } } |
||||
.glyphicon-star { &:before { content: "\e006"; } } |
||||
.glyphicon-star-empty { &:before { content: "\e007"; } } |
||||
.glyphicon-user { &:before { content: "\e008"; } } |
||||
.glyphicon-film { &:before { content: "\e009"; } } |
||||
.glyphicon-th-large { &:before { content: "\e010"; } } |
||||
.glyphicon-th { &:before { content: "\e011"; } } |
||||
.glyphicon-th-list { &:before { content: "\e012"; } } |
||||
.glyphicon-ok { &:before { content: "\e013"; } } |
||||
.glyphicon-remove { &:before { content: "\e014"; } } |
||||
.glyphicon-zoom-in { &:before { content: "\e015"; } } |
||||
.glyphicon-zoom-out { &:before { content: "\e016"; } } |
||||
.glyphicon-off { &:before { content: "\e017"; } } |
||||
.glyphicon-signal { &:before { content: "\e018"; } } |
||||
.glyphicon-cog { &:before { content: "\e019"; } } |
||||
.glyphicon-trash { &:before { content: "\e020"; } } |
||||
.glyphicon-home { &:before { content: "\e021"; } } |
||||
.glyphicon-file { &:before { content: "\e022"; } } |
||||
.glyphicon-time { &:before { content: "\e023"; } } |
||||
.glyphicon-road { &:before { content: "\e024"; } } |
||||
.glyphicon-download-alt { &:before { content: "\e025"; } } |
||||
.glyphicon-download { &:before { content: "\e026"; } } |
||||
.glyphicon-upload { &:before { content: "\e027"; } } |
||||
.glyphicon-inbox { &:before { content: "\e028"; } } |
||||
.glyphicon-play-circle { &:before { content: "\e029"; } } |
||||
.glyphicon-repeat { &:before { content: "\e030"; } } |
||||
.glyphicon-refresh { &:before { content: "\e031"; } } |
||||
.glyphicon-list-alt { &:before { content: "\e032"; } } |
||||
.glyphicon-lock { &:before { content: "\e033"; } } |
||||
.glyphicon-flag { &:before { content: "\e034"; } } |
||||
.glyphicon-headphones { &:before { content: "\e035"; } } |
||||
.glyphicon-volume-off { &:before { content: "\e036"; } } |
||||
.glyphicon-volume-down { &:before { content: "\e037"; } } |
||||
.glyphicon-volume-up { &:before { content: "\e038"; } } |
||||
.glyphicon-qrcode { &:before { content: "\e039"; } } |
||||
.glyphicon-barcode { &:before { content: "\e040"; } } |
||||
.glyphicon-tag { &:before { content: "\e041"; } } |
||||
.glyphicon-tags { &:before { content: "\e042"; } } |
||||
.glyphicon-book { &:before { content: "\e043"; } } |
||||
.glyphicon-bookmark { &:before { content: "\e044"; } } |
||||
.glyphicon-print { &:before { content: "\e045"; } } |
||||
.glyphicon-camera { &:before { content: "\e046"; } } |
||||
.glyphicon-font { &:before { content: "\e047"; } } |
||||
.glyphicon-bold { &:before { content: "\e048"; } } |
||||
.glyphicon-italic { &:before { content: "\e049"; } } |
||||
.glyphicon-text-height { &:before { content: "\e050"; } } |
||||
.glyphicon-text-width { &:before { content: "\e051"; } } |
||||
.glyphicon-align-left { &:before { content: "\e052"; } } |
||||
.glyphicon-align-center { &:before { content: "\e053"; } } |
||||
.glyphicon-align-right { &:before { content: "\e054"; } } |
||||
.glyphicon-align-justify { &:before { content: "\e055"; } } |
||||
.glyphicon-list { &:before { content: "\e056"; } } |
||||
.glyphicon-indent-left { &:before { content: "\e057"; } } |
||||
.glyphicon-indent-right { &:before { content: "\e058"; } } |
||||
.glyphicon-facetime-video { &:before { content: "\e059"; } } |
||||
.glyphicon-picture { &:before { content: "\e060"; } } |
||||
.glyphicon-map-marker { &:before { content: "\e062"; } } |
||||
.glyphicon-adjust { &:before { content: "\e063"; } } |
||||
.glyphicon-tint { &:before { content: "\e064"; } } |
||||
.glyphicon-edit { &:before { content: "\e065"; } } |
||||
.glyphicon-share { &:before { content: "\e066"; } } |
||||
.glyphicon-check { &:before { content: "\e067"; } } |
||||
.glyphicon-move { &:before { content: "\e068"; } } |
||||
.glyphicon-step-backward { &:before { content: "\e069"; } } |
||||
.glyphicon-fast-backward { &:before { content: "\e070"; } } |
||||
.glyphicon-backward { &:before { content: "\e071"; } } |
||||
.glyphicon-play { &:before { content: "\e072"; } } |
||||
.glyphicon-pause { &:before { content: "\e073"; } } |
||||
.glyphicon-stop { &:before { content: "\e074"; } } |
||||
.glyphicon-forward { &:before { content: "\e075"; } } |
||||
.glyphicon-fast-forward { &:before { content: "\e076"; } } |
||||
.glyphicon-step-forward { &:before { content: "\e077"; } } |
||||
.glyphicon-eject { &:before { content: "\e078"; } } |
||||
.glyphicon-chevron-left { &:before { content: "\e079"; } } |
||||
.glyphicon-chevron-right { &:before { content: "\e080"; } } |
||||
.glyphicon-plus-sign { &:before { content: "\e081"; } } |
||||
.glyphicon-minus-sign { &:before { content: "\e082"; } } |
||||
.glyphicon-remove-sign { &:before { content: "\e083"; } } |
||||
.glyphicon-ok-sign { &:before { content: "\e084"; } } |
||||
.glyphicon-question-sign { &:before { content: "\e085"; } } |
||||
.glyphicon-info-sign { &:before { content: "\e086"; } } |
||||
.glyphicon-screenshot { &:before { content: "\e087"; } } |
||||
.glyphicon-remove-circle { &:before { content: "\e088"; } } |
||||
.glyphicon-ok-circle { &:before { content: "\e089"; } } |
||||
.glyphicon-ban-circle { &:before { content: "\e090"; } } |
||||
.glyphicon-arrow-left { &:before { content: "\e091"; } } |
||||
.glyphicon-arrow-right { &:before { content: "\e092"; } } |
||||
.glyphicon-arrow-up { &:before { content: "\e093"; } } |
||||
.glyphicon-arrow-down { &:before { content: "\e094"; } } |
||||
.glyphicon-share-alt { &:before { content: "\e095"; } } |
||||
.glyphicon-resize-full { &:before { content: "\e096"; } } |
||||
.glyphicon-resize-small { &:before { content: "\e097"; } } |
||||
.glyphicon-exclamation-sign { &:before { content: "\e101"; } } |
||||
.glyphicon-gift { &:before { content: "\e102"; } } |
||||
.glyphicon-leaf { &:before { content: "\e103"; } } |
||||
.glyphicon-fire { &:before { content: "\e104"; } } |
||||
.glyphicon-eye-open { &:before { content: "\e105"; } } |
||||
.glyphicon-eye-close { &:before { content: "\e106"; } } |
||||
.glyphicon-warning-sign { &:before { content: "\e107"; } } |
||||
.glyphicon-plane { &:before { content: "\e108"; } } |
||||
.glyphicon-calendar { &:before { content: "\e109"; } } |
||||
.glyphicon-random { &:before { content: "\e110"; } } |
||||
.glyphicon-comment { &:before { content: "\e111"; } } |
||||
.glyphicon-magnet { &:before { content: "\e112"; } } |
||||
.glyphicon-chevron-up { &:before { content: "\e113"; } } |
||||
.glyphicon-chevron-down { &:before { content: "\e114"; } } |
||||
.glyphicon-retweet { &:before { content: "\e115"; } } |
||||
.glyphicon-shopping-cart { &:before { content: "\e116"; } } |
||||
.glyphicon-folder-close { &:before { content: "\e117"; } } |
||||
.glyphicon-folder-open { &:before { content: "\e118"; } } |
||||
.glyphicon-resize-vertical { &:before { content: "\e119"; } } |
||||
.glyphicon-resize-horizontal { &:before { content: "\e120"; } } |
||||
.glyphicon-hdd { &:before { content: "\e121"; } } |
||||
.glyphicon-bullhorn { &:before { content: "\e122"; } } |
||||
.glyphicon-bell { &:before { content: "\e123"; } } |
||||
.glyphicon-certificate { &:before { content: "\e124"; } } |
||||
.glyphicon-thumbs-up { &:before { content: "\e125"; } } |
||||
.glyphicon-thumbs-down { &:before { content: "\e126"; } } |
||||
.glyphicon-hand-right { &:before { content: "\e127"; } } |
||||
.glyphicon-hand-left { &:before { content: "\e128"; } } |
||||
.glyphicon-hand-up { &:before { content: "\e129"; } } |
||||
.glyphicon-hand-down { &:before { content: "\e130"; } } |
||||
.glyphicon-circle-arrow-right { &:before { content: "\e131"; } } |
||||
.glyphicon-circle-arrow-left { &:before { content: "\e132"; } } |
||||
.glyphicon-circle-arrow-up { &:before { content: "\e133"; } } |
||||
.glyphicon-circle-arrow-down { &:before { content: "\e134"; } } |
||||
.glyphicon-globe { &:before { content: "\e135"; } } |
||||
.glyphicon-wrench { &:before { content: "\e136"; } } |
||||
.glyphicon-tasks { &:before { content: "\e137"; } } |
||||
.glyphicon-filter { &:before { content: "\e138"; } } |
||||
.glyphicon-briefcase { &:before { content: "\e139"; } } |
||||
.glyphicon-fullscreen { &:before { content: "\e140"; } } |
||||
.glyphicon-dashboard { &:before { content: "\e141"; } } |
||||
.glyphicon-paperclip { &:before { content: "\e142"; } } |
||||
.glyphicon-heart-empty { &:before { content: "\e143"; } } |
||||
.glyphicon-link { &:before { content: "\e144"; } } |
||||
.glyphicon-phone { &:before { content: "\e145"; } } |
||||
.glyphicon-pushpin { &:before { content: "\e146"; } } |
||||
.glyphicon-usd { &:before { content: "\e148"; } } |
||||
.glyphicon-gbp { &:before { content: "\e149"; } } |
||||
.glyphicon-sort { &:before { content: "\e150"; } } |
||||
.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } } |
||||
.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } } |
||||
.glyphicon-sort-by-order { &:before { content: "\e153"; } } |
||||
.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } } |
||||
.glyphicon-sort-by-attributes { &:before { content: "\e155"; } } |
||||
.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } } |
||||
.glyphicon-unchecked { &:before { content: "\e157"; } } |
||||
.glyphicon-expand { &:before { content: "\e158"; } } |
||||
.glyphicon-collapse-down { &:before { content: "\e159"; } } |
||||
.glyphicon-collapse-up { &:before { content: "\e160"; } } |
||||
.glyphicon-log-in { &:before { content: "\e161"; } } |
||||
.glyphicon-flash { &:before { content: "\e162"; } } |
||||
.glyphicon-log-out { &:before { content: "\e163"; } } |
||||
.glyphicon-new-window { &:before { content: "\e164"; } } |
||||
.glyphicon-record { &:before { content: "\e165"; } } |
||||
.glyphicon-save { &:before { content: "\e166"; } } |
||||
.glyphicon-open { &:before { content: "\e167"; } } |
||||
.glyphicon-saved { &:before { content: "\e168"; } } |
||||
.glyphicon-import { &:before { content: "\e169"; } } |
||||
.glyphicon-export { &:before { content: "\e170"; } } |
||||
.glyphicon-send { &:before { content: "\e171"; } } |
||||
.glyphicon-floppy-disk { &:before { content: "\e172"; } } |
||||
.glyphicon-floppy-saved { &:before { content: "\e173"; } } |
||||
.glyphicon-floppy-remove { &:before { content: "\e174"; } } |
||||
.glyphicon-floppy-save { &:before { content: "\e175"; } } |
||||
.glyphicon-floppy-open { &:before { content: "\e176"; } } |
||||
.glyphicon-credit-card { &:before { content: "\e177"; } } |
||||
.glyphicon-transfer { &:before { content: "\e178"; } } |
||||
.glyphicon-cutlery { &:before { content: "\e179"; } } |
||||
.glyphicon-header { &:before { content: "\e180"; } } |
||||
.glyphicon-compressed { &:before { content: "\e181"; } } |
||||
.glyphicon-earphone { &:before { content: "\e182"; } } |
||||
.glyphicon-phone-alt { &:before { content: "\e183"; } } |
||||
.glyphicon-tower { &:before { content: "\e184"; } } |
||||
.glyphicon-stats { &:before { content: "\e185"; } } |
||||
.glyphicon-sd-video { &:before { content: "\e186"; } } |
||||
.glyphicon-hd-video { &:before { content: "\e187"; } } |
||||
.glyphicon-subtitles { &:before { content: "\e188"; } } |
||||
.glyphicon-sound-stereo { &:before { content: "\e189"; } } |
||||
.glyphicon-sound-dolby { &:before { content: "\e190"; } } |
||||
.glyphicon-sound-5-1 { &:before { content: "\e191"; } } |
||||
.glyphicon-sound-6-1 { &:before { content: "\e192"; } } |
||||
.glyphicon-sound-7-1 { &:before { content: "\e193"; } } |
||||
.glyphicon-copyright-mark { &:before { content: "\e194"; } } |
||||
.glyphicon-registration-mark { &:before { content: "\e195"; } } |
||||
.glyphicon-cloud-download { &:before { content: "\e197"; } } |
||||
.glyphicon-cloud-upload { &:before { content: "\e198"; } } |
||||
.glyphicon-tree-conifer { &:before { content: "\e199"; } } |
||||
.glyphicon-tree-deciduous { &:before { content: "\e200"; } } |
||||
.glyphicon-cd { &:before { content: "\e201"; } } |
||||
.glyphicon-save-file { &:before { content: "\e202"; } } |
||||
.glyphicon-open-file { &:before { content: "\e203"; } } |
||||
.glyphicon-level-up { &:before { content: "\e204"; } } |
||||
.glyphicon-copy { &:before { content: "\e205"; } } |
||||
.glyphicon-paste { &:before { content: "\e206"; } } |
||||
// The following 2 Glyphicons are omitted for the time being because |
||||
// they currently use Unicode codepoints that are outside the |
||||
// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle |
||||
// non-BMP codepoints in CSS string escapes, and thus can't display these two icons. |
||||
// Notably, the bug affects some older versions of the Android Browser. |
||||
// More info: https://github.com/twbs/bootstrap/issues/10106 |
||||
// .glyphicon-door { &:before { content: "\1f6aa"; } } |
||||
// .glyphicon-key { &:before { content: "\1f511"; } } |
||||
.glyphicon-alert { &:before { content: "\e209"; } } |
||||
.glyphicon-equalizer { &:before { content: "\e210"; } } |
||||
.glyphicon-king { &:before { content: "\e211"; } } |
||||
.glyphicon-queen { &:before { content: "\e212"; } } |
||||
.glyphicon-pawn { &:before { content: "\e213"; } } |
||||
.glyphicon-bishop { &:before { content: "\e214"; } } |
||||
.glyphicon-knight { &:before { content: "\e215"; } } |
||||
.glyphicon-baby-formula { &:before { content: "\e216"; } } |
||||
.glyphicon-tent { &:before { content: "\26fa"; } } |
||||
.glyphicon-blackboard { &:before { content: "\e218"; } } |
||||
.glyphicon-bed { &:before { content: "\e219"; } } |
||||
.glyphicon-apple { &:before { content: "\f8ff"; } } |
||||
.glyphicon-erase { &:before { content: "\e221"; } } |
||||
.glyphicon-hourglass { &:before { content: "\231b"; } } |
||||
.glyphicon-lamp { &:before { content: "\e223"; } } |
||||
.glyphicon-duplicate { &:before { content: "\e224"; } } |
||||
.glyphicon-piggy-bank { &:before { content: "\e225"; } } |
||||
.glyphicon-scissors { &:before { content: "\e226"; } } |
||||
.glyphicon-bitcoin { &:before { content: "\e227"; } } |
||||
.glyphicon-btc { &:before { content: "\e227"; } } |
||||
.glyphicon-xbt { &:before { content: "\e227"; } } |
||||
.glyphicon-yen { &:before { content: "\00a5"; } } |
||||
.glyphicon-jpy { &:before { content: "\00a5"; } } |
||||
.glyphicon-ruble { &:before { content: "\20bd"; } } |
||||
.glyphicon-rub { &:before { content: "\20bd"; } } |
||||
.glyphicon-scale { &:before { content: "\e230"; } } |
||||
.glyphicon-ice-lolly { &:before { content: "\e231"; } } |
||||
.glyphicon-ice-lolly-tasted { &:before { content: "\e232"; } } |
||||
.glyphicon-education { &:before { content: "\e233"; } } |
||||
.glyphicon-option-horizontal { &:before { content: "\e234"; } } |
||||
.glyphicon-option-vertical { &:before { content: "\e235"; } } |
||||
.glyphicon-menu-hamburger { &:before { content: "\e236"; } } |
||||
.glyphicon-modal-window { &:before { content: "\e237"; } } |
||||
.glyphicon-oil { &:before { content: "\e238"; } } |
||||
.glyphicon-grain { &:before { content: "\e239"; } } |
||||
.glyphicon-sunglasses { &:before { content: "\e240"; } } |
||||
.glyphicon-text-size { &:before { content: "\e241"; } } |
||||
.glyphicon-text-color { &:before { content: "\e242"; } } |
||||
.glyphicon-text-background { &:before { content: "\e243"; } } |
||||
.glyphicon-object-align-top { &:before { content: "\e244"; } } |
||||
.glyphicon-object-align-bottom { &:before { content: "\e245"; } } |
||||
.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } } |
||||
.glyphicon-object-align-left { &:before { content: "\e247"; } } |
||||
.glyphicon-object-align-vertical { &:before { content: "\e248"; } } |
||||
.glyphicon-object-align-right { &:before { content: "\e249"; } } |
||||
.glyphicon-triangle-right { &:before { content: "\e250"; } } |
||||
.glyphicon-triangle-left { &:before { content: "\e251"; } } |
||||
.glyphicon-triangle-bottom { &:before { content: "\e252"; } } |
||||
.glyphicon-triangle-top { &:before { content: "\e253"; } } |
||||
.glyphicon-console { &:before { content: "\e254"; } } |
||||
.glyphicon-superscript { &:before { content: "\e255"; } } |
||||
.glyphicon-subscript { &:before { content: "\e256"; } } |
||||
.glyphicon-menu-left { &:before { content: "\e257"; } } |
||||
.glyphicon-menu-right { &:before { content: "\e258"; } } |
||||
.glyphicon-menu-down { &:before { content: "\e259"; } } |
||||
.glyphicon-menu-up { &:before { content: "\e260"; } } |
@ -1,84 +0,0 @@
@@ -1,84 +0,0 @@
|
||||
// |
||||
// Grid system |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Container widths |
||||
// |
||||
// Set the container width, and override it for fixed navbars in media queries. |
||||
|
||||
.tb-container { |
||||
.container-fixed(); |
||||
|
||||
@media (min-width: @screen-sm-min) { |
||||
width: @container-sm; |
||||
} |
||||
@media (min-width: @screen-md-min) { |
||||
width: @container-md; |
||||
} |
||||
@media (min-width: @screen-lg-min) { |
||||
width: @container-lg; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Fluid container |
||||
// |
||||
// Utilizes the mixin meant for fixed width containers, but without any defined |
||||
// width for fluid, full width layouts. |
||||
|
||||
.container-fluid { |
||||
.container-fixed(); |
||||
} |
||||
|
||||
|
||||
// Row |
||||
// |
||||
// Rows contain and clear the floats of your columns. |
||||
|
||||
.row { |
||||
.make-row(); |
||||
} |
||||
|
||||
|
||||
// Columns |
||||
// |
||||
// Common styles for small and large grid columns |
||||
|
||||
.make-grid-columns(); |
||||
|
||||
|
||||
// Extra small grid |
||||
// |
||||
// Columns, offsets, pushes, and pulls for extra small devices like |
||||
// smartphones. |
||||
|
||||
.make-grid(xs); |
||||
|
||||
|
||||
// Small grid |
||||
// |
||||
// Columns, offsets, pushes, and pulls for the small device range, from phones |
||||
// to tablets. |
||||
|
||||
@media (min-width: @screen-sm-min) { |
||||
.make-grid(sm); |
||||
} |
||||
|
||||
|
||||
// Medium grid |
||||
// |
||||
// Columns, offsets, pushes, and pulls for the desktop device range. |
||||
|
||||
@media (min-width: @screen-md-min) { |
||||
.make-grid(md); |
||||
} |
||||
|
||||
|
||||
// Large grid |
||||
// |
||||
// Columns, offsets, pushes, and pulls for the large desktop device range. |
||||
|
||||
@media (min-width: @screen-lg-min) { |
||||
.make-grid(lg); |
||||
} |
@ -1,166 +0,0 @@
@@ -1,166 +0,0 @@
|
||||
// |
||||
// Input groups |
||||
// -------------------------------------------------- |
||||
|
||||
// Base styles |
||||
// ------------------------- |
||||
.input-group { |
||||
position: relative; // For dropdowns |
||||
display: table; |
||||
border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table |
||||
|
||||
// Undo padding and float of grid classes |
||||
&[class*="col-"] { |
||||
float: none; |
||||
padding-left: 0; |
||||
padding-right: 0; |
||||
} |
||||
|
||||
.form-control { |
||||
// Ensure that the input is always above the *appended* addon button for |
||||
// proper border colors. |
||||
position: relative; |
||||
z-index: 2; |
||||
|
||||
// IE9 fubars the placeholder attribute in text inputs and the arrows on |
||||
// select elements in input groups. To fix it, we float the input. Details: |
||||
// https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855 |
||||
float: left; |
||||
|
||||
width: 100%; |
||||
margin-bottom: 0; |
||||
} |
||||
} |
||||
|
||||
// Sizing options |
||||
// |
||||
// Remix the default form control sizing classes into new ones for easier |
||||
// manipulation. |
||||
|
||||
.input-group-lg > .form-control, |
||||
.input-group-lg > .input-group-addon, |
||||
.input-group-lg > .input-group-btn > .btn { |
||||
.input-lg(); |
||||
} |
||||
.input-group-sm > .form-control, |
||||
.input-group-sm > .input-group-addon, |
||||
.input-group-sm > .input-group-btn > .btn { |
||||
.input-sm(); |
||||
} |
||||
|
||||
|
||||
// Display as table-cell |
||||
// ------------------------- |
||||
.input-group-addon, |
||||
.input-group-btn, |
||||
.input-group .form-control { |
||||
display: table-cell; |
||||
|
||||
&:not(:first-child):not(:last-child) { |
||||
border-radius: 0; |
||||
} |
||||
} |
||||
// Addon and addon wrapper for buttons |
||||
.input-group-addon, |
||||
.input-group-btn { |
||||
width: 1%; |
||||
white-space: nowrap; |
||||
vertical-align: middle; // Match the inputs |
||||
} |
||||
|
||||
// Text input groups |
||||
// ------------------------- |
||||
.input-group-addon { |
||||
padding: @padding-base-vertical @padding-base-horizontal; |
||||
font-size: @font-size-base; |
||||
font-weight: normal; |
||||
line-height: 1; |
||||
color: @input-color; |
||||
text-align: center; |
||||
background-color: @input-group-addon-bg; |
||||
border: 1px solid @input-group-addon-border-color; |
||||
border-radius: @border-radius-base; |
||||
|
||||
// Sizing |
||||
&.input-sm { |
||||
padding: @padding-small-vertical @padding-small-horizontal; |
||||
font-size: @font-size-small; |
||||
border-radius: @border-radius-small; |
||||
} |
||||
&.input-lg { |
||||
padding: @padding-large-vertical @padding-large-horizontal; |
||||
font-size: @font-size-large; |
||||
border-radius: @border-radius-large; |
||||
} |
||||
|
||||
// Nuke default margins from checkboxes and radios to vertically center within. |
||||
input[type="radio"], |
||||
input[type="checkbox"] { |
||||
margin-top: 0; |
||||
} |
||||
} |
||||
|
||||
// Reset rounded corners |
||||
.input-group .form-control:first-child, |
||||
.input-group-addon:first-child, |
||||
.input-group-btn:first-child > .btn, |
||||
.input-group-btn:first-child > .btn-group > .btn, |
||||
.input-group-btn:first-child > .dropdown-toggle, |
||||
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), |
||||
.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { |
||||
.border-right-radius(0); |
||||
} |
||||
.input-group-addon:first-child { |
||||
border-right: 0; |
||||
} |
||||
.input-group .form-control:last-child, |
||||
.input-group-addon:last-child, |
||||
.input-group-btn:last-child > .btn, |
||||
.input-group-btn:last-child > .btn-group > .btn, |
||||
.input-group-btn:last-child > .dropdown-toggle, |
||||
.input-group-btn:first-child > .btn:not(:first-child), |
||||
.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { |
||||
.border-left-radius(0); |
||||
} |
||||
.input-group-addon:last-child { |
||||
border-left: 0; |
||||
} |
||||
|
||||
// Button input groups |
||||
// ------------------------- |
||||
.input-group-btn { |
||||
position: relative; |
||||
// Jankily prevent input button groups from wrapping with `white-space` and |
||||
// `font-size` in combination with `inline-block` on buttons. |
||||
font-size: 0; |
||||
white-space: nowrap; |
||||
|
||||
// Negative margin for spacing, position for bringing hovered/focused/actived |
||||
// element above the siblings. |
||||
> .btn { |
||||
position: relative; |
||||
+ .btn { |
||||
margin-left: -1px; |
||||
} |
||||
// Bring the "active" button to the front |
||||
&:hover, |
||||
&:focus, |
||||
&:active { |
||||
z-index: 2; |
||||
} |
||||
} |
||||
|
||||
// Negative margin to only have a 1px border between the two |
||||
&:first-child { |
||||
> .btn, |
||||
> .btn-group { |
||||
margin-right: -1px; |
||||
} |
||||
} |
||||
&:last-child { |
||||
> .btn, |
||||
> .btn-group { |
||||
margin-left: -1px; |
||||
} |
||||
} |
||||
} |
@ -1,50 +0,0 @@
@@ -1,50 +0,0 @@
|
||||
// |
||||
// Jumbotron |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
.jumbotron { |
||||
padding: @jumbotron-padding (@jumbotron-padding / 2); |
||||
margin-bottom: @jumbotron-padding; |
||||
color: @jumbotron-color; |
||||
background-color: @jumbotron-bg; |
||||
|
||||
h1, |
||||
.h1 { |
||||
color: @jumbotron-heading-color; |
||||
} |
||||
|
||||
p { |
||||
margin-bottom: (@jumbotron-padding / 2); |
||||
font-size: @jumbotron-font-size; |
||||
font-weight: 200; |
||||
} |
||||
|
||||
> hr { |
||||
border-top-color: darken(@jumbotron-bg, 10%); |
||||
} |
||||
|
||||
.tb-container &, |
||||
.container-fluid & { |
||||
border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container |
||||
} |
||||
|
||||
.tb-container { |
||||
max-width: 100%; |
||||
} |
||||
|
||||
@media screen and (min-width: @screen-sm-min) { |
||||
padding: (@jumbotron-padding * 1.6) 0; |
||||
|
||||
.tb-container &, |
||||
.container-fluid & { |
||||
padding-left: (@jumbotron-padding * 2); |
||||
padding-right: (@jumbotron-padding * 2); |
||||
} |
||||
|
||||
h1, |
||||
.h1 { |
||||
font-size: (@font-size-base * 4.5); |
||||
} |
||||
} |
||||
} |
@ -1,64 +0,0 @@
@@ -1,64 +0,0 @@
|
||||
// |
||||
// Labels |
||||
// -------------------------------------------------- |
||||
|
||||
.label { |
||||
display: inline; |
||||
padding: .2em .6em .3em; |
||||
font-size: 75%; |
||||
font-weight: bold; |
||||
line-height: 1; |
||||
color: @label-color; |
||||
text-align: center; |
||||
white-space: nowrap; |
||||
vertical-align: baseline; |
||||
border-radius: .25em; |
||||
|
||||
// Add hover effects, but only for links |
||||
a& { |
||||
&:hover, |
||||
&:focus { |
||||
color: @label-link-hover-color; |
||||
text-decoration: none; |
||||
cursor: pointer; |
||||
} |
||||
} |
||||
|
||||
// Empty labels collapse automatically (not available in IE8) |
||||
&:empty { |
||||
display: none; |
||||
} |
||||
|
||||
// Quick fix for labels in buttons |
||||
.btn & { |
||||
position: relative; |
||||
top: -1px; |
||||
} |
||||
} |
||||
|
||||
// Colors |
||||
// Contextual variations (linked labels get darker on :hover) |
||||
|
||||
.label-default { |
||||
.label-variant(@label-default-bg); |
||||
} |
||||
|
||||
.label-primary { |
||||
.label-variant(@label-primary-bg); |
||||
} |
||||
|
||||
.label-success { |
||||
.label-variant(@label-success-bg); |
||||
} |
||||
|
||||
.label-info { |
||||
.label-variant(@label-info-bg); |
||||
} |
||||
|
||||
.label-warning { |
||||
.label-variant(@label-warning-bg); |
||||
} |
||||
|
||||
.label-danger { |
||||
.label-variant(@label-danger-bg); |
||||
} |
@ -1,124 +0,0 @@
@@ -1,124 +0,0 @@
|
||||
// |
||||
// List groups |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Base class |
||||
// |
||||
// Easily usable on <ul>, <ol>, or <div>. |
||||
|
||||
.list-group { |
||||
// No need to set list-style: none; since .list-group-item is block level |
||||
margin-bottom: 20px; |
||||
padding-left: 0; // reset padding because ul and ol |
||||
} |
||||
|
||||
|
||||
// Individual list items |
||||
// |
||||
// Use on `li`s or `div`s within the `.list-group` parent. |
||||
|
||||
.list-group-item { |
||||
position: relative; |
||||
display: block; |
||||
padding: 10px 15px; |
||||
// Place the border on the list items and negative margin up for better styling |
||||
margin-bottom: -1px; |
||||
background-color: @list-group-bg; |
||||
border: 1px solid @list-group-border; |
||||
|
||||
// Round the first and last items |
||||
&:first-child { |
||||
.border-top-radius(@list-group-border-radius); |
||||
} |
||||
&:last-child { |
||||
margin-bottom: 0; |
||||
.border-bottom-radius(@list-group-border-radius); |
||||
} |
||||
} |
||||
|
||||
|
||||
// Linked list items |
||||
// |
||||
// Use anchor elements instead of `li`s or `div`s to create linked list items. |
||||
// Includes an extra `.active` modifier class for showing selected items. |
||||
|
||||
a.list-group-item { |
||||
color: @list-group-link-color; |
||||
|
||||
.list-group-item-heading { |
||||
color: @list-group-link-heading-color; |
||||
} |
||||
|
||||
// Hover state |
||||
&:hover, |
||||
&:focus { |
||||
text-decoration: none; |
||||
color: @list-group-link-hover-color; |
||||
background-color: @list-group-hover-bg; |
||||
} |
||||
} |
||||
|
||||
.list-group-item { |
||||
// Disabled state |
||||
&.disabled, |
||||
&.disabled:hover, |
||||
&.disabled:focus { |
||||
background-color: @list-group-disabled-bg; |
||||
color: @list-group-disabled-color; |
||||
cursor: @cursor-disabled; |
||||
|
||||
// Force color to inherit for custom content |
||||
.list-group-item-heading { |
||||
color: inherit; |
||||
} |
||||
.list-group-item-text { |
||||
color: @list-group-disabled-text-color; |
||||
} |
||||
} |
||||
|
||||
// Active class on item itself, not parent |
||||
&.active, |
||||
&.active:hover, |
||||
&.active:focus { |
||||
z-index: 2; // Place active items above their siblings for proper border styling |
||||
color: @list-group-active-color; |
||||
background-color: @list-group-active-bg; |
||||
border-color: @list-group-active-border; |
||||
|
||||
// Force color to inherit for custom content |
||||
.list-group-item-heading, |
||||
.list-group-item-heading > small, |
||||
.list-group-item-heading > .small { |
||||
color: inherit; |
||||
} |
||||
.list-group-item-text { |
||||
color: @list-group-active-text-color; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Contextual variants |
||||
// |
||||
// Add modifier classes to change text and background color on individual items. |
||||
// Organizationally, this must come after the `:hover` states. |
||||
|
||||
.list-group-item-variant(success; @state-success-bg; @state-success-text); |
||||
.list-group-item-variant(info; @state-info-bg; @state-info-text); |
||||
.list-group-item-variant(warning; @state-warning-bg; @state-warning-text); |
||||
.list-group-item-variant(danger; @state-danger-bg; @state-danger-text); |
||||
|
||||
|
||||
// Custom content options |
||||
// |
||||
// Extra classes for creating well-formatted content within `.list-group-item`s. |
||||
|
||||
.list-group-item-heading { |
||||
margin-top: 0; |
||||
margin-bottom: 5px; |
||||
} |
||||
.list-group-item-text { |
||||
margin-bottom: 0; |
||||
line-height: 1.3; |
||||
} |
@ -1,61 +0,0 @@
@@ -1,61 +0,0 @@
|
||||
.media { |
||||
// Proper spacing between instances of .media |
||||
margin-top: 15px; |
||||
|
||||
&:first-child { |
||||
margin-top: 0; |
||||
} |
||||
} |
||||
|
||||
.media, |
||||
.media-body { |
||||
zoom: 1; |
||||
overflow: hidden; |
||||
} |
||||
|
||||
.media-body { |
||||
width: 10000px; |
||||
} |
||||
|
||||
.media-object { |
||||
display: block; |
||||
} |
||||
|
||||
.media-right, |
||||
.media > .pull-right { |
||||
padding-left: 10px; |
||||
} |
||||
|
||||
.media-left, |
||||
.media > .pull-left { |
||||
padding-right: 10px; |
||||
} |
||||
|
||||
.media-left, |
||||
.media-right, |
||||
.media-body { |
||||
display: table-cell; |
||||
vertical-align: top; |
||||
} |
||||
|
||||
.media-middle { |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
.media-bottom { |
||||
vertical-align: bottom; |
||||
} |
||||
|
||||
// Reset margins on headings for tighter default spacing |
||||
.media-heading { |
||||
margin-top: 0; |
||||
margin-bottom: 5px; |
||||
} |
||||
|
||||
// Media list variation |
||||
// |
||||
// Undo default ul/ol styles |
||||
.media-list { |
||||
padding-left: 0; |
||||
list-style: none; |
||||
} |
@ -1,39 +0,0 @@
@@ -1,39 +0,0 @@
|
||||
// Mixins |
||||
// -------------------------------------------------- |
||||
|
||||
// Utilities |
||||
@import "mixins/hide-text.less"; |
||||
@import "mixins/opacity.less"; |
||||
@import "mixins/image.less"; |
||||
@import "mixins/labels.less"; |
||||
@import "mixins/reset-filter.less"; |
||||
@import "mixins/resize.less"; |
||||
@import "mixins/responsive-visibility.less"; |
||||
@import "mixins/size.less"; |
||||
@import "mixins/tab-focus.less"; |
||||
@import "mixins/text-emphasis.less"; |
||||
@import "mixins/text-overflow.less"; |
||||
@import "mixins/vendor-prefixes.less"; |
||||
|
||||
// Components |
||||
@import "mixins/alerts.less"; |
||||
@import "mixins/buttons.less"; |
||||
@import "mixins/panels.less"; |
||||
@import "mixins/pagination.less"; |
||||
@import "mixins/list-group.less"; |
||||
@import "mixins/nav-divider.less"; |
||||
@import "mixins/forms.less"; |
||||
@import "mixins/progress-bar.less"; |
||||
@import "mixins/table-row.less"; |
||||
|
||||
// Skins |
||||
@import "mixins/background-variant.less"; |
||||
@import "mixins/border-radius.less"; |
||||
@import "mixins/gradients.less"; |
||||
|
||||
// Layout |
||||
@import "mixins/clearfix.less"; |
||||
@import "mixins/center-block.less"; |
||||
@import "mixins/nav-vertical-align.less"; |
||||
@import "mixins/grid-framework.less"; |
||||
@import "mixins/grid.less"; |
@ -1,14 +0,0 @@
@@ -1,14 +0,0 @@
|
||||
// Alerts |
||||
|
||||
.alert-variant(@background; @border; @text-color) { |
||||
background-color: @background; |
||||
border-color: @border; |
||||
color: @text-color; |
||||
|
||||
hr { |
||||
border-top-color: darken(@border, 5%); |
||||
} |
||||
.alert-link { |
||||
color: darken(@text-color, 10%); |
||||
} |
||||
} |
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
// Contextual backgrounds |
||||
|
||||
.bg-variant(@color) { |
||||
background-color: @color; |
||||
a&:hover { |
||||
background-color: darken(@color, 10%); |
||||
} |
||||
} |
@ -1,18 +0,0 @@
@@ -1,18 +0,0 @@
|
||||
// Single side border-radius |
||||
|
||||
.border-top-radius(@radius) { |
||||
border-top-right-radius: @radius; |
||||
border-top-left-radius: @radius; |
||||
} |
||||
.border-right-radius(@radius) { |
||||
border-bottom-right-radius: @radius; |
||||
border-top-right-radius: @radius; |
||||
} |
||||
.border-bottom-radius(@radius) { |
||||
border-bottom-right-radius: @radius; |
||||
border-bottom-left-radius: @radius; |
||||
} |
||||
.border-left-radius(@radius) { |
||||
border-bottom-left-radius: @radius; |
||||
border-top-left-radius: @radius; |
||||
} |
@ -1,52 +0,0 @@
@@ -1,52 +0,0 @@
|
||||
// Button variants |
||||
// |
||||
// Easily pump out default styles, as well as :hover, :focus, :active, |
||||
// and disabled options for all buttons |
||||
|
||||
.button-variant(@color; @background; @border) { |
||||
color: @color; |
||||
background-color: @background; |
||||
border-color: @border; |
||||
|
||||
&:hover, |
||||
&:focus, |
||||
&.focus, |
||||
&:active, |
||||
&.active, |
||||
.open > .dropdown-toggle& { |
||||
color: @color; |
||||
background-color: darken(@background, 10%); |
||||
border-color: darken(@border, 12%); |
||||
} |
||||
&:active, |
||||
&.active, |
||||
.open > .dropdown-toggle& { |
||||
background-image: none; |
||||
} |
||||
&.disabled, |
||||
&[disabled], |
||||
fieldset[disabled] & { |
||||
&, |
||||
&:hover, |
||||
&:focus, |
||||
&.focus, |
||||
&:active, |
||||
&.active { |
||||
background-color: @background; |
||||
border-color: @border; |
||||
} |
||||
} |
||||
|
||||
.badge { |
||||
color: @background; |
||||
background-color: @color; |
||||
} |
||||
} |
||||
|
||||
// Button sizes |
||||
.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { |
||||
padding: @padding-vertical @padding-horizontal; |
||||
font-size: @font-size; |
||||
line-height: @line-height; |
||||
border-radius: @border-radius; |
||||
} |
@ -1,7 +0,0 @@
@@ -1,7 +0,0 @@
|
||||
// Center-align a block level element |
||||
|
||||
.center-block() { |
||||
display: block; |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
} |
@ -1,22 +0,0 @@
@@ -1,22 +0,0 @@
|
||||
// Clearfix |
||||
// |
||||
// For modern browsers |
||||
// 1. The space content is one way to avoid an Opera bug when the |
||||
// contenteditable attribute is included anywhere else in the document. |
||||
// Otherwise it causes space to appear at the top and bottom of elements |
||||
// that are clearfixed. |
||||
// 2. The use of `table` rather than `block` is only necessary if using |
||||
// `:before` to contain the top-margins of child elements. |
||||
// |
||||
// Source: http://nicolasgallagher.com/micro-clearfix-hack/ |
||||
|
||||
.clearfix() { |
||||
&:before, |
||||
&:after { |
||||
content: " "; // 1 |
||||
display: table; // 2 |
||||
} |
||||
&:after { |
||||
clear: both; |
||||
} |
||||
} |
@ -1,85 +0,0 @@
@@ -1,85 +0,0 @@
|
||||
// Form validation states |
||||
// |
||||
// Used in forms.less to generate the form validation CSS for warnings, errors, |
||||
// and successes. |
||||
|
||||
.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) { |
||||
// Color the label and help text |
||||
.help-block, |
||||
.control-label, |
||||
.radio, |
||||
.checkbox, |
||||
.radio-inline, |
||||
.checkbox-inline, |
||||
&.radio label, |
||||
&.checkbox label, |
||||
&.radio-inline label, |
||||
&.checkbox-inline label { |
||||
color: @text-color; |
||||
} |
||||
// Set the border and box shadow on specific inputs to match |
||||
.form-control { |
||||
border-color: @border-color; |
||||
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work |
||||
&:focus { |
||||
border-color: darken(@border-color, 10%); |
||||
@shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%); |
||||
.box-shadow(@shadow); |
||||
} |
||||
} |
||||
// Set validation states also for addons |
||||
.input-group-addon { |
||||
color: @text-color; |
||||
border-color: @border-color; |
||||
background-color: @background-color; |
||||
} |
||||
// Optional feedback icon |
||||
.form-control-feedback { |
||||
color: @text-color; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Form control focus state |
||||
// |
||||
// Generate a customized focus state and for any input with the specified color, |
||||
// which defaults to the `@input-border-focus` variable. |
||||
// |
||||
// We highly encourage you to not customize the default value, but instead use |
||||
// this to tweak colors on an as-needed basis. This aesthetic change is based on |
||||
// WebKit's default styles, but applicable to a wider range of browsers. Its |
||||
// usability and accessibility should be taken into account with any change. |
||||
// |
||||
// Example usage: change the default blue border and shadow to white for better |
||||
// contrast against a dark gray background. |
||||
.form-control-focus(@color: @input-border-focus) { |
||||
@color-rgba: rgba(red(@color), green(@color), blue(@color), .6); |
||||
&:focus { |
||||
border-color: @color; |
||||
outline: 0; |
||||
.box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); |
||||
} |
||||
} |
||||
|
||||
// Form control sizing |
||||
// |
||||
// Relative text size, padding, and border-radii changes for form controls. For |
||||
// horizontal sizing, wrap controls in the predefined grid classes. `<select>` |
||||
// element gets special love because it's special, and that's a fact! |
||||
.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { |
||||
height: @input-height; |
||||
padding: @padding-vertical @padding-horizontal; |
||||
font-size: @font-size; |
||||
line-height: @line-height; |
||||
border-radius: @border-radius; |
||||
|
||||
select& { |
||||
height: @input-height; |
||||
line-height: @input-height; |
||||
} |
||||
|
||||
textarea&, |
||||
select[multiple]& { |
||||
height: auto; |
||||
} |
||||
} |
@ -1,59 +0,0 @@
@@ -1,59 +0,0 @@
|
||||
// Gradients |
||||
|
||||
#gradient { |
||||
|
||||
// Horizontal gradient, from left to right |
||||
// |
||||
// Creates two color stops, start and end, by specifying a color and position for each color stop. |
||||
// Color stops are not available in IE9 and below. |
||||
.horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { |
||||
background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+ |
||||
background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12 |
||||
background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ |
||||
background-repeat: repeat-x; |
||||
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down |
||||
} |
||||
|
||||
// Vertical gradient, from top to bottom |
||||
// |
||||
// Creates two color stops, start and end, by specifying a color and position for each color stop. |
||||
// Color stops are not available in IE9 and below. |
||||
.vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { |
||||
background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+ |
||||
background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12 |
||||
background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ |
||||
background-repeat: repeat-x; |
||||
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down |
||||
} |
||||
|
||||
.directional(@start-color: #555; @end-color: #333; @deg: 45deg) { |
||||
background-repeat: repeat-x; |
||||
background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+ |
||||
background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12 |
||||
background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ |
||||
} |
||||
.horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { |
||||
background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); |
||||
background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); |
||||
background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color); |
||||
background-repeat: no-repeat; |
||||
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback |
||||
} |
||||
.vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { |
||||
background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color); |
||||
background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color); |
||||
background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color); |
||||
background-repeat: no-repeat; |
||||
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback |
||||
} |
||||
.radial(@inner-color: #555; @outer-color: #333) { |
||||
background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color); |
||||
background-image: radial-gradient(circle, @inner-color, @outer-color); |
||||
background-repeat: no-repeat; |
||||
} |
||||
.striped(@color: rgba(255,255,255,.15); @angle: 45deg) { |
||||
background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); |
||||
background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); |
||||
background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); |
||||
} |
||||
} |
@ -1,91 +0,0 @@
@@ -1,91 +0,0 @@
|
||||
// Framework grid generation |
||||
// |
||||
// Used only by Bootstrap to generate the correct number of grid classes given |
||||
// any value of `@grid-columns`. |
||||
|
||||
.make-grid-columns() { |
||||
// Common styles for all sizes of grid columns, widths 1-12 |
||||
.col(@index) { // initial |
||||
@item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; |
||||
.col((@index + 1), @item); |
||||
} |
||||
.col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo |
||||
@item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; |
||||
.col((@index + 1), ~"@{list}, @{item}"); |
||||
} |
||||
.col(@index, @list) when (@index > @grid-columns) { // terminal |
||||
@{list} { |
||||
position: relative; |
||||
// Prevent columns from collapsing when empty |
||||
min-height: 1px; |
||||
// Inner gutter via padding |
||||
padding-left: (@grid-gutter-width / 2); |
||||
padding-right: (@grid-gutter-width / 2); |
||||
} |
||||
} |
||||
.col(1); // kickstart it |
||||
} |
||||
|
||||
.float-grid-columns(@class) { |
||||
.col(@index) { // initial |
||||
@item: ~".col-@{class}-@{index}"; |
||||
.col((@index + 1), @item); |
||||
} |
||||
.col(@index, @list) when (@index =< @grid-columns) { // general |
||||
@item: ~".col-@{class}-@{index}"; |
||||
.col((@index + 1), ~"@{list}, @{item}"); |
||||
} |
||||
.col(@index, @list) when (@index > @grid-columns) { // terminal |
||||
@{list} { |
||||
float: left; |
||||
} |
||||
} |
||||
.col(1); // kickstart it |
||||
} |
||||
|
||||
.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) { |
||||
.col-@{class}-@{index} { |
||||
width: percentage((@index / @grid-columns)); |
||||
} |
||||
} |
||||
.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) { |
||||
.col-@{class}-push-@{index} { |
||||
left: percentage((@index / @grid-columns)); |
||||
} |
||||
} |
||||
.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) { |
||||
.col-@{class}-push-0 { |
||||
left: auto; |
||||
} |
||||
} |
||||
.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) { |
||||
.col-@{class}-pull-@{index} { |
||||
right: percentage((@index / @grid-columns)); |
||||
} |
||||
} |
||||
.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) { |
||||
.col-@{class}-pull-0 { |
||||
right: auto; |
||||
} |
||||
} |
||||
.calc-grid-column(@index, @class, @type) when (@type = offset) { |
||||
.col-@{class}-offset-@{index} { |
||||
margin-left: percentage((@index / @grid-columns)); |
||||
} |
||||
} |
||||
|
||||
// Basic looping in LESS |
||||
.loop-grid-columns(@index, @class, @type) when (@index >= 0) { |
||||
.calc-grid-column(@index, @class, @type); |
||||
// next iteration |
||||
.loop-grid-columns((@index - 1), @class, @type); |
||||
} |
||||
|
||||
// Create grid for specific class |
||||
.make-grid(@class) { |
||||
.float-grid-columns(@class); |
||||
.loop-grid-columns(@grid-columns, @class, width); |
||||
.loop-grid-columns(@grid-columns, @class, pull); |
||||
.loop-grid-columns(@grid-columns, @class, push); |
||||
.loop-grid-columns(@grid-columns, @class, offset); |
||||
} |
@ -1,122 +0,0 @@
@@ -1,122 +0,0 @@
|
||||
// Grid system |
||||
// |
||||
// Generate semantic grid columns with these mixins. |
||||
|
||||
// Centered container element |
||||
.container-fixed(@gutter: @grid-gutter-width) { |
||||
margin-right: auto; |
||||
margin-left: auto; |
||||
padding-left: (@gutter / 2); |
||||
padding-right: (@gutter / 2); |
||||
&:extend(.clearfix all); |
||||
} |
||||
|
||||
// Creates a wrapper for a series of columns |
||||
.make-row(@gutter: @grid-gutter-width) { |
||||
margin-left: (@gutter / -2); |
||||
margin-right: (@gutter / -2); |
||||
&:extend(.clearfix all); |
||||
} |
||||
|
||||
// Generate the extra small columns |
||||
.make-xs-column(@columns; @gutter: @grid-gutter-width) { |
||||
position: relative; |
||||
float: left; |
||||
width: percentage((@columns / @grid-columns)); |
||||
min-height: 1px; |
||||
padding-left: (@gutter / 2); |
||||
padding-right: (@gutter / 2); |
||||
} |
||||
.make-xs-column-offset(@columns) { |
||||
margin-left: percentage((@columns / @grid-columns)); |
||||
} |
||||
.make-xs-column-push(@columns) { |
||||
left: percentage((@columns / @grid-columns)); |
||||
} |
||||
.make-xs-column-pull(@columns) { |
||||
right: percentage((@columns / @grid-columns)); |
||||
} |
||||
|
||||
// Generate the small columns |
||||
.make-sm-column(@columns; @gutter: @grid-gutter-width) { |
||||
position: relative; |
||||
min-height: 1px; |
||||
padding-left: (@gutter / 2); |
||||
padding-right: (@gutter / 2); |
||||
|
||||
@media (min-width: @screen-sm-min) { |
||||
float: left; |
||||
width: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
.make-sm-column-offset(@columns) { |
||||
@media (min-width: @screen-sm-min) { |
||||
margin-left: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
.make-sm-column-push(@columns) { |
||||
@media (min-width: @screen-sm-min) { |
||||
left: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
.make-sm-column-pull(@columns) { |
||||
@media (min-width: @screen-sm-min) { |
||||
right: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
|
||||
// Generate the medium columns |
||||
.make-md-column(@columns; @gutter: @grid-gutter-width) { |
||||
position: relative; |
||||
min-height: 1px; |
||||
padding-left: (@gutter / 2); |
||||
padding-right: (@gutter / 2); |
||||
|
||||
@media (min-width: @screen-md-min) { |
||||
float: left; |
||||
width: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
.make-md-column-offset(@columns) { |
||||
@media (min-width: @screen-md-min) { |
||||
margin-left: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
.make-md-column-push(@columns) { |
||||
@media (min-width: @screen-md-min) { |
||||
left: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
.make-md-column-pull(@columns) { |
||||
@media (min-width: @screen-md-min) { |
||||
right: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
|
||||
// Generate the large columns |
||||
.make-lg-column(@columns; @gutter: @grid-gutter-width) { |
||||
position: relative; |
||||
min-height: 1px; |
||||
padding-left: (@gutter / 2); |
||||
padding-right: (@gutter / 2); |
||||
|
||||
@media (min-width: @screen-lg-min) { |
||||
float: left; |
||||
width: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
.make-lg-column-offset(@columns) { |
||||
@media (min-width: @screen-lg-min) { |
||||
margin-left: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
.make-lg-column-push(@columns) { |
||||
@media (min-width: @screen-lg-min) { |
||||
left: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
||||
.make-lg-column-pull(@columns) { |
||||
@media (min-width: @screen-lg-min) { |
||||
right: percentage((@columns / @grid-columns)); |
||||
} |
||||
} |
@ -1,21 +0,0 @@
@@ -1,21 +0,0 @@
|
||||
// CSS image replacement |
||||
// |
||||
// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for |
||||
// mixins being reused as classes with the same name, this doesn't hold up. As |
||||
// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. |
||||
// |
||||
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 |
||||
|
||||
// Deprecated as of v3.0.1 (will be removed in v4) |
||||
.hide-text() { |
||||
font: ~"0/0" a; |
||||
color: transparent; |
||||
text-shadow: none; |
||||
background-color: transparent; |
||||
border: 0; |
||||
} |
||||
|
||||
// New mixin to use as of v3.0.1 |
||||
.text-hide() { |
||||
.hide-text(); |
||||
} |
@ -1,33 +0,0 @@
@@ -1,33 +0,0 @@
|
||||
// Image Mixins |
||||
// - Responsive image |
||||
// - Retina image |
||||
|
||||
|
||||
// Responsive image |
||||
// |
||||
// Keep images from scaling beyond the width of their parents. |
||||
.img-responsive(@display: block) { |
||||
display: @display; |
||||
max-width: 100%; // Part 1: Set a maximum relative to the parent |
||||
height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching |
||||
} |
||||
|
||||
|
||||
// Retina image |
||||
// |
||||
// Short retina mixin for setting background-image and -size. Note that the |
||||
// spelling of `min--moz-device-pixel-ratio` is intentional. |
||||
.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) { |
||||
background-image: url("@{file-1x}"); |
||||
|
||||
@media |
||||
only screen and (-webkit-min-device-pixel-ratio: 2), |
||||
only screen and ( min--moz-device-pixel-ratio: 2), |
||||
only screen and ( -o-min-device-pixel-ratio: 2/1), |
||||
only screen and ( min-device-pixel-ratio: 2), |
||||
only screen and ( min-resolution: 192dpi), |
||||
only screen and ( min-resolution: 2dppx) { |
||||
background-image: url("@{file-2x}"); |
||||
background-size: @width-1x @height-1x; |
||||
} |
||||
} |
@ -1,12 +0,0 @@
@@ -1,12 +0,0 @@
|
||||
// Labels |
||||
|
||||
.label-variant(@color) { |
||||
background-color: @color; |
||||
|
||||
&[href] { |
||||
&:hover, |
||||
&:focus { |
||||
background-color: darken(@color, 10%); |
||||
} |
||||
} |
||||
} |
@ -1,29 +0,0 @@
@@ -1,29 +0,0 @@
|
||||
// List Groups |
||||
|
||||
.list-group-item-variant(@state; @background; @color) { |
||||
.list-group-item-@{state} { |
||||
color: @color; |
||||
background-color: @background; |
||||
|
||||
a& { |
||||
color: @color; |
||||
|
||||
.list-group-item-heading { |
||||
color: inherit; |
||||
} |
||||
|
||||
&:hover, |
||||
&:focus { |
||||
color: @color; |
||||
background-color: darken(@background, 5%); |
||||
} |
||||
&.active, |
||||
&.active:hover, |
||||
&.active:focus { |
||||
color: #fff; |
||||
background-color: @color; |
||||
border-color: @color; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,10 +0,0 @@
@@ -1,10 +0,0 @@
|
||||
// Horizontal dividers |
||||
// |
||||
// Dividers (basically an hr) within dropdowns and nav lists |
||||
|
||||
.nav-divider(@color: #e5e5e5) { |
||||
height: 1px; |
||||
margin: ((@line-height-computed / 2) - 1) 0; |
||||
overflow: hidden; |
||||
background-color: @color; |
||||
} |
@ -1,9 +0,0 @@
@@ -1,9 +0,0 @@
|
||||
// Navbar vertical align |
||||
// |
||||
// Vertically center elements in the navbar. |
||||
// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. |
||||
|
||||
.navbar-vertical-align(@element-height) { |
||||
margin-top: ((@navbar-height - @element-height) / 2); |
||||
margin-bottom: ((@navbar-height - @element-height) / 2); |
||||
} |
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
// Opacity |
||||
|
||||
.opacity(@opacity) { |
||||
opacity: @opacity; |
||||
// IE8 filter |
||||
@opacity-ie: (@opacity * 100); |
||||
filter: ~"alpha(opacity=@{opacity-ie})"; |
||||
} |
@ -1,23 +0,0 @@
@@ -1,23 +0,0 @@
|
||||
// Pagination |
||||
|
||||
.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) { |
||||
> li { |
||||
> a, |
||||
> span { |
||||
padding: @padding-vertical @padding-horizontal; |
||||
font-size: @font-size; |
||||
} |
||||
&:first-child { |
||||
> a, |
||||
> span { |
||||
.border-left-radius(@border-radius); |
||||
} |
||||
} |
||||
&:last-child { |
||||
> a, |
||||
> span { |
||||
.border-right-radius(@border-radius); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,24 +0,0 @@
@@ -1,24 +0,0 @@
|
||||
// Panels |
||||
|
||||
.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) { |
||||
border-color: @border; |
||||
|
||||
& > .panel-heading { |
||||
color: @heading-text-color; |
||||
background-color: @heading-bg-color; |
||||
border-color: @heading-border; |
||||
|
||||
+ .panel-collapse > .panel-body { |
||||
border-top-color: @border; |
||||
} |
||||
.badge { |
||||
color: @heading-bg-color; |
||||
background-color: @heading-text-color; |
||||
} |
||||
} |
||||
& > .panel-footer { |
||||
+ .panel-collapse > .panel-body { |
||||
border-bottom-color: @border; |
||||
} |
||||
} |
||||
} |
@ -1,10 +0,0 @@
@@ -1,10 +0,0 @@
|
||||
// Progress bars |
||||
|
||||
.progress-bar-variant(@color) { |
||||
background-color: @color; |
||||
|
||||
// Deprecated parent class requirement as of v3.2.0 |
||||
.progress-striped & { |
||||
#gradient > .striped(); |
||||
} |
||||
} |
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
// Reset filters for IE |
||||
// |
||||
// When you need to remove a gradient background, do not forget to use this to reset |
||||
// the IE filter for IE9 and below. |
||||
|
||||
.reset-filter() { |
||||
filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); |
||||
} |
@ -1,6 +0,0 @@
@@ -1,6 +0,0 @@
|
||||
// Resize anything |
||||
|
||||
.resizable(@direction) { |
||||
resize: @direction; // Options: horizontal, vertical, both |
||||
overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` |
||||
} |
@ -1,15 +0,0 @@
@@ -1,15 +0,0 @@
|
||||
// Responsive utilities |
||||
|
||||
// |
||||
// More easily include all the states for responsive-utilities.less. |
||||
.responsive-visibility() { |
||||
display: block !important; |
||||
table& { display: table; } |
||||
tr& { display: table-row !important; } |
||||
th&, |
||||
td& { display: table-cell !important; } |
||||
} |
||||
|
||||
.responsive-invisibility() { |
||||
display: none !important; |
||||
} |
@ -1,10 +0,0 @@
@@ -1,10 +0,0 @@
|
||||
// Sizing shortcuts |
||||
|
||||
.size(@width; @height) { |
||||
width: @width; |
||||
height: @height; |
||||
} |
||||
|
||||
.square(@size) { |
||||
.size(@size; @size); |
||||
} |
@ -1,9 +0,0 @@
@@ -1,9 +0,0 @@
|
||||
// WebKit-style focus |
||||
|
||||
.tab-focus() { |
||||
// Default |
||||
outline: thin dotted; |
||||
// WebKit |
||||
outline: 5px auto -webkit-focus-ring-color; |
||||
outline-offset: -2px; |
||||
} |
@ -1,28 +0,0 @@
@@ -1,28 +0,0 @@
|
||||
// Tables |
||||
|
||||
.table-row-variant(@state; @background) { |
||||
// Exact selectors below required to override `.table-striped` and prevent |
||||
// inheritance to nested tables. |
||||
.table > thead > tr, |
||||
.table > tbody > tr, |
||||
.table > tfoot > tr { |
||||
> td.@{state}, |
||||
> th.@{state}, |
||||
&.@{state} > td, |
||||
&.@{state} > th { |
||||
background-color: @background; |
||||
} |
||||
} |
||||
|
||||
// Hover states for `.table-hover` |
||||
// Note: this is not available for cells or rows within `thead` or `tfoot`. |
||||
.table-hover > tbody > tr { |
||||
> td.@{state}:hover, |
||||
> th.@{state}:hover, |
||||
&.@{state}:hover > td, |
||||
&:hover > .@{state}, |
||||
&.@{state}:hover > th { |
||||
background-color: darken(@background, 5%); |
||||
} |
||||
} |
||||
} |
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
// Typography |
||||
|
||||
.text-emphasis-variant(@color) { |
||||
color: @color; |
||||
a&:hover { |
||||
color: darken(@color, 10%); |
||||
} |
||||
} |
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
// Text overflow |
||||
// Requires inline-block or block for proper styling |
||||
|
||||
.text-overflow() { |
||||
overflow: hidden; |
||||
text-overflow: ellipsis; |
||||
white-space: nowrap; |
||||
} |
@ -1,227 +0,0 @@
@@ -1,227 +0,0 @@
|
||||
// Vendor Prefixes |
||||
// |
||||
// All vendor mixins are deprecated as of v3.2.0 due to the introduction of |
||||
// Autoprefixer in our Gruntfile. They will be removed in v4. |
||||
|
||||
// - Animations |
||||
// - Backface visibility |
||||
// - Box shadow |
||||
// - Box sizing |
||||
// - Content columns |
||||
// - Hyphens |
||||
// - Placeholder text |
||||
// - Transformations |
||||
// - Transitions |
||||
// - User Select |
||||
|
||||
|
||||
// Animations |
||||
.animation(@animation) { |
||||
-webkit-animation: @animation; |
||||
-o-animation: @animation; |
||||
animation: @animation; |
||||
} |
||||
.animation-name(@name) { |
||||
-webkit-animation-name: @name; |
||||
animation-name: @name; |
||||
} |
||||
.animation-duration(@duration) { |
||||
-webkit-animation-duration: @duration; |
||||
animation-duration: @duration; |
||||
} |
||||
.animation-timing-function(@timing-function) { |
||||
-webkit-animation-timing-function: @timing-function; |
||||
animation-timing-function: @timing-function; |
||||
} |
||||
.animation-delay(@delay) { |
||||
-webkit-animation-delay: @delay; |
||||
animation-delay: @delay; |
||||
} |
||||
.animation-iteration-count(@iteration-count) { |
||||
-webkit-animation-iteration-count: @iteration-count; |
||||
animation-iteration-count: @iteration-count; |
||||
} |
||||
.animation-direction(@direction) { |
||||
-webkit-animation-direction: @direction; |
||||
animation-direction: @direction; |
||||
} |
||||
.animation-fill-mode(@fill-mode) { |
||||
-webkit-animation-fill-mode: @fill-mode; |
||||
animation-fill-mode: @fill-mode; |
||||
} |
||||
|
||||
// Backface visibility |
||||
// Prevent browsers from flickering when using CSS 3D transforms. |
||||
// Default value is `visible`, but can be changed to `hidden` |
||||
|
||||
.backface-visibility(@visibility){ |
||||
-webkit-backface-visibility: @visibility; |
||||
-moz-backface-visibility: @visibility; |
||||
backface-visibility: @visibility; |
||||
} |
||||
|
||||
// Drop shadows |
||||
// |
||||
// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's |
||||
// supported browsers that have box shadow capabilities now support it. |
||||
|
||||
.box-shadow(@shadow) { |
||||
-webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1 |
||||
box-shadow: @shadow; |
||||
} |
||||
|
||||
// Box sizing |
||||
.box-sizing(@boxmodel) { |
||||
-webkit-box-sizing: @boxmodel; |
||||
-moz-box-sizing: @boxmodel; |
||||
box-sizing: @boxmodel; |
||||
} |
||||
|
||||
// CSS3 Content Columns |
||||
.content-columns(@column-count; @column-gap: @grid-gutter-width) { |
||||
-webkit-column-count: @column-count; |
||||
-moz-column-count: @column-count; |
||||
column-count: @column-count; |
||||
-webkit-column-gap: @column-gap; |
||||
-moz-column-gap: @column-gap; |
||||
column-gap: @column-gap; |
||||
} |
||||
|
||||
// Optional hyphenation |
||||
.hyphens(@mode: auto) { |
||||
word-wrap: break-word; |
||||
-webkit-hyphens: @mode; |
||||
-moz-hyphens: @mode; |
||||
-ms-hyphens: @mode; // IE10+ |
||||
-o-hyphens: @mode; |
||||
hyphens: @mode; |
||||
} |
||||
|
||||
// Placeholder text |
||||
.placeholder(@color: @input-color-placeholder) { |
||||
// Firefox |
||||
&::-moz-placeholder { |
||||
color: @color; |
||||
opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526 |
||||
} |
||||
&:-ms-input-placeholder { color: @color; } // Internet Explorer 10+ |
||||
&::-webkit-input-placeholder { color: @color; } // Safari and Chrome |
||||
} |
||||
|
||||
// Transformations |
||||
.scale(@ratio) { |
||||
-webkit-transform: scale(@ratio); |
||||
-ms-transform: scale(@ratio); // IE9 only |
||||
-o-transform: scale(@ratio); |
||||
transform: scale(@ratio); |
||||
} |
||||
.scale(@ratioX; @ratioY) { |
||||
-webkit-transform: scale(@ratioX, @ratioY); |
||||
-ms-transform: scale(@ratioX, @ratioY); // IE9 only |
||||
-o-transform: scale(@ratioX, @ratioY); |
||||
transform: scale(@ratioX, @ratioY); |
||||
} |
||||
.scaleX(@ratio) { |
||||
-webkit-transform: scaleX(@ratio); |
||||
-ms-transform: scaleX(@ratio); // IE9 only |
||||
-o-transform: scaleX(@ratio); |
||||
transform: scaleX(@ratio); |
||||
} |
||||
.scaleY(@ratio) { |
||||
-webkit-transform: scaleY(@ratio); |
||||
-ms-transform: scaleY(@ratio); // IE9 only |
||||
-o-transform: scaleY(@ratio); |
||||
transform: scaleY(@ratio); |
||||
} |
||||
.skew(@x; @y) { |
||||
-webkit-transform: skewX(@x) skewY(@y); |
||||
-ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+ |
||||
-o-transform: skewX(@x) skewY(@y); |
||||
transform: skewX(@x) skewY(@y); |
||||
} |
||||
.translate(@x; @y) { |
||||
-webkit-transform: translate(@x, @y); |
||||
-ms-transform: translate(@x, @y); // IE9 only |
||||
-o-transform: translate(@x, @y); |
||||
transform: translate(@x, @y); |
||||
} |
||||
.translate3d(@x; @y; @z) { |
||||
-webkit-transform: translate3d(@x, @y, @z); |
||||
transform: translate3d(@x, @y, @z); |
||||
} |
||||
.rotate(@degrees) { |
||||
-webkit-transform: rotate(@degrees); |
||||
-ms-transform: rotate(@degrees); // IE9 only |
||||
-o-transform: rotate(@degrees); |
||||
transform: rotate(@degrees); |
||||
} |
||||
.rotateX(@degrees) { |
||||
-webkit-transform: rotateX(@degrees); |
||||
-ms-transform: rotateX(@degrees); // IE9 only |
||||
-o-transform: rotateX(@degrees); |
||||
transform: rotateX(@degrees); |
||||
} |
||||
.rotateY(@degrees) { |
||||
-webkit-transform: rotateY(@degrees); |
||||
-ms-transform: rotateY(@degrees); // IE9 only |
||||
-o-transform: rotateY(@degrees); |
||||
transform: rotateY(@degrees); |
||||
} |
||||
.perspective(@perspective) { |
||||
-webkit-perspective: @perspective; |
||||
-moz-perspective: @perspective; |
||||
perspective: @perspective; |
||||
} |
||||
.perspective-origin(@perspective) { |
||||
-webkit-perspective-origin: @perspective; |
||||
-moz-perspective-origin: @perspective; |
||||
perspective-origin: @perspective; |
||||
} |
||||
.transform-origin(@origin) { |
||||
-webkit-transform-origin: @origin; |
||||
-moz-transform-origin: @origin; |
||||
-ms-transform-origin: @origin; // IE9 only |
||||
transform-origin: @origin; |
||||
} |
||||
|
||||
|
||||
// Transitions |
||||
|
||||
.transition(@transition) { |
||||
-webkit-transition: @transition; |
||||
-o-transition: @transition; |
||||
transition: @transition; |
||||
} |
||||
.transition-property(@transition-property) { |
||||
-webkit-transition-property: @transition-property; |
||||
transition-property: @transition-property; |
||||
} |
||||
.transition-delay(@transition-delay) { |
||||
-webkit-transition-delay: @transition-delay; |
||||
transition-delay: @transition-delay; |
||||
} |
||||
.transition-duration(@transition-duration) { |
||||
-webkit-transition-duration: @transition-duration; |
||||
transition-duration: @transition-duration; |
||||
} |
||||
.transition-timing-function(@timing-function) { |
||||
-webkit-transition-timing-function: @timing-function; |
||||
transition-timing-function: @timing-function; |
||||
} |
||||
.transition-transform(@transition) { |
||||
-webkit-transition: -webkit-transform @transition; |
||||
-moz-transition: -moz-transform @transition; |
||||
-o-transition: -o-transform @transition; |
||||
transition: transform @transition; |
||||
} |
||||
|
||||
|
||||
// User select |
||||
// For selecting text on the page |
||||
|
||||
.user-select(@select) { |
||||
-webkit-user-select: @select; |
||||
-moz-user-select: @select; |
||||
-ms-user-select: @select; // IE10+ |
||||
user-select: @select; |
||||
} |
@ -1,150 +0,0 @@
@@ -1,150 +0,0 @@
|
||||
// |
||||
// Modals |
||||
// -------------------------------------------------- |
||||
|
||||
// .modal-open - body class for killing the scroll |
||||
// .modal - container to scroll within |
||||
// .modal-dialog - positioning shell for the actual modal |
||||
// .modal-content - actual modal w/ bg and corners and shit |
||||
|
||||
// Kill the scroll on the body |
||||
.modal-open { |
||||
overflow: hidden; |
||||
} |
||||
|
||||
// Container that the modal scrolls within |
||||
.modal { |
||||
display: none; |
||||
overflow: hidden; |
||||
position: fixed; |
||||
top: 0; |
||||
right: 0; |
||||
bottom: 0; |
||||
left: 0; |
||||
z-index: @zindex-modal; |
||||
-webkit-overflow-scrolling: touch; |
||||
|
||||
// Prevent Chrome on Windows from adding a focus outline. For details, see |
||||
// https://github.com/twbs/bootstrap/pull/10951. |
||||
outline: 0; |
||||
|
||||
// When fading in the modal, animate it to slide down |
||||
&.fade .modal-dialog { |
||||
.translate(0, -25%); |
||||
.transition-transform(~"0.3s ease-out"); |
||||
} |
||||
&.in .modal-dialog { .translate(0, 0) } |
||||
} |
||||
.modal-open .modal { |
||||
overflow-x: hidden; |
||||
overflow-y: auto; |
||||
} |
||||
|
||||
// Shell div to position the modal with bottom padding |
||||
.modal-dialog { |
||||
position: relative; |
||||
width: auto; |
||||
margin: 10px; |
||||
} |
||||
|
||||
// Actual modal |
||||
.modal-content { |
||||
position: relative; |
||||
background-color: @modal-content-bg; |
||||
border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc) |
||||
border: 1px solid @modal-content-border-color; |
||||
border-radius: @border-radius-large; |
||||
.box-shadow(0 3px 9px rgba(0,0,0,.5)); |
||||
background-clip: padding-box; |
||||
// Remove focus outline from opened modal |
||||
outline: 0; |
||||
} |
||||
|
||||
// Modal background |
||||
.modal-backdrop { |
||||
position: fixed; |
||||
top: 0; |
||||
right: 0; |
||||
bottom: 0; |
||||
left: 0; |
||||
z-index: @zindex-modal-background; |
||||
background-color: @modal-backdrop-bg; |
||||
// Fade for backdrop |
||||
&.fade { .opacity(0); } |
||||
&.in { .opacity(@modal-backdrop-opacity); } |
||||
} |
||||
|
||||
// Modal header |
||||
// Top section of the modal w/ title and dismiss |
||||
.modal-header { |
||||
padding: @modal-title-padding; |
||||
border-bottom: 1px solid @modal-header-border-color; |
||||
min-height: (@modal-title-padding + @modal-title-line-height); |
||||
} |
||||
// Close icon |
||||
.modal-header .close { |
||||
margin-top: -2px; |
||||
} |
||||
|
||||
// Title text within header |
||||
.modal-title { |
||||
margin: 0; |
||||
line-height: @modal-title-line-height; |
||||
} |
||||
|
||||
// Modal body |
||||
// Where all modal content resides (sibling of .modal-header and .modal-footer) |
||||
.modal-body { |
||||
position: relative; |
||||
padding: @modal-inner-padding; |
||||
} |
||||
|
||||
// Footer (for actions) |
||||
.modal-footer { |
||||
padding: @modal-inner-padding; |
||||
text-align: right; // right align buttons |
||||
border-top: 1px solid @modal-footer-border-color; |
||||
&:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons |
||||
|
||||
// Properly space out buttons |
||||
.btn + .btn { |
||||
margin-left: 5px; |
||||
margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs |
||||
} |
||||
// but override that for button groups |
||||
.btn-group .btn + .btn { |
||||
margin-left: -1px; |
||||
} |
||||
// and override it for block buttons as well |
||||
.btn-block + .btn-block { |
||||
margin-left: 0; |
||||
} |
||||
} |
||||
|
||||
// Measure scrollbar width for padding body during modal show/hide |
||||
.modal-scrollbar-measure { |
||||
position: absolute; |
||||
top: -9999px; |
||||
width: 50px; |
||||
height: 50px; |
||||
overflow: scroll; |
||||
} |
||||
|
||||
// Scale up the modal |
||||
@media (min-width: @screen-sm-min) { |
||||
// Automatically set modal's width for larger viewports |
||||
.modal-dialog { |
||||
width: @modal-md; |
||||
margin: 30px auto; |
||||
} |
||||
.modal-content { |
||||
.box-shadow(0 5px 15px rgba(0,0,0,.5)); |
||||
} |
||||
|
||||
// Modal sizes |
||||
.modal-sm { width: @modal-sm; } |
||||
} |
||||
|
||||
@media (min-width: @screen-md-min) { |
||||
.modal-lg { width: @modal-lg; } |
||||
} |
@ -1,660 +0,0 @@
@@ -1,660 +0,0 @@
|
||||
// |
||||
// Navbars |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Wrapper and base class |
||||
// |
||||
// Provide a static navbar from which we expand to create full-width, fixed, and |
||||
// other navbar variations. |
||||
|
||||
.navbar { |
||||
position: relative; |
||||
min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode) |
||||
margin-bottom: @navbar-margin-bottom; |
||||
border: 1px solid transparent; |
||||
|
||||
// Prevent floats from breaking the navbar |
||||
&:extend(.clearfix all); |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
border-radius: @navbar-border-radius; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Navbar heading |
||||
// |
||||
// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy |
||||
// styling of responsive aspects. |
||||
|
||||
.navbar-header { |
||||
&:extend(.clearfix all); |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
float: left; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Navbar collapse (body) |
||||
// |
||||
// Group your navbar content into this for easy collapsing and expanding across |
||||
// various device sizes. By default, this content is collapsed when <768px, but |
||||
// will expand past that for a horizontal display. |
||||
// |
||||
// To start (on mobile devices) the navbar links, forms, and buttons are stacked |
||||
// vertically and include a `max-height` to overflow in case you have too much |
||||
// content for the user's viewport. |
||||
|
||||
.navbar-collapse { |
||||
overflow-x: visible; |
||||
padding-right: @navbar-padding-horizontal; |
||||
padding-left: @navbar-padding-horizontal; |
||||
border-top: 1px solid transparent; |
||||
box-shadow: inset 0 1px 0 rgba(255,255,255,.1); |
||||
&:extend(.clearfix all); |
||||
-webkit-overflow-scrolling: touch; |
||||
|
||||
&.in { |
||||
overflow-y: auto; |
||||
} |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
width: auto; |
||||
border-top: 0; |
||||
box-shadow: none; |
||||
|
||||
&.collapse { |
||||
display: block !important; |
||||
height: auto !important; |
||||
padding-bottom: 0; // Override default setting |
||||
overflow: visible !important; |
||||
} |
||||
|
||||
&.in { |
||||
overflow-y: visible; |
||||
} |
||||
|
||||
// Undo the collapse side padding for navbars with containers to ensure |
||||
// alignment of right-aligned contents. |
||||
.navbar-fixed-top &, |
||||
.navbar-static-top &, |
||||
.navbar-fixed-bottom & { |
||||
padding-left: 0; |
||||
padding-right: 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
.navbar-fixed-top, |
||||
.navbar-fixed-bottom { |
||||
.navbar-collapse { |
||||
max-height: @navbar-collapse-max-height; |
||||
|
||||
@media (max-device-width: @screen-xs-min) and (orientation: landscape) { |
||||
max-height: 200px; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Both navbar header and collapse |
||||
// |
||||
// When a container is present, change the behavior of the header and collapse. |
||||
|
||||
.tb-container, |
||||
.container-fluid { |
||||
> .navbar-header, |
||||
> .navbar-collapse { |
||||
margin-right: -@navbar-padding-horizontal; |
||||
margin-left: -@navbar-padding-horizontal; |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
margin-right: 0; |
||||
margin-left: 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// |
||||
// Navbar alignment options |
||||
// |
||||
// Display the navbar across the entirety of the page or fixed it to the top or |
||||
// bottom of the page. |
||||
|
||||
// Static top (unfixed, but 100% wide) navbar |
||||
.navbar-static-top { |
||||
z-index: @zindex-navbar; |
||||
border-width: 0 0 1px; |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
border-radius: 0; |
||||
} |
||||
} |
||||
|
||||
// Fix the top/bottom navbars when screen real estate supports it |
||||
.navbar-fixed-top, |
||||
.navbar-fixed-bottom { |
||||
position: fixed; |
||||
right: 0; |
||||
left: 0; |
||||
z-index: @zindex-navbar-fixed; |
||||
|
||||
// Undo the rounded corners |
||||
@media (min-width: @grid-float-breakpoint) { |
||||
border-radius: 0; |
||||
} |
||||
} |
||||
.navbar-fixed-top { |
||||
top: 0; |
||||
border-width: 0 0 1px; |
||||
} |
||||
.navbar-fixed-bottom { |
||||
bottom: 0; |
||||
margin-bottom: 0; // override .navbar defaults |
||||
border-width: 1px 0 0; |
||||
} |
||||
|
||||
|
||||
// Brand/project name |
||||
|
||||
.navbar-brand { |
||||
float: left; |
||||
padding: @navbar-padding-vertical @navbar-padding-horizontal; |
||||
font-size: @font-size-large; |
||||
line-height: @line-height-computed; |
||||
height: @navbar-height; |
||||
|
||||
&:hover, |
||||
&:focus { |
||||
text-decoration: none; |
||||
} |
||||
|
||||
> img { |
||||
display: block; |
||||
} |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
.navbar > .tb-container &, |
||||
.navbar > .container-fluid & { |
||||
margin-left: -@navbar-padding-horizontal; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Navbar toggle |
||||
// |
||||
// Custom button for toggling the `.navbar-collapse`, powered by the collapse |
||||
// JavaScript plugin. |
||||
|
||||
.navbar-toggle { |
||||
position: relative; |
||||
float: right; |
||||
margin-right: @navbar-padding-horizontal; |
||||
padding: 9px 10px; |
||||
.navbar-vertical-align(34px); |
||||
background-color: transparent; |
||||
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 |
||||
border: 1px solid transparent; |
||||
border-radius: @border-radius-base; |
||||
|
||||
// We remove the `outline` here, but later compensate by attaching `:hover` |
||||
// styles to `:focus`. |
||||
&:focus { |
||||
outline: 0; |
||||
} |
||||
|
||||
// Bars |
||||
.icon-bar { |
||||
display: block; |
||||
width: 22px; |
||||
height: 2px; |
||||
border-radius: 1px; |
||||
} |
||||
.icon-bar + .icon-bar { |
||||
margin-top: 4px; |
||||
} |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
display: none; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Navbar nav links |
||||
// |
||||
// Builds on top of the `.nav` components with its own modifier class to make |
||||
// the nav the full height of the horizontal nav (above 768px). |
||||
|
||||
.navbar-nav { |
||||
margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal; |
||||
|
||||
> li > a { |
||||
padding-top: 10px; |
||||
padding-bottom: 10px; |
||||
line-height: @line-height-computed; |
||||
} |
||||
|
||||
@media (max-width: @grid-float-breakpoint-max) { |
||||
// Dropdowns get custom display when collapsed |
||||
.open .dropdown-menu { |
||||
position: static; |
||||
float: none; |
||||
width: auto; |
||||
margin-top: 0; |
||||
background-color: transparent; |
||||
border: 0; |
||||
box-shadow: none; |
||||
> li > a, |
||||
.dropdown-header { |
||||
padding: 5px 15px 5px 25px; |
||||
} |
||||
> li > a { |
||||
line-height: @line-height-computed; |
||||
&:hover, |
||||
&:focus { |
||||
background-image: none; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Uncollapse the nav |
||||
@media (min-width: @grid-float-breakpoint) { |
||||
float: left; |
||||
margin: 0; |
||||
|
||||
> li { |
||||
float: left; |
||||
> a { |
||||
padding-top: @navbar-padding-vertical; |
||||
padding-bottom: @navbar-padding-vertical; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Navbar form |
||||
// |
||||
// Extension of the `.form-inline` with some extra flavor for optimum display in |
||||
// our navbars. |
||||
|
||||
.navbar-form { |
||||
margin-left: -@navbar-padding-horizontal; |
||||
margin-right: -@navbar-padding-horizontal; |
||||
padding: 10px @navbar-padding-horizontal; |
||||
border-top: 1px solid transparent; |
||||
border-bottom: 1px solid transparent; |
||||
@shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); |
||||
.box-shadow(@shadow); |
||||
|
||||
// Mixin behavior for optimum display |
||||
.form-inline(); |
||||
|
||||
.form-group { |
||||
@media (max-width: @grid-float-breakpoint-max) { |
||||
margin-bottom: 5px; |
||||
|
||||
&:last-child { |
||||
margin-bottom: 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Vertically center in expanded, horizontal navbar |
||||
.navbar-vertical-align(@input-height-base); |
||||
|
||||
// Undo 100% width for pull classes |
||||
@media (min-width: @grid-float-breakpoint) { |
||||
width: auto; |
||||
border: 0; |
||||
margin-left: 0; |
||||
margin-right: 0; |
||||
padding-top: 0; |
||||
padding-bottom: 0; |
||||
.box-shadow(none); |
||||
} |
||||
} |
||||
|
||||
|
||||
// Dropdown menus |
||||
|
||||
// Menu position and menu carets |
||||
.navbar-nav > li > .dropdown-menu { |
||||
margin-top: 0; |
||||
.border-top-radius(0); |
||||
} |
||||
// Menu position and menu caret support for dropups via extra dropup class |
||||
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { |
||||
margin-bottom: 0; |
||||
.border-top-radius(@navbar-border-radius); |
||||
.border-bottom-radius(0); |
||||
} |
||||
|
||||
|
||||
// Buttons in navbars |
||||
// |
||||
// Vertically center a button within a navbar (when *not* in a form). |
||||
|
||||
.navbar-btn { |
||||
.navbar-vertical-align(@input-height-base); |
||||
|
||||
&.btn-sm { |
||||
.navbar-vertical-align(@input-height-small); |
||||
} |
||||
&.btn-xs { |
||||
.navbar-vertical-align(22); |
||||
} |
||||
} |
||||
|
||||
|
||||
// Text in navbars |
||||
// |
||||
// Add a class to make any element properly align itself vertically within the navbars. |
||||
|
||||
.navbar-text { |
||||
.navbar-vertical-align(@line-height-computed); |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
float: left; |
||||
margin-left: @navbar-padding-horizontal; |
||||
margin-right: @navbar-padding-horizontal; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Component alignment |
||||
// |
||||
// Repurpose the pull utilities as their own navbar utilities to avoid specificity |
||||
// issues with parents and chaining. Only do this when the navbar is uncollapsed |
||||
// though so that navbar contents properly stack and align in mobile. |
||||
// |
||||
// Declared after the navbar components to ensure more specificity on the margins. |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
.navbar-left { .pull-left(); } |
||||
.navbar-right { |
||||
.pull-right(); |
||||
margin-right: -@navbar-padding-horizontal; |
||||
|
||||
~ .navbar-right { |
||||
margin-right: 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Alternate navbars |
||||
// -------------------------------------------------- |
||||
|
||||
// Default navbar |
||||
.navbar-default { |
||||
background-color: @navbar-default-bg; |
||||
border-color: @navbar-default-border; |
||||
|
||||
.navbar-brand { |
||||
color: @navbar-default-brand-color; |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-default-brand-hover-color; |
||||
background-color: @navbar-default-brand-hover-bg; |
||||
} |
||||
} |
||||
|
||||
.navbar-text { |
||||
color: @navbar-default-color; |
||||
} |
||||
|
||||
.navbar-nav { |
||||
> li > a { |
||||
color: @navbar-default-link-color; |
||||
|
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-default-link-hover-color; |
||||
background-color: @navbar-default-link-hover-bg; |
||||
} |
||||
} |
||||
> .active > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-default-link-active-color; |
||||
background-color: @navbar-default-link-active-bg; |
||||
} |
||||
} |
||||
> .disabled > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-default-link-disabled-color; |
||||
background-color: @navbar-default-link-disabled-bg; |
||||
} |
||||
} |
||||
} |
||||
|
||||
.navbar-toggle { |
||||
border-color: @navbar-default-toggle-border-color; |
||||
&:hover, |
||||
&:focus { |
||||
background-color: @navbar-default-toggle-hover-bg; |
||||
} |
||||
.icon-bar { |
||||
background-color: @navbar-default-toggle-icon-bar-bg; |
||||
} |
||||
} |
||||
|
||||
.navbar-collapse, |
||||
.navbar-form { |
||||
border-color: @navbar-default-border; |
||||
} |
||||
|
||||
// Dropdown menu items |
||||
.navbar-nav { |
||||
// Remove background color from open dropdown |
||||
> .open > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
background-color: @navbar-default-link-active-bg; |
||||
color: @navbar-default-link-active-color; |
||||
} |
||||
} |
||||
|
||||
@media (max-width: @grid-float-breakpoint-max) { |
||||
// Dropdowns get custom display when collapsed |
||||
.open .dropdown-menu { |
||||
> li > a { |
||||
color: @navbar-default-link-color; |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-default-link-hover-color; |
||||
background-color: @navbar-default-link-hover-bg; |
||||
} |
||||
} |
||||
> .active > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-default-link-active-color; |
||||
background-color: @navbar-default-link-active-bg; |
||||
} |
||||
} |
||||
> .disabled > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-default-link-disabled-color; |
||||
background-color: @navbar-default-link-disabled-bg; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Links in navbars |
||||
// |
||||
// Add a class to ensure links outside the navbar nav are colored correctly. |
||||
|
||||
.navbar-link { |
||||
color: @navbar-default-link-color; |
||||
&:hover { |
||||
color: @navbar-default-link-hover-color; |
||||
} |
||||
} |
||||
|
||||
.btn-link { |
||||
color: @navbar-default-link-color; |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-default-link-hover-color; |
||||
} |
||||
&[disabled], |
||||
fieldset[disabled] & { |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-default-link-disabled-color; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Inverse navbar |
||||
|
||||
.navbar-inverse { |
||||
background-color: @navbar-inverse-bg; |
||||
border-color: @navbar-inverse-border; |
||||
|
||||
.navbar-brand { |
||||
color: @navbar-inverse-brand-color; |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-inverse-brand-hover-color; |
||||
background-color: @navbar-inverse-brand-hover-bg; |
||||
} |
||||
} |
||||
|
||||
.navbar-text { |
||||
color: @navbar-inverse-color; |
||||
} |
||||
|
||||
.navbar-nav { |
||||
> li > a { |
||||
color: @navbar-inverse-link-color; |
||||
|
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-inverse-link-hover-color; |
||||
background-color: @navbar-inverse-link-hover-bg; |
||||
} |
||||
} |
||||
> .active > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-inverse-link-active-color; |
||||
background-color: @navbar-inverse-link-active-bg; |
||||
} |
||||
} |
||||
> .disabled > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-inverse-link-disabled-color; |
||||
background-color: @navbar-inverse-link-disabled-bg; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Darken the responsive nav toggle |
||||
.navbar-toggle { |
||||
border-color: @navbar-inverse-toggle-border-color; |
||||
&:hover, |
||||
&:focus { |
||||
background-color: @navbar-inverse-toggle-hover-bg; |
||||
} |
||||
.icon-bar { |
||||
background-color: @navbar-inverse-toggle-icon-bar-bg; |
||||
} |
||||
} |
||||
|
||||
.navbar-collapse, |
||||
.navbar-form { |
||||
border-color: darken(@navbar-inverse-bg, 7%); |
||||
} |
||||
|
||||
// Dropdowns |
||||
.navbar-nav { |
||||
> .open > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
background-color: @navbar-inverse-link-active-bg; |
||||
color: @navbar-inverse-link-active-color; |
||||
} |
||||
} |
||||
|
||||
@media (max-width: @grid-float-breakpoint-max) { |
||||
// Dropdowns get custom display |
||||
.open .dropdown-menu { |
||||
> .dropdown-header { |
||||
border-color: @navbar-inverse-border; |
||||
} |
||||
.divider { |
||||
background-color: @navbar-inverse-border; |
||||
} |
||||
> li > a { |
||||
color: @navbar-inverse-link-color; |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-inverse-link-hover-color; |
||||
background-color: @navbar-inverse-link-hover-bg; |
||||
} |
||||
} |
||||
> .active > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-inverse-link-active-color; |
||||
background-color: @navbar-inverse-link-active-bg; |
||||
} |
||||
} |
||||
> .disabled > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-inverse-link-disabled-color; |
||||
background-color: @navbar-inverse-link-disabled-bg; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
.navbar-link { |
||||
color: @navbar-inverse-link-color; |
||||
&:hover { |
||||
color: @navbar-inverse-link-hover-color; |
||||
} |
||||
} |
||||
|
||||
.btn-link { |
||||
color: @navbar-inverse-link-color; |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-inverse-link-hover-color; |
||||
} |
||||
&[disabled], |
||||
fieldset[disabled] & { |
||||
&:hover, |
||||
&:focus { |
||||
color: @navbar-inverse-link-disabled-color; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,242 +0,0 @@
@@ -1,242 +0,0 @@
|
||||
// |
||||
// Navs |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Base class |
||||
// -------------------------------------------------- |
||||
|
||||
.nav { |
||||
margin-bottom: 0; |
||||
padding-left: 0; // Override default ul/ol |
||||
list-style: none; |
||||
&:extend(.clearfix all); |
||||
|
||||
> li { |
||||
position: relative; |
||||
display: block; |
||||
|
||||
> a { |
||||
position: relative; |
||||
display: block; |
||||
padding: @nav-link-padding; |
||||
&:hover, |
||||
&:focus { |
||||
text-decoration: none; |
||||
background-color: @nav-link-hover-bg; |
||||
} |
||||
} |
||||
|
||||
// Disabled state sets text to gray and nukes hover/tab effects |
||||
&.disabled > a { |
||||
color: @nav-disabled-link-color; |
||||
|
||||
&:hover, |
||||
&:focus { |
||||
color: @nav-disabled-link-hover-color; |
||||
text-decoration: none; |
||||
background-color: transparent; |
||||
cursor: @cursor-disabled; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Open dropdowns |
||||
.open > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
background-color: @nav-link-hover-bg; |
||||
border-color: @link-color; |
||||
} |
||||
} |
||||
|
||||
// Nav dividers (deprecated with v3.0.1) |
||||
// |
||||
// This should have been removed in v3 with the dropping of `.nav-list`, but |
||||
// we missed it. We don't currently support this anywhere, but in the interest |
||||
// of maintaining backward compatibility in case you use it, it's deprecated. |
||||
.nav-divider { |
||||
.nav-divider(); |
||||
} |
||||
|
||||
// Prevent IE8 from misplacing imgs |
||||
// |
||||
// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989 |
||||
> li > a > img { |
||||
max-width: none; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Tabs |
||||
// ------------------------- |
||||
|
||||
// Give the tabs something to sit on |
||||
.nav-tabs { |
||||
border-bottom: 1px solid @nav-tabs-border-color; |
||||
> li { |
||||
float: left; |
||||
// Make the list-items overlay the bottom border |
||||
margin-bottom: -1px; |
||||
|
||||
// Actual tabs (as links) |
||||
> a { |
||||
margin-right: 2px; |
||||
line-height: @line-height-base; |
||||
border: 1px solid transparent; |
||||
border-radius: @border-radius-base @border-radius-base 0 0; |
||||
&:hover { |
||||
border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color; |
||||
} |
||||
} |
||||
|
||||
// Active state, and its :hover to override normal :hover |
||||
&.active > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @nav-tabs-active-link-hover-color; |
||||
background-color: @nav-tabs-active-link-hover-bg; |
||||
border: 1px solid @nav-tabs-active-link-hover-border-color; |
||||
border-bottom-color: transparent; |
||||
cursor: default; |
||||
} |
||||
} |
||||
} |
||||
// pulling this in mainly for less shorthand |
||||
&.nav-justified { |
||||
.nav-justified(); |
||||
.nav-tabs-justified(); |
||||
} |
||||
} |
||||
|
||||
|
||||
// Pills |
||||
// ------------------------- |
||||
.nav-pills { |
||||
> li { |
||||
float: left; |
||||
|
||||
// Links rendered as pills |
||||
> a { |
||||
border-radius: @nav-pills-border-radius; |
||||
} |
||||
+ li { |
||||
margin-left: 2px; |
||||
} |
||||
|
||||
// Active state |
||||
&.active > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: @nav-pills-active-link-hover-color; |
||||
background-color: @nav-pills-active-link-hover-bg; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Stacked pills |
||||
.nav-stacked { |
||||
> li { |
||||
float: none; |
||||
+ li { |
||||
margin-top: 2px; |
||||
margin-left: 0; // no need for this gap between nav items |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Nav variations |
||||
// -------------------------------------------------- |
||||
|
||||
// Justified nav links |
||||
// ------------------------- |
||||
|
||||
.nav-justified { |
||||
width: 100%; |
||||
|
||||
> li { |
||||
float: none; |
||||
> a { |
||||
text-align: center; |
||||
margin-bottom: 5px; |
||||
} |
||||
} |
||||
|
||||
> .dropdown .dropdown-menu { |
||||
top: auto; |
||||
left: auto; |
||||
} |
||||
|
||||
@media (min-width: @screen-sm-min) { |
||||
> li { |
||||
display: table-cell; |
||||
width: 1%; |
||||
> a { |
||||
margin-bottom: 0; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Move borders to anchors instead of bottom of list |
||||
// |
||||
// Mixin for adding on top the shared `.nav-justified` styles for our tabs |
||||
.nav-tabs-justified { |
||||
border-bottom: 0; |
||||
|
||||
> li > a { |
||||
// Override margin from .nav-tabs |
||||
margin-right: 0; |
||||
border-radius: @border-radius-base; |
||||
} |
||||
|
||||
> .active > a, |
||||
> .active > a:hover, |
||||
> .active > a:focus { |
||||
border: 1px solid @nav-tabs-justified-link-border-color; |
||||
} |
||||
|
||||
@media (min-width: @screen-sm-min) { |
||||
> li > a { |
||||
border-bottom: 1px solid @nav-tabs-justified-link-border-color; |
||||
border-radius: @border-radius-base @border-radius-base 0 0; |
||||
} |
||||
> .active > a, |
||||
> .active > a:hover, |
||||
> .active > a:focus { |
||||
border-bottom-color: @nav-tabs-justified-active-link-border-color; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Tabbable tabs |
||||
// ------------------------- |
||||
|
||||
// Hide tabbable panes to start, show them when `.active` |
||||
.tab-content { |
||||
> .tab-pane { |
||||
display: none; |
||||
} |
||||
> .active { |
||||
display: block; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Dropdowns |
||||
// ------------------------- |
||||
|
||||
// Specific dropdowns |
||||
.nav-tabs .dropdown-menu { |
||||
// make dropdown border overlap tab border |
||||
margin-top: -1px; |
||||
// Remove the top rounded corners here since there is a hard edge above the menu |
||||
.border-top-radius(0); |
||||
} |
@ -1,427 +0,0 @@
@@ -1,427 +0,0 @@
|
||||
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ |
||||
|
||||
// |
||||
// 1. Set default font family to sans-serif. |
||||
// 2. Prevent iOS text size adjust after orientation change, without disabling |
||||
// user zoom. |
||||
// |
||||
|
||||
html { |
||||
font-family: sans-serif; // 1 |
||||
-ms-text-size-adjust: 100%; // 2 |
||||
-webkit-text-size-adjust: 100%; // 2 |
||||
} |
||||
|
||||
// |
||||
// Remove default margin. |
||||
// |
||||
|
||||
body { |
||||
margin: 0; |
||||
} |
||||
|
||||
// HTML5 display definitions |
||||
// ========================================================================== |
||||
|
||||
// |
||||
// Correct `block` display not defined for any HTML5 element in IE 8/9. |
||||
// Correct `block` display not defined for `details` or `summary` in IE 10/11 |
||||
// and Firefox. |
||||
// Correct `block` display not defined for `main` in IE 11. |
||||
// |
||||
|
||||
article, |
||||
aside, |
||||
details, |
||||
figcaption, |
||||
figure, |
||||
footer, |
||||
header, |
||||
hgroup, |
||||
main, |
||||
menu, |
||||
nav, |
||||
section, |
||||
summary { |
||||
display: block; |
||||
} |
||||
|
||||
// |
||||
// 1. Correct `inline-block` display not defined in IE 8/9. |
||||
// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. |
||||
// |
||||
|
||||
audio, |
||||
canvas, |
||||
progress, |
||||
video { |
||||
display: inline-block; // 1 |
||||
vertical-align: baseline; // 2 |
||||
} |
||||
|
||||
// |
||||
// Prevent modern browsers from displaying `audio` without controls. |
||||
// Remove excess height in iOS 5 devices. |
||||
// |
||||
|
||||
audio:not([controls]) { |
||||
display: none; |
||||
height: 0; |
||||
} |
||||
|
||||
// |
||||
// Address `[hidden]` styling not present in IE 8/9/10. |
||||
// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. |
||||
// |
||||
|
||||
[hidden], |
||||
template { |
||||
display: none; |
||||
} |
||||
|
||||
// Links |
||||
// ========================================================================== |
||||
|
||||
// |
||||
// Remove the gray background color from active links in IE 10. |
||||
// |
||||
|
||||
a { |
||||
background-color: transparent; |
||||
} |
||||
|
||||
// |
||||
// Improve readability when focused and also mouse hovered in all browsers. |
||||
// |
||||
|
||||
a:active, |
||||
a:hover { |
||||
outline: 0; |
||||
} |
||||
|
||||
// Text-level semantics |
||||
// ========================================================================== |
||||
|
||||
// |
||||
// Address styling not present in IE 8/9/10/11, Safari, and Chrome. |
||||
// |
||||
|
||||
abbr[title] { |
||||
border-bottom: 1px dotted; |
||||
} |
||||
|
||||
// |
||||
// Address style set to `bolder` in Firefox 4+, Safari, and Chrome. |
||||
// |
||||
|
||||
b, |
||||
strong { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
// |
||||
// Address styling not present in Safari and Chrome. |
||||
// |
||||
|
||||
dfn { |
||||
font-style: italic; |
||||
} |
||||
|
||||
// |
||||
// Address variable `h1` font-size and margin within `section` and `article` |
||||
// contexts in Firefox 4+, Safari, and Chrome. |
||||
// |
||||
|
||||
h1 { |
||||
font-size: 2em; |
||||
margin: 0.67em 0; |
||||
} |
||||
|
||||
// |
||||
// Address styling not present in IE 8/9. |
||||
// |
||||
|
||||
mark { |
||||
background: #ff0; |
||||
color: #000; |
||||
} |
||||
|
||||
// |
||||
// Address inconsistent and variable font size in all browsers. |
||||
// |
||||
|
||||
small { |
||||
font-size: 80%; |
||||
} |
||||
|
||||
// |
||||
// Prevent `sub` and `sup` affecting `line-height` in all browsers. |
||||
// |
||||
|
||||
sub, |
||||
sup { |
||||
font-size: 75%; |
||||
line-height: 0; |
||||
position: relative; |
||||
vertical-align: baseline; |
||||
} |
||||
|
||||
sup { |
||||
top: -0.5em; |
||||
} |
||||
|
||||
sub { |
||||
bottom: -0.25em; |
||||
} |
||||
|
||||
// Embedded content |
||||
// ========================================================================== |
||||
|
||||
// |
||||
// Remove border when inside `a` element in IE 8/9/10. |
||||
// |
||||
|
||||
img { |
||||
border: 0; |
||||
} |
||||
|
||||
// |
||||
// Correct overflow not hidden in IE 9/10/11. |
||||
// |
||||
|
||||
svg:not(:root) { |
||||
overflow: hidden; |
||||
} |
||||
|
||||
// Grouping content |
||||
// ========================================================================== |
||||
|
||||
// |
||||
// Address margin not present in IE 8/9 and Safari. |
||||
// |
||||
|
||||
figure { |
||||
margin: 1em 40px; |
||||
} |
||||
|
||||
// |
||||
// Address differences between Firefox and other browsers. |
||||
// |
||||
|
||||
hr { |
||||
-moz-box-sizing: content-box; |
||||
box-sizing: content-box; |
||||
height: 0; |
||||
} |
||||
|
||||
// |
||||
// Contain overflow in all browsers. |
||||
// |
||||
|
||||
pre { |
||||
overflow: auto; |
||||
} |
||||
|
||||
// |
||||
// Address odd `em`-unit font size rendering in all browsers. |
||||
// |
||||
|
||||
code, |
||||
kbd, |
||||
pre, |
||||
samp { |
||||
font-family: monospace, monospace; |
||||
font-size: 1em; |
||||
} |
||||
|
||||
// Forms |
||||
// ========================================================================== |
||||
|
||||
// |
||||
// Known limitation: by default, Chrome and Safari on OS X allow very limited |
||||
// styling of `select`, unless a `border` property is set. |
||||
// |
||||
|
||||
// |
||||
// 1. Correct color not being inherited. |
||||
// Known issue: affects color of disabled elements. |
||||
// 2. Correct font properties not being inherited. |
||||
// 3. Address margins set differently in Firefox 4+, Safari, and Chrome. |
||||
// |
||||
|
||||
button, |
||||
input, |
||||
optgroup, |
||||
select, |
||||
textarea { |
||||
color: inherit; // 1 |
||||
font: inherit; // 2 |
||||
margin: 0; // 3 |
||||
} |
||||
|
||||
// |
||||
// Address `overflow` set to `hidden` in IE 8/9/10/11. |
||||
// |
||||
|
||||
button { |
||||
overflow: visible; |
||||
} |
||||
|
||||
// |
||||
// Address inconsistent `text-transform` inheritance for `button` and `select`. |
||||
// All other form control elements do not inherit `text-transform` values. |
||||
// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. |
||||
// Correct `select` style inheritance in Firefox. |
||||
// |
||||
|
||||
button, |
||||
select { |
||||
text-transform: none; |
||||
} |
||||
|
||||
// |
||||
// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` |
||||
// and `video` controls. |
||||
// 2. Correct inability to style clickable `input` types in iOS. |
||||
// 3. Improve usability and consistency of cursor style between image-type |
||||
// `input` and others. |
||||
// |
||||
|
||||
button, |
||||
html input[type="button"], // 1 |
||||
input[type="reset"], |
||||
input[type="submit"] { |
||||
-webkit-appearance: button; // 2 |
||||
cursor: pointer; // 3 |
||||
} |
||||
|
||||
// |
||||
// Re-set default cursor for disabled elements. |
||||
// |
||||
|
||||
button[disabled], |
||||
html input[disabled] { |
||||
cursor: default; |
||||
} |
||||
|
||||
// |
||||
// Remove inner padding and border in Firefox 4+. |
||||
// |
||||
|
||||
button::-moz-focus-inner, |
||||
input::-moz-focus-inner { |
||||
border: 0; |
||||
padding: 0; |
||||
} |
||||
|
||||
// |
||||
// Address Firefox 4+ setting `line-height` on `input` using `!important` in |
||||
// the UA stylesheet. |
||||
// |
||||
|
||||
input { |
||||
line-height: normal; |
||||
} |
||||
|
||||
// |
||||
// It's recommended that you don't attempt to style these elements. |
||||
// Firefox's implementation doesn't respect box-sizing, padding, or width. |
||||
// |
||||
// 1. Address box sizing set to `content-box` in IE 8/9/10. |
||||
// 2. Remove excess padding in IE 8/9/10. |
||||
// |
||||
|
||||
input[type="checkbox"], |
||||
input[type="radio"] { |
||||
box-sizing: border-box; // 1 |
||||
padding: 0; // 2 |
||||
} |
||||
|
||||
// |
||||
// Fix the cursor style for Chrome's increment/decrement buttons. For certain |
||||
// `font-size` values of the `input`, it causes the cursor style of the |
||||
// decrement button to change from `default` to `text`. |
||||
// |
||||
|
||||
input[type="number"]::-webkit-inner-spin-button, |
||||
input[type="number"]::-webkit-outer-spin-button { |
||||
height: auto; |
||||
} |
||||
|
||||
// |
||||
// 1. Address `appearance` set to `searchfield` in Safari and Chrome. |
||||
// 2. Address `box-sizing` set to `border-box` in Safari and Chrome |
||||
// (include `-moz` to future-proof). |
||||
// |
||||
|
||||
input[type="search"] { |
||||
-webkit-appearance: textfield; // 1 |
||||
-moz-box-sizing: content-box; |
||||
-webkit-box-sizing: content-box; // 2 |
||||
box-sizing: content-box; |
||||
} |
||||
|
||||
// |
||||
// Remove inner padding and search cancel button in Safari and Chrome on OS X. |
||||
// Safari (but not Chrome) clips the cancel button when the search input has |
||||
// padding (and `textfield` appearance). |
||||
// |
||||
|
||||
input[type="search"]::-webkit-search-cancel-button, |
||||
input[type="search"]::-webkit-search-decoration { |
||||
-webkit-appearance: none; |
||||
} |
||||
|
||||
// |
||||
// Define consistent border, margin, and padding. |
||||
// |
||||
|
||||
fieldset { |
||||
border: 1px solid #c0c0c0; |
||||
margin: 0 2px; |
||||
padding: 0.35em 0.625em 0.75em; |
||||
} |
||||
|
||||
// |
||||
// 1. Correct `color` not being inherited in IE 8/9/10/11. |
||||
// 2. Remove padding so people aren't caught out if they zero out fieldsets. |
||||
// |
||||
|
||||
legend { |
||||
border: 0; // 1 |
||||
padding: 0; // 2 |
||||
} |
||||
|
||||
// |
||||
// Remove default vertical scrollbar in IE 8/9/10/11. |
||||
// |
||||
|
||||
textarea { |
||||
overflow: auto; |
||||
} |
||||
|
||||
// |
||||
// Don't inherit the `font-weight` (applied by a rule above). |
||||
// NOTE: the default cannot safely be changed in Chrome and Safari on OS X. |
||||
// |
||||
|
||||
optgroup { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
// Tables |
||||
// ========================================================================== |
||||
|
||||
// |
||||
// Remove most spacing between table cells. |
||||
// |
||||
|
||||
table { |
||||
border-collapse: collapse; |
||||
border-spacing: 0; |
||||
} |
||||
|
||||
td, |
||||
th { |
||||
padding: 0; |
||||
} |
@ -1,54 +0,0 @@
@@ -1,54 +0,0 @@
|
||||
// |
||||
// Pager pagination |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
.pager { |
||||
padding-left: 0; |
||||
margin: @line-height-computed 0; |
||||
list-style: none; |
||||
text-align: center; |
||||
&:extend(.clearfix all); |
||||
li { |
||||
display: inline; |
||||
> a, |
||||
> span { |
||||
display: inline-block; |
||||
padding: 5px 14px; |
||||
background-color: @pager-bg; |
||||
border: 1px solid @pager-border; |
||||
border-radius: @pager-border-radius; |
||||
} |
||||
|
||||
> a:hover, |
||||
> a:focus { |
||||
text-decoration: none; |
||||
background-color: @pager-hover-bg; |
||||
} |
||||
} |
||||
|
||||
.next { |
||||
> a, |
||||
> span { |
||||
float: right; |
||||
} |
||||
} |
||||
|
||||
.previous { |
||||
> a, |
||||
> span { |
||||
float: left; |
||||
} |
||||
} |
||||
|
||||
.disabled { |
||||
> a, |
||||
> a:hover, |
||||
> a:focus, |
||||
> span { |
||||
color: @pager-disabled-color; |
||||
background-color: @pager-bg; |
||||
cursor: @cursor-disabled; |
||||
} |
||||
} |
||||
} |
@ -1,88 +0,0 @@
@@ -1,88 +0,0 @@
|
||||
// |
||||
// Pagination (multiple pages) |
||||
// -------------------------------------------------- |
||||
.pagination { |
||||
display: inline-block; |
||||
padding-left: 0; |
||||
margin: @line-height-computed 0; |
||||
border-radius: @border-radius-base; |
||||
|
||||
> li { |
||||
display: inline; // Remove list-style and block-level defaults |
||||
> a, |
||||
> span { |
||||
position: relative; |
||||
float: left; // Collapse white-space |
||||
padding: @padding-base-vertical @padding-base-horizontal; |
||||
line-height: @line-height-base; |
||||
text-decoration: none; |
||||
color: @pagination-color; |
||||
background-color: @pagination-bg; |
||||
border: 1px solid @pagination-border; |
||||
margin-left: -1px; |
||||
} |
||||
&:first-child { |
||||
> a, |
||||
> span { |
||||
margin-left: 0; |
||||
.border-left-radius(@border-radius-base); |
||||
} |
||||
} |
||||
&:last-child { |
||||
> a, |
||||
> span { |
||||
.border-right-radius(@border-radius-base); |
||||
} |
||||
} |
||||
} |
||||
|
||||
> li > a, |
||||
> li > span { |
||||
&:hover, |
||||
&:focus { |
||||
color: @pagination-hover-color; |
||||
background-color: @pagination-hover-bg; |
||||
border-color: @pagination-hover-border; |
||||
} |
||||
} |
||||
|
||||
> .active > a, |
||||
> .active > span { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
z-index: 2; |
||||
color: @pagination-active-color; |
||||
background-color: @pagination-active-bg; |
||||
border-color: @pagination-active-border; |
||||
cursor: default; |
||||
} |
||||
} |
||||
|
||||
> .disabled { |
||||
> span, |
||||
> span:hover, |
||||
> span:focus, |
||||
> a, |
||||
> a:hover, |
||||
> a:focus { |
||||
color: @pagination-disabled-color; |
||||
background-color: @pagination-disabled-bg; |
||||
border-color: @pagination-disabled-border; |
||||
cursor: @cursor-disabled; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Sizing |
||||
// -------------------------------------------------- |
||||
|
||||
// Large |
||||
.pagination-lg { |
||||
.pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large); |
||||
} |
||||
|
||||
// Small |
||||
.pagination-sm { |
||||
.pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small); |
||||
} |
@ -1,265 +0,0 @@
@@ -1,265 +0,0 @@
|
||||
// |
||||
// Panels |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Base class |
||||
.panel { |
||||
margin-bottom: @line-height-computed; |
||||
background-color: @panel-bg; |
||||
border: 1px solid transparent; |
||||
border-radius: @panel-border-radius; |
||||
.box-shadow(0 1px 1px rgba(0,0,0,.05)); |
||||
} |
||||
|
||||
// Panel contents |
||||
.panel-body { |
||||
padding: @panel-body-padding; |
||||
&:extend(.clearfix all); |
||||
} |
||||
|
||||
// Optional heading |
||||
.panel-heading { |
||||
padding: @panel-heading-padding; |
||||
border-bottom: 1px solid transparent; |
||||
.border-top-radius((@panel-border-radius - 1)); |
||||
|
||||
> .dropdown .dropdown-toggle { |
||||
color: inherit; |
||||
} |
||||
} |
||||
|
||||
// Within heading, strip any `h*` tag of its default margins for spacing. |
||||
.panel-title { |
||||
margin-top: 0; |
||||
margin-bottom: 0; |
||||
font-size: ceil((@font-size-base * 1.125)); |
||||
color: inherit; |
||||
|
||||
> a, |
||||
> small, |
||||
> .small, |
||||
> small > a, |
||||
> .small > a { |
||||
color: inherit; |
||||
} |
||||
} |
||||
|
||||
// Optional footer (stays gray in every modifier class) |
||||
.panel-footer { |
||||
padding: @panel-footer-padding; |
||||
background-color: @panel-footer-bg; |
||||
border-top: 1px solid @panel-inner-border; |
||||
.border-bottom-radius((@panel-border-radius - 1)); |
||||
} |
||||
|
||||
|
||||
// List groups in panels |
||||
// |
||||
// By default, space out list group content from panel headings to account for |
||||
// any kind of custom content between the two. |
||||
|
||||
.panel { |
||||
> .list-group, |
||||
> .panel-collapse > .list-group { |
||||
margin-bottom: 0; |
||||
|
||||
.list-group-item { |
||||
border-width: 1px 0; |
||||
border-radius: 0; |
||||
} |
||||
|
||||
// Add border top radius for first one |
||||
&:first-child { |
||||
.list-group-item:first-child { |
||||
border-top: 0; |
||||
.border-top-radius((@panel-border-radius - 1)); |
||||
} |
||||
} |
||||
// Add border bottom radius for last one |
||||
&:last-child { |
||||
.list-group-item:last-child { |
||||
border-bottom: 0; |
||||
.border-bottom-radius((@panel-border-radius - 1)); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
// Collapse space between when there's no additional content. |
||||
.panel-heading + .list-group { |
||||
.list-group-item:first-child { |
||||
border-top-width: 0; |
||||
} |
||||
} |
||||
.list-group + .panel-footer { |
||||
border-top-width: 0; |
||||
} |
||||
|
||||
// Tables in panels |
||||
// |
||||
// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and |
||||
// watch it go full width. |
||||
|
||||
.panel { |
||||
> .table, |
||||
> .table-responsive > .table, |
||||
> .panel-collapse > .table { |
||||
margin-bottom: 0; |
||||
|
||||
caption { |
||||
padding-left: @panel-body-padding; |
||||
padding-right: @panel-body-padding; |
||||
} |
||||
} |
||||
// Add border top radius for first one |
||||
> .table:first-child, |
||||
> .table-responsive:first-child > .table:first-child { |
||||
.border-top-radius((@panel-border-radius - 1)); |
||||
|
||||
> thead:first-child, |
||||
> tbody:first-child { |
||||
> tr:first-child { |
||||
border-top-left-radius: (@panel-border-radius - 1); |
||||
border-top-right-radius: (@panel-border-radius - 1); |
||||
|
||||
td:first-child, |
||||
th:first-child { |
||||
border-top-left-radius: (@panel-border-radius - 1); |
||||
} |
||||
td:last-child, |
||||
th:last-child { |
||||
border-top-right-radius: (@panel-border-radius - 1); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
// Add border bottom radius for last one |
||||
> .table:last-child, |
||||
> .table-responsive:last-child > .table:last-child { |
||||
.border-bottom-radius((@panel-border-radius - 1)); |
||||
|
||||
> tbody:last-child, |
||||
> tfoot:last-child { |
||||
> tr:last-child { |
||||
border-bottom-left-radius: (@panel-border-radius - 1); |
||||
border-bottom-right-radius: (@panel-border-radius - 1); |
||||
|
||||
td:first-child, |
||||
th:first-child { |
||||
border-bottom-left-radius: (@panel-border-radius - 1); |
||||
} |
||||
td:last-child, |
||||
th:last-child { |
||||
border-bottom-right-radius: (@panel-border-radius - 1); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
> .panel-body + .table, |
||||
> .panel-body + .table-responsive, |
||||
> .table + .panel-body, |
||||
> .table-responsive + .panel-body { |
||||
border-top: 1px solid @table-border-color; |
||||
} |
||||
> .table > tbody:first-child > tr:first-child th, |
||||
> .table > tbody:first-child > tr:first-child td { |
||||
border-top: 0; |
||||
} |
||||
> .table-bordered, |
||||
> .table-responsive > .table-bordered { |
||||
border: 0; |
||||
> thead, |
||||
> tbody, |
||||
> tfoot { |
||||
> tr { |
||||
> th:first-child, |
||||
> td:first-child { |
||||
border-left: 0; |
||||
} |
||||
> th:last-child, |
||||
> td:last-child { |
||||
border-right: 0; |
||||
} |
||||
} |
||||
} |
||||
> thead, |
||||
> tbody { |
||||
> tr:first-child { |
||||
> td, |
||||
> th { |
||||
border-bottom: 0; |
||||
} |
||||
} |
||||
} |
||||
> tbody, |
||||
> tfoot { |
||||
> tr:last-child { |
||||
> td, |
||||
> th { |
||||
border-bottom: 0; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
> .table-responsive { |
||||
border: 0; |
||||
margin-bottom: 0; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Collapsable panels (aka, accordion) |
||||
// |
||||
// Wrap a series of panels in `.panel-group` to turn them into an accordion with |
||||
// the help of our collapse JavaScript plugin. |
||||
|
||||
.panel-group { |
||||
margin-bottom: @line-height-computed; |
||||
|
||||
// Tighten up margin so it's only between panels |
||||
.panel { |
||||
margin-bottom: 0; |
||||
border-radius: @panel-border-radius; |
||||
|
||||
+ .panel { |
||||
margin-top: 5px; |
||||
} |
||||
} |
||||
|
||||
.panel-heading { |
||||
border-bottom: 0; |
||||
|
||||
+ .panel-collapse > .panel-body, |
||||
+ .panel-collapse > .list-group { |
||||
border-top: 1px solid @panel-inner-border; |
||||
} |
||||
} |
||||
|
||||
.panel-footer { |
||||
border-top: 0; |
||||
+ .panel-collapse .panel-body { |
||||
border-bottom: 1px solid @panel-inner-border; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Contextual variations |
||||
.panel-default { |
||||
.panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border); |
||||
} |
||||
.panel-primary { |
||||
.panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border); |
||||
} |
||||
.panel-success { |
||||
.panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border); |
||||
} |
||||
.panel-info { |
||||
.panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border); |
||||
} |
||||
.panel-warning { |
||||
.panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border); |
||||
} |
||||
.panel-danger { |
||||
.panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border); |
||||
} |
@ -1,135 +0,0 @@
@@ -1,135 +0,0 @@
|
||||
// |
||||
// Popovers |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
.popover { |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
z-index: @zindex-popover; |
||||
display: none; |
||||
max-width: @popover-max-width; |
||||
padding: 1px; |
||||
// Reset font and text properties given new insertion method |
||||
font-family: @font-family-base; |
||||
font-size: @font-size-base; |
||||
font-weight: normal; |
||||
line-height: @line-height-base; |
||||
text-align: left; |
||||
background-color: @popover-bg; |
||||
background-clip: padding-box; |
||||
border: 1px solid @popover-fallback-border-color; |
||||
border: 1px solid @popover-border-color; |
||||
border-radius: @border-radius-large; |
||||
.box-shadow(0 5px 10px rgba(0,0,0,.2)); |
||||
|
||||
// Overrides for proper insertion |
||||
white-space: normal; |
||||
|
||||
// Offset the popover to account for the popover arrow |
||||
&.top { margin-top: -@popover-arrow-width; } |
||||
&.right { margin-left: @popover-arrow-width; } |
||||
&.bottom { margin-top: @popover-arrow-width; } |
||||
&.left { margin-left: -@popover-arrow-width; } |
||||
} |
||||
|
||||
.popover-title { |
||||
margin: 0; // reset heading margin |
||||
padding: 8px 14px; |
||||
font-size: @font-size-base; |
||||
background-color: @popover-title-bg; |
||||
border-bottom: 1px solid darken(@popover-title-bg, 5%); |
||||
border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0; |
||||
} |
||||
|
||||
.popover-content { |
||||
padding: 9px 14px; |
||||
} |
||||
|
||||
// Arrows |
||||
// |
||||
// .arrow is outer, .arrow:after is inner |
||||
|
||||
.popover > .arrow { |
||||
&, |
||||
&:after { |
||||
position: absolute; |
||||
display: block; |
||||
width: 0; |
||||
height: 0; |
||||
border-color: transparent; |
||||
border-style: solid; |
||||
} |
||||
} |
||||
.popover > .arrow { |
||||
border-width: @popover-arrow-outer-width; |
||||
} |
||||
.popover > .arrow:after { |
||||
border-width: @popover-arrow-width; |
||||
content: ""; |
||||
} |
||||
|
||||
.popover { |
||||
&.top > .arrow { |
||||
left: 50%; |
||||
margin-left: -@popover-arrow-outer-width; |
||||
border-bottom-width: 0; |
||||
border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback |
||||
border-top-color: @popover-arrow-outer-color; |
||||
bottom: -@popover-arrow-outer-width; |
||||
&:after { |
||||
content: " "; |
||||
bottom: 1px; |
||||
margin-left: -@popover-arrow-width; |
||||
border-bottom-width: 0; |
||||
border-top-color: @popover-arrow-color; |
||||
} |
||||
} |
||||
&.right > .arrow { |
||||
top: 50%; |
||||
left: -@popover-arrow-outer-width; |
||||
margin-top: -@popover-arrow-outer-width; |
||||
border-left-width: 0; |
||||
border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback |
||||
border-right-color: @popover-arrow-outer-color; |
||||
&:after { |
||||
content: " "; |
||||
left: 1px; |
||||
bottom: -@popover-arrow-width; |
||||
border-left-width: 0; |
||||
border-right-color: @popover-arrow-color; |
||||
} |
||||
} |
||||
&.bottom > .arrow { |
||||
left: 50%; |
||||
margin-left: -@popover-arrow-outer-width; |
||||
border-top-width: 0; |
||||
border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback |
||||
border-bottom-color: @popover-arrow-outer-color; |
||||
top: -@popover-arrow-outer-width; |
||||
&:after { |
||||
content: " "; |
||||
top: 1px; |
||||
margin-left: -@popover-arrow-width; |
||||
border-top-width: 0; |
||||
border-bottom-color: @popover-arrow-color; |
||||
} |
||||
} |
||||
|
||||
&.left > .arrow { |
||||
top: 50%; |
||||
right: -@popover-arrow-outer-width; |
||||
margin-top: -@popover-arrow-outer-width; |
||||
border-right-width: 0; |
||||
border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback |
||||
border-left-color: @popover-arrow-outer-color; |
||||
&:after { |
||||
content: " "; |
||||
right: 1px; |
||||
border-right-width: 0; |
||||
border-left-color: @popover-arrow-color; |
||||
bottom: -@popover-arrow-width; |
||||
} |
||||
} |
||||
} |
@ -1,107 +0,0 @@
@@ -1,107 +0,0 @@
|
||||
/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ |
||||
|
||||
// ========================================================================== |
||||
// Print styles. |
||||
// Inlined to avoid the additional HTTP request: h5bp.com/r |
||||
// ========================================================================== |
||||
|
||||
@media print { |
||||
*, |
||||
*:before, |
||||
*:after { |
||||
background: transparent !important; |
||||
color: #000 !important; // Black prints faster: h5bp.com/s |
||||
box-shadow: none !important; |
||||
text-shadow: none !important; |
||||
} |
||||
|
||||
a, |
||||
a:visited { |
||||
text-decoration: underline; |
||||
} |
||||
|
||||
a[href]:after { |
||||
content: " (" attr(href) ")"; |
||||
} |
||||
|
||||
abbr[title]:after { |
||||
content: " (" attr(title) ")"; |
||||
} |
||||
|
||||
// Don't show links that are fragment identifiers, |
||||
// or use the `javascript:` pseudo protocol |
||||
a[href^="#"]:after, |
||||
a[href^="javascript:"]:after { |
||||
content: ""; |
||||
} |
||||
|
||||
pre, |
||||
blockquote { |
||||
border: 1px solid #999; |
||||
page-break-inside: avoid; |
||||
} |
||||
|
||||
thead { |
||||
display: table-header-group; // h5bp.com/t |
||||
} |
||||
|
||||
tr, |
||||
img { |
||||
page-break-inside: avoid; |
||||
} |
||||
|
||||
img { |
||||
max-width: 100% !important; |
||||
} |
||||
|
||||
p, |
||||
h2, |
||||
h3 { |
||||
orphans: 3; |
||||
widows: 3; |
||||
} |
||||
|
||||
h2, |
||||
h3 { |
||||
page-break-after: avoid; |
||||
} |
||||
|
||||
// Bootstrap specific changes start |
||||
// |
||||
// Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245 |
||||
// Once fixed, we can just straight up remove this. |
||||
select { |
||||
background: #fff !important; |
||||
} |
||||
|
||||
// Bootstrap components |
||||
.navbar { |
||||
display: none; |
||||
} |
||||
.btn, |
||||
.dropup > .btn { |
||||
> .caret { |
||||
border-top-color: #000 !important; |
||||
} |
||||
} |
||||
.label { |
||||
border: 1px solid #000; |
||||
} |
||||
|
||||
.table { |
||||
border-collapse: collapse !important; |
||||
|
||||
td, |
||||
th { |
||||
background-color: #fff !important; |
||||
} |
||||
} |
||||
.table-bordered { |
||||
th, |
||||
td { |
||||
border: 1px solid #ddd !important; |
||||
} |
||||
} |
||||
|
||||
// Bootstrap specific changes end |
||||
} |
@ -1,87 +0,0 @@
@@ -1,87 +0,0 @@
|
||||
// |
||||
// Progress bars |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Bar animations |
||||
// ------------------------- |
||||
|
||||
// WebKit |
||||
@-webkit-keyframes progress-bar-stripes { |
||||
from { background-position: 40px 0; } |
||||
to { background-position: 0 0; } |
||||
} |
||||
|
||||
// Spec and IE10+ |
||||
@keyframes progress-bar-stripes { |
||||
from { background-position: 40px 0; } |
||||
to { background-position: 0 0; } |
||||
} |
||||
|
||||
|
||||
// Bar itself |
||||
// ------------------------- |
||||
|
||||
// Outer container |
||||
.progress { |
||||
overflow: hidden; |
||||
height: @line-height-computed; |
||||
margin-bottom: @line-height-computed; |
||||
background-color: @progress-bg; |
||||
border-radius: @progress-border-radius; |
||||
.box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); |
||||
} |
||||
|
||||
// Bar of progress |
||||
.progress-bar { |
||||
float: left; |
||||
width: 0%; |
||||
height: 100%; |
||||
font-size: @font-size-small; |
||||
line-height: @line-height-computed; |
||||
color: @progress-bar-color; |
||||
text-align: center; |
||||
background-color: @progress-bar-bg; |
||||
.box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); |
||||
.transition(width .6s ease); |
||||
} |
||||
|
||||
// Striped bars |
||||
// |
||||
// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the |
||||
// `.progress-bar-striped` class, which you just add to an existing |
||||
// `.progress-bar`. |
||||
.progress-striped .progress-bar, |
||||
.progress-bar-striped { |
||||
#gradient > .striped(); |
||||
background-size: 40px 40px; |
||||
} |
||||
|
||||
// Call animation for the active one |
||||
// |
||||
// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the |
||||
// `.progress-bar.active` approach. |
||||
.progress.active .progress-bar, |
||||
.progress-bar.active { |
||||
.animation(progress-bar-stripes 2s linear infinite); |
||||
} |
||||
|
||||
|
||||
// Variations |
||||
// ------------------------- |
||||
|
||||
.progress-bar-success { |
||||
.progress-bar-variant(@progress-bar-success-bg); |
||||
} |
||||
|
||||
.progress-bar-info { |
||||
.progress-bar-variant(@progress-bar-info-bg); |
||||
} |
||||
|
||||
.progress-bar-warning { |
||||
.progress-bar-variant(@progress-bar-warning-bg); |
||||
} |
||||
|
||||
.progress-bar-danger { |
||||
.progress-bar-variant(@progress-bar-danger-bg); |
||||
} |
@ -1,35 +0,0 @@
@@ -1,35 +0,0 @@
|
||||
// Embeds responsive |
||||
// |
||||
// Credit: Nicolas Gallagher and SUIT CSS. |
||||
|
||||
.embed-responsive { |
||||
position: relative; |
||||
display: block; |
||||
height: 0; |
||||
padding: 0; |
||||
overflow: hidden; |
||||
|
||||
.embed-responsive-item, |
||||
iframe, |
||||
embed, |
||||
object, |
||||
video { |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
bottom: 0; |
||||
height: 100%; |
||||
width: 100%; |
||||
border: 0; |
||||
} |
||||
} |
||||
|
||||
// Modifier class for 16:9 aspect ratio |
||||
.embed-responsive-16by9 { |
||||
padding-bottom: 56.25%; |
||||
} |
||||
|
||||
// Modifier class for 4:3 aspect ratio |
||||
.embed-responsive-4by3 { |
||||
padding-bottom: 75%; |
||||
} |
@ -1,194 +0,0 @@
@@ -1,194 +0,0 @@
|
||||
// |
||||
// Responsive: Utility classes |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// IE10 in Windows (Phone) 8 |
||||
// |
||||
// Support for responsive views via media queries is kind of borked in IE10, for |
||||
// Surface/desktop in split view and for Windows Phone 8. This particular fix |
||||
// must be accompanied by a snippet of JavaScript to sniff the user agent and |
||||
// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at |
||||
// our Getting Started page for more information on this bug. |
||||
// |
||||
// For more information, see the following: |
||||
// |
||||
// Issue: https://github.com/twbs/bootstrap/issues/10497 |
||||
// Docs: http://getbootstrap.com/getting-started/#support-ie10-width |
||||
// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/ |
||||
// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ |
||||
|
||||
@-ms-viewport { |
||||
width: device-width; |
||||
} |
||||
|
||||
|
||||
// Visibility utilities |
||||
// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0 |
||||
.visible-xs, |
||||
.visible-sm, |
||||
.visible-md, |
||||
.visible-lg { |
||||
.responsive-invisibility(); |
||||
} |
||||
|
||||
.visible-xs-block, |
||||
.visible-xs-inline, |
||||
.visible-xs-inline-block, |
||||
.visible-sm-block, |
||||
.visible-sm-inline, |
||||
.visible-sm-inline-block, |
||||
.visible-md-block, |
||||
.visible-md-inline, |
||||
.visible-md-inline-block, |
||||
.visible-lg-block, |
||||
.visible-lg-inline, |
||||
.visible-lg-inline-block { |
||||
display: none !important; |
||||
} |
||||
|
||||
.visible-xs { |
||||
@media (max-width: @screen-xs-max) { |
||||
.responsive-visibility(); |
||||
} |
||||
} |
||||
.visible-xs-block { |
||||
@media (max-width: @screen-xs-max) { |
||||
display: block !important; |
||||
} |
||||
} |
||||
.visible-xs-inline { |
||||
@media (max-width: @screen-xs-max) { |
||||
display: inline !important; |
||||
} |
||||
} |
||||
.visible-xs-inline-block { |
||||
@media (max-width: @screen-xs-max) { |
||||
display: inline-block !important; |
||||
} |
||||
} |
||||
|
||||
.visible-sm { |
||||
@media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { |
||||
.responsive-visibility(); |
||||
} |
||||
} |
||||
.visible-sm-block { |
||||
@media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { |
||||
display: block !important; |
||||
} |
||||
} |
||||
.visible-sm-inline { |
||||
@media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { |
||||
display: inline !important; |
||||
} |
||||
} |
||||
.visible-sm-inline-block { |
||||
@media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { |
||||
display: inline-block !important; |
||||
} |
||||
} |
||||
|
||||
.visible-md { |
||||
@media (min-width: @screen-md-min) and (max-width: @screen-md-max) { |
||||
.responsive-visibility(); |
||||
} |
||||
} |
||||
.visible-md-block { |
||||
@media (min-width: @screen-md-min) and (max-width: @screen-md-max) { |
||||
display: block !important; |
||||
} |
||||
} |
||||
.visible-md-inline { |
||||
@media (min-width: @screen-md-min) and (max-width: @screen-md-max) { |
||||
display: inline !important; |
||||
} |
||||
} |
||||
.visible-md-inline-block { |
||||
@media (min-width: @screen-md-min) and (max-width: @screen-md-max) { |
||||
display: inline-block !important; |
||||
} |
||||
} |
||||
|
||||
.visible-lg { |
||||
@media (min-width: @screen-lg-min) { |
||||
.responsive-visibility(); |
||||
} |
||||
} |
||||
.visible-lg-block { |
||||
@media (min-width: @screen-lg-min) { |
||||
display: block !important; |
||||
} |
||||
} |
||||
.visible-lg-inline { |
||||
@media (min-width: @screen-lg-min) { |
||||
display: inline !important; |
||||
} |
||||
} |
||||
.visible-lg-inline-block { |
||||
@media (min-width: @screen-lg-min) { |
||||
display: inline-block !important; |
||||
} |
||||
} |
||||
|
||||
.hidden-xs { |
||||
@media (max-width: @screen-xs-max) { |
||||
.responsive-invisibility(); |
||||
} |
||||
} |
||||
.hidden-sm { |
||||
@media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { |
||||
.responsive-invisibility(); |
||||
} |
||||
} |
||||
.hidden-md { |
||||
@media (min-width: @screen-md-min) and (max-width: @screen-md-max) { |
||||
.responsive-invisibility(); |
||||
} |
||||
} |
||||
.hidden-lg { |
||||
@media (min-width: @screen-lg-min) { |
||||
.responsive-invisibility(); |
||||
} |
||||
} |
||||
|
||||
|
||||
// Print utilities |
||||
// |
||||
// Media queries are placed on the inside to be mixin-friendly. |
||||
|
||||
// Note: Deprecated .visible-print as of v3.2.0 |
||||
.visible-print { |
||||
.responsive-invisibility(); |
||||
|
||||
@media print { |
||||
.responsive-visibility(); |
||||
} |
||||
} |
||||
.visible-print-block { |
||||
display: none !important; |
||||
|
||||
@media print { |
||||
display: block !important; |
||||
} |
||||
} |
||||
.visible-print-inline { |
||||
display: none !important; |
||||
|
||||
@media print { |
||||
display: inline !important; |
||||
} |
||||
} |
||||
.visible-print-inline-block { |
||||
display: none !important; |
||||
|
||||
@media print { |
||||
display: inline-block !important; |
||||
} |
||||
} |
||||
|
||||
.hidden-print { |
||||
@media print { |
||||
.responsive-invisibility(); |
||||
} |
||||
} |
@ -1,162 +0,0 @@
@@ -1,162 +0,0 @@
|
||||
// |
||||
// Scaffolding |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Reset the box-sizing |
||||
// |
||||
// Heads up! This reset may cause conflicts with some third-party widgets. |
||||
// For recommendations on resolving such conflicts, see |
||||
// http://getbootstrap.com/getting-started/#third-box-sizing |
||||
* { |
||||
.box-sizing(border-box); |
||||
} |
||||
*:before, |
||||
*:after { |
||||
.box-sizing(border-box); |
||||
} |
||||
|
||||
|
||||
// Body reset |
||||
|
||||
html { |
||||
font-size: 10px; |
||||
-webkit-tap-highlight-color: rgba(0,0,0,0); |
||||
} |
||||
|
||||
body { |
||||
font-family: @font-family-base; |
||||
font-size: @font-size-base; |
||||
line-height: @line-height-base; |
||||
color: @text-color; |
||||
background-color: @body-bg; |
||||
} |
||||
|
||||
// Reset fonts for relevant elements |
||||
input, |
||||
button, |
||||
select, |
||||
textarea { |
||||
font-family: inherit; |
||||
font-size: inherit; |
||||
line-height: inherit; |
||||
} |
||||
|
||||
|
||||
// Links |
||||
|
||||
a { |
||||
color: @link-color; |
||||
text-decoration: none; |
||||
|
||||
&:hover, |
||||
&:focus { |
||||
color: @link-hover-color; |
||||
text-decoration: @link-hover-decoration; |
||||
} |
||||
|
||||
&:focus { |
||||
.tab-focus(); |
||||
} |
||||
} |
||||
|
||||
|
||||
// Figures |
||||
// |
||||
// We reset this here because previously Normalize had no `figure` margins. This |
||||
// ensures we don't break anyone's use of the element. |
||||
|
||||
figure { |
||||
margin: 0; |
||||
} |
||||
|
||||
|
||||
// Images |
||||
|
||||
img { |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
// Responsive images (ensure images don't scale beyond their parents) |
||||
.img-responsive { |
||||
.img-responsive(); |
||||
} |
||||
|
||||
// Rounded corners |
||||
.img-rounded { |
||||
border-radius: @border-radius-large; |
||||
} |
||||
|
||||
// Image thumbnails |
||||
// |
||||
// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`. |
||||
.img-thumbnail { |
||||
padding: @thumbnail-padding; |
||||
line-height: @line-height-base; |
||||
background-color: @thumbnail-bg; |
||||
border: 1px solid @thumbnail-border; |
||||
border-radius: @thumbnail-border-radius; |
||||
.transition(all .2s ease-in-out); |
||||
|
||||
// Keep them at most 100% wide |
||||
.img-responsive(inline-block); |
||||
} |
||||
|
||||
// Perfect circle |
||||
.img-circle { |
||||
border-radius: 50%; // set radius in percents |
||||
} |
||||
|
||||
|
||||
// Horizontal rules |
||||
|
||||
hr { |
||||
margin-top: @line-height-computed; |
||||
margin-bottom: @line-height-computed; |
||||
border: 0; |
||||
border-top: 1px solid @hr-border; |
||||
} |
||||
|
||||
|
||||
// Only display content to screen readers |
||||
// |
||||
// See: http://a11yproject.com/posts/how-to-hide-content/ |
||||
|
||||
.sr-only { |
||||
position: absolute; |
||||
width: 1px; |
||||
height: 1px; |
||||
margin: -1px; |
||||
padding: 0; |
||||
overflow: hidden; |
||||
clip: rect(0,0,0,0); |
||||
border: 0; |
||||
} |
||||
|
||||
// Use in conjunction with .sr-only to only display content when it's focused. |
||||
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 |
||||
// Credit: HTML5 Boilerplate |
||||
|
||||
.sr-only-focusable { |
||||
&:active, |
||||
&:focus { |
||||
position: static; |
||||
width: auto; |
||||
height: auto; |
||||
margin: 0; |
||||
overflow: visible; |
||||
clip: auto; |
||||
} |
||||
} |
||||
|
||||
|
||||
// iOS "clickable elements" fix for role="button" |
||||
// |
||||
// Fixes "clickability" issue (and more generally, the firing of events such as focus as well) |
||||
// for traditionally non-focusable elements with role="button" |
||||
// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile |
||||
// Upstream patch for normalize.css submitted: https://github.com/necolas/normalize.css/pull/379 - remove this fix once that is merged |
||||
|
||||
[role="button"] { |
||||
cursor: pointer; |
||||
} |
@ -1,234 +0,0 @@
@@ -1,234 +0,0 @@
|
||||
// |
||||
// Tables |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
table { |
||||
background-color: @table-bg; |
||||
} |
||||
caption { |
||||
padding-top: @table-cell-padding; |
||||
padding-bottom: @table-cell-padding; |
||||
color: @text-muted; |
||||
text-align: left; |
||||
} |
||||
th { |
||||
text-align: left; |
||||
} |
||||
|
||||
|
||||
// Baseline styles |
||||
|
||||
.table { |
||||
width: 100%; |
||||
max-width: 100%; |
||||
margin-bottom: @line-height-computed; |
||||
// Cells |
||||
> thead, |
||||
> tbody, |
||||
> tfoot { |
||||
> tr { |
||||
> th, |
||||
> td { |
||||
padding: @table-cell-padding; |
||||
line-height: @line-height-base; |
||||
vertical-align: top; |
||||
border-top: 1px solid @table-border-color; |
||||
} |
||||
} |
||||
} |
||||
// Bottom align for column headings |
||||
> thead > tr > th { |
||||
vertical-align: bottom; |
||||
border-bottom: 2px solid @table-border-color; |
||||
} |
||||
// Remove top border from thead by default |
||||
> caption + thead, |
||||
> colgroup + thead, |
||||
> thead:first-child { |
||||
> tr:first-child { |
||||
> th, |
||||
> td { |
||||
border-top: 0; |
||||
} |
||||
} |
||||
} |
||||
// Account for multiple tbody instances |
||||
> tbody + tbody { |
||||
border-top: 2px solid @table-border-color; |
||||
} |
||||
|
||||
// Nesting |
||||
.table { |
||||
background-color: @body-bg; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Condensed table w/ half padding |
||||
|
||||
.table-condensed { |
||||
> thead, |
||||
> tbody, |
||||
> tfoot { |
||||
> tr { |
||||
> th, |
||||
> td { |
||||
padding: @table-condensed-cell-padding; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Bordered version |
||||
// |
||||
// Add borders all around the table and between all the columns. |
||||
|
||||
.table-bordered { |
||||
border: 1px solid @table-border-color; |
||||
> thead, |
||||
> tbody, |
||||
> tfoot { |
||||
> tr { |
||||
> th, |
||||
> td { |
||||
border: 1px solid @table-border-color; |
||||
} |
||||
} |
||||
} |
||||
> thead > tr { |
||||
> th, |
||||
> td { |
||||
border-bottom-width: 2px; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Zebra-striping |
||||
// |
||||
// Default zebra-stripe styles (alternating gray and transparent backgrounds) |
||||
|
||||
.table-striped { |
||||
> tbody > tr:nth-of-type(odd) { |
||||
background-color: @table-bg-accent; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Hover effect |
||||
// |
||||
// Placed here since it has to come after the potential zebra striping |
||||
|
||||
.table-hover { |
||||
> tbody > tr:hover { |
||||
background-color: @table-bg-hover; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Table cell sizing |
||||
// |
||||
// Reset default table behavior |
||||
|
||||
table col[class*="col-"] { |
||||
position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623) |
||||
float: none; |
||||
display: table-column; |
||||
} |
||||
table { |
||||
td, |
||||
th { |
||||
&[class*="col-"] { |
||||
position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623) |
||||
float: none; |
||||
display: table-cell; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Table backgrounds |
||||
// |
||||
// Exact selectors below required to override `.table-striped` and prevent |
||||
// inheritance to nested tables. |
||||
|
||||
// Generate the contextual variants |
||||
.table-row-variant(active; @table-bg-active); |
||||
.table-row-variant(success; @state-success-bg); |
||||
.table-row-variant(info; @state-info-bg); |
||||
.table-row-variant(warning; @state-warning-bg); |
||||
.table-row-variant(danger; @state-danger-bg); |
||||
|
||||
|
||||
// Responsive tables |
||||
// |
||||
// Wrap your tables in `.table-responsive` and we'll make them mobile friendly |
||||
// by enabling horizontal scrolling. Only applies <768px. Everything above that |
||||
// will display normally. |
||||
|
||||
.table-responsive { |
||||
overflow-x: auto; |
||||
min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837) |
||||
|
||||
@media screen and (max-width: @screen-xs-max) { |
||||
width: 100%; |
||||
margin-bottom: (@line-height-computed * 0.75); |
||||
overflow-y: hidden; |
||||
-ms-overflow-style: -ms-autohiding-scrollbar; |
||||
border: 1px solid @table-border-color; |
||||
|
||||
// Tighten up spacing |
||||
> .table { |
||||
margin-bottom: 0; |
||||
|
||||
// Ensure the content doesn't wrap |
||||
> thead, |
||||
> tbody, |
||||
> tfoot { |
||||
> tr { |
||||
> th, |
||||
> td { |
||||
white-space: nowrap; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Special overrides for the bordered tables |
||||
> .table-bordered { |
||||
border: 0; |
||||
|
||||
// Nuke the appropriate borders so that the parent can handle them |
||||
> thead, |
||||
> tbody, |
||||
> tfoot { |
||||
> tr { |
||||
> th:first-child, |
||||
> td:first-child { |
||||
border-left: 0; |
||||
} |
||||
> th:last-child, |
||||
> td:last-child { |
||||
border-right: 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Only nuke the last row's bottom-border in `tbody` and `tfoot` since |
||||
// chances are there will be only one `tr` in a `thead` and that would |
||||
// remove the border altogether. |
||||
> tbody, |
||||
> tfoot { |
||||
> tr:last-child { |
||||
> th, |
||||
> td { |
||||
border-bottom: 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
} |
||||
} |
@ -1,273 +0,0 @@
@@ -1,273 +0,0 @@
|
||||
|
||||
// |
||||
// Load core variables and mixins |
||||
// -------------------------------------------------- |
||||
|
||||
@import "variables.less"; |
||||
@import "mixins.less"; |
||||
|
||||
|
||||
// |
||||
// Buttons |
||||
// -------------------------------------------------- |
||||
|
||||
// Common styles |
||||
.btn-default, |
||||
.btn-primary, |
||||
.btn-success, |
||||
.btn-info, |
||||
.btn-warning, |
||||
.btn-danger { |
||||
text-shadow: 0 -1px 0 rgba(0,0,0,.2); |
||||
@shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075); |
||||
.box-shadow(@shadow); |
||||
|
||||
// Reset the shadow |
||||
&:active, |
||||
&.active { |
||||
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); |
||||
} |
||||
|
||||
.badge { |
||||
text-shadow: none; |
||||
} |
||||
} |
||||
|
||||
// Mixin for generating new styles |
||||
.btn-styles(@btn-color: #555) { |
||||
#gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%)); |
||||
.reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620 |
||||
background-repeat: repeat-x; |
||||
border-color: darken(@btn-color, 14%); |
||||
|
||||
&:hover, |
||||
&:focus { |
||||
background-color: darken(@btn-color, 12%); |
||||
background-position: 0 -15px; |
||||
} |
||||
|
||||
&:active, |
||||
&.active { |
||||
background-color: darken(@btn-color, 12%); |
||||
border-color: darken(@btn-color, 14%); |
||||
} |
||||
|
||||
&.disabled, |
||||
&:disabled, |
||||
&[disabled] { |
||||
background-color: darken(@btn-color, 12%); |
||||
background-image: none; |
||||
} |
||||
} |
||||
|
||||
// Common styles |
||||
.btn { |
||||
// Remove the gradient for the pressed/active state |
||||
&:active, |
||||
&.active { |
||||
background-image: none; |
||||
} |
||||
} |
||||
|
||||
// Apply the mixin to the buttons |
||||
.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; } |
||||
.btn-primary { .btn-styles(@btn-primary-bg); } |
||||
.btn-success { .btn-styles(@btn-success-bg); } |
||||
.btn-info { .btn-styles(@btn-info-bg); } |
||||
.btn-warning { .btn-styles(@btn-warning-bg); } |
||||
.btn-danger { .btn-styles(@btn-danger-bg); } |
||||
|
||||
|
||||
// |
||||
// Images |
||||
// -------------------------------------------------- |
||||
|
||||
.thumbnail, |
||||
.img-thumbnail { |
||||
.box-shadow(0 1px 2px rgba(0,0,0,.075)); |
||||
} |
||||
|
||||
|
||||
// |
||||
// Dropdowns |
||||
// -------------------------------------------------- |
||||
|
||||
.dropdown-menu > li > a:hover, |
||||
.dropdown-menu > li > a:focus { |
||||
#gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%)); |
||||
background-color: darken(@dropdown-link-hover-bg, 5%); |
||||
} |
||||
.dropdown-menu > .active > a, |
||||
.dropdown-menu > .active > a:hover, |
||||
.dropdown-menu > .active > a:focus { |
||||
#gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%)); |
||||
background-color: darken(@dropdown-link-active-bg, 5%); |
||||
} |
||||
|
||||
|
||||
// |
||||
// Navbar |
||||
// -------------------------------------------------- |
||||
|
||||
// Default navbar |
||||
.navbar-default { |
||||
#gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg); |
||||
.reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered |
||||
border-radius: @navbar-border-radius; |
||||
@shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075); |
||||
.box-shadow(@shadow); |
||||
|
||||
.navbar-nav > .open > a, |
||||
.navbar-nav > .active > a { |
||||
#gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%)); |
||||
.box-shadow(inset 0 3px 9px rgba(0,0,0,.075)); |
||||
} |
||||
} |
||||
.navbar-brand, |
||||
.navbar-nav > li > a { |
||||
text-shadow: 0 1px 0 rgba(255,255,255,.25); |
||||
} |
||||
|
||||
// Inverted navbar |
||||
.navbar-inverse { |
||||
#gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg); |
||||
.reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257 |
||||
|
||||
.navbar-nav > .open > a, |
||||
.navbar-nav > .active > a { |
||||
#gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%)); |
||||
.box-shadow(inset 0 3px 9px rgba(0,0,0,.25)); |
||||
} |
||||
|
||||
.navbar-brand, |
||||
.navbar-nav > li > a { |
||||
text-shadow: 0 -1px 0 rgba(0,0,0,.25); |
||||
} |
||||
} |
||||
|
||||
// Undo rounded corners in static and fixed navbars |
||||
.navbar-static-top, |
||||
.navbar-fixed-top, |
||||
.navbar-fixed-bottom { |
||||
border-radius: 0; |
||||
} |
||||
|
||||
// Fix active state of dropdown items in collapsed mode |
||||
@media (max-width: @grid-float-breakpoint-max) { |
||||
.navbar .navbar-nav .open .dropdown-menu > .active > a { |
||||
&, |
||||
&:hover, |
||||
&:focus { |
||||
color: #fff; |
||||
#gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// |
||||
// Alerts |
||||
// -------------------------------------------------- |
||||
|
||||
// Common styles |
||||
.alert { |
||||
text-shadow: 0 1px 0 rgba(255,255,255,.2); |
||||
@shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05); |
||||
.box-shadow(@shadow); |
||||
} |
||||
|
||||
// Mixin for generating new styles |
||||
.alert-styles(@color) { |
||||
#gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%)); |
||||
border-color: darken(@color, 15%); |
||||
} |
||||
|
||||
// Apply the mixin to the alerts |
||||
.alert-success { .alert-styles(@alert-success-bg); } |
||||
.alert-info { .alert-styles(@alert-info-bg); } |
||||
.alert-warning { .alert-styles(@alert-warning-bg); } |
||||
.alert-danger { .alert-styles(@alert-danger-bg); } |
||||
|
||||
|
||||
// |
||||
// Progress bars |
||||
// -------------------------------------------------- |
||||
|
||||
// Give the progress background some depth |
||||
.progress { |
||||
#gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg) |
||||
} |
||||
|
||||
// Mixin for generating new styles |
||||
.progress-bar-styles(@color) { |
||||
#gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%)); |
||||
} |
||||
|
||||
// Apply the mixin to the progress bars |
||||
.progress-bar { .progress-bar-styles(@progress-bar-bg); } |
||||
.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); } |
||||
.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); } |
||||
.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); } |
||||
.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); } |
||||
|
||||
// Reset the striped class because our mixins don't do multiple gradients and |
||||
// the above custom styles override the new `.progress-bar-striped` in v3.2.0. |
||||
.progress-bar-striped { |
||||
#gradient > .striped(); |
||||
} |
||||
|
||||
|
||||
// |
||||
// List groups |
||||
// -------------------------------------------------- |
||||
|
||||
.list-group { |
||||
border-radius: @border-radius-base; |
||||
.box-shadow(0 1px 2px rgba(0,0,0,.075)); |
||||
} |
||||
.list-group-item.active, |
||||
.list-group-item.active:hover, |
||||
.list-group-item.active:focus { |
||||
text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%); |
||||
#gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%)); |
||||
border-color: darken(@list-group-active-border, 7.5%); |
||||
|
||||
.badge { |
||||
text-shadow: none; |
||||
} |
||||
} |
||||
|
||||
|
||||
// |
||||
// Panels |
||||
// -------------------------------------------------- |
||||
|
||||
// Common styles |
||||
.panel { |
||||
.box-shadow(0 1px 2px rgba(0,0,0,.05)); |
||||
} |
||||
|
||||
// Mixin for generating new styles |
||||
.panel-heading-styles(@color) { |
||||
#gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%)); |
||||
} |
||||
|
||||
// Apply the mixin to the panel headings only |
||||
.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); } |
||||
.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); } |
||||
.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); } |
||||
.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); } |
||||
.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); } |
||||
.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); } |
||||
|
||||
|
||||
// |
||||
// Wells |
||||
// -------------------------------------------------- |
||||
|
||||
.well { |
||||
#gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg); |
||||
border-color: darken(@well-bg, 10%); |
||||
@shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1); |
||||
.box-shadow(@shadow); |
||||
} |
@ -1,36 +0,0 @@
@@ -1,36 +0,0 @@
|
||||
// |
||||
// Thumbnails |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Mixin and adjust the regular image class |
||||
.thumbnail { |
||||
display: block; |
||||
padding: @thumbnail-padding; |
||||
margin-bottom: @line-height-computed; |
||||
line-height: @line-height-base; |
||||
background-color: @thumbnail-bg; |
||||
border: 1px solid @thumbnail-border; |
||||
border-radius: @thumbnail-border-radius; |
||||
.transition(border .2s ease-in-out); |
||||
|
||||
> img, |
||||
a > img { |
||||
&:extend(.img-responsive); |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
} |
||||
|
||||
// Add a hover state for linked versions only |
||||
a&:hover, |
||||
a&:focus, |
||||
a&.active { |
||||
border-color: @link-color; |
||||
} |
||||
|
||||
// Image captions |
||||
.caption { |
||||
padding: @thumbnail-caption-padding; |
||||
color: @thumbnail-caption-color; |
||||
} |
||||
} |
@ -1,102 +0,0 @@
@@ -1,102 +0,0 @@
|
||||
// |
||||
// Tooltips |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Base class |
||||
.tooltip { |
||||
position: absolute; |
||||
z-index: @zindex-tooltip; |
||||
display: block; |
||||
// Reset font and text properties given new insertion method |
||||
font-family: @font-family-base; |
||||
font-size: @font-size-small; |
||||
font-weight: normal; |
||||
line-height: 1.4; |
||||
.opacity(0); |
||||
|
||||
&.in { .opacity(@tooltip-opacity); } |
||||
&.top { margin-top: -3px; padding: @tooltip-arrow-width 0; } |
||||
&.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; } |
||||
&.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; } |
||||
&.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; } |
||||
} |
||||
|
||||
// Wrapper for the tooltip content |
||||
.tooltip-inner { |
||||
max-width: @tooltip-max-width; |
||||
padding: 3px 8px; |
||||
color: @tooltip-color; |
||||
text-align: center; |
||||
text-decoration: none; |
||||
background-color: @tooltip-bg; |
||||
border-radius: @border-radius-base; |
||||
} |
||||
|
||||
// Arrows |
||||
.tooltip-arrow { |
||||
position: absolute; |
||||
width: 0; |
||||
height: 0; |
||||
border-color: transparent; |
||||
border-style: solid; |
||||
} |
||||
// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1 |
||||
.tooltip { |
||||
&.top .tooltip-arrow { |
||||
bottom: 0; |
||||
left: 50%; |
||||
margin-left: -@tooltip-arrow-width; |
||||
border-width: @tooltip-arrow-width @tooltip-arrow-width 0; |
||||
border-top-color: @tooltip-arrow-color; |
||||
} |
||||
&.top-left .tooltip-arrow { |
||||
bottom: 0; |
||||
right: @tooltip-arrow-width; |
||||
margin-bottom: -@tooltip-arrow-width; |
||||
border-width: @tooltip-arrow-width @tooltip-arrow-width 0; |
||||
border-top-color: @tooltip-arrow-color; |
||||
} |
||||
&.top-right .tooltip-arrow { |
||||
bottom: 0; |
||||
left: @tooltip-arrow-width; |
||||
margin-bottom: -@tooltip-arrow-width; |
||||
border-width: @tooltip-arrow-width @tooltip-arrow-width 0; |
||||
border-top-color: @tooltip-arrow-color; |
||||
} |
||||
&.right .tooltip-arrow { |
||||
top: 50%; |
||||
left: 0; |
||||
margin-top: -@tooltip-arrow-width; |
||||
border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0; |
||||
border-right-color: @tooltip-arrow-color; |
||||
} |
||||
&.left .tooltip-arrow { |
||||
top: 50%; |
||||
right: 0; |
||||
margin-top: -@tooltip-arrow-width; |
||||
border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width; |
||||
border-left-color: @tooltip-arrow-color; |
||||
} |
||||
&.bottom .tooltip-arrow { |
||||
top: 0; |
||||
left: 50%; |
||||
margin-left: -@tooltip-arrow-width; |
||||
border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; |
||||
border-bottom-color: @tooltip-arrow-color; |
||||
} |
||||
&.bottom-left .tooltip-arrow { |
||||
top: 0; |
||||
right: @tooltip-arrow-width; |
||||
margin-top: -@tooltip-arrow-width; |
||||
border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; |
||||
border-bottom-color: @tooltip-arrow-color; |
||||
} |
||||
&.bottom-right .tooltip-arrow { |
||||
top: 0; |
||||
left: @tooltip-arrow-width; |
||||
margin-top: -@tooltip-arrow-width; |
||||
border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; |
||||
border-bottom-color: @tooltip-arrow-color; |
||||
} |
||||
} |
@ -1,302 +0,0 @@
@@ -1,302 +0,0 @@
|
||||
// |
||||
// Typography |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Headings |
||||
// ------------------------- |
||||
|
||||
h1, h2, h3, h4, h5, h6, |
||||
.h1, .h2, .h3, .h4, .h5, .h6 { |
||||
font-family: @headings-font-family; |
||||
font-weight: @headings-font-weight; |
||||
line-height: @headings-line-height; |
||||
color: @headings-color; |
||||
|
||||
small, |
||||
.small { |
||||
font-weight: normal; |
||||
line-height: 1; |
||||
color: @headings-small-color; |
||||
} |
||||
} |
||||
|
||||
h1, .h1, |
||||
h2, .h2, |
||||
h3, .h3 { |
||||
margin-top: @line-height-computed; |
||||
margin-bottom: (@line-height-computed / 2); |
||||
|
||||
small, |
||||
.small { |
||||
font-size: 65%; |
||||
} |
||||
} |
||||
h4, .h4, |
||||
h5, .h5, |
||||
h6, .h6 { |
||||
margin-top: (@line-height-computed / 2); |
||||
margin-bottom: (@line-height-computed / 2); |
||||
|
||||
small, |
||||
.small { |
||||
font-size: 75%; |
||||
} |
||||
} |
||||
|
||||
h1, .h1 { font-size: @font-size-h1; } |
||||
h2, .h2 { font-size: @font-size-h2; } |
||||
h3, .h3 { font-size: @font-size-h3; } |
||||
h4, .h4 { font-size: @font-size-h4; } |
||||
h5, .h5 { font-size: @font-size-h5; } |
||||
h6, .h6 { font-size: @font-size-h6; } |
||||
|
||||
|
||||
// Body text |
||||
// ------------------------- |
||||
|
||||
p { |
||||
margin: 0 0 (@line-height-computed / 2); |
||||
} |
||||
|
||||
.lead { |
||||
margin-bottom: @line-height-computed; |
||||
font-size: floor((@font-size-base * 1.15)); |
||||
font-weight: 300; |
||||
line-height: 1.4; |
||||
|
||||
@media (min-width: @screen-sm-min) { |
||||
font-size: (@font-size-base * 1.5); |
||||
} |
||||
} |
||||
|
||||
|
||||
// Emphasis & misc |
||||
// ------------------------- |
||||
|
||||
// Ex: (12px small font / 14px base font) * 100% = about 85% |
||||
small, |
||||
.small { |
||||
font-size: floor((100% * @font-size-small / @font-size-base)); |
||||
} |
||||
|
||||
mark, |
||||
.mark { |
||||
background-color: @state-warning-bg; |
||||
padding: .2em; |
||||
} |
||||
|
||||
// Alignment |
||||
.text-left { text-align: left; } |
||||
.text-right { text-align: right; } |
||||
.text-center { text-align: center; } |
||||
.text-justify { text-align: justify; } |
||||
.text-nowrap { white-space: nowrap; } |
||||
|
||||
// Transformation |
||||
.text-lowercase { text-transform: lowercase; } |
||||
.text-uppercase { text-transform: uppercase; } |
||||
.text-capitalize { text-transform: capitalize; } |
||||
|
||||
// Contextual colors |
||||
.text-muted { |
||||
color: @text-muted; |
||||
} |
||||
.text-primary { |
||||
.text-emphasis-variant(@brand-primary); |
||||
} |
||||
.text-success { |
||||
.text-emphasis-variant(@state-success-text); |
||||
} |
||||
.text-info { |
||||
.text-emphasis-variant(@state-info-text); |
||||
} |
||||
.text-warning { |
||||
.text-emphasis-variant(@state-warning-text); |
||||
} |
||||
.text-danger { |
||||
.text-emphasis-variant(@state-danger-text); |
||||
} |
||||
|
||||
// Contextual backgrounds |
||||
// For now we'll leave these alongside the text classes until v4 when we can |
||||
// safely shift things around (per SemVer rules). |
||||
.bg-primary { |
||||
// Given the contrast here, this is the only class to have its color inverted |
||||
// automatically. |
||||
color: #fff; |
||||
.bg-variant(@brand-primary); |
||||
} |
||||
.bg-success { |
||||
.bg-variant(@state-success-bg); |
||||
} |
||||
.bg-info { |
||||
.bg-variant(@state-info-bg); |
||||
} |
||||
.bg-warning { |
||||
.bg-variant(@state-warning-bg); |
||||
} |
||||
.bg-danger { |
||||
.bg-variant(@state-danger-bg); |
||||
} |
||||
|
||||
|
||||
// Page header |
||||
// ------------------------- |
||||
|
||||
.page-header { |
||||
padding-bottom: ((@line-height-computed / 2) - 1); |
||||
margin: (@line-height-computed * 2) 0 @line-height-computed; |
||||
border-bottom: 1px solid @page-header-border-color; |
||||
} |
||||
|
||||
|
||||
// Lists |
||||
// ------------------------- |
||||
|
||||
// Unordered and Ordered lists |
||||
ul, |
||||
ol { |
||||
margin-top: 0; |
||||
margin-bottom: (@line-height-computed / 2); |
||||
ul, |
||||
ol { |
||||
margin-bottom: 0; |
||||
} |
||||
} |
||||
|
||||
// List options |
||||
|
||||
// Unstyled keeps list items block level, just removes default browser padding and list-style |
||||
.list-unstyled { |
||||
padding-left: 0; |
||||
list-style: none; |
||||
} |
||||
|
||||
// Inline turns list items into inline-block |
||||
.list-inline { |
||||
.list-unstyled(); |
||||
margin-left: -5px; |
||||
|
||||
> li { |
||||
display: inline-block; |
||||
padding-left: 5px; |
||||
padding-right: 5px; |
||||
} |
||||
} |
||||
|
||||
// Description Lists |
||||
dl { |
||||
margin-top: 0; // Remove browser default |
||||
margin-bottom: @line-height-computed; |
||||
} |
||||
dt, |
||||
dd { |
||||
line-height: @line-height-base; |
||||
} |
||||
dt { |
||||
font-weight: bold; |
||||
} |
||||
dd { |
||||
margin-left: 0; // Undo browser default |
||||
} |
||||
|
||||
// Horizontal description lists |
||||
// |
||||
// Defaults to being stacked without any of the below styles applied, until the |
||||
// grid breakpoint is reached (default of ~768px). |
||||
|
||||
.dl-horizontal { |
||||
dd { |
||||
&:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present |
||||
} |
||||
|
||||
@media (min-width: @grid-float-breakpoint) { |
||||
dt { |
||||
float: left; |
||||
width: (@dl-horizontal-offset - 20); |
||||
clear: left; |
||||
text-align: right; |
||||
.text-overflow(); |
||||
} |
||||
dd { |
||||
margin-left: @dl-horizontal-offset; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// Misc |
||||
// ------------------------- |
||||
|
||||
// Abbreviations and acronyms |
||||
abbr[title], |
||||
// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257 |
||||
abbr[data-original-title] { |
||||
cursor: help; |
||||
border-bottom: 1px dotted @abbr-border-color; |
||||
} |
||||
.initialism { |
||||
font-size: 90%; |
||||
.text-uppercase(); |
||||
} |
||||
|
||||
// Blockquotes |
||||
blockquote { |
||||
padding: (@line-height-computed / 2) @line-height-computed; |
||||
margin: 0 0 @line-height-computed; |
||||
font-size: @blockquote-font-size; |
||||
border-left: 5px solid @blockquote-border-color; |
||||
|
||||
p, |
||||
ul, |
||||
ol { |
||||
&:last-child { |
||||
margin-bottom: 0; |
||||
} |
||||
} |
||||
|
||||
// Note: Deprecated small and .small as of v3.1.0 |
||||
// Context: https://github.com/twbs/bootstrap/issues/11660 |
||||
footer, |
||||
small, |
||||
.small { |
||||
display: block; |
||||
font-size: 80%; // back to default font-size |
||||
line-height: @line-height-base; |
||||
color: @blockquote-small-color; |
||||
|
||||
&:before { |
||||
content: '\2014 \00A0'; // em dash, nbsp |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Opposite alignment of blockquote |
||||
// |
||||
// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0. |
||||
.blockquote-reverse, |
||||
blockquote.pull-right { |
||||
padding-right: 15px; |
||||
padding-left: 0; |
||||
border-right: 5px solid @blockquote-border-color; |
||||
border-left: 0; |
||||
text-align: right; |
||||
|
||||
// Account for citation |
||||
footer, |
||||
small, |
||||
.small { |
||||
&:before { content: ''; } |
||||
&:after { |
||||
content: '\00A0 \2014'; // nbsp, em dash |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Addresses |
||||
address { |
||||
margin-bottom: @line-height-computed; |
||||
font-style: normal; |
||||
line-height: @line-height-base; |
||||
} |
@ -1,55 +0,0 @@
@@ -1,55 +0,0 @@
|
||||
// |
||||
// Utility classes |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Floats |
||||
// ------------------------- |
||||
|
||||
.clearfix { |
||||
.clearfix(); |
||||
} |
||||
.center-block { |
||||
.center-block(); |
||||
} |
||||
.pull-right { |
||||
float: right !important; |
||||
} |
||||
.pull-left { |
||||
float: left !important; |
||||
} |
||||
|
||||
|
||||
// Toggling content |
||||
// ------------------------- |
||||
|
||||
// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 |
||||
.hide { |
||||
display: none !important; |
||||
} |
||||
.show { |
||||
display: block !important; |
||||
} |
||||
.invisible { |
||||
visibility: hidden; |
||||
} |
||||
.text-hide { |
||||
.text-hide(); |
||||
} |
||||
|
||||
|
||||
// Hide from screenreaders and browsers |
||||
// |
||||
// Credit: HTML5 Boilerplate |
||||
|
||||
.hidden { |
||||
display: none !important; |
||||
} |
||||
|
||||
|
||||
// For Affix plugin |
||||
// ------------------------- |
||||
|
||||
.affix { |
||||
position: fixed; |
||||
} |
@ -1,861 +0,0 @@
@@ -1,861 +0,0 @@
|
||||
// |
||||
// Variables |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
//== Colors |
||||
// |
||||
//## Gray and brand colors for use across Bootstrap. |
||||
|
||||
@gray-base: #000; |
||||
@gray-darker: lighten(@gray-base, 13.5%); // #222 |
||||
@gray-dark: lighten(@gray-base, 20%); // #333 |
||||
@gray: lighten(@gray-base, 33.5%); // #555 |
||||
@gray-light: lighten(@gray-base, 46.7%); // #777 |
||||
@gray-lighter: lighten(@gray-base, 93.5%); // #eee |
||||
|
||||
@brand-primary: darken(#428bca, 6.5%); // #337ab7 |
||||
@brand-success: #5cb85c; |
||||
@brand-info: #5bc0de; |
||||
@brand-warning: #f0ad4e; |
||||
@brand-danger: #d9534f; |
||||
|
||||
|
||||
//== Scaffolding |
||||
// |
||||
//## Settings for some of the most global styles. |
||||
|
||||
//** Background color for `<body>`. |
||||
@body-bg: #fff; |
||||
//** Global text color on `<body>`. |
||||
@text-color: @gray-dark; |
||||
|
||||
//** Global textual link color. |
||||
@link-color: @brand-primary; |
||||
//** Link hover color set via `darken()` function. |
||||
@link-hover-color: darken(@link-color, 15%); |
||||
//** Link hover decoration. |
||||
@link-hover-decoration: underline; |
||||
|
||||
|
||||
//== Typography |
||||
// |
||||
//## Font, line-height, and color for body text, headings, and more. |
||||
|
||||
@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; |
||||
@font-family-serif: Georgia, "Times New Roman", Times, serif; |
||||
//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`. |
||||
@font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace; |
||||
@font-family-base: @font-family-sans-serif; |
||||
|
||||
@font-size-base: 14px; |
||||
@font-size-large: ceil((@font-size-base * 1.25)); // ~18px |
||||
@font-size-small: ceil((@font-size-base * 0.85)); // ~12px |
||||
|
||||
@font-size-h1: floor((@font-size-base * 2.6)); // ~36px |
||||
@font-size-h2: floor((@font-size-base * 2.15)); // ~30px |
||||
@font-size-h3: ceil((@font-size-base * 1.7)); // ~24px |
||||
@font-size-h4: ceil((@font-size-base * 1.25)); // ~18px |
||||
@font-size-h5: @font-size-base; |
||||
@font-size-h6: ceil((@font-size-base * 0.85)); // ~12px |
||||
|
||||
//** Unit-less `line-height` for use in components like buttons. |
||||
@line-height-base: 1.428571429; // 20/14 |
||||
//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc. |
||||
@line-height-computed: floor((@font-size-base * @line-height-base)); // ~20px |
||||
|
||||
//** By default, this inherits from the `<body>`. |
||||
@headings-font-family: inherit; |
||||
@headings-font-weight: 500; |
||||
@headings-line-height: 1.1; |
||||
@headings-color: inherit; |
||||
|
||||
|
||||
//== Iconography |
||||
// |
||||
//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower. |
||||
|
||||
//** Load fonts from this directory. |
||||
@icon-font-path: "../fonts/"; |
||||
//** File name for all font files. |
||||
@icon-font-name: "glyphicons-halflings-regular"; |
||||
//** Element ID within SVG icon file. |
||||
@icon-font-svg-id: "glyphicons_halflingsregular"; |
||||
|
||||
|
||||
//== Components |
||||
// |
||||
//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). |
||||
|
||||
@padding-base-vertical: 6px; |
||||
@padding-base-horizontal: 12px; |
||||
|
||||
@padding-large-vertical: 10px; |
||||
@padding-large-horizontal: 16px; |
||||
|
||||
@padding-small-vertical: 5px; |
||||
@padding-small-horizontal: 10px; |
||||
|
||||
@padding-xs-vertical: 1px; |
||||
@padding-xs-horizontal: 5px; |
||||
|
||||
@line-height-large: 1.3333333; // extra decimals for Win 8.1 Chrome |
||||
@line-height-small: 1.5; |
||||
|
||||
@border-radius-base: 4px; |
||||
@border-radius-large: 6px; |
||||
@border-radius-small: 3px; |
||||
|
||||
//** Global color for active items (e.g., navs or dropdowns). |
||||
@component-active-color: #fff; |
||||
//** Global background color for active items (e.g., navs or dropdowns). |
||||
@component-active-bg: @brand-primary; |
||||
|
||||
//** Width of the `border` for generating carets that indicator dropdowns. |
||||
@caret-width-base: 4px; |
||||
//** Carets increase slightly in size for larger components. |
||||
@caret-width-large: 5px; |
||||
|
||||
|
||||
//== Tables |
||||
// |
||||
//## Customizes the `.table` component with basic values, each used across all table variations. |
||||
|
||||
//** Padding for `<th>`s and `<td>`s. |
||||
@table-cell-padding: 8px; |
||||
//** Padding for cells in `.table-condensed`. |
||||
@table-condensed-cell-padding: 5px; |
||||
|
||||
//** Default background color used for all tables. |
||||
@table-bg: transparent; |
||||
//** Background color used for `.table-striped`. |
||||
@table-bg-accent: #f9f9f9; |
||||
//** Background color used for `.table-hover`. |
||||
@table-bg-hover: #f5f5f5; |
||||
@table-bg-active: @table-bg-hover; |
||||
|
||||
//** Border color for table and cell borders. |
||||
@table-border-color: #ddd; |
||||
|
||||
|
||||
//== Buttons |
||||
// |
||||
//## For each of Bootstrap's buttons, define text, background and border color. |
||||
|
||||
@btn-font-weight: normal; |
||||
|
||||
@btn-default-color: #333; |
||||
@btn-default-bg: #fff; |
||||
@btn-default-border: #ccc; |
||||
|
||||
@btn-primary-color: #fff; |
||||
@btn-primary-bg: @brand-primary; |
||||
@btn-primary-border: darken(@btn-primary-bg, 5%); |
||||
|
||||
@btn-success-color: #fff; |
||||
@btn-success-bg: @brand-success; |
||||
@btn-success-border: darken(@btn-success-bg, 5%); |
||||
|
||||
@btn-info-color: #fff; |
||||
@btn-info-bg: @brand-info; |
||||
@btn-info-border: darken(@btn-info-bg, 5%); |
||||
|
||||
@btn-warning-color: #fff; |
||||
@btn-warning-bg: @brand-warning; |
||||
@btn-warning-border: darken(@btn-warning-bg, 5%); |
||||
|
||||
@btn-danger-color: #fff; |
||||
@btn-danger-bg: @brand-danger; |
||||
@btn-danger-border: darken(@btn-danger-bg, 5%); |
||||
|
||||
@btn-link-disabled-color: @gray-light; |
||||
|
||||
|
||||
//== Forms |
||||
// |
||||
//## |
||||
|
||||
//** `<input>` background color |
||||
@input-bg: #fff; |
||||
//** `<input disabled>` background color |
||||
@input-bg-disabled: @gray-lighter; |
||||
|
||||
//** Text color for `<input>`s |
||||
@input-color: @gray; |
||||
//** `<input>` border color |
||||
@input-border: #ccc; |
||||
|
||||
// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4 |
||||
//** Default `.form-control` border radius |
||||
// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS. |
||||
@input-border-radius: @border-radius-base; |
||||
//** Large `.form-control` border radius |
||||
@input-border-radius-large: @border-radius-large; |
||||
//** Small `.form-control` border radius |
||||
@input-border-radius-small: @border-radius-small; |
||||
|
||||
//** Border color for inputs on focus |
||||
@input-border-focus: #66afe9; |
||||
|
||||
//** Placeholder text color |
||||
@input-color-placeholder: #999; |
||||
|
||||
//** Default `.form-control` height |
||||
@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2); |
||||
//** Large `.form-control` height |
||||
@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2); |
||||
//** Small `.form-control` height |
||||
@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2); |
||||
|
||||
//** `.form-group` margin |
||||
@form-group-margin-bottom: 15px; |
||||
|
||||
@legend-color: @gray-dark; |
||||
@legend-border-color: #e5e5e5; |
||||
|
||||
//** Background color for textual input addons |
||||
@input-group-addon-bg: @gray-lighter; |
||||
//** Border color for textual input addons |
||||
@input-group-addon-border-color: @input-border; |
||||
|
||||
//** Disabled cursor for form controls and buttons. |
||||
@cursor-disabled: not-allowed; |
||||
|
||||
|
||||
//== Dropdowns |
||||
// |
||||
//## Dropdown menu container and contents. |
||||
|
||||
//** Background for the dropdown menu. |
||||
@dropdown-bg: #fff; |
||||
//** Dropdown menu `border-color`. |
||||
@dropdown-border: rgba(0,0,0,.15); |
||||
//** Dropdown menu `border-color` **for IE8**. |
||||
@dropdown-fallback-border: #ccc; |
||||
//** Divider color for between dropdown items. |
||||
@dropdown-divider-bg: #e5e5e5; |
||||
|
||||
//** Dropdown link text color. |
||||
@dropdown-link-color: @gray-dark; |
||||
//** Hover color for dropdown links. |
||||
@dropdown-link-hover-color: darken(@gray-dark, 5%); |
||||
//** Hover background for dropdown links. |
||||
@dropdown-link-hover-bg: #f5f5f5; |
||||
|
||||
//** Active dropdown menu item text color. |
||||
@dropdown-link-active-color: @component-active-color; |
||||
//** Active dropdown menu item background color. |
||||
@dropdown-link-active-bg: @component-active-bg; |
||||
|
||||
//** Disabled dropdown menu item background color. |
||||
@dropdown-link-disabled-color: @gray-light; |
||||
|
||||
//** Text color for headers within dropdown menus. |
||||
@dropdown-header-color: @gray-light; |
||||
|
||||
//** Deprecated `@dropdown-caret-color` as of v3.1.0 |
||||
@dropdown-caret-color: #000; |
||||
|
||||
|
||||
//-- Z-index master list |
||||
// |
||||
// Warning: Avoid customizing these values. They're used for a bird's eye view |
||||
// of components dependent on the z-axis and are designed to all work together. |
||||
// |
||||
// Note: These variables are not generated into the Customizer. |
||||
|
||||
@zindex-navbar: 1000; |
||||
@zindex-dropdown: 1000; |
||||
@zindex-popover: 1060; |
||||
@zindex-tooltip: 1070; |
||||
@zindex-navbar-fixed: 1030; |
||||
@zindex-modal-background: 1040; |
||||
@zindex-modal: 1050; |
||||
|
||||
|
||||
//== Media queries breakpoints |
||||
// |
||||
//## Define the breakpoints at which your layout will change, adapting to different screen sizes. |
||||
|
||||
// Extra small screen / phone |
||||
//** Deprecated `@screen-xs` as of v3.0.1 |
||||
@screen-xs: 480px; |
||||
//** Deprecated `@screen-xs-min` as of v3.2.0 |
||||
@screen-xs-min: @screen-xs; |
||||
//** Deprecated `@screen-phone` as of v3.0.1 |
||||
@screen-phone: @screen-xs-min; |
||||
|
||||
// Small screen / tablet |
||||
//** Deprecated `@screen-sm` as of v3.0.1 |
||||
@screen-sm: 768px; |
||||
@screen-sm-min: @screen-sm; |
||||
//** Deprecated `@screen-tablet` as of v3.0.1 |
||||
@screen-tablet: @screen-sm-min; |
||||
|
||||
// Medium screen / desktop |
||||
//** Deprecated `@screen-md` as of v3.0.1 |
||||
@screen-md: 992px; |
||||
@screen-md-min: @screen-md; |
||||
//** Deprecated `@screen-desktop` as of v3.0.1 |
||||
@screen-desktop: @screen-md-min; |
||||
|
||||
// Large screen / wide desktop |
||||
//** Deprecated `@screen-lg` as of v3.0.1 |
||||
@screen-lg: 1200px; |
||||
@screen-lg-min: @screen-lg; |
||||
//** Deprecated `@screen-lg-desktop` as of v3.0.1 |
||||
@screen-lg-desktop: @screen-lg-min; |
||||
|
||||
// So media queries don't overlap when required, provide a maximum |
||||
@screen-xs-max: (@screen-sm-min - 1); |
||||
@screen-sm-max: (@screen-md-min - 1); |
||||
@screen-md-max: (@screen-lg-min - 1); |
||||
|
||||
|
||||
//== Grid system |
||||
// |
||||
//## Define your custom responsive grid. |
||||
|
||||
//** Number of columns in the grid. |
||||
@grid-columns: 12; |
||||
//** Padding between columns. Gets divided in half for the left and right. |
||||
@grid-gutter-width: 30px; |
||||
// Navbar collapse |
||||
//** Point at which the navbar becomes uncollapsed. |
||||
@grid-float-breakpoint: @screen-sm-min; |
||||
//** Point at which the navbar begins collapsing. |
||||
@grid-float-breakpoint-max: (@grid-float-breakpoint - 1); |
||||
|
||||
|
||||
//== Container sizes |
||||
// |
||||
//## Define the maximum width of `.container` for different screen sizes. |
||||
|
||||
// Small screen / tablet |
||||
@container-tablet: (720px + @grid-gutter-width); |
||||
//** For `@screen-sm-min` and up. |
||||
@container-sm: @container-tablet; |
||||
|
||||
// Medium screen / desktop |
||||
@container-desktop: (940px + @grid-gutter-width); |
||||
//** For `@screen-md-min` and up. |
||||
@container-md: @container-desktop; |
||||
|
||||
// Large screen / wide desktop |
||||
@container-large-desktop: (1140px + @grid-gutter-width); |
||||
//** For `@screen-lg-min` and up. |
||||
@container-lg: @container-large-desktop; |
||||
|
||||
|
||||
//== Navbar |
||||
// |
||||
//## |
||||
|
||||
// Basics of a navbar |
||||
@navbar-height: 50px; |
||||
@navbar-margin-bottom: @line-height-computed; |
||||
@navbar-border-radius: @border-radius-base; |
||||
@navbar-padding-horizontal: floor((@grid-gutter-width / 2)); |
||||
@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2); |
||||
@navbar-collapse-max-height: 340px; |
||||
|
||||
@navbar-default-color: #777; |
||||
@navbar-default-bg: #f8f8f8; |
||||
@navbar-default-border: darken(@navbar-default-bg, 6.5%); |
||||
|
||||
// Navbar links |
||||
@navbar-default-link-color: #777; |
||||
@navbar-default-link-hover-color: #333; |
||||
@navbar-default-link-hover-bg: transparent; |
||||
@navbar-default-link-active-color: #555; |
||||
@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%); |
||||
@navbar-default-link-disabled-color: #ccc; |
||||
@navbar-default-link-disabled-bg: transparent; |
||||
|
||||
// Navbar brand label |
||||
@navbar-default-brand-color: @navbar-default-link-color; |
||||
@navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%); |
||||
@navbar-default-brand-hover-bg: transparent; |
||||
|
||||
// Navbar toggle |
||||
@navbar-default-toggle-hover-bg: #ddd; |
||||
@navbar-default-toggle-icon-bar-bg: #888; |
||||
@navbar-default-toggle-border-color: #ddd; |
||||
|
||||
|
||||
// Inverted navbar |
||||
// Reset inverted navbar basics |
||||
@navbar-inverse-color: lighten(@gray-light, 15%); |
||||
@navbar-inverse-bg: #222; |
||||
@navbar-inverse-border: darken(@navbar-inverse-bg, 10%); |
||||
|
||||
// Inverted navbar links |
||||
@navbar-inverse-link-color: lighten(@gray-light, 15%); |
||||
@navbar-inverse-link-hover-color: #fff; |
||||
@navbar-inverse-link-hover-bg: transparent; |
||||
@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color; |
||||
@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%); |
||||
@navbar-inverse-link-disabled-color: #444; |
||||
@navbar-inverse-link-disabled-bg: transparent; |
||||
|
||||
// Inverted navbar brand label |
||||
@navbar-inverse-brand-color: @navbar-inverse-link-color; |
||||
@navbar-inverse-brand-hover-color: #fff; |
||||
@navbar-inverse-brand-hover-bg: transparent; |
||||
|
||||
// Inverted navbar toggle |
||||
@navbar-inverse-toggle-hover-bg: #333; |
||||
@navbar-inverse-toggle-icon-bar-bg: #fff; |
||||
@navbar-inverse-toggle-border-color: #333; |
||||
|
||||
|
||||
//== Navs |
||||
// |
||||
//## |
||||
|
||||
//=== Shared nav styles |
||||
@nav-link-padding: 10px 15px; |
||||
@nav-link-hover-bg: @gray-lighter; |
||||
|
||||
@nav-disabled-link-color: @gray-light; |
||||
@nav-disabled-link-hover-color: @gray-light; |
||||
|
||||
//== Tabs |
||||
@nav-tabs-border-color: #ddd; |
||||
|
||||
@nav-tabs-link-hover-border-color: @gray-lighter; |
||||
|
||||
@nav-tabs-active-link-hover-bg: @body-bg; |
||||
@nav-tabs-active-link-hover-color: @gray; |
||||
@nav-tabs-active-link-hover-border-color: #ddd; |
||||
|
||||
@nav-tabs-justified-link-border-color: #ddd; |
||||
@nav-tabs-justified-active-link-border-color: @body-bg; |
||||
|
||||
//== Pills |
||||
@nav-pills-border-radius: @border-radius-base; |
||||
@nav-pills-active-link-hover-bg: @component-active-bg; |
||||
@nav-pills-active-link-hover-color: @component-active-color; |
||||
|
||||
|
||||
//== Pagination |
||||
// |
||||
//## |
||||
|
||||
@pagination-color: @link-color; |
||||
@pagination-bg: #fff; |
||||
@pagination-border: #ddd; |
||||
|
||||
@pagination-hover-color: @link-hover-color; |
||||
@pagination-hover-bg: @gray-lighter; |
||||
@pagination-hover-border: #ddd; |
||||
|
||||
@pagination-active-color: #fff; |
||||
@pagination-active-bg: @brand-primary; |
||||
@pagination-active-border: @brand-primary; |
||||
|
||||
@pagination-disabled-color: @gray-light; |
||||
@pagination-disabled-bg: #fff; |
||||
@pagination-disabled-border: #ddd; |
||||
|
||||
|
||||
//== Pager |
||||
// |
||||
//## |
||||
|
||||
@pager-bg: @pagination-bg; |
||||
@pager-border: @pagination-border; |
||||
@pager-border-radius: 15px; |
||||
|
||||
@pager-hover-bg: @pagination-hover-bg; |
||||
|
||||
@pager-active-bg: @pagination-active-bg; |
||||
@pager-active-color: @pagination-active-color; |
||||
|
||||
@pager-disabled-color: @pagination-disabled-color; |
||||
|
||||
|
||||
//== Jumbotron |
||||
// |
||||
//## |
||||
|
||||
@jumbotron-padding: 30px; |
||||
@jumbotron-color: inherit; |
||||
@jumbotron-bg: @gray-lighter; |
||||
@jumbotron-heading-color: inherit; |
||||
@jumbotron-font-size: ceil((@font-size-base * 1.5)); |
||||
|
||||
|
||||
//== Form states and alerts |
||||
// |
||||
//## Define colors for form feedback states and, by default, alerts. |
||||
|
||||
@state-success-text: #3c763d; |
||||
@state-success-bg: #dff0d8; |
||||
@state-success-border: darken(spin(@state-success-bg, -10), 5%); |
||||
|
||||
@state-info-text: #31708f; |
||||
@state-info-bg: #d9edf7; |
||||
@state-info-border: darken(spin(@state-info-bg, -10), 7%); |
||||
|
||||
@state-warning-text: #8a6d3b; |
||||
@state-warning-bg: #fcf8e3; |
||||
@state-warning-border: darken(spin(@state-warning-bg, -10), 5%); |
||||
|
||||
@state-danger-text: #a94442; |
||||
@state-danger-bg: #f2dede; |
||||
@state-danger-border: darken(spin(@state-danger-bg, -10), 5%); |
||||
|
||||
|
||||
//== Tooltips |
||||
// |
||||
//## |
||||
|
||||
//** Tooltip max width |
||||
@tooltip-max-width: 200px; |
||||
//** Tooltip text color |
||||
@tooltip-color: #fff; |
||||
//** Tooltip background color |
||||
@tooltip-bg: #000; |
||||
@tooltip-opacity: .9; |
||||
|
||||
//** Tooltip arrow width |
||||
@tooltip-arrow-width: 5px; |
||||
//** Tooltip arrow color |
||||
@tooltip-arrow-color: @tooltip-bg; |
||||
|
||||
|
||||
//== Popovers |
||||
// |
||||
//## |
||||
|
||||
//** Popover body background color |
||||
@popover-bg: #fff; |
||||
//** Popover maximum width |
||||
@popover-max-width: 276px; |
||||
//** Popover border color |
||||
@popover-border-color: rgba(0,0,0,.2); |
||||
//** Popover fallback border color |
||||
@popover-fallback-border-color: #ccc; |
||||
|
||||
//** Popover title background color |
||||
@popover-title-bg: darken(@popover-bg, 3%); |
||||
|
||||
//** Popover arrow width |
||||
@popover-arrow-width: 10px; |
||||
//** Popover arrow color |
||||
@popover-arrow-color: @popover-bg; |
||||
|
||||
//** Popover outer arrow width |
||||
@popover-arrow-outer-width: (@popover-arrow-width + 1); |
||||
//** Popover outer arrow color |
||||
@popover-arrow-outer-color: fadein(@popover-border-color, 5%); |
||||
//** Popover outer arrow fallback color |
||||
@popover-arrow-outer-fallback-color: darken(@popover-fallback-border-color, 20%); |
||||
|
||||
|
||||
//== Labels |
||||
// |
||||
//## |
||||
|
||||
//** Default label background color |
||||
@label-default-bg: @gray-light; |
||||
//** Primary label background color |
||||
@label-primary-bg: @brand-primary; |
||||
//** Success label background color |
||||
@label-success-bg: @brand-success; |
||||
//** Info label background color |
||||
@label-info-bg: @brand-info; |
||||
//** Warning label background color |
||||
@label-warning-bg: @brand-warning; |
||||
//** Danger label background color |
||||
@label-danger-bg: @brand-danger; |
||||
|
||||
//** Default label text color |
||||
@label-color: #fff; |
||||
//** Default text color of a linked label |
||||
@label-link-hover-color: #fff; |
||||
|
||||
|
||||
//== Modals |
||||
// |
||||
//## |
||||
|
||||
//** Padding applied to the modal body |
||||
@modal-inner-padding: 15px; |
||||
|
||||
//** Padding applied to the modal title |
||||
@modal-title-padding: 15px; |
||||
//** Modal title line-height |
||||
@modal-title-line-height: @line-height-base; |
||||
|
||||
//** Background color of modal content area |
||||
@modal-content-bg: #fff; |
||||
//** Modal content border color |
||||
@modal-content-border-color: rgba(0,0,0,.2); |
||||
//** Modal content border color **for IE8** |
||||
@modal-content-fallback-border-color: #999; |
||||
|
||||
//** Modal backdrop background color |
||||
@modal-backdrop-bg: #000; |
||||
//** Modal backdrop opacity |
||||
@modal-backdrop-opacity: .5; |
||||
//** Modal header border color |
||||
@modal-header-border-color: #e5e5e5; |
||||
//** Modal footer border color |
||||
@modal-footer-border-color: @modal-header-border-color; |
||||
|
||||
@modal-lg: 900px; |
||||
@modal-md: 600px; |
||||
@modal-sm: 300px; |
||||
|
||||
|
||||
//== Alerts |
||||
// |
||||
//## Define alert colors, border radius, and padding. |
||||
|
||||
@alert-padding: 15px; |
||||
@alert-border-radius: @border-radius-base; |
||||
@alert-link-font-weight: bold; |
||||
|
||||
@alert-success-bg: @state-success-bg; |
||||
@alert-success-text: @state-success-text; |
||||
@alert-success-border: @state-success-border; |
||||
|
||||
@alert-info-bg: @state-info-bg; |
||||
@alert-info-text: @state-info-text; |
||||
@alert-info-border: @state-info-border; |
||||
|
||||
@alert-warning-bg: @state-warning-bg; |
||||
@alert-warning-text: @state-warning-text; |
||||
@alert-warning-border: @state-warning-border; |
||||
|
||||
@alert-danger-bg: @state-danger-bg; |
||||
@alert-danger-text: @state-danger-text; |
||||
@alert-danger-border: @state-danger-border; |
||||
|
||||
|
||||
//== Progress bars |
||||
// |
||||
//## |
||||
|
||||
//** Background color of the whole progress component |
||||
@progress-bg: #f5f5f5; |
||||
//** Progress bar text color |
||||
@progress-bar-color: #fff; |
||||
//** Variable for setting rounded corners on progress bar. |
||||
@progress-border-radius: @border-radius-base; |
||||
|
||||
//** Default progress bar color |
||||
@progress-bar-bg: @brand-primary; |
||||
//** Success progress bar color |
||||
@progress-bar-success-bg: @brand-success; |
||||
//** Warning progress bar color |
||||
@progress-bar-warning-bg: @brand-warning; |
||||
//** Danger progress bar color |
||||
@progress-bar-danger-bg: @brand-danger; |
||||
//** Info progress bar color |
||||
@progress-bar-info-bg: @brand-info; |
||||
|
||||
|
||||
//== List group |
||||
// |
||||
//## |
||||
|
||||
//** Background color on `.list-group-item` |
||||
@list-group-bg: #fff; |
||||
//** `.list-group-item` border color |
||||
@list-group-border: #ddd; |
||||
//** List group border radius |
||||
@list-group-border-radius: @border-radius-base; |
||||
|
||||
//** Background color of single list items on hover |
||||
@list-group-hover-bg: #f5f5f5; |
||||
//** Text color of active list items |
||||
@list-group-active-color: @component-active-color; |
||||
//** Background color of active list items |
||||
@list-group-active-bg: @component-active-bg; |
||||
//** Border color of active list elements |
||||
@list-group-active-border: @list-group-active-bg; |
||||
//** Text color for content within active list items |
||||
@list-group-active-text-color: lighten(@list-group-active-bg, 40%); |
||||
|
||||
//** Text color of disabled list items |
||||
@list-group-disabled-color: @gray-light; |
||||
//** Background color of disabled list items |
||||
@list-group-disabled-bg: @gray-lighter; |
||||
//** Text color for content within disabled list items |
||||
@list-group-disabled-text-color: @list-group-disabled-color; |
||||
|
||||
@list-group-link-color: #555; |
||||
@list-group-link-hover-color: @list-group-link-color; |
||||
@list-group-link-heading-color: #333; |
||||
|
||||
|
||||
//== Panels |
||||
// |
||||
//## |
||||
|
||||
@panel-bg: #fff; |
||||
@panel-body-padding: 15px; |
||||
@panel-heading-padding: 10px 15px; |
||||
@panel-footer-padding: @panel-heading-padding; |
||||
@panel-border-radius: @border-radius-base; |
||||
|
||||
//** Border color for elements within panels |
||||
@panel-inner-border: #ddd; |
||||
@panel-footer-bg: #f5f5f5; |
||||
|
||||
@panel-default-text: @gray-dark; |
||||
@panel-default-border: #ddd; |
||||
@panel-default-heading-bg: #f5f5f5; |
||||
|
||||
@panel-primary-text: #fff; |
||||
@panel-primary-border: @brand-primary; |
||||
@panel-primary-heading-bg: @brand-primary; |
||||
|
||||
@panel-success-text: @state-success-text; |
||||
@panel-success-border: @state-success-border; |
||||
@panel-success-heading-bg: @state-success-bg; |
||||
|
||||
@panel-info-text: @state-info-text; |
||||
@panel-info-border: @state-info-border; |
||||
@panel-info-heading-bg: @state-info-bg; |
||||
|
||||
@panel-warning-text: @state-warning-text; |
||||
@panel-warning-border: @state-warning-border; |
||||
@panel-warning-heading-bg: @state-warning-bg; |
||||
|
||||
@panel-danger-text: @state-danger-text; |
||||
@panel-danger-border: @state-danger-border; |
||||
@panel-danger-heading-bg: @state-danger-bg; |
||||
|
||||
|
||||
//== Thumbnails |
||||
// |
||||
//## |
||||
|
||||
//** Padding around the thumbnail image |
||||
@thumbnail-padding: 4px; |
||||
//** Thumbnail background color |
||||
@thumbnail-bg: @body-bg; |
||||
//** Thumbnail border color |
||||
@thumbnail-border: #ddd; |
||||
//** Thumbnail border radius |
||||
@thumbnail-border-radius: @border-radius-base; |
||||
|
||||
//** Custom text color for thumbnail captions |
||||
@thumbnail-caption-color: @text-color; |
||||
//** Padding around the thumbnail caption |
||||
@thumbnail-caption-padding: 9px; |
||||
|
||||
|
||||
//== Wells |
||||
// |
||||
//## |
||||
|
||||
@well-bg: #f5f5f5; |
||||
@well-border: darken(@well-bg, 7%); |
||||
|
||||
|
||||
//== Badges |
||||
// |
||||
//## |
||||
|
||||
@badge-color: #fff; |
||||
//** Linked badge text color on hover |
||||
@badge-link-hover-color: #fff; |
||||
@badge-bg: @gray-light; |
||||
|
||||
//** Badge text color in active nav link |
||||
@badge-active-color: @link-color; |
||||
//** Badge background color in active nav link |
||||
@badge-active-bg: #fff; |
||||
|
||||
@badge-font-weight: bold; |
||||
@badge-line-height: 1; |
||||
@badge-border-radius: 10px; |
||||
|
||||
|
||||
//== Breadcrumbs |
||||
// |
||||
//## |
||||
|
||||
@breadcrumb-padding-vertical: 8px; |
||||
@breadcrumb-padding-horizontal: 15px; |
||||
//** Breadcrumb background color |
||||
@breadcrumb-bg: #f5f5f5; |
||||
//** Breadcrumb text color |
||||
@breadcrumb-color: #ccc; |
||||
//** Text color of current page in the breadcrumb |
||||
@breadcrumb-active-color: @gray-light; |
||||
//** Textual separator for between breadcrumb elements |
||||
@breadcrumb-separator: "/"; |
||||
|
||||
|
||||
//== Carousel |
||||
// |
||||
//## |
||||
|
||||
@carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6); |
||||
|
||||
@carousel-control-color: #fff; |
||||
@carousel-control-width: 15%; |
||||
@carousel-control-opacity: .5; |
||||
@carousel-control-font-size: 20px; |
||||
|
||||
@carousel-indicator-active-bg: #fff; |
||||
@carousel-indicator-border-color: #fff; |
||||
|
||||
@carousel-caption-color: #fff; |
||||
|
||||
|
||||
//== Close |
||||
// |
||||
//## |
||||
|
||||
@close-font-weight: bold; |
||||
@close-color: #000; |
||||
@close-text-shadow: 0 1px 0 #fff; |
||||
|
||||
|
||||
//== Code |
||||
// |
||||
//## |
||||
|
||||
@code-color: #c7254e; |
||||
@code-bg: #f9f2f4; |
||||
|
||||
@kbd-color: #fff; |
||||
@kbd-bg: #333; |
||||
|
||||
@pre-bg: #f5f5f5; |
||||
@pre-color: @gray-dark; |
||||
@pre-border-color: #ccc; |
||||
@pre-scrollable-max-height: 340px; |
||||
|
||||
|
||||
//== Type |
||||
// |
||||
//## |
||||
|
||||
//** Horizontal offset for forms and lists. |
||||
@component-offset-horizontal: 180px; |
||||
//** Text muted color |
||||
@text-muted: @gray-light; |
||||
//** Abbreviations and acronyms border color |
||||
@abbr-border-color: @gray-light; |
||||
//** Headings small color |
||||
@headings-small-color: @gray-light; |
||||
//** Blockquote small color |
||||
@blockquote-small-color: @gray-light; |
||||
//** Blockquote font size |
||||
@blockquote-font-size: (@font-size-base * 1.25); |
||||
//** Blockquote border color |
||||
@blockquote-border-color: @gray-lighter; |
||||
//** Page header border color |
||||
@page-header-border-color: @gray-lighter; |
||||
//** Width of horizontal description list titles |
||||
@dl-horizontal-offset: @component-offset-horizontal; |
||||
//** Horizontal line color. |
||||
@hr-border: @gray-lighter; |
@ -1,29 +0,0 @@
@@ -1,29 +0,0 @@
|
||||
// |
||||
// Wells |
||||
// -------------------------------------------------- |
||||
|
||||
|
||||
// Base class |
||||
.well { |
||||
min-height: 20px; |
||||
padding: 19px; |
||||
margin-bottom: 20px; |
||||
background-color: @well-bg; |
||||
border: 1px solid @well-border; |
||||
border-radius: @border-radius-base; |
||||
.box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); |
||||
blockquote { |
||||
border-color: #ddd; |
||||
border-color: rgba(0,0,0,.15); |
||||
} |
||||
} |
||||
|
||||
// Sizes |
||||
.well-lg { |
||||
padding: 24px; |
||||
border-radius: @border-radius-large; |
||||
} |
||||
.well-sm { |
||||
padding: 9px; |
||||
border-radius: @border-radius-small; |
||||
} |
@ -1,122 +0,0 @@
@@ -1,122 +0,0 @@
|
||||
#!/usr/bin/env python3 |
||||
# Build the documentation. |
||||
|
||||
import errno, os, re, sys |
||||
from subprocess import check_call, CalledProcessError, Popen, PIPE, STDOUT |
||||
|
||||
versions = ['1.0.0', '1.1.0', '2.0.0', '3.0.2', '4.0.0', '4.1.0', '5.0.0', '5.1.0', '5.2.0', '5.2.1', '5.3.0', '6.0.0', '6.1.0', '6.1.1', '6.1.2', '6.2.0', '6.2.1', '7.0.0', '7.0.1', '7.0.2', '7.0.3', '7.1.0', '7.1.1', '7.1.2', '7.1.3', '8.0.0', '8.0.1', '8.1.0', '8.1.1', '9.0.0'] |
||||
|
||||
class Pip: |
||||
def __init__(self, venv_dir): |
||||
self.path = os.path.join(venv_dir, 'bin', 'pip') |
||||
|
||||
def install(self, package, commit=None): |
||||
"Install package using pip." |
||||
if commit: |
||||
package = 'git+https://github.com/{0}.git@{1}'.format(package, commit) |
||||
print('Installing {0}'.format(package)) |
||||
check_call([self.path, 'install', package]) |
||||
|
||||
def create_build_env(venv_dir='virtualenv'): |
||||
# Create virtualenv. |
||||
if not os.path.exists(venv_dir): |
||||
check_call(['python3', '-m', 'venv', venv_dir]) |
||||
# Install Sphinx and Breathe. Require the exact version of Sphinx which is |
||||
# compatible with Breathe. |
||||
pip = Pip(venv_dir) |
||||
pip.install('wheel') |
||||
pip.install('six') |
||||
# See: https://github.com/sphinx-doc/sphinx/issues/9777 |
||||
pip.install('docutils==0.17.1') |
||||
# Jinja2 >= 3.1 incompatible with sphinx 3.3.0 |
||||
# See: https://github.com/sphinx-doc/sphinx/issues/10291 |
||||
pip.install('Jinja2<3.1') |
||||
pip.install('sphinx-doc/sphinx', 'v3.3.0') |
||||
pip.install('michaeljones/breathe', 'v4.25.0') |
||||
|
||||
def build_docs(version='dev', **kwargs): |
||||
doc_dir = kwargs.get('doc_dir', os.path.dirname(os.path.realpath(__file__))) |
||||
work_dir = kwargs.get('work_dir', '.') |
||||
include_dir = kwargs.get( |
||||
'include_dir', os.path.join(os.path.dirname(doc_dir), 'include', 'fmt')) |
||||
# Build docs. |
||||
cmd = ['doxygen', '-'] |
||||
p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT) |
||||
doxyxml_dir = os.path.join(work_dir, 'doxyxml') |
||||
out, _ = p.communicate(input=r''' |
||||
PROJECT_NAME = fmt |
||||
GENERATE_LATEX = NO |
||||
GENERATE_MAN = NO |
||||
GENERATE_RTF = NO |
||||
CASE_SENSE_NAMES = NO |
||||
INPUT = {0}/chrono.h {0}/color.h {0}/core.h {0}/compile.h \ |
||||
{0}/format.h {0}/os.h {0}/ostream.h {0}/printf.h \ |
||||
{0}/xchar.h |
||||
QUIET = YES |
||||
JAVADOC_AUTOBRIEF = YES |
||||
AUTOLINK_SUPPORT = NO |
||||
GENERATE_HTML = NO |
||||
GENERATE_XML = YES |
||||
XML_OUTPUT = {1} |
||||
ALIASES = "rst=\verbatim embed:rst" |
||||
ALIASES += "endrst=\endverbatim" |
||||
MACRO_EXPANSION = YES |
||||
PREDEFINED = _WIN32=1 \ |
||||
__linux__=1 \ |
||||
FMT_ENABLE_IF(...)= \ |
||||
FMT_USE_VARIADIC_TEMPLATES=1 \ |
||||
FMT_USE_RVALUE_REFERENCES=1 \ |
||||
FMT_USE_USER_DEFINED_LITERALS=1 \ |
||||
FMT_USE_ALIAS_TEMPLATES=1 \ |
||||
FMT_USE_NONTYPE_TEMPLATE_ARGS=1 \ |
||||
FMT_API= \ |
||||
"FMT_BEGIN_NAMESPACE=namespace fmt {{" \ |
||||
"FMT_END_NAMESPACE=}}" \ |
||||
"FMT_STRING_ALIAS=1" \ |
||||
"FMT_VARIADIC(...)=" \ |
||||
"FMT_VARIADIC_W(...)=" \ |
||||
"FMT_DOC=1" |
||||
EXCLUDE_SYMBOLS = fmt::formatter fmt::printf_formatter fmt::arg_join \ |
||||
fmt::basic_format_arg::handle |
||||
'''.format(include_dir, doxyxml_dir).encode('UTF-8')) |
||||
out = out.decode('utf-8') |
||||
internal_symbols = [ |
||||
'fmt::detail::.*', |
||||
'basic_data<>', |
||||
'fmt::type_identity', |
||||
'fmt::dynamic_formatter' |
||||
] |
||||
noisy_warnings = [ |
||||
'warning: (Compound|Member .* of class) (' + '|'.join(internal_symbols) + \ |
||||
') is not documented.', |
||||
'warning: Internal inconsistency: .* does not belong to any container!' |
||||
] |
||||
for w in noisy_warnings: |
||||
out = re.sub('.*' + w + '\n', '', out) |
||||
print(out) |
||||
if p.returncode != 0: |
||||
raise CalledProcessError(p.returncode, cmd) |
||||
|
||||
html_dir = os.path.join(work_dir, 'html') |
||||
main_versions = reversed(versions[-3:]) |
||||
check_call([os.path.join(work_dir, 'virtualenv', 'bin', 'sphinx-build'), |
||||
'-Dbreathe_projects.format=' + os.path.abspath(doxyxml_dir), |
||||
'-Dversion=' + version, '-Drelease=' + version, |
||||
'-Aversion=' + version, '-Aversions=' + ','.join(main_versions), |
||||
'-b', 'html', doc_dir, html_dir]) |
||||
try: |
||||
check_call(['lessc', '--verbose', '--clean-css', |
||||
'--include-path=' + os.path.join(doc_dir, 'bootstrap'), |
||||
os.path.join(doc_dir, 'fmt.less'), |
||||
os.path.join(html_dir, '_static', 'fmt.css')]) |
||||
except OSError as e: |
||||
if e.errno != errno.ENOENT: |
||||
raise |
||||
print('lessc not found; make sure that Less (http://lesscss.org/) ' + |
||||
'is installed') |
||||
sys.exit(1) |
||||
return html_dir |
||||
|
||||
if __name__ == '__main__': |
||||
create_build_env() |
||||
build_docs(sys.argv[1]) |
@ -1,256 +0,0 @@
@@ -1,256 +0,0 @@
|
||||
# -*- coding: utf-8 -*- |
||||
# |
||||
# format documentation build configuration file, created by |
||||
# sphinx-quickstart on Tue Dec 18 06:46:16 2012. |
||||
# |
||||
# This file is execfile()d with the current directory set to its containing dir. |
||||
# |
||||
# Note that not all possible configuration values are present in this |
||||
# autogenerated file. |
||||
# |
||||
# All configuration values have a default; values that are commented out |
||||
# serve to show the default. |
||||
|
||||
import sys, os, re, subprocess |
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory, |
||||
# add these directories to sys.path here. If the directory is relative to the |
||||
# documentation root, use os.path.abspath to make it absolute, like shown here. |
||||
#sys.path.insert(0, os.path.abspath('.')) |
||||
|
||||
# -- General configuration ----------------------------------------------------- |
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here. |
||||
needs_sphinx = '1.2' |
||||
|
||||
if os.environ.get('READTHEDOCS', None) == 'True': |
||||
subprocess.call('doxygen') |
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions |
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. |
||||
extensions = ['sphinx.ext.ifconfig', 'breathe'] |
||||
|
||||
breathe_default_project = "format" |
||||
breathe_domain_by_extension = {"h" : "cpp"} |
||||
|
||||
# Add any paths that contain templates here, relative to this directory. |
||||
templates_path = ['_templates'] |
||||
|
||||
# The suffix of source filenames. |
||||
source_suffix = '.rst' |
||||
|
||||
# The encoding of source files. |
||||
#source_encoding = 'utf-8-sig' |
||||
|
||||
# The master toctree document. |
||||
#master_doc = 'contents' |
||||
|
||||
# General information about the project. |
||||
project = u'fmt' |
||||
copyright = u'2012-present, Victor Zverovich' |
||||
|
||||
# The version info for the project you're documenting, acts as replacement for |
||||
# |version| and |release|, also used in various other places throughout the |
||||
# built documents. |
||||
# |
||||
# The short X.Y version. |
||||
|
||||
# Version and release are passed from CMake. |
||||
#version = None |
||||
|
||||
# The full version, including alpha/beta/rc tags. |
||||
#release = version |
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation |
||||
# for a list of supported languages. |
||||
#language = None |
||||
|
||||
# There are two options for replacing |today|: either, you set today to some |
||||
# non-false value, then it is used: |
||||
#today = '' |
||||
# Else, today_fmt is used as the format for a strftime call. |
||||
#today_fmt = '%B %d, %Y' |
||||
|
||||
# List of patterns, relative to source directory, that match files and |
||||
# directories to ignore when looking for source files. |
||||
exclude_patterns = ['virtualenv'] |
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all documents. |
||||
default_role = 'cpp:any' |
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text. |
||||
#add_function_parentheses = True |
||||
|
||||
# If true, the current module name will be prepended to all description |
||||
# unit titles (such as .. function::). |
||||
#add_module_names = True |
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the |
||||
# output. They are ignored by default. |
||||
#show_authors = False |
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use. |
||||
pygments_style = 'sphinx' |
||||
|
||||
highlight_language = 'c++' |
||||
|
||||
primary_domain = 'cpp' |
||||
|
||||
# A list of ignored prefixes for module index sorting. |
||||
#modindex_common_prefix = [] |
||||
|
||||
|
||||
# -- Options for HTML output --------------------------------------------------- |
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for |
||||
# a list of builtin themes. |
||||
html_theme = 'basic-bootstrap' |
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme |
||||
# further. For a list of options available for each theme, see the |
||||
# documentation. |
||||
#html_theme_options = {} |
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory. |
||||
html_theme_path = ['.'] |
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to |
||||
# "<project> v<release> documentation". |
||||
#html_title = None |
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title. |
||||
#html_short_title = None |
||||
|
||||
# The name of an image file (relative to this directory) to place at the top |
||||
# of the sidebar. |
||||
#html_logo = None |
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the |
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 |
||||
# pixels large. |
||||
#html_favicon = None |
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here, |
||||
# relative to this directory. They are copied after the builtin static files, |
||||
# so a file named "default.css" will overwrite the builtin "default.css". |
||||
html_static_path = ['_static'] |
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, |
||||
# using the given strftime format. |
||||
#html_last_updated_fmt = '%b %d, %Y' |
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to |
||||
# typographically correct entities. |
||||
#html_use_smartypants = True |
||||
|
||||
# Custom sidebar templates, maps document names to template names. |
||||
html_sidebars = { |
||||
'**': ['localtoc.html', 'relations.html', 'sourcelink.html', 'searchbox.html'] |
||||
} |
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to |
||||
# template names. |
||||
#html_additional_pages = {} |
||||
|
||||
# If false, no module index is generated. |
||||
#html_domain_indices = True |
||||
|
||||
# If false, no index is generated. |
||||
#html_use_index = True |
||||
|
||||
# If true, the index is split into individual pages for each letter. |
||||
#html_split_index = False |
||||
|
||||
# If true, links to the reST sources are added to the pages. |
||||
#html_show_sourcelink = True |
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. |
||||
#html_show_sphinx = True |
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. |
||||
#html_show_copyright = True |
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will |
||||
# contain a <link> tag referring to it. The value of this option must be the |
||||
# base URL from which the finished HTML is served. |
||||
#html_use_opensearch = '' |
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml"). |
||||
#html_file_suffix = None |
||||
|
||||
# Output file base name for HTML help builder. |
||||
htmlhelp_basename = 'formatdoc' |
||||
|
||||
|
||||
# -- Options for LaTeX output -------------------------------------------------- |
||||
|
||||
latex_elements = { |
||||
# The paper size ('letterpaper' or 'a4paper'). |
||||
#'papersize': 'letterpaper', |
||||
|
||||
# The font size ('10pt', '11pt' or '12pt'). |
||||
#'pointsize': '10pt', |
||||
|
||||
# Additional stuff for the LaTeX preamble. |
||||
#'preamble': '', |
||||
} |
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples |
||||
# (source start file, target name, title, author, documentclass [howto/manual]). |
||||
latex_documents = [ |
||||
('index', 'format.tex', u'fmt documentation', |
||||
u'Victor Zverovich', 'manual'), |
||||
] |
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of |
||||
# the title page. |
||||
#latex_logo = None |
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts, |
||||
# not chapters. |
||||
#latex_use_parts = False |
||||
|
||||
# If true, show page references after internal links. |
||||
#latex_show_pagerefs = False |
||||
|
||||
# If true, show URL addresses after external links. |
||||
#latex_show_urls = False |
||||
|
||||
# Documents to append as an appendix to all manuals. |
||||
#latex_appendices = [] |
||||
|
||||
# If false, no module index is generated. |
||||
#latex_domain_indices = True |
||||
|
||||
|
||||
# -- Options for manual page output -------------------------------------------- |
||||
|
||||
# One entry per manual page. List of tuples |
||||
# (source start file, name, description, authors, manual section). |
||||
man_pages = [ |
||||
('index', 'fmt', u'fmt documentation', [u'Victor Zverovich'], 1) |
||||
] |
||||
|
||||
# If true, show URL addresses after external links. |
||||
#man_show_urls = False |
||||
|
||||
|
||||
# -- Options for Texinfo output ------------------------------------------------ |
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples |
||||
# (source start file, target name, title, author, |
||||
# dir menu entry, description, category) |
||||
texinfo_documents = [ |
||||
('index', 'fmt', u'fmt documentation', |
||||
u'Victor Zverovich', 'fmt', 'One line description of project.', |
||||
'Miscellaneous'), |
||||
] |
||||
|
||||
# Documents to append as an appendix to all manuals. |
||||
#texinfo_appendices = [] |
||||
|
||||
# If false, no module index is generated. |
||||
#texinfo_domain_indices = True |
||||
|
||||
# How to display URL addresses: 'footnote', 'no', or 'inline'. |
||||
#texinfo_show_urls = 'footnote' |
@ -1,10 +0,0 @@
@@ -1,10 +0,0 @@
|
||||
######## |
||||
Contents |
||||
######## |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 2 |
||||
|
||||
usage |
||||
api |
||||
syntax |
@ -1,71 +0,0 @@
@@ -1,71 +0,0 @@
|
||||
@import 'bootstrap.less'; |
||||
|
||||
@header-bg: #094d75; |
||||
@icon-font-path: "fonts/"; |
||||
|
||||
html { |
||||
overflow-y: scroll; |
||||
} |
||||
|
||||
.navbar { |
||||
border-radius: 0; |
||||
margin-bottom: 0; |
||||
background-color: darken(@header-bg, 10%); |
||||
} |
||||
|
||||
.jumbotron { |
||||
#gradient > .vertical(@header-bg; darken(@header-bg, 2%); 50%; 50%); |
||||
background-size: 100% 4px; |
||||
background-color: @header-bg; |
||||
background-repeat: repeat-y; |
||||
color: white; |
||||
text-align: center; |
||||
} |
||||
|
||||
div.sphinxsidebar { |
||||
margin-left: 0; |
||||
} |
||||
|
||||
// Keep content not too wide for better readability. |
||||
.navbar-content, .content { |
||||
.make-md-column-offset(1); |
||||
.make-md-column(10); |
||||
.make-lg-column-offset(2); |
||||
.make-lg-column(8); |
||||
} |
||||
|
||||
.footer { |
||||
padding-top: 20px; |
||||
padding-bottom: 20px; |
||||
border-top: 1px solid @gray-lighter; |
||||
text-align: center; |
||||
} |
||||
|
||||
// Indent descriptions of classes, functions and macros. |
||||
.class dd, .function dd, .macro dd { |
||||
margin-left: 20px; |
||||
} |
||||
|
||||
// Remove Bootstrap padding for Sphinx containers. |
||||
.breathe-sectiondef.container { |
||||
padding: 0; |
||||
} |
||||
|
||||
// Remove Bootstrap padding for Sphinx code elements in API signatures. |
||||
.descclassname, .descname { |
||||
padding: 0; |
||||
} |
||||
|
||||
// Override center alignment in tables. |
||||
td { |
||||
text-align: left; |
||||
} |
||||
|
||||
p.rubric { |
||||
margin-top: 10px; |
||||
} |
||||
|
||||
.github-btn { |
||||
border: 0; |
||||
overflow: hidden; |
||||
} |
@ -1,617 +0,0 @@
@@ -1,617 +0,0 @@
|
||||
.. _string-formatting-api: |
||||
|
||||
************* |
||||
API Reference |
||||
************* |
||||
|
||||
The {fmt} library API consists of the following parts: |
||||
|
||||
* :ref:`fmt/core.h <core-api>`: the core API providing main formatting functions |
||||
for ``char``/UTF-8 with compile-time checks and minimal dependencies |
||||
* :ref:`fmt/format.h <format-api>`: the full format API providing additional |
||||
formatting functions and locale support |
||||
* :ref:`fmt/ranges.h <ranges-api>`: formatting of ranges and tuples |
||||
* :ref:`fmt/chrono.h <chrono-api>`: date and time formatting |
||||
* :ref:`fmt/std.h <std-api>`: formatters for standard library types |
||||
* :ref:`fmt/compile.h <compile-api>`: format string compilation |
||||
* :ref:`fmt/color.h <color-api>`: terminal color and text style |
||||
* :ref:`fmt/os.h <os-api>`: system APIs |
||||
* :ref:`fmt/ostream.h <ostream-api>`: ``std::ostream`` support |
||||
* :ref:`fmt/printf.h <printf-api>`: ``printf`` formatting |
||||
* :ref:`fmt/xchar.h <xchar-api>`: optional ``wchar_t`` support |
||||
|
||||
All functions and types provided by the library reside in namespace ``fmt`` and |
||||
macros have prefix ``FMT_``. |
||||
|
||||
.. _core-api: |
||||
|
||||
Core API |
||||
======== |
||||
|
||||
``fmt/core.h`` defines the core API which provides main formatting functions for |
||||
``char``/UTF-8 with compile-time checks. It has minimal include dependencies for |
||||
better compile times. This header is only beneficial when using {fmt} as a |
||||
library and not in the header-only mode. |
||||
|
||||
The following functions use :ref:`format string syntax <syntax>` |
||||
similar to that of Python's `str.format |
||||
<https://docs.python.org/3/library/stdtypes.html#str.format>`_. |
||||
They take *fmt* and *args* as arguments. |
||||
|
||||
*fmt* is a format string that contains literal text and replacement fields |
||||
surrounded by braces ``{}``. The fields are replaced with formatted arguments |
||||
in the resulting string. `~fmt::format_string` is a format string which can be |
||||
implicitly constructed from a string literal or a ``constexpr`` string and is |
||||
checked at compile time in C++20. To pass a runtime format string wrap it in |
||||
`fmt::runtime`. |
||||
|
||||
*args* is an argument list representing objects to be formatted. |
||||
|
||||
.. _format: |
||||
|
||||
.. doxygenfunction:: format(format_string<T...> fmt, T&&... args) -> std::string |
||||
.. doxygenfunction:: vformat(string_view fmt, format_args args) -> std::string |
||||
|
||||
.. doxygenfunction:: format_to(OutputIt out, format_string<T...> fmt, T&&... args) -> OutputIt |
||||
.. doxygenfunction:: format_to_n(OutputIt out, size_t n, format_string<T...> fmt, T&&... args) -> format_to_n_result<OutputIt> |
||||
.. doxygenfunction:: formatted_size(format_string<T...> fmt, T&&... args) -> size_t |
||||
|
||||
.. doxygenstruct:: fmt::format_to_n_result |
||||
:members: |
||||
|
||||
.. _print: |
||||
|
||||
.. doxygenfunction:: fmt::print(format_string<T...> fmt, T&&... args) |
||||
.. doxygenfunction:: fmt::vprint(string_view fmt, format_args args) |
||||
|
||||
.. doxygenfunction:: print(std::FILE *f, format_string<T...> fmt, T&&... args) |
||||
.. doxygenfunction:: vprint(std::FILE *f, string_view fmt, format_args args) |
||||
|
||||
Compile-Time Format String Checks |
||||
--------------------------------- |
||||
|
||||
Compile-time checks are enabled when using ``FMT_STRING``. They support built-in |
||||
and string types as well as user-defined types with ``constexpr`` ``parse`` |
||||
functions in their ``formatter`` specializations. |
||||
Requires C++14 and is a no-op in C++11. |
||||
|
||||
.. doxygendefine:: FMT_STRING |
||||
|
||||
To force the use of compile-time checks, define the preprocessor variable |
||||
``FMT_ENFORCE_COMPILE_STRING``. When set, functions accepting ``FMT_STRING`` |
||||
will fail to compile with regular strings. Runtime-checked |
||||
formatting is still possible using ``fmt::vformat``, ``fmt::vprint``, etc. |
||||
|
||||
.. doxygenclass:: fmt::basic_format_string |
||||
:members: |
||||
|
||||
.. doxygentypedef:: fmt::format_string |
||||
|
||||
.. doxygenfunction:: fmt::runtime(const S&) |
||||
|
||||
Named Arguments |
||||
--------------- |
||||
|
||||
.. doxygenfunction:: fmt::arg(const S&, const T&) |
||||
|
||||
Named arguments are not supported in compile-time checks at the moment. |
||||
|
||||
Argument Lists |
||||
-------------- |
||||
|
||||
You can create your own formatting function with compile-time checks and small |
||||
binary footprint, for example (https://godbolt.org/z/oba4Mc): |
||||
|
||||
.. code:: c++ |
||||
|
||||
#include <fmt/format.h> |
||||
|
||||
void vlog(const char* file, int line, fmt::string_view format, |
||||
fmt::format_args args) { |
||||
fmt::print("{}: {}: ", file, line); |
||||
fmt::vprint(format, args); |
||||
} |
||||
|
||||
template <typename S, typename... Args> |
||||
void log(const char* file, int line, const S& format, Args&&... args) { |
||||
vlog(file, line, format, fmt::make_format_args(args...)); |
||||
} |
||||
|
||||
#define MY_LOG(format, ...) \ |
||||
log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__) |
||||
|
||||
MY_LOG("invalid squishiness: {}", 42); |
||||
|
||||
Note that ``vlog`` is not parameterized on argument types which improves compile |
||||
times and reduces binary code size compared to a fully parameterized version. |
||||
|
||||
.. doxygenfunction:: fmt::make_format_args(const Args&...) |
||||
|
||||
.. doxygenclass:: fmt::format_arg_store |
||||
:members: |
||||
|
||||
.. doxygenclass:: fmt::dynamic_format_arg_store |
||||
:members: |
||||
|
||||
.. doxygenclass:: fmt::basic_format_args |
||||
:members: |
||||
|
||||
.. doxygentypedef:: fmt::format_args |
||||
|
||||
.. doxygenclass:: fmt::basic_format_arg |
||||
:members: |
||||
|
||||
.. doxygenclass:: fmt::basic_format_parse_context |
||||
:members: |
||||
|
||||
.. doxygenclass:: fmt::basic_format_context |
||||
:members: |
||||
|
||||
.. doxygentypedef:: fmt::format_context |
||||
|
||||
Compatibility |
||||
------------- |
||||
|
||||
.. doxygenclass:: fmt::basic_string_view |
||||
:members: |
||||
|
||||
.. doxygentypedef:: fmt::string_view |
||||
|
||||
Locale |
||||
------ |
||||
|
||||
All formatting is locale-independent by default. Use the ``'L'`` format |
||||
specifier to insert the appropriate number separator characters from the |
||||
locale:: |
||||
|
||||
#include <fmt/core.h> |
||||
#include <locale> |
||||
|
||||
std::locale::global(std::locale("en_US.UTF-8")); |
||||
auto s = fmt::format("{:L}", 1000000); // s == "1,000,000" |
||||
|
||||
.. _format-api: |
||||
|
||||
Format API |
||||
========== |
||||
|
||||
``fmt/format.h`` defines the full format API providing additional formatting |
||||
functions and locale support. |
||||
|
||||
.. _udt: |
||||
|
||||
Formatting User-Defined Types |
||||
----------------------------- |
||||
|
||||
The {fmt} library provides formatters for many standard C++ types. |
||||
See :ref:`fmt/ranges.h <ranges-api>` for ranges and tuples including standard |
||||
containers such as ``std::vector``, :ref:`fmt/chrono.h <chrono-api>` for date |
||||
and time formatting and :ref:`fmt/std.h <std-api>` for path and variant |
||||
formatting. |
||||
|
||||
To make a user-defined type formattable, specialize the ``formatter<T>`` struct |
||||
template and implement ``parse`` and ``format`` methods:: |
||||
|
||||
#include <fmt/format.h> |
||||
|
||||
struct point { |
||||
double x, y; |
||||
}; |
||||
|
||||
template <> struct fmt::formatter<point> { |
||||
// Presentation format: 'f' - fixed, 'e' - exponential. |
||||
char presentation = 'f'; |
||||
|
||||
// Parses format specifications of the form ['f' | 'e']. |
||||
constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
||||
// [ctx.begin(), ctx.end()) is a character range that contains a part of |
||||
// the format string starting from the format specifications to be parsed, |
||||
// e.g. in |
||||
// |
||||
// fmt::format("{:f} - point of interest", point{1, 2}); |
||||
// |
||||
// the range will contain "f} - point of interest". The formatter should |
||||
// parse specifiers until '}' or the end of the range. In this example |
||||
// the formatter should parse the 'f' specifier and return an iterator |
||||
// pointing to '}'. |
||||
|
||||
// Please also note that this character range may be empty, in case of |
||||
// the "{}" format string, so therefore you should check ctx.begin() |
||||
// for equality with ctx.end(). |
||||
|
||||
// Parse the presentation format and store it in the formatter: |
||||
auto it = ctx.begin(), end = ctx.end(); |
||||
if (it != end && (*it == 'f' || *it == 'e')) presentation = *it++; |
||||
|
||||
// Check if reached the end of the range: |
||||
if (it != end && *it != '}') throw format_error("invalid format"); |
||||
|
||||
// Return an iterator past the end of the parsed range: |
||||
return it; |
||||
} |
||||
|
||||
// Formats the point p using the parsed format specification (presentation) |
||||
// stored in this formatter. |
||||
template <typename FormatContext> |
||||
auto format(const point& p, FormatContext& ctx) const -> decltype(ctx.out()) { |
||||
// ctx.out() is an output iterator to write to. |
||||
return presentation == 'f' |
||||
? fmt::format_to(ctx.out(), "({:.1f}, {:.1f})", p.x, p.y) |
||||
: fmt::format_to(ctx.out(), "({:.1e}, {:.1e})", p.x, p.y); |
||||
} |
||||
}; |
||||
|
||||
Then you can pass objects of type ``point`` to any formatting function:: |
||||
|
||||
point p = {1, 2}; |
||||
std::string s = fmt::format("{:f}", p); |
||||
// s == "(1.0, 2.0)" |
||||
|
||||
You can also reuse existing formatters via inheritance or composition, for |
||||
example:: |
||||
|
||||
enum class color {red, green, blue}; |
||||
|
||||
template <> struct fmt::formatter<color>: formatter<string_view> { |
||||
// parse is inherited from formatter<string_view>. |
||||
template <typename FormatContext> |
||||
auto format(color c, FormatContext& ctx) const { |
||||
string_view name = "unknown"; |
||||
switch (c) { |
||||
case color::red: name = "red"; break; |
||||
case color::green: name = "green"; break; |
||||
case color::blue: name = "blue"; break; |
||||
} |
||||
return formatter<string_view>::format(name, ctx); |
||||
} |
||||
}; |
||||
|
||||
Since ``parse`` is inherited from ``formatter<string_view>`` it will recognize |
||||
all string format specifications, for example |
||||
|
||||
.. code-block:: c++ |
||||
|
||||
fmt::format("{:>10}", color::blue) |
||||
|
||||
will return ``" blue"``. |
||||
|
||||
You can also write a formatter for a hierarchy of classes:: |
||||
|
||||
#include <type_traits> |
||||
#include <fmt/format.h> |
||||
|
||||
struct A { |
||||
virtual ~A() {} |
||||
virtual std::string name() const { return "A"; } |
||||
}; |
||||
|
||||
struct B : A { |
||||
virtual std::string name() const { return "B"; } |
||||
}; |
||||
|
||||
template <typename T> |
||||
struct fmt::formatter<T, std::enable_if_t<std::is_base_of<A, T>::value, char>> : |
||||
fmt::formatter<std::string> { |
||||
template <typename FormatCtx> |
||||
auto format(const A& a, FormatCtx& ctx) const { |
||||
return fmt::formatter<std::string>::format(a.name(), ctx); |
||||
} |
||||
}; |
||||
|
||||
int main() { |
||||
B b; |
||||
A& a = b; |
||||
fmt::print("{}", a); // prints "B" |
||||
} |
||||
|
||||
If a type provides both a ``formatter`` specialization and an implicit |
||||
conversion to a formattable type, the specialization takes precedence over the |
||||
conversion. |
||||
|
||||
For enums {fmt} also provides the ``format_as`` extension API. To format an enum |
||||
via this API define ``format_as`` that takes this enum and converts it to the |
||||
underlying type. ``format_as`` should be defined in the same namespace as the |
||||
enum. |
||||
|
||||
Example (https://godbolt.org/z/r7vvGE1v7):: |
||||
|
||||
#include <fmt/format.h> |
||||
|
||||
namespace kevin_namespacy { |
||||
enum class film { |
||||
house_of_cards, american_beauty, se7en = 7 |
||||
}; |
||||
auto format_as(film f) { return fmt::underlying(f); } |
||||
} |
||||
|
||||
int main() { |
||||
fmt::print("{}\n", kevin_namespacy::film::se7en); // prints "7" |
||||
} |
||||
|
||||
Literal-Based API |
||||
----------------- |
||||
|
||||
The following user-defined literals are defined in ``fmt/format.h``. |
||||
|
||||
.. doxygenfunction:: operator""_a() |
||||
|
||||
Utilities |
||||
--------- |
||||
|
||||
.. doxygenfunction:: fmt::ptr(T p) -> const void* |
||||
.. doxygenfunction:: fmt::ptr(const std::unique_ptr<T> &p) -> const void* |
||||
.. doxygenfunction:: fmt::ptr(const std::shared_ptr<T> &p) -> const void* |
||||
|
||||
.. doxygenfunction:: fmt::underlying(Enum e) -> typename std::underlying_type<Enum>::type |
||||
|
||||
.. doxygenfunction:: fmt::to_string(const T &value) -> std::string |
||||
|
||||
.. doxygenfunction:: fmt::join(Range &&range, string_view sep) -> join_view<detail::iterator_t<Range>, detail::sentinel_t<Range>> |
||||
|
||||
.. doxygenfunction:: fmt::join(It begin, Sentinel end, string_view sep) -> join_view<It, Sentinel> |
||||
|
||||
.. doxygenfunction:: fmt::group_digits(T value) -> group_digits_view<T> |
||||
|
||||
.. doxygenclass:: fmt::detail::buffer |
||||
:members: |
||||
|
||||
.. doxygenclass:: fmt::basic_memory_buffer |
||||
:protected-members: |
||||
:members: |
||||
|
||||
System Errors |
||||
------------- |
||||
|
||||
{fmt} does not use ``errno`` to communicate errors to the user, but it may call |
||||
system functions which set ``errno``. Users should not make any assumptions |
||||
about the value of ``errno`` being preserved by library functions. |
||||
|
||||
.. doxygenfunction:: fmt::system_error |
||||
|
||||
.. doxygenfunction:: fmt::format_system_error |
||||
|
||||
Custom Allocators |
||||
----------------- |
||||
|
||||
The {fmt} library supports custom dynamic memory allocators. |
||||
A custom allocator class can be specified as a template argument to |
||||
:class:`fmt::basic_memory_buffer`:: |
||||
|
||||
using custom_memory_buffer = |
||||
fmt::basic_memory_buffer<char, fmt::inline_buffer_size, custom_allocator>; |
||||
|
||||
It is also possible to write a formatting function that uses a custom |
||||
allocator:: |
||||
|
||||
using custom_string = |
||||
std::basic_string<char, std::char_traits<char>, custom_allocator>; |
||||
|
||||
custom_string vformat(custom_allocator alloc, fmt::string_view format_str, |
||||
fmt::format_args args) { |
||||
auto buf = custom_memory_buffer(alloc); |
||||
fmt::vformat_to(std::back_inserter(buf), format_str, args); |
||||
return custom_string(buf.data(), buf.size(), alloc); |
||||
} |
||||
|
||||
template <typename ...Args> |
||||
inline custom_string format(custom_allocator alloc, |
||||
fmt::string_view format_str, |
||||
const Args& ... args) { |
||||
return vformat(alloc, format_str, fmt::make_format_args(args...)); |
||||
} |
||||
|
||||
The allocator will be used for the output container only. Formatting functions |
||||
normally don't do any allocations for built-in and string types except for |
||||
non-default floating-point formatting that occasionally falls back on |
||||
``sprintf``. |
||||
|
||||
.. _ranges-api: |
||||
|
||||
Range and Tuple Formatting |
||||
========================== |
||||
|
||||
The library also supports convenient formatting of ranges and tuples:: |
||||
|
||||
#include <fmt/ranges.h> |
||||
|
||||
std::tuple<char, int, float> t{'a', 1, 2.0f}; |
||||
// Prints "('a', 1, 2.0)" |
||||
fmt::print("{}", t); |
||||
|
||||
|
||||
NOTE: currently, the overload of ``fmt::join`` for iterables exists in the main |
||||
``format.h`` header, but expect this to change in the future. |
||||
|
||||
Using ``fmt::join``, you can separate tuple elements with a custom separator:: |
||||
|
||||
#include <fmt/ranges.h> |
||||
|
||||
std::tuple<int, char> t = {1, 'a'}; |
||||
// Prints "1, a" |
||||
fmt::print("{}", fmt::join(t, ", ")); |
||||
|
||||
.. _chrono-api: |
||||
|
||||
Date and Time Formatting |
||||
======================== |
||||
|
||||
``fmt/chrono.h`` provides formatters for |
||||
|
||||
* `std::chrono::duration <https://en.cppreference.com/w/cpp/chrono/duration>`_ |
||||
* `std::chrono::time_point |
||||
<https://en.cppreference.com/w/cpp/chrono/time_point>`_ |
||||
* `std::tm <https://en.cppreference.com/w/cpp/chrono/c/tm>`_ |
||||
|
||||
The format syntax is described in :ref:`chrono-specs`. |
||||
|
||||
**Example**:: |
||||
|
||||
#include <fmt/chrono.h> |
||||
|
||||
int main() { |
||||
std::time_t t = std::time(nullptr); |
||||
|
||||
// Prints "The date is 2020-11-07." (with the current date): |
||||
fmt::print("The date is {:%Y-%m-%d}.", fmt::localtime(t)); |
||||
|
||||
using namespace std::literals::chrono_literals; |
||||
|
||||
// Prints "Default format: 42s 100ms": |
||||
fmt::print("Default format: {} {}\n", 42s, 100ms); |
||||
|
||||
// Prints "strftime-like format: 03:15:30": |
||||
fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s); |
||||
} |
||||
|
||||
.. doxygenfunction:: localtime(std::time_t time) |
||||
|
||||
.. doxygenfunction:: gmtime(std::time_t time) |
||||
|
||||
.. _std-api: |
||||
|
||||
Standard Library Types Formatting |
||||
================================= |
||||
|
||||
``fmt/std.h`` provides formatters for: |
||||
|
||||
* `std::filesystem::path <std::filesystem::path>`_ |
||||
* `std::thread::id <https://en.cppreference.com/w/cpp/thread/thread/id>`_ |
||||
* `std::monostate <https://en.cppreference.com/w/cpp/utility/variant/monostate>`_ |
||||
* `std::variant <https://en.cppreference.com/w/cpp/utility/variant/variant>`_ |
||||
|
||||
Formatting Variants |
||||
------------------- |
||||
|
||||
A ``std::variant`` is only formattable if every variant alternative is formattable, and requires the |
||||
``__cpp_lib_variant`` `library feature <https://en.cppreference.com/w/cpp/feature_test>`_. |
||||
|
||||
**Example**:: |
||||
|
||||
#include <fmt/std.h> |
||||
|
||||
std::variant<char, float> v0{'x'}; |
||||
// Prints "variant('x')" |
||||
fmt::print("{}", v0); |
||||
|
||||
std::variant<std::monostate, char> v1; |
||||
// Prints "variant(monostate)" |
||||
|
||||
.. _compile-api: |
||||
|
||||
Format String Compilation |
||||
========================= |
||||
|
||||
``fmt/compile.h`` provides format string compilation enabled via the |
||||
``FMT_COMPILE`` macro or the ``_cf`` user-defined literal. Format strings |
||||
marked with ``FMT_COMPILE`` or ``_cf`` are parsed, checked and converted into |
||||
efficient formatting code at compile-time. This supports arguments of built-in |
||||
and string types as well as user-defined types with ``constexpr`` ``parse`` |
||||
functions in their ``formatter`` specializations. Format string compilation can |
||||
generate more binary code compared to the default API and is only recommended in |
||||
places where formatting is a performance bottleneck. |
||||
|
||||
.. doxygendefine:: FMT_COMPILE |
||||
|
||||
.. doxygenfunction:: operator""_cf() |
||||
|
||||
.. _color-api: |
||||
|
||||
Terminal Color and Text Style |
||||
============================= |
||||
|
||||
``fmt/color.h`` provides support for terminal color and text style output. |
||||
|
||||
.. doxygenfunction:: print(const text_style &ts, const S &format_str, const Args&... args) |
||||
|
||||
.. doxygenfunction:: fg(detail::color_type) |
||||
|
||||
.. doxygenfunction:: bg(detail::color_type) |
||||
|
||||
.. doxygenfunction:: styled(const T& value, text_style ts) |
||||
|
||||
.. _os-api: |
||||
|
||||
System APIs |
||||
=========== |
||||
|
||||
.. doxygenclass:: fmt::ostream |
||||
:members: |
||||
|
||||
.. doxygenfunction:: fmt::windows_error |
||||
:members: |
||||
|
||||
.. _ostream-api: |
||||
|
||||
``std::ostream`` Support |
||||
======================== |
||||
|
||||
``fmt/ostream.h`` provides ``std::ostream`` support including formatting of |
||||
user-defined types that have an overloaded insertion operator (``operator<<``). |
||||
In order to make a type formattable via ``std::ostream`` you should provide a |
||||
``formatter`` specialization inherited from ``ostream_formatter``:: |
||||
|
||||
#include <fmt/ostream.h> |
||||
|
||||
struct date { |
||||
int year, month, day; |
||||
|
||||
friend std::ostream& operator<<(std::ostream& os, const date& d) { |
||||
return os << d.year << '-' << d.month << '-' << d.day; |
||||
} |
||||
}; |
||||
|
||||
template <> struct fmt::formatter<date> : ostream_formatter {}; |
||||
|
||||
std::string s = fmt::format("The date is {}", date{2012, 12, 9}); |
||||
// s == "The date is 2012-12-9" |
||||
|
||||
.. doxygenfunction:: streamed(const T &) |
||||
|
||||
.. doxygenfunction:: print(std::ostream &os, format_string<T...> fmt, T&&... args) |
||||
|
||||
.. _printf-api: |
||||
|
||||
``printf`` Formatting |
||||
===================== |
||||
|
||||
The header ``fmt/printf.h`` provides ``printf``-like formatting functionality. |
||||
The following functions use `printf format string syntax |
||||
<https://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html>`_ with |
||||
the POSIX extension for positional arguments. Unlike their standard |
||||
counterparts, the ``fmt`` functions are type-safe and throw an exception if an |
||||
argument type doesn't match its format specification. |
||||
|
||||
.. doxygenfunction:: printf(const S &format_str, const T&... args) |
||||
|
||||
.. doxygenfunction:: fprintf(std::FILE *f, const S &fmt, const T&... args) -> int |
||||
|
||||
.. doxygenfunction:: sprintf(const S&, const T&...) |
||||
|
||||
.. _xchar-api: |
||||
|
||||
``wchar_t`` Support |
||||
=================== |
||||
|
||||
The optional header ``fmt/xchar.h`` provides support for ``wchar_t`` and exotic |
||||
character types. |
||||
|
||||
.. doxygenstruct:: fmt::is_char |
||||
|
||||
.. doxygentypedef:: fmt::wstring_view |
||||
|
||||
.. doxygentypedef:: fmt::wformat_context |
||||
|
||||
.. doxygenfunction:: fmt::to_wstring(const T &value) |
||||
|
||||
Compatibility with C++20 ``std::format`` |
||||
======================================== |
||||
|
||||
{fmt} implements nearly all of the `C++20 formatting library |
||||
<https://en.cppreference.com/w/cpp/utility/format>`_ with the following |
||||
differences: |
||||
|
||||
* Names are defined in the ``fmt`` namespace instead of ``std`` to avoid |
||||
collisions with standard library implementations. |
||||
* Width calculation doesn't use grapheme clusterization. The latter has been |
||||
implemented in a separate branch but hasn't been integrated yet. |
||||
* Most C++20 chrono types are not supported yet. |
@ -1,10 +0,0 @@
@@ -1,10 +0,0 @@
|
||||
######## |
||||
Contents |
||||
######## |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 2 |
||||
|
||||
usage |
||||
api |
||||
syntax |
@ -1,198 +0,0 @@
@@ -1,198 +0,0 @@
|
||||
Overview |
||||
======== |
||||
|
||||
**{fmt}** is an open-source formatting library providing a fast and safe |
||||
alternative to C stdio and C++ iostreams. |
||||
|
||||
.. raw:: html |
||||
|
||||
<div class="panel panel-default"> |
||||
<div class="panel-heading">What users say:</div> |
||||
<div class="panel-body"> |
||||
Thanks for creating this library. It’s been a hole in C++ for |
||||
a long time. I’ve used both <code>boost::format</code> and |
||||
<code>loki::SPrintf</code>, and neither felt like the right answer. |
||||
This does. |
||||
</div> |
||||
</div> |
||||
|
||||
.. _format-api-intro: |
||||
|
||||
Format API |
||||
---------- |
||||
|
||||
The format API is similar in spirit to the C ``printf`` family of function but |
||||
is safer, simpler and several times `faster |
||||
<https://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_ |
||||
than common standard library implementations. |
||||
The `format string syntax <syntax.html>`_ is similar to the one used by |
||||
`str.format <https://docs.python.org/3/library/stdtypes.html#str.format>`_ in |
||||
Python: |
||||
|
||||
.. code:: c++ |
||||
|
||||
std::string s = fmt::format("The answer is {}.", 42); |
||||
|
||||
The ``fmt::format`` function returns a string "The answer is 42.". You can use |
||||
``fmt::memory_buffer`` to avoid constructing ``std::string``: |
||||
|
||||
.. code:: c++ |
||||
|
||||
auto out = fmt::memory_buffer(); |
||||
format_to(std::back_inserter(out), |
||||
"For a moment, {} happened.", "nothing"); |
||||
auto data = out.data(); // pointer to the formatted data |
||||
auto size = out.size(); // size of the formatted data |
||||
|
||||
The ``fmt::print`` function performs formatting and writes the result to a stream: |
||||
|
||||
.. code:: c++ |
||||
|
||||
fmt::print(stderr, "System error code = {}\n", errno); |
||||
|
||||
If you omit the file argument the function will print to ``stdout``: |
||||
|
||||
.. code:: c++ |
||||
|
||||
fmt::print("Don't {}\n", "panic"); |
||||
|
||||
The format API also supports positional arguments useful for localization: |
||||
|
||||
.. code:: c++ |
||||
|
||||
fmt::print("I'd rather be {1} than {0}.", "right", "happy"); |
||||
|
||||
You can pass named arguments with ``fmt::arg``: |
||||
|
||||
.. code:: c++ |
||||
|
||||
fmt::print("Hello, {name}! The answer is {number}. Goodbye, {name}.", |
||||
fmt::arg("name", "World"), fmt::arg("number", 42)); |
||||
|
||||
If your compiler supports C++11 user-defined literals, the suffix ``_a`` offers |
||||
an alternative, slightly terser syntax for named arguments: |
||||
|
||||
.. code:: c++ |
||||
|
||||
using namespace fmt::literals; |
||||
fmt::print("Hello, {name}! The answer is {number}. Goodbye, {name}.", |
||||
"name"_a="World", "number"_a=42); |
||||
|
||||
.. _safety: |
||||
|
||||
Safety |
||||
------ |
||||
|
||||
The library is fully type safe, automatic memory management prevents buffer |
||||
overflow, errors in format strings are reported using exceptions or at compile |
||||
time. For example, the code |
||||
|
||||
.. code:: c++ |
||||
|
||||
fmt::format("The answer is {:d}", "forty-two"); |
||||
|
||||
throws the ``format_error`` exception because the argument ``"forty-two"`` is a |
||||
string while the format code ``d`` only applies to integers. |
||||
|
||||
The code |
||||
|
||||
.. code:: c++ |
||||
|
||||
format(FMT_STRING("The answer is {:d}"), "forty-two"); |
||||
|
||||
reports a compile-time error on compilers that support relaxed ``constexpr``. |
||||
See `here <api.html#compile-time-format-string-checks>`_ for details. |
||||
|
||||
The following code |
||||
|
||||
.. code:: c++ |
||||
|
||||
fmt::format("Cyrillic letter {}", L'\x42e'); |
||||
|
||||
produces a compile-time error because wide character ``L'\x42e'`` cannot be |
||||
formatted into a narrow string. For comparison, writing a wide character to |
||||
``std::ostream`` results in its numeric value being written to the stream |
||||
(i.e. 1070 instead of letter 'ю' which is represented by ``L'\x42e'`` if we |
||||
use Unicode) which is rarely desirable. |
||||
|
||||
Compact Binary Code |
||||
------------------- |
||||
|
||||
The library produces compact per-call compiled code. For example |
||||
(`godbolt <https://godbolt.org/g/TZU4KF>`_), |
||||
|
||||
.. code:: c++ |
||||
|
||||
#include <fmt/core.h> |
||||
|
||||
int main() { |
||||
fmt::print("The answer is {}.", 42); |
||||
} |
||||
|
||||
compiles to just |
||||
|
||||
.. code:: asm |
||||
|
||||
main: # @main |
||||
sub rsp, 24 |
||||
mov qword ptr [rsp], 42 |
||||
mov rcx, rsp |
||||
mov edi, offset .L.str |
||||
mov esi, 17 |
||||
mov edx, 1 |
||||
call fmt::v7::vprint(fmt::v7::basic_string_view<char>, fmt::v7::format_args) |
||||
xor eax, eax |
||||
add rsp, 24 |
||||
ret |
||||
.L.str: |
||||
.asciz "The answer is {}." |
||||
|
||||
.. _portability: |
||||
|
||||
Portability |
||||
----------- |
||||
|
||||
The library is highly portable and relies only on a small set of C++11 features: |
||||
|
||||
* variadic templates |
||||
* type traits |
||||
* rvalue references |
||||
* decltype |
||||
* trailing return types |
||||
* deleted functions |
||||
* alias templates |
||||
|
||||
These are available in GCC 4.8, Clang 3.4, MSVC 19.0 (2015) and more recent |
||||
compiler version. For older compilers use {fmt} `version 4.x |
||||
<https://github.com/fmtlib/fmt/releases/tag/4.1.0>`_ which is maintained and |
||||
only requires C++98. |
||||
|
||||
The output of all formatting functions is consistent across platforms. |
||||
For example, |
||||
|
||||
.. code:: |
||||
|
||||
fmt::print("{}", std::numeric_limits<double>::infinity()); |
||||
|
||||
always prints ``inf`` while the output of ``printf`` is platform-dependent. |
||||
|
||||
.. _ease-of-use: |
||||
|
||||
Ease of Use |
||||
----------- |
||||
|
||||
{fmt} has a small self-contained code base with the core library consisting of |
||||
just three header files and no external dependencies. |
||||
A permissive MIT `license <https://github.com/fmtlib/fmt#license>`_ allows |
||||
using the library both in open-source and commercial projects. |
||||
|
||||
`Learn more... <contents.html>`_ |
||||
|
||||
.. raw:: html |
||||
|
||||
<a class="btn btn-success" href="https://github.com/fmtlib/fmt">GitHub Repository</a> |
||||
|
||||
<div class="section footer"> |
||||
<iframe src="https://ghbtns.com/github-btn.html?user=fmtlib&repo=fmt&type=watch&count=true" |
||||
class="github-btn" width="100" height="20"></iframe> |
||||
</div> |
@ -1,514 +0,0 @@
@@ -1,514 +0,0 @@
|
||||
.. _syntax: |
||||
|
||||
******************** |
||||
Format String Syntax |
||||
******************** |
||||
|
||||
Formatting functions such as :ref:`fmt::format() <format>` and |
||||
:ref:`fmt::print() <print>` use the same format string syntax described in this |
||||
section. |
||||
|
||||
Format strings contain "replacement fields" surrounded by curly braces ``{}``. |
||||
Anything that is not contained in braces is considered literal text, which is |
||||
copied unchanged to the output. If you need to include a brace character in the |
||||
literal text, it can be escaped by doubling: ``{{`` and ``}}``. |
||||
|
||||
The grammar for a replacement field is as follows: |
||||
|
||||
.. productionlist:: sf |
||||
replacement_field: "{" [`arg_id`] [":" (`format_spec` | `chrono_format_spec`)] "}" |
||||
arg_id: `integer` | `identifier` |
||||
integer: `digit`+ |
||||
digit: "0"..."9" |
||||
identifier: `id_start` `id_continue`* |
||||
id_start: "a"..."z" | "A"..."Z" | "_" |
||||
id_continue: `id_start` | `digit` |
||||
|
||||
In less formal terms, the replacement field can start with an *arg_id* |
||||
that specifies the argument whose value is to be formatted and inserted into |
||||
the output instead of the replacement field. |
||||
The *arg_id* is optionally followed by a *format_spec*, which is preceded by a |
||||
colon ``':'``. These specify a non-default format for the replacement value. |
||||
|
||||
See also the :ref:`formatspec` section. |
||||
|
||||
If the numerical arg_ids in a format string are 0, 1, 2, ... in sequence, |
||||
they can all be omitted (not just some) and the numbers 0, 1, 2, ... will be |
||||
automatically inserted in that order. |
||||
|
||||
Named arguments can be referred to by their names or indices. |
||||
|
||||
Some simple format string examples:: |
||||
|
||||
"First, thou shalt count to {0}" // References the first argument |
||||
"Bring me a {}" // Implicitly references the first argument |
||||
"From {} to {}" // Same as "From {0} to {1}" |
||||
|
||||
The *format_spec* field contains a specification of how the value should be |
||||
presented, including such details as field width, alignment, padding, decimal |
||||
precision and so on. Each value type can define its own "formatting |
||||
mini-language" or interpretation of the *format_spec*. |
||||
|
||||
Most built-in types support a common formatting mini-language, which is |
||||
described in the next section. |
||||
|
||||
A *format_spec* field can also include nested replacement fields in certain |
||||
positions within it. These nested replacement fields can contain only an |
||||
argument id; format specifications are not allowed. This allows the formatting |
||||
of a value to be dynamically specified. |
||||
|
||||
See the :ref:`formatexamples` section for some examples. |
||||
|
||||
.. _formatspec: |
||||
|
||||
Format Specification Mini-Language |
||||
================================== |
||||
|
||||
"Format specifications" are used within replacement fields contained within a |
||||
format string to define how individual values are presented (see |
||||
:ref:`syntax`). Each formattable type may define how the format |
||||
specification is to be interpreted. |
||||
|
||||
Most built-in types implement the following options for format specifications, |
||||
although some of the formatting options are only supported by the numeric types. |
||||
|
||||
The general form of a *standard format specifier* is: |
||||
|
||||
.. productionlist:: sf |
||||
format_spec: [[`fill`]`align`][`sign`]["#"]["0"][`width`]["." `precision`]["L"][`type`] |
||||
fill: <a character other than '{' or '}'> |
||||
align: "<" | ">" | "^" |
||||
sign: "+" | "-" | " " |
||||
width: `integer` | "{" [`arg_id`] "}" |
||||
precision: `integer` | "{" [`arg_id`] "}" |
||||
type: "a" | "A" | "b" | "B" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | |
||||
: "o" | "p" | "s" | "x" | "X" |
||||
|
||||
The *fill* character can be any Unicode code point other than ``'{'`` or |
||||
``'}'``. The presence of a fill character is signaled by the character following |
||||
it, which must be one of the alignment options. If the second character of |
||||
*format_spec* is not a valid alignment option, then it is assumed that both the |
||||
fill character and the alignment option are absent. |
||||
|
||||
The meaning of the various alignment options is as follows: |
||||
|
||||
+---------+----------------------------------------------------------+ |
||||
| Option | Meaning | |
||||
+=========+==========================================================+ |
||||
| ``'<'`` | Forces the field to be left-aligned within the available | |
||||
| | space (this is the default for most objects). | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'>'`` | Forces the field to be right-aligned within the | |
||||
| | available space (this is the default for numbers). | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'^'`` | Forces the field to be centered within the available | |
||||
| | space. | |
||||
+---------+----------------------------------------------------------+ |
||||
|
||||
Note that unless a minimum field width is defined, the field width will always |
||||
be the same size as the data to fill it, so that the alignment option has no |
||||
meaning in this case. |
||||
|
||||
The *sign* option is only valid for number types, and can be one of the |
||||
following: |
||||
|
||||
+---------+------------------------------------------------------------+ |
||||
| Option | Meaning | |
||||
+=========+============================================================+ |
||||
| ``'+'`` | indicates that a sign should be used for both | |
||||
| | nonnegative as well as negative numbers. | |
||||
+---------+------------------------------------------------------------+ |
||||
| ``'-'`` | indicates that a sign should be used only for negative | |
||||
| | numbers (this is the default behavior). | |
||||
+---------+------------------------------------------------------------+ |
||||
| space | indicates that a leading space should be used on | |
||||
| | nonnegative numbers, and a minus sign on negative numbers. | |
||||
+---------+------------------------------------------------------------+ |
||||
|
||||
The ``'#'`` option causes the "alternate form" to be used for the |
||||
conversion. The alternate form is defined differently for different |
||||
types. This option is only valid for integer and floating-point types. |
||||
For integers, when binary, octal, or hexadecimal output is used, this |
||||
option adds the prefix respective ``"0b"`` (``"0B"``), ``"0"``, or |
||||
``"0x"`` (``"0X"``) to the output value. Whether the prefix is |
||||
lower-case or upper-case is determined by the case of the type |
||||
specifier, for example, the prefix ``"0x"`` is used for the type ``'x'`` |
||||
and ``"0X"`` is used for ``'X'``. For floating-point numbers the |
||||
alternate form causes the result of the conversion to always contain a |
||||
decimal-point character, even if no digits follow it. Normally, a |
||||
decimal-point character appears in the result of these conversions |
||||
only if a digit follows it. In addition, for ``'g'`` and ``'G'`` |
||||
conversions, trailing zeros are not removed from the result. |
||||
|
||||
.. ifconfig:: False |
||||
|
||||
The ``','`` option signals the use of a comma for a thousands separator. |
||||
For a locale aware separator, use the ``'L'`` integer presentation type |
||||
instead. |
||||
|
||||
*width* is a decimal integer defining the minimum field width. If not |
||||
specified, then the field width will be determined by the content. |
||||
|
||||
Preceding the *width* field by a zero (``'0'``) character enables sign-aware |
||||
zero-padding for numeric types. It forces the padding to be placed after the |
||||
sign or base (if any) but before the digits. This is used for printing fields in |
||||
the form '+000000120'. This option is only valid for numeric types and it has no |
||||
effect on formatting of infinity and NaN. |
||||
|
||||
The *precision* is a decimal number indicating how many digits should be |
||||
displayed after the decimal point for a floating-point value formatted with |
||||
``'f'`` and ``'F'``, or before and after the decimal point for a floating-point |
||||
value formatted with ``'g'`` or ``'G'``. For non-number types the field |
||||
indicates the maximum field size - in other words, how many characters will be |
||||
used from the field content. The *precision* is not allowed for integer, |
||||
character, Boolean, and pointer values. Note that a C string must be |
||||
null-terminated even if precision is specified. |
||||
|
||||
The ``'L'`` option uses the current locale setting to insert the appropriate |
||||
number separator characters. This option is only valid for numeric types. |
||||
|
||||
Finally, the *type* determines how the data should be presented. |
||||
|
||||
The available string presentation types are: |
||||
|
||||
+---------+----------------------------------------------------------+ |
||||
| Type | Meaning | |
||||
+=========+==========================================================+ |
||||
| ``'s'`` | String format. This is the default type for strings and | |
||||
| | may be omitted. | |
||||
+---------+----------------------------------------------------------+ |
||||
| none | The same as ``'s'``. | |
||||
+---------+----------------------------------------------------------+ |
||||
|
||||
The available character presentation types are: |
||||
|
||||
+---------+----------------------------------------------------------+ |
||||
| Type | Meaning | |
||||
+=========+==========================================================+ |
||||
| ``'c'`` | Character format. This is the default type for | |
||||
| | characters and may be omitted. | |
||||
+---------+----------------------------------------------------------+ |
||||
| none | The same as ``'c'``. | |
||||
+---------+----------------------------------------------------------+ |
||||
|
||||
The available integer presentation types are: |
||||
|
||||
+---------+----------------------------------------------------------+ |
||||
| Type | Meaning | |
||||
+=========+==========================================================+ |
||||
| ``'b'`` | Binary format. Outputs the number in base 2. Using the | |
||||
| | ``'#'`` option with this type adds the prefix ``"0b"`` | |
||||
| | to the output value. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'B'`` | Binary format. Outputs the number in base 2. Using the | |
||||
| | ``'#'`` option with this type adds the prefix ``"0B"`` | |
||||
| | to the output value. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'c'`` | Character format. Outputs the number as a character. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'d'`` | Decimal integer. Outputs the number in base 10. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'o'`` | Octal format. Outputs the number in base 8. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'x'`` | Hex format. Outputs the number in base 16, using | |
||||
| | lower-case letters for the digits above 9. Using the | |
||||
| | ``'#'`` option with this type adds the prefix ``"0x"`` | |
||||
| | to the output value. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'X'`` | Hex format. Outputs the number in base 16, using | |
||||
| | upper-case letters for the digits above 9. Using the | |
||||
| | ``'#'`` option with this type adds the prefix ``"0X"`` | |
||||
| | to the output value. | |
||||
+---------+----------------------------------------------------------+ |
||||
| none | The same as ``'d'``. | |
||||
+---------+----------------------------------------------------------+ |
||||
|
||||
Integer presentation types can also be used with character and Boolean values. |
||||
Boolean values are formatted using textual representation, either ``true`` or |
||||
``false``, if the presentation type is not specified. |
||||
|
||||
The available presentation types for floating-point values are: |
||||
|
||||
+---------+----------------------------------------------------------+ |
||||
| Type | Meaning | |
||||
+=========+==========================================================+ |
||||
| ``'a'`` | Hexadecimal floating point format. Prints the number in | |
||||
| | base 16 with prefix ``"0x"`` and lower-case letters for | |
||||
| | digits above 9. Uses ``'p'`` to indicate the exponent. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'A'`` | Same as ``'a'`` except it uses upper-case letters for | |
||||
| | the prefix, digits above 9 and to indicate the exponent. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'e'`` | Exponent notation. Prints the number in scientific | |
||||
| | notation using the letter 'e' to indicate the exponent. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'E'`` | Exponent notation. Same as ``'e'`` except it uses an | |
||||
| | upper-case ``'E'`` as the separator character. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'f'`` | Fixed point. Displays the number as a fixed-point | |
||||
| | number. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'F'`` | Fixed point. Same as ``'f'``, but converts ``nan`` to | |
||||
| | ``NAN`` and ``inf`` to ``INF``. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'g'`` | General format. For a given precision ``p >= 1``, | |
||||
| | this rounds the number to ``p`` significant digits and | |
||||
| | then formats the result in either fixed-point format | |
||||
| | or in scientific notation, depending on its magnitude. | |
||||
| | | |
||||
| | A precision of ``0`` is treated as equivalent to a | |
||||
| | precision of ``1``. | |
||||
+---------+----------------------------------------------------------+ |
||||
| ``'G'`` | General format. Same as ``'g'`` except switches to | |
||||
| | ``'E'`` if the number gets too large. The | |
||||
| | representations of infinity and NaN are uppercased, too. | |
||||
+---------+----------------------------------------------------------+ |
||||
| none | Similar to ``'g'``, except that the default precision is | |
||||
| | as high as needed to represent the particular value. | |
||||
+---------+----------------------------------------------------------+ |
||||
|
||||
.. ifconfig:: False |
||||
|
||||
+---------+----------------------------------------------------------+ |
||||
| | The precise rules are as follows: suppose that the | |
||||
| | result formatted with presentation type ``'e'`` and | |
||||
| | precision ``p-1`` would have exponent ``exp``. Then | |
||||
| | if ``-4 <= exp < p``, the number is formatted | |
||||
| | with presentation type ``'f'`` and precision | |
||||
| | ``p-1-exp``. Otherwise, the number is formatted | |
||||
| | with presentation type ``'e'`` and precision ``p-1``. | |
||||
| | In both cases insignificant trailing zeros are removed | |
||||
| | from the significand, and the decimal point is also | |
||||
| | removed if there are no remaining digits following it. | |
||||
| | | |
||||
| | Positive and negative infinity, positive and negative | |
||||
| | zero, and nans, are formatted as ``inf``, ``-inf``, | |
||||
| | ``0``, ``-0`` and ``nan`` respectively, regardless of | |
||||
| | the precision. | |
||||
| | | |
||||
+---------+----------------------------------------------------------+ |
||||
|
||||
The available presentation types for pointers are: |
||||
|
||||
+---------+----------------------------------------------------------+ |
||||
| Type | Meaning | |
||||
+=========+==========================================================+ |
||||
| ``'p'`` | Pointer format. This is the default type for | |
||||
| | pointers and may be omitted. | |
||||
+---------+----------------------------------------------------------+ |
||||
| none | The same as ``'p'``. | |
||||
+---------+----------------------------------------------------------+ |
||||
|
||||
.. _chrono-specs: |
||||
|
||||
Chrono Format Specifications |
||||
============================ |
||||
|
||||
Format specifications for chrono types and ``std::tm`` have the following |
||||
syntax: |
||||
|
||||
.. productionlist:: sf |
||||
chrono_format_spec: [[`fill`]`align`][`width`]["." `precision`][`chrono_specs`] |
||||
chrono_specs: [`chrono_specs`] `conversion_spec` | `chrono_specs` `literal_char` |
||||
conversion_spec: "%" [`modifier`] `chrono_type` |
||||
literal_char: <a character other than '{', '}' or '%'> |
||||
modifier: "E" | "O" |
||||
chrono_type: "a" | "A" | "b" | "B" | "c" | "C" | "d" | "D" | "e" | "F" | |
||||
: "g" | "G" | "h" | "H" | "I" | "j" | "m" | "M" | "n" | "p" | |
||||
: "q" | "Q" | "r" | "R" | "S" | "t" | "T" | "u" | "U" | "V" | |
||||
: "w" | "W" | "x" | "X" | "y" | "Y" | "z" | "Z" | "%" |
||||
|
||||
Literal chars are copied unchanged to the output. Precision is valid only for |
||||
``std::chrono::duration`` types with a floating-point representation type. |
||||
|
||||
The available presentation types (*chrono_type*) for chrono durations and time |
||||
points are: |
||||
|
||||
+---------+--------------------------------------------------------------------+ |
||||
| Type | Meaning | |
||||
+=========+====================================================================+ |
||||
| ``'H'`` | The hour (24-hour clock) as a decimal number. If the result is a | |
||||
| | single digit, it is prefixed with 0. The modified command ``%OH`` | |
||||
| | produces the locale's alternative representation. | |
||||
+---------+--------------------------------------------------------------------+ |
||||
| ``'M'`` | The minute as a decimal number. If the result is a single digit, | |
||||
| | it is prefixed with 0. The modified command ``%OM`` produces the | |
||||
| | locale's alternative representation. | |
||||
+---------+--------------------------------------------------------------------+ |
||||
| ``'S'`` | Seconds as a decimal number. If the number of seconds is less than | |
||||
| | 10, the result is prefixed with 0. If the precision of the input | |
||||
| | cannot be exactly represented with seconds, then the format is a | |
||||
| | decimal floating-point number with a fixed format and a precision | |
||||
| | matching that of the precision of the input (or to a microseconds | |
||||
| | precision if the conversion to floating-point decimal seconds | |
||||
| | cannot be made within 18 fractional digits). The character for the | |
||||
| | decimal point is localized according to the locale. The modified | |
||||
| | command ``%OS`` produces the locale's alternative representation. | |
||||
+---------+--------------------------------------------------------------------+ |
||||
|
||||
Specifiers that have a calendaric component such as ``'d'`` (the day of month) |
||||
are valid only for ``std::tm`` and not durations or time points. |
||||
|
||||
.. range-specs: |
||||
|
||||
Range Format Specifications |
||||
=========================== |
||||
|
||||
Format specifications for range types have the following syntax: |
||||
|
||||
..productionlist:: sf |
||||
range_format_spec: [":" [`underlying_spec`]] |
||||
|
||||
The `underlying_spec` is parsed based on the formatter of the range's |
||||
reference type. |
||||
|
||||
By default, a range of characters or strings is printed escaped and quoted. But |
||||
if any `underlying_spec` is provided (even if it is empty), then the characters |
||||
or strings are printed according to the provided specification. |
||||
|
||||
Examples: |
||||
|
||||
fmt::format("{}", std::vector{10, 20, 30}); |
||||
// Result: [10, 20, 30] |
||||
fmt::format("{::#x}", std::vector{10, 20, 30}); |
||||
// Result: [0xa, 0x14, 0x13] |
||||
fmt::format("{}", vector{'h', 'e', 'l', 'l', 'o'}); |
||||
// Result: ['h', 'e', 'l', 'l', 'o'] |
||||
fmt::format("{::}", vector{'h', 'e', 'l', 'l', 'o'}); |
||||
// Result: [h, e, l, l, o] |
||||
fmt::format("{::d}", vector{'h', 'e', 'l', 'l', 'o'}); |
||||
// Result: [104, 101, 108, 108, 111] |
||||
|
||||
.. _formatexamples: |
||||
|
||||
Format Examples |
||||
=============== |
||||
|
||||
This section contains examples of the format syntax and comparison with |
||||
the printf formatting. |
||||
|
||||
In most of the cases the syntax is similar to the printf formatting, with the |
||||
addition of the ``{}`` and with ``:`` used instead of ``%``. |
||||
For example, ``"%03.2f"`` can be translated to ``"{:03.2f}"``. |
||||
|
||||
The new format syntax also supports new and different options, shown in the |
||||
following examples. |
||||
|
||||
Accessing arguments by position:: |
||||
|
||||
fmt::format("{0}, {1}, {2}", 'a', 'b', 'c'); |
||||
// Result: "a, b, c" |
||||
fmt::format("{}, {}, {}", 'a', 'b', 'c'); |
||||
// Result: "a, b, c" |
||||
fmt::format("{2}, {1}, {0}", 'a', 'b', 'c'); |
||||
// Result: "c, b, a" |
||||
fmt::format("{0}{1}{0}", "abra", "cad"); // arguments' indices can be repeated |
||||
// Result: "abracadabra" |
||||
|
||||
Aligning the text and specifying a width:: |
||||
|
||||
fmt::format("{:<30}", "left aligned"); |
||||
// Result: "left aligned " |
||||
fmt::format("{:>30}", "right aligned"); |
||||
// Result: " right aligned" |
||||
fmt::format("{:^30}", "centered"); |
||||
// Result: " centered " |
||||
fmt::format("{:*^30}", "centered"); // use '*' as a fill char |
||||
// Result: "***********centered***********" |
||||
|
||||
Dynamic width:: |
||||
|
||||
fmt::format("{:<{}}", "left aligned", 30); |
||||
// Result: "left aligned " |
||||
|
||||
Dynamic precision:: |
||||
|
||||
fmt::format("{:.{}f}", 3.14, 1); |
||||
// Result: "3.1" |
||||
|
||||
Replacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign:: |
||||
|
||||
fmt::format("{:+f}; {:+f}", 3.14, -3.14); // show it always |
||||
// Result: "+3.140000; -3.140000" |
||||
fmt::format("{: f}; {: f}", 3.14, -3.14); // show a space for positive numbers |
||||
// Result: " 3.140000; -3.140000" |
||||
fmt::format("{:-f}; {:-f}", 3.14, -3.14); // show only the minus -- same as '{:f}; {:f}' |
||||
// Result: "3.140000; -3.140000" |
||||
|
||||
Replacing ``%x`` and ``%o`` and converting the value to different bases:: |
||||
|
||||
fmt::format("int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42); |
||||
// Result: "int: 42; hex: 2a; oct: 52; bin: 101010" |
||||
// with 0x or 0 or 0b as prefix: |
||||
fmt::format("int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}", 42); |
||||
// Result: "int: 42; hex: 0x2a; oct: 052; bin: 0b101010" |
||||
|
||||
Padded hex byte with prefix and always prints both hex characters:: |
||||
|
||||
fmt::format("{:#04x}", 0); |
||||
// Result: "0x00" |
||||
|
||||
Box drawing using Unicode fill:: |
||||
|
||||
fmt::print( |
||||
"┌{0:─^{2}}┐\n" |
||||
"│{1: ^{2}}│\n" |
||||
"└{0:─^{2}}┘\n", "", "Hello, world!", 20); |
||||
|
||||
prints:: |
||||
|
||||
┌────────────────────┐ |
||||
│ Hello, world! │ |
||||
└────────────────────┘ |
||||
|
||||
Using type-specific formatting:: |
||||
|
||||
#include <fmt/chrono.h> |
||||
|
||||
auto t = tm(); |
||||
t.tm_year = 2010 - 1900; |
||||
t.tm_mon = 7; |
||||
t.tm_mday = 4; |
||||
t.tm_hour = 12; |
||||
t.tm_min = 15; |
||||
t.tm_sec = 58; |
||||
fmt::print("{:%Y-%m-%d %H:%M:%S}", t); |
||||
// Prints: 2010-08-04 12:15:58 |
||||
|
||||
Using the comma as a thousands separator:: |
||||
|
||||
#include <fmt/format.h> |
||||
|
||||
auto s = fmt::format(std::locale("en_US.UTF-8"), "{:L}", 1234567890); |
||||
// s == "1,234,567,890" |
||||
|
||||
.. ifconfig:: False |
||||
|
||||
Nesting arguments and more complex examples:: |
||||
|
||||
>>> for align, text in zip('<^>', ['left', 'center', 'right']): |
||||
... '{0:{fill}{align}16}") << text, fill=align, align=align) |
||||
... |
||||
'left<<<<<<<<<<<<' |
||||
'^^^^^center^^^^^' |
||||
'>>>>>>>>>>>right' |
||||
>>> |
||||
>>> octets = [192, 168, 0, 1] |
||||
Format("{:02X}{:02X}{:02X}{:02X}") << *octets) |
||||
'C0A80001' |
||||
>>> int(_, 16) |
||||
3232235521 |
||||
>>> |
||||
>>> width = 5 |
||||
>>> for num in range(5,12): |
||||
... for base in 'dXob': |
||||
... print('{0:{width}{base}}") << num, base=base, width=width), end=' ') |
||||
... print() |
||||
... |
||||
5 5 5 101 |
||||
6 6 6 110 |
||||
7 7 7 111 |
||||
8 8 10 1000 |
||||
9 9 11 1001 |
||||
10 A 12 1010 |
||||
11 B 13 1011 |
@ -1,212 +0,0 @@
@@ -1,212 +0,0 @@
|
||||
***** |
||||
Usage |
||||
***** |
||||
|
||||
To use the {fmt} library, add :file:`fmt/core.h`, :file:`fmt/format.h`, |
||||
:file:`fmt/format-inl.h`, :file:`src/format.cc` and optionally other headers |
||||
from a `release archive <https://github.com/fmtlib/fmt/releases/latest>`_ or |
||||
the `Git repository <https://github.com/fmtlib/fmt>`_ to your project. |
||||
Alternatively, you can :ref:`build the library with CMake <building>`. |
||||
|
||||
.. _building: |
||||
|
||||
Building the Library |
||||
==================== |
||||
|
||||
The included `CMake build script`__ can be used to build the fmt |
||||
library on a wide range of platforms. CMake is freely available for |
||||
download from https://www.cmake.org/download/. |
||||
|
||||
__ https://github.com/fmtlib/fmt/blob/master/CMakeLists.txt |
||||
|
||||
CMake works by generating native makefiles or project files that can |
||||
be used in the compiler environment of your choice. The typical |
||||
workflow starts with:: |
||||
|
||||
mkdir build # Create a directory to hold the build output. |
||||
cd build |
||||
cmake .. # Generate native build scripts. |
||||
|
||||
where :file:`{<path/to/fmt>}` is a path to the ``fmt`` repository. |
||||
|
||||
If you are on a \*nix system, you should now see a Makefile in the |
||||
current directory. Now you can build the library by running :command:`make`. |
||||
|
||||
Once the library has been built you can invoke :command:`make test` to run |
||||
the tests. |
||||
|
||||
You can control generation of the make ``test`` target with the ``FMT_TEST`` |
||||
CMake option. This can be useful if you include fmt as a subdirectory in |
||||
your project but don't want to add fmt's tests to your ``test`` target. |
||||
|
||||
If you use Windows and have Visual Studio installed, a :file:`FMT.sln` |
||||
file and several :file:`.vcproj` files will be created. You can then build them |
||||
using Visual Studio or msbuild. |
||||
|
||||
On Mac OS X with Xcode installed, an :file:`.xcodeproj` file will be generated. |
||||
|
||||
To build a `shared library`__ set the ``BUILD_SHARED_LIBS`` CMake variable to |
||||
``TRUE``:: |
||||
|
||||
cmake -DBUILD_SHARED_LIBS=TRUE ... |
||||
|
||||
__ https://en.wikipedia.org/wiki/Library_%28computing%29#Shared_libraries |
||||
|
||||
|
||||
To build a `static library` with position independent code (required if the main |
||||
consumer of the fmt library is a shared library i.e. a Python extension) set the |
||||
``CMAKE_POSITION_INDEPENDENT_CODE`` CMake variable to ``TRUE``:: |
||||
|
||||
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE ... |
||||
|
||||
|
||||
Installing the Library |
||||
====================== |
||||
|
||||
After building the library you can install it on a Unix-like system by running |
||||
:command:`sudo make install`. |
||||
|
||||
Usage with CMake |
||||
================ |
||||
|
||||
You can add the ``fmt`` library directory into your project and include it in |
||||
your ``CMakeLists.txt`` file:: |
||||
|
||||
add_subdirectory(fmt) |
||||
|
||||
or |
||||
|
||||
:: |
||||
|
||||
add_subdirectory(fmt EXCLUDE_FROM_ALL) |
||||
|
||||
to exclude it from ``make``, ``make all``, or ``cmake --build .``. |
||||
|
||||
You can detect and use an installed version of {fmt} as follows:: |
||||
|
||||
find_package(fmt) |
||||
target_link_libraries(<your-target> fmt::fmt) |
||||
|
||||
Setting up your target to use a header-only version of ``fmt`` is equally easy:: |
||||
|
||||
target_link_libraries(<your-target> PRIVATE fmt::fmt-header-only) |
||||
|
||||
Usage with build2 |
||||
================= |
||||
|
||||
You can use `build2 <https://build2.org>`_, a dependency manager and a |
||||
build-system combined, to use ``fmt``. |
||||
|
||||
Currently this package is available in these package repositories: |
||||
|
||||
- **https://cppget.org/fmt/** for released and published versions. |
||||
- `The git repository with the sources of the build2 package of fmt <https://github.com/build2-packaging/fmt.git>`_ |
||||
for unreleased or custom revisions of ``fmt``. |
||||
|
||||
**Usage:** |
||||
|
||||
- ``build2`` package name: ``fmt`` |
||||
- Library target name : ``lib{fmt}`` |
||||
|
||||
For example, to make your ``build2`` project depend on ``fmt``: |
||||
|
||||
- Add one of the repositories to your configurations, or in your |
||||
``repositories.manifest``, if not already there:: |
||||
|
||||
: |
||||
role: prerequisite |
||||
location: https://pkg.cppget.org/1/stable |
||||
|
||||
- Add this package as a dependency to your ``./manifest`` file |
||||
(example for ``v7.0.x``):: |
||||
|
||||
depends: fmt ~7.0.0 |
||||
|
||||
- Import the target and use it as a prerequisite to your own target |
||||
using `fmt` in the appropriate ``buildfile``:: |
||||
|
||||
import fmt = fmt%lib{fmt} |
||||
lib{mylib} : cxx{**} ... $fmt |
||||
|
||||
Then build your project as usual with `b` or `bdep update`. |
||||
|
||||
For ``build2`` newcomers or to get more details and use cases, you can read the |
||||
``build2`` |
||||
`toolchain introduction <https://build2.org/build2-toolchain/doc/build2-toolchain-intro.xhtml>`_. |
||||
|
||||
Building the Documentation |
||||
========================== |
||||
|
||||
To build the documentation you need the following software installed on your |
||||
system: |
||||
|
||||
* `Python <https://www.python.org/>`_ with pip and virtualenv |
||||
* `Doxygen <http://www.stack.nl/~dimitri/doxygen/>`_ |
||||
* `Less <http://lesscss.org/>`_ with ``less-plugin-clean-css``. |
||||
Ubuntu doesn't package the ``clean-css`` plugin so you should use ``npm`` |
||||
instead of ``apt`` to install both ``less`` and the plugin:: |
||||
|
||||
sudo npm install -g less less-plugin-clean-css. |
||||
|
||||
First generate makefiles or project files using CMake as described in |
||||
the previous section. Then compile the ``doc`` target/project, for example:: |
||||
|
||||
make doc |
||||
|
||||
This will generate the HTML documentation in ``doc/html``. |
||||
|
||||
Conda |
||||
===== |
||||
|
||||
fmt can be installed on Linux, macOS and Windows with |
||||
`Conda <https://docs.conda.io/en/latest/>`__, using its |
||||
`conda-forge <https://conda-forge.org>`__ |
||||
`package <https://github.com/conda-forge/fmt-feedstock>`__, as follows:: |
||||
|
||||
conda install -c conda-forge fmt |
||||
|
||||
Vcpkg |
||||
===== |
||||
|
||||
You can download and install fmt using the `vcpkg |
||||
<https://github.com/Microsoft/vcpkg>`__ dependency manager:: |
||||
|
||||
git clone https://github.com/Microsoft/vcpkg.git |
||||
cd vcpkg |
||||
./bootstrap-vcpkg.sh |
||||
./vcpkg integrate install |
||||
./vcpkg install fmt |
||||
|
||||
The fmt port in vcpkg is kept up to date by Microsoft team members and community |
||||
contributors. If the version is out of date, please `create an issue or pull |
||||
request <https://github.com/Microsoft/vcpkg>`__ on the vcpkg repository. |
||||
|
||||
LHelper |
||||
======= |
||||
|
||||
You can download and install fmt using |
||||
`lhelper <https://github.com/franko/lhelper>`__ dependency manager:: |
||||
|
||||
lhelper activate <some-environment> |
||||
lhelper install fmt |
||||
|
||||
All the recipes for lhelper are kept in the |
||||
`lhelper's recipe <https://github.com/franko/lhelper-recipes>`__ repository. |
||||
|
||||
Android NDK |
||||
=========== |
||||
|
||||
fmt provides `Android.mk file`__ that can be used to build the library |
||||
with `Android NDK <https://developer.android.com/tools/sdk/ndk/index.html>`_. |
||||
For an example of using fmt with Android NDK, see the |
||||
`android-ndk-example <https://github.com/fmtlib/android-ndk-example>`_ |
||||
repository. |
||||
|
||||
__ https://github.com/fmtlib/fmt/blob/master/support/Android.mk |
||||
|
||||
Homebrew |
||||
======== |
||||
|
||||
fmt can be installed on OS X using `Homebrew <https://brew.sh/>`_:: |
||||
|
||||
brew install fmt |
@ -1,856 +0,0 @@
@@ -1,856 +0,0 @@
|
||||
/* |
||||
* basic.css |
||||
* ~~~~~~~~~ |
||||
* |
||||
* Sphinx stylesheet -- basic theme. |
||||
* |
||||
* :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. |
||||
* :license: BSD, see LICENSE for details. |
||||
* |
||||
*/ |
||||
|
||||
/* -- main layout ----------------------------------------------------------- */ |
||||
|
||||
div.clearer { |
||||
clear: both; |
||||
} |
||||
|
||||
div.section::after { |
||||
display: block; |
||||
content: ''; |
||||
clear: left; |
||||
} |
||||
|
||||
/* -- relbar ---------------------------------------------------------------- */ |
||||
|
||||
div.related { |
||||
width: 100%; |
||||
font-size: 90%; |
||||
} |
||||
|
||||
div.related h3 { |
||||
display: none; |
||||
} |
||||
|
||||
div.related ul { |
||||
margin: 0; |
||||
padding: 0 0 0 10px; |
||||
list-style: none; |
||||
} |
||||
|
||||
div.related li { |
||||
display: inline; |
||||
} |
||||
|
||||
div.related li.right { |
||||
float: right; |
||||
margin-right: 5px; |
||||
} |
||||
|
||||
/* -- sidebar --------------------------------------------------------------- */ |
||||
|
||||
div.sphinxsidebarwrapper { |
||||
padding: 10px 5px 0 10px; |
||||
} |
||||
|
||||
div.sphinxsidebar { |
||||
float: left; |
||||
width: 230px; |
||||
margin-left: -100%; |
||||
font-size: 90%; |
||||
word-wrap: break-word; |
||||
overflow-wrap : break-word; |
||||
} |
||||
|
||||
div.sphinxsidebar ul { |
||||
list-style: none; |
||||
} |
||||
|
||||
div.sphinxsidebar ul ul, |
||||
div.sphinxsidebar ul.want-points { |
||||
margin-left: 20px; |
||||
list-style: square; |
||||
} |
||||
|
||||
div.sphinxsidebar ul ul { |
||||
margin-top: 0; |
||||
margin-bottom: 0; |
||||
} |
||||
|
||||
div.sphinxsidebar form { |
||||
margin-top: 10px; |
||||
} |
||||
|
||||
div.sphinxsidebar input { |
||||
border: 1px solid #98dbcc; |
||||
font-family: sans-serif; |
||||
font-size: 1em; |
||||
} |
||||
|
||||
div.sphinxsidebar #searchbox form.search { |
||||
overflow: hidden; |
||||
} |
||||
|
||||
div.sphinxsidebar #searchbox input[type="text"] { |
||||
float: left; |
||||
width: 80%; |
||||
padding: 0.25em; |
||||
box-sizing: border-box; |
||||
} |
||||
|
||||
div.sphinxsidebar #searchbox input[type="submit"] { |
||||
float: left; |
||||
width: 20%; |
||||
border-left: none; |
||||
padding: 0.25em; |
||||
box-sizing: border-box; |
||||
} |
||||
|
||||
|
||||
img { |
||||
border: 0; |
||||
max-width: 100%; |
||||
} |
||||
|
||||
/* -- search page ----------------------------------------------------------- */ |
||||
|
||||
ul.search { |
||||
margin: 10px 0 0 20px; |
||||
padding: 0; |
||||
} |
||||
|
||||
ul.search li { |
||||
padding: 5px 0 5px 20px; |
||||
background-image: url(file.png); |
||||
background-repeat: no-repeat; |
||||
background-position: 0 7px; |
||||
} |
||||
|
||||
ul.search li a { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
ul.search li div.context { |
||||
color: #888; |
||||
margin: 2px 0 0 30px; |
||||
text-align: left; |
||||
} |
||||
|
||||
ul.keywordmatches li.goodmatch a { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
/* -- index page ------------------------------------------------------------ */ |
||||
|
||||
table.contentstable { |
||||
width: 90%; |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
} |
||||
|
||||
table.contentstable p.biglink { |
||||
line-height: 150%; |
||||
} |
||||
|
||||
a.biglink { |
||||
font-size: 1.3em; |
||||
} |
||||
|
||||
span.linkdescr { |
||||
font-style: italic; |
||||
padding-top: 5px; |
||||
font-size: 90%; |
||||
} |
||||
|
||||
/* -- general index --------------------------------------------------------- */ |
||||
|
||||
table.indextable { |
||||
width: 100%; |
||||
} |
||||
|
||||
table.indextable td { |
||||
text-align: left; |
||||
vertical-align: top; |
||||
} |
||||
|
||||
table.indextable ul { |
||||
margin-top: 0; |
||||
margin-bottom: 0; |
||||
list-style-type: none; |
||||
} |
||||
|
||||
table.indextable > tbody > tr > td > ul { |
||||
padding-left: 0em; |
||||
} |
||||
|
||||
table.indextable tr.pcap { |
||||
height: 10px; |
||||
} |
||||
|
||||
table.indextable tr.cap { |
||||
margin-top: 10px; |
||||
background-color: #f2f2f2; |
||||
} |
||||
|
||||
img.toggler { |
||||
margin-right: 3px; |
||||
margin-top: 3px; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
div.modindex-jumpbox { |
||||
border-top: 1px solid #ddd; |
||||
border-bottom: 1px solid #ddd; |
||||
margin: 1em 0 1em 0; |
||||
padding: 0.4em; |
||||
} |
||||
|
||||
div.genindex-jumpbox { |
||||
border-top: 1px solid #ddd; |
||||
border-bottom: 1px solid #ddd; |
||||
margin: 1em 0 1em 0; |
||||
padding: 0.4em; |
||||
} |
||||
|
||||
/* -- domain module index --------------------------------------------------- */ |
||||
|
||||
table.modindextable td { |
||||
padding: 2px; |
||||
border-collapse: collapse; |
||||
} |
||||
|
||||
/* -- general body styles --------------------------------------------------- */ |
||||
|
||||
div.body { |
||||
min-width: 450px; |
||||
max-width: 800px; |
||||
} |
||||
|
||||
div.body p, div.body dd, div.body li, div.body blockquote { |
||||
-moz-hyphens: auto; |
||||
-ms-hyphens: auto; |
||||
-webkit-hyphens: auto; |
||||
hyphens: auto; |
||||
} |
||||
|
||||
a.headerlink { |
||||
visibility: hidden; |
||||
} |
||||
|
||||
a.brackets:before, |
||||
span.brackets > a:before{ |
||||
content: "["; |
||||
} |
||||
|
||||
a.brackets:after, |
||||
span.brackets > a:after { |
||||
content: "]"; |
||||
} |
||||
|
||||
h1:hover > a.headerlink, |
||||
h2:hover > a.headerlink, |
||||
h3:hover > a.headerlink, |
||||
h4:hover > a.headerlink, |
||||
h5:hover > a.headerlink, |
||||
h6:hover > a.headerlink, |
||||
dt:hover > a.headerlink, |
||||
caption:hover > a.headerlink, |
||||
p.caption:hover > a.headerlink, |
||||
div.code-block-caption:hover > a.headerlink { |
||||
visibility: visible; |
||||
} |
||||
|
||||
div.body p.caption { |
||||
text-align: inherit; |
||||
} |
||||
|
||||
div.body td { |
||||
text-align: left; |
||||
} |
||||
|
||||
.first { |
||||
margin-top: 0 !important; |
||||
} |
||||
|
||||
p.rubric { |
||||
margin-top: 30px; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
img.align-left, .figure.align-left, object.align-left { |
||||
clear: left; |
||||
float: left; |
||||
margin-right: 1em; |
||||
} |
||||
|
||||
img.align-right, .figure.align-right, object.align-right { |
||||
clear: right; |
||||
float: right; |
||||
margin-left: 1em; |
||||
} |
||||
|
||||
img.align-center, .figure.align-center, object.align-center { |
||||
display: block; |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
} |
||||
|
||||
img.align-default, .figure.align-default { |
||||
display: block; |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
} |
||||
|
||||
.align-left { |
||||
text-align: left; |
||||
} |
||||
|
||||
.align-center { |
||||
text-align: center; |
||||
} |
||||
|
||||
.align-default { |
||||
text-align: center; |
||||
} |
||||
|
||||
.align-right { |
||||
text-align: right; |
||||
} |
||||
|
||||
/* -- sidebars -------------------------------------------------------------- */ |
||||
|
||||
div.sidebar { |
||||
margin: 0 0 0.5em 1em; |
||||
border: 1px solid #ddb; |
||||
padding: 7px; |
||||
background-color: #ffe; |
||||
width: 40%; |
||||
float: right; |
||||
clear: right; |
||||
overflow-x: auto; |
||||
} |
||||
|
||||
p.sidebar-title { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
div.admonition, div.topic, blockquote { |
||||
clear: left; |
||||
} |
||||
|
||||
/* -- topics ---------------------------------------------------------------- */ |
||||
|
||||
div.topic { |
||||
border: 1px solid #ccc; |
||||
padding: 7px; |
||||
margin: 10px 0 10px 0; |
||||
} |
||||
|
||||
p.topic-title { |
||||
font-size: 1.1em; |
||||
font-weight: bold; |
||||
margin-top: 10px; |
||||
} |
||||
|
||||
/* -- admonitions ----------------------------------------------------------- */ |
||||
|
||||
div.admonition { |
||||
margin-top: 10px; |
||||
margin-bottom: 10px; |
||||
padding: 7px; |
||||
} |
||||
|
||||
div.admonition dt { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
p.admonition-title { |
||||
margin: 0px 10px 5px 0px; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
div.body p.centered { |
||||
text-align: center; |
||||
margin-top: 25px; |
||||
} |
||||
|
||||
/* -- content of sidebars/topics/admonitions -------------------------------- */ |
||||
|
||||
div.sidebar > :last-child, |
||||
div.topic > :last-child, |
||||
div.admonition > :last-child { |
||||
margin-bottom: 0; |
||||
} |
||||
|
||||
div.sidebar::after, |
||||
div.topic::after, |
||||
div.admonition::after, |
||||
blockquote::after { |
||||
display: block; |
||||
content: ''; |
||||
clear: both; |
||||
} |
||||
|
||||
/* -- tables ---------------------------------------------------------------- */ |
||||
|
||||
table.docutils { |
||||
margin-top: 10px; |
||||
margin-bottom: 10px; |
||||
border: 0; |
||||
border-collapse: collapse; |
||||
} |
||||
|
||||
table.align-center { |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
} |
||||
|
||||
table.align-default { |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
} |
||||
|
||||
table caption span.caption-number { |
||||
font-style: italic; |
||||
} |
||||
|
||||
table caption span.caption-text { |
||||
} |
||||
|
||||
table.docutils td, table.docutils th { |
||||
padding: 1px 8px 1px 5px; |
||||
border-top: 0; |
||||
border-left: 0; |
||||
border-right: 0; |
||||
border-bottom: 1px solid #aaa; |
||||
} |
||||
|
||||
table.footnote td, table.footnote th { |
||||
border: 0 !important; |
||||
} |
||||
|
||||
th { |
||||
text-align: left; |
||||
padding-right: 5px; |
||||
} |
||||
|
||||
table.citation { |
||||
border-left: solid 1px gray; |
||||
margin-left: 1px; |
||||
} |
||||
|
||||
table.citation td { |
||||
border-bottom: none; |
||||
} |
||||
|
||||
th > :first-child, |
||||
td > :first-child { |
||||
margin-top: 0px; |
||||
} |
||||
|
||||
th > :last-child, |
||||
td > :last-child { |
||||
margin-bottom: 0px; |
||||
} |
||||
|
||||
/* -- figures --------------------------------------------------------------- */ |
||||
|
||||
div.figure { |
||||
margin: 0.5em; |
||||
padding: 0.5em; |
||||
} |
||||
|
||||
div.figure p.caption { |
||||
padding: 0.3em; |
||||
} |
||||
|
||||
div.figure p.caption span.caption-number { |
||||
font-style: italic; |
||||
} |
||||
|
||||
div.figure p.caption span.caption-text { |
||||
} |
||||
|
||||
/* -- field list styles ----------------------------------------------------- */ |
||||
|
||||
table.field-list td, table.field-list th { |
||||
border: 0 !important; |
||||
} |
||||
|
||||
.field-list ul { |
||||
margin: 0; |
||||
padding-left: 1em; |
||||
} |
||||
|
||||
.field-list p { |
||||
margin: 0; |
||||
} |
||||
|
||||
.field-name { |
||||
-moz-hyphens: manual; |
||||
-ms-hyphens: manual; |
||||
-webkit-hyphens: manual; |
||||
hyphens: manual; |
||||
} |
||||
|
||||
/* -- hlist styles ---------------------------------------------------------- */ |
||||
|
||||
table.hlist { |
||||
margin: 1em 0; |
||||
} |
||||
|
||||
table.hlist td { |
||||
vertical-align: top; |
||||
} |
||||
|
||||
|
||||
/* -- other body styles ----------------------------------------------------- */ |
||||
|
||||
ol.arabic { |
||||
list-style: decimal; |
||||
} |
||||
|
||||
ol.loweralpha { |
||||
list-style: lower-alpha; |
||||
} |
||||
|
||||
ol.upperalpha { |
||||
list-style: upper-alpha; |
||||
} |
||||
|
||||
ol.lowerroman { |
||||
list-style: lower-roman; |
||||
} |
||||
|
||||
ol.upperroman { |
||||
list-style: upper-roman; |
||||
} |
||||
|
||||
:not(li) > ol > li:first-child > :first-child, |
||||
:not(li) > ul > li:first-child > :first-child { |
||||
margin-top: 0px; |
||||
} |
||||
|
||||
:not(li) > ol > li:last-child > :last-child, |
||||
:not(li) > ul > li:last-child > :last-child { |
||||
margin-bottom: 0px; |
||||
} |
||||
|
||||
ol.simple ol p, |
||||
ol.simple ul p, |
||||
ul.simple ol p, |
||||
ul.simple ul p { |
||||
margin-top: 0; |
||||
} |
||||
|
||||
ol.simple > li:not(:first-child) > p, |
||||
ul.simple > li:not(:first-child) > p { |
||||
margin-top: 0; |
||||
} |
||||
|
||||
ol.simple p, |
||||
ul.simple p { |
||||
margin-bottom: 0; |
||||
} |
||||
|
||||
dl.footnote > dt, |
||||
dl.citation > dt { |
||||
float: left; |
||||
margin-right: 0.5em; |
||||
} |
||||
|
||||
dl.footnote > dd, |
||||
dl.citation > dd { |
||||
margin-bottom: 0em; |
||||
} |
||||
|
||||
dl.footnote > dd:after, |
||||
dl.citation > dd:after { |
||||
content: ""; |
||||
clear: both; |
||||
} |
||||
|
||||
dl.field-list { |
||||
display: grid; |
||||
grid-template-columns: fit-content(30%) auto; |
||||
} |
||||
|
||||
dl.field-list > dt { |
||||
font-weight: bold; |
||||
word-break: break-word; |
||||
padding-left: 0.5em; |
||||
padding-right: 5px; |
||||
} |
||||
|
||||
dl.field-list > dt:after { |
||||
content: ":"; |
||||
} |
||||
|
||||
dl.field-list > dd { |
||||
padding-left: 0.5em; |
||||
margin-top: 0em; |
||||
margin-left: 0em; |
||||
margin-bottom: 0em; |
||||
} |
||||
|
||||
dl { |
||||
margin-bottom: 15px; |
||||
} |
||||
|
||||
dd > :first-child { |
||||
margin-top: 0px; |
||||
} |
||||
|
||||
dd ul, dd table { |
||||
margin-bottom: 10px; |
||||
} |
||||
|
||||
dd { |
||||
margin-top: 3px; |
||||
margin-bottom: 10px; |
||||
margin-left: 30px; |
||||
} |
||||
|
||||
dl > dd:last-child, |
||||
dl > dd:last-child > :last-child { |
||||
margin-bottom: 0; |
||||
} |
||||
|
||||
dt:target, span.highlighted { |
||||
background-color: #fbe54e; |
||||
} |
||||
|
||||
rect.highlighted { |
||||
fill: #fbe54e; |
||||
} |
||||
|
||||
dl.glossary dt { |
||||
font-weight: bold; |
||||
font-size: 1.1em; |
||||
} |
||||
|
||||
.optional { |
||||
font-size: 1.3em; |
||||
} |
||||
|
||||
.sig-paren { |
||||
font-size: larger; |
||||
} |
||||
|
||||
.versionmodified { |
||||
font-style: italic; |
||||
} |
||||
|
||||
.system-message { |
||||
background-color: #fda; |
||||
padding: 5px; |
||||
border: 3px solid red; |
||||
} |
||||
|
||||
.footnote:target { |
||||
background-color: #ffa; |
||||
} |
||||
|
||||
.line-block { |
||||
display: block; |
||||
margin-top: 1em; |
||||
margin-bottom: 1em; |
||||
} |
||||
|
||||
.line-block .line-block { |
||||
margin-top: 0; |
||||
margin-bottom: 0; |
||||
margin-left: 1.5em; |
||||
} |
||||
|
||||
.guilabel, .menuselection { |
||||
font-family: sans-serif; |
||||
} |
||||
|
||||
.accelerator { |
||||
text-decoration: underline; |
||||
} |
||||
|
||||
.classifier { |
||||
font-style: oblique; |
||||
} |
||||
|
||||
.classifier:before { |
||||
font-style: normal; |
||||
margin: 0.5em; |
||||
content: ":"; |
||||
} |
||||
|
||||
abbr, acronym { |
||||
border-bottom: dotted 1px; |
||||
cursor: help; |
||||
} |
||||
|
||||
/* -- code displays --------------------------------------------------------- */ |
||||
|
||||
pre { |
||||
overflow: auto; |
||||
overflow-y: hidden; /* fixes display issues on Chrome browsers */ |
||||
} |
||||
|
||||
pre, div[class*="highlight-"] { |
||||
clear: both; |
||||
} |
||||
|
||||
span.pre { |
||||
-moz-hyphens: none; |
||||
-ms-hyphens: none; |
||||
-webkit-hyphens: none; |
||||
hyphens: none; |
||||
} |
||||
|
||||
div[class*="highlight-"] { |
||||
margin: 1em 0; |
||||
} |
||||
|
||||
td.linenos pre { |
||||
border: 0; |
||||
background-color: transparent; |
||||
color: #aaa; |
||||
} |
||||
|
||||
table.highlighttable { |
||||
display: block; |
||||
} |
||||
|
||||
table.highlighttable tbody { |
||||
display: block; |
||||
} |
||||
|
||||
table.highlighttable tr { |
||||
display: flex; |
||||
} |
||||
|
||||
table.highlighttable td { |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
|
||||
table.highlighttable td.linenos { |
||||
padding-right: 0.5em; |
||||
} |
||||
|
||||
table.highlighttable td.code { |
||||
flex: 1; |
||||
overflow: hidden; |
||||
} |
||||
|
||||
.highlight .hll { |
||||
display: block; |
||||
} |
||||
|
||||
div.highlight pre, |
||||
table.highlighttable pre { |
||||
margin: 0; |
||||
} |
||||
|
||||
div.code-block-caption + div { |
||||
margin-top: 0; |
||||
} |
||||
|
||||
div.code-block-caption { |
||||
margin-top: 1em; |
||||
padding: 2px 5px; |
||||
font-size: small; |
||||
} |
||||
|
||||
div.code-block-caption code { |
||||
background-color: transparent; |
||||
} |
||||
|
||||
table.highlighttable td.linenos, |
||||
span.linenos, |
||||
div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ |
||||
user-select: none; |
||||
} |
||||
|
||||
div.code-block-caption span.caption-number { |
||||
padding: 0.1em 0.3em; |
||||
font-style: italic; |
||||
} |
||||
|
||||
div.code-block-caption span.caption-text { |
||||
} |
||||
|
||||
div.literal-block-wrapper { |
||||
margin: 1em 0; |
||||
} |
||||
|
||||
code.descname { |
||||
background-color: transparent; |
||||
font-weight: bold; |
||||
font-size: 1.2em; |
||||
} |
||||
|
||||
code.descclassname { |
||||
background-color: transparent; |
||||
} |
||||
|
||||
code.xref, a code { |
||||
background-color: transparent; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { |
||||
background-color: transparent; |
||||
} |
||||
|
||||
.viewcode-link { |
||||
float: right; |
||||
} |
||||
|
||||
.viewcode-back { |
||||
float: right; |
||||
font-family: sans-serif; |
||||
} |
||||
|
||||
div.viewcode-block:target { |
||||
margin: -1px -10px; |
||||
padding: 0 10px; |
||||
} |
||||
|
||||
/* -- math display ---------------------------------------------------------- */ |
||||
|
||||
img.math { |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
div.body div.math p { |
||||
text-align: center; |
||||
} |
||||
|
||||
span.eqno { |
||||
float: right; |
||||
} |
||||
|
||||
span.eqno a.headerlink { |
||||
position: absolute; |
||||
z-index: 1; |
||||
} |
||||
|
||||
div.math:hover a.headerlink { |
||||
visibility: visible; |
||||
} |
||||
|
||||
/* -- printout stylesheet --------------------------------------------------- */ |
||||
|
||||
@media print { |
||||
div.document, |
||||
div.documentwrapper, |
||||
div.bodywrapper { |
||||
margin: 0 !important; |
||||
width: 100%; |
||||
} |
||||
|
||||
div.sphinxsidebar, |
||||
div.related, |
||||
div.footer, |
||||
#top-link { |
||||
display: none; |
||||
} |
||||
} |
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue