diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml index a646532..501686b 100644 --- a/.github/workflows/jekyll.yml +++ b/.github/workflows/jekyll.yml @@ -32,16 +32,17 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Ruby - uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0 + # https://github.com/ruby/setup-ruby/releases/tag/v1.207.0 + uses: ruby/setup-ruby@4a9ddd6f338a97768b8006bf671dfbad383215f4 with: ruby-version: '3.1' # Not needed with a .ruby-version file bundler-cache: true # runs 'bundle install' and caches installed gems automatically cache-version: 0 # Increment this number if you need to re-download cached gems - name: Setup Pages id: pages - uses: actions/configure-pages@v3 + uses: actions/configure-pages@v5 - name: Build with Jekyll # Outputs to the './_site' directory by default run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" @@ -49,7 +50,7 @@ jobs: JEKYLL_ENV: production - name: Upload artifact # Automatically uploads an artifact from the './_site' directory by default - uses: actions/upload-pages-artifact@v2 + uses: actions/upload-pages-artifact@v3 # Deployment job deploy: @@ -61,4 +62,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index f40fbd8..3b0461a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,10 @@ _site .jekyll-cache .jekyll-metadata vendor +.claude +.playwright/ +.playwright-mcp/ +specs/ +*.log +core +.serena diff --git a/.specify/memory/constitution.md b/.specify/memory/constitution.md new file mode 100644 index 0000000..d4cd7e2 --- /dev/null +++ b/.specify/memory/constitution.md @@ -0,0 +1,93 @@ + + +# DevFest Perros-Guirec Website Constitution + +## Core Principles + +### I. Static-First Architecture +All content MUST be statically generated at build time. Jekyll processes YAML front matter and Liquid templates into static HTML/CSS/JS. No server-side runtime dependencies beyond a web server for serving files. + +**Rationale**: Static sites are fast, secure, and easy to deploy on GitHub Pages. They eliminate runtime vulnerabilities and scale effortlessly with CDN distribution. + +### II. Content-Driven Configuration +All dynamic content (speakers, agenda, sponsors) MUST be defined in YAML front matter within `index.md` or `_data/commons.yml`. No content should be hardcoded in HTML templates. + +**Rationale**: Centralizing content in YAML makes updates accessible to non-developers and enables conditional rendering of sections. It separates content from presentation. + +### III. Year-Based Editioning +Each conference edition MUST be self-contained under `assets/YYYY/`. Speaker photos, custom styles, and edition-specific assets MUST reside in year-organized folders. Past editions MUST be archived using the `bundle exec archive` command. + +**Rationale**: This enables historical preservation of past conferences while keeping the current edition clean. Archiving creates immutable snapshots that won't break when site structure changes. + +### IV. Jekyll Build Validation +The Jekyll build (`bundle exec jekyll build`) MUST pass without errors or unhandled warnings before any change is considered complete. Liquid template errors, missing includes, or YAML syntax errors are blockers. + +**Rationale**: The build process is the primary validation mechanism for this static site. A clean build ensures the site will deploy correctly to GitHub Pages. + +### V. Convention Over Configuration +File naming and location MUST follow established conventions: +- Speaker photos: `assets/YYYY/photos_speakers/filename.webp` +- Sponsor logos: `assets/img/logos_sponsors/` +- Layouts: `_layouts/` with names matching `layout:` front matter +- Includes: `_includes/` referenced by `{% include %}` + +**Rationale**: Consistent naming enables predictable behavior and makes the codebase maintainable by multiple contributors over years. + +## Additional Constraints + +### French Language Primary +All user-facing content MUST be in French. Error messages, UI labels, and documentation intended for end users MUST use French. Internal code comments and commit messages may use English for broader accessibility. + +### GitHub Pages Compatibility +All features MUST be compatible with GitHub Pages deployment constraints: +- No custom plugins beyond the whitelisted set +- No server-side processing +- Assets must use relative paths that work when deployed to `username.github.io/repo-name/` + +### Accessibility Standards +HTML output MUST maintain semantic structure and include appropriate ARIA labels where needed. Color contrast and keyboard navigation should be considered for all interactive elements. + +## Development Workflow + +### Local Testing Required +All changes MUST be verified locally with `bundle exec jekyll serve` before committing. This includes: +- Visual inspection of affected pages +- Verification of responsive behavior +- Checking for broken links or missing assets + +### Content Update Process +When adding speakers or agenda items: +1. Add content to `index.md` front matter +2. Place assets in correct year-organized folders +3. Verify section renders correctly (conditional display) +4. Run full Jekyll build to validate + +### Archiving Procedure +When an edition concludes: +1. Run `bundle exec archive YYYY` to create snapshot +2. Verify archived assets are correctly copied +3. Update `archives.md` with new entry +4. Test archive pages render correctly + +## Governance + +This constitution governs all development practices for the DevFest Perros-Guirec website. Amendments require: +1. Documentation of the proposed change and its rationale +2. Review for compatibility with Jekyll/GitHub Pages constraints +3. Update to CLAUDE.md if agent guidance is affected + +All pull requests MUST verify compliance with these principles. Complexity or new dependencies must be justified against the static-first architecture constraint. + +**Version**: 1.0.0 | **Ratified**: 2026-02-17 | **Last Amended**: 2026-02-17 diff --git a/.specify/scripts/bash/check-prerequisites.sh b/.specify/scripts/bash/check-prerequisites.sh new file mode 100755 index 0000000..98e387c --- /dev/null +++ b/.specify/scripts/bash/check-prerequisites.sh @@ -0,0 +1,166 @@ +#!/usr/bin/env bash + +# Consolidated prerequisite checking script +# +# This script provides unified prerequisite checking for Spec-Driven Development workflow. +# It replaces the functionality previously spread across multiple scripts. +# +# Usage: ./check-prerequisites.sh [OPTIONS] +# +# OPTIONS: +# --json Output in JSON format +# --require-tasks Require tasks.md to exist (for implementation phase) +# --include-tasks Include tasks.md in AVAILABLE_DOCS list +# --paths-only Only output path variables (no validation) +# --help, -h Show help message +# +# OUTPUTS: +# JSON mode: {"FEATURE_DIR":"...", "AVAILABLE_DOCS":["..."]} +# Text mode: FEATURE_DIR:... \n AVAILABLE_DOCS: \n ✓/✗ file.md +# Paths only: REPO_ROOT: ... \n BRANCH: ... \n FEATURE_DIR: ... etc. + +set -e + +# Parse command line arguments +JSON_MODE=false +REQUIRE_TASKS=false +INCLUDE_TASKS=false +PATHS_ONLY=false + +for arg in "$@"; do + case "$arg" in + --json) + JSON_MODE=true + ;; + --require-tasks) + REQUIRE_TASKS=true + ;; + --include-tasks) + INCLUDE_TASKS=true + ;; + --paths-only) + PATHS_ONLY=true + ;; + --help|-h) + cat << 'EOF' +Usage: check-prerequisites.sh [OPTIONS] + +Consolidated prerequisite checking for Spec-Driven Development workflow. + +OPTIONS: + --json Output in JSON format + --require-tasks Require tasks.md to exist (for implementation phase) + --include-tasks Include tasks.md in AVAILABLE_DOCS list + --paths-only Only output path variables (no prerequisite validation) + --help, -h Show this help message + +EXAMPLES: + # Check task prerequisites (plan.md required) + ./check-prerequisites.sh --json + + # Check implementation prerequisites (plan.md + tasks.md required) + ./check-prerequisites.sh --json --require-tasks --include-tasks + + # Get feature paths only (no validation) + ./check-prerequisites.sh --paths-only + +EOF + exit 0 + ;; + *) + echo "ERROR: Unknown option '$arg'. Use --help for usage information." >&2 + exit 1 + ;; + esac +done + +# Source common functions +SCRIPT_DIR="$(CDPATH="" cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/common.sh" + +# Get feature paths and validate branch +eval $(get_feature_paths) +check_feature_branch "$CURRENT_BRANCH" "$HAS_GIT" || exit 1 + +# If paths-only mode, output paths and exit (support JSON + paths-only combined) +if $PATHS_ONLY; then + if $JSON_MODE; then + # Minimal JSON paths payload (no validation performed) + printf '{"REPO_ROOT":"%s","BRANCH":"%s","FEATURE_DIR":"%s","FEATURE_SPEC":"%s","IMPL_PLAN":"%s","TASKS":"%s"}\n' \ + "$REPO_ROOT" "$CURRENT_BRANCH" "$FEATURE_DIR" "$FEATURE_SPEC" "$IMPL_PLAN" "$TASKS" + else + echo "REPO_ROOT: $REPO_ROOT" + echo "BRANCH: $CURRENT_BRANCH" + echo "FEATURE_DIR: $FEATURE_DIR" + echo "FEATURE_SPEC: $FEATURE_SPEC" + echo "IMPL_PLAN: $IMPL_PLAN" + echo "TASKS: $TASKS" + fi + exit 0 +fi + +# Validate required directories and files +if [[ ! -d "$FEATURE_DIR" ]]; then + echo "ERROR: Feature directory not found: $FEATURE_DIR" >&2 + echo "Run /speckit.specify first to create the feature structure." >&2 + exit 1 +fi + +if [[ ! -f "$IMPL_PLAN" ]]; then + echo "ERROR: plan.md not found in $FEATURE_DIR" >&2 + echo "Run /speckit.plan first to create the implementation plan." >&2 + exit 1 +fi + +# Check for tasks.md if required +if $REQUIRE_TASKS && [[ ! -f "$TASKS" ]]; then + echo "ERROR: tasks.md not found in $FEATURE_DIR" >&2 + echo "Run /speckit.tasks first to create the task list." >&2 + exit 1 +fi + +# Build list of available documents +docs=() + +# Always check these optional docs +[[ -f "$RESEARCH" ]] && docs+=("research.md") +[[ -f "$DATA_MODEL" ]] && docs+=("data-model.md") + +# Check contracts directory (only if it exists and has files) +if [[ -d "$CONTRACTS_DIR" ]] && [[ -n "$(ls -A "$CONTRACTS_DIR" 2>/dev/null)" ]]; then + docs+=("contracts/") +fi + +[[ -f "$QUICKSTART" ]] && docs+=("quickstart.md") + +# Include tasks.md if requested and it exists +if $INCLUDE_TASKS && [[ -f "$TASKS" ]]; then + docs+=("tasks.md") +fi + +# Output results +if $JSON_MODE; then + # Build JSON array of documents + if [[ ${#docs[@]} -eq 0 ]]; then + json_docs="[]" + else + json_docs=$(printf '"%s",' "${docs[@]}") + json_docs="[${json_docs%,}]" + fi + + printf '{"FEATURE_DIR":"%s","AVAILABLE_DOCS":%s}\n' "$FEATURE_DIR" "$json_docs" +else + # Text output + echo "FEATURE_DIR:$FEATURE_DIR" + echo "AVAILABLE_DOCS:" + + # Show status of each potential document + check_file "$RESEARCH" "research.md" + check_file "$DATA_MODEL" "data-model.md" + check_dir "$CONTRACTS_DIR" "contracts/" + check_file "$QUICKSTART" "quickstart.md" + + if $INCLUDE_TASKS; then + check_file "$TASKS" "tasks.md" + fi +fi diff --git a/.specify/scripts/bash/common.sh b/.specify/scripts/bash/common.sh new file mode 100755 index 0000000..2c3165e --- /dev/null +++ b/.specify/scripts/bash/common.sh @@ -0,0 +1,156 @@ +#!/usr/bin/env bash +# Common functions and variables for all scripts + +# Get repository root, with fallback for non-git repositories +get_repo_root() { + if git rev-parse --show-toplevel >/dev/null 2>&1; then + git rev-parse --show-toplevel + else + # Fall back to script location for non-git repos + local script_dir="$(CDPATH="" cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + (cd "$script_dir/../../.." && pwd) + fi +} + +# Get current branch, with fallback for non-git repositories +get_current_branch() { + # First check if SPECIFY_FEATURE environment variable is set + if [[ -n "${SPECIFY_FEATURE:-}" ]]; then + echo "$SPECIFY_FEATURE" + return + fi + + # Then check git if available + if git rev-parse --abbrev-ref HEAD >/dev/null 2>&1; then + git rev-parse --abbrev-ref HEAD + return + fi + + # For non-git repos, try to find the latest feature directory + local repo_root=$(get_repo_root) + local specs_dir="$repo_root/specs" + + if [[ -d "$specs_dir" ]]; then + local latest_feature="" + local highest=0 + + for dir in "$specs_dir"/*; do + if [[ -d "$dir" ]]; then + local dirname=$(basename "$dir") + if [[ "$dirname" =~ ^([0-9]{3})- ]]; then + local number=${BASH_REMATCH[1]} + number=$((10#$number)) + if [[ "$number" -gt "$highest" ]]; then + highest=$number + latest_feature=$dirname + fi + fi + fi + done + + if [[ -n "$latest_feature" ]]; then + echo "$latest_feature" + return + fi + fi + + echo "main" # Final fallback +} + +# Check if we have git available +has_git() { + git rev-parse --show-toplevel >/dev/null 2>&1 +} + +check_feature_branch() { + local branch="$1" + local has_git_repo="$2" + + # For non-git repos, we can't enforce branch naming but still provide output + if [[ "$has_git_repo" != "true" ]]; then + echo "[specify] Warning: Git repository not detected; skipped branch validation" >&2 + return 0 + fi + + if [[ ! "$branch" =~ ^[0-9]{3}- ]]; then + echo "ERROR: Not on a feature branch. Current branch: $branch" >&2 + echo "Feature branches should be named like: 001-feature-name" >&2 + return 1 + fi + + return 0 +} + +get_feature_dir() { echo "$1/specs/$2"; } + +# Find feature directory by numeric prefix instead of exact branch match +# This allows multiple branches to work on the same spec (e.g., 004-fix-bug, 004-add-feature) +find_feature_dir_by_prefix() { + local repo_root="$1" + local branch_name="$2" + local specs_dir="$repo_root/specs" + + # Extract numeric prefix from branch (e.g., "004" from "004-whatever") + if [[ ! "$branch_name" =~ ^([0-9]{3})- ]]; then + # If branch doesn't have numeric prefix, fall back to exact match + echo "$specs_dir/$branch_name" + return + fi + + local prefix="${BASH_REMATCH[1]}" + + # Search for directories in specs/ that start with this prefix + local matches=() + if [[ -d "$specs_dir" ]]; then + for dir in "$specs_dir"/"$prefix"-*; do + if [[ -d "$dir" ]]; then + matches+=("$(basename "$dir")") + fi + done + fi + + # Handle results + if [[ ${#matches[@]} -eq 0 ]]; then + # No match found - return the branch name path (will fail later with clear error) + echo "$specs_dir/$branch_name" + elif [[ ${#matches[@]} -eq 1 ]]; then + # Exactly one match - perfect! + echo "$specs_dir/${matches[0]}" + else + # Multiple matches - this shouldn't happen with proper naming convention + echo "ERROR: Multiple spec directories found with prefix '$prefix': ${matches[*]}" >&2 + echo "Please ensure only one spec directory exists per numeric prefix." >&2 + echo "$specs_dir/$branch_name" # Return something to avoid breaking the script + fi +} + +get_feature_paths() { + local repo_root=$(get_repo_root) + local current_branch=$(get_current_branch) + local has_git_repo="false" + + if has_git; then + has_git_repo="true" + fi + + # Use prefix-based lookup to support multiple branches per spec + local feature_dir=$(find_feature_dir_by_prefix "$repo_root" "$current_branch") + + cat </dev/null) ]] && echo " ✓ $2" || echo " ✗ $2"; } + diff --git a/.specify/scripts/bash/create-new-feature.sh b/.specify/scripts/bash/create-new-feature.sh new file mode 100755 index 0000000..c40cfd7 --- /dev/null +++ b/.specify/scripts/bash/create-new-feature.sh @@ -0,0 +1,297 @@ +#!/usr/bin/env bash + +set -e + +JSON_MODE=false +SHORT_NAME="" +BRANCH_NUMBER="" +ARGS=() +i=1 +while [ $i -le $# ]; do + arg="${!i}" + case "$arg" in + --json) + JSON_MODE=true + ;; + --short-name) + if [ $((i + 1)) -gt $# ]; then + echo 'Error: --short-name requires a value' >&2 + exit 1 + fi + i=$((i + 1)) + next_arg="${!i}" + # Check if the next argument is another option (starts with --) + if [[ "$next_arg" == --* ]]; then + echo 'Error: --short-name requires a value' >&2 + exit 1 + fi + SHORT_NAME="$next_arg" + ;; + --number) + if [ $((i + 1)) -gt $# ]; then + echo 'Error: --number requires a value' >&2 + exit 1 + fi + i=$((i + 1)) + next_arg="${!i}" + if [[ "$next_arg" == --* ]]; then + echo 'Error: --number requires a value' >&2 + exit 1 + fi + BRANCH_NUMBER="$next_arg" + ;; + --help|-h) + echo "Usage: $0 [--json] [--short-name ] [--number N] " + echo "" + echo "Options:" + echo " --json Output in JSON format" + echo " --short-name Provide a custom short name (2-4 words) for the branch" + echo " --number N Specify branch number manually (overrides auto-detection)" + echo " --help, -h Show this help message" + echo "" + echo "Examples:" + echo " $0 'Add user authentication system' --short-name 'user-auth'" + echo " $0 'Implement OAuth2 integration for API' --number 5" + exit 0 + ;; + *) + ARGS+=("$arg") + ;; + esac + i=$((i + 1)) +done + +FEATURE_DESCRIPTION="${ARGS[*]}" +if [ -z "$FEATURE_DESCRIPTION" ]; then + echo "Usage: $0 [--json] [--short-name ] [--number N] " >&2 + exit 1 +fi + +# Function to find the repository root by searching for existing project markers +find_repo_root() { + local dir="$1" + while [ "$dir" != "/" ]; do + if [ -d "$dir/.git" ] || [ -d "$dir/.specify" ]; then + echo "$dir" + return 0 + fi + dir="$(dirname "$dir")" + done + return 1 +} + +# Function to get highest number from specs directory +get_highest_from_specs() { + local specs_dir="$1" + local highest=0 + + if [ -d "$specs_dir" ]; then + for dir in "$specs_dir"/*; do + [ -d "$dir" ] || continue + dirname=$(basename "$dir") + number=$(echo "$dirname" | grep -o '^[0-9]\+' || echo "0") + number=$((10#$number)) + if [ "$number" -gt "$highest" ]; then + highest=$number + fi + done + fi + + echo "$highest" +} + +# Function to get highest number from git branches +get_highest_from_branches() { + local highest=0 + + # Get all branches (local and remote) + branches=$(git branch -a 2>/dev/null || echo "") + + if [ -n "$branches" ]; then + while IFS= read -r branch; do + # Clean branch name: remove leading markers and remote prefixes + clean_branch=$(echo "$branch" | sed 's/^[* ]*//; s|^remotes/[^/]*/||') + + # Extract feature number if branch matches pattern ###-* + if echo "$clean_branch" | grep -q '^[0-9]\{3\}-'; then + number=$(echo "$clean_branch" | grep -o '^[0-9]\{3\}' || echo "0") + number=$((10#$number)) + if [ "$number" -gt "$highest" ]; then + highest=$number + fi + fi + done <<< "$branches" + fi + + echo "$highest" +} + +# Function to check existing branches (local and remote) and return next available number +check_existing_branches() { + local specs_dir="$1" + + # Fetch all remotes to get latest branch info (suppress errors if no remotes) + git fetch --all --prune 2>/dev/null || true + + # Get highest number from ALL branches (not just matching short name) + local highest_branch=$(get_highest_from_branches) + + # Get highest number from ALL specs (not just matching short name) + local highest_spec=$(get_highest_from_specs "$specs_dir") + + # Take the maximum of both + local max_num=$highest_branch + if [ "$highest_spec" -gt "$max_num" ]; then + max_num=$highest_spec + fi + + # Return next number + echo $((max_num + 1)) +} + +# Function to clean and format a branch name +clean_branch_name() { + local name="$1" + echo "$name" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/-\+/-/g' | sed 's/^-//' | sed 's/-$//' +} + +# Resolve repository root. Prefer git information when available, but fall back +# to searching for repository markers so the workflow still functions in repositories that +# were initialised with --no-git. +SCRIPT_DIR="$(CDPATH="" cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +if git rev-parse --show-toplevel >/dev/null 2>&1; then + REPO_ROOT=$(git rev-parse --show-toplevel) + HAS_GIT=true +else + REPO_ROOT="$(find_repo_root "$SCRIPT_DIR")" + if [ -z "$REPO_ROOT" ]; then + echo "Error: Could not determine repository root. Please run this script from within the repository." >&2 + exit 1 + fi + HAS_GIT=false +fi + +cd "$REPO_ROOT" + +SPECS_DIR="$REPO_ROOT/specs" +mkdir -p "$SPECS_DIR" + +# Function to generate branch name with stop word filtering and length filtering +generate_branch_name() { + local description="$1" + + # Common stop words to filter out + local stop_words="^(i|a|an|the|to|for|of|in|on|at|by|with|from|is|are|was|were|be|been|being|have|has|had|do|does|did|will|would|should|could|can|may|might|must|shall|this|that|these|those|my|your|our|their|want|need|add|get|set)$" + + # Convert to lowercase and split into words + local clean_name=$(echo "$description" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/ /g') + + # Filter words: remove stop words and words shorter than 3 chars (unless they're uppercase acronyms in original) + local meaningful_words=() + for word in $clean_name; do + # Skip empty words + [ -z "$word" ] && continue + + # Keep words that are NOT stop words AND (length >= 3 OR are potential acronyms) + if ! echo "$word" | grep -qiE "$stop_words"; then + if [ ${#word} -ge 3 ]; then + meaningful_words+=("$word") + elif echo "$description" | grep -q "\b${word^^}\b"; then + # Keep short words if they appear as uppercase in original (likely acronyms) + meaningful_words+=("$word") + fi + fi + done + + # If we have meaningful words, use first 3-4 of them + if [ ${#meaningful_words[@]} -gt 0 ]; then + local max_words=3 + if [ ${#meaningful_words[@]} -eq 4 ]; then max_words=4; fi + + local result="" + local count=0 + for word in "${meaningful_words[@]}"; do + if [ $count -ge $max_words ]; then break; fi + if [ -n "$result" ]; then result="$result-"; fi + result="$result$word" + count=$((count + 1)) + done + echo "$result" + else + # Fallback to original logic if no meaningful words found + local cleaned=$(clean_branch_name "$description") + echo "$cleaned" | tr '-' '\n' | grep -v '^$' | head -3 | tr '\n' '-' | sed 's/-$//' + fi +} + +# Generate branch name +if [ -n "$SHORT_NAME" ]; then + # Use provided short name, just clean it up + BRANCH_SUFFIX=$(clean_branch_name "$SHORT_NAME") +else + # Generate from description with smart filtering + BRANCH_SUFFIX=$(generate_branch_name "$FEATURE_DESCRIPTION") +fi + +# Determine branch number +if [ -z "$BRANCH_NUMBER" ]; then + if [ "$HAS_GIT" = true ]; then + # Check existing branches on remotes + BRANCH_NUMBER=$(check_existing_branches "$SPECS_DIR") + else + # Fall back to local directory check + HIGHEST=$(get_highest_from_specs "$SPECS_DIR") + BRANCH_NUMBER=$((HIGHEST + 1)) + fi +fi + +# Force base-10 interpretation to prevent octal conversion (e.g., 010 → 8 in octal, but should be 10 in decimal) +FEATURE_NUM=$(printf "%03d" "$((10#$BRANCH_NUMBER))") +BRANCH_NAME="${FEATURE_NUM}-${BRANCH_SUFFIX}" + +# GitHub enforces a 244-byte limit on branch names +# Validate and truncate if necessary +MAX_BRANCH_LENGTH=244 +if [ ${#BRANCH_NAME} -gt $MAX_BRANCH_LENGTH ]; then + # Calculate how much we need to trim from suffix + # Account for: feature number (3) + hyphen (1) = 4 chars + MAX_SUFFIX_LENGTH=$((MAX_BRANCH_LENGTH - 4)) + + # Truncate suffix at word boundary if possible + TRUNCATED_SUFFIX=$(echo "$BRANCH_SUFFIX" | cut -c1-$MAX_SUFFIX_LENGTH) + # Remove trailing hyphen if truncation created one + TRUNCATED_SUFFIX=$(echo "$TRUNCATED_SUFFIX" | sed 's/-$//') + + ORIGINAL_BRANCH_NAME="$BRANCH_NAME" + BRANCH_NAME="${FEATURE_NUM}-${TRUNCATED_SUFFIX}" + + >&2 echo "[specify] Warning: Branch name exceeded GitHub's 244-byte limit" + >&2 echo "[specify] Original: $ORIGINAL_BRANCH_NAME (${#ORIGINAL_BRANCH_NAME} bytes)" + >&2 echo "[specify] Truncated to: $BRANCH_NAME (${#BRANCH_NAME} bytes)" +fi + +if [ "$HAS_GIT" = true ]; then + git checkout -b "$BRANCH_NAME" +else + >&2 echo "[specify] Warning: Git repository not detected; skipped branch creation for $BRANCH_NAME" +fi + +FEATURE_DIR="$SPECS_DIR/$BRANCH_NAME" +mkdir -p "$FEATURE_DIR" + +TEMPLATE="$REPO_ROOT/.specify/templates/spec-template.md" +SPEC_FILE="$FEATURE_DIR/spec.md" +if [ -f "$TEMPLATE" ]; then cp "$TEMPLATE" "$SPEC_FILE"; else touch "$SPEC_FILE"; fi + +# Set the SPECIFY_FEATURE environment variable for the current session +export SPECIFY_FEATURE="$BRANCH_NAME" + +if $JSON_MODE; then + printf '{"BRANCH_NAME":"%s","SPEC_FILE":"%s","FEATURE_NUM":"%s"}\n' "$BRANCH_NAME" "$SPEC_FILE" "$FEATURE_NUM" +else + echo "BRANCH_NAME: $BRANCH_NAME" + echo "SPEC_FILE: $SPEC_FILE" + echo "FEATURE_NUM: $FEATURE_NUM" + echo "SPECIFY_FEATURE environment variable set to: $BRANCH_NAME" +fi diff --git a/.specify/scripts/bash/setup-plan.sh b/.specify/scripts/bash/setup-plan.sh new file mode 100755 index 0000000..d01c6d6 --- /dev/null +++ b/.specify/scripts/bash/setup-plan.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +set -e + +# Parse command line arguments +JSON_MODE=false +ARGS=() + +for arg in "$@"; do + case "$arg" in + --json) + JSON_MODE=true + ;; + --help|-h) + echo "Usage: $0 [--json]" + echo " --json Output results in JSON format" + echo " --help Show this help message" + exit 0 + ;; + *) + ARGS+=("$arg") + ;; + esac +done + +# Get script directory and load common functions +SCRIPT_DIR="$(CDPATH="" cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/common.sh" + +# Get all paths and variables from common functions +eval $(get_feature_paths) + +# Check if we're on a proper feature branch (only for git repos) +check_feature_branch "$CURRENT_BRANCH" "$HAS_GIT" || exit 1 + +# Ensure the feature directory exists +mkdir -p "$FEATURE_DIR" + +# Copy plan template if it exists +TEMPLATE="$REPO_ROOT/.specify/templates/plan-template.md" +if [[ -f "$TEMPLATE" ]]; then + cp "$TEMPLATE" "$IMPL_PLAN" + echo "Copied plan template to $IMPL_PLAN" +else + echo "Warning: Plan template not found at $TEMPLATE" + # Create a basic plan file if template doesn't exist + touch "$IMPL_PLAN" +fi + +# Output results +if $JSON_MODE; then + printf '{"FEATURE_SPEC":"%s","IMPL_PLAN":"%s","SPECS_DIR":"%s","BRANCH":"%s","HAS_GIT":"%s"}\n' \ + "$FEATURE_SPEC" "$IMPL_PLAN" "$FEATURE_DIR" "$CURRENT_BRANCH" "$HAS_GIT" +else + echo "FEATURE_SPEC: $FEATURE_SPEC" + echo "IMPL_PLAN: $IMPL_PLAN" + echo "SPECS_DIR: $FEATURE_DIR" + echo "BRANCH: $CURRENT_BRANCH" + echo "HAS_GIT: $HAS_GIT" +fi + diff --git a/.specify/scripts/bash/update-agent-context.sh b/.specify/scripts/bash/update-agent-context.sh new file mode 100755 index 0000000..5b19abf --- /dev/null +++ b/.specify/scripts/bash/update-agent-context.sh @@ -0,0 +1,808 @@ +#!/usr/bin/env bash + +# Update agent context files with information from plan.md +# +# This script maintains AI agent context files by parsing feature specifications +# and updating agent-specific configuration files with project information. +# +# MAIN FUNCTIONS: +# 1. Environment Validation +# - Verifies git repository structure and branch information +# - Checks for required plan.md files and templates +# - Validates file permissions and accessibility +# +# 2. Plan Data Extraction +# - Parses plan.md files to extract project metadata +# - Identifies language/version, frameworks, databases, and project types +# - Handles missing or incomplete specification data gracefully +# +# 3. Agent File Management +# - Creates new agent context files from templates when needed +# - Updates existing agent files with new project information +# - Preserves manual additions and custom configurations +# - Supports multiple AI agent formats and directory structures +# +# 4. Content Generation +# - Generates language-specific build/test commands +# - Creates appropriate project directory structures +# - Updates technology stacks and recent changes sections +# - Maintains consistent formatting and timestamps +# +# 5. Multi-Agent Support +# - Handles agent-specific file paths and naming conventions +# - Supports: Claude, Gemini, Copilot, Cursor, Qwen, opencode, Codex, Windsurf, Kilo Code, Auggie CLI, Roo Code, CodeBuddy CLI, Qoder CLI, Amp, SHAI, Amazon Q Developer CLI, or Antigravity +# - Can update single agents or all existing agent files +# - Creates default Claude file if no agent files exist +# +# Usage: ./update-agent-context.sh [agent_type] +# Agent types: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|shai|q|agy|bob|qoder +# Leave empty to update all existing agent files + +set -e + +# Enable strict error handling +set -u +set -o pipefail + +#============================================================================== +# Configuration and Global Variables +#============================================================================== + +# Get script directory and load common functions +SCRIPT_DIR="$(CDPATH="" cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/common.sh" + +# Get all paths and variables from common functions +eval $(get_feature_paths) + +NEW_PLAN="$IMPL_PLAN" # Alias for compatibility with existing code +AGENT_TYPE="${1:-}" + +# Agent-specific file paths +CLAUDE_FILE="$REPO_ROOT/CLAUDE.md" +GEMINI_FILE="$REPO_ROOT/GEMINI.md" +COPILOT_FILE="$REPO_ROOT/.github/agents/copilot-instructions.md" +CURSOR_FILE="$REPO_ROOT/.cursor/rules/specify-rules.mdc" +QWEN_FILE="$REPO_ROOT/QWEN.md" +AGENTS_FILE="$REPO_ROOT/AGENTS.md" +WINDSURF_FILE="$REPO_ROOT/.windsurf/rules/specify-rules.md" +KILOCODE_FILE="$REPO_ROOT/.kilocode/rules/specify-rules.md" +AUGGIE_FILE="$REPO_ROOT/.augment/rules/specify-rules.md" +ROO_FILE="$REPO_ROOT/.roo/rules/specify-rules.md" +CODEBUDDY_FILE="$REPO_ROOT/CODEBUDDY.md" +QODER_FILE="$REPO_ROOT/QODER.md" +AMP_FILE="$REPO_ROOT/AGENTS.md" +SHAI_FILE="$REPO_ROOT/SHAI.md" +Q_FILE="$REPO_ROOT/AGENTS.md" +AGY_FILE="$REPO_ROOT/.agent/rules/specify-rules.md" +BOB_FILE="$REPO_ROOT/AGENTS.md" + +# Template file +TEMPLATE_FILE="$REPO_ROOT/.specify/templates/agent-file-template.md" + +# Global variables for parsed plan data +NEW_LANG="" +NEW_FRAMEWORK="" +NEW_DB="" +NEW_PROJECT_TYPE="" + +#============================================================================== +# Utility Functions +#============================================================================== + +log_info() { + echo "INFO: $1" +} + +log_success() { + echo "✓ $1" +} + +log_error() { + echo "ERROR: $1" >&2 +} + +log_warning() { + echo "WARNING: $1" >&2 +} + +# Cleanup function for temporary files +cleanup() { + local exit_code=$? + rm -f /tmp/agent_update_*_$$ + rm -f /tmp/manual_additions_$$ + exit $exit_code +} + +# Set up cleanup trap +trap cleanup EXIT INT TERM + +#============================================================================== +# Validation Functions +#============================================================================== + +validate_environment() { + # Check if we have a current branch/feature (git or non-git) + if [[ -z "$CURRENT_BRANCH" ]]; then + log_error "Unable to determine current feature" + if [[ "$HAS_GIT" == "true" ]]; then + log_info "Make sure you're on a feature branch" + else + log_info "Set SPECIFY_FEATURE environment variable or create a feature first" + fi + exit 1 + fi + + # Check if plan.md exists + if [[ ! -f "$NEW_PLAN" ]]; then + log_error "No plan.md found at $NEW_PLAN" + log_info "Make sure you're working on a feature with a corresponding spec directory" + if [[ "$HAS_GIT" != "true" ]]; then + log_info "Use: export SPECIFY_FEATURE=your-feature-name or create a new feature first" + fi + exit 1 + fi + + # Check if template exists (needed for new files) + if [[ ! -f "$TEMPLATE_FILE" ]]; then + log_warning "Template file not found at $TEMPLATE_FILE" + log_warning "Creating new agent files will fail" + fi +} + +#============================================================================== +# Plan Parsing Functions +#============================================================================== + +extract_plan_field() { + local field_pattern="$1" + local plan_file="$2" + + grep "^\*\*${field_pattern}\*\*: " "$plan_file" 2>/dev/null | \ + head -1 | \ + sed "s|^\*\*${field_pattern}\*\*: ||" | \ + sed 's/^[ \t]*//;s/[ \t]*$//' | \ + grep -v "NEEDS CLARIFICATION" | \ + grep -v "^N/A$" || echo "" +} + +parse_plan_data() { + local plan_file="$1" + + if [[ ! -f "$plan_file" ]]; then + log_error "Plan file not found: $plan_file" + return 1 + fi + + if [[ ! -r "$plan_file" ]]; then + log_error "Plan file is not readable: $plan_file" + return 1 + fi + + log_info "Parsing plan data from $plan_file" + + NEW_LANG=$(extract_plan_field "Language/Version" "$plan_file") + NEW_FRAMEWORK=$(extract_plan_field "Primary Dependencies" "$plan_file") + NEW_DB=$(extract_plan_field "Storage" "$plan_file") + NEW_PROJECT_TYPE=$(extract_plan_field "Project Type" "$plan_file") + + # Log what we found + if [[ -n "$NEW_LANG" ]]; then + log_info "Found language: $NEW_LANG" + else + log_warning "No language information found in plan" + fi + + if [[ -n "$NEW_FRAMEWORK" ]]; then + log_info "Found framework: $NEW_FRAMEWORK" + fi + + if [[ -n "$NEW_DB" ]] && [[ "$NEW_DB" != "N/A" ]]; then + log_info "Found database: $NEW_DB" + fi + + if [[ -n "$NEW_PROJECT_TYPE" ]]; then + log_info "Found project type: $NEW_PROJECT_TYPE" + fi +} + +format_technology_stack() { + local lang="$1" + local framework="$2" + local parts=() + + # Add non-empty parts + [[ -n "$lang" && "$lang" != "NEEDS CLARIFICATION" ]] && parts+=("$lang") + [[ -n "$framework" && "$framework" != "NEEDS CLARIFICATION" && "$framework" != "N/A" ]] && parts+=("$framework") + + # Join with proper formatting + if [[ ${#parts[@]} -eq 0 ]]; then + echo "" + elif [[ ${#parts[@]} -eq 1 ]]; then + echo "${parts[0]}" + else + # Join multiple parts with " + " + local result="${parts[0]}" + for ((i=1; i<${#parts[@]}; i++)); do + result="$result + ${parts[i]}" + done + echo "$result" + fi +} + +#============================================================================== +# Template and Content Generation Functions +#============================================================================== + +get_project_structure() { + local project_type="$1" + + if [[ "$project_type" == *"web"* ]]; then + echo "backend/\\nfrontend/\\ntests/" + else + echo "src/\\ntests/" + fi +} + +get_commands_for_language() { + local lang="$1" + + case "$lang" in + *"Python"*) + echo "cd src && pytest && ruff check ." + ;; + *"Rust"*) + echo "cargo test && cargo clippy" + ;; + *"JavaScript"*|*"TypeScript"*) + echo "npm test \\&\\& npm run lint" + ;; + *) + echo "# Add commands for $lang" + ;; + esac +} + +get_language_conventions() { + local lang="$1" + echo "$lang: Follow standard conventions" +} + +create_new_agent_file() { + local target_file="$1" + local temp_file="$2" + local project_name="$3" + local current_date="$4" + + if [[ ! -f "$TEMPLATE_FILE" ]]; then + log_error "Template not found at $TEMPLATE_FILE" + return 1 + fi + + if [[ ! -r "$TEMPLATE_FILE" ]]; then + log_error "Template file is not readable: $TEMPLATE_FILE" + return 1 + fi + + log_info "Creating new agent context file from template..." + + if ! cp "$TEMPLATE_FILE" "$temp_file"; then + log_error "Failed to copy template file" + return 1 + fi + + # Replace template placeholders + local project_structure + project_structure=$(get_project_structure "$NEW_PROJECT_TYPE") + + local commands + commands=$(get_commands_for_language "$NEW_LANG") + + local language_conventions + language_conventions=$(get_language_conventions "$NEW_LANG") + + # Perform substitutions with error checking using safer approach + # Escape special characters for sed by using a different delimiter or escaping + local escaped_lang=$(printf '%s\n' "$NEW_LANG" | sed 's/[\[\.*^$()+{}|]/\\&/g') + local escaped_framework=$(printf '%s\n' "$NEW_FRAMEWORK" | sed 's/[\[\.*^$()+{}|]/\\&/g') + local escaped_branch=$(printf '%s\n' "$CURRENT_BRANCH" | sed 's/[\[\.*^$()+{}|]/\\&/g') + + # Build technology stack and recent change strings conditionally + local tech_stack + if [[ -n "$escaped_lang" && -n "$escaped_framework" ]]; then + tech_stack="- $escaped_lang + $escaped_framework ($escaped_branch)" + elif [[ -n "$escaped_lang" ]]; then + tech_stack="- $escaped_lang ($escaped_branch)" + elif [[ -n "$escaped_framework" ]]; then + tech_stack="- $escaped_framework ($escaped_branch)" + else + tech_stack="- ($escaped_branch)" + fi + + local recent_change + if [[ -n "$escaped_lang" && -n "$escaped_framework" ]]; then + recent_change="- $escaped_branch: Added $escaped_lang + $escaped_framework" + elif [[ -n "$escaped_lang" ]]; then + recent_change="- $escaped_branch: Added $escaped_lang" + elif [[ -n "$escaped_framework" ]]; then + recent_change="- $escaped_branch: Added $escaped_framework" + else + recent_change="- $escaped_branch: Added" + fi + + local substitutions=( + "s|\[PROJECT NAME\]|$project_name|" + "s|\[DATE\]|$current_date|" + "s|\[EXTRACTED FROM ALL PLAN.MD FILES\]|$tech_stack|" + "s|\[ACTUAL STRUCTURE FROM PLANS\]|$project_structure|g" + "s|\[ONLY COMMANDS FOR ACTIVE TECHNOLOGIES\]|$commands|" + "s|\[LANGUAGE-SPECIFIC, ONLY FOR LANGUAGES IN USE\]|$language_conventions|" + "s|\[LAST 3 FEATURES AND WHAT THEY ADDED\]|$recent_change|" + ) + + for substitution in "${substitutions[@]}"; do + if ! sed -i.bak -e "$substitution" "$temp_file"; then + log_error "Failed to perform substitution: $substitution" + rm -f "$temp_file" "$temp_file.bak" + return 1 + fi + done + + # Convert \n sequences to actual newlines + newline=$(printf '\n') + sed -i.bak2 "s/\\\\n/${newline}/g" "$temp_file" + + # Clean up backup files + rm -f "$temp_file.bak" "$temp_file.bak2" + + return 0 +} + + + + +update_existing_agent_file() { + local target_file="$1" + local current_date="$2" + + log_info "Updating existing agent context file..." + + # Use a single temporary file for atomic update + local temp_file + temp_file=$(mktemp) || { + log_error "Failed to create temporary file" + return 1 + } + + # Process the file in one pass + local tech_stack=$(format_technology_stack "$NEW_LANG" "$NEW_FRAMEWORK") + local new_tech_entries=() + local new_change_entry="" + + # Prepare new technology entries + if [[ -n "$tech_stack" ]] && ! grep -q "$tech_stack" "$target_file"; then + new_tech_entries+=("- $tech_stack ($CURRENT_BRANCH)") + fi + + if [[ -n "$NEW_DB" ]] && [[ "$NEW_DB" != "N/A" ]] && [[ "$NEW_DB" != "NEEDS CLARIFICATION" ]] && ! grep -q "$NEW_DB" "$target_file"; then + new_tech_entries+=("- $NEW_DB ($CURRENT_BRANCH)") + fi + + # Prepare new change entry + if [[ -n "$tech_stack" ]]; then + new_change_entry="- $CURRENT_BRANCH: Added $tech_stack" + elif [[ -n "$NEW_DB" ]] && [[ "$NEW_DB" != "N/A" ]] && [[ "$NEW_DB" != "NEEDS CLARIFICATION" ]]; then + new_change_entry="- $CURRENT_BRANCH: Added $NEW_DB" + fi + + # Check if sections exist in the file + local has_active_technologies=0 + local has_recent_changes=0 + + if grep -q "^## Active Technologies" "$target_file" 2>/dev/null; then + has_active_technologies=1 + fi + + if grep -q "^## Recent Changes" "$target_file" 2>/dev/null; then + has_recent_changes=1 + fi + + # Process file line by line + local in_tech_section=false + local in_changes_section=false + local tech_entries_added=false + local changes_entries_added=false + local existing_changes_count=0 + local file_ended=false + + while IFS= read -r line || [[ -n "$line" ]]; do + # Handle Active Technologies section + if [[ "$line" == "## Active Technologies" ]]; then + echo "$line" >> "$temp_file" + in_tech_section=true + continue + elif [[ $in_tech_section == true ]] && [[ "$line" =~ ^##[[:space:]] ]]; then + # Add new tech entries before closing the section + if [[ $tech_entries_added == false ]] && [[ ${#new_tech_entries[@]} -gt 0 ]]; then + printf '%s\n' "${new_tech_entries[@]}" >> "$temp_file" + tech_entries_added=true + fi + echo "$line" >> "$temp_file" + in_tech_section=false + continue + elif [[ $in_tech_section == true ]] && [[ -z "$line" ]]; then + # Add new tech entries before empty line in tech section + if [[ $tech_entries_added == false ]] && [[ ${#new_tech_entries[@]} -gt 0 ]]; then + printf '%s\n' "${new_tech_entries[@]}" >> "$temp_file" + tech_entries_added=true + fi + echo "$line" >> "$temp_file" + continue + fi + + # Handle Recent Changes section + if [[ "$line" == "## Recent Changes" ]]; then + echo "$line" >> "$temp_file" + # Add new change entry right after the heading + if [[ -n "$new_change_entry" ]]; then + echo "$new_change_entry" >> "$temp_file" + fi + in_changes_section=true + changes_entries_added=true + continue + elif [[ $in_changes_section == true ]] && [[ "$line" =~ ^##[[:space:]] ]]; then + echo "$line" >> "$temp_file" + in_changes_section=false + continue + elif [[ $in_changes_section == true ]] && [[ "$line" == "- "* ]]; then + # Keep only first 2 existing changes + if [[ $existing_changes_count -lt 2 ]]; then + echo "$line" >> "$temp_file" + ((existing_changes_count++)) + fi + continue + fi + + # Update timestamp + if [[ "$line" =~ \*\*Last\ updated\*\*:.*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] ]]; then + echo "$line" | sed "s/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/$current_date/" >> "$temp_file" + else + echo "$line" >> "$temp_file" + fi + done < "$target_file" + + # Post-loop check: if we're still in the Active Technologies section and haven't added new entries + if [[ $in_tech_section == true ]] && [[ $tech_entries_added == false ]] && [[ ${#new_tech_entries[@]} -gt 0 ]]; then + printf '%s\n' "${new_tech_entries[@]}" >> "$temp_file" + tech_entries_added=true + fi + + # If sections don't exist, add them at the end of the file + if [[ $has_active_technologies -eq 0 ]] && [[ ${#new_tech_entries[@]} -gt 0 ]]; then + echo "" >> "$temp_file" + echo "## Active Technologies" >> "$temp_file" + printf '%s\n' "${new_tech_entries[@]}" >> "$temp_file" + tech_entries_added=true + fi + + if [[ $has_recent_changes -eq 0 ]] && [[ -n "$new_change_entry" ]]; then + echo "" >> "$temp_file" + echo "## Recent Changes" >> "$temp_file" + echo "$new_change_entry" >> "$temp_file" + changes_entries_added=true + fi + + # Move temp file to target atomically + if ! mv "$temp_file" "$target_file"; then + log_error "Failed to update target file" + rm -f "$temp_file" + return 1 + fi + + return 0 +} +#============================================================================== +# Main Agent File Update Function +#============================================================================== + +update_agent_file() { + local target_file="$1" + local agent_name="$2" + + if [[ -z "$target_file" ]] || [[ -z "$agent_name" ]]; then + log_error "update_agent_file requires target_file and agent_name parameters" + return 1 + fi + + log_info "Updating $agent_name context file: $target_file" + + local project_name + project_name=$(basename "$REPO_ROOT") + local current_date + current_date=$(date +%Y-%m-%d) + + # Create directory if it doesn't exist + local target_dir + target_dir=$(dirname "$target_file") + if [[ ! -d "$target_dir" ]]; then + if ! mkdir -p "$target_dir"; then + log_error "Failed to create directory: $target_dir" + return 1 + fi + fi + + if [[ ! -f "$target_file" ]]; then + # Create new file from template + local temp_file + temp_file=$(mktemp) || { + log_error "Failed to create temporary file" + return 1 + } + + if create_new_agent_file "$target_file" "$temp_file" "$project_name" "$current_date"; then + if mv "$temp_file" "$target_file"; then + log_success "Created new $agent_name context file" + else + log_error "Failed to move temporary file to $target_file" + rm -f "$temp_file" + return 1 + fi + else + log_error "Failed to create new agent file" + rm -f "$temp_file" + return 1 + fi + else + # Update existing file + if [[ ! -r "$target_file" ]]; then + log_error "Cannot read existing file: $target_file" + return 1 + fi + + if [[ ! -w "$target_file" ]]; then + log_error "Cannot write to existing file: $target_file" + return 1 + fi + + if update_existing_agent_file "$target_file" "$current_date"; then + log_success "Updated existing $agent_name context file" + else + log_error "Failed to update existing agent file" + return 1 + fi + fi + + return 0 +} + +#============================================================================== +# Agent Selection and Processing +#============================================================================== + +update_specific_agent() { + local agent_type="$1" + + case "$agent_type" in + claude) + update_agent_file "$CLAUDE_FILE" "Claude Code" + ;; + gemini) + update_agent_file "$GEMINI_FILE" "Gemini CLI" + ;; + copilot) + update_agent_file "$COPILOT_FILE" "GitHub Copilot" + ;; + cursor-agent) + update_agent_file "$CURSOR_FILE" "Cursor IDE" + ;; + qwen) + update_agent_file "$QWEN_FILE" "Qwen Code" + ;; + opencode) + update_agent_file "$AGENTS_FILE" "opencode" + ;; + codex) + update_agent_file "$AGENTS_FILE" "Codex CLI" + ;; + windsurf) + update_agent_file "$WINDSURF_FILE" "Windsurf" + ;; + kilocode) + update_agent_file "$KILOCODE_FILE" "Kilo Code" + ;; + auggie) + update_agent_file "$AUGGIE_FILE" "Auggie CLI" + ;; + roo) + update_agent_file "$ROO_FILE" "Roo Code" + ;; + codebuddy) + update_agent_file "$CODEBUDDY_FILE" "CodeBuddy CLI" + ;; + qoder) + update_agent_file "$QODER_FILE" "Qoder CLI" + ;; + amp) + update_agent_file "$AMP_FILE" "Amp" + ;; + shai) + update_agent_file "$SHAI_FILE" "SHAI" + ;; + q) + update_agent_file "$Q_FILE" "Amazon Q Developer CLI" + ;; + agy) + update_agent_file "$AGY_FILE" "Antigravity" + ;; + bob) + update_agent_file "$BOB_FILE" "IBM Bob" + ;; + *) + log_error "Unknown agent type '$agent_type'" + log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|amp|shai|q|agy|bob|qoder" + exit 1 + ;; + esac +} + +update_all_existing_agents() { + local found_agent=false + + # Check each possible agent file and update if it exists + if [[ -f "$CLAUDE_FILE" ]]; then + update_agent_file "$CLAUDE_FILE" "Claude Code" + found_agent=true + fi + + if [[ -f "$GEMINI_FILE" ]]; then + update_agent_file "$GEMINI_FILE" "Gemini CLI" + found_agent=true + fi + + if [[ -f "$COPILOT_FILE" ]]; then + update_agent_file "$COPILOT_FILE" "GitHub Copilot" + found_agent=true + fi + + if [[ -f "$CURSOR_FILE" ]]; then + update_agent_file "$CURSOR_FILE" "Cursor IDE" + found_agent=true + fi + + if [[ -f "$QWEN_FILE" ]]; then + update_agent_file "$QWEN_FILE" "Qwen Code" + found_agent=true + fi + + if [[ -f "$AGENTS_FILE" ]]; then + update_agent_file "$AGENTS_FILE" "Codex/opencode" + found_agent=true + fi + + if [[ -f "$WINDSURF_FILE" ]]; then + update_agent_file "$WINDSURF_FILE" "Windsurf" + found_agent=true + fi + + if [[ -f "$KILOCODE_FILE" ]]; then + update_agent_file "$KILOCODE_FILE" "Kilo Code" + found_agent=true + fi + + if [[ -f "$AUGGIE_FILE" ]]; then + update_agent_file "$AUGGIE_FILE" "Auggie CLI" + found_agent=true + fi + + if [[ -f "$ROO_FILE" ]]; then + update_agent_file "$ROO_FILE" "Roo Code" + found_agent=true + fi + + if [[ -f "$CODEBUDDY_FILE" ]]; then + update_agent_file "$CODEBUDDY_FILE" "CodeBuddy CLI" + found_agent=true + fi + + if [[ -f "$SHAI_FILE" ]]; then + update_agent_file "$SHAI_FILE" "SHAI" + found_agent=true + fi + + if [[ -f "$QODER_FILE" ]]; then + update_agent_file "$QODER_FILE" "Qoder CLI" + found_agent=true + fi + + if [[ -f "$Q_FILE" ]]; then + update_agent_file "$Q_FILE" "Amazon Q Developer CLI" + found_agent=true + fi + + if [[ -f "$AGY_FILE" ]]; then + update_agent_file "$AGY_FILE" "Antigravity" + found_agent=true + fi + + if [[ -f "$BOB_FILE" ]]; then + update_agent_file "$BOB_FILE" "IBM Bob" + found_agent=true + fi + + # If no agent files exist, create a default Claude file + if [[ "$found_agent" == false ]]; then + log_info "No existing agent files found, creating default Claude file..." + update_agent_file "$CLAUDE_FILE" "Claude Code" + fi +} +print_summary() { + echo + log_info "Summary of changes:" + + if [[ -n "$NEW_LANG" ]]; then + echo " - Added language: $NEW_LANG" + fi + + if [[ -n "$NEW_FRAMEWORK" ]]; then + echo " - Added framework: $NEW_FRAMEWORK" + fi + + if [[ -n "$NEW_DB" ]] && [[ "$NEW_DB" != "N/A" ]]; then + echo " - Added database: $NEW_DB" + fi + + echo + + log_info "Usage: $0 [claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|codebuddy|shai|q|agy|bob|qoder]" +} + +#============================================================================== +# Main Execution +#============================================================================== + +main() { + # Validate environment before proceeding + validate_environment + + log_info "=== Updating agent context files for feature $CURRENT_BRANCH ===" + + # Parse the plan file to extract project information + if ! parse_plan_data "$NEW_PLAN"; then + log_error "Failed to parse plan data" + exit 1 + fi + + # Process based on agent type argument + local success=true + + if [[ -z "$AGENT_TYPE" ]]; then + # No specific agent provided - update all existing agent files + log_info "No agent specified, updating all existing agent files..." + if ! update_all_existing_agents; then + success=false + fi + else + # Specific agent provided - update only that agent + log_info "Updating specific agent: $AGENT_TYPE" + if ! update_specific_agent "$AGENT_TYPE"; then + success=false + fi + fi + + # Print summary + print_summary + + if [[ "$success" == true ]]; then + log_success "Agent context update completed successfully" + exit 0 + else + log_error "Agent context update completed with errors" + exit 1 + fi +} + +# Execute main function if script is run directly +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + main "$@" +fi + diff --git a/.specify/templates/agent-file-template.md b/.specify/templates/agent-file-template.md new file mode 100644 index 0000000..4cc7fd6 --- /dev/null +++ b/.specify/templates/agent-file-template.md @@ -0,0 +1,28 @@ +# [PROJECT NAME] Development Guidelines + +Auto-generated from all feature plans. Last updated: [DATE] + +## Active Technologies + +[EXTRACTED FROM ALL PLAN.MD FILES] + +## Project Structure + +```text +[ACTUAL STRUCTURE FROM PLANS] +``` + +## Commands + +[ONLY COMMANDS FOR ACTIVE TECHNOLOGIES] + +## Code Style + +[LANGUAGE-SPECIFIC, ONLY FOR LANGUAGES IN USE] + +## Recent Changes + +[LAST 3 FEATURES AND WHAT THEY ADDED] + + + diff --git a/.specify/templates/checklist-template.md b/.specify/templates/checklist-template.md new file mode 100644 index 0000000..806657d --- /dev/null +++ b/.specify/templates/checklist-template.md @@ -0,0 +1,40 @@ +# [CHECKLIST TYPE] Checklist: [FEATURE NAME] + +**Purpose**: [Brief description of what this checklist covers] +**Created**: [DATE] +**Feature**: [Link to spec.md or relevant documentation] + +**Note**: This checklist is generated by the `/speckit.checklist` command based on feature context and requirements. + + + +## [Category 1] + +- [ ] CHK001 First checklist item with clear action +- [ ] CHK002 Second checklist item +- [ ] CHK003 Third checklist item + +## [Category 2] + +- [ ] CHK004 Another category item +- [ ] CHK005 Item with specific criteria +- [ ] CHK006 Final item in this category + +## Notes + +- Check items off as completed: `[x]` +- Add comments or findings inline +- Link to relevant resources or documentation +- Items are numbered sequentially for easy reference diff --git a/.specify/templates/constitution-template.md b/.specify/templates/constitution-template.md new file mode 100644 index 0000000..a4670ff --- /dev/null +++ b/.specify/templates/constitution-template.md @@ -0,0 +1,50 @@ +# [PROJECT_NAME] Constitution + + +## Core Principles + +### [PRINCIPLE_1_NAME] + +[PRINCIPLE_1_DESCRIPTION] + + +### [PRINCIPLE_2_NAME] + +[PRINCIPLE_2_DESCRIPTION] + + +### [PRINCIPLE_3_NAME] + +[PRINCIPLE_3_DESCRIPTION] + + +### [PRINCIPLE_4_NAME] + +[PRINCIPLE_4_DESCRIPTION] + + +### [PRINCIPLE_5_NAME] + +[PRINCIPLE_5_DESCRIPTION] + + +## [SECTION_2_NAME] + + +[SECTION_2_CONTENT] + + +## [SECTION_3_NAME] + + +[SECTION_3_CONTENT] + + +## Governance + + +[GOVERNANCE_RULES] + + +**Version**: [CONSTITUTION_VERSION] | **Ratified**: [RATIFICATION_DATE] | **Last Amended**: [LAST_AMENDED_DATE] + diff --git a/.specify/templates/plan-template.md b/.specify/templates/plan-template.md new file mode 100644 index 0000000..dd47efc --- /dev/null +++ b/.specify/templates/plan-template.md @@ -0,0 +1,104 @@ +# Implementation Plan: [FEATURE] + +**Branch**: `[###-feature-name]` | **Date**: [DATE] | **Spec**: [link] +**Input**: Feature specification from `/specs/[###-feature-name]/spec.md` + +**Note**: This template is filled in by the `/speckit.plan` command. See `.specify/templates/plan-template.md` for the execution workflow. + +## Summary + +[Extract from feature spec: primary requirement + technical approach from research] + +## Technical Context + + + +**Language/Version**: [e.g., Python 3.11, Swift 5.9, Rust 1.75 or NEEDS CLARIFICATION] +**Primary Dependencies**: [e.g., FastAPI, UIKit, LLVM or NEEDS CLARIFICATION] +**Storage**: [if applicable, e.g., PostgreSQL, CoreData, files or N/A] +**Testing**: [e.g., pytest, XCTest, cargo test or NEEDS CLARIFICATION] +**Target Platform**: [e.g., Linux server, iOS 15+, WASM or NEEDS CLARIFICATION] +**Project Type**: [single/web/mobile - determines source structure] +**Performance Goals**: [domain-specific, e.g., 1000 req/s, 10k lines/sec, 60 fps or NEEDS CLARIFICATION] +**Constraints**: [domain-specific, e.g., <200ms p95, <100MB memory, offline-capable or NEEDS CLARIFICATION] +**Scale/Scope**: [domain-specific, e.g., 10k users, 1M LOC, 50 screens or NEEDS CLARIFICATION] + +## Constitution Check + +*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.* + +[Gates determined based on constitution file] + +## Project Structure + +### Documentation (this feature) + +```text +specs/[###-feature]/ +├── plan.md # This file (/speckit.plan command output) +├── research.md # Phase 0 output (/speckit.plan command) +├── data-model.md # Phase 1 output (/speckit.plan command) +├── quickstart.md # Phase 1 output (/speckit.plan command) +├── contracts/ # Phase 1 output (/speckit.plan command) +└── tasks.md # Phase 2 output (/speckit.tasks command - NOT created by /speckit.plan) +``` + +### Source Code (repository root) + + +```text +# [REMOVE IF UNUSED] Option 1: Single project (DEFAULT) +src/ +├── models/ +├── services/ +├── cli/ +└── lib/ + +tests/ +├── contract/ +├── integration/ +└── unit/ + +# [REMOVE IF UNUSED] Option 2: Web application (when "frontend" + "backend" detected) +backend/ +├── src/ +│ ├── models/ +│ ├── services/ +│ └── api/ +└── tests/ + +frontend/ +├── src/ +│ ├── components/ +│ ├── pages/ +│ └── services/ +└── tests/ + +# [REMOVE IF UNUSED] Option 3: Mobile + API (when "iOS/Android" detected) +api/ +└── [same as backend above] + +ios/ or android/ +└── [platform-specific structure: feature modules, UI flows, platform tests] +``` + +**Structure Decision**: [Document the selected structure and reference the real +directories captured above] + +## Complexity Tracking + +> **Fill ONLY if Constitution Check has violations that must be justified** + +| Violation | Why Needed | Simpler Alternative Rejected Because | +|-----------|------------|-------------------------------------| +| [e.g., 4th project] | [current need] | [why 3 projects insufficient] | +| [e.g., Repository pattern] | [specific problem] | [why direct DB access insufficient] | diff --git a/.specify/templates/spec-template.md b/.specify/templates/spec-template.md new file mode 100644 index 0000000..c67d914 --- /dev/null +++ b/.specify/templates/spec-template.md @@ -0,0 +1,115 @@ +# Feature Specification: [FEATURE NAME] + +**Feature Branch**: `[###-feature-name]` +**Created**: [DATE] +**Status**: Draft +**Input**: User description: "$ARGUMENTS" + +## User Scenarios & Testing *(mandatory)* + + + +### User Story 1 - [Brief Title] (Priority: P1) + +[Describe this user journey in plain language] + +**Why this priority**: [Explain the value and why it has this priority level] + +**Independent Test**: [Describe how this can be tested independently - e.g., "Can be fully tested by [specific action] and delivers [specific value]"] + +**Acceptance Scenarios**: + +1. **Given** [initial state], **When** [action], **Then** [expected outcome] +2. **Given** [initial state], **When** [action], **Then** [expected outcome] + +--- + +### User Story 2 - [Brief Title] (Priority: P2) + +[Describe this user journey in plain language] + +**Why this priority**: [Explain the value and why it has this priority level] + +**Independent Test**: [Describe how this can be tested independently] + +**Acceptance Scenarios**: + +1. **Given** [initial state], **When** [action], **Then** [expected outcome] + +--- + +### User Story 3 - [Brief Title] (Priority: P3) + +[Describe this user journey in plain language] + +**Why this priority**: [Explain the value and why it has this priority level] + +**Independent Test**: [Describe how this can be tested independently] + +**Acceptance Scenarios**: + +1. **Given** [initial state], **When** [action], **Then** [expected outcome] + +--- + +[Add more user stories as needed, each with an assigned priority] + +### Edge Cases + + + +- What happens when [boundary condition]? +- How does system handle [error scenario]? + +## Requirements *(mandatory)* + + + +### Functional Requirements + +- **FR-001**: System MUST [specific capability, e.g., "allow users to create accounts"] +- **FR-002**: System MUST [specific capability, e.g., "validate email addresses"] +- **FR-003**: Users MUST be able to [key interaction, e.g., "reset their password"] +- **FR-004**: System MUST [data requirement, e.g., "persist user preferences"] +- **FR-005**: System MUST [behavior, e.g., "log all security events"] + +*Example of marking unclear requirements:* + +- **FR-006**: System MUST authenticate users via [NEEDS CLARIFICATION: auth method not specified - email/password, SSO, OAuth?] +- **FR-007**: System MUST retain user data for [NEEDS CLARIFICATION: retention period not specified] + +### Key Entities *(include if feature involves data)* + +- **[Entity 1]**: [What it represents, key attributes without implementation] +- **[Entity 2]**: [What it represents, relationships to other entities] + +## Success Criteria *(mandatory)* + + + +### Measurable Outcomes + +- **SC-001**: [Measurable metric, e.g., "Users can complete account creation in under 2 minutes"] +- **SC-002**: [Measurable metric, e.g., "System handles 1000 concurrent users without degradation"] +- **SC-003**: [User satisfaction metric, e.g., "90% of users successfully complete primary task on first attempt"] +- **SC-004**: [Business metric, e.g., "Reduce support tickets related to [X] by 50%"] diff --git a/.specify/templates/tasks-template.md b/.specify/templates/tasks-template.md new file mode 100644 index 0000000..60f9be4 --- /dev/null +++ b/.specify/templates/tasks-template.md @@ -0,0 +1,251 @@ +--- + +description: "Task list template for feature implementation" +--- + +# Tasks: [FEATURE NAME] + +**Input**: Design documents from `/specs/[###-feature-name]/` +**Prerequisites**: plan.md (required), spec.md (required for user stories), research.md, data-model.md, contracts/ + +**Tests**: The examples below include test tasks. Tests are OPTIONAL - only include them if explicitly requested in the feature specification. + +**Organization**: Tasks are grouped by user story to enable independent implementation and testing of each story. + +## Format: `[ID] [P?] [Story] Description` + +- **[P]**: Can run in parallel (different files, no dependencies) +- **[Story]**: Which user story this task belongs to (e.g., US1, US2, US3) +- Include exact file paths in descriptions + +## Path Conventions + +- **Single project**: `src/`, `tests/` at repository root +- **Web app**: `backend/src/`, `frontend/src/` +- **Mobile**: `api/src/`, `ios/src/` or `android/src/` +- Paths shown below assume single project - adjust based on plan.md structure + + + +## Phase 1: Setup (Shared Infrastructure) + +**Purpose**: Project initialization and basic structure + +- [ ] T001 Create project structure per implementation plan +- [ ] T002 Initialize [language] project with [framework] dependencies +- [ ] T003 [P] Configure linting and formatting tools + +--- + +## Phase 2: Foundational (Blocking Prerequisites) + +**Purpose**: Core infrastructure that MUST be complete before ANY user story can be implemented + +**⚠️ CRITICAL**: No user story work can begin until this phase is complete + +Examples of foundational tasks (adjust based on your project): + +- [ ] T004 Setup database schema and migrations framework +- [ ] T005 [P] Implement authentication/authorization framework +- [ ] T006 [P] Setup API routing and middleware structure +- [ ] T007 Create base models/entities that all stories depend on +- [ ] T008 Configure error handling and logging infrastructure +- [ ] T009 Setup environment configuration management + +**Checkpoint**: Foundation ready - user story implementation can now begin in parallel + +--- + +## Phase 3: User Story 1 - [Title] (Priority: P1) 🎯 MVP + +**Goal**: [Brief description of what this story delivers] + +**Independent Test**: [How to verify this story works on its own] + +### Tests for User Story 1 (OPTIONAL - only if tests requested) ⚠️ + +> **NOTE: Write these tests FIRST, ensure they FAIL before implementation** + +- [ ] T010 [P] [US1] Contract test for [endpoint] in tests/contract/test_[name].py +- [ ] T011 [P] [US1] Integration test for [user journey] in tests/integration/test_[name].py + +### Implementation for User Story 1 + +- [ ] T012 [P] [US1] Create [Entity1] model in src/models/[entity1].py +- [ ] T013 [P] [US1] Create [Entity2] model in src/models/[entity2].py +- [ ] T014 [US1] Implement [Service] in src/services/[service].py (depends on T012, T013) +- [ ] T015 [US1] Implement [endpoint/feature] in src/[location]/[file].py +- [ ] T016 [US1] Add validation and error handling +- [ ] T017 [US1] Add logging for user story 1 operations + +**Checkpoint**: At this point, User Story 1 should be fully functional and testable independently + +--- + +## Phase 4: User Story 2 - [Title] (Priority: P2) + +**Goal**: [Brief description of what this story delivers] + +**Independent Test**: [How to verify this story works on its own] + +### Tests for User Story 2 (OPTIONAL - only if tests requested) ⚠️ + +- [ ] T018 [P] [US2] Contract test for [endpoint] in tests/contract/test_[name].py +- [ ] T019 [P] [US2] Integration test for [user journey] in tests/integration/test_[name].py + +### Implementation for User Story 2 + +- [ ] T020 [P] [US2] Create [Entity] model in src/models/[entity].py +- [ ] T021 [US2] Implement [Service] in src/services/[service].py +- [ ] T022 [US2] Implement [endpoint/feature] in src/[location]/[file].py +- [ ] T023 [US2] Integrate with User Story 1 components (if needed) + +**Checkpoint**: At this point, User Stories 1 AND 2 should both work independently + +--- + +## Phase 5: User Story 3 - [Title] (Priority: P3) + +**Goal**: [Brief description of what this story delivers] + +**Independent Test**: [How to verify this story works on its own] + +### Tests for User Story 3 (OPTIONAL - only if tests requested) ⚠️ + +- [ ] T024 [P] [US3] Contract test for [endpoint] in tests/contract/test_[name].py +- [ ] T025 [P] [US3] Integration test for [user journey] in tests/integration/test_[name].py + +### Implementation for User Story 3 + +- [ ] T026 [P] [US3] Create [Entity] model in src/models/[entity].py +- [ ] T027 [US3] Implement [Service] in src/services/[service].py +- [ ] T028 [US3] Implement [endpoint/feature] in src/[location]/[file].py + +**Checkpoint**: All user stories should now be independently functional + +--- + +[Add more user story phases as needed, following the same pattern] + +--- + +## Phase N: Polish & Cross-Cutting Concerns + +**Purpose**: Improvements that affect multiple user stories + +- [ ] TXXX [P] Documentation updates in docs/ +- [ ] TXXX Code cleanup and refactoring +- [ ] TXXX Performance optimization across all stories +- [ ] TXXX [P] Additional unit tests (if requested) in tests/unit/ +- [ ] TXXX Security hardening +- [ ] TXXX Run quickstart.md validation + +--- + +## Dependencies & Execution Order + +### Phase Dependencies + +- **Setup (Phase 1)**: No dependencies - can start immediately +- **Foundational (Phase 2)**: Depends on Setup completion - BLOCKS all user stories +- **User Stories (Phase 3+)**: All depend on Foundational phase completion + - User stories can then proceed in parallel (if staffed) + - Or sequentially in priority order (P1 → P2 → P3) +- **Polish (Final Phase)**: Depends on all desired user stories being complete + +### User Story Dependencies + +- **User Story 1 (P1)**: Can start after Foundational (Phase 2) - No dependencies on other stories +- **User Story 2 (P2)**: Can start after Foundational (Phase 2) - May integrate with US1 but should be independently testable +- **User Story 3 (P3)**: Can start after Foundational (Phase 2) - May integrate with US1/US2 but should be independently testable + +### Within Each User Story + +- Tests (if included) MUST be written and FAIL before implementation +- Models before services +- Services before endpoints +- Core implementation before integration +- Story complete before moving to next priority + +### Parallel Opportunities + +- All Setup tasks marked [P] can run in parallel +- All Foundational tasks marked [P] can run in parallel (within Phase 2) +- Once Foundational phase completes, all user stories can start in parallel (if team capacity allows) +- All tests for a user story marked [P] can run in parallel +- Models within a story marked [P] can run in parallel +- Different user stories can be worked on in parallel by different team members + +--- + +## Parallel Example: User Story 1 + +```bash +# Launch all tests for User Story 1 together (if tests requested): +Task: "Contract test for [endpoint] in tests/contract/test_[name].py" +Task: "Integration test for [user journey] in tests/integration/test_[name].py" + +# Launch all models for User Story 1 together: +Task: "Create [Entity1] model in src/models/[entity1].py" +Task: "Create [Entity2] model in src/models/[entity2].py" +``` + +--- + +## Implementation Strategy + +### MVP First (User Story 1 Only) + +1. Complete Phase 1: Setup +2. Complete Phase 2: Foundational (CRITICAL - blocks all stories) +3. Complete Phase 3: User Story 1 +4. **STOP and VALIDATE**: Test User Story 1 independently +5. Deploy/demo if ready + +### Incremental Delivery + +1. Complete Setup + Foundational → Foundation ready +2. Add User Story 1 → Test independently → Deploy/Demo (MVP!) +3. Add User Story 2 → Test independently → Deploy/Demo +4. Add User Story 3 → Test independently → Deploy/Demo +5. Each story adds value without breaking previous stories + +### Parallel Team Strategy + +With multiple developers: + +1. Team completes Setup + Foundational together +2. Once Foundational is done: + - Developer A: User Story 1 + - Developer B: User Story 2 + - Developer C: User Story 3 +3. Stories complete and integrate independently + +--- + +## Notes + +- [P] tasks = different files, no dependencies +- [Story] label maps task to specific user story for traceability +- Each user story should be independently completable and testable +- Verify tests fail before implementing +- Commit after each task or logical group +- Stop at any checkpoint to validate story independently +- Avoid: vague tasks, same file conflicts, cross-story dependencies that break independence diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..5b08d9d --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,158 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +This is a Jekyll-based static website for the **DevFest Perros-Guirec** conference, organized by the Code d'Armor association. The website is primarily in French and showcases conference information including speakers, agenda, sponsors, and ticketing. + +## Build Commands + +### Development +```bash +# Start local development server with live reload +bundle exec jekyll serve --trace + +# The site will be available at http://localhost:4000 +``` + +### Build for Production +```bash +# Build the site (outputs to ./_site by default) +bundle exec jekyll build + +# Build with production environment +JEKYLL_ENV=production bundle exec jekyll build +``` + +### Dependency Management +```bash +# Install dependencies after cloning +bundle install + +# Update gems +bundle update +``` + +## Project Architecture + +### Directory Structure + +- **`index.md`** - Main homepage with conference configuration (speakers, agenda, sponsors, etc.) +- **`_config.yml`** - Jekyll configuration (plugins, sass compilation, asset pipeline) +- **`_includes/`** - Reusable HTML fragments (header, footer, agenda, speakers, etc.) +- **`_layouts/`** - Page templates (home_conference, sponsors, archives, about) +- **`_data/commons.yml`** - Shared data (menu, sponsors, newsletter links) +- **`_sass/`** - SCSS stylesheets +- **`assets/`** - Static assets organized by year (images, CSS, JS, archived editions) + +### Key Data Flow + +The homepage (`index.md`) uses YAML front matter to define all dynamic content: + +```yaml +--- +layout: home_conference # Uses _layouts/home_conference.html + +# Sections are conditionally rendered in the layout: +Carrousel_Slides: # Hero carousel +Details: # Event info (where, when, who) +CallForProposal: # CFP section (commented out when inactive) +Speakers: # Speaker list with bios and photos +Agenda: # Schedule with talk descriptions +Sponsoring: # Partner logos +Register: # Ticketing buttons +Shop: # Merchandise section +Gallery: # Photo gallery +Newsletter: # Newsletter signup +--- +``` + +The layout (`_layouts/home_conference.html`) conditionally includes sections: +```liquid +{% if page.Speakers != null %} + {% include speakers.html %} +{% endif %} +``` + +### Data Sources + +| Data | Location | +|------|----------| +| Menu, sponsors, newsletter links | `_data/commons.yml` | +| Conference details, speakers, agenda | `index.md` front matter | +| Archives | `archives.md` front matter | +| Sponsor page content | `sponsors.md` front matter | + +### Asset Pipeline + +Uses `jekyll_asset_pipeline` plugin with a custom SCSS converter (`_plugins/jekyll_asset_pipeline.rb`). Sass is configured with `style: compressed` in `_config.yml`. + +### Deployment + +GitHub Actions workflow (`.github/workflows/jekyll.yml`) builds and deploys to GitHub Pages on pushes to `master` branch. + +## Adding/Modifying Content + +### Adding a Speaker +Add to `index.md` under `Speakers.list`: +```yaml +- name: "Speaker Name" + id: "unique_id" + organization: "Company" + photo_url: "assets/2025/photos_speakers/filename.webp" + bio: > + Speaker bio here... + social_links: + - type: linkedin + url: https://linkedin.com/in/... +``` + +Then reference in agenda using the `id`. + +### Adding an Agenda Item +Add to `index.md` under `Agenda.schedule`: +```yaml +- slot_begin_time: "HH:MM" + slot_type: talk|break|quickie + title: "Session Title" + speakers: + - id: speaker_id # References Speakers.list + description: > + Session description... +``` + +### Enabling/Disabling Sections +Comment out or remove the section from `index.md` front matter to hide it. The layout checks for null before rendering. + +## Important Notes + +- Past conference editions are archived in `assets/YYYY/` folders +- Speaker photos should be placed in `assets/2025/photos_speakers/` +- Sponsor logos go in `assets/img/logos_sponsors/` +- The site uses Font Awesome icons (loaded via CDN in header) + +## Active Technologies +- Ruby 2.5+, Jekyll 4.x + Jekyll static site generator, jekyll_asset_pipeline plugin (001-speaker-videos) +- YAML front matter in Markdown files (index.md) (001-speaker-videos) +- Jekyll 4.x (Ruby-based static site generator), YAML, Liquid templates + jekyll_asset_pipeline (existing) (002-photo-gallery) +- N/A (static file references) (002-photo-gallery) + +## Recent Changes +- 001-speaker-videos: Added Ruby 2.5+, Jekyll 4.x + Jekyll static site generator, jekyll_asset_pipeline plugin + +## Development Workflow + +### Testing with Playwright + +When taking screenshots during browser testing, use the dedicated `.playwright/` folder: + +```bash +# Screenshots are saved to .playwright/ (gitignored) +# Example screenshot paths: +# - .playwright/homepage.webp +# - .playwright/mobile-view.webp +# - .playwright/archive-test.webp +``` + +This keeps test artifacts out of version control while maintaining a consistent location for visual debugging. diff --git a/Gemfile b/Gemfile index 08fcac7..e4e1997 100644 --- a/Gemfile +++ b/Gemfile @@ -35,3 +35,6 @@ gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin] # Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem # do not have a Java counterpart. gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby] + +# Archive tool - builds and archives site versions +gem "archive", path: "gems/archive" diff --git a/Gemfile.lock b/Gemfile.lock index b2ce4a2..16feac3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,20 +1,32 @@ +PATH + remote: gems/archive + specs: + archive (1.0.0) + GEM remote: https://rubygems.org/ specs: - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) colorator (1.1.0) - concurrent-ruby (1.2.3) + concurrent-ruby (1.3.5) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) - ffi (1.16.3) + ffi (1.17.2) + ffi (1.17.2-arm64-darwin) + ffi (1.17.2-x86_64-darwin) + ffi (1.17.2-x86_64-linux-gnu) forwardable-extended (2.6.0) + google-protobuf (3.25.8) + google-protobuf (3.25.8-arm64-darwin) + google-protobuf (3.25.8-x86_64-darwin) + google-protobuf (3.25.8-x86_64-linux) http_parser.rb (0.8.0) - i18n (1.14.1) + i18n (1.14.7) concurrent-ruby (~> 1.0) - jekyll (4.3.3) + jekyll (4.3.4) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) @@ -34,8 +46,8 @@ GEM jekyll (>= 3.7, < 5.0) jekyll-redirect-from (0.16.0) jekyll (>= 3.3, < 5.0) - jekyll-sass-converter (2.2.0) - sassc (> 2.0.1, < 3.0) + jekyll-sass-converter (3.0.0) + sass-embedded (~> 1.54) jekyll-seo-tag (2.8.0) jekyll (>= 3.8, < 5.0) jekyll-watch (2.2.1) @@ -43,39 +55,53 @@ GEM jekyll_asset_pipeline (0.6.2) jekyll (>= 3.5, < 5.0) liquid (~> 4.0) - kramdown (2.4.0) - rexml + kramdown (2.5.1) + rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) liquid (4.0.4) - listen (3.8.0) + listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.4.0) - minima (2.5.1) + minima (2.5.2) jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (4.0.7) + public_suffix (6.0.2) + rake (13.3.0) rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.2.6) - rouge (3.30.0) + rexml (3.4.1) + rouge (4.5.2) safe_yaml (1.0.5) + sass-embedded (1.69.5) + google-protobuf (~> 3.23) + rake (>= 13.0.0) + sass-embedded (1.69.5-arm64-darwin) + google-protobuf (~> 3.23) + sass-embedded (1.69.5-x86_64-darwin) + google-protobuf (~> 3.23) + sass-embedded (1.69.5-x86_64-linux-gnu) + google-protobuf (~> 3.23) sassc (2.4.0) ffi (~> 1.9) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - unicode-display_width (2.5.0) - webrick (1.8.1) + unicode-display_width (2.6.0) + webrick (1.9.1) PLATFORMS + arm64-darwin ruby + x86_64-darwin + x86_64-linux DEPENDENCIES + archive! http_parser.rb (~> 0.6.0) jekyll (~> 4.3.3) jekyll-redirect-from @@ -87,4 +113,4 @@ DEPENDENCIES wdm (~> 0.1.1) BUNDLED WITH - 1.16.1 + 2.5.6 diff --git a/README.md b/README.md index d941ca9..e9a58d9 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,292 @@ -# README +# DevFest Perros-Guirec -## Installer l'environnement +Site web de la conférence **DevFest Perros-Guirec**, organisée par l'association Code d'Armor. Ce site est construit avec [Jekyll](https://jekyllrb.com/), un générateur de sites statiques en Ruby. + +> **Note :** Tout le contenu du site (textes, descriptions, messages) doit être rédigée en **français**. + +## Démarrage rapide + +```shell +# Installer les dépendances +bundle install + +# Lancer le serveur de développement +bundle exec jekyll serve --trace +# Site accessible sur http://localhost:4000 +``` + +## Scripts d'optimisation + +Le projet inclut des scripts pour gérer les images (conversion JPG/PNG → WebP). + +### Commandes principales + +```shell +# Convertir les images (mode sûr - garde les fichiers sources) +./scripts/optimize-images.sh + +# Convertir, remplacer les URLs et supprimer les fichiers sources +./scripts/optimize-images.sh --full + +# Vérifier l'intégrité des références d'images +./scripts/audit-images.sh +``` + +Pour plus de détails, voir [scripts/README.md](./scripts/README.md). + +## Prérequis + +- Ruby 2.5 ou supérieur +- Bundler (gestionnaire de dépendances Ruby) + +## Installation + +### 1. Installer Ruby et les dépendances système ```shell apt-get install ruby-full build-essential zlib1g-dev +``` +### 2. Configurer l'environnement Ruby + +```shell echo '# Install Ruby Gems to ~/gems' >> ~/.bashrc echo 'export GEM_HOME="$HOME/gems"' >> ~/.bashrc echo 'export PATH="$HOME/gems/bin:$PATH"' >> ~/.bashrc source ~/.bashrc +``` +### 3. Installer Jekyll et les dépendances du projet + +```shell gem install jekyll bundler bundle install ``` -## Démarrer une instance locale +## Démarrage rapide + +Lancer le serveur de développement local : ```shell bundle exec jekyll serve --trace ``` + +Le site est accessible à l'adresse http://localhost:4000 + +## Structure du projet + +``` +. +├── index.md # Page d'accueil (configuration principale) +├── _config.yml # Configuration Jekyll +├── Gemfile # Dépendances Ruby +├── _includes/ # Fragments HTML réutilisables +│ ├── header.html +│ ├── footer.html +│ ├── agenda.html +│ └── speakers.html +├── _layouts/ # Templates de pages +│ ├── home_conference.html +│ └── sponsors.html +├── _data/ +│ └── commons.yml # Données partagées (menu, sponsors) +├── _sass/ # Styles SCSS +├── assets/ # Ressources statiques +│ ├── 2025/ # Édition 2025 +│ │ └── photos_speakers/ +│ └── img/ +│ └── logos_sponsors/ +├── archives.md # Page d'archives +├── sponsors.md # Page sponsoring +└── about_ca.md # Page association Code d'Armor +``` + +## Architecture des données + +Le contenu du site est réparti entre deux sources principales : + +### 1. `index.md` (Front Matter YAML) + +Contient les données spécifiques à l'édition courante : +- **Speakers** : Liste des intervenants avec bios et photos +- **Agenda** : Programme, créneaux horaires et descriptions +- **Carrousel_Slides** : Diapositives de la bannière d'accueil +- **Details** : Informations de l'événement (date, lieu, etc.) +- **Sponsoring** : Section partenaires +- **Register** : Boutons d'inscription/billetterie +- **Shop** : Section boutique (goodies) +- **Gallery** : Galerie photos + +Les sections sont conditionnellement affichées dans le layout. Pour masquer une section, il suffit de la commenter ou de la supprimer du front matter. + +### 2. `_data/commons.yml` + +Contient les données partagées entre les pages : +- **menu** : Liens de navigation +- **Newsletter** : Configuration de l'inscription newsletter +- **Sponsors** : Logos des sponsors (utilisés dans le footer et autres pages) + +## Personnaliser le contenu + +### Ajouter un intervenant + +Dans `index.md`, ajouter sous `Speakers.list` : + +```yaml +Speakers: + list: + - name: "Prénom Nom" + id: "nom_unique" + organization: "Entreprise" + photo_url: "assets/2025/photos_speakers/nom.webp" + bio: > + Description de l'intervenant... + social_links: + - type: linkedin + url: https://linkedin.com/in/... + - type: twitter + url: https://twitter.com/... +``` + +### Ajouter un créneau à l'agenda + +Dans `index.md`, ajouter sous `Agenda.schedule` : + +```yaml +Agenda: + schedule: + - slot_begin_time: "09:00" + slot_type: talk # talk, quickie, ou break + title: "Titre de la présentation" + speakers: + - id: nom_unique # Référence le Speakers.list + description: > + Description du talk... + room: "Salle principale" +``` + +### Activer/désactiver une section + +Pour masquer une section (par exemple quand le CFP est fermé), commentez-la dans `index.md` : + +```yaml +# CallForProposal: +# title: "Call for Proposal" +# ... +``` + +Ou supprimez-la complètement. Le layout vérifie la présence de la section avant de l'afficher. + +## Déploiement + +Le site est déployé automatiquement sur GitHub Pages via GitHub Actions (voir `.github/workflows/jekyll.yml`). + +À chaque push sur la branche `master`, le workflow : +1. Construit le site avec Jekyll +2. Déploie le résultat sur GitHub Pages + +### Build manuel + +Pour générer le site localement (dans `_site/`) : + +```shell +# Build de développement +bundle exec jekyll build + +# Build de production +JEKYLL_ENV=production bundle exec jekyll build +``` + +## Bonnes pratiques + +- Les photos des speakers doivent être placées dans `assets/2025/photos_speakers/` +- Les logos des sponsors vont dans `assets/img/logos_sponsors/` +- Les éditions précédentes sont archivées dans `assets/YYYY/` +- Utilisez les fragments dans `_includes/` pour éviter la duplication de code HTML +- Les données dynamiques (agenda, intervenants) sont centralisées dans `index.md` + +## Optimisations de performance + +Le site intègre plusieurs optimisations pour améliorer les temps de chargement et les scores Core Web Vitals : + +### Optimisations implémentées + +| Technique | Impact | Fichiers concernés | +|-----------|--------|-------------------| +| **CSS critique inline** | Réduction du First Contentful Paint | `_includes/header.html` | +| **Chargement async CSS** | Non-bloquant pour le rendu | `_includes/header.html` | +| **JavaScript différé** | Meilleur Time to Interactive | `_includes/footer.html` | +| **Lazy loading images** | Réduction de la bande passante | `_includes/speakers.html`, `_includes/gallery.html` | +| **Resource hints** | Préconnexion aux CDN | `_includes/header.html` | +| **Compression gzip** | Réduction de la taille des assets | `_config.yml` | +| **Exclusion des anciens assets** | Build plus rapide | `_config.yml` | + +### Résultats + +- **Taille du site** : 1.7 GB → 988 MB (42% de réduction) +- **Temps de build** : ~11s → ~7s (36% plus rapide) +- **Premier affichage** : Amélioré avec le CSS critique inline +- **Images** : Chargement paresseux pour les images hors écran + +### Optimisation des images + +Pour convertir automatiquement les images en WebP et créer des tailles responsives : + +```shell +# Installer les dépendances +sudo apt-get install webp imagemagick + +# Exécuter le script d'optimisation +./scripts/optimize-images.sh +``` + +Ce script convertit les JPEG/PNG en WebP (qualité 85%) et génère des tailles responsives (400w, 800w, 1200w) pour la galerie. + +### Chargement des ressources + +- **CSS** : Le CSS critique est inline dans le ``. Le reste est chargé de manière asynchrone. +- **JavaScript** : Tous les scripts sont placés en fin de page avec l'attribut `defer`. +- **Images** : Les images utilisent `loading="lazy"` et `decoding="async"`. +- **Polices** : Les polices Google Fonts sont chargées avec `display=swap`. + +### Maintenance + +Lors de l'ajout de nouvelles sections avec des images : +1. Ajouter `loading="lazy"` pour les images hors écran +2. Ajouter `decoding="async"` pour le décodage non-bloquant +3. Spécifier les dimensions (`width`, `height`) pour éviter les décalages de layout +4. Utiliser `fetchpriority="high"` pour l'image LCP (largest contentful paint) + +## Archivage des éditions + +Lorsqu'une édition est terminée, archivez le site dans `assets//`. + +### Installation + +```shell +bundle install +``` + +### Utilisation + +```shell +bundle exec archive 2025 +``` + +Cela : +1. Génère le site dans `_site/` +2. Copie le contenu vers `assets/2025/` +3. Corrige les URLs (convertit `/assets/...` en relatifs) +4. Ajoute l'entrée dans `archives.md` + +### Exemples + +```shell +# Archive standard +bundle exec archive 2025 +# → Crée assets/2025/ + +# Archive édition spéciale +bundle exec archive 2025-devfestnoz +# → Crée assets/2025-devfestnoz/ +``` diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..38601da --- /dev/null +++ b/Rakefile @@ -0,0 +1,208 @@ +# frozen_string_literal: true + +require 'yaml' +require 'fileutils' + +# Default archive year detection +def detect_year + # Try to get year from index.md or use current year + index_content = File.read('index.md', encoding: 'UTF-8') rescue nil + if index_content + # Look for date in the content + date_match = index_content.match(/(\d{4})/) + return date_match[1] if date_match + end + Time.now.year.to_s +end + +# Default edition name +def detect_edition + 'devfest' +end + +desc "Archive the current Jekyll build to assets///" +task :archive, [:year, :edition] do |_t, args| + args.with_defaults(year: detect_year, edition: detect_edition) + + year = args[:year] + edition = args[:edition] + archive_path = "assets/#{year}/#{edition}" + build_path = '_site' + + puts "Archiving #{year}/#{edition}..." + puts "=" * 50 + + # Step 1: Build the Jekyll site + puts "\n[1/5] Building Jekyll site..." + system('bundle exec jekyll build --trace') || exit(1) + + # Step 2: Clean and create archive directory + puts "\n[2/5] Preparing archive directory: #{archive_path}/" + FileUtils.rm_rf(archive_path) + FileUtils.mkdir_p(archive_path) + + # Step 3: Copy build files to archive + puts "\n[3/5] Copying build files..." + Dir.glob("#{build_path}/*").each do |file| + target = "#{archive_path}/#{File.basename(file)}" + if File.directory?(file) + FileUtils.cp_r(file, target) + else + FileUtils.cp(file, target) + end + end + + # Step 4: Fix relative URLs in HTML files + puts "\n[4/5] Fixing relative URLs..." + fix_urls(archive_path, "/assets/#{year}/#{edition}/") + + # Step 5: Add to archives menu + puts "\n[5/5] Adding to archives menu..." + add_to_archives(year, edition) + + puts "\n" + "=" * 50 + puts "Archive complete: #{archive_path}/" + puts "View at: http://localhost:4000/#{archive_path}/" +end + +desc "Build and archive with current year (default edition: devfest)" +task :archive_current do + Rake::Task[:archive].invoke(detect_year, detect_edition) +end + +desc "List existing archives" +task :list_archives do + puts "Existing archives:" + puts "-" * 40 + + archives_yml = YAML.load_file('_data/commons.yml') rescue nil + archives_md = File.read('archives.md', encoding: 'UTF-8') rescue nil + + if archives_md + archives_md.scan(/-\s*title:\s*(.+?)\n\s*url:\s*(.+?)\n/).each do |title, url| + puts " #{title.strip} => #{url.strip}" + end + end + + puts "\nArchive directories:" + Dir.glob('assets/*').select { |f| File.directory?(f) && f.match?(/\d{4}/) }.each do |year_dir| + year = File.basename(year_dir) + Dir.glob("#{year_dir}/*").select { |f| File.directory?(f) }.each do |edition_dir| + edition = File.basename(edition_dir) + puts " #{year}/#{edition}/" + end + end +end + +# Helper method to fix URLs in HTML files +def fix_urls(archive_path, base_path) + html_files = Dir.glob("#{archive_path}/**/*.html") + css_files = Dir.glob("#{archive_path}/**/*.css") + js_files = Dir.glob("#{archive_path}/**/*.js") + + all_files = html_files + css_files + js_files + + all_files.each do |file| + content = File.read(file, encoding: 'UTF-8') + original_content = content.dup + + # Fix absolute asset paths to be relative to the archive location + # Pattern: href="/assets/..." or src="/assets/..." + # Replace with: href="assets/..." (relative) + + # For href attributes + content.gsub!(/href="\/assets\//, 'href="assets/') + content.gsub!(/href='\/assets\//, "href='assets/") + + # For src attributes + content.gsub!(/src="\/assets\//, 'src="assets/') + content.gsub!(/src='\/assets\//, "src='assets/") + + # Fix root-relative links to site root (keep as absolute for navigation) + # href="/" becomes href="/" (unchanged - points to current site) + # href="/archives" becomes href="/archives" (unchanged) + + # Fix url() references in CSS + content.gsub!(/url\("?\/(assets\/[^"\)]+)\)?/, 'url(\1)') + content.gsub!(/url\('?\/(assets\/[^'\)]+)\)?/, "url('\1')") + + # Write back if changed + if content != original_content + File.write(file, content) + puts " Fixed URLs in: #{file.sub(archive_path + '/', '')}" + end + end +end + +# Helper method to add archive entry to archives.md +def add_to_archives(year, edition) + archives_file = 'archives.md' + + unless File.exist?(archives_file) + puts " WARNING: #{archives_file} not found, skipping menu update" + return + end + + content = File.read(archives_file, encoding: 'UTF-8') + + # Check if already exists + archive_url = "/assets/#{year}/#{edition}/" + if content.include?(archive_url) + puts " Archive entry already exists in #{archives_file}" + return + end + + # Format edition name for display + display_name = edition == 'devfest' ? "DevFest #{year}" : "#{edition.capitalize} #{year}" + + # Find the archives section and add the new entry at the beginning + new_entry = " - title: #{display_name}\n url: #{archive_url}" + + # Insert after "archives:" line + if content =~ /(archives:\n)/ + content = content.sub($1, "#{$1}#{new_entry}\n") + File.write(archives_file, content) + puts " Added archive entry: #{display_name}" + else + puts " WARNING: Could not find 'archives:' section in #{archives_file}" + end +end + +desc "Show help for archive task" +task :archive_help do + puts <<-HELP +Archive Task - Usage Guide +========================== + +Archive current site (auto-detects year): + rake archive + +Archive with specific year and edition: + rake archive[2025,devfest] + rake archive[2024,devfestnoz] + rake archive[2023,special] + +List existing archives: + rake list_archives + +Examples: +--------- +# Archive 2025 DevFest + rake archive[2025,devfest] + +# Archive with current year + rake archive_current + +Archive Structure: +------------------ +The archive will be created at: assets/// + +This preserves the complete built site including: +- index.html (homepage) +- All CSS, JS, and images +- Speaker pages +- Agenda + +The archive is automatically added to the Archives page. + HELP +end diff --git a/_config.yml b/_config.yml index b1cd86e..8ec27a6 100644 --- a/_config.yml +++ b/_config.yml @@ -1,6 +1,6 @@ title: DevFest Perros-Guirec description: >- # this means to ignore newlines until "baseurl:" - DevFestNoz rassemble les développeu.se.r.s en soirée pour apprendre et partager ensemble lors de conférences et ateliers organisés par l'association Code d'Armor à Lannion et Perros-Guirec. + Le DevFest Perros-Guirec est une conférence à destination des développeu.se.r.s organisée par l'association Code d'Armor. baseurl: "" # the subpath of your site, e.g. /blog url: "" # the base hostname & protocol for your site, e.g. http://example.com @@ -12,24 +12,48 @@ plugins: # Exclude from processing. # The following items will not be processed, by default. -# Any item listed under the `exclude:` key here will be automatically added to -# the internal "default list". -# -# Excluded items can be processed by explicitly listing the directories or -# their entries' file path in the `include:` list. -# +# Any item listed under the `exclude:` key here will not be copied to _site. exclude: - - .sass-cache/ - - Gemfile - - .github/ - - README.md + - .sass-cache/ + - .jekyll-cache/ + - Gemfile + - Gemfile.lock + - .github/ + - README.md + - scripts/ + # Note: Archive directories (assets/2021/, assets/2022/, etc.) are included + # in the build so that the archives page links work correctly + # Exclude development/test files + - .playwright/ + - .playwright-mcp/ + - "*.log" + - node_modules/ + - vendor/ + - Dockerfile + - docker-compose.yml + - .claude/ + - .gitignore +# Include only current year assets for faster builds +# Note: Previous year assets can be served from external storage/CDN sass: - style: compressed # or expanded, depending on your preference + style: compressed # Minify CSS output asset_pipeline: bundle: true compress: true output_path: assets display_path: nil - gzip: false \ No newline at end of file + gzip: true # Enable gzip compression for assets + +# Compression settings for Jekyll +compress_html: + clippings: all + comments: [""] + endings: all + startings: [html, head, body] + +# Performance: Lazy loading settings +lazy_loading: + enabled: true + placeholder: data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3C/svg%3E diff --git a/_data/commons.yml b/_data/commons.yml index 64fc455..8236c88 100644 --- a/_data/commons.yml +++ b/_data/commons.yml @@ -1,13 +1,48 @@ -logo_url: "/assets/img/logo_dark.png" +logo_url: "/assets/img/logo_dark.webp" menu: + - title: "DevFestNoz 2026" + url: '/' + - title: "Programme" + url: '/#agenda' + tooltip: "Voir le programme" + - title: Boutique + target: '_blank' + url: 'https://devfest-perros-guirec.tpopsite.com/' + tooltip: "Accéder à la boutique" + - title: Sponsoring + url: '/sponsors' + tooltip: "Devenir sponsor" + - title: Archives + url: '/archives' + tooltip: "Accéder aux archives" - title: À propos - url: /a-propos - - title: DevFestNoz - url: '/assets/2024/devfestnoz/' - - title: DevFest 2023 - url: /assets/2023/ - - title: DevFest 2022 - url: /assets/2022/ - - title: DevFest 2021 - url: /assets/2021/ + url: './a-propos' + tooltip: "En savoir plus sur l'événement" + - title: "" + url: 'https://www.linkedin.com/company/code-d-armor/' + icon: 'fab fa-linkedin' + target: '_blank' + tooltip: "Suivre Code d'Armor sur LinkedIn" + +Newsletter: + link : https://codedarmor.us7.list-manage.com/subscribe?u=05474659d9a3ff4697f4fc41c&id=cc5063773c + linkLinkedIn: https://www.linkedin.com/company/code-d-armor/ +Sponsors: + logos_basic: + - name: Lannion Trégor Communauté + url: /assets/img/logos_sponsors/logo_ltc.webp + link: https://www.lannion-tregor.com/ + - name: Anticipa + url: /assets/img/logos_sponsors/logo_anticipa.webp + link: https://www.technopole-anticipa.com/ + - name: Ville de Perros-Guirec + url: /assets/img/logos_sponsors/logo_perros.webp + link: https://www.perros-guirec.com/ + - name: French Tech Brest Ouest + url: /assets/img/logos_sponsors/logo_ftbo.webp + link: https://www.lafrenchtech-brestplus.bzh/ + logos_advanced: + - name: Eco-compteur + url: /assets/img/logos_sponsors/logo_eco-compteur.webp + link: https://www.eco-compteur.com/ \ No newline at end of file diff --git a/_includes/agenda.html b/_includes/agenda.html new file mode 100644 index 0000000..9dfc91b --- /dev/null +++ b/_includes/agenda.html @@ -0,0 +1,90 @@ + +
+
+
+
+
+

{{ page.Agenda.title}}

+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+ {% assign counter=0 %} + {% for talk in page.Agenda.schedule %} + {% if talk.slot_type != "break" %} +
+
+
+
+

{{talk.slot_begin_time}}

+

{{ talk.title }}

+ +
+ {% for speaker in talk.speakers %} + {% assign speakerObj = page.Speakers.list | where: 'id', speaker.id | first %} + + {% endfor %} +
+
+

{{ talk.description }}

+ {% if talk.speakers and talk.speakers.size > 0 %} + {% assign first_speaker = talk.speakers | first %} + {% assign speaker_obj = page.Speakers.list | where: 'id', first_speaker.id | first %} + {% if speaker_obj.video_url %} +
+ +
+ {% endif %} + {% endif %} +
+
+ {% endif %} + {% assign counter = counter | plus: 1 %} + {% endfor %} +
+
+ +
+
+
+
+ \ No newline at end of file diff --git a/_includes/button.html b/_includes/button.html new file mode 100644 index 0000000..bda676d --- /dev/null +++ b/_includes/button.html @@ -0,0 +1,21 @@ +{% if include.button %} + {% assign button_type = 'border' %} + {% if include.button.isPrimary %} + {% assign button_type = 'common'%} + {% endif %} + {% unless include.button.isExternal %} + {% assign base_url = site.url | append: site.baseurl %} + {% else %} + {% assign base_url = '' %} + {% endunless %} + + {% if include.button.isContrasted %} + {% assign contrasted = 'contrasted' %} + {% else %} + {% assign contrasted = '' %} + {% endif %} + + {{ include.button.text }} +{% endif %} \ No newline at end of file diff --git a/_includes/call_for_proposal.html b/_includes/call_for_proposal.html new file mode 100644 index 0000000..8c6a71c --- /dev/null +++ b/_includes/call_for_proposal.html @@ -0,0 +1,27 @@ +
+ {% assign callForProposal = include.params %} + + {% if callForProposal %} +
+
+
+
+

{{ callForProposal.title }}

+
+
+
+
+
+
+ +

{{ callForProposal.cfp_description }} +

+ +

{{ callForProposal.cfp_button_text }}

+ +
+
+
+ {% endif %} +
\ No newline at end of file diff --git a/_includes/carrousel.html b/_includes/carrousel.html index 36ee320..dbf0cec 100644 --- a/_includes/carrousel.html +++ b/_includes/carrousel.html @@ -1,4 +1,5 @@ + diff --git a/_includes/footer.html b/_includes/footer.html index 232a79b..5ec15a5 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -3,9 +3,13 @@
- DevFestNoz logo + {% if page.footer_logo_url %} + DevFestNoz logo + {% else %} + DevFest logo + {% endif %}

- {{ page.Details.what.shortDescription }} + {{ site.description }}

@@ -16,7 +20,7 @@
- - + @@ -54,19 +58,28 @@
FOLLOW US ON
- - - - - - - - - - - - + + + + + + + + + + + + + + +{% if page.Carrousel_Slides and page.Carrousel_Slides.size > 0 %} + +{% endif %} + + + + + - \ No newline at end of file + diff --git a/_includes/gallery.html b/_includes/gallery.html index 6adcabd..9072f6e 100644 --- a/_includes/gallery.html +++ b/_includes/gallery.html @@ -1,22 +1,34 @@ - + - \ No newline at end of file + diff --git a/_includes/header.html b/_includes/header.html index bd28818..1c0f8a1 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -5,44 +5,114 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + {{ page.title}} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + @@ -52,4 +122,4 @@
{% include menu.html %}
- \ No newline at end of file + diff --git a/_includes/menu.html b/_includes/menu.html index 15c1327..e0dc141 100644 --- a/_includes/menu.html +++ b/_includes/menu.html @@ -5,7 +5,11 @@
- - -
-
-
+

{{ page.description }}

- - - -
-
-
-
-

{{ page.newsletter-sub.title }}

-

{{ page.newsletter-sub.description }}

-

{{ - page.newsletter-sub.cta}}

+
+
+
+ + + {% if page.Newsletter != null %} + {% include newsletter.html params=page.Newsletter %} + + {% endif %} diff --git a/_layouts/archives.html b/_layouts/archives.html new file mode 100755 index 0000000..3a33832 --- /dev/null +++ b/_layouts/archives.html @@ -0,0 +1,69 @@ +--- + +--- + +{% include header.html %} +
+
+ +
+
+
+
+
+
+

{{ page.title}}

+
+
+
+
+
+

{{ page.description }}

+
+
+ +
+
+
+

{{ page.archives_title }}

+ {% for archive in page.archives %} +

{{ archive.title }} +

+ {% endfor %} +
+
+
+ + +
+
+
+ +
+
+ +{% include footer.html %} \ No newline at end of file diff --git a/_layouts/default backup.html b/_layouts/default backup.html deleted file mode 100755 index 7bddb24..0000000 --- a/_layouts/default backup.html +++ /dev/null @@ -1,1561 +0,0 @@ ---- - ---- - - - - - - - - {{ Site.title}} - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - - -
-
-
-
-
-

Event Will Start In

-
-
-
-
-
-
- Add to My Calender -
-
-
-
- - - -
-
-
-
-
-

Why You Choose Us?

-

Global Grand Event on Digital Design

-
-
-
-
- -
-
-
- -
-
-

Get Inspired

-

Lorem ipsum dolor sit amet, consectetuer commodo ligula eget dolor.

-
-
-
- -
-
-
- -
-
-

Meet New Faces

-

Lorem ipsum dolor sit amet, consectetuer commodo ligula eget dolor.

-
-
-
- -
-
-
- -
-
-

Fresh Tech Insights

-

Lorem ipsum dolor sit amet, consectetuer commodo ligula eget dolor.

-
-
-
- -
-
-
- -
-
-

Networking Session

-

Lorem ipsum dolor sit amet, consectetuer commodo ligula eget dolor.

-
-
-
- -
-
-
- -
-
-

Global Event

-

Lorem ipsum dolor sit amet, consectetuer commodo ligula eget dolor.

-
-
-
- -
-
-
- -
-
-

Free Swags

-

Lorem ipsum dolor sit amet, consectetuer commodo ligula eget dolor.

-
-
-
-
-
-
- - - - -
-
-
-
-
-

About This Events

-

Global Grand Event on Digital Design

-
-
-
-
-
-
- -
-

Wanna Know Our Mission?

-

Lorem ipsum dolor sit amet, consectetuer commodo ligula eget dolor.

- Read More -
-
-
-
-
- -
-

What you will learn?

-

Lorem ipsum dolor sit amet, consectetuer commodo ligula eget dolor.

- Read More -
-
-
-
-
- -
-

What are the benifits?

-

Lorem ipsum dolor sit amet, consectetuer commodo ligula eget dolor.

- Read More -
-
-
-
-
-
- - - -
-
-
- -
-
-
-

Wst. Conference Center

- San Francisco, CA -
-
- -
-
-
-

February 14 - 19, 2018

- 09:00 AM – 05:00 PM -
-
- -
-
-
-

343 Available Seats

- Hurryup! few tickets are left -
-
- -
-
-
-

Free Lunch & Snacks

- Don’t miss it -
-
-
-
-
- - - -
-
-
-
-
-

Event Schedules

-

Lorem ipsum dolor sit amet, consectetur adipiscing
elit, sed do eiusmod tempor

-
-
-
-
- -
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
- -
-
-
-

Consectetur adipisicing elit. Quod distinctio impedit sint accusantium ducimus lites consequuntur innobisl dolores saepe.Proin sit amet turpis lobortis.

-
- Location: Hall 1 , Building A, Golden Street, Southafrica -
-
-
-
-
-
-
-
-
-
-
- - - -
-
-
-
-
-

Who's Speaking?

-

Global Grand Event on Digital Design

-
-
-
-
-
- -
-
- -
-
- -
-
-
-
-

JONATHON DOE

-

Product Designer, Tesla

-
-
- -
-
- -
-
- -
-
- -
-
-
-
-

Patric Green

-

Front-end Developer, Dropbox

-
-
- -
- -
- -
-
- -
-
- -
-
-
-
-

Paul Kowalsy

-

Lead Designer, TNW

-
-
- -
- -
- -
-
- -
-
- -
-
-
-
-

Jhon Doe

-

Back-end Developer, ASUS

-
-
- -
-
- -
-
- -
-
- -
-
-
-
-

Daryl Dixon

-

Full-stack Developer, Google

-
-
- -
-
- -
-
- -
-
- -
-
-
-
-

Chris Adams

-

UI Designer, Apple

-
-
- -
-
- All Speakers -
-
- - - - - - - -
-
-
-
-
-

Ask Question?

-

Global Grand Event on Digital Design

-
-
-
-
-
-
-
-
-
- How to make a new event? -
-
-
-
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. -
-
-
-
-
- -
-
-
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. -
-
-
-
-
- -
-
-
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. -
-
-
-
-
- -
-
-
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. -
-
-
-
-
-
-
-
-
-
- How to make a new event? -
-
-
-
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. -
-
-
-
-
- -
-
-
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. -
-
-
-
-
- -
-
-
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. -
-
-
-
-
- -
-
-
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. -
-
-
-
-
-
-
-
- - - -
-
-
-
-
-

Sponsores

-

Global Grand Event on Digital Design

-
-
-
-
-
- -
-
- -
-
- -
-
- -
- -
-
-
- - - -
-
-
-
-
-

Our Pricing

-

Global Grand Event on Digital Design

-
-
-
-
-
-
-
- -
-
-
Basic Pass
-
-
-

$29

-

452 Tickets Available

-
-
-
    -
  • Entrance
  • -
  • Coffee Break
  • -
  • Lunch on all days
  • -
  • Access to all areas
  • -
  • Certificate
  • -
  • Workshop
  • -
-
- Buy Ticket -
-
-
-
-
- -
-
-
Standard Pass
-
-
-

$40

-

452 Tickets Available

-
-
-
    -
  • Entrance
  • -
  • Coffee Break
  • -
  • Lunch on all days
  • -
  • Access to all areas
  • -
  • Certificate
  • -
  • Workshop
  • -
-
- Buy Ticket -
-
-
-
-
- -
-
-
Premium Pass
-
-
-

$68

-

452 Tickets Available

-
-
-
    -
  • Entrance
  • -
  • Coffee Break
  • -
  • Lunch on all days
  • -
  • Access to all areas
  • -
  • Certificate
  • -
  • Workshop
  • -
-
- Buy Ticket -
-
-
-
-
- - - -
-
-
-
-
-

Event Guideline

-

Global Grand Event on Digital Design

-
-
-
-
- -
-
-
-

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries. -

-

Check List

-
    -
  • Lorem Ipsum is simply dummy
  • -
  • Ipsum passages, and more recently
  • -
  • PageMaker including versions
  • -
  • Lorem Ipsum is simply dummy
  • -
-
-
-
-
- - - -
-
-
-
-
-

Our Latest News & Articles

-

Global Grand Event on Digital Design

-
-
-
-
-
- - - -
- -
-
-
-
-
- - - -
- -
-
-
-
-
- - - -
- -
-
- -
-
-
- - - -
-
-
-
- -
-
-
-
- - - -
-
-
-
-
-
-
-
-
- - - -
-
-
-
-
-

Drop A Message

-

Global Grand Event on Digital Design

-
-
-
-
-
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
- - -
-
-
-
-
-
-
-
-
-
- - - - - - - - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - diff --git a/_layouts/default copy.html b/_layouts/default copy.html deleted file mode 100755 index e73b83b..0000000 --- a/_layouts/default copy.html +++ /dev/null @@ -1,375 +0,0 @@ ---- - ---- - - - - - - - - - - - - - - - - - - - - - {{ page.title}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - -
-
-
-
-
-

{{ page.Details.what.title}}

-
-
-
-
-
- -
-
-

{{ page.Details.what.description }}

-
-
- -
-
-
-
-
-
-
-
-
-

Conférencier

-
-
-
- {% for speaker in page.Speakers %} -
-
- -
-
- {{ speaker.name}} -
-
-

{{ speaker.name }}

-

{{ speaker.bio }}

-
-
- -
-
- {% endfor %} -
-
- - - -
-
-
- -
-
-
-

{{ page.Details.where.venue }}

- {{ page.Details.where.address }} - {{ page.Details.where.city }} -
-
- -
-
-
-

{{ page.Details.when.date }}

- {{ page.Details.when.time }} -
-
- -
-
-
-

{{ page.Details.who.attendees }}

- {{ page.Details.who.limit }} -
-
- -
-
-
-

{{ page.Details.cocktail.whatOffered}}

- {{ page.Details.cocktail.callToAction}} -
-
-
-
-
- -
-
-
-
-
-

Inscriptions

-
-
-
-
-
- {% assign slide = page.Carrousel_Slides[0]%} - {% if slide.button1 %} - {% assign button_type = 'border' %} - {% if slide.button1.isPrimary %} - {% assign button_type = 'common'%} - {% endif %} -

{{ slide.button1.text }}

- {% endif %} - -
-
-
-
- -
-
-
-
- DevFestNoz logo -

- {{ page.Details.what.shortDescription }} -

-
-
- -
-
- -
-
- - -
-
-
-
- - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_layouts/default.html b/_layouts/default.html deleted file mode 100755 index e60b35d..0000000 --- a/_layouts/default.html +++ /dev/null @@ -1,130 +0,0 @@ ---- - ---- - - {% include header.html %} - {% include carrousel.html %} - - -
-
-
-
-
-

{{ page.Details.what.title}}

-
-
-
-
-
- -
-
-

{{ page.Details.what.description }}

-
-
- -
-
-
-
-
-
-
-
-
-

Conférencier

-
-
-
- {% for speaker in page.Speakers %} -
-
- -
-
- {{ speaker.name}} -
-
-

{{ speaker.name }}

-

{{ speaker.bio }}

-
-
- -
-
- {% endfor %} -
-
- - -{% include gallery.html %} - - -
-
-
- -
-
-
-

{{ page.Details.where.venue }}

- {{ page.Details.where.address }} - {{ page.Details.where.city }} -
-
- -
-
-
-

{{ page.Details.when.date }}

- {{ page.Details.when.time }} -
-
- -
-
-
-

{{ page.Details.who.attendees }}

- {{ page.Details.who.limit }} -
-
- -
-
-
-

{{ page.Details.cocktail.whatOffered}}

- {{ page.Details.cocktail.callToAction}} -
-
-
-
-
- -
-
-
-
-
-

Inscriptions

-
-
-
-
-
- {% assign slide = page.Carrousel_Slides[0]%} - {% if slide.button1 %} - {% assign button_type = 'border' %} - {% if slide.button1.isPrimary %} - {% assign button_type = 'common'%} - {% endif %} -

{{ slide.button1.text }}

- {% endif %} - -
-
-
-
- -{% include footer.html %} \ No newline at end of file diff --git a/_layouts/devfestnoz_conference.html b/_layouts/devfestnoz_conference.html new file mode 100755 index 0000000..16c1452 --- /dev/null +++ b/_layouts/devfestnoz_conference.html @@ -0,0 +1,141 @@ +--- + +--- + +{% include header.html %} +{% include carrousel.html %} + + +
+
+
+
+
+

{{ page.Details.what.title}}

+
+
+
+
+
+ +
+
+

{{ page.Details.what.description }}

+ +
+ +
+
+
+
+ + + + + +{% if page.CallForProposal != null %} +{% include call_for_proposal.html params=page.CallForProposal %} +{% endif %} + + + + +{% if page.Register != null %} +{% include register.html params=page.Register %} +{% endif %} + + + + + + +{% if page.Agenda != null %} +{% include agenda.html %} +{% endif %} + + + + +{% if page.Speakers != null %} +{% include speakers.html params=page.Speakers %} +{% endif %} + + + + +{% if page.Sponsoring != null %} +{% include sponsors.html params=page.Sponsoring %} +{% endif %} + + + +{% if page.Newsletter != null %} +{% include newsletter.html params=page.Newsletter %} + +{% endif %} + + +{% if page.Shop != null %} +{% include shop.html params=page.Shop %} +{% endif %} + + + + +{% if page.Gallery != null %} +{% include gallery.html params=page.Gallery %} + +{% endif %} + + + + + +
+
+
+ +
+
+
+

{{ page.Details.where.venue }}

+ {{ page.Details.where.address }} + {{ page.Details.where.city }} +
+
+ +
+
+
+

{{ page.Details.when.date }}

+ {{ page.Details.when.time }} +
+
+ +
+
+
+

{{ page.Details.who.attendees }}

+ {{ page.Details.who.limit }} +
+
+ +
+
+
+

{{ page.Details.cocktail.whatOffered}}

+ {{ page.Details.cocktail.callToAction}} +
+
+
+
+
+ + +{% if page.LastYearMovie != null %} +{% include video.html params=page.LastYearMovie %} +{% endif %} + + + +{% include footer.html %} \ No newline at end of file diff --git a/_layouts/home_conference.html b/_layouts/home_conference.html new file mode 100755 index 0000000..ade7577 --- /dev/null +++ b/_layouts/home_conference.html @@ -0,0 +1,157 @@ +--- + +--- + +{% include header.html %} +{% include carrousel.html %} +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+

{{ page.Details.what.title}}

+
+
+
+
+
+ +
+
+

{{ page.Details.what.description }}

+ +
+ +
+
+
+
+ + + + + +{% if page.CallForProposal != null %} +{% include call_for_proposal.html params=page.CallForProposal %} +{% endif %} + + + + +{% if page.Register != null %} +{% include register.html params=page.Register %} +{% endif %} + + + + + + +{% if page.Agenda != null %} +{% include agenda.html %} +{% endif %} + + + + +{% if page.Speakers != null %} +{% include speakers.html params=page.Speakers %} +{% endif %} + + + + +{% if page.Sponsoring != null %} +{% include sponsors.html params=page.Sponsoring %} +{% endif %} + + + +{% if page.Newsletter != null %} +{% include newsletter.html params=page.Newsletter %} + +{% endif %} + + +{% if page.Shop != null %} +{% include shop.html params=page.Shop %} +{% endif %} + + + + +{% if page.Gallery != null %} +{% include gallery.html params=page.Gallery %} + +{% endif %} + + + + + +
+
+
+ +
+
+
+

{{ page.Details.where.venue }}

+ {{ page.Details.where.address }} + {{ page.Details.where.city }} +
+
+ +
+
+
+

{{ page.Details.when.date }}

+ {{ page.Details.when.time }} +
+
+ +
+
+
+

{{ page.Details.who.attendees }}

+ {{ page.Details.who.limit }} +
+
+ +
+
+
+

{{ page.Details.cocktail.whatOffered}}

+ {{ page.Details.cocktail.callToAction}} +
+
+
+
+
+ + +{% if page.LastYearMovie != null %} +{% include video.html params=page.LastYearMovie %} +{% endif %} + + + +{% include footer.html %} \ No newline at end of file diff --git a/_layouts/sponsors.html b/_layouts/sponsors.html new file mode 100755 index 0000000..bd5a266 --- /dev/null +++ b/_layouts/sponsors.html @@ -0,0 +1,52 @@ +--- +--- + +{% include header.html %} + +
+
+
+
+ + + + + +
+
+
+
+

{{ page.contact-us.title }}

+

{{ page.contact-us.description }}

+
+
+
+
+ +
+
+
+
+{% include footer.html %} \ No newline at end of file diff --git a/_sass/_about.scss b/_sass/_about.scss index 7ceb86f..f7ea60b 100644 --- a/_sass/_about.scss +++ b/_sass/_about.scss @@ -1,3 +1,6 @@ + +@use 'presets' as *; + //About .about-item{ padding: 10px; @@ -102,7 +105,7 @@ /* Sponsors Area */ #sponsors{ - background: #f3f4f3; + /*background: #f3f4f3;*/ .spnsors-logo{ text-align: center; border-radius: 4px; diff --git a/_sass/_blog.scss b/_sass/_blog.scss index 9f8ff73..c4685ff 100644 --- a/_sass/_blog.scss +++ b/_sass/_blog.scss @@ -1,4 +1,6 @@ - .blog-item{ + +@use 'presets' as *; +.blog-item{ background-color: #fff; border-radius: 4px; margin-bottom: 40px; diff --git a/_sass/_carousel.scss b/_sass/_carousel.scss index 8dae0bd..a73c2fc 100644 --- a/_sass/_carousel.scss +++ b/_sass/_carousel.scss @@ -1,114 +1,147 @@ + +@use 'presets' as *; +@use 'global' as *; + #main-slide { - .carousel-control{ + .carousel-control { display: none; transition: $transition; } - .carousel-indicators{cursor: pointer; bottom: 90px;} + + .carousel-indicators { + cursor: pointer; + bottom: 90px; + } + &:hover { - .carousel-control{ + .carousel-control { display: block; transition: $transition; -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-name: fadeIn; - animation-name: fadeIn; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-name: fadeIn; + animation-name: fadeIn; } } - .carousel-item img { - position: relative; - width: 100%; + + .carousel-item img.carousel-item-bg { + position: relative; + width: 100%; } + .carousel-inner .carousel-item::after { - bottom: 0; - content: ""; - left: 0; - position: absolute; - right: 0; - top: 0; + bottom: 0; + content: ""; + left: 0; + position: absolute; + right: 0; + top: 0; } - .carousel-item .carousel-caption { - opacity: 0; - transition: opacity 100ms ease 0s; - z-index: 0; - .heading{ - font-size: 48px; - font-weight: 700; - color: #fff; - text-transform: uppercase; - letter-spacing: 0.1rem; - margin-top: 30px; - } - p{ - font-size: 20px; + + .carousel-item { + + overflow: hidden; + max-height: 100vh; + + .carousel-caption { + opacity: 0; + transition: opacity 100ms ease 0s; + z-index: 0; + + img.logo { + max-width: 300px; + } + + .heading { + font-size: 48px; + font-weight: 700; + color: #fff; + text-transform: uppercase; + letter-spacing: 0.1rem; + margin-top: 30px; + } + + p { + font-size: 20px; + } } } + .carousel-item.active .carousel-caption { - opacity: 1; - transition: opacity 100ms ease 0s; - z-index: 1; + opacity: 1; + transition: opacity 100ms ease 0s; + z-index: 1; } - .carousel-caption{ - color: #fff; - position: absolute; - top: 35%; - .btn{ - margin: 25px 25px 0px 0px; - } + + .carousel-caption { + color: #fff; + position: absolute; + top: 20%; + + .btn { + margin: 25px 25px 0px 0px; + } } } + #main-slide .carousel-control-next, -#main-slide .carousel-control-prev{ +#main-slide .carousel-control-prev { opacity: 1; box-shadow: none; } #main-slide .carousel-control-prev span { - padding: 15px; + padding: 15px; } #main-slide .carousel-control-next span { - padding: 15px; + padding: 15px; } + #main-slide .carousel-control { - top: 45%; + top: 45%; } + #main-slide .carousel-control .lni-chevron-left, -#main-slide .carousel-control .lni-chevron-right{ - position: absolute; - z-index: 5; +#main-slide .carousel-control .lni-chevron-right { + position: absolute; + z-index: 5; } -#main-slide .carousel-control .lni-chevron-left{ - left: 15px; + +#main-slide .carousel-control .lni-chevron-left { + left: 15px; } -#main-slide .carousel-control .lni-chevron-right{ - right: 15px; +#main-slide .carousel-control .lni-chevron-right { + right: 15px; } -.carousel-indicators li{ + +.carousel-indicators li { width: 12px; height: 12px; border-radius: 50%; } -#main-slide .carousel-control i{ - line-height: 40px; - font-size: 18px; - width: 45px; - border: 2px solid #fff; - height: 45px; - display: block; - border-radius: 2px; - background: transparent; - color: #fff; - -webkit-transition: all 500ms ease; - transition: all 500ms ease; - @include icon-shadow; + +#main-slide .carousel-control i { + line-height: 40px; + font-size: 18px; + width: 45px; + border: 2px solid #fff; + height: 45px; + display: block; + border-radius: 2px; + background: transparent; + color: #fff; + -webkit-transition: all 500ms ease; + transition: all 500ms ease; + @include icon-shadow; } -#main-slide .carousel-control i:hover{ - background: rgba(255, 255, 255, 0.2); - color: #fff; - border-color: #fff; +#main-slide .carousel-control i:hover { + background: rgba(255, 255, 255, 0.2); + color: #fff; + border-color: #fff; } \ No newline at end of file diff --git a/_sass/_contact.scss b/_sass/_contact.scss index 3702d51..6c6e998 100644 --- a/_sass/_contact.scss +++ b/_sass/_contact.scss @@ -1,3 +1,6 @@ + +@use 'presets' as *; + /* Conact Home Page Section */ .contact{ background: #111111; diff --git a/_sass/_countdown.scss b/_sass/_countdown.scss index 502f1c5..50df405 100644 --- a/_sass/_countdown.scss +++ b/_sass/_countdown.scss @@ -1,3 +1,6 @@ + +@use 'presets' as *; + /* ========================================================================== Countdown Style Start ========================================================================== */ diff --git a/_sass/_footer.scss b/_sass/_footer.scss index 3a32a5b..1ac7b34 100644 --- a/_sass/_footer.scss +++ b/_sass/_footer.scss @@ -1,3 +1,7 @@ + +@use 'presets' as *; +@use 'global' as *; + /* Footer Area Start */ .footer-area{ background: #222222; diff --git a/_sass/_global.scss b/_sass/_global.scss index 728688a..88472c8 100644 --- a/_sass/_global.scss +++ b/_sass/_global.scss @@ -1,106 +1,138 @@ +@use "sass:color"; +@use 'presets' as *; + // Font Family @import url('https://fonts.googleapis.com/css?family=Lato:400|Josefin+Sans:700'); -html{ +html { overflow-x: hidden; } + body { - background: #fff; - font-size: 15px; - font-weight: 400; - font-family: 'Lato', sans-serif; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-font-smoothing: subpixel-antialiased; - color: #212121; - line-height: 25px; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - overflow-x: hidden; -} -h1, h2, h3, h4{ + background: #fff; + font-size: 15px; + font-weight: 400; + font-family: 'Lato', sans-serif; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-font-smoothing: subpixel-antialiased; + color: #212121; + line-height: 25px; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + overflow-x: hidden; +} + +h1, +h2, +h3, +h4 { font-size: 36px; font-weight: 700; font-family: 'Josefin Sans', sans-serif; } -a{ - -webkit-transition: all 0.2s linear; - -moz-transition: all 0.2s linear; - -o-transition: all 0.2s linear; - transition: all 0.2s linear; - color: $preset; - &:hover{text-decoration: dashed; color: $preset;} - a:focus{ - outline: none; + +a { + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; color: $preset; - } + + &:hover { + text-decoration: dashed; + color: $preset; + } + + a:focus { + outline: none; + color: $preset; + } } -p{ + +p { font-weight: 400; font-family: 'Lato', sans-serif; margin: 0px; + margin-top: 15px; font-size: 15px; } -ul,ol{ + +ul, +ol { list-style: outside none none; margin: 0; padding: 0; - li{ + + li { list-style: none; } + } +section li { + list-style: disc outside; + margin-left: 20px; + margin-bottom: 10px; + } + + .btn-primary { - + color: #fff; background-color: $primary; border-color: $primary; } -.btn-primary:hover{ + +.btn-primary:hover { background-color: $primary-light; - + border-color: $primary; } .hero-heading { - font-size: 40px; - font-weight: 700; - color: #fff; - text-transform: capitalize; - line-height: 70px; - letter-spacing: 0.1rem; + font-size: 40px; + font-weight: 700; + color: #fff; + text-transform: capitalize; + line-height: 70px; + letter-spacing: 0.1rem; } + .hero-sub-heading { - font-size: 20px; - font-weight: 400; - color: darken(#fff, 10%); - line-height: 45px; - letter-spacing: 0.1rem; + font-size: 20px; + font-weight: 400; + color: color.adjust(#fff, $lightness: -10%); + line-height: 45px; + letter-spacing: 0.1rem; } + .section-titile-bg { - display: inline; - font-size: 115px; - font-weight: 700; - height: 100%; - left: -173px; - opacity: 0.1; - position: absolute; - top: -14px; - width: 100%; - text-align: center; + display: inline; + font-size: 115px; + font-weight: 700; + height: 100%; + left: -173px; + opacity: 0.1; + position: absolute; + top: -14px; + width: 100%; + text-align: center; } -.section-title-header{ - p{ + +.section-title-header { + p { text: center; font-weight: 400; line-height: 26px; padding-bottom: 36px; } } -.section-title{ + +.section-title { font-size: 36px; color: #212121; line-height: 52px; @@ -109,7 +141,8 @@ ul,ol{ text-align: center; position: relative; margin-bottom: 15px; - &:before{ + + &:before { position: absolute; content: ''; left: 15px; @@ -119,7 +152,8 @@ ul,ol{ background-color: $preset; } } -.section-title:after{ + +.section-title:after { position: absolute; content: ''; left: 0px; @@ -128,28 +162,34 @@ ul,ol{ height: 1px; background-color: $preset; } -.section-title:before,.section-title:after { - left: 50%; - margin-left: -45px; + +.section-title:before, +.section-title:after { + left: 50%; + margin-left: -45px; } -.section-title:after{ + +.section-title:after { margin-left: -30px; } -.section-subcontent{ + +.section-subcontent { font-size: 16px; text: center; font-weight: 400; line-height: 26px; padding-bottom: 36px; } -.section-sub{ + +.section-sub { text-transform: uppercase; font-size: 24px; - line-height: 52px; + line-height: 52px; padding-bottom: 15px; margin-bottom: 30px; position: relative; - &:before{ + + &:before { position: absolute; content: ''; height: 1px; @@ -161,54 +201,66 @@ ul,ol{ background-color: $preset; } } + .subtitle { - font-size: 15px; + font-size: 15px; margin-top: 20px; font-weight: 500; - margin-bottom:10px; + margin-bottom: 10px; } + .inner-title { - font-size: 24px; - font-weight: 700; - text-tranform: capitalize; + font-size: 24px; + font-weight: 700; + text-tranform: capitalize; } + .page-tagline { font-size: 24px; font-weight: 400; color: #ddd; } + .page-title { font-size: 62px; font-weight: 700; color: #fff; } + $transition: all 0.3s ease-in-out; + @mixin pricing-box-shadow { - -webkit-box-shadow: 0px 2px 10px 2px rgba(221,221,221,0.73); - -moz-box-shadow: 0px 2px 10px 2px rgba(221,221,221,0.73); - box-shadow: 0px 2px 10px 2px rgba(221,221,221,0.73); + -webkit-box-shadow: 0px 2px 10px 2px rgba(221, 221, 221, 0.73); + -moz-box-shadow: 0px 2px 10px 2px rgba(221, 221, 221, 0.73); + box-shadow: 0px 2px 10px 2px rgba(221, 221, 221, 0.73); } + @mixin icon-shadow { - box-shadow: 0 0 4px rgba(0, 0, 0, 0.14), 0 4px 8px rgba(0, 0, 0, 0.28) + box-shadow: 0 0 4px rgba(0, 0, 0, 0.14), 0 4px 8px rgba(0, 0, 0, 0.28) } + @mixin team-box-shadow { - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.26); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.26); } + @mixin team-box-shadow-hover { - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.46); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.46); } + @mixin blog-box-shadow { - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.26); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.26); } + @mixin button-shadow { box-shadow: 0 2px 2.7px 0.1px rgba(0, 0, 0, 0.24) !important; } + @mixin button-shadow-hover { - box-shadow: 0 4px 4.7px .3px rgba(0,0,0,.24) !important; + box-shadow: 0 4px 4.7px .3px rgba(0, 0, 0, .24) !important; } //Bootstrap Button Core -.btn{ +.btn { font-size: 14px; padding: 12px 20px; border-radius: 4px; @@ -221,90 +273,121 @@ $transition: all 0.3s ease-in-out; -o-transition: all 0.2s linear; transition: all 0.2s linear; display: inline-block; - i{ + + i { margin-right: 5px; } } + .btn:focus, -.btn:active{ +.btn:active { box-shadow: none; outline: none; color: #fff; } -.btn-common{ + + +.btn-common { background-color: $preset; - &:hover{ + &:hover { color: $preset; background: #fff; } } -.btn-border{ + +.btn-border { color: #fff; background-color: transparent; border: 1px solid #fff; - &:hover{ + + &:hover { color: #fff; background-color: rgba(255, 255, 255, 0.2); } } -.btn-lg{ + +.contrasted.btn-border { + border-color: $primary; + color: $primary; + background-color: #fff; + + &:hover { + color: #fff; + background-color: $primary; + border-color: $primary; + } +} + +.btn-lg { padding: 12px 34px; text-transform: uppercase; font-size: 14px; } -.btn-rm{ + +.btn-rm { padding: 7px 10px; text-transform: capitalize; } -button:focus{ - outline: none!important; + +button:focus { + outline: none !important; } -.icon-close,.icon-check{ + +.icon-close, +.icon-check { color: $preset; } -.bg-drack{ + +.bg-drack { background: #f1f1f1; } -.bg-white{ + +.bg-white { background: #fff; } -.mb-30{ + +.mb-30 { margin-bottom: 30px; } -.mt-30{ + +.mt-30 { margin-top: 30px; } + /* ScrollToTop */ -a.back-to-top{ +a.back-to-top { display: none; position: fixed; bottom: 18px; right: 15px; text-decoration: none; + i { - display: block; - font-size: 22px; - width: 40px; - height: 40px; - line-height: 40px; - color: #fff; + display: block; + font-size: 22px; + width: 40px; + height: 40px; + line-height: 40px; + color: #fff; background: $preset; - border-radius: 0px; - text-align: center; - transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -webkit-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - @include icon-shadow; - } - &:hover , &:focus { - text-decoration: none; - } + border-radius: 0px; + text-align: center; + transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + @include icon-shadow; + } + + &:hover, + &:focus { + text-decoration: none; + } } // Preloader Styles -#preloader{ +#preloader { position: fixed; background: #fff; top: 0; @@ -313,6 +396,7 @@ a.back-to-top{ height: 100%; z-index: 9999999999; } + .sk-circle { margin: 0px auto; width: 40px; @@ -320,6 +404,7 @@ a.back-to-top{ top: 45%; position: relative; } + .sk-circle .sk-child { width: 100%; height: 100%; @@ -327,6 +412,7 @@ a.back-to-top{ left: 0; top: 0; } + .sk-circle .sk-child:before { content: ''; display: block; @@ -336,131 +422,190 @@ a.back-to-top{ background-color: $preset; border-radius: 100%; -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out both; - animation: sk-circleBounceDelay 1.2s infinite ease-in-out both; + animation: sk-circleBounceDelay 1.2s infinite ease-in-out both; } + .sk-circle .sk-circle2 { -webkit-transform: rotate(30deg); - -ms-transform: rotate(30deg); - transform: rotate(30deg); } + -ms-transform: rotate(30deg); + transform: rotate(30deg); +} + .sk-circle .sk-circle3 { -webkit-transform: rotate(60deg); - -ms-transform: rotate(60deg); - transform: rotate(60deg); } + -ms-transform: rotate(60deg); + transform: rotate(60deg); +} + .sk-circle .sk-circle4 { -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); } + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} + .sk-circle .sk-circle5 { -webkit-transform: rotate(120deg); - -ms-transform: rotate(120deg); - transform: rotate(120deg); } + -ms-transform: rotate(120deg); + transform: rotate(120deg); +} + .sk-circle .sk-circle6 { -webkit-transform: rotate(150deg); - -ms-transform: rotate(150deg); - transform: rotate(150deg); } + -ms-transform: rotate(150deg); + transform: rotate(150deg); +} + .sk-circle .sk-circle7 { -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); } + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} + .sk-circle .sk-circle8 { -webkit-transform: rotate(210deg); - -ms-transform: rotate(210deg); - transform: rotate(210deg); } + -ms-transform: rotate(210deg); + transform: rotate(210deg); +} + .sk-circle .sk-circle9 { -webkit-transform: rotate(240deg); - -ms-transform: rotate(240deg); - transform: rotate(240deg); } + -ms-transform: rotate(240deg); + transform: rotate(240deg); +} + .sk-circle .sk-circle10 { -webkit-transform: rotate(270deg); - -ms-transform: rotate(270deg); - transform: rotate(270deg); } + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} + .sk-circle .sk-circle11 { -webkit-transform: rotate(300deg); - -ms-transform: rotate(300deg); - transform: rotate(300deg); } + -ms-transform: rotate(300deg); + transform: rotate(300deg); +} + .sk-circle .sk-circle12 { -webkit-transform: rotate(330deg); - -ms-transform: rotate(330deg); - transform: rotate(330deg); } + -ms-transform: rotate(330deg); + transform: rotate(330deg); +} + .sk-circle .sk-circle2:before { -webkit-animation-delay: -1.1s; - animation-delay: -1.1s; } + animation-delay: -1.1s; +} + .sk-circle .sk-circle3:before { -webkit-animation-delay: -1s; - animation-delay: -1s; } + animation-delay: -1s; +} + .sk-circle .sk-circle4:before { -webkit-animation-delay: -0.9s; - animation-delay: -0.9s; } + animation-delay: -0.9s; +} + .sk-circle .sk-circle5:before { -webkit-animation-delay: -0.8s; - animation-delay: -0.8s; } + animation-delay: -0.8s; +} + .sk-circle .sk-circle6:before { -webkit-animation-delay: -0.7s; - animation-delay: -0.7s; } + animation-delay: -0.7s; +} + .sk-circle .sk-circle7:before { -webkit-animation-delay: -0.6s; - animation-delay: -0.6s; } + animation-delay: -0.6s; +} + .sk-circle .sk-circle8:before { -webkit-animation-delay: -0.5s; - animation-delay: -0.5s; } + animation-delay: -0.5s; +} + .sk-circle .sk-circle9:before { -webkit-animation-delay: -0.4s; - animation-delay: -0.4s; } + animation-delay: -0.4s; +} + .sk-circle .sk-circle10:before { -webkit-animation-delay: -0.3s; - animation-delay: -0.3s; } + animation-delay: -0.3s; +} + .sk-circle .sk-circle11:before { -webkit-animation-delay: -0.2s; - animation-delay: -0.2s; } + animation-delay: -0.2s; +} + .sk-circle .sk-circle12:before { -webkit-animation-delay: -0.1s; - animation-delay: -0.1s; } + animation-delay: -0.1s; +} @-webkit-keyframes sk-circleBounceDelay { - 0%, 80%, 100% { + + 0%, + 80%, + 100% { -webkit-transform: scale(0); - transform: scale(0); - } 40% { + transform: scale(0); + } + + 40% { -webkit-transform: scale(1); - transform: scale(1); + transform: scale(1); } } @keyframes sk-circleBounceDelay { - 0%, 80%, 100% { + + 0%, + 80%, + 100% { -webkit-transform: scale(0); - transform: scale(0); - } 40% { + transform: scale(0); + } + + 40% { -webkit-transform: scale(1); - transform: scale(1); + transform: scale(1); } } //Helper Classes .section-padding { - padding: 60px 0; + padding: 30px 0; } + .no-padding { - padding: 0 !important; + padding: 0 !important; } + .padding-left-none { - padding-left: 0; + padding-left: 0; } + .padding-right-none { - padding-right: 0; + padding-right: 0; } // Page Banner Area -#page-banner-area{ +#page-banner-area { background: url(../img/background/banner.jpg) no-repeat; background-position: 50% 50%; background-size: cover; } -.page-banner{ + +.page-banner { position: relative; min-height: 250px; color: #fff; - &:before{ + + &:before { content: ''; position: absolute; top: 0; @@ -469,13 +614,15 @@ a.back-to-top{ height: 100%; background: rgba(0, 0, 0, 0.2); } - .page-banner-title{ + + .page-banner-title { position: absolute; top: 50%; width: 100%; height: 100%; text-transform: uppercase; - h2{ + + h2 { color: #fff; font-size: 40px; } @@ -508,9 +655,54 @@ a.back-to-top{ animation-name: fadeIn; } -#white-bg{background: #fff;} +#white-bg { + background: #fff; +} -header + * { +header+* { padding-top: 60px; +} + +section#speakers { + p.organization { + font-weight: bold; + } +} + +#agenda{ + .section-TOC{ + ul{ + list-style-type: square; + li{ + list-style: outside none square; + font-weight: bolder; + font-size: 1.2em; + + .break { + font-style: italic; + font-weight: 100; + color: $dark + } + + } + } + } +} + +// Talk Video Embed Styles (in agenda) +.talk-video { + position: relative; + width: 100%; + aspect-ratio: 16 / 9; + overflow: hidden; + + iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border: none; + } } \ No newline at end of file diff --git a/_sass/_navbar.scss b/_sass/_navbar.scss index fd52cb1..ab6997a 100644 --- a/_sass/_navbar.scss +++ b/_sass/_navbar.scss @@ -1,3 +1,5 @@ +@use 'presets' as *; + #roof { background: #ddd; padding: 15px 0; @@ -267,7 +269,7 @@ display: none; } -@media screen and (max-width: 768px) { +@media screen and (max-width: 991px) { .navbar-header { width: 100%; } diff --git a/_sass/_portfolio.scss b/_sass/_portfolio.scss index 91e9d74..d37bf93 100644 --- a/_sass/_portfolio.scss +++ b/_sass/_portfolio.scss @@ -1,3 +1,6 @@ + +@use 'presets' as *; + /* Gallery Section */ #gallery{ background: #f3f4f3; diff --git a/_sass/_presets.scss b/_sass/_presets.scss index aba5ce2..054898b 100644 --- a/_sass/_presets.scss +++ b/_sass/_presets.scss @@ -6,6 +6,8 @@ $primary : $blue; $primary-light: $blue-light; + + $dark : #333; //Current Preset Declareation $preset: $blue; \ No newline at end of file diff --git a/_sass/_pricing.scss b/_sass/_pricing.scss index 7738b9a..e799afa 100644 --- a/_sass/_pricing.scss +++ b/_sass/_pricing.scss @@ -1,3 +1,6 @@ + +@use 'presets' as *; + /* Pricing Ticket */ #pricing{ background: url(../img/background/bg-pricing.jpg); diff --git a/_sass/_schedule.scss b/_sass/_schedule.scss index 5375374..7ededa4 100644 --- a/_sass/_schedule.scss +++ b/_sass/_schedule.scss @@ -1,3 +1,6 @@ + +@use 'presets' as *; + /* Schedule Area */ #schedules{ background: #f3f4f3; diff --git a/_sass/_service.scss b/_sass/_service.scss index 909eb8b..9fb3463 100644 --- a/_sass/_service.scss +++ b/_sass/_service.scss @@ -1,3 +1,7 @@ + +@use 'presets' as *; + + /* Services Item */ .services{ background: #fff; diff --git a/_sass/_shortcode.scss b/_sass/_shortcode.scss index bb10bf8..7415ff8 100644 --- a/_sass/_shortcode.scss +++ b/_sass/_shortcode.scss @@ -1,10 +1,10 @@ // Shortcode // Countdown -@import 'countdown'; +@use 'countdown'; // Pricing -@import 'pricing'; +@use 'pricing'; // Carousel -@import 'carousel'; \ No newline at end of file +@use 'carousel'; \ No newline at end of file diff --git a/_sass/_team.scss b/_sass/_team.scss index 1360d7b..0ad7346 100644 --- a/_sass/_team.scss +++ b/_sass/_team.scss @@ -1,3 +1,6 @@ + +@use 'presets' as *; + /* Team Item */ .team-item:hover{ box-shadow: 0 25px 35px -12px rgba(0,0,0,0.35); diff --git a/_sass/_testimonial.scss b/_sass/_testimonial.scss index a1f316c..0b563c4 100644 --- a/_sass/_testimonial.scss +++ b/_sass/_testimonial.scss @@ -1,3 +1,6 @@ + +@use 'presets' as *; + // Testimonial .slide-item{ margin-top: 60px; diff --git a/about_ca.md b/about_ca.md index 988fdb8..38a6dcf 100644 --- a/about_ca.md +++ b/about_ca.md @@ -6,16 +6,15 @@ permalink: /a-propos title: "À propos de Code D'Armor" description: >- Code d'Armor a pour but de construire une communauté de développeurs sur la région de Lannion et des Côtes d'Armor.

Nous organisons et participons à des événements autour du développement informatique. - Nous sommes aussi un des Google Developers Groups les plus actif de France !

Passionnés, Intéressés, Motivés, Interloqués, vous êtes toutes et touss les bienvenu.e.s ! + Nous sommes aussi un des Google Developers Groups les plus actif de France !

Passionnés, Intéressés, Motivés, Interloqués, vous êtes toutes et tous les bienvenus ! thumbnail_url: "" #content -photo_equipe: "/assets/img/about/team_devfest.jpeg" -newsletter-sub: - title: "Restez informé des prochaines actus Code d'Armor" - description: "Si vous souhaitez en savoir plus sur Code d'Armor et être averti des prochains événements organisés par l'association et de ses actualités 👇️" - link: "https://codedarmor.us7.list-manage.com/subscribe?u=05474659d9a3ff4697f4fc41c&id=cc5063773c" +photo_equipe: "/assets/img/about/team_devfest.webp" +Newsletter: + title: "Restez informés des prochaines actus Code d'Armor" + description: "Pour en savoir plus sur Code d'Armor et recevoir les informations sur les prochains événements organisés par l'association 👇️" cta: "S'inscrire à la newsletter" contact-us: diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png index d550910..450e280 100644 Binary files a/android-chrome-192x192.png and b/android-chrome-192x192.png differ diff --git a/android-chrome-512x512.png b/android-chrome-512x512.png index 5c981c0..b0175c3 100644 Binary files a/android-chrome-512x512.png and b/android-chrome-512x512.png differ diff --git a/apple-touch-icon.png b/apple-touch-icon.png index e2fdfef..7e6097b 100644 Binary files a/apple-touch-icon.png and b/apple-touch-icon.png differ diff --git a/archives.md b/archives.md new file mode 100644 index 0000000..b850009 --- /dev/null +++ b/archives.md @@ -0,0 +1,100 @@ +--- +layout: archives +permalink: /archives + +#metadata +title: "Archives des années précédentes" +description: >- + Retrouvez les activités organisées par l'association Code d'Armor + +thumbnail_url: "" + +archives_title: Evénements passés +archives: + - title: DevFest 2025 + url: /archives/2025/devfest/ + - title: DevFest 2024 + url: /archives/2024/devfest/ + - title: DevFestNoz 2024 + url: /archives/2024/devfestnoz/ + - title: DevFest 2023 + url: /archives/2023/ + - title: DevFest 2022 + url: /archives/2022/ + - title: DevFest 2021 + url: /archives/2021/ + +slidedecks_title: Ateliers passés +slidedecks: + - file: /assets/slidedecks/Android.pdf + thumbnail: /assets/img/slidedecks/Android.webp + - file: /assets/slidedecks/Google Glass.pdf + thumbnail: /assets/img/slidedecks/Google Glass.webp + - file: /assets/slidedecks/Rails.pdf + thumbnail: /assets/img/slidedecks/Ruby.webp + - file: /assets/slidedecks/Kotlin.pdf + thumbnail: /assets/img/slidedecks/Kotlin.webp + - file: /assets/slidedecks/Ionic.pdf + thumbnail: /assets/img/slidedecks/Ionic.webp + - file: /assets/slidedecks/Rancher.pdf + thumbnail: /assets/img/slidedecks/Rancher.webp + - file: /assets/slidedecks/OS mobiles alternatifs.pdf + thumbnail: /assets/img/slidedecks/OS mobiles alternatifs.webp + - file: /assets/slidedecks/latence.pdf + thumbnail: /assets/img/slidedecks/latence.webp + - file: /assets/slidedecks/Symfony4.pdf + thumbnail: /assets/img/slidedecks/Symfony4.webp + - file: /assets/slidedecks/Go.pdf + thumbnail: /assets/img/slidedecks/Go.webp + - file: /assets/slidedecks/iOS8.pdf + thumbnail: /assets/img/slidedecks/iOS8.webp + - file: /assets/slidedecks/OpenStreetMap.pdf + thumbnail: /assets/img/slidedecks/Open Street Map.webp + - file: /assets/slidedecks/Service Workers.pdf + thumbnail: /assets/img/slidedecks/Service Workers.webp + - file: /assets/slidedecks/Tapster.pdf + thumbnail: /assets/img/slidedecks/Tapster.webp + - file: /assets/slidedecks/Java 9 et 10.pdf + thumbnail: /assets/img/slidedecks/Java 9 et 10.webp + - file: /assets/slidedecks/Dapps.pdf + thumbnail: /assets/img/slidedecks/Dapps.webp + - file: /assets/slidedecks/Grunt.pdf + thumbnail: /assets/img/slidedecks/Grunt.webp + - file: /assets/slidedecks/Qt.pdf + thumbnail: /assets/img/slidedecks/Qt.webp + - file: /assets/slidedecks/Angular JS.pdf + thumbnail: /assets/img/slidedecks/Angular JS.webp + - file: /assets/slidedecks/WebRTC.pdf + thumbnail: /assets/img/slidedecks/WebRTC.webp + - file: /assets/slidedecks/Backbone JS.pdf + thumbnail: /assets/img/slidedecks/Backbone JS.webp + - file: /assets/slidedecks/Coding Kids.pdf + thumbnail: /assets/img/slidedecks/default.webp + - file: /assets/slidedecks/Blockchains.pdf + thumbnail: /assets/img/slidedecks/Blockchains.webp + - file: /assets/slidedecks/Cryptomonnaies (Libre en Fete 2018).pdf + thumbnail: /assets/img/slidedecks/Cryptomonnaies (Libre en Fete 2018).webp + - file: /assets/slidedecks/Time Series.pdf + thumbnail: /assets/img/slidedecks/Time Series.webp + - file: /assets/slidedecks/Gitlab CI.pdf + thumbnail: /assets/img/slidedecks/Gitlab CI.webp + - file: /assets/slidedecks/Slices.pdf + thumbnail: /assets/img/slidedecks/Slices.webp + - file: /assets/slidedecks/Amazon Web Services.pdf + thumbnail: /assets/img/slidedecks/Amazon Web Services.webp + - file: /assets/slidedecks/Docker.pdf + thumbnail: /assets/img/slidedecks/Docker.webp + - file: /assets/slidedecks/Tests.pdf + thumbnail: /assets/img/slidedecks/Tests.webp + - file: /assets/slidedecks/Lua.pdf + thumbnail: /assets/img/slidedecks/Lua.webp + - file: /assets/slidedecks/Machine Learning.pdf + thumbnail: /assets/img/slidedecks/Machine Learning.webp + - file: /assets/slidedecks/Android Things.pdf + thumbnail: /assets/img/slidedecks/Android Things.webp + - file: /assets/slidedecks/Kubernetes.pdf + thumbnail: /assets/img/slidedecks/Kubernetes.webp + - file: /assets/slidedecks/PaaS Google.pdf + thumbnail: /assets/img/slidedecks/PaaS Google.webp + +--- diff --git a/assets/2021/categories/index.xml b/archives/2021/categories/index.xml similarity index 100% rename from assets/2021/categories/index.xml rename to archives/2021/categories/index.xml diff --git a/assets/2021/css/main.css b/archives/2021/css/main.css similarity index 100% rename from assets/2021/css/main.css rename to archives/2021/css/main.css diff --git a/assets/2021/doc/DevFest-Perros-Guirec.pdf b/archives/2021/doc/DevFest-Perros-Guirec.pdf similarity index 100% rename from assets/2021/doc/DevFest-Perros-Guirec.pdf rename to archives/2021/doc/DevFest-Perros-Guirec.pdf diff --git a/assets/2021/img/bigcover1.png b/archives/2021/img/bigcover1.png similarity index 100% rename from assets/2021/img/bigcover1.png rename to archives/2021/img/bigcover1.png diff --git a/archives/2021/img/bigcover1.webp b/archives/2021/img/bigcover1.webp new file mode 100644 index 0000000..3339f45 Binary files /dev/null and b/archives/2021/img/bigcover1.webp differ diff --git a/assets/2021/img/bigcover2.png b/archives/2021/img/bigcover2.png similarity index 100% rename from assets/2021/img/bigcover2.png rename to archives/2021/img/bigcover2.png diff --git a/archives/2021/img/bigcover2.webp b/archives/2021/img/bigcover2.webp new file mode 100644 index 0000000..aa2e0bc Binary files /dev/null and b/archives/2021/img/bigcover2.webp differ diff --git a/assets/2021/img/cover.jpg b/archives/2021/img/cover.jpg similarity index 100% rename from assets/2021/img/cover.jpg rename to archives/2021/img/cover.jpg diff --git a/archives/2021/img/cover.webp b/archives/2021/img/cover.webp new file mode 100644 index 0000000..cf56861 Binary files /dev/null and b/archives/2021/img/cover.webp differ diff --git a/archives/2021/img/favicon.ico b/archives/2021/img/favicon.ico new file mode 100644 index 0000000..d2b47f5 Binary files /dev/null and b/archives/2021/img/favicon.ico differ diff --git a/assets/2021/img/gdg.png b/archives/2021/img/gdg.png similarity index 100% rename from assets/2021/img/gdg.png rename to archives/2021/img/gdg.png diff --git a/archives/2021/img/gdg.webp b/archives/2021/img/gdg.webp new file mode 100644 index 0000000..6e86441 Binary files /dev/null and b/archives/2021/img/gdg.webp differ diff --git a/assets/2021/img/linkedin.png b/archives/2021/img/linkedin.png similarity index 100% rename from assets/2021/img/linkedin.png rename to archives/2021/img/linkedin.png diff --git a/archives/2021/img/linkedin.webp b/archives/2021/img/linkedin.webp new file mode 100644 index 0000000..b60e54d Binary files /dev/null and b/archives/2021/img/linkedin.webp differ diff --git a/assets/2021/img/logo.png b/archives/2021/img/logo.png similarity index 100% rename from assets/2021/img/logo.png rename to archives/2021/img/logo.png diff --git a/archives/2021/img/logo.webp b/archives/2021/img/logo.webp new file mode 100644 index 0000000..f2ede9a Binary files /dev/null and b/archives/2021/img/logo.webp differ diff --git a/assets/2021/img/marker-default.png b/archives/2021/img/marker-default.png similarity index 100% rename from assets/2021/img/marker-default.png rename to archives/2021/img/marker-default.png diff --git a/archives/2021/img/marker-default.webp b/archives/2021/img/marker-default.webp new file mode 100644 index 0000000..94967e3 Binary files /dev/null and b/archives/2021/img/marker-default.webp differ diff --git a/assets/2021/img/partners/anticipa.png b/archives/2021/img/partners/anticipa.png similarity index 100% rename from assets/2021/img/partners/anticipa.png rename to archives/2021/img/partners/anticipa.png diff --git a/archives/2021/img/partners/anticipa.webp b/archives/2021/img/partners/anticipa.webp new file mode 100644 index 0000000..a94fa93 Binary files /dev/null and b/archives/2021/img/partners/anticipa.webp differ diff --git a/assets/2021/img/partners/brestplus.png b/archives/2021/img/partners/brestplus.png similarity index 100% rename from assets/2021/img/partners/brestplus.png rename to archives/2021/img/partners/brestplus.png diff --git a/archives/2021/img/partners/brestplus.webp b/archives/2021/img/partners/brestplus.webp new file mode 100644 index 0000000..ea798bb Binary files /dev/null and b/archives/2021/img/partners/brestplus.webp differ diff --git a/assets/2021/img/partners/ltc.jpg b/archives/2021/img/partners/ltc.jpg similarity index 100% rename from assets/2021/img/partners/ltc.jpg rename to archives/2021/img/partners/ltc.jpg diff --git a/archives/2021/img/partners/ltc.webp b/archives/2021/img/partners/ltc.webp new file mode 100644 index 0000000..9c570eb Binary files /dev/null and b/archives/2021/img/partners/ltc.webp differ diff --git a/assets/2021/img/perros-salle-old.jpeg b/archives/2021/img/perros-salle-old.jpeg similarity index 100% rename from assets/2021/img/perros-salle-old.jpeg rename to archives/2021/img/perros-salle-old.jpeg diff --git a/archives/2021/img/perros-salle-old.webp b/archives/2021/img/perros-salle-old.webp new file mode 100644 index 0000000..3415234 Binary files /dev/null and b/archives/2021/img/perros-salle-old.webp differ diff --git a/assets/2021/img/perros-salle.jpeg b/archives/2021/img/perros-salle.jpeg similarity index 100% rename from assets/2021/img/perros-salle.jpeg rename to archives/2021/img/perros-salle.jpeg diff --git a/archives/2021/img/perros-salle.webp b/archives/2021/img/perros-salle.webp new file mode 100644 index 0000000..4c477f4 Binary files /dev/null and b/archives/2021/img/perros-salle.webp differ diff --git a/assets/2021/img/speakers/alexis.jpg b/archives/2021/img/speakers/alexis.jpg similarity index 100% rename from assets/2021/img/speakers/alexis.jpg rename to archives/2021/img/speakers/alexis.jpg diff --git a/archives/2021/img/speakers/alexis.webp b/archives/2021/img/speakers/alexis.webp new file mode 100644 index 0000000..ca0dda8 Binary files /dev/null and b/archives/2021/img/speakers/alexis.webp differ diff --git a/assets/2021/img/speakers/christophe.png b/archives/2021/img/speakers/christophe.png similarity index 100% rename from assets/2021/img/speakers/christophe.png rename to archives/2021/img/speakers/christophe.png diff --git a/archives/2021/img/speakers/christophe.webp b/archives/2021/img/speakers/christophe.webp new file mode 100644 index 0000000..e77e5ad Binary files /dev/null and b/archives/2021/img/speakers/christophe.webp differ diff --git a/assets/2021/img/speakers/clement.jpg b/archives/2021/img/speakers/clement.jpg similarity index 100% rename from assets/2021/img/speakers/clement.jpg rename to archives/2021/img/speakers/clement.jpg diff --git a/archives/2021/img/speakers/clement.webp b/archives/2021/img/speakers/clement.webp new file mode 100644 index 0000000..12c5a8f Binary files /dev/null and b/archives/2021/img/speakers/clement.webp differ diff --git a/assets/2021/img/speakers/david.jpg b/archives/2021/img/speakers/david.jpg similarity index 100% rename from assets/2021/img/speakers/david.jpg rename to archives/2021/img/speakers/david.jpg diff --git a/archives/2021/img/speakers/david.webp b/archives/2021/img/speakers/david.webp new file mode 100644 index 0000000..c2108d3 Binary files /dev/null and b/archives/2021/img/speakers/david.webp differ diff --git a/assets/2021/img/speakers/florian.jpg b/archives/2021/img/speakers/florian.jpg similarity index 100% rename from assets/2021/img/speakers/florian.jpg rename to archives/2021/img/speakers/florian.jpg diff --git a/archives/2021/img/speakers/florian.webp b/archives/2021/img/speakers/florian.webp new file mode 100644 index 0000000..2e4a594 Binary files /dev/null and b/archives/2021/img/speakers/florian.webp differ diff --git a/assets/2021/img/speakers/fulup.jpg b/archives/2021/img/speakers/fulup.jpg similarity index 100% rename from assets/2021/img/speakers/fulup.jpg rename to archives/2021/img/speakers/fulup.jpg diff --git a/archives/2021/img/speakers/fulup.webp b/archives/2021/img/speakers/fulup.webp new file mode 100644 index 0000000..dca7b5e Binary files /dev/null and b/archives/2021/img/speakers/fulup.webp differ diff --git a/assets/2021/img/speakers/guillaume.jpg b/archives/2021/img/speakers/guillaume.jpg similarity index 100% rename from assets/2021/img/speakers/guillaume.jpg rename to archives/2021/img/speakers/guillaume.jpg diff --git a/archives/2021/img/speakers/guillaume.webp b/archives/2021/img/speakers/guillaume.webp new file mode 100644 index 0000000..49ef9f0 Binary files /dev/null and b/archives/2021/img/speakers/guillaume.webp differ diff --git a/assets/2021/img/speakers/magali.jpg b/archives/2021/img/speakers/magali.jpg similarity index 100% rename from assets/2021/img/speakers/magali.jpg rename to archives/2021/img/speakers/magali.jpg diff --git a/archives/2021/img/speakers/magali.webp b/archives/2021/img/speakers/magali.webp new file mode 100644 index 0000000..49e9193 Binary files /dev/null and b/archives/2021/img/speakers/magali.webp differ diff --git a/assets/2021/img/speakers/philippe.jpg b/archives/2021/img/speakers/philippe.jpg similarity index 100% rename from assets/2021/img/speakers/philippe.jpg rename to archives/2021/img/speakers/philippe.jpg diff --git a/archives/2021/img/speakers/philippe.webp b/archives/2021/img/speakers/philippe.webp new file mode 100644 index 0000000..e310404 Binary files /dev/null and b/archives/2021/img/speakers/philippe.webp differ diff --git a/assets/2021/img/twitter-square.jpg b/archives/2021/img/twitter-square.jpg similarity index 100% rename from assets/2021/img/twitter-square.jpg rename to archives/2021/img/twitter-square.jpg diff --git a/archives/2021/img/twitter-square.webp b/archives/2021/img/twitter-square.webp new file mode 100644 index 0000000..7a2253a Binary files /dev/null and b/archives/2021/img/twitter-square.webp differ diff --git a/assets/2021/img/twitter.png b/archives/2021/img/twitter.png similarity index 100% rename from assets/2021/img/twitter.png rename to archives/2021/img/twitter.png diff --git a/archives/2021/img/twitter.webp b/archives/2021/img/twitter.webp new file mode 100644 index 0000000..af53844 Binary files /dev/null and b/archives/2021/img/twitter.webp differ diff --git a/assets/2021/img/twitter2.png b/archives/2021/img/twitter2.png similarity index 100% rename from assets/2021/img/twitter2.png rename to archives/2021/img/twitter2.png diff --git a/archives/2021/img/twitter2.webp b/archives/2021/img/twitter2.webp new file mode 100644 index 0000000..ff7f33e Binary files /dev/null and b/archives/2021/img/twitter2.webp differ diff --git a/assets/2021/img/twitter3.png b/archives/2021/img/twitter3.png similarity index 100% rename from assets/2021/img/twitter3.png rename to archives/2021/img/twitter3.png diff --git a/archives/2021/img/twitter3.webp b/archives/2021/img/twitter3.webp new file mode 100644 index 0000000..0422357 Binary files /dev/null and b/archives/2021/img/twitter3.webp differ diff --git a/assets/2021/index.html b/archives/2021/index.html similarity index 89% rename from assets/2021/index.html rename to archives/2021/index.html index 82f3d67..059702f 100644 --- a/assets/2021/index.html +++ b/archives/2021/index.html @@ -10,17 +10,17 @@ - - + + - + - + @@ -61,7 +61,7 @@
- +

  @@ -106,7 +106,7 @@

A propos

Venez profiter d'une belle journée de conférences en profitant de la vue mer. Nous proposons aussi de profiter d'activités nautiques comme le kayak ou le paddle en fin de journée.

- +
@@ -114,7 +114,7 @@

Speakers

  • -Philippe Ensarguet +Philippe Ensarguet

    @@ -125,7 +125,7 @@

    Philippe Ensarguet

  • -Florian Chazal +Florian Chazal

    @@ -136,7 +136,7 @@

    Florian Chazal

  • -Alexis Marcou +Alexis Marcou

    @@ -147,7 +147,7 @@

    Alexis Marcou

  • -Fulup Le Foll +Fulup Le Foll

    @@ -158,7 +158,7 @@

    Fulup Le Foll

  • -Clément Bénier +Clément Bénier

    @@ -169,7 +169,7 @@

    Clément Bénier

  • -Guillaume Teissier +Guillaume Teissier

    @@ -180,7 +180,7 @@

    Guillaume Teissier

  • -Magali Denelle +Magali Denelle

    @@ -191,7 +191,7 @@

    Magali Denelle

  • -Christophe Hauquiert +Christophe Hauquiert

    @@ -202,7 +202,7 @@

    Christophe Hauquiert

  • -David Rogel +David Rogel

    @@ -240,7 +240,7 @@

    Programme

    -Philippe Ensarguet +Philippe Ensarguet

    @@ -256,10 +256,10 @@

    Programme

    -Clément Bénier +Clément Bénier -Fulup Le Foll +Fulup Le Foll

    @@ -280,10 +280,10 @@

    Programme

    -Alexis Marcou +Alexis Marcou -Florian Chazal +Florian Chazal

    @@ -304,10 +304,10 @@

    Programme

    -Guillaume Teissier +Guillaume Teissier -Magali Denelle +Magali Denelle

    @@ -328,7 +328,7 @@

    Programme

    -David Rogel +David Rogel

    @@ -344,7 +344,7 @@

    Programme

    -Christophe Hauquiert +Christophe Hauquiert

    @@ -369,17 +369,17 @@

    Partners

    diff --git a/assets/2021/index.xml b/archives/2021/index.xml similarity index 100% rename from assets/2021/index.xml rename to archives/2021/index.xml diff --git a/assets/2021/js/jquery.js b/archives/2021/js/jquery.js similarity index 100% rename from assets/2021/js/jquery.js rename to archives/2021/js/jquery.js diff --git a/assets/2021/js/main.js b/archives/2021/js/main.js similarity index 100% rename from assets/2021/js/main.js rename to archives/2021/js/main.js diff --git a/assets/2021/tags/index.xml b/archives/2021/tags/index.xml similarity index 100% rename from assets/2021/tags/index.xml rename to archives/2021/tags/index.xml diff --git a/assets/2022/categories/index.xml b/archives/2022/categories/index.xml similarity index 100% rename from assets/2022/categories/index.xml rename to archives/2022/categories/index.xml diff --git a/assets/2022/css/main.css b/archives/2022/css/main.css similarity index 100% rename from assets/2022/css/main.css rename to archives/2022/css/main.css diff --git a/assets/2022/doc/DevFest-Perros-Guirec.pdf b/archives/2022/doc/DevFest-Perros-Guirec.pdf similarity index 100% rename from assets/2022/doc/DevFest-Perros-Guirec.pdf rename to archives/2022/doc/DevFest-Perros-Guirec.pdf diff --git a/assets/2022/img/bigcover2.png b/archives/2022/img/bigcover2.png similarity index 100% rename from assets/2022/img/bigcover2.png rename to archives/2022/img/bigcover2.png diff --git a/archives/2022/img/bigcover2.webp b/archives/2022/img/bigcover2.webp new file mode 100644 index 0000000..ebbd0c4 Binary files /dev/null and b/archives/2022/img/bigcover2.webp differ diff --git a/archives/2022/img/favicon.ico b/archives/2022/img/favicon.ico new file mode 100644 index 0000000..d2b47f5 Binary files /dev/null and b/archives/2022/img/favicon.ico differ diff --git a/assets/2022/img/gdg.png b/archives/2022/img/gdg.png similarity index 100% rename from assets/2022/img/gdg.png rename to archives/2022/img/gdg.png diff --git a/archives/2022/img/gdg.webp b/archives/2022/img/gdg.webp new file mode 100644 index 0000000..6e86441 Binary files /dev/null and b/archives/2022/img/gdg.webp differ diff --git a/assets/2022/img/linkedin.png b/archives/2022/img/linkedin.png similarity index 100% rename from assets/2022/img/linkedin.png rename to archives/2022/img/linkedin.png diff --git a/archives/2022/img/linkedin.webp b/archives/2022/img/linkedin.webp new file mode 100644 index 0000000..b60e54d Binary files /dev/null and b/archives/2022/img/linkedin.webp differ diff --git a/assets/2022/img/logo.png b/archives/2022/img/logo.png similarity index 100% rename from assets/2022/img/logo.png rename to archives/2022/img/logo.png diff --git a/archives/2022/img/logo.webp b/archives/2022/img/logo.webp new file mode 100644 index 0000000..7118d6a Binary files /dev/null and b/archives/2022/img/logo.webp differ diff --git a/assets/2021/themes/hugo-conference/static/img/marker-default.png b/archives/2022/img/marker-default.png similarity index 100% rename from assets/2021/themes/hugo-conference/static/img/marker-default.png rename to archives/2022/img/marker-default.png diff --git a/archives/2022/img/marker-default.webp b/archives/2022/img/marker-default.webp new file mode 100644 index 0000000..94967e3 Binary files /dev/null and b/archives/2022/img/marker-default.webp differ diff --git a/assets/2022/img/partners/anticipa.png b/archives/2022/img/partners/anticipa.png similarity index 100% rename from assets/2022/img/partners/anticipa.png rename to archives/2022/img/partners/anticipa.png diff --git a/archives/2022/img/partners/anticipa.webp b/archives/2022/img/partners/anticipa.webp new file mode 100644 index 0000000..a94fa93 Binary files /dev/null and b/archives/2022/img/partners/anticipa.webp differ diff --git a/assets/2022/img/partners/brestplus.png b/archives/2022/img/partners/brestplus.png similarity index 100% rename from assets/2022/img/partners/brestplus.png rename to archives/2022/img/partners/brestplus.png diff --git a/archives/2022/img/partners/brestplus.webp b/archives/2022/img/partners/brestplus.webp new file mode 100644 index 0000000..ea798bb Binary files /dev/null and b/archives/2022/img/partners/brestplus.webp differ diff --git a/assets/2022/img/partners/dcbrain.png b/archives/2022/img/partners/dcbrain.png similarity index 100% rename from assets/2022/img/partners/dcbrain.png rename to archives/2022/img/partners/dcbrain.png diff --git a/archives/2022/img/partners/dcbrain.webp b/archives/2022/img/partners/dcbrain.webp new file mode 100644 index 0000000..e928530 Binary files /dev/null and b/archives/2022/img/partners/dcbrain.webp differ diff --git a/assets/2022/img/partners/ecocompteur.png b/archives/2022/img/partners/ecocompteur.png similarity index 100% rename from assets/2022/img/partners/ecocompteur.png rename to archives/2022/img/partners/ecocompteur.png diff --git a/archives/2022/img/partners/ecocompteur.webp b/archives/2022/img/partners/ecocompteur.webp new file mode 100644 index 0000000..0184506 Binary files /dev/null and b/archives/2022/img/partners/ecocompteur.webp differ diff --git a/assets/2022/img/partners/ltc.jpg b/archives/2022/img/partners/ltc.jpg similarity index 100% rename from assets/2022/img/partners/ltc.jpg rename to archives/2022/img/partners/ltc.jpg diff --git a/archives/2022/img/partners/ltc.webp b/archives/2022/img/partners/ltc.webp new file mode 100644 index 0000000..9c570eb Binary files /dev/null and b/archives/2022/img/partners/ltc.webp differ diff --git a/assets/2022/img/perros-salle.jpeg b/archives/2022/img/perros-salle.jpeg similarity index 100% rename from assets/2022/img/perros-salle.jpeg rename to archives/2022/img/perros-salle.jpeg diff --git a/archives/2022/img/perros-salle.webp b/archives/2022/img/perros-salle.webp new file mode 100644 index 0000000..5f0e84f Binary files /dev/null and b/archives/2022/img/perros-salle.webp differ diff --git a/assets/2022/img/speakers/alexis.jpg b/archives/2022/img/speakers/alexis.jpg similarity index 100% rename from assets/2022/img/speakers/alexis.jpg rename to archives/2022/img/speakers/alexis.jpg diff --git a/archives/2022/img/speakers/alexis.webp b/archives/2022/img/speakers/alexis.webp new file mode 100644 index 0000000..ca0dda8 Binary files /dev/null and b/archives/2022/img/speakers/alexis.webp differ diff --git a/assets/2022/img/speakers/christophe.png b/archives/2022/img/speakers/christophe.png similarity index 100% rename from assets/2022/img/speakers/christophe.png rename to archives/2022/img/speakers/christophe.png diff --git a/archives/2022/img/speakers/christophe.webp b/archives/2022/img/speakers/christophe.webp new file mode 100644 index 0000000..e77e5ad Binary files /dev/null and b/archives/2022/img/speakers/christophe.webp differ diff --git a/assets/2022/img/speakers/clement.jpg b/archives/2022/img/speakers/clement.jpg similarity index 100% rename from assets/2022/img/speakers/clement.jpg rename to archives/2022/img/speakers/clement.jpg diff --git a/archives/2022/img/speakers/clement.webp b/archives/2022/img/speakers/clement.webp new file mode 100644 index 0000000..12c5a8f Binary files /dev/null and b/archives/2022/img/speakers/clement.webp differ diff --git a/assets/2022/img/speakers/david.jpg b/archives/2022/img/speakers/david.jpg similarity index 100% rename from assets/2022/img/speakers/david.jpg rename to archives/2022/img/speakers/david.jpg diff --git a/archives/2022/img/speakers/david.webp b/archives/2022/img/speakers/david.webp new file mode 100644 index 0000000..c2108d3 Binary files /dev/null and b/archives/2022/img/speakers/david.webp differ diff --git a/assets/2022/img/speakers/florian.jpg b/archives/2022/img/speakers/florian.jpg similarity index 100% rename from assets/2022/img/speakers/florian.jpg rename to archives/2022/img/speakers/florian.jpg diff --git a/archives/2022/img/speakers/florian.webp b/archives/2022/img/speakers/florian.webp new file mode 100644 index 0000000..2e4a594 Binary files /dev/null and b/archives/2022/img/speakers/florian.webp differ diff --git a/assets/2022/img/speakers/fulup.jpg b/archives/2022/img/speakers/fulup.jpg similarity index 100% rename from assets/2022/img/speakers/fulup.jpg rename to archives/2022/img/speakers/fulup.jpg diff --git a/archives/2022/img/speakers/fulup.webp b/archives/2022/img/speakers/fulup.webp new file mode 100644 index 0000000..dca7b5e Binary files /dev/null and b/archives/2022/img/speakers/fulup.webp differ diff --git a/assets/2022/img/speakers/guillaume.jpg b/archives/2022/img/speakers/guillaume.jpg similarity index 100% rename from assets/2022/img/speakers/guillaume.jpg rename to archives/2022/img/speakers/guillaume.jpg diff --git a/archives/2022/img/speakers/guillaume.webp b/archives/2022/img/speakers/guillaume.webp new file mode 100644 index 0000000..49ef9f0 Binary files /dev/null and b/archives/2022/img/speakers/guillaume.webp differ diff --git a/assets/2022/img/speakers/heloise.jpg b/archives/2022/img/speakers/heloise.jpg similarity index 100% rename from assets/2022/img/speakers/heloise.jpg rename to archives/2022/img/speakers/heloise.jpg diff --git a/archives/2022/img/speakers/heloise.webp b/archives/2022/img/speakers/heloise.webp new file mode 100644 index 0000000..1da7194 Binary files /dev/null and b/archives/2022/img/speakers/heloise.webp differ diff --git a/assets/2022/img/speakers/magali.jpg b/archives/2022/img/speakers/magali.jpg similarity index 100% rename from assets/2022/img/speakers/magali.jpg rename to archives/2022/img/speakers/magali.jpg diff --git a/archives/2022/img/speakers/magali.webp b/archives/2022/img/speakers/magali.webp new file mode 100644 index 0000000..49e9193 Binary files /dev/null and b/archives/2022/img/speakers/magali.webp differ diff --git a/assets/2022/img/speakers/olivier.png b/archives/2022/img/speakers/olivier.png similarity index 100% rename from assets/2022/img/speakers/olivier.png rename to archives/2022/img/speakers/olivier.png diff --git a/archives/2022/img/speakers/olivier.webp b/archives/2022/img/speakers/olivier.webp new file mode 100644 index 0000000..495e83e Binary files /dev/null and b/archives/2022/img/speakers/olivier.webp differ diff --git a/assets/2022/img/speakers/olivier_ridoux.png b/archives/2022/img/speakers/olivier_ridoux.png similarity index 100% rename from assets/2022/img/speakers/olivier_ridoux.png rename to archives/2022/img/speakers/olivier_ridoux.png diff --git a/archives/2022/img/speakers/olivier_ridoux.webp b/archives/2022/img/speakers/olivier_ridoux.webp new file mode 100644 index 0000000..8bca230 Binary files /dev/null and b/archives/2022/img/speakers/olivier_ridoux.webp differ diff --git a/assets/2022/img/speakers/philippe.jpg b/archives/2022/img/speakers/philippe.jpg similarity index 100% rename from assets/2022/img/speakers/philippe.jpg rename to archives/2022/img/speakers/philippe.jpg diff --git a/archives/2022/img/speakers/philippe.webp b/archives/2022/img/speakers/philippe.webp new file mode 100644 index 0000000..e310404 Binary files /dev/null and b/archives/2022/img/speakers/philippe.webp differ diff --git a/assets/2022/img/speakers/pierre.jpg b/archives/2022/img/speakers/pierre.jpg similarity index 100% rename from assets/2022/img/speakers/pierre.jpg rename to archives/2022/img/speakers/pierre.jpg diff --git a/archives/2022/img/speakers/pierre.webp b/archives/2022/img/speakers/pierre.webp new file mode 100644 index 0000000..3d55f19 Binary files /dev/null and b/archives/2022/img/speakers/pierre.webp differ diff --git a/assets/2022/img/speakers/romuald.jpg b/archives/2022/img/speakers/romuald.jpg similarity index 100% rename from assets/2022/img/speakers/romuald.jpg rename to archives/2022/img/speakers/romuald.jpg diff --git a/archives/2022/img/speakers/romuald.webp b/archives/2022/img/speakers/romuald.webp new file mode 100644 index 0000000..fdd1123 Binary files /dev/null and b/archives/2022/img/speakers/romuald.webp differ diff --git a/assets/2022/img/speakers/sylvain.jpg b/archives/2022/img/speakers/sylvain.jpg similarity index 100% rename from assets/2022/img/speakers/sylvain.jpg rename to archives/2022/img/speakers/sylvain.jpg diff --git a/archives/2022/img/speakers/sylvain.webp b/archives/2022/img/speakers/sylvain.webp new file mode 100644 index 0000000..5737ebd Binary files /dev/null and b/archives/2022/img/speakers/sylvain.webp differ diff --git a/assets/2022/img/speakers/tristan.png b/archives/2022/img/speakers/tristan.png similarity index 100% rename from assets/2022/img/speakers/tristan.png rename to archives/2022/img/speakers/tristan.png diff --git a/archives/2022/img/speakers/tristan.webp b/archives/2022/img/speakers/tristan.webp new file mode 100644 index 0000000..7698213 Binary files /dev/null and b/archives/2022/img/speakers/tristan.webp differ diff --git a/assets/2022/img/twitter-square.jpg b/archives/2022/img/twitter-square.jpg similarity index 100% rename from assets/2022/img/twitter-square.jpg rename to archives/2022/img/twitter-square.jpg diff --git a/archives/2022/img/twitter-square.webp b/archives/2022/img/twitter-square.webp new file mode 100644 index 0000000..7a2253a Binary files /dev/null and b/archives/2022/img/twitter-square.webp differ diff --git a/assets/2022/img/twitter.png b/archives/2022/img/twitter.png similarity index 100% rename from assets/2022/img/twitter.png rename to archives/2022/img/twitter.png diff --git a/archives/2022/img/twitter.webp b/archives/2022/img/twitter.webp new file mode 100644 index 0000000..af53844 Binary files /dev/null and b/archives/2022/img/twitter.webp differ diff --git a/assets/2022/img/twitter2.png b/archives/2022/img/twitter2.png similarity index 100% rename from assets/2022/img/twitter2.png rename to archives/2022/img/twitter2.png diff --git a/archives/2022/img/twitter2.webp b/archives/2022/img/twitter2.webp new file mode 100644 index 0000000..32efcd1 Binary files /dev/null and b/archives/2022/img/twitter2.webp differ diff --git a/assets/2022/img/twitter3.png b/archives/2022/img/twitter3.png similarity index 100% rename from assets/2022/img/twitter3.png rename to archives/2022/img/twitter3.png diff --git a/archives/2022/img/twitter3.webp b/archives/2022/img/twitter3.webp new file mode 100644 index 0000000..40a5fe0 Binary files /dev/null and b/archives/2022/img/twitter3.webp differ diff --git a/assets/2022/index.html b/archives/2022/index.html similarity index 90% rename from assets/2022/index.html rename to archives/2022/index.html index 7ccddc7..4a52012 100644 --- a/assets/2022/index.html +++ b/archives/2022/index.html @@ -13,18 +13,18 @@ content="Le 7 octobre 2022. Un DevFest est une conférence technique destinée aux développeurs. Elle s'adresse aux étudiants et professionnels passionnés de technologies."> - + - + - - - + + +
    @@ -35,15 +35,15 @@
  • - + -

-
+

 

 

@@ -79,13 +79,13 @@

A propos

Ce sera également l'occasion de profiter d'une belle journée de conférences avec un concentré de d'éco-conception logicielle dans l’intimité du palais des congrès de Perros-Guirec, face à la plage de Trestraou pour profiter de la vue mer.

-
+

Speakers

  • Héloïse Dano

    Héloïse Dano

    @@ -99,7 +99,7 @@

    Héloïse Dano

    Responsable jusqu'au fin fond du Finistère ;)

  • Olivier Le Goaër

    Olivier Le Goaër

    @@ -111,7 +111,7 @@

    Olivier Le Goaër

    d'ingénieurs en Informatique.

  • Tristan Nitot

    Tristan Nitot

    @@ -122,7 +122,7 @@

    Tristan Nitot

    développement durable.

  • Romuald Priol

    Romuald Priol

    @@ -134,7 +134,7 @@

    Romuald Priol

    accessible ».

  • Sylvain Revereault

    Sylvain Revereault

    @@ -148,7 +148,7 @@

    Sylvain Revereault

    portant la casquette de CTO de l’agence de Rennes.

  • Olivier Ridoux

    @@ -159,7 +159,7 @@

    Olivier Ridoux

    groupe de travail CNRS ÉcoInfo. Mes centres d’intérêt vont vers la logique formelle et ses applications et les limites physiques du calcul.

  • - Pierre RustPierre Rust

    Pierre Rust

    @@ -192,7 +192,7 @@

    Pierre Rust

    9h30
    Héloïse Dano

    @@ -209,7 +209,7 @@

    Pierre Rust

    10h30
    Tristan Nitot

    @@ -232,7 +232,7 @@

    Pierre Rust

    11h30
    Sylvain Revereault

    @@ -259,7 +259,7 @@

    Pierre Rust

    14h00
    Romuald Priol

    @@ -277,7 +277,7 @@

    Pierre Rust

    14h45
    Pierre Rust

    Outils d'empreinte carbone des cloud public : comparer des pommes et des oranges @@ -302,7 +302,7 @@

    Pierre Rust

    15h45
    Olivier Le Goaër

    @@ -322,7 +322,7 @@

    Pierre Rust

    16h30
    Olivier Ridoux

    @@ -350,11 +350,11 @@

    Pierre Rust

@@ -363,7 +363,7 @@

Pierre Rust

  • @@ -374,6 +374,6 @@

    Pierre Rust

    - + \ No newline at end of file diff --git a/assets/2022/index.xml b/archives/2022/index.xml similarity index 100% rename from assets/2022/index.xml rename to archives/2022/index.xml diff --git a/assets/2021/themes/hugo-conference/static/js/jquery.js b/archives/2022/js/jquery.js similarity index 100% rename from assets/2021/themes/hugo-conference/static/js/jquery.js rename to archives/2022/js/jquery.js diff --git a/assets/2021/themes/hugo-conference/static/js/main.js b/archives/2022/js/main.js similarity index 100% rename from assets/2021/themes/hugo-conference/static/js/main.js rename to archives/2022/js/main.js diff --git a/assets/2022/tags/index.xml b/archives/2022/tags/index.xml similarity index 100% rename from assets/2022/tags/index.xml rename to archives/2022/tags/index.xml diff --git a/assets/2023/categories/index.xml b/archives/2023/categories/index.xml similarity index 100% rename from assets/2023/categories/index.xml rename to archives/2023/categories/index.xml diff --git a/assets/2023/css/main-2022.css b/archives/2023/css/main-2022.css similarity index 100% rename from assets/2023/css/main-2022.css rename to archives/2023/css/main-2022.css diff --git a/assets/2023/css/main.css b/archives/2023/css/main.css similarity index 100% rename from assets/2023/css/main.css rename to archives/2023/css/main.css diff --git a/assets/2023/devfest-presse-2023.pdf b/archives/2023/devfest-presse-2023.pdf similarity index 100% rename from assets/2023/devfest-presse-2023.pdf rename to archives/2023/devfest-presse-2023.pdf diff --git a/assets/2023/doc/DevFest-Perros-Guirec.pdf b/archives/2023/doc/DevFest-Perros-Guirec.pdf similarity index 100% rename from assets/2023/doc/DevFest-Perros-Guirec.pdf rename to archives/2023/doc/DevFest-Perros-Guirec.pdf diff --git a/assets/2023/img/Intelligence-articifielle-salle-de-conference.png b/archives/2023/img/Intelligence-articifielle-salle-de-conference.png similarity index 100% rename from assets/2023/img/Intelligence-articifielle-salle-de-conference.png rename to archives/2023/img/Intelligence-articifielle-salle-de-conference.png diff --git a/archives/2023/img/Intelligence-articifielle-salle-de-conference.webp b/archives/2023/img/Intelligence-articifielle-salle-de-conference.webp new file mode 100644 index 0000000..7c29d83 Binary files /dev/null and b/archives/2023/img/Intelligence-articifielle-salle-de-conference.webp differ diff --git a/assets/2023/img/Trestraou-Perros-Guirec-Palais-Devfest.png b/archives/2023/img/Trestraou-Perros-Guirec-Palais-Devfest.png similarity index 100% rename from assets/2023/img/Trestraou-Perros-Guirec-Palais-Devfest.png rename to archives/2023/img/Trestraou-Perros-Guirec-Palais-Devfest.png diff --git a/archives/2023/img/Trestraou-Perros-Guirec-Palais-Devfest.webp b/archives/2023/img/Trestraou-Perros-Guirec-Palais-Devfest.webp new file mode 100644 index 0000000..fd99c17 Binary files /dev/null and b/archives/2023/img/Trestraou-Perros-Guirec-Palais-Devfest.webp differ diff --git a/assets/2023/img/bigcover2.png b/archives/2023/img/bigcover2.png similarity index 100% rename from assets/2023/img/bigcover2.png rename to archives/2023/img/bigcover2.png diff --git a/archives/2023/img/bigcover2.webp b/archives/2023/img/bigcover2.webp new file mode 100644 index 0000000..ebbd0c4 Binary files /dev/null and b/archives/2023/img/bigcover2.webp differ diff --git a/assets/2023/img/digits.png b/archives/2023/img/digits.png similarity index 100% rename from assets/2023/img/digits.png rename to archives/2023/img/digits.png diff --git a/archives/2023/img/digits.webp b/archives/2023/img/digits.webp new file mode 100644 index 0000000..27cbf32 Binary files /dev/null and b/archives/2023/img/digits.webp differ diff --git a/assets/2023/img/favicon/android-chrome-192x192.png b/archives/2023/img/favicon/android-chrome-192x192.png similarity index 100% rename from assets/2023/img/favicon/android-chrome-192x192.png rename to archives/2023/img/favicon/android-chrome-192x192.png diff --git a/archives/2023/img/favicon/android-chrome-192x192.webp b/archives/2023/img/favicon/android-chrome-192x192.webp new file mode 100644 index 0000000..c75bd56 Binary files /dev/null and b/archives/2023/img/favicon/android-chrome-192x192.webp differ diff --git a/assets/2023/img/favicon/android-chrome-512x512.png b/archives/2023/img/favicon/android-chrome-512x512.png similarity index 100% rename from assets/2023/img/favicon/android-chrome-512x512.png rename to archives/2023/img/favicon/android-chrome-512x512.png diff --git a/archives/2023/img/favicon/android-chrome-512x512.webp b/archives/2023/img/favicon/android-chrome-512x512.webp new file mode 100644 index 0000000..3fd8e0f Binary files /dev/null and b/archives/2023/img/favicon/android-chrome-512x512.webp differ diff --git a/assets/2023/img/favicon/apple-touch-icon.png b/archives/2023/img/favicon/apple-touch-icon.png similarity index 100% rename from assets/2023/img/favicon/apple-touch-icon.png rename to archives/2023/img/favicon/apple-touch-icon.png diff --git a/archives/2023/img/favicon/apple-touch-icon.webp b/archives/2023/img/favicon/apple-touch-icon.webp new file mode 100644 index 0000000..50c9468 Binary files /dev/null and b/archives/2023/img/favicon/apple-touch-icon.webp differ diff --git a/assets/2023/img/favicon/favicon-16x16.png b/archives/2023/img/favicon/favicon-16x16.png similarity index 100% rename from assets/2023/img/favicon/favicon-16x16.png rename to archives/2023/img/favicon/favicon-16x16.png diff --git a/archives/2023/img/favicon/favicon-16x16.webp b/archives/2023/img/favicon/favicon-16x16.webp new file mode 100644 index 0000000..0aa858a Binary files /dev/null and b/archives/2023/img/favicon/favicon-16x16.webp differ diff --git a/assets/2023/img/favicon/favicon-32x32.png b/archives/2023/img/favicon/favicon-32x32.png similarity index 100% rename from assets/2023/img/favicon/favicon-32x32.png rename to archives/2023/img/favicon/favicon-32x32.png diff --git a/archives/2023/img/favicon/favicon-32x32.webp b/archives/2023/img/favicon/favicon-32x32.webp new file mode 100644 index 0000000..5a4583a Binary files /dev/null and b/archives/2023/img/favicon/favicon-32x32.webp differ diff --git a/assets/2023/img/favicon/favicon.ico b/archives/2023/img/favicon/favicon.ico similarity index 100% rename from assets/2023/img/favicon/favicon.ico rename to archives/2023/img/favicon/favicon.ico diff --git a/assets/2023/img/gdg.png b/archives/2023/img/gdg.png similarity index 100% rename from assets/2023/img/gdg.png rename to archives/2023/img/gdg.png diff --git a/archives/2023/img/gdg.webp b/archives/2023/img/gdg.webp new file mode 100644 index 0000000..6e86441 Binary files /dev/null and b/archives/2023/img/gdg.webp differ diff --git a/assets/2023/img/header-devfest.png b/archives/2023/img/header-devfest.png similarity index 100% rename from assets/2023/img/header-devfest.png rename to archives/2023/img/header-devfest.png diff --git a/archives/2023/img/header-devfest.webp b/archives/2023/img/header-devfest.webp new file mode 100644 index 0000000..a25fb46 Binary files /dev/null and b/archives/2023/img/header-devfest.webp differ diff --git a/assets/2023/img/linkedin.png b/archives/2023/img/linkedin.png similarity index 100% rename from assets/2023/img/linkedin.png rename to archives/2023/img/linkedin.png diff --git a/archives/2023/img/linkedin.webp b/archives/2023/img/linkedin.webp new file mode 100644 index 0000000..b60e54d Binary files /dev/null and b/archives/2023/img/linkedin.webp differ diff --git a/assets/2023/img/logo.png b/archives/2023/img/logo.png similarity index 100% rename from assets/2023/img/logo.png rename to archives/2023/img/logo.png diff --git a/archives/2023/img/logo.webp b/archives/2023/img/logo.webp new file mode 100644 index 0000000..7118d6a Binary files /dev/null and b/archives/2023/img/logo.webp differ diff --git a/assets/2023/img/macareux-ai.png b/archives/2023/img/macareux-ai.png similarity index 100% rename from assets/2023/img/macareux-ai.png rename to archives/2023/img/macareux-ai.png diff --git a/archives/2023/img/macareux-ai.webp b/archives/2023/img/macareux-ai.webp new file mode 100644 index 0000000..8bca3b4 Binary files /dev/null and b/archives/2023/img/macareux-ai.webp differ diff --git a/assets/2022/img/marker-default.png b/archives/2023/img/marker-default.png similarity index 100% rename from assets/2022/img/marker-default.png rename to archives/2023/img/marker-default.png diff --git a/archives/2023/img/marker-default.webp b/archives/2023/img/marker-default.webp new file mode 100644 index 0000000..94967e3 Binary files /dev/null and b/archives/2023/img/marker-default.webp differ diff --git a/assets/2023/img/partners/anticipa.png b/archives/2023/img/partners/anticipa.png similarity index 100% rename from assets/2023/img/partners/anticipa.png rename to archives/2023/img/partners/anticipa.png diff --git a/archives/2023/img/partners/anticipa.webp b/archives/2023/img/partners/anticipa.webp new file mode 100644 index 0000000..a94fa93 Binary files /dev/null and b/archives/2023/img/partners/anticipa.webp differ diff --git a/assets/2023/img/partners/brestplus.png b/archives/2023/img/partners/brestplus.png similarity index 100% rename from assets/2023/img/partners/brestplus.png rename to archives/2023/img/partners/brestplus.png diff --git a/archives/2023/img/partners/brestplus.webp b/archives/2023/img/partners/brestplus.webp new file mode 100644 index 0000000..ea798bb Binary files /dev/null and b/archives/2023/img/partners/brestplus.webp differ diff --git a/assets/2023/img/partners/dcbrain.png b/archives/2023/img/partners/dcbrain.png similarity index 100% rename from assets/2023/img/partners/dcbrain.png rename to archives/2023/img/partners/dcbrain.png diff --git a/archives/2023/img/partners/dcbrain.webp b/archives/2023/img/partners/dcbrain.webp new file mode 100644 index 0000000..e928530 Binary files /dev/null and b/archives/2023/img/partners/dcbrain.webp differ diff --git a/assets/2023/img/partners/ecocompteur.png b/archives/2023/img/partners/ecocompteur.png similarity index 100% rename from assets/2023/img/partners/ecocompteur.png rename to archives/2023/img/partners/ecocompteur.png diff --git a/archives/2023/img/partners/ecocompteur.webp b/archives/2023/img/partners/ecocompteur.webp new file mode 100644 index 0000000..0184506 Binary files /dev/null and b/archives/2023/img/partners/ecocompteur.webp differ diff --git a/assets/2023/img/partners/ltc.jpg b/archives/2023/img/partners/ltc.jpg similarity index 100% rename from assets/2023/img/partners/ltc.jpg rename to archives/2023/img/partners/ltc.jpg diff --git a/assets/2023/img/perros-salle.jpeg b/archives/2023/img/perros-salle.jpeg similarity index 100% rename from assets/2023/img/perros-salle.jpeg rename to archives/2023/img/perros-salle.jpeg diff --git a/archives/2023/img/perros-salle.webp b/archives/2023/img/perros-salle.webp new file mode 100644 index 0000000..5f0e84f Binary files /dev/null and b/archives/2023/img/perros-salle.webp differ diff --git a/assets/2023/img/speakers/alexandre.jpg b/archives/2023/img/speakers/alexandre.jpg similarity index 100% rename from assets/2023/img/speakers/alexandre.jpg rename to archives/2023/img/speakers/alexandre.jpg diff --git a/archives/2023/img/speakers/alexandre.webp b/archives/2023/img/speakers/alexandre.webp new file mode 100644 index 0000000..49b2776 Binary files /dev/null and b/archives/2023/img/speakers/alexandre.webp differ diff --git a/assets/2023/img/speakers/elea.jpg b/archives/2023/img/speakers/elea.jpg similarity index 100% rename from assets/2023/img/speakers/elea.jpg rename to archives/2023/img/speakers/elea.jpg diff --git a/archives/2023/img/speakers/elea.webp b/archives/2023/img/speakers/elea.webp new file mode 100644 index 0000000..ac6401d Binary files /dev/null and b/archives/2023/img/speakers/elea.webp differ diff --git a/assets/2023/img/speakers/julie.jpg b/archives/2023/img/speakers/julie.jpg similarity index 100% rename from assets/2023/img/speakers/julie.jpg rename to archives/2023/img/speakers/julie.jpg diff --git a/archives/2023/img/speakers/julie.webp b/archives/2023/img/speakers/julie.webp new file mode 100644 index 0000000..230ec6c Binary files /dev/null and b/archives/2023/img/speakers/julie.webp differ diff --git a/assets/2023/img/speakers/julien.png b/archives/2023/img/speakers/julien.png similarity index 100% rename from assets/2023/img/speakers/julien.png rename to archives/2023/img/speakers/julien.png diff --git a/archives/2023/img/speakers/julien.webp b/archives/2023/img/speakers/julien.webp new file mode 100644 index 0000000..6c3decf Binary files /dev/null and b/archives/2023/img/speakers/julien.webp differ diff --git a/assets/2023/img/speakers/liu.jpg b/archives/2023/img/speakers/liu.jpg similarity index 100% rename from assets/2023/img/speakers/liu.jpg rename to archives/2023/img/speakers/liu.jpg diff --git a/archives/2023/img/speakers/liu.webp b/archives/2023/img/speakers/liu.webp new file mode 100644 index 0000000..92eb218 Binary files /dev/null and b/archives/2023/img/speakers/liu.webp differ diff --git a/assets/2023/img/speakers/renaud.png b/archives/2023/img/speakers/renaud.png similarity index 100% rename from assets/2023/img/speakers/renaud.png rename to archives/2023/img/speakers/renaud.png diff --git a/archives/2023/img/speakers/renaud.webp b/archives/2023/img/speakers/renaud.webp new file mode 100644 index 0000000..b8006fa Binary files /dev/null and b/archives/2023/img/speakers/renaud.webp differ diff --git a/assets/2023/img/speakers/stephane.jpg b/archives/2023/img/speakers/stephane.jpg similarity index 100% rename from assets/2023/img/speakers/stephane.jpg rename to archives/2023/img/speakers/stephane.jpg diff --git a/archives/2023/img/speakers/stephane.webp b/archives/2023/img/speakers/stephane.webp new file mode 100644 index 0000000..5ec2269 Binary files /dev/null and b/archives/2023/img/speakers/stephane.webp differ diff --git a/assets/2023/img/speakers/thomas.jpg b/archives/2023/img/speakers/thomas.jpg similarity index 100% rename from assets/2023/img/speakers/thomas.jpg rename to archives/2023/img/speakers/thomas.jpg diff --git a/archives/2023/img/speakers/thomas.webp b/archives/2023/img/speakers/thomas.webp new file mode 100644 index 0000000..fd79426 Binary files /dev/null and b/archives/2023/img/speakers/thomas.webp differ diff --git a/assets/2023/img/speakers/tugdual.jpg b/archives/2023/img/speakers/tugdual.jpg similarity index 100% rename from assets/2023/img/speakers/tugdual.jpg rename to archives/2023/img/speakers/tugdual.jpg diff --git a/archives/2023/img/speakers/tugdual.webp b/archives/2023/img/speakers/tugdual.webp new file mode 100644 index 0000000..5e9c7b9 Binary files /dev/null and b/archives/2023/img/speakers/tugdual.webp differ diff --git a/assets/2023/img/twitter-square.jpg b/archives/2023/img/twitter-square.jpg similarity index 100% rename from assets/2023/img/twitter-square.jpg rename to archives/2023/img/twitter-square.jpg diff --git a/archives/2023/img/twitter-square.webp b/archives/2023/img/twitter-square.webp new file mode 100644 index 0000000..7a2253a Binary files /dev/null and b/archives/2023/img/twitter-square.webp differ diff --git a/assets/2023/img/twitter.png b/archives/2023/img/twitter.png similarity index 100% rename from assets/2023/img/twitter.png rename to archives/2023/img/twitter.png diff --git a/archives/2023/img/twitter.webp b/archives/2023/img/twitter.webp new file mode 100644 index 0000000..af53844 Binary files /dev/null and b/archives/2023/img/twitter.webp differ diff --git a/assets/2023/img/twitter2.png b/archives/2023/img/twitter2.png similarity index 100% rename from assets/2023/img/twitter2.png rename to archives/2023/img/twitter2.png diff --git a/archives/2023/img/twitter2.webp b/archives/2023/img/twitter2.webp new file mode 100644 index 0000000..32efcd1 Binary files /dev/null and b/archives/2023/img/twitter2.webp differ diff --git a/assets/2023/img/twitter3.png b/archives/2023/img/twitter3.png similarity index 100% rename from assets/2023/img/twitter3.png rename to archives/2023/img/twitter3.png diff --git a/archives/2023/img/twitter3.webp b/archives/2023/img/twitter3.webp new file mode 100644 index 0000000..40a5fe0 Binary files /dev/null and b/archives/2023/img/twitter3.webp differ diff --git a/assets/2023/img/twitter4.png b/archives/2023/img/twitter4.png similarity index 100% rename from assets/2023/img/twitter4.png rename to archives/2023/img/twitter4.png diff --git a/archives/2023/img/twitter4.webp b/archives/2023/img/twitter4.webp new file mode 100644 index 0000000..48ff164 Binary files /dev/null and b/archives/2023/img/twitter4.webp differ diff --git a/assets/2023/img/twitter5.png b/archives/2023/img/twitter5.png similarity index 100% rename from assets/2023/img/twitter5.png rename to archives/2023/img/twitter5.png diff --git a/archives/2023/img/twitter5.webp b/archives/2023/img/twitter5.webp new file mode 100644 index 0000000..4f4cc81 Binary files /dev/null and b/archives/2023/img/twitter5.webp differ diff --git a/assets/2023/index.html b/archives/2023/index.html similarity index 92% rename from assets/2023/index.html rename to archives/2023/index.html index 0d5089e..72aae44 100644 --- a/assets/2023/index.html +++ b/archives/2023/index.html @@ -15,19 +15,19 @@ - + - + - - - + + + @@ -39,17 +39,17 @@
    + + + + + + + + +
    +
    +
    +
    +
    +

    Speakers

    +
    +
    +
    + +
    +
    +
    + + Alain Buzacarro + +
    +
    +

    Alain Buzacarro

    +

    Instinct Pioneer

    +

    Après plusieurs expériences en tant que consultant dans des cabinets de conseil (notamment chez OCTO Technology), et un rôle de CTO chez France Télévision puis chez Les Furets, Alain Buzzacaro est resté plus de cinq ans Global CIO et membre du COMEX chez L'Occitane. Il est désormais consultant en transformation d'entreprise, Leadership Agile et Coach Exécutif chez Instinct Pionnier. +

    + + + +
    +
    +
    + +
    +
    +
    + + Hannah Issermann + +
    +
    +

    Hannah Issermann

    +

    Orange

    +

    Responsable d'équipe chez Orange Innovation, j'ai une formation de développeuse fullstack. Depuis 10 ans, je me suis spécialisée dans le développement web, et donc forcément dans l'accessibilité numérique. Je suis aujourd'hui Orange Expert Software et je participe au développement du design system unifié Orange. Je donne également des cours sur l'accessibilité numérique à l'IUT. +

    + + + +
    +
    +
    + +
    +
    +
    + + Christophe Milon + +
    +
    +

    Christophe Milon

    +

    Quanteo Group

    +

    Christophe Milon, ingénieur de formation et fils d’un inventeur, crée en 1998 à Lannion l’entreprise Éco‑Compteur à 33 ans, devenue Quanteo Group, leader mondial du comptage piétons et cyclistes. Fondateur et CEO, il a structuré le groupe autour de la transparence, de l’holacratie et d’un partage de l'actionnariat pour transmettre l’entreprise à ses équipes. +

    + + + +
    +
    +
    + +
    +
    +
    + + Stéphane Prohaszka + +
    +
    +

    Stéphane Prohaszka

    +

    Ledger

    +

    Stéphane est Senior Staff Architect chez Ledger depuis trois ans. Fort de 25 ans d’expérience dans des secteurs variés – de l’aérospatial aux startups en passant par le conseil – il a toujours exploré les enjeux techniques avec une curiosité insatiable. +Son parcours l’a conduit de la conception d’applications desktop à celle d’applications web, en passant par les mobiles, avant de s’orienter ses dernières années dans des environnements où la sécurité est critique. +

    + + + +
    +
    +
    + +
    +
    +
    + + Frédéric Bouchery + +
    +
    +

    Frédéric Bouchery

    +

    CCM Benchmark

    +

    Architecte et lead developer pour le groupe CCMBenchmark, Frédéric gère le pôle OpenData, qui met à disposition plus de 2 milliards de données à travers les sites du Journal du Net, Linternaute, Journal des Femmes et Le Figaro. L'ensemble des sites du groupe rassemble 33 millions de visiteurs uniques chaque mois, le tout en auto-hébergement et en ... PHP. Développeur depuis plus de 42 ans et amoureux du langage PHP depuis 27 ans, Frédéric aime parler, dans ses conférences et sur les réseaux sociaux, d'architecture, de méthodologie, de pragmatisme, de complexité, de simplicité, et de tout ce qui touche de près ou de loin au développement logiciel. Si vous avez des questions, il devrait pouvoir vous répondre. +Chaque ligne de code est une opportunité d'apprendre, de partager et d'innover ... +

    + + + +
    +
    +
    + +
    +
    +
    + + Pierrick Blons + +
    +
    +

    Pierrick Blons

    +

    Payfit

    +

    Avec plus de 15 ans d'expérience, notamment chez Microsoft, en sociétés de services et chez divers éditeurs, Pierrick est actuellement développeur chez PayFit. +Fortement impliqué dans la modernisation s'appuyant sur DDD, passionné de l’approche systémique et de open system theory, PayFit est un lieu idéal qui lui permet d’appliquer ces différents concepts avec les équipes R&D. +

    + + + +
    +
    +
    + +
    +
    +
    + + Isabelle Chanclou + +
    +
    +

    Isabelle Chanclou

    +

    Orange

    +

    Ergonome de formation, j’allie aujourd’hui développement web et accessibilité numérique chez Orange pour contribuer à rendre le numérique accessible à tous. Je donne notamment des cours sur l'accessibilité numérique à l'IUT. +

    + +
    +
    +
    + +
    +
    +
    + + Sébastien Ferrer + +
    +
    +

    Sébastien Ferrer

    +

    OVHcloud

    +

    Sébastien est ingénieur logiciel chez OVHcloud à Nantes, dans l'équipe SIA (Service Integration & Automation). Exerçant ce métier depuis maintenant plus de 12 ans, il a toujours aimé vulgariser et partager ses connaissances en public. +Il anime actuellement des conférences autour de la cybersécurité, de la gestion d'incidents et divers autres sujets techniques. Portant un grand intérêt pour l'enseignement, il intervient également régulièrement dans certaines écoles et universités. +Il est également passionné par le théâtre, ayant joué 10 ans dans une troupe en région parisienne. +

    + + + +
    +
    +
    + +
    +
    +
    + + Cédric Clavier + +
    +
    +

    Cédric Clavier

    +

    Groupe SII

    +

    Cédric Clavier est architecte logiciel au sein du Groupe SII à Lannion. Fort de plus de 15 ans d’expérience, il a évolué de développeur à chef de projet chez Saooti, avant de se spécialiser en architecture logicielle. Passionné, il enseigne également l’algorithmique et le développement web à l’ENSSAT. +

    + + + +
    +
    +
    + +
    +
    + + + + + + + + + +
    +
    +
    +
    +
    +

    Nos Partenaires

    +

    Merci à aux partenaires qui nous aident à réaliser cet événement dans les meilleures conditions. 🙏
    Vous souhaitez soutenir l'événement et bénéficier de la visibilité auprès de la communauté tech trégorroise ? Contactez-nous !

    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +

    + + Eco-compteur + +

    + +
    +
    +
    +
    +
    +
    +

    + + + Lannion Trégor Communauté + + + + Anticipa + + + + Ville de Perros-Guirec + + + + French Tech Brest Ouest + + +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    +
    +
    +
    +

    Restez informé des prochaines actus Code d'Armor

    +

    Si vous souhaitez en savoir plus sur Code d'Armor et être averti des prochains événements organisés par l'association et de ses actualités 👇️

    +

    + S'inscrire à la newsletter + + LinkedIn + Suivre la page LinkedIn + +

    +
    +
    +
    +
    + + + + + + +
    +
    +
    +
    +
    +

    🏪 Boutique en ligne

    +
    +
    +
    +
    +
    +
    +

    Découvrez les objets à l'image du DevFest Perros-Guirec : t-shirts, mugs, stickers et plus encore pour garder un souvenir de l'événement et soutenir l'association. Nous avons choisi de ne pas distribuer de goodies inutiles afin de conserver une empreinte environnementale raisonnable. Les articles proposés sont sélectionnés pour leur utilité et leur durabilité.

    +
    +
    +
    +
    +
    +
    + + + + + + + + Accéder à la boutique + +
    +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    +
    +

    Palais des Congrès de Perros-Guirec

    + 1 Rue du Maréchal Foch + Perros-Guirec +
    +
    + +
    +
    +
    +

    3 octobre 2025

    + accueil à 8h30, début à 9h00 +
    +
    + +
    +
    +
    +

    Ouvert à toutes et tous

    + dans la limite des places disponibles +
    +
    + +
    +
    +
    +

    Déjeuner inclus

    + pour se rencontrer et échanger tous ensemble ! +
    +
    +
    +
    +
    + + + +
    +
    +
    +
    + +
    +
    +
    +
    +

    Souvenirs de l'édition 2023

    +
    +
    +
    +
    +

    Revivez les meilleurs moments du DevFest Perros-Guirec 2023.

    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + + + + + +
    +
    +
    +
    + DevFestNoz logo +

    + Le DevFest Perros-Guirec est une conférence à destination des développeu.se.r.s organisée par l'association Code d'Armor. +

    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/archives/2025/devfest/redirects.json b/archives/2025/devfest/redirects.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/archives/2025/devfest/redirects.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/archives/2025/devfest/safari-pinned-tab.svg b/archives/2025/devfest/safari-pinned-tab.svg new file mode 100644 index 0000000..c8d4bb4 --- /dev/null +++ b/archives/2025/devfest/safari-pinned-tab.svg @@ -0,0 +1,57 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/archives/2025/devfest/site.webmanifest b/archives/2025/devfest/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/archives/2025/devfest/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/archives/2025/devfest/speaker-no-video.png b/archives/2025/devfest/speaker-no-video.png new file mode 100644 index 0000000..c1aa81a Binary files /dev/null and b/archives/2025/devfest/speaker-no-video.png differ diff --git a/archives/2025/devfest/speakers-desktop.png b/archives/2025/devfest/speakers-desktop.png new file mode 100644 index 0000000..912bb53 Binary files /dev/null and b/archives/2025/devfest/speakers-desktop.png differ diff --git a/archives/2025/devfest/speakers-mobile-video.png b/archives/2025/devfest/speakers-mobile-video.png new file mode 100644 index 0000000..63b0b1b Binary files /dev/null and b/archives/2025/devfest/speakers-mobile-video.png differ diff --git a/archives/2025/devfest/speakers-mobile-view.png b/archives/2025/devfest/speakers-mobile-view.png new file mode 100644 index 0000000..05b3871 Binary files /dev/null and b/archives/2025/devfest/speakers-mobile-view.png differ diff --git a/archives/2025/devfest/speakers-mobile.png b/archives/2025/devfest/speakers-mobile.png new file mode 100644 index 0000000..8302618 Binary files /dev/null and b/archives/2025/devfest/speakers-mobile.png differ diff --git a/archives/2025/devfest/sponsors.html b/archives/2025/devfest/sponsors.html new file mode 100644 index 0000000..e593d7d --- /dev/null +++ b/archives/2025/devfest/sponsors.html @@ -0,0 +1,454 @@ + + + + + + + + + + + + + + + + + + + + + + + Nous soutenir + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + +
    +
    +
    +
    + + + + + +
    +
    +
    +
    +

    Nous contacter

    +

    Vous souhaitez nous soutenir ?
    Contactez-nous pour discuter de vos idées ! 👉 contact@codedarmor.fr

    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + DevFestNoz logo +

    + Le DevFest Perros-Guirec est une conférence à destination des développeu.se.r.s organisée par l'association Code d'Armor. +

    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/archives/2025/devfestnoz/speakers/cuihtlauac.webp b/archives/2025/devfestnoz/speakers/cuihtlauac.webp new file mode 100644 index 0000000..1d95f8a Binary files /dev/null and b/archives/2025/devfestnoz/speakers/cuihtlauac.webp differ diff --git a/archives/2025/devfestnoz/speakers/mathieu.webp b/archives/2025/devfestnoz/speakers/mathieu.webp new file mode 100644 index 0000000..cc29eeb Binary files /dev/null and b/archives/2025/devfestnoz/speakers/mathieu.webp differ diff --git a/archives/2025/photos_event_old/20251003_100241.jpg b/archives/2025/photos_event_old/20251003_100241.jpg new file mode 100644 index 0000000..ceadb4e Binary files /dev/null and b/archives/2025/photos_event_old/20251003_100241.jpg differ diff --git a/archives/2025/photos_event_old/20251003_100241.webp b/archives/2025/photos_event_old/20251003_100241.webp new file mode 100644 index 0000000..b05d18e Binary files /dev/null and b/archives/2025/photos_event_old/20251003_100241.webp differ diff --git a/archives/2025/photos_event_old/20251003_153358.jpg b/archives/2025/photos_event_old/20251003_153358.jpg new file mode 100644 index 0000000..ba919a8 Binary files /dev/null and b/archives/2025/photos_event_old/20251003_153358.jpg differ diff --git a/archives/2025/photos_event_old/20251003_153358.webp b/archives/2025/photos_event_old/20251003_153358.webp new file mode 100644 index 0000000..a36e652 Binary files /dev/null and b/archives/2025/photos_event_old/20251003_153358.webp differ diff --git a/archives/2025/photos_event_old/P1030411.jpg b/archives/2025/photos_event_old/P1030411.jpg new file mode 100644 index 0000000..0e520d2 Binary files /dev/null and b/archives/2025/photos_event_old/P1030411.jpg differ diff --git a/archives/2025/photos_event_old/P1030411.webp b/archives/2025/photos_event_old/P1030411.webp new file mode 100644 index 0000000..4069f91 Binary files /dev/null and b/archives/2025/photos_event_old/P1030411.webp differ diff --git a/archives/2025/photos_event_old/P1030435.jpg b/archives/2025/photos_event_old/P1030435.jpg new file mode 100644 index 0000000..8a09994 Binary files /dev/null and b/archives/2025/photos_event_old/P1030435.jpg differ diff --git a/archives/2025/photos_event_old/P1030435.webp b/archives/2025/photos_event_old/P1030435.webp new file mode 100644 index 0000000..6eeb747 Binary files /dev/null and b/archives/2025/photos_event_old/P1030435.webp differ diff --git a/archives/2025/photos_event_old/P1030460.jpg b/archives/2025/photos_event_old/P1030460.jpg new file mode 100644 index 0000000..f6029a9 Binary files /dev/null and b/archives/2025/photos_event_old/P1030460.jpg differ diff --git a/archives/2025/photos_event_old/P1030460.webp b/archives/2025/photos_event_old/P1030460.webp new file mode 100644 index 0000000..a17d8b3 Binary files /dev/null and b/archives/2025/photos_event_old/P1030460.webp differ diff --git a/archives/2025/photos_event_old/P1030566.jpg b/archives/2025/photos_event_old/P1030566.jpg new file mode 100644 index 0000000..14d74d3 Binary files /dev/null and b/archives/2025/photos_event_old/P1030566.jpg differ diff --git a/archives/2025/photos_event_old/P1030566.webp b/archives/2025/photos_event_old/P1030566.webp new file mode 100644 index 0000000..21396ec Binary files /dev/null and b/archives/2025/photos_event_old/P1030566.webp differ diff --git a/archives/2025/photos_event_old/P1030612.jpg b/archives/2025/photos_event_old/P1030612.jpg new file mode 100644 index 0000000..105264c Binary files /dev/null and b/archives/2025/photos_event_old/P1030612.jpg differ diff --git a/archives/2025/photos_event_old/P1030612.webp b/archives/2025/photos_event_old/P1030612.webp new file mode 100644 index 0000000..0f9116e Binary files /dev/null and b/archives/2025/photos_event_old/P1030612.webp differ diff --git a/archives/2025/photos_event_old/P1030723.jpg b/archives/2025/photos_event_old/P1030723.jpg new file mode 100644 index 0000000..907f379 Binary files /dev/null and b/archives/2025/photos_event_old/P1030723.jpg differ diff --git a/archives/2025/photos_event_old/P1030723.webp b/archives/2025/photos_event_old/P1030723.webp new file mode 100644 index 0000000..e97eb90 Binary files /dev/null and b/archives/2025/photos_event_old/P1030723.webp differ diff --git a/archives/2025/photos_event_old/P1030879.jpg b/archives/2025/photos_event_old/P1030879.jpg new file mode 100644 index 0000000..9b3b75b Binary files /dev/null and b/archives/2025/photos_event_old/P1030879.jpg differ diff --git a/archives/2025/photos_event_old/P1030879.webp b/archives/2025/photos_event_old/P1030879.webp new file mode 100644 index 0000000..0aa1285 Binary files /dev/null and b/archives/2025/photos_event_old/P1030879.webp differ diff --git a/archives/2025/photos_event_old/P1030901.jpg b/archives/2025/photos_event_old/P1030901.jpg new file mode 100644 index 0000000..7c6c4e8 Binary files /dev/null and b/archives/2025/photos_event_old/P1030901.jpg differ diff --git a/archives/2025/photos_event_old/P1030901.webp b/archives/2025/photos_event_old/P1030901.webp new file mode 100644 index 0000000..f9dbdd3 Binary files /dev/null and b/archives/2025/photos_event_old/P1030901.webp differ diff --git a/archives/2025/photos_event_old/P1030915.jpg b/archives/2025/photos_event_old/P1030915.jpg new file mode 100644 index 0000000..d355acf Binary files /dev/null and b/archives/2025/photos_event_old/P1030915.jpg differ diff --git a/archives/2025/photos_event_old/P1030915.webp b/archives/2025/photos_event_old/P1030915.webp new file mode 100644 index 0000000..dd48e5b Binary files /dev/null and b/archives/2025/photos_event_old/P1030915.webp differ diff --git a/archives/2025/photos_event_old/P1030989.jpg b/archives/2025/photos_event_old/P1030989.jpg new file mode 100644 index 0000000..dfb42f5 Binary files /dev/null and b/archives/2025/photos_event_old/P1030989.jpg differ diff --git a/archives/2025/photos_event_old/P1030989.webp b/archives/2025/photos_event_old/P1030989.webp new file mode 100644 index 0000000..95e178d Binary files /dev/null and b/archives/2025/photos_event_old/P1030989.webp differ diff --git a/archives/2025/photos_event_old/P1040064.jpg b/archives/2025/photos_event_old/P1040064.jpg new file mode 100644 index 0000000..ea0576c Binary files /dev/null and b/archives/2025/photos_event_old/P1040064.jpg differ diff --git a/archives/2025/photos_event_old/P1040064.webp b/archives/2025/photos_event_old/P1040064.webp new file mode 100644 index 0000000..fc94caf Binary files /dev/null and b/archives/2025/photos_event_old/P1040064.webp differ diff --git a/archives/2025/photos_event_old/P1040076.jpg b/archives/2025/photos_event_old/P1040076.jpg new file mode 100644 index 0000000..dd5b334 Binary files /dev/null and b/archives/2025/photos_event_old/P1040076.jpg differ diff --git a/archives/2025/photos_event_old/P1040076.webp b/archives/2025/photos_event_old/P1040076.webp new file mode 100644 index 0000000..96ace33 Binary files /dev/null and b/archives/2025/photos_event_old/P1040076.webp differ diff --git a/archives/2025/photos_event_old/P1040112.jpg b/archives/2025/photos_event_old/P1040112.jpg new file mode 100644 index 0000000..117731b Binary files /dev/null and b/archives/2025/photos_event_old/P1040112.jpg differ diff --git a/archives/2025/photos_event_old/P1040112.webp b/archives/2025/photos_event_old/P1040112.webp new file mode 100644 index 0000000..6bb7ae5 Binary files /dev/null and b/archives/2025/photos_event_old/P1040112.webp differ diff --git a/archives/2025/photos_event_old/P1040144.jpg b/archives/2025/photos_event_old/P1040144.jpg new file mode 100644 index 0000000..b7d212a Binary files /dev/null and b/archives/2025/photos_event_old/P1040144.jpg differ diff --git a/archives/2025/photos_event_old/P1040144.webp b/archives/2025/photos_event_old/P1040144.webp new file mode 100644 index 0000000..1554075 Binary files /dev/null and b/archives/2025/photos_event_old/P1040144.webp differ diff --git a/archives/2025/photos_speakers_old/107-milon-christophe-2.jpg b/archives/2025/photos_speakers_old/107-milon-christophe-2.jpg new file mode 100644 index 0000000..8982cd8 Binary files /dev/null and b/archives/2025/photos_speakers_old/107-milon-christophe-2.jpg differ diff --git a/archives/2025/photos_speakers_old/107-milon-christophe-2.webp b/archives/2025/photos_speakers_old/107-milon-christophe-2.webp new file mode 100644 index 0000000..49477c4 Binary files /dev/null and b/archives/2025/photos_speakers_old/107-milon-christophe-2.webp differ diff --git a/archives/2025/photos_speakers_old/ABU.jpg b/archives/2025/photos_speakers_old/ABU.jpg new file mode 100644 index 0000000..9ed3c4a Binary files /dev/null and b/archives/2025/photos_speakers_old/ABU.jpg differ diff --git a/archives/2025/photos_speakers_old/ABU.webp b/archives/2025/photos_speakers_old/ABU.webp new file mode 100644 index 0000000..e4b945d Binary files /dev/null and b/archives/2025/photos_speakers_old/ABU.webp differ diff --git a/archives/2025/photos_speakers_old/cedric_clavier.jpg b/archives/2025/photos_speakers_old/cedric_clavier.jpg new file mode 100644 index 0000000..a98d203 Binary files /dev/null and b/archives/2025/photos_speakers_old/cedric_clavier.jpg differ diff --git a/archives/2025/photos_speakers_old/cedric_clavier.webp b/archives/2025/photos_speakers_old/cedric_clavier.webp new file mode 100644 index 0000000..1dd91a9 Binary files /dev/null and b/archives/2025/photos_speakers_old/cedric_clavier.webp differ diff --git a/archives/2025/photos_speakers_old/cuihtlauac.jpg b/archives/2025/photos_speakers_old/cuihtlauac.jpg new file mode 100644 index 0000000..a182749 Binary files /dev/null and b/archives/2025/photos_speakers_old/cuihtlauac.jpg differ diff --git a/archives/2025/photos_speakers_old/cuihtlauac.webp b/archives/2025/photos_speakers_old/cuihtlauac.webp new file mode 100644 index 0000000..37268fc Binary files /dev/null and b/archives/2025/photos_speakers_old/cuihtlauac.webp differ diff --git a/archives/2025/photos_speakers_old/frederic-bouchery-2024.webp b/archives/2025/photos_speakers_old/frederic-bouchery-2024.webp new file mode 100644 index 0000000..53b6b12 Binary files /dev/null and b/archives/2025/photos_speakers_old/frederic-bouchery-2024.webp differ diff --git a/archives/2025/photos_speakers_old/hannah-isserman.jpg b/archives/2025/photos_speakers_old/hannah-isserman.jpg new file mode 100644 index 0000000..e87eddc Binary files /dev/null and b/archives/2025/photos_speakers_old/hannah-isserman.jpg differ diff --git a/archives/2025/photos_speakers_old/hannah-isserman.webp b/archives/2025/photos_speakers_old/hannah-isserman.webp new file mode 100644 index 0000000..deb1646 Binary files /dev/null and b/archives/2025/photos_speakers_old/hannah-isserman.webp differ diff --git a/archives/2025/photos_speakers_old/isabelle-chanclou.jpg b/archives/2025/photos_speakers_old/isabelle-chanclou.jpg new file mode 100644 index 0000000..c00f611 Binary files /dev/null and b/archives/2025/photos_speakers_old/isabelle-chanclou.jpg differ diff --git a/archives/2025/photos_speakers_old/isabelle-chanclou.webp b/archives/2025/photos_speakers_old/isabelle-chanclou.webp new file mode 100644 index 0000000..9977a9d Binary files /dev/null and b/archives/2025/photos_speakers_old/isabelle-chanclou.webp differ diff --git a/archives/2025/photos_speakers_old/pierrick-blons.jpg b/archives/2025/photos_speakers_old/pierrick-blons.jpg new file mode 100644 index 0000000..ff112c7 Binary files /dev/null and b/archives/2025/photos_speakers_old/pierrick-blons.jpg differ diff --git a/archives/2025/photos_speakers_old/pierrick-blons.webp b/archives/2025/photos_speakers_old/pierrick-blons.webp new file mode 100644 index 0000000..5837d22 Binary files /dev/null and b/archives/2025/photos_speakers_old/pierrick-blons.webp differ diff --git a/archives/2025/photos_speakers_old/sebastien ferrer.jpg b/archives/2025/photos_speakers_old/sebastien ferrer.jpg new file mode 100644 index 0000000..c1a26f9 Binary files /dev/null and b/archives/2025/photos_speakers_old/sebastien ferrer.jpg differ diff --git a/archives/2025/photos_speakers_old/sebastien ferrer.webp b/archives/2025/photos_speakers_old/sebastien ferrer.webp new file mode 100644 index 0000000..466efc7 Binary files /dev/null and b/archives/2025/photos_speakers_old/sebastien ferrer.webp differ diff --git a/archives/2025/photos_speakers_old/stephane-pro.jpg b/archives/2025/photos_speakers_old/stephane-pro.jpg new file mode 100644 index 0000000..a1a9b51 Binary files /dev/null and b/archives/2025/photos_speakers_old/stephane-pro.jpg differ diff --git a/archives/2025/photos_speakers_old/stephane-pro.webp b/archives/2025/photos_speakers_old/stephane-pro.webp new file mode 100644 index 0000000..8cd8685 Binary files /dev/null and b/archives/2025/photos_speakers_old/stephane-pro.webp differ diff --git a/archives/bugbust.tar.gz b/archives/bugbust.tar.gz new file mode 100644 index 0000000..def13c0 Binary files /dev/null and b/archives/bugbust.tar.gz differ diff --git a/archives/slidedecks/Amazon Web Services.pdf b/archives/slidedecks/Amazon Web Services.pdf new file mode 100644 index 0000000..1675abd Binary files /dev/null and b/archives/slidedecks/Amazon Web Services.pdf differ diff --git a/archives/slidedecks/Android Things.pdf b/archives/slidedecks/Android Things.pdf new file mode 100644 index 0000000..1942f29 Binary files /dev/null and b/archives/slidedecks/Android Things.pdf differ diff --git a/archives/slidedecks/Android.pdf b/archives/slidedecks/Android.pdf new file mode 100644 index 0000000..418f8a0 Binary files /dev/null and b/archives/slidedecks/Android.pdf differ diff --git a/archives/slidedecks/Angular JS.pdf b/archives/slidedecks/Angular JS.pdf new file mode 100644 index 0000000..597cc7d Binary files /dev/null and b/archives/slidedecks/Angular JS.pdf differ diff --git a/archives/slidedecks/Backbone JS.pdf b/archives/slidedecks/Backbone JS.pdf new file mode 100644 index 0000000..7b04775 Binary files /dev/null and b/archives/slidedecks/Backbone JS.pdf differ diff --git a/archives/slidedecks/Blockchains.pdf b/archives/slidedecks/Blockchains.pdf new file mode 100644 index 0000000..67bef86 Binary files /dev/null and b/archives/slidedecks/Blockchains.pdf differ diff --git a/archives/slidedecks/Coding Kids.pdf b/archives/slidedecks/Coding Kids.pdf new file mode 100644 index 0000000..16adda3 Binary files /dev/null and b/archives/slidedecks/Coding Kids.pdf differ diff --git a/archives/slidedecks/Cryptomonnaies (Libre en Fete 2018).pdf b/archives/slidedecks/Cryptomonnaies (Libre en Fete 2018).pdf new file mode 100644 index 0000000..9adab2c Binary files /dev/null and b/archives/slidedecks/Cryptomonnaies (Libre en Fete 2018).pdf differ diff --git a/archives/slidedecks/Dapps.pdf b/archives/slidedecks/Dapps.pdf new file mode 100644 index 0000000..7a63526 Binary files /dev/null and b/archives/slidedecks/Dapps.pdf differ diff --git a/archives/slidedecks/Docker.pdf b/archives/slidedecks/Docker.pdf new file mode 100644 index 0000000..3de03c9 Binary files /dev/null and b/archives/slidedecks/Docker.pdf differ diff --git a/archives/slidedecks/Gitlab CI.pdf b/archives/slidedecks/Gitlab CI.pdf new file mode 100644 index 0000000..34045b1 Binary files /dev/null and b/archives/slidedecks/Gitlab CI.pdf differ diff --git a/archives/slidedecks/Go.pdf b/archives/slidedecks/Go.pdf new file mode 100644 index 0000000..b6a1642 Binary files /dev/null and b/archives/slidedecks/Go.pdf differ diff --git a/archives/slidedecks/Google Glass.pdf b/archives/slidedecks/Google Glass.pdf new file mode 100644 index 0000000..255cb32 Binary files /dev/null and b/archives/slidedecks/Google Glass.pdf differ diff --git a/archives/slidedecks/Grunt.pdf b/archives/slidedecks/Grunt.pdf new file mode 100644 index 0000000..94336ef Binary files /dev/null and b/archives/slidedecks/Grunt.pdf differ diff --git a/archives/slidedecks/Ionic.pdf b/archives/slidedecks/Ionic.pdf new file mode 100644 index 0000000..5a98ff4 Binary files /dev/null and b/archives/slidedecks/Ionic.pdf differ diff --git a/archives/slidedecks/Java 9 et 10.pdf b/archives/slidedecks/Java 9 et 10.pdf new file mode 100644 index 0000000..957eda7 Binary files /dev/null and b/archives/slidedecks/Java 9 et 10.pdf differ diff --git a/archives/slidedecks/Kotlin.pdf b/archives/slidedecks/Kotlin.pdf new file mode 100644 index 0000000..54a8c74 Binary files /dev/null and b/archives/slidedecks/Kotlin.pdf differ diff --git a/archives/slidedecks/Kubernetes.pdf b/archives/slidedecks/Kubernetes.pdf new file mode 100644 index 0000000..48df046 Binary files /dev/null and b/archives/slidedecks/Kubernetes.pdf differ diff --git a/archives/slidedecks/Lua.pdf b/archives/slidedecks/Lua.pdf new file mode 100644 index 0000000..466d235 Binary files /dev/null and b/archives/slidedecks/Lua.pdf differ diff --git a/archives/slidedecks/Machine Learning.pdf b/archives/slidedecks/Machine Learning.pdf new file mode 100644 index 0000000..35d7471 Binary files /dev/null and b/archives/slidedecks/Machine Learning.pdf differ diff --git a/archives/slidedecks/OS mobiles alternatifs.pdf b/archives/slidedecks/OS mobiles alternatifs.pdf new file mode 100644 index 0000000..e225436 Binary files /dev/null and b/archives/slidedecks/OS mobiles alternatifs.pdf differ diff --git a/archives/slidedecks/OpenStreetMap.pdf b/archives/slidedecks/OpenStreetMap.pdf new file mode 100644 index 0000000..1bf6b93 Binary files /dev/null and b/archives/slidedecks/OpenStreetMap.pdf differ diff --git a/archives/slidedecks/PaaS Google.pdf b/archives/slidedecks/PaaS Google.pdf new file mode 100644 index 0000000..0c850a1 Binary files /dev/null and b/archives/slidedecks/PaaS Google.pdf differ diff --git a/archives/slidedecks/Qt.pdf b/archives/slidedecks/Qt.pdf new file mode 100644 index 0000000..7b5e883 Binary files /dev/null and b/archives/slidedecks/Qt.pdf differ diff --git a/archives/slidedecks/Rails.pdf b/archives/slidedecks/Rails.pdf new file mode 100644 index 0000000..2f9e1f1 Binary files /dev/null and b/archives/slidedecks/Rails.pdf differ diff --git a/archives/slidedecks/Rancher.pdf b/archives/slidedecks/Rancher.pdf new file mode 100644 index 0000000..31357f8 Binary files /dev/null and b/archives/slidedecks/Rancher.pdf differ diff --git a/archives/slidedecks/Service Workers.pdf b/archives/slidedecks/Service Workers.pdf new file mode 100644 index 0000000..c148a5b Binary files /dev/null and b/archives/slidedecks/Service Workers.pdf differ diff --git a/archives/slidedecks/Slices.pdf b/archives/slidedecks/Slices.pdf new file mode 100644 index 0000000..3fd29a5 Binary files /dev/null and b/archives/slidedecks/Slices.pdf differ diff --git a/archives/slidedecks/Symfony4.pdf b/archives/slidedecks/Symfony4.pdf new file mode 100644 index 0000000..11f9370 Binary files /dev/null and b/archives/slidedecks/Symfony4.pdf differ diff --git a/archives/slidedecks/Tapster.pdf b/archives/slidedecks/Tapster.pdf new file mode 100644 index 0000000..32dc52a Binary files /dev/null and b/archives/slidedecks/Tapster.pdf differ diff --git a/archives/slidedecks/Tests.pdf b/archives/slidedecks/Tests.pdf new file mode 100644 index 0000000..ca2abc0 Binary files /dev/null and b/archives/slidedecks/Tests.pdf differ diff --git a/archives/slidedecks/Time Series.pdf b/archives/slidedecks/Time Series.pdf new file mode 100644 index 0000000..5d1584e Binary files /dev/null and b/archives/slidedecks/Time Series.pdf differ diff --git a/archives/slidedecks/WebRTC.pdf b/archives/slidedecks/WebRTC.pdf new file mode 100644 index 0000000..355d37a Binary files /dev/null and b/archives/slidedecks/WebRTC.pdf differ diff --git a/archives/slidedecks/iOS8.pdf b/archives/slidedecks/iOS8.pdf new file mode 100644 index 0000000..2576d5a Binary files /dev/null and b/archives/slidedecks/iOS8.pdf differ diff --git a/archives/slidedecks/latence.pdf b/archives/slidedecks/latence.pdf new file mode 100644 index 0000000..4854196 Binary files /dev/null and b/archives/slidedecks/latence.pdf differ diff --git a/assets/2021/themes/hugo-conference/LICENSE b/assets/2021/themes/hugo-conference/LICENSE deleted file mode 100644 index cad5560..0000000 --- a/assets/2021/themes/hugo-conference/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017 Jonhnny Weslley - -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. diff --git a/assets/2021/themes/hugo-conference/README.md b/assets/2021/themes/hugo-conference/README.md deleted file mode 100644 index c009f99..0000000 --- a/assets/2021/themes/hugo-conference/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Hugo conference - -Hugo conference is a theme for conferences/events based on the original [conf-boilerplate theme](https://github.com/braziljs/conf-boilerplate/) by [BrazilJS Foundation](http://braziljs.org/) and his many contributors. - -## Building my conference site from scratch - -1. Install [Hugo](https://gohugo.io) -2. Create a new site by running: - - hugo new site my-conf - cd my-conf - git clone https://github.com/jweslley/hugo-conference themes/hugo-conference - rm -f config.toml - cp themes/hugo-conference/exampleSite/config.yml . - -3. It's done. Just start Hugo server to see it live! - - hugo server --watch - - -## Customizing the site - -All the site information can be found in the `config.yml` file. Just edit it to make changes. -By default, the site have the following sections: - -- About - to describe what's the main goal of your event. -- Location - to show where it's going to happen through Google Maps. -- Speakers - to list information about speakers. -- Schedule - to show the agenda. -- Sponsors - to show the brand of your sponsors. -- Partners - to show the brand of your partners. - -Ps: It's important to change the `baseurl` property from `config.yml` file in order to reflect your settings. - -### Google Maps - -Google now requires a Google Maps JavaScript API Key to show maps. You can obtain your key [here](https://developers.google.com/maps/documentation/javascript/get-api-key). Then set your API key in the `GoogleMapsKey` param in the `config.yml` file. - -## License - -MIT, see [LICENSE](https://github.com/jweslley/hugo-conference/blob/master/LICENSE). - diff --git a/assets/2021/themes/hugo-conference/exampleSite/config.yml b/assets/2021/themes/hugo-conference/exampleSite/config.yml deleted file mode 100644 index 948c798..0000000 --- a/assets/2021/themes/hugo-conference/exampleSite/config.yml +++ /dev/null @@ -1,148 +0,0 @@ -baseurl: "https://example.org/" -title: "Conference name" -canonifyurls: true -theme: "hugo-conference" - -GoogleAnalytics: "" - -params: - # Conference info - Name: "Conference name" - Description: "Conference description" - Date: "November 15" - Price: "Only $100" # If your event is free, just comment this line - Venue: "Coco Bongo" - Address: "Boulevard Kukulcan, 30" - City: "Cancún" - State: "Quintana" - Images: ["/img/badge.jpg"] - GoogleMapsKey: "my-secret-maps-key" - - # Active sections on the website to deactivate comment out with '#' - # you can also change order here and it will reflect on page - Sections: - - about - - location - - speakers - - schedule - - sponsors - - partners - #- contact - - # Titles which you can translate to other languages - Titles: - about: "About" - location: "Location" - speakers: "Speakers" - schedule: "Schedule" - sponsors: "Sponsors" - partners: "Partners" - contact: "Contact" - - # The Call To Action button at the header, - # If you don't want this, just remove the callToAction property. - CallToAction: - text: "Register now!" - link: "http://register.example.com" - - # Fork me on GitHub, if you don't want this, just remove the forkButton property - ForkButton: - repository: "https://github.com/jweslley/hugo-conference/" - - # List of Sponsors - Sponsors: - - name: "Hugo" - logo: "/img/hugo.png" - url: "http://gohugo.io" - - # List of Partners - Partners: - - name: "Hugo" - logo: "/img/hugo.jpg" - url: "https://gohugo.io" - - name: "BrazilJS" - logo: "/img/partner.png" - url: "http://braziljs.org" - - # The entire schedule - Schedule: - - name: "Check-in / Breakfast" - time: "9h00" - - - name: "Linus Torvalds" - photo: "/img/speaker.jpg" - bio: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - company: "Linux Foundation" - link: - href: "http://twitter.com/linus" - text: "@linus" - presentation: - title: "Digging into a Linux Kernel" - description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - time: "10h00" - - - name: "Bill Gates" - photo: "/img/speaker.jpg" - bio: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - company: "Microsoft" - link: - href: "http://github.com/billy95" - text: "@billy95" - presentation: - title: "Introducing Windows 12" - description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - time: "11h00" - - - name: "Lunch" - time: "12h00" - - - name: "Chuck Norris" - photo: "/img/speaker.jpg" - bio: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - company: "Delta Command" - link: - href: "http://twitter.com/littlechuck" - text: "@littlechuck" - presentation: - title: "How to kill a elephant with one finger" - description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - time: "13h00" - - - name: "Steve Jobs" - photo: "/img/speaker.jpg" - bio: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - company: "Apple, Inc." - link: - href: "http://github.com/stevie" - text: "@stevie" - presentation: - title: "Presenting iPad" - description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - time: "14h00" - - - name: "Coffee-break" - time: "15h00" - - - name: "Mark Zuckerberg" - photo: "/img/speaker.jpg" - bio: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - company: "Facebook" - link: - href: "http://twitter.com/zuck" - text: "@zuck" - presentation: - title: "Revealing Facebook Secrets" - description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - time: "16h00" - - - name: "Steve Wozniak" - photo: "/img/speaker.jpg" - bio: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - company: "Apple, Inc." - link: - href: "http://twitter.com/woz" - text: "@woz" - presentation: - title: "Why do I prefer Android over iPhone" - description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" - time: "17h00" diff --git a/assets/2021/themes/hugo-conference/exampleSite/content/.keep b/assets/2021/themes/hugo-conference/exampleSite/content/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/assets/2021/themes/hugo-conference/exampleSite/static/img/apple-touch-icon.png b/assets/2021/themes/hugo-conference/exampleSite/static/img/apple-touch-icon.png deleted file mode 100644 index 647666b..0000000 Binary files a/assets/2021/themes/hugo-conference/exampleSite/static/img/apple-touch-icon.png and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/exampleSite/static/img/badge.jpg b/assets/2021/themes/hugo-conference/exampleSite/static/img/badge.jpg deleted file mode 100644 index 8a82aab..0000000 Binary files a/assets/2021/themes/hugo-conference/exampleSite/static/img/badge.jpg and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/exampleSite/static/img/cover.jpg b/assets/2021/themes/hugo-conference/exampleSite/static/img/cover.jpg deleted file mode 100644 index 40494d3..0000000 Binary files a/assets/2021/themes/hugo-conference/exampleSite/static/img/cover.jpg and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/exampleSite/static/img/favicon.ico b/assets/2021/themes/hugo-conference/exampleSite/static/img/favicon.ico deleted file mode 100644 index 18c8908..0000000 Binary files a/assets/2021/themes/hugo-conference/exampleSite/static/img/favicon.ico and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/exampleSite/static/img/hugo.jpg b/assets/2021/themes/hugo-conference/exampleSite/static/img/hugo.jpg deleted file mode 100644 index 6c3af5e..0000000 Binary files a/assets/2021/themes/hugo-conference/exampleSite/static/img/hugo.jpg and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/exampleSite/static/img/hugo.png b/assets/2021/themes/hugo-conference/exampleSite/static/img/hugo.png deleted file mode 100644 index 50e23ce..0000000 Binary files a/assets/2021/themes/hugo-conference/exampleSite/static/img/hugo.png and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/exampleSite/static/img/partner.png b/assets/2021/themes/hugo-conference/exampleSite/static/img/partner.png deleted file mode 100644 index f0fe2c7..0000000 Binary files a/assets/2021/themes/hugo-conference/exampleSite/static/img/partner.png and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/exampleSite/static/img/speaker.jpg b/assets/2021/themes/hugo-conference/exampleSite/static/img/speaker.jpg deleted file mode 100644 index 2663668..0000000 Binary files a/assets/2021/themes/hugo-conference/exampleSite/static/img/speaker.jpg and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/exampleSite/static/img/your-logo.jpg b/assets/2021/themes/hugo-conference/exampleSite/static/img/your-logo.jpg deleted file mode 100644 index 6c8d070..0000000 Binary files a/assets/2021/themes/hugo-conference/exampleSite/static/img/your-logo.jpg and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/images/screenshot.png b/assets/2021/themes/hugo-conference/images/screenshot.png deleted file mode 100644 index baab8d9..0000000 Binary files a/assets/2021/themes/hugo-conference/images/screenshot.png and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/images/tn.png b/assets/2021/themes/hugo-conference/images/tn.png deleted file mode 100644 index b04bdb4..0000000 Binary files a/assets/2021/themes/hugo-conference/images/tn.png and /dev/null differ diff --git a/assets/2021/themes/hugo-conference/layouts/index.html b/assets/2021/themes/hugo-conference/layouts/index.html deleted file mode 100644 index 5202808..0000000 --- a/assets/2021/themes/hugo-conference/layouts/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - {{ .Site.Params.Name }} - - - - - - - - {{ .Hugo.Generator }} - {{ template "_internal/opengraph.html" . }} - {{ template "_internal/twitter_cards.html" . }} - - - - - - - - -
    - - {{ partial "nav.html" . }} - {{ partial "header.html" .Site.Params }} - -
    -
    - {{ range $section := .Site.Params.Sections }} -
    - {{ partial $section $.Site.Params }} -
    - {{ end }} - - -
    -
    -
    - - - - {{ if isset .Site.Params "address" }} - {{ with .Site.Params.GoogleMapsKey }} - - - {{ end }} - {{ end }} - {{ template "_internal/google_analytics_async.html" . }} - - diff --git a/assets/2021/themes/hugo-conference/layouts/partials/about.html b/assets/2021/themes/hugo-conference/layouts/partials/about.html deleted file mode 100644 index 27a9189..0000000 --- a/assets/2021/themes/hugo-conference/layouts/partials/about.html +++ /dev/null @@ -1,7 +0,0 @@ -

    {{ .titles.about }}

    - -

    So you want to organize a conference? That's pretty awesome! But we know that you don't have time to create the website, since you have to worry about contacting sponsors, choosing the right place, buying airplane tickets for speakers and many other things.

    - -

    That's why we created this project! Conf Boilerplate is an iniciative of BrazilJS Foundation that provides a simple structure built on top of Docpad, a static generator in NodeJS, with all the things you need to create a event. We also provide a responsive template with i18n!

    - -

    This is just a live demo, check our repository on Github for more details =D

    diff --git a/assets/2021/themes/hugo-conference/layouts/partials/contact.html b/assets/2021/themes/hugo-conference/layouts/partials/contact.html deleted file mode 100644 index 2f23241..0000000 --- a/assets/2021/themes/hugo-conference/layouts/partials/contact.html +++ /dev/null @@ -1,18 +0,0 @@ -

    {{ .titles.contact }}

    - -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis ducimus neque amet corrupti ex temporibus similique.

    -
    -
    - - -
    -
    - - -
    -
    - - -
    - -
    diff --git a/assets/2021/themes/hugo-conference/layouts/partials/header.html b/assets/2021/themes/hugo-conference/layouts/partials/header.html deleted file mode 100644 index fa7ebed..0000000 --- a/assets/2021/themes/hugo-conference/layouts/partials/header.html +++ /dev/null @@ -1,26 +0,0 @@ -{{ with .forkbutton }} - - Fork me on GitHub - -{{ end }} - -
    -
    -

    - {{ .name }} -

    -

    {{ .date }}, {{ .venue }}, {{ .city }}

    - -
    - {{ with .price }} - {{ . }} - {{ end }} - - {{ with .calltoaction }} - {{ .text }} - {{ end }} -
    -
    -
    - -
    diff --git a/assets/2021/themes/hugo-conference/layouts/partials/location.html b/assets/2021/themes/hugo-conference/layouts/partials/location.html deleted file mode 100644 index cafd122..0000000 --- a/assets/2021/themes/hugo-conference/layouts/partials/location.html +++ /dev/null @@ -1,9 +0,0 @@ -

    {{ .titles.location }}

    - -

    - {{ .address }}. - {{ .city }}, - {{ .state }} -

    - -
    diff --git a/assets/2021/themes/hugo-conference/layouts/partials/nav.html b/assets/2021/themes/hugo-conference/layouts/partials/nav.html deleted file mode 100644 index 782d74f..0000000 --- a/assets/2021/themes/hugo-conference/layouts/partials/nav.html +++ /dev/null @@ -1,13 +0,0 @@ - - -
    diff --git a/assets/2021/themes/hugo-conference/layouts/partials/partners.html b/assets/2021/themes/hugo-conference/layouts/partials/partners.html deleted file mode 100644 index f617c99..0000000 --- a/assets/2021/themes/hugo-conference/layouts/partials/partners.html +++ /dev/null @@ -1,11 +0,0 @@ -

    {{ .titles.partners }}

    - -
      -{{ range $partner := .partners }} -
    • - -
    • -{{ end }} -
    diff --git a/assets/2021/themes/hugo-conference/layouts/partials/schedule.html b/assets/2021/themes/hugo-conference/layouts/partials/schedule.html deleted file mode 100644 index d8923c8..0000000 --- a/assets/2021/themes/hugo-conference/layouts/partials/schedule.html +++ /dev/null @@ -1,41 +0,0 @@ -

    {{ .titles.schedule }}

    - -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.

    -
    - - - - - - - - - - {{ range $slot := .schedule }} - {{ if ne .presentation nil }} - - - - - - {{ else }} - - - - - - {{ end }} - {{ end }} - -
    TimeSlotDescription
    {{ .presentation.time }} - {{ with .photo }} - - {{ $slot.name }} - - {{ end }} - - {{ .presentation.title }} - {{ .company }} - {{ .presentation.description }}
    {{ .time }}{{ .name }}-
    -
    diff --git a/assets/2021/themes/hugo-conference/layouts/partials/speakers.html b/assets/2021/themes/hugo-conference/layouts/partials/speakers.html deleted file mode 100644 index 0fe706f..0000000 --- a/assets/2021/themes/hugo-conference/layouts/partials/speakers.html +++ /dev/null @@ -1,27 +0,0 @@ -

    {{ .titles.speakers }}

    - -
      -{{ range $speaker := (where .schedule "presentation" "ne" nil) }} -
    • - {{ with .photo }} - - {{ $speaker.name }} - - {{ end }} - -

      - {{ with .presentation.time }} - {{ . }} - {{ end }} - {{ .presentation.title }} -

      - -

      {{ .name }} - {{ with .link }} - {{ .text }} - {{ end }} -

      -

      {{ .bio }}

      -
    • -{{ end }} -
    diff --git a/assets/2021/themes/hugo-conference/layouts/partials/sponsors.html b/assets/2021/themes/hugo-conference/layouts/partials/sponsors.html deleted file mode 100644 index 0e88da5..0000000 --- a/assets/2021/themes/hugo-conference/layouts/partials/sponsors.html +++ /dev/null @@ -1,11 +0,0 @@ -

    {{ .titles.sponsors }}

    - -
      -{{ range $sponsor := .sponsors }} - -{{ end }} -
    diff --git a/assets/2021/themes/hugo-conference/static/css/main.css b/assets/2021/themes/hugo-conference/static/css/main.css deleted file mode 100644 index df5f2bc..0000000 --- a/assets/2021/themes/hugo-conference/static/css/main.css +++ /dev/null @@ -1,902 +0,0 @@ -/* ============================================================================= - RESET - ========================================================================== */ -* { - margin: 0; - padding: 0; - list-style: none; - border: 0; - text-decoration: none; -} -img, -input, -label { - vertical-align: middle; -} -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: 100%; - line-height: 1em; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} -[hidden] { - display: none; -} -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -html, -button, -input, -select, -textarea { - font-family: sans-serif; -} -body { - margin: 0; -} -a:focus { - outline: thin dotted; -} -a:hover, -a:active { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -blockquote { - margin: 1em 40px; -} -dfn { - font-style: italic; -} -hr { - display: block; - height: 1px; - border: 0; - border-top: 1px solid #ccc; - margin: 1em 0; - padding: 0; -} -ins { - background: #ff9; - color: #000; - text-decoration: none; -} -mark { - background: #ff0; - color: #000; - font-style: italic; - font-weight: bold; -} -pre, -code, -kbd, -samp { - font-family: monospace, serif; - _font-family: 'courier new', monospace; - font-size: 1em; -} -pre { - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} -q { - quotes: none; -} -q:before, -q:after { - content: ""; - content: none; -} -small { - font-size: 85%; -} -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -dd { - margin: 0 0 0 40px; -} -nav ul, -nav ol { - list-style: none; - list-style-image: none; - margin: 0; - padding: 0; -} -img { - border: 0; - -ms-interpolation-mode: bicubic; - vertical-align: middle; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 0; -} -form { - margin: 0; -} -fieldset { - border: 0; - margin: 0; - padding: 0; -} -legend { - border: 0; - *margin-left: -7px; - padding: 0; - white-space: normal; -} -button, -input, -select, -textarea { - font-size: 100%; - margin: 0; - vertical-align: baseline; - *vertical-align: middle; -} -button, -input { - line-height: normal; -} -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; - *overflow: visible; -} -button[disabled], -input[disabled] { - cursor: default; -} -input[type="checkbox"], -input[type="radio"] { - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding: 0; - *width: 13px; - *height: 13px; -} -input[type="search"] { - -webkit-appearance: textfield; - -moz-box-sizing: content-box; - -ms-box-sizing: content-box; - -webkit-box-sizing: content-box; - box-sizing: content-box; -} -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} -textarea { - overflow: auto; - vertical-align: top; - resize: vertical; -} -input:invalid, -textarea:invalid { - background-color: #f0dddd; -} -table { - border-collapse: collapse; - border-spacing: 0; - width: 100%; -} -td { - vertical-align: middle; -} -.chromeframe { - margin: 0.2em 0; - background: #ccc; - color: black; - padding: 0.2em 0; -} -header:after, -footer:after, -section:after, -hgroup:after, -aside:after, -figure:after, -div:after, -ol:after, -li:after, -form:after, -ul:after, -dl:after { - content: "."; - display: block; - clear: both; - visibility: hidden; - height: 0; - overflow: hidden; -} -hr { - display: none; -} -.clear { - clear: both; -} -/* ============================================================================= - MAIN LAYOUT - ========================================================================== */ -.wrapper { - margin: 0 auto; - width: 960px; - position: relative; -} -.content { - padding: 50px 0; -} -.content section { - padding-top: 50px; -} -/* ============================================================================= - BASIC STYLES - ========================================================================== */ -h2, -h3, -h4 { - font-size: 5em; - font-weight: normal; - margin-bottom: .4em; - letter-spacing: -0.02em; -} -h3 { - font-size: 4em; -} -h4 { - font-size: 3em; -} -p { - font-size: 1.6em; - line-height: 1.6em; - margin-bottom: 1.4em; -} -.photo { - max-width: 100%; - position: relative; - top: -1px; -} -/* ============================================================================= - NAVIGATION - ========================================================================== */ -nav { - padding: 15px 0; - position: fixed; - width: 100%; - z-index: 10; -} -.nav-item { - display: inline-block; - margin-right: 15px; -} -.nav-link { - font-size: 1.4em; -} -/* ============================================================================= - HEADER - ========================================================================== */ -.header { - padding: 100px 0 100px; - text-align: center; -} -.logo-name { - margin-bottom: 0; - font-size: 10em; - letter-spacing: -0.04em; -} -.tagline { - margin-bottom: 50px; - font-size: 2em; - letter-spacing: -0.02em; -} -.call-action-area .price { - font-size: 4em; - vertical-align: center; - margin-right: 20px; -} -.call-action-area .call-action-link, -.btn { - position: relative; - top: -5px; - cursor: pointer; - display: inline-block; - padding: 15px 30px; - font-size: 2em; - line-height: 1em; - vertical-align: center; - letter-spacing: -0.02em; - -webkit-transition: all 0.3s ease-out; - -moz-transition: all 0.3s ease-out; - -ms-transition: all 0.3s ease-out; - -o-transition: all 0.3s ease-out; - transition: all 0.3s ease-out; -} -.call-action-area .call-action-link:hover, -.call-action-area .call-action-link:focus, -.btn:hover, -.btn:focus { - top: 0; -} -/* ============================================================================= - ABOUT - ========================================================================== */ -.about { - padding: 19px; - margin: 0 -20px 0; -} -/* ============================================================================= - SPEAKER - ========================================================================== */ -.speakers-item { - position: relative; - min-height: 180px; - padding-left: 180px; - margin-bottom: 30px; - border-bottom: 1px dashed #e7e7e7; -} -.speaker-photo { - position: absolute; - top: 0; - left: 0; - display: block; - width: 120px; - height: 120px; -} -.speech-title { - padding-top: 10px; - font-size: 2em; - margin-bottom: 1em; -} -.speech-time { - font-size: 18px; - padding: 10px 15px; - letter-spacing: -0.03em; -} -.speakers-name { - font-size: 1.6em; -} -.speakers-item p { - font-size: 1.4em; -} -/* ============================================================================= - SCHEDULE - ========================================================================== */ -.schedule-tbl { - padding: 20px; -} -.schedule-tbl table { - border-collapse: collapse; - font-size: 1em; -} -.schedule-tbl td, -.schedule-tbl th { - position: relative; - padding: 20px 30px; - font-size: 1.4em; - line-height: 1.4em; - text-align: left; -} -.schedule-tbl th { - padding: 5px 30px; - color: #2b2b2b; - font-size: 2em; - font-weight: bolder; -} -.schedule-tbl .speaker-photo { - position: relative; - width: 40px; - height: 40px; - float: left; - margin-right: 20px; -} -.schedule-tbl .schedule-time { - text-align: center; -} -.schedule-slot { - width: 250px; - font-size: 16px; -} -.speakers-company { - display: block; - font-size: 12px; -} -/* ============================================================================= - SPONSORS and PARTNERS - ========================================================================== */ -.sponsor-item, -.partner-item { - display: inline-block; - margin: 0 30px 30px 0; -} -.sponsor--link, -.partner-link { - display: block; - width: 150px; - height: 150px; - text-align: center; - vertical-align: middle; - line-height: 150px; -} -/* ============================================================================= - CONTATO - ========================================================================== */ -.form label { - font-size: 16px; - display: block; - margin-bottom: .5em; -} -.control-group { - height: auto; - clear: both; - margin-bottom: 20px; -} -.control-group-name, -.control-group-email { - clear: none; - width: 467px; - float: left; - margin-right: 25px; -} -.control-group-email { - margin-right: 0; -} -.form input[type=text], -.form input[type=email], -.form textarea { - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - display: block; - width: 100%; - min-height: 15px; - padding: 10px; - font-size: 14px; -} -.form textarea { - height: 300px; -} -.form .btn { - float: right; -} -/* ============================================================================= - Media Queries - ========================================================================== */ -@media only screen and (max-width: 1024px) { - .wrapper { - width: 100%; - padding: 0 20px; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - } - .about { - margin: 0; - } -} -@media only screen and (min-width: 320px) and (max-width: 800px) { - /* schedule */ - .schedule-tbl { - padding: 1px; - } - .schedule-tbl td, - .schedule-tbl th { - padding: 10px; - } - .schedule-tbl th { - padding: 10px; - font-size: 1.8em; - } - .schedule-tbl .speaker-photo { - width: 40px; - height: 40px; - margin-right: 5px; - } - .schedule-tbl .schedule-slot { - width: 120px; - } - .schedule-tbl td.schedule-slot { - font-size: 14px; - line-height: 1.2em; - } - .schedule-tbl .schedule-time { - width: 60px; - padding: 10px 0 10px 5px; - text-align: left; - } - .schedule-tbl td.schedule-description { - font-size: 12px; - } - /* partners */ - .sponsor-item, - .partner-item { - margin: 0 5px 10px 0; - } - .sponsor--link, - .partner-link { - width: 95px; - height: 95px; - line-height: 95px; - } - /* contact */ - .control-group-name, - .control-group-email { - clear: both; - width: 100%; - float: none; - margin-right: 0; - } - .form .btn { - margin-bottom: 50px; - } -} -@media only screen and (max-width: 480px) { - /* nav */ - nav { - display: none; - } - .header { - padding: 20px 0; - } - .logo-name { - font-size: 4em; - } - .tagline { - margin-bottom: 15px; - font-size: 1.4em; - } - .call-action-area .price { - font-size: 2em; - margin: 0 0 15px; - display: block; - } - .call-action-area .call-action-link, - .btn { - top: 0; - } - h2, - h3, - h4 { - font-size: 3em; - } - h3 { - font-size: 2em; - } - h4 { - font-size: 1.8em; - } - p { - font-size: 1.4em; - } - /* content */ - .content { - padding: 0; - } - .content section { - padding-top: 50px; - } - /* speakers */ - .speakers-item { - min-height: 70px; - padding-left: 70px; - } - .speaker-photo { - width: 50px; - height: 50px; - } - .speech-title { - padding-top: 0; - font-size: 16px; - margin-bottom: .3em; - } - .speech-time { - font-size: 16px; - padding: 0; - } - .speakers-bio { - display: none; - } -} -@media only screen and (max-width: 321px) { - .logo-name { - font-size: 4em; - margin-bottom: .4em; - } - .schedule-tbl .schedule-description { - display: none; - } - .schedule-tbl .schedule-slot { - width: auto; - } - /* partners */ - .sponsor-item, - .partner-item { - margin: 0 12px 15px 0; - } - .sponsor--link, - .partner-link { - width: 115px; - height: 115px; - line-height: 115px; - } -} -/* ============================================================================= - MAIN LAYOUT - ========================================================================== */ -html { - background: #F6F6F6; - font: normal normal 10px/1.2em helvetica, arial, sans-serif; - color: #777; -} -/* ============================================================================= - BASIC STYLES - ========================================================================== */ -h1, -h2, -h3, -h4, -h5, -h6 { - color: #2b2b2b; -} -/* ============================================================================= - NAVIGATION - ========================================================================== */ -nav { - background: #2b2b2b; -} -.nav-link { - color: #e7e7e7; -} -.nav-link:active, -.nav-link:hover, -.nav-link:focus, -.nav-link.current { - color: #fff; -} -/* ============================================================================= - HEADER - ========================================================================== */ -.header { - background-image: url('../img/cover.jpg'); - background-color: #2b2b2b; - background-repeat: no-repeat; - background-position: center bottom; - background-size: 100% auto; -} -.logo-link, -.tagline, -.call-action-area .price { - color: #fff; - text-shadow: 1px 2px 1px rgba(0, 0, 0, 0.3); -} -.tagline { - font-weight: normal; -} -.call-action-area .price { - color: #fddd52; -} -.call-action-area .call-action-link, -.btn { - background-color: #fddd52; - background-image: -moz-linear-gradient(top, #fddd52 30%, #f0a303 150%); - background-image: -webkit-linear-gradient(top, #fddd52 30%, #f0a303 150%); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fddd52', endColorstr='#f0a303'); - background-image: linear-gradient(top, #fddd52 30%, #f0a303 150%); - color: #2b2b2b; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.4), inset 0 -2px 3px 0 #cc7f0a, inset 0 1px 0 0 #fff9b1; - border-radius: 40px; -} -.github-link { - position: fixed; - top: 0; - right: 0; - z-index: 11; -} -.github-link img { - border: 0; -} -/* ============================================================================= - CONTENT - ========================================================================== */ -.content a { - color: #f0a303; -} -.content a:hover, -.content a:focus { - color: #fddd52; - text-decoration: underline; -} -/* ============================================================================= - ABOUT - ========================================================================== */ -.about { - border: 1px solid #e7e7e7; - background: #fff; - border-radius: 4px; -} -/* ============================================================================= - LOCATION - ========================================================================== */ -.location-area { - background: #e7e7e7; - border: 1px solid #ccc; - border-radius: 4px; - height: 300px; -} -/* ============================================================================= - SPEAKER - ========================================================================== */ -.speaker-photo .photo { - border-radius: 50%; - box-shadow: 0 0 0 8px rgba(0, 0, 0, 0.07); - -webkit-transition: all 0.3s ease-out; - -moz-transition: all 0.3s ease-out; - -ms-transition: all 0.3s ease-out; - -o-transition: all 0.3s ease-out; - transition: all 0.3s ease-out; -} -.speakers-item:hover .speaker-photo .photo { - box-shadow: 0 0 0 8px rgba(0, 0, 0, 0.3); -} -.speech-time { - color: #fff; - background: #2b2b2b; - border-radius: 8px; -} -/* ============================================================================= - SCHEDULE - ========================================================================== */ -.schedule-tbl { - background: #fff; - border: 1px solid #ccc; - border-radius: 4px; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.15); -} -.schedule-tbl table { - background: #fff; -} -.schedule-tbl td, -.schedule-tbl th { - border-bottom: 1px solid #e7e7e7; -} -.schedule-tbl tbody tr:nth-child(2n+1) { - background: #f6f6f6; -} -.schedule-tbl th { - color: #2b2b2b; -} -.schedule-tbl .speaker-photo .photo { - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3); -} -.speakers-company { - color: #999; -} -.schedule-slot { - color: #2b2b2b; -} -.schedule-tbl tbody tr:hover { - background: #fffde1; -} -.schedule-coffee, -.schedule-closing, -.schedule-lunch, -.schedule-other { - color: #214f87; -} -/* ============================================================================= - SPONSORS - ========================================================================== */ -.sponsor--link, -.partner-link { - background: #fff; - border: 1px solid #ccc; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.15); -} -.sponsor--link:hover, -.sponsor--link:focus, -.partner-link:hover, -.partner-link:focus { - border-color: #f0a303; -} -/* ============================================================================= - CONTACT - ========================================================================== */ -.form input[type=text], -.form input[type=email], -.form textarea { - color: #777; - border: 1px solid #e7e7e7; - background: #fff; - border-radius: 4px; -} -.form input[type=text]:focus, -.form input[type=email]:focus, -.form textarea:focus { - border-color: #aaa; - outline: 0; -} -/* ============================================================================= - Media Queries - ========================================================================== */ -@media only screen and (max-width: 1024px) { - .header { - background-size: auto 100%; - } -} -@media only screen and (max-width: 480px) { - /* speakers */ - .speaker-photo .photo { - box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.07); - } - .speech-title { - font-weight: bolder; - } - .speech-time { - color: #2b2b2b; - background: transparent; - font-weight: bolder; - } - .github-link { - display: none; - } -} diff --git a/assets/2021/themes/hugo-conference/theme.toml b/assets/2021/themes/hugo-conference/theme.toml deleted file mode 100644 index efb8893..0000000 --- a/assets/2021/themes/hugo-conference/theme.toml +++ /dev/null @@ -1,17 +0,0 @@ -name = "Hugo Conference" -license = "MIT" -licenselink = "https://github.com/jweslley/hugo-conference/blob/master/LICENSE" -description = "The easiest way to create websites for conference/events" -homepage = "https://github.com/jweslley/hugo-conference/" -tags = ["conference", "responsive", "l10n", "google-analytics"] -features = ["conference", "responsive", "l10n", "google-analytics"] -min_version = "0.21" - -[author] - name = "jweslley" - homepage = "//jonhnnyweslley.net" - -[original] - name = "conf-boilerplate" - homepage = "//braziljs.github.io/conf-boilerplate" - repo = "//github.com/braziljs/conf-boilerplate" diff --git a/assets/2023/img/marker-default.png b/assets/2023/img/marker-default.png deleted file mode 100644 index 006995b..0000000 Binary files a/assets/2023/img/marker-default.png and /dev/null differ diff --git a/assets/2023/js/jquery.js b/assets/2023/js/jquery.js deleted file mode 100644 index 046e93a..0000000 --- a/assets/2023/js/jquery.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
    ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f -}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
    a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:l.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("