diff --git a/.github/workflows/build_deploy.yml b/.github/workflows/build_deploy.yml index fb50301..7a37f40 100644 --- a/.github/workflows/build_deploy.yml +++ b/.github/workflows/build_deploy.yml @@ -3,8 +3,7 @@ name: build_deploy on: push: branches: - - master - # - staging + - main pull_request: repository_dispatch: workflow_dispatch: @@ -28,12 +27,21 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24' + cache: 'npm' + + - name: Install npm dependencies + run: npm ci + - name: Setup Ruby uses: ruby/setup-ruby@v1 with: ruby-version: '3.2' bundler-cache: true - cache-version: 0 # Increment this number if you need to re-download cached gems + cache-version: 0 - name: Setup Pages id: pages uses: actions/configure-pages@v3 @@ -53,7 +61,7 @@ jobs: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} - if: ${{ github.ref == 'refs/heads/master' }} + if: ${{ github.ref == 'refs/heads/main' }} runs-on: ubuntu-latest needs: build steps: diff --git a/.github/workflows/links.yml b/.github/workflows/links.yml index f3b0ac6..fd60675 100644 --- a/.github/workflows/links.yml +++ b/.github/workflows/links.yml @@ -11,11 +11,20 @@ jobs: link_checker: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24' + cache: 'npm' + + - name: Install npm dependencies + run: npm ci - uses: ruby/setup-ruby@v1 with: - ruby-version: '3.1' + ruby-version: '3.2' bundler-cache: true - name: Build site @@ -26,14 +35,7 @@ jobs: - name: Link Checker uses: lycheeverse/lychee-action@v2 with: - args: --verbose --no-progress -- _site/**/*.html + args: --verbose --no-progress --root-dir _site -- _site/**/*.html fail: true env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} - - # - name: Create Issue From File - # uses: peter-evans/create-issue-from-file@v2 - # with: - # title: Link Checker Report - # content-filepath: ./lychee/out.md - # labels: report, automated issue diff --git a/.gitignore b/.gitignore index eeedc60..71431dc 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,10 @@ js/jquery.min.2.1.js js/jquery.min.3.7.js /firebase-debug.log -Gemfile.lock \ No newline at end of file +Gemfile.lock + +# Vite / Node +node_modules/ +public/vite* +config/ +vendor/ diff --git a/404.html b/404.html index 23f0ce7..337f1f3 100644 --- a/404.html +++ b/404.html @@ -1,199 +1,14 @@ - - - - - - - Introduction - - - - - - - - - - - - - -
- +--- +layout: default +permalink: /404.html +--- + +
+

404

+

Page not found

+

The page you were looking for doesn't exist or has been moved.

+ + Go to Homepage + +
- - -
- -
- -

Page not found.

- -

The page you were looking for was not found on this server.

- -

Go to the Homepage to start again.

- -

Disclaimer

- -

This site is maintained by people involved in the development of calendaring and scheduling standards and/or implementations. Although the content contributors are employed by a range of commercial and non-profit organizations, this site does not represent the views or opinions of those organizations.

- -

Please note that the authors of this site have not made any attempt to confirm support for any of the implementations, products or services listed on this site.

- - -
- -
-
-
-
- Was this page helpful for you? Please give us Feedback. -
-
- - - - - - - - - - - - - - - - - - diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..d28da09 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,115 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +CalConnect DEVGUIDE is a Jekyll-based static site providing a developer's guide for calendaring and scheduling standards (iCalendar, CalDAV, CardDAV, vCard, jsCalendar, iTIP, iMIP). The live site is at https://devguide.calconnect.org. + +Uses the shared `jekyll-calconnect-theme` gem for layouts, includes, and design tokens. The theme provides Tailwind CSS v4 via Vite, dark mode support, and documentation sidebar styling. + +## Build & Serve Commands + +- **Install dependencies:** `bundle install && npm ci` +- **Build the site:** `bundle exec jekyll build` +- **Local dev server:** `bundle exec jekyll serve` +- **Build for production:** `JEKYLL_ENV=production bundle exec jekyll build` + +Ruby 3.2, Node.js 24. Jekyll 4.3 with jekyll-vite plugin. + +## Deployment + +- **GitHub Actions** builds and deploys to GitHub Pages on push to `main` +- **Firebase** hosting config exists in `firebase.json` (redirect rules) +- The `_site/` directory is the build output (gitignored) + +## Site Architecture + +### Theme + +Uses `jekyll-calconnect-theme` gem (at `../jekyll-calconnect-theme/`). The theme provides: +- **Layouts**: `base` (HTML shell), `default` (documentation sidebar), `page` (simple wrapper) +- **Includes**: `head.html` (fonts, critical CSS, Vite), `header.html`/`footer.html` (stubs), `breadcrumbs.html`, `feedback.html`, `google-analytics.html` +- **SCSS**: `_sass/calconnect/` partials for documentation layout, sidebar nav, typography, dark mode +- **Frontend JS**: `theme.js` (dark/light toggle), `navigation.js` (mobile menu) +- **Assets**: Logo SVGs (purple/white) + +Local `_layouts/` and `_includes/` files override the theme. + +### Content Collections + +Two Jekyll collections drive the site: + +- **`pages`** (`_pages/`) — Main content sections. Each top-level section has an index `.md` file and a subdirectory with child pages. Permalink: `/:path/` +- **`appendixes`** (`_appendixes/`) — Supplementary content (Glossary, Standards, Links, Examples). Permalink: `/Appendix/:path/` + +### Page Front Matter (Navigation) + +- `parent` — Path to parent page (e.g., `"/"` for top-level, `"/iCalendar-Topics"` for children) +- `order` — Sort order within siblings +- `mainParent` — Groups pages under a top-level section for sidebar display +- `parents` — Semicolon-separated breadcrumb trail in `Title:URL` format +- `childs` — Comma-separated list of child page titles (for active-state highlighting) +- `layout` — `default`, `page`, `home`, `toc`, `toc-type`, `post` + +### Layouts + +- `default` → theme's `base` (head, header, main, footer, Vite JS) +- `page` → `default` (simple max-width container) +- `home` → `default` (landing page with hero and icon grid) +- `toc` → `default` (Table of Contents with hierarchical listing) +- `toc-type` → `default` (section landing page with breadcrumb, content, and sidebar) +- `post` → `default` (blog-style article) + +### CSS / Frontend + +- **Tailwind CSS v4** via Vite + jekyll-vite +- Entry point: `_frontend/entrypoints/application.css` (Tailwind + `@theme` design tokens) +- JS entry: `_frontend/entrypoints/application.js` (imports theme.js + navigation.js) +- Fonts: Inter (body) + JetBrains Mono (code), loaded via Google Fonts +- Dark mode: class-based (`html.dark`), toggled via `theme.js` with localStorage + +### Includes + +- `head.html` — Overrides theme: DEVGUIDE-specific title and favicon +- `header.html` — Overrides theme: DEVGUIDE nav links + dark mode toggle +- `footer.html` — Overrides theme: DEVGUIDE page/appendix links +- `script.html` — GA4 tracking (production only) +- `toc-sidebar.html` — Recursive sidebar navigation (front-matter-driven) +- `toc-entry.html` — Recursive ToC entry renderer +- `toc-mainPage-placeholder.html` — Renders child links for section landing pages + +### Plugin: PlantUML + +`_plugins/jekyll-plantuml.rb` provides a `{% plantuml %}` Liquid tag that generates SVG diagrams using `_bin/plantuml.jar`. + +## Content Structure + +Top-level sections (each is a `_pages/*.md` index + subdirectory): + +| Section | Topics | +|---|---| +| iCalendar Topics | Best Practices, Dates/Times, History, Recurrences, Validation | +| CalDAV | Client/Server implementations, libraries, building clients, FAQs | +| CardDAV | Client implementations | +| Scheduling | FreeBusy, iTIP, vAvailability, vPoll | +| Tasks | Introduction, Component | +| Time Zones | Best Practices, Sources, TZDS | +| Data Model | Simple Event, UID, Detailed Description | +| vCard | vCard 4, vCard 5 | +| jsCalendar Topics | Introduction, Implementations | +| iMIP | Internet Scheduling | +| iTIP | iTIP scheduling | +| Publishing | Publishing calendars | +| Other Topics | Calendar spam | + +## CI Workflows + +- **`build_deploy`** — Builds with Jekyll + Vite and deploys to GitHub Pages on push to `main` +- **`links`** — Runs lychee link checker on built `_site/` HTML + +## Conventions + +- Content files are Markdown (`.md`) with YAML front matter +- 2-space indentation, LF line endings, UTF-8 encoding (`.editorconfig`) +- Pages with `published: false` in front matter are excluded from navigation diff --git a/Gemfile b/Gemfile index 50d536c..f831c05 100644 --- a/Gemfile +++ b/Gemfile @@ -1,36 +1,24 @@ source "https://rubygems.org" -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! + gem "jekyll", "~> 4.3.4" -# This is the default theme for new Jekyll sites. You may change this to anything you like. -gem "minima", "~> 2.5" -# If you want to use GitHub Pages, remove the "gem "jekyll"" above and -# uncomment the line below. To upgrade, run `bundle update github-pages`. -# gem "github-pages", group: :jekyll_plugins -# If you have any plugins, put them here! +gem "csv" +gem "base64" +gem "jekyll-calconnect-theme", "~> 0.2" + group :jekyll_plugins do gem "jekyll-feed", "~> 0.12" + gem "jekyll-sitemap" gem "jekyll-asciidoc" + gem "jekyll-vite" end -# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem -# and associated library. +gem "jekyll-archives" + platforms :mingw, :x64_mingw, :mswin, :jruby do gem "tzinfo", ">= 1", "< 3" gem "tzinfo-data" end -# Performance-booster for watching directories on Windows gem "wdm", "~> 0.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] -gem 'jekyll-archives' -gem "jekyll-sass-converter", "~> 2.0" \ No newline at end of file diff --git a/TODO.new-style/01-push-calconnect-theme-to-github.md b/TODO.new-style/01-push-calconnect-theme-to-github.md new file mode 100644 index 0000000..786ea5b --- /dev/null +++ b/TODO.new-style/01-push-calconnect-theme-to-github.md @@ -0,0 +1,9 @@ +# 01 - Push calconnect-theme to GitHub + +Create the GitHub repo and push the initial commit. + +```bash +cd /Users/mulgogi/src/calconnect/calconnect-theme +gh repo create calconnect/calconnect-theme --public --description "Shared Jekyll theme gem for CalConnect sites" +git push -u origin main +``` diff --git a/TODO.new-style/02-update-devguide-default-branch.md b/TODO.new-style/02-update-devguide-default-branch.md new file mode 100644 index 0000000..469cb45 --- /dev/null +++ b/TODO.new-style/02-update-devguide-default-branch.md @@ -0,0 +1,8 @@ +# 02 - Update DEVGUIDE default branch to main + +Change the default branch from `master` to `main` and update workflows to reference `main`. + +**Files:** +- `.github/workflows/build_deploy.yml` — change trigger branch `master` → `main`, change deploy condition `refs/heads/master` → `refs/heads/main` +- `.github/workflows/links.yml` — already uses `main` (verify) +- Update remote HEAD: `git push origin main && git remote set-head origin main` diff --git a/TODO.new-style/03-migrate-standards-calconnect-org.md b/TODO.new-style/03-migrate-standards-calconnect-org.md new file mode 100644 index 0000000..d62eab5 --- /dev/null +++ b/TODO.new-style/03-migrate-standards-calconnect-org.md @@ -0,0 +1,65 @@ +# 03 - Migrate standards.calconnect.org to Tailwind/Vite + +Full migration from Materialize CSS to shared calconnect-theme with Tailwind/Vite. + +## Node.js tooling to create + +| File | Source | +|---|---| +| `package.json` | Same as DEVGUIDE (no Vue deps) | +| `vite.config.ts` | Same as DEVGUIDE (no Vue plugin) | +| `postcss.config.js` | Copy from DEVGUIDE | +| `config/vite.json` | Copy from DEVGUIDE (use port 3038) | +| `_frontend/entrypoints/application.css` | Tailwind v4 with standards-specific `@source` paths + doc-type/stage color `@theme` tokens | +| `_frontend/entrypoints/application.js` | Copy from DEVGUIDE | +| `_frontend/js/theme.js` | Copy from calconnect-theme | +| `_frontend/js/navigation.js` | Copy from calconnect-theme | + +## Config updates + +- `Gemfile`: add `calconnect-theme` (path:), add `jekyll-vite`, remove `minima`, `rubocop` +- `_config.yml`: set `theme: calconnect-theme`, add vite/node excludes + +## Layouts to rewrite + +| Layout | What to do | +|---|---| +| `default.html` | Replace with `layout: base` + `{{ content }}` | +| `document.html` | Keep Liquid logic, replace Materialize classes with Tailwind | +| `toc-type.html` | Same as DEVGUIDE: Materialize → `.documentation`/`.docs-nav`/`.nav-items` | +| `toc.html` | `container` → `max-w-4xl mx-auto` | +| `page.html` | `container` → `max-w-4xl mx-auto py-8 px-4` | + +## Includes to rewrite + +| Include | What to do | +|---|---| +| `head.html` | Replace with Inter/JetBrains Mono, critical CSS, `{% vite_stylesheet_tag %}` | +| `header.html` | Materialize nav → Tailwind glass navbar with standards links + dark mode toggle | +| `footer.html` | Materialize footer → Tailwind grid footer | +| `script.html` | jQuery/Materialize/init.js → `{% vite_javascript_tag %}` + GA | +| `document.html` | Keep Liquid logic, replace CSS classes for type badges/stage badges/download buttons | +| `toc-sidebar.html` | `menu-sidebar` → `nav-items` etc. | +| `find-doc.html` | Update CSS classes | +| `copyright.html` | Update CSS classes | + +## Doc-type/stage colors + +Extract from `_sass/_main.scss` SCSS maps and express as Tailwind `@theme` tokens in `application.css`: +- standard: #0AC442, directive: #540D6E, guide: #D183C9, specification: #65AFFF, report: #3A405A, amendment: #F26430, corrigendum: #C84630, administrative: #BFAE48, advisory: #BD9391 +- proposal: #39A0ED, working-draft: #2D7393, committee-draft: #2A6B7C, draft-standard: #1C7F7A, final-draft: #53C170, published: #069E2D, withdrawn: #004E64, cancelled: #2E382E + +## Files to delete + +- `_sass/materialize/` (entire directory) +- `_sass/main.scss`, `_sass/_main.scss`, `_sass/_metanorma-index.scss` +- `assets/materialize.scss`, `assets/main.scss`, `assets/metanorma-index.scss` +- `js/jquery.min.js`, `js/materialize.min.js`, `js/init.js` +- `fonts/roboto/` (if exists) + +## Preserve untouched + +- `Makefile`, `scripts/`, `src-documents/`, `bib/`, `bibcoll/`, `csd/`, `_input/` +- `flake.nix`, `flake.lock`, `.envrc` +- `_data/` (doesn't exist — navigation is hardcoded) +- CI workflow (`.github/workflows/build_deploy.yml`) — add Node.js setup step diff --git a/TODO.new-style/04-integrate-theme-into-calconnect-org.md b/TODO.new-style/04-integrate-theme-into-calconnect-org.md new file mode 100644 index 0000000..66440a6 --- /dev/null +++ b/TODO.new-style/04-integrate-theme-into-calconnect-org.md @@ -0,0 +1,31 @@ +# 04 - Integrate theme into calconnect.org + +Remove duplicated files now provided by calconnect-theme gem. + +## Config updates + +- `Gemfile`: add `gem "calconnect-theme", path: "../calconnect-theme"`, remove `minima` +- `_config.yml`: change `theme: minima` → `theme: calconnect-theme` + +## Files to delete (now in theme) + +- `_layouts/base.html` +- `_layouts/default.html` +- `_layouts/page.html` +- `_includes/head.html` +- `_includes/breadcrumbs.html` +- `_includes/feedback.html` +- `_includes/google-analytics.html` +- `_includes/custom-head.html` +- `_frontend/js/theme.js` +- `_frontend/js/navigation.js` + +## Files to keep (site-specific overrides) + +- `_includes/header.html`, `_includes/footer.html` +- `_includes/news-card.html`, `_includes/script.html` +- `_layouts/home.html`, `_layouts/category.html`, `_layouts/news-*.html` +- `_frontend/entrypoints/application.css` (site-specific @source paths) +- `_frontend/entrypoints/application.js` (Vue news search) +- `_frontend/components/`, `_frontend/composables/` +- `_data/`, `vite.config.ts` diff --git a/TODO.new-style/05-verify-all-sites.md b/TODO.new-style/05-verify-all-sites.md new file mode 100644 index 0000000..615f32b --- /dev/null +++ b/TODO.new-style/05-verify-all-sites.md @@ -0,0 +1,5 @@ +# 05 - Verify all three sites build + +1. **calconnect.org**: `cd calconnect.org && bundle install && npm ci && bundle exec jekyll build` — verify no regressions +2. **DEVGUIDE**: `cd DEVGUIDE && bundle install && npm ci && bundle exec jekyll serve` — verify sidebar, dark mode, PlantUML, content +3. **standards.calconnect.org**: `cd standards.calconnect.org && bundle install && npm ci && bundle exec jekyll build` — verify document rendering, doc-type badges, sidebar diff --git a/_appendixes/Appendixes.md b/_appendixes/Appendixes.md deleted file mode 100644 index 381dfa3..0000000 --- a/_appendixes/Appendixes.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: toc-type -title: "Appendixes" -order: 2 -parent: "/" -mainParent: "Appendixes" ---- diff --git a/_appendixes/Glossary.md b/_appendixes/Glossary.md deleted file mode 100644 index 10e65f5..0000000 --- a/_appendixes/Glossary.md +++ /dev/null @@ -1,1066 +0,0 @@ ---- -layout: toc-type -title: Glossary of Terms -parent: "/Appendix/Appendixes" -mainParent: "Appendixes" -parents: 'Appendixes:/Appendix/Appendixes' -order: 1 -published: true ---- - -# Calendaring and Scheduling Glossary of Terms - -This page is an effort to compile, in one location, a common set of terminology with respect to calendaring and scheduling applications and standards. The document incorporates terminology already existing in calendaring standards such as [RFC5545](https://tools.ietf.org/html/rfc5545) (Internet Calendaring and Scheduling Core Object Specification (iCalendar)), [RFC5546](https://tools.ietf.org/html/rfc6646) (iCalendar Transport-Independent Interoperability Protocol (iTIP)), [RFC6047](https://tools.ietf.org/html/rfc6047) (iCalendar Message-Based Interoperability Protocol (iMIP)), [RFC4791](https://tools.ietf.org/html/rfc4791) (Calendaring Extensions to WebDAV (CalDAV)), [RFC6638](https://tools.ietf.org/html/rfc6638) (Scheduling Extensions to CalDAV (CalDAV)), as well as input from members of the Calendaring and Scheduling Consortium (CalConnect). - -Some glossary terms may not appear in published standards today. These are common calendaring terms that are included so that everyone refers to components in the same manner. - -As new standards evolve, the glossary will serve as a resource for those creating documents so that all the standards share a common set of terms. - -Calendaring and scheduling implementers will be able to utilize the glossary to assist them as they read and decipher calendaring standards. Calendaring and scheduling users will be able to use the glossary to help them better understand the terminology deployed by applications written using calendaring standards. - -
- - Access Control - add - -
- Access control is a system which enables an authority (e.g., user or resource administrator) to control access to different entities in a calendar system. Typically vendors create Preference/Settings options to instantiate access control. Terminology varies considerably across products but broadly speaking access control is usually broken into two areas, read access and write access. Vendor terminology used for read access includes: 'read', 'reviewer', 'proxy read', 'viewer', 'see all', and 'see only freebusy'. Vendor terminology for write access includes: 'write', 'editor', 'proxy write', 'proxy', 'manager', 'administrator', 'designate', 'read/create/edit', 'make changes', 'manage', and 'edit'. (Cp. [Delegate](#delegate) and [Designate](#designate) below.) -
-
- -
- - Access Control List (ACL) - add - -
- A list of access control elements that define access control to a particular calendar system entity. (Reference: [RFC3744](https://tools.ietf.org/html/rfc3744) for its use in a WebDAV context.) -
-
- -
- - Accessibility - add - -
- Information pertaining to access to a resource by the physically disabled. This applies to Location Resources. -
-
- -
- - Admittance Info - add - -
- All information required to gain access to a resource. It applies to Location Resources. -
-
- -
- - Agenda - add - -
- See [Calendar](#calendar). -
-
- -
- - Alarm - add - -
- Use of the terms alarm, reminder, alert, and notifications vary by implementation and can represent several things. - They can represent a setting applied to an event by which a user indicates they want a 'notification' to be triggered to 'remind' them about some event or action (cp. [VALARM](#valarm) in [RFC5545](https://tools.ietf.org/html/rfc5545). - They can also be used to designate the type of 'alert' that serves as the notification (e.g., email message, audible sound, pop-up window). (Reference [RFC4791 (CalDAV)](https://tools.ietf.org/html/rfc4791), [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.6.6), [RFC5546 (iTip)](https://tools.ietf.org/html/rfc5546).) -
-
- -
- - Application/calendar + XML - add - -
- The MIME content type that indicates an iCalendar object expressed in XML. -
-
- - -
- - Appointment - add - -
- See [Calendar](#calendar). -
-
- - -
- - Attachment - add - -
- A document object associated with a calendar component. -
-
- - -
- - Attendee - add - -
- Specifies the participants or non-participants (e.g., room or resources) for an event. This property in iCalendar can contain multiple attributes specifying additional information, i.e., role, participation status, group membership, delegation, etc. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.6.4.1).) -
-
- - -
- - Autoconfiguration - add - -
- The process of configuring clients such as mobile devices or desktop applications to access a service, or class of service, with a minimum of input from the user of the device. See also [Autodiscovery](#autodiscovery). -
-
- - -
- - Autodiscovery - add - -
- The process used to determine the services provided by a host, or for a domain, including retrieval of the recommended configuration values for those services. The autodiscovery functionality requires the service provider to declare in a standard way which services are available and what their configuration looks like for the requesting user. See also [Autoconfiguration](#autoconfiguration). (Reference: [draft-daboo-aggregated-service-discovery](https://datatracker.ietf.org/doc/draft-daboo-aggregated-service-discovery/).) -
-
- - -
- - Autoschedule - add - -
- Accept scheduling invitations automatically with no human intervention. -
-
- - -
- - Booking Window - add - -
- The window of time in which a resource can be booked, relative to the start time of the event. -
-
- - -
- - CalDAV - add - -
- Extensions to the Web Distributed Authoring and Versioning (WebDAV) protocol to specify a standard way of accessing, managing and sharing calendar data based on the iCalendar format. Defined by two specifications, the first, [RFC4791 (CalDAV)](https://tools.ietf.org/html/rfc4791), specifies a calendar access protocol that allows Calendar User Agents to access and manage calendar data. The second specification, RFC 6638, specifies a standard way of performing scheduling transactions with iCalendar-based calendar components. This document defines the "calendar-auto-schedule" feature of CalDAV. (Reference: [RFC 4791](https://tools.ietf.org/html/rfc4791), and [RFC 6638](https://tools.ietf.org/html/rfc6638).) -
-
- - -
- - Calendar - add - -
- A collection of calendar items such as events, tasks, journal entries, etc. Examples include a person's or group's schedule, resource availability, and event listings. Typically an individual may own multiple calendars based on the same or different services. -
-
- - -
- - Calendar Access Rights - add - -
- See [Access Control](#access-control), [Access Control List](#access-control-list), [Delegate](#delegate), and [Designate](#designate). -
-
- - -
- - Calendar Collection - add - -
- A WebDAV collection used to represent a calendar containing a set of calendar object resources. (Reference: [RFC4791](https://tools.ietf.org/html/rfc4791) and [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.4).) -
-
- - -
- - Calendar Object Resource - add - -
- A WebDAV resource representing an iCalendar component typically stored inside a Calendar Collection (cp. Component). (Reference: [RFC4791](https://tools.ietf.org/html/rfc4791).) -
-
- - -
- - Calendar Service - add - -
- A server application that provides calendar user agents access to calendar stores. -
-
- - -
- - Calendar Store (CS) - add - -
- A data repository that may contain several calendars as well as properties and components of those calendars. A local calendar store is on the same device as the calendar user agent ([CUA](#calendar-user-agent)). A remote calendar store is not on the same machine/device as the calendar user agent. (Reference: [RFC3283](https://tools.ietf.org/html/rfc3283).) -
-
- - -
- - Calendar Subscription - add - -
- See [Subscribed Calendar](#subscribed-calendar) -
-
- - -
- - Calendar User (CU) - add - -
- A person who accesses or modifies calendar information. -
-
- - -
- - Calendar User Agent (CUA) - add - -
- 1. Software with which the calendar user communicates with a calendar service or local calendar store to access calendar information. - 2. Software that gathers calendar data on the Calendar User's behalf. -
-
- - -
- - Calendar System - add - -
- A way to represent dates as a combination of eras, years, months, weeks, and days in formats used in many different parts of the world. A calendar system also defines the limits for those different quantities and how "date arithmetic" can be done to implement repeating dates. (See [Wikipedia:Calendar](http://en.wikipedia.org/wiki/Calendar) for a description of many different calendar systems.) -
-
- - -
- - CalConnect - add - -
- The Calendaring and Scheduling Consortium is a non-for-profit partnership between vendors of calendaring and scheduling systems and tools, and users of those tools. Our purpose is to improve all aspects of calendaring and scheduling, in particular interoperability. We do this by improving existing standards, developing new standards, offering interoperability testing for calendaring and scheduling systems and tools, collaborating with other organizations with similar goals, and conducting periodic conferences where engineers and customers meet and interact in a collegial atmosphere. Virtually every important calendaring or calendaring-related standard since the late 2000s has been authored, edited and/or coedited by members of a CalConnect Technical Committee. -
-
- - -
- - CALEXT - add - -
- The IETF mailing list most commonly used for calendaring and scheduling standards development. See the page at [https://www.ietf.org/mailman/listinfo/calsify](https://www.ietf.org/mailman/listinfo/calsify) to join. -
-
- - -
- - Calscale - add - -
- An iCalendar property used to identify the calendar system used to represent dates and times within an iCalendar object. iCalendar currently only defines the GREGORIAN calendar system. -
-
- - -
- - CalWS - add - -
- CalWS-REST is a CalConnect Proposal and CalWS-SOAP will be a parallel CalConnect Proposal which define an API of basic operations which allow creation, retrieval, update and deletion of calendar objects. In addition, query and freebusy operations are defined to allow efficient, partial retrieval of calendar data. (Reference: CalWS-REST Restful Web Services Protocol for Calendaring.) -
-
- - -
- - Capacity - add - -
- Capacity of a resource, expressed as a numerical quantity. This applies to a Location Resource. -
-
- - -
- - CardDAV - add - -
- Extensions to the Web Distributed Authoring and Versioning (WebDAV) protocol to specify a standard way of accessing, managing, and sharing contact information based on the vCard format. (Reference: [RFC6352](https://tools.ietf.org/html/rfc6352) -
-
- - -
- - Consensus Scheduling - add - -
- The process whereby a group comes to agreement on when and perhaps where to hold a meeting or carry out a task, by identifying the "best" time or location to help maximize participation and minimize inconvenience. For more information see 7 Things You Should Know About Consensus Scheduling. (See [VPOLL](#vpoll).) -
-
- - -
- - Counter - add - -
- A response sent by an Attendee of an event to the event Organizer to propose a change to the event or task such as the scheduled date/time, list of participants, etc. (Reference: [RFC5546](https://tools.ietf.org/html/rfc5546)) -
-
- - -
- - Delegate - add - -
- In common usage 'delegate' may mean either a person who acts for someone else (cp. [Designate](#designate)) or refer to the act of appointing someone as a representative. The term has very specific meaning in the iCalendar and iTIP RFCs. In iCalendar, delegate means to specify that another individual, rather than oneself, should attend an event (cp. [Delegator](#delegator) and [Delegatee](#delegatee)). In iTIP, delegate means to assign ownership of a task to another individual. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.2.4) and [RFC5546](https://tools.ietf.org/html/rfc5546)) -
-
- - -
- - Delegatee - add - -
- The attribute in iCalendar that specifies the calendar user(s) to whom a calendar user has delegated participation in an event. The actual attribute name is DELEGATED-TO. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.2.5).) -
-
- - -
- - Delegator - add - -
- The attribute in iCalendar that specifies the calendar user(s) that have delegated their participation in an event to another calendar user. The actual attribute name is DELEGATED-FROM. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.2.4).) -
-
- - -
- - Designate - add - -
- The DTEND property for a VEVENT calendar component specifies the non-inclusive end of the event. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.6.2.2).) -
-
- - -
- - DTEND - add - -
- The DTEND property for a VEVENT calendar component specifies the non-inclusive end of the event. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.6.2.2).) -
-
- - -
- - DTSTART - add - -
- The DTSTART property for a VEVENT specifies the inclusive start of the event. For recurring events, it also specifies the very first instance in the recurrence set. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.6.2.4).) -
-
- -
- - Event - add - -
- A calendar object that is commonly used to represent things that mark time or use time. Examples include meetings, appointments, anniversaries, start times, arrival times, closing times. -
-
- -
- - Event Publication - add - -
- The process by which public event data is gathered, formatted and distributed to calendar users. Often this takes the form of public, unauthenticated clients and/or feeds. See [Public Event](#public-event). -
-
- - -
- - Freebusy - add - -
- A list of free and busy periods for a particular calendar user or resource. Primarily used for scheduling resources or meetings with other people. Time periods may be marked as busy, free, busy-unavailable (sometimes referred to as out of office) and busy-tentative. -
-
- - -
- - Gregorian Calendar - add - -
- The most common civil calendar system in use today, recognized by [many international bodies](http://en.wikipedia.org/wiki/Gregorian_calendar) -
-
- - -
- - iCal - add - -
- The name of Apple, Inc's desktop calendar user agent. Often used as an abbreviation for the iCalendar standard. -
-
- - -
- - iCalendar - add - -
- The Internet Calendaring and Scheduling Core Object Specification. An IETF standard ([RFC5545](https://tools.ietf.org/html/rfc5545)) for a text representation of calendar data. Scheduling operations are specified in [RFC5546](https://tools.ietf.org/html/rfc5546). -
-
- - -
- - IETF (The Internet Engineering Task Force) - add - -
- According to IETF [RFC3935](https://tools.ietf.org/html/rfc3935), "The IETF has traditionally been a community for experimentation with things that are not fully understood, standardization of protocols for which some understanding has been reached, and publication of (and refinement of) protocols originally specified outside the IETF process ...The mission of the IETF is to produce high quality, relevant technical and engineering documents that influence the way people design, use, and manage the Internet in such a way as to make the Internet work better. These documents include protocol standards, best current practices, and informational documents of various kinds." -
-
- - -
- - iMIP (iCalendar Message-Based Interoperability Protocol) - add - -
- An IETF standard ([RFC6047](https://tools.ietf.org/html/rfc6047)) that describes how iTIP messages are exchanged via email. -
-
- - -
- - iTIP (iCalendar Transport-Independent Interoperability Protocol) - add - -
- An IETF Standard ([RFC5546](https://tools.ietf.org/html/rfc5546)) that specifies a protocol that uses the iCalendar object specification to provide scheduling interoperability between different calendar systems without reference to a specific transport protocol so as to allow multiple methods of communication between systems (see [iMIP](#imip), [iSchedule](#ischedule)). -
-
- - -
- - iSchedule - add - -
- A draft specification that describes how iTIP messages are exchanged via HTTP (Reference: [Internet Calendar Scheduling Protocol (iSchedule) draft-desruisseaux-ischedule](https://tools.ietf.org/html/draft-desruisseaux-ischedule-05).) -
-
- - -
- - Instance - add - -
- A single event of a larger group of events specified as a recurring event (cp. Recurring). (Reference: [RFC4791 (CalDAV)](https://tools.ietf.org/html/rfc4791) and [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.8.4.4).) -
-
- - -
- - Inventory Info - add - -
- All information on other resources available as part of a resource. -
-
- -
- - Invitation/Invite - add - -
- A general term from common usage to convey a request for an attendee's participation in an event. In RFC documents the more specific term is request (cp. [Request](#request)). -
-
- - -
- - jCal - add - -
- A draft specification that defines a JSON representation of vCard data. Reference: [jCard - The JSON format for vCard](https://datatracker.ietf.org/doc/rfc7095/) -
-
- -
- - Journal Entry - add - -
- From [RFC5545](https://tools.ietf.org/html/rfc5545), one or more descriptive text notes associated with a particular calendar date. Examples of a journal entry include a daily record of a legislative body or a journal entry of individual telephone contacts for the day or an ordered list of accomplishments for the day. -
-
- -
- - Managed Attachment - add - -
- An attachment associated with a calendar component that is stored and managed on a CalDAV server. (Reference [draft-daboo-caldav-attachments](https://tools.ietf.org/html/draft-daboo-caldav-attachments-03).) -
-
- -
- - Maximum Instances - add - -
- Maximum number of instances of an event a resource can be scheduled for from a given point in time. -
-
- -
- - Meeting - add - -
- An acronym for Multipurpose Internet Mail Extensions, a specification for formatting non-ASCII text message content, including iCalendar data, graphics, audio and video, so that they can be sent over the Internet. MIME is supported by email clients and web browsers (see [RFC2045](https://tools.ietf.org/html/rfc2045), [RFC2046](https://tools.ietf.org/html/rfc2046), [RFC2047](https://tools.ietf.org/html/rfc2047)). -
-
- -
- - Mime Type - add - -
- An Internet media type, sometimes a Content-type after the name of a header in several protocols whose value is such a type, is a two-part identifier for file formats on the Internet. The identifiers were originally defined in [RFC2046](https://tools.ietf.org/html/rfc2046) for use in e-mail sent through SMTP, but their use has expanded to other protocols such as HTTP, RTP and SIP and for other uses (e.g., OS-level file type identification for application/file association). -
-
- -
- - Multiple Bookings - add - -
- Number of simultaneous bookings allowed by a resource, during scheduling. -
-
- -
- - Non-Gregorian Calendar - add - -
- Any calendar system that is not a Gregorian Calendar (e.g., Chinese, Hebrew, Islamic). See [Wikipedia](http://en.wikipedia.org/wiki/Calendar) for a description of many different calendar systems. -
-
- -
- - Notification - add - -
- See [Alarm](#alarm). -
-
- -
- - OASIS (Organization for the Advancement of Structured Information Standards) - add - -
- A Standards Development Organization primarily focused on web services standards. [OASIS](http://www.oasis-open.org) and CalConnect have reciprocal memberships for joint work on WS-Calendar. -
-
- -
- - Organizer - add - -
- A calendar user who creates a calendar item, requests free/busy information, or published free/busy information. It is an Organizer who invites Attendees. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.8.4.3).) -
-
- -
- - Personal Calendar - add - -
- A calendar containing events for one calendar user (the owner), and typically only accessible to the owner, or others authorized by the owner (cp. Calendar, Public Calendar, Shared Calendar). -
-
- -
- - Priority - add - -
- A level of importance and/or urgency calendar users can apply to Tasks and Events. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.8.1.9).) -
-
- -
- - Property - add - -
- RFCs define the objects and components of their subject which in turn have properties which have values (sometimes referred to as 'property parameters' or 'property attributes'). These "property parameters" contain meta-information about the property or the property value. Property parameters are provided to specify such information as the location of an alternate text representation for a property value, the language of a text property value, the value type of the property value, and other attributes. Throughout this glossary are references to component, property, and attribute following this usage. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.8).) -
-
- -
- - Public Calendar - add - -
- A calendar containing primarily public events and accessible to anyone or a specific group of calendar users (cp. Calendar, Personal Calendar, Shared Calendar). See [Public Event](#public-event). -
-
- -
- - Public Event - add - -
- An event meant to be published to or distributed to anyone or a specific group of calendar users. These generally differ from personal events in that they contain much more detail about the event, its location, categories and other properties. See Event Publication and Publish. -
-
- -
- - Publish - add - -
- Generally, to make calendar information, such as freebusy time, available to a select group or to the public. From the RFC for iTIP, "The 'PUBLISH' method in a 'VEVENT' calendar component is an unsolicited posting of an iCalendar object." -
-
- -
- - RRULE - add - -
- An iCalendar property used to define a repeating pattern for events or tasks. -
-
- -
- - RSCALE - add - -
- An iCalendar RRULE parameter indicating which calendar system to use for expanding this [RRULE](http://tools.ietf.org/html/rfc7529). -
-
- -
- - RECURRENCE-ID - add - -
- This property is used to identify a specific instance of a recurring VEVENT, VTODO, or VJOURNAL calendar component. -
-
- -
- - Recurring - add - -
- An event or task that happens more than once either with a regular interval (ex. daily, weekly, monthly) that can be expressed by a rule or with an explicit series of dates/times. -
-
- -
- - Request - add - -
- A broadly used term in multiple RFCs to represent an action. That action may be a query for property values from a client to a server (cp. [RFC4791](https://tools.ietf.org/html/rfc4791), a query between a client and a server that results in object creation, modification, or deletion (cp. [RFC4791](https://tools.ietf.org/html/rfc4791) and [RFC5545](https://tools.ietf.org/html/rfc5545)), and it is the name of a method in iTIP that makes "an explicit invitation to one or more attendees" (among other things, cp. RFC5546). (Reference: [RFC4791](https://tools.ietf.org/html/rfc4791), [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.7.2), [RFC5546](https://tools.ietf.org/html/rfc5546), and Internet Calendar Scheduling Protocol ([iSchedule](#ischedule)).) -
-
- -
- - Reminder - add - -
- See [Alarm](#alarm). -
-
- -
- - Repeating - add - -
- See [Recurring](#recurring). -
-
- -
- - Resource - add - -
- A resource in the scheduling context is any shared entity, that can be scheduled by a calendar user, but does not control its own attendance status. Resources can be of "Location", "Equipment", or "Role" type. -
-
- -
- - RSVP - add - -
- Specifies whether there is an expectation of a reply from a specific calendar user (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.2.17).) -
-
- -
- - Scheduling - add - -
- Briefly, the process by which organizers and attendees plan events or assign tasks. More specifically the term encompasses the exchange of request/invitations and responses between organizers and attendees of scheduled events, tasks or journal entries. -
-
- -
- - Scheduling Admin Contact Info - add - -
- An attribute that contains contact information for the scheduling approvers, if approval is required. -
-
- -
- - Shared Calendar - add - -
- A calendar that is accessible to multiple calendar users. Typically there is an "owner" and a set of "sharees", some of whom may have read-only access and some of whom might have read/write access (cp. [Calendar](#calendar), [Personal Calendar](#personal-calendar), [Public Calendar](#public-calendar), [Subscribed Calendar](#subscribed-calendar)). -
-
- -
- - Subscribed Calendar - add - -
- A calendar that has been published, typically on an HTTP server. See [Publish](#publish). -
-
- -
- - Task - add - -
- A representation of an item of work assigned to an individual. In [RFC5545](https://tools.ietf.org/html/rfc5545), these are "VTODO" calendar components, which are groupings of component properties and possibly "VALARM" calendar components that represent an action-item or assignment. -
-
- -
- - Text/calendar - add - -
- The MIME content type for encoding iCalendar objects. Example usage includes: email, web pages. -
-
- -
- - Timezone also Time Zone - add - -
- Areas of the Earth that have adopted the same local time. Time zones are generally centered on meridians of a longitude, that is a multiple of 15, thus making neighbouring time zones one hour apart. However, the one hour separation is not universal and the shapes of time zones can be quite irregular because they usually follow the boundaries of states, countries or other administrative areas. In [RFC5545](https://tools.ietf.org/html/rfc5545), time zones are represented using "VTIMEZONE" calendar components, each with a Time Zone Identifier (TZID) that can be used to tie a particular date and time to a specific timezone. -
-
- -
- - Timezone Service - add - -
- A client/server protocol used for distributing Timezone data. The protocol improves the accuracy and speed of distributing timezone data to ensure clients are kept up to date with sometimes rapidly changing definitions. It also allows clients to avoid having a complete database of all timezones - instead they can download timezone data on a case-by-case basis. (Reference [draft-douglass-timezone-service](https://datatracker.ietf.org/doc/html/draft-douglass-timezone-service).) -
-
- -
- - Transparency - add - -
- A property of an event that defines whether it will appear free or busy in free/busy time searches. -
-
- -
- - VALARM - add - -
- A VALARM calendar component is a grouping of component properties that is a reminder or alarm for an event or a to-do. For example, it may be used to define a reminder for a pending event or an overdue to-do. VALARMs will thus be included within VEVENT and VTODO components. VAVAILABILITY - An iCalendar component that is used to describe periods of time for which a calendar user is available for scheduling of events. (Reference: [draft-daboo-calendar-availability](https://tools.ietf.org/html/draft-daboo-calendar-availability.) -
-
- -
- - vCalendar - add - -
- A text representation of calendar and scheduling data created by the Versit consortium (also, the vCalendar specification). The [RFC5545](https://tools.ietf.org/html/rfc5545) iCalendar specification supersedes the work of vCalendar, though VCALENDAR remains as a component type in the [RFC5545](https://tools.ietf.org/html/rfc5545) iCalendar specification. -
-
- - -
- - vCard - add - -
- An IETF standard for a text representation of contact data. See CardDAV. (Reference: [RFC2426](https://tools.ietf.org/html/rfc2426) vCard V3.0, [RFC6350](https://tools.ietf.org/html/rfc6350) vCard V4.0.) -
-
- -
- - VEVENT - add - -
- A VEVENT calendar component represents a scheduled amount of time on a calendar. For example, it can be an activity; such as a one-hour long, department meeting from 8:00 AM to 9:00 AM, tomorrow. Generally, an event will take up time on an individual calendar. The VEVENT is also the calendar component used to specify an anniversary or daily reminder within a calendar. -
-
- -
- - VFREEBUSY - add - -
- A grouping of component properties that represents either a request for free or busy time information, a reply to a request for free or busy time information, or a published set of busy time information. -
-
- -
- - VJOURNAL - add - -
- A VJOURNAL calendar component is a grouping of component properties that represent one or more descriptive text notes associated with a particular calendar date. The DTSTART property is used to specify the calendar date with which the journal entry is associated. Examples of a journal entry include a daily record of a legislative body or a journal entry of individual telephone contacts for the day or an ordered list of accomplishments for the day. The VJOURNAL calendar component can also be used to associate a document with a calendar date. -
-
- -
- - VPOLL - add - -
- A proposed extension to iCalendar. VPOLL is a new component which allows conducting a "poll" via iTIP exchanges to accomplish consensus scheduling for an event or appointment. See Consensus Scheduling. (Reference: [draft-york-vpoll](https://datatracker.ietf.org/doc/draft-york-vpoll/).) -
-
- -
- - VTODO - add - -
- A VTODO calendar component is a grouping of component properties and possibly VALARM calendar components that represent an action-item or assignment. For example, it can be used to represent an item of work assigned to an individual; such as "turn in travel expense today". -
-
- -
- - WebDAV - add - -
- Web Distributed Authoring and Versioning (WebDAV) is an extension of the Hypertext Transfer Protocol (HTTP) that facilitates collaboration between users in editing and managing documents and files stored on World Wide Web servers. See [CalDAV](#caldav) and [CardDAV](#carddav). (Reference: [RF4918](https://tools.ietf.org/html/rfc4918).) -
-
- -
- - WebDAV Sync - add - -
- An extension to Web Distributed Authoring and Versioning (WebDAV) that allows efficient synchronization of the contents of a WebDAV collection. (Reference: [RFC6578](https://tools.ietf.org/html/rfc6578).) -
-
- -
- - WS-Calendar - add - -
- An OASIS (Organization for the Advancement of Structured Information Standards) working group tasked with defining a cross-domain standard for passing schedule and interval information between and within services built around CalWS. The product of the working group will be a standard also named [WS-Calendar](http://www.oasis-open.org/committees/workgroup.php?wg_abbrev=ws-calendar) incorporating the CalWS proposal. See [CalWS](#calws). -
-
- -
- - xCal - add - -
- A standard that defines an XML representation of iCalendar data. (Reference: xCal: The XML format for iCalendar - [RFC6321](https://tools.ietf.org/html/rfc6321).) -
-
- -
- - xCard - add - -
- A standard that defines an XML representation of vCard data. (Reference: xCard: vCard XML Representation - [RFC6351](https://tools.ietf.org/html/rfc6351).) -
-
diff --git a/_appendixes/Glossary_2.md b/_appendixes/Glossary_2.md deleted file mode 100644 index dc9323e..0000000 --- a/_appendixes/Glossary_2.md +++ /dev/null @@ -1,444 +0,0 @@ ---- -layout: toc-type -title: Glossary of Terms -parent: "/Appendix/Appendixes" -mainParent: "Appendixes" -parents: 'Appendixes:/Appendix/Appendixes' -order: 1 -published: false ---- - -# Calendaring and Scheduling Glossary of Terms - -This page is an effort to compile, in one location, a common set of terminology with respect to calendaring and scheduling applications and standards. The document incorporates terminology already existing in calendaring standards such as [RFC5545](https://tools.ietf.org/html/rfc5545) (Internet Calendaring and Scheduling Core Object Specification (iCalendar)), [RFC5546](https://tools.ietf.org/html/rfc6646) (iCalendar Transport-Independent Interoperability Protocol (iTIP)), [RFC6047](https://tools.ietf.org/html/rfc6047) (iCalendar Message-Based Interoperability Protocol (iMIP)), [RFC4791](https://tools.ietf.org/html/rfc4791) (Calendaring Extensions to WebDAV (CalDAV)), [RFC6638](https://tools.ietf.org/html/rfc6638) (Scheduling Extensions to CalDAV (CalDAV)), as well as input from members of the Calendaring and Scheduling Consortium (CalConnect). - -Some glossary terms may not appear in published standards today. These are common calendaring terms that are included so that everyone refers to components in the same manner. - -As new standards evolve, the glossary will serve as a resource for those creating documents so that all the standards share a common set of terms. - -Calendaring and scheduling implementers will be able to utilize the glossary to assist them as they read and decipher calendaring standards. Calendaring and scheduling users will be able to use the glossary to help them better understand the terminology deployed by applications written using calendaring standards. - -
- - Access Control - add - -
- Access control is a system which enables an authority (e.g., user or resource administrator) to control access to different entities in a calendar system. Typically vendors create Preference/Settings options to instantiate access control. Terminology varies considerably across products but broadly speaking access control is usually broken into two areas, read access and write access. Vendor terminology used for read access includes: 'read', 'reviewer', 'proxy read', 'viewer', 'see all', and 'see only freebusy'. Vendor terminology for write access includes: 'write', 'editor', 'proxy write', 'proxy', 'manager', 'administrator', 'designate', 'read/create/edit', 'make changes', 'manage', and 'edit'. (Cp. [Delegate](#Delegate) and [Designate](#Designate) below.) -
-
- -
- - Access Control List (ACL) - add - -
- A list of access control elements that define access control to a particular calendar system entity. (Reference: [RFC3744](https://tools.ietf.org/html/rfc3744) for its use in a WebDAV context.) -
-
- -
- - Accessibility - add - -
- Information pertaining to access to a resource by the physically disabled. This applies to Location Resources. -
-
- -
- - Admittance Info - add - -
- All information required to gain access to a resource. It applies to Location Resources. -
-
- -
- - Agenda - add - -
- See [Calendar](#Calendar). -
-
- -
- - Alarm - add - -
- Use of the terms alarm, reminder, alert, and notifications vary by implementation and can represent several things. - They can represent a setting applied to an event by which a user indicates they want a 'notification' to be triggered to 'remind' them about some event or action (cp. [VALARM](#VALARM) in [RFC5545](https://tools.ietf.org/html/rfc5545). - They can also be used to designate the type of 'alert' that serves as the notification (e.g., email message, audible sound, pop-up window). (Reference [RFC4791 (CalDAV)](https://tools.ietf.org/html/rfc4791), [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.6.6), [RFC5546 (iTip)](https://tools.ietf.org/html/rfc5546).) -
-
- -
- - Application/calendar + XML - add - -
- The MIME content type that indicates an iCalendar object expressed in XML. -
-
- - -
- - Appointment - add - -
- See [Calendar](#calendar). -
-
- - -
- - Attachment - add - -
- A document object associated with a calendar component. -
-
- - -
- - Attendee - add - -
- Specifies the participants or non-participants (e.g., room or resources) for an event. This property in iCalendar can contain multiple attributes specifying additional information, i.e., role, participation status, group membership, delegation, etc. (Reference: [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.6.4.1).) -
-
- - -
- - Autoconfiguration - add - -
- The process of configuring clients such as mobile devices or desktop applications to access a service, or class of service, with a minimum of input from the user of the device. See also [Autodiscovery](#Autodiscovery). -
-
- - -
- - Autodiscovery - add - -
- The process used to determine the services provided by a host, or for a domain, including retrieval of the recommended configuration values for those services. The autodiscovery functionality requires the service provider to declare in a standard way which services are available and what their configuration looks like for the requesting user. See also [Autoconfiguration](#Autoconfiguration). (Reference: [draft-daboo-aggregated-service-discovery](https://datatracker.ietf.org/doc/draft-daboo-aggregated-service-discovery/).) -
-
- - -
- - Autoschedule - add - -
- Accept scheduling invitations automatically with no human intervention. -
-
- - -
- - Booking Window - add - -
- The window of time in which a resource can be booked, relative to the start time of the event. -
-
- - -
- - CalDAV - add - -
- Extensions to the Web Distributed Authoring and Versioning (WebDAV) protocol to specify a standard way of accessing, managing and sharing calendar data based on the iCalendar format. Defined by two specifications, the first, RFC4791, specifies a calendar access protocol that allows Calendar User Agents to access and manage calendar data. The second specification, RFC 6638, specifies a standard way of performing scheduling transactions with iCalendar-based calendar components. This document defines the "calendar-auto-schedule" feature of CalDAV. (Reference: [RFC 4791](https://tools.ietf.org/html/rfc4791), and [RFC 6638](https://tools.ietf.org/html/rfc6638).) -
-
- - -
- - Calendar - add - -
- A collection of calendar items such as events, tasks, journal entries, etc. Examples include a person's or group's schedule, resource availability, and event listings. Typically an individual may own multiple calendars based on the same or different services. -
-
- - -
- - Calendar Access Rights - add - -
- See [Access Control](#AccessControl), [Access Control List](#ACL), [Delegate](#Delegate), and [Designate](#Designate). -
-
- - -
- - Calendar Collection - add - -
- A WebDAV collection used to represent a calendar containing a set of calendar object resources. (Reference: [RFC4791](https://tools.ietf.org/html/rfc4791) and [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.4).) -
-
- - -
- - Calendar Object Resource - add - -
- A WebDAV resource representing an iCalendar component typically stored inside a Calendar Collection (cp. Component). (Reference: [RFC4791](https://tools.ietf.org/html/rfc4791).) -
-
- - -
- - Calendar Service - add - -
- A server application that provides calendar user agents access to calendar stores. -
-
- - -
- - Calendar Store (CS) - add - -
- A data repository that may contain several calendars as well as properties and components of those calendars. A local calendar store is on the same device as the calendar user agent ([CUA](#CUA)). A remote calendar store is not on the same machine/device as the calendar user agent. (Reference: [RFC3283](https://tools.ietf.org/html/rfc3283).) -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- - -
- - title - add - -
- content -
-
- diff --git a/_appendixes/How-to-Contribute.md b/_appendixes/How-to-Contribute.md deleted file mode 100644 index d9e69c0..0000000 --- a/_appendixes/How-to-Contribute.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -layout: toc-type -title: How to Contribute -parent: "/Appendix/Appendixes" -mainParent: "Appendixes" -parents: 'Appendixes:/Appendix/Appendixes' -order: 5 ---- - -# How to Contribute to this Document - -This site has been made with [Jekyll](https://jekyllrb.com/), a [Git](http://git-scm.com/) based content to html converter. The markup language used is [Markdown](http://daringfireball.net/projects/markdown/syntax). - -[https://devguide.calconnect.org](https://devguide.calconnect.org) only serves the Wiki content, without any option to edit it. The sources of this Wiki are available at [https://github.com/CalConnect/DEVGUIDE](https://github.com/CalConnect/DEVGUIDE). All changes at GitHub will be pushed to https://devguide.calconnect.org on a regular base. At present this is a manual process which is done at least on a biweekly base during/after the TC DEVGUIDE calls at CalConnect, so it might take some time. - -## Ways to contribute - -### Send an email - -The editorial team is monitoring the public CalConnect [calendar developer's list](http://lists.calconnect.org/listinfo.cgi/caldeveloper-l-calconnect.org) so please send comments, corrections, etc to that list. - -### Raise an issue on GitHub - -The sources of this Wiki are available on GitHub at [DEVGUIDE](https://github.com/CalConnect/DEVGUIDE/issues). - -### Send a pull request - -Contributors who are familiar with Markdown and Git may also send a pull request. - -Note that this Wiki uses custom templates and css that are not available on GitHub, which means that the presentation on GitHub will be different from the presentation on [https://devguide.calconnect.org](https://devguide.calconnect.org). - -### Running locally - -To check changes made to your local copy you can install and run jekyll. - -#### Mac -Mixture between brew usage and rails (gem install) - -1. install plantuml for your local machine e.g. using 'brew install plantuml' -2. install jekyll from https://jekyllrb.com/ for your local machine e.g 'gem install bundler jekyll' -3. Install jekyll-plantuml using 'gem install jekyll-plantuml' -4. Checkout DEVGUIDE from Github (https://github.com/CalConnect/DEVGUIDE/) -5. Run local copy with 'jekyll serve' within the GIT directory and check content as shown in terminal window - -### Editorial conventions - -To give the Wiki a consistent appearance, please follow the rules below: - -* Use the blockquote character `>` when adding quotes from an RFC. -* Always add references to the original RFC. Link the html version of the RFC at http://tools.ietf.org/html/rfcXXXX. -* Add deep links using anchors if possible (i.e. like http://tools.ietf.org/html/rfcXXXX#section-1.2). -* Github Flavored Markdown supports XML comments, i.e. ``. These can be useful to invisibly annotate content of the wiki. - diff --git a/_appendixes/Links.md b/_appendixes/Links.md deleted file mode 100644 index aaa54e4..0000000 --- a/_appendixes/Links.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -layout: toc-type -title: Links to other interesting sites -parent: "/Appendix/Appendixes" -mainParent: "Appendixes" -parents: 'Appendixes:/Appendix/Appendixes' -order: 4 ---- - -# Links - -There are plenty of interesting pages about calendaring. - -## others - -Here you will find a unsorted collection of some others, we like and think are useful to you too: - -1. [Your Calendrical Fallacy Is...](http://yourcalendricalfallacyis.com/) by Dave Delong - -2. [Falsehoods programmers believe about time](http://infiniteundo.com/post/25326999628/falsehoods-programmers-believe-about-time) and [More falsehoods programmers believe about time; “wisdom of the crowd” edition](http://infiniteundo.com/post/25509354022/more-falsehoods-programmers-believe-about-time) by Noah Sussman - -3. [The evolution a developer's understanding of time](https://twitter.com/stephenbinns/status/842330300000665601) by Stephen Bonns - -4. [Calendar Facts](https://xkcd.com/1930/) by xkcd: A webcomic of romance, sarcasm, math, and language. - -5. [UTC is enough for everyone ...right?](https://zachholman.com/talk/utc-is-enough-for-everyone-right) Zach Holman talks about Calendar and such - -6. [whencanireusethiscalendar](https://www.whencanireusethiscalendar.com/) answers the question of when I can reuse this calendar again. \ No newline at end of file diff --git a/_config.yml b/_config.yml index 7e74060..dad5635 100755 --- a/_config.yml +++ b/_config.yml @@ -1,23 +1,22 @@ title: CalConnect DEVGUIDE author: Thomas Schäfer email: thomas.schaefer@1und1.de -description: > # this means to ignore newlines until "baseurl:" +description: > # this means to ignore newlines until `baseurl:` My modified template for CalConnect twitter_username: wsdwl -sass: - style: compressed +theme: jekyll-calconnect-theme + +plugins: + - jekyll/vite + - jekyll-sitemap collections: pages: output: true permalink: /:path/ - appendixes: - output: true - permalink: /Appendix/:path/ - plantuml: plantuml_jar: _bin/plantuml.jar # path to plantuml jar tmp_folder: _plantuml # tmp folder to put generated image files @@ -26,3 +25,10 @@ plantuml: exclude: - app.yaml + - config + - vite.config.ts + - package.json + - package-lock.json + - node_modules/ + - vendor/ + - firebase.json diff --git a/_data/navigation_sidebar.yml b/_data/navigation_sidebar.yml new file mode 100644 index 0000000..4f4da59 --- /dev/null +++ b/_data/navigation_sidebar.yml @@ -0,0 +1,201 @@ +sections: + - id: icalendar + match: "/icalendar" + title: iCalendar + items: + - type: collapsible + label: Overview + url: /icalendar/ + url_filter: /icalendar/ + children: + - type: link + label: A History of iCalendar + url: /icalendar/history/ + - type: link + label: Handling Dates and Times + url: /icalendar/dates-and-times/ + - type: link + label: Recurrences + url: /icalendar/recurrences/ + - type: link + label: Validation + url: /icalendar/validation/ + - type: collapsible + label: iCalendar Data Model + url: /icalendar/data-model/ + url_filter: /icalendar/data-model/ + children: + - type: link + label: Simple Event + url: /icalendar/data-model/simple-event/ + - type: link + label: UID + url: /icalendar/data-model/uid/ + + - id: jscalendar + match: "/jscalendar" + title: jsCalendar + items: + - type: collapsible + label: Overview + url: /jscalendar/ + url_filter: /jscalendar/ + children: + - type: link + label: Implementations + url: /jscalendar/implementations/ + + - id: caldav + match: "/caldav" + title: CalDAV + items: + - type: collapsible + label: Overview + url: /caldav/ + url_filter: /caldav/ + children: + - type: link + label: Building a CalDAV client + url: /caldav/building-a-client/ + - type: link + label: Client + url: /caldav/client/ + - type: link + label: Server + url: /caldav/server/ + - type: link + label: CalDAV libraries + url: /caldav/libraries/ + - type: link + label: CalDAV services + url: /caldav/services/ + + - id: carddav + match: "/carddav" + title: CardDAV + items: + - type: collapsible + label: Overview + url: /carddav/ + url_filter: /carddav/ + children: + - type: link + label: Building a CardDAV client + url: /carddav/building-a-client/ + - type: link + label: Client + url: /carddav/client/ + - type: link + label: Server + url: /carddav/server/ + - type: link + label: CardDAV libraries + url: /carddav/libraries/ + - type: link + label: CardDAV services + url: /carddav/services/ + + - id: scheduling + match_list: + - "/scheduling" + - "/itip" + - "/imip" + title: Scheduling + items: + - type: collapsible + label: Overview + url: /scheduling/ + url_filter: /scheduling/ + children: + - type: link + label: FreeBusy and Availability + url: /scheduling/free-busy/ + - type: collapsible + label: iTIP + url: /itip/ + url_filter: /itip/ + children: + - type: link + label: iTIP introduction + url: /itip/introduction/ + - type: link + label: iTIP - Complex Topics + url: /itip/complex-cases/ + - type: collapsible + label: iMIP + url: /imip/ + url_filter: /imip/ + children: + - type: link + label: Introduction + url: /imip/introduction/ + - type: link + label: Best Practices + url: /imip/best-practices/ + - type: link + label: iMIP and Security + url: /imip/security/ + + - id: tasks + match: "/tasks" + title: Tasks + items: + - type: collapsible + label: Overview + url: /tasks/ + url_filter: /tasks/ + children: + - type: link + label: Component + url: /tasks/component/ + + - id: time-zones + match: "/time-zones" + title: Time Zones + items: + - type: collapsible + label: Overview + url: /time-zones/ + url_filter: /time-zones/ + children: + - type: link + label: Best Practices + url: /time-zones/best-practices/ + - type: link + label: Sources + url: /time-zones/sources/ + - type: link + label: TZDS + url: /time-zones/tzds/ + + - id: vcard + match: "/vcard" + title: vCard + items: + - type: collapsible + label: Overview + url: /vcard/ + url_filter: /vcard/ + children: + - type: link + label: vCard 4.0 + url: /vcard/vcard-4/ + - type: link + label: vCard 5.0 + url: /vcard/vcard-5/ + + - id: publishing + match: "/publishing" + title: Publishing Events + items: + - type: link + label: Overview + url: /publishing/ + + - id: calendar-spam + match: "/calendar-spam" + title: Calendar Spam + items: + - type: link + label: Overview + url: /calendar-spam/ diff --git a/_frontend/entrypoints/application.css b/_frontend/entrypoints/application.css new file mode 100644 index 0000000..53c8ed7 --- /dev/null +++ b/_frontend/entrypoints/application.css @@ -0,0 +1,810 @@ +@import "tailwindcss"; +@plugin "@tailwindcss/typography"; + +/* Enable class-based dark mode */ +@custom-variant dark (&:where(.dark, .dark *)); + +/* Content scanning - paths relative to this CSS file at _frontend/entrypoints/ */ +@source "../../_layouts/**/*.html"; +@source "../../_includes/**/*.html"; +@source "../../_pages/**/*.md"; +@source "../../_appendixes/**/*.md"; +@source "../**/*.{js,ts}"; + +/* Custom theme configuration */ +@theme { + /* Font families */ + --font-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, sans-serif; + --font-mono: 'JetBrains Mono', 'Fira Code', Consolas, monospace; + + /* Primary colors */ + --color-primary-50: #eef2ff; + --color-primary-100: #e0e7ff; + --color-primary-200: #c7d2fe; + --color-primary-300: #a5b4fc; + --color-primary-400: #818cf8; + --color-primary-500: #6366f1; + --color-primary-600: #4f46e5; + --color-primary-700: #4338ca; + --color-primary-800: #3730a3; + --color-primary-900: #312e81; + + /* Accent color */ + --color-accent-400: #22d3ee; + --color-accent-500: #06b6d4; +} + +/* Custom base styles */ +@layer base { + html { + scroll-behavior: smooth; + } + + body { + font-feature-settings: "kern" 1, "liga" 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + main { + padding-top: 64px; + } + + ::selection { + background-color: rgba(99, 102, 241, 0.2); + } + + :focus-visible { + outline: 2px solid var(--color-primary-500, #6366f1); + outline-offset: 2px; + } + + [id] { + scroll-margin-top: 5rem; + } +} + +/* ===== Documentation layout ===== */ +.documentation { + display: flex; + max-width: 1400px; + margin: 0 auto; + margin-top: 64px; + padding: 2rem 1rem; + gap: 2rem; +} + +@media (min-width: 1024px) { + .documentation { + padding: 2rem 2rem; + } +} + +.docs-nav { + width: 220px; + flex-shrink: 0; +} + +@media (min-width: 1024px) { + .docs-nav-content { + position: sticky; + top: 5rem; + max-height: calc(100vh - 6rem); + overflow-y: auto; + scrollbar-width: thin; + scrollbar-color: #cbd5e1 transparent; + } + + .docs-nav-content::-webkit-scrollbar { width: 4px; } + .docs-nav-content::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 2px; } + .dark .docs-nav-content { scrollbar-color: #334155 transparent; } + .dark .docs-nav-content::-webkit-scrollbar-thumb { background: #334155; } +} + +.documentation > article { + flex: 1; + min-width: 0; + max-width: 75ch; +} + +.documentation > article > header { + margin-bottom: 2rem; + padding-bottom: 1.5rem; + border-bottom: 1px solid #e2e8f0; +} + +.documentation > article > header h1 { + font-size: 2.25rem; + font-weight: 700; + color: #0f172a; + line-height: 1.2; + margin: 0; +} + +@media (max-width: 1023px) { + .docs-nav { + display: none; + } +} + +/* ===== Sidebar navigation ===== */ +.docs-nav .nav-section { + margin-bottom: 1.5rem; +} + +.docs-nav .nav-section-title { + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: #94a3b8; + margin-bottom: 0.5rem; + padding: 0 0.75rem; +} + +.docs-nav .nav-group-title { + font-size: 0.6875rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: #94a3b8; + margin-top: 1rem; + margin-bottom: 0.25rem; + padding: 0.25rem 0.75rem; + border-top: 1px solid #e2e8f0; +} + +.docs-nav .nav-group-title:first-child { + margin-top: 0; + border-top: none; +} + +.docs-nav .nav-items { + list-style: none; + padding: 0; + margin: 0; +} + +.docs-nav .nav-items li { + margin-bottom: 0.125rem; +} + +.docs-nav .nav-items a { + display: block; + padding: 0.5rem 0.75rem; + color: #64748b; + text-decoration: none; + border-radius: 0.375rem; + font-size: 0.875rem; + transition: all 0.15s ease; +} + +.docs-nav .nav-items a:hover { + background: #f1f5f9; + color: #1e293b; +} + +.docs-nav .nav-items a.active { + background: #eef2ff; + color: #4f46e5; + font-weight: 500; +} + +.nav-subsection { + margin-left: 0.75rem; + border-left: 2px solid #e2e8f0; + padding-left: 0.75rem; + margin-top: 0.25rem; +} + +.nav-toggle { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.75rem; + color: #64748b; + font-size: 0.875rem; + border-radius: 0.375rem; + cursor: pointer; + transition: all 0.15s ease; + user-select: none; +} + +.nav-toggle:hover { + background: #f1f5f9; + color: #1e293b; +} + +.nav-toggle::after { + content: ''; + display: inline-block; + width: 5px; + height: 5px; + border-right: 2px solid currentColor; + border-bottom: 2px solid currentColor; + transform: rotate(-45deg); + transition: transform 0.2s ease; + margin-left: auto; + flex-shrink: 0; +} + +.nav-toggle.open::after { + transform: rotate(45deg); +} + +.nav-subsection.collapsed { + display: none; +} + +.dark .documentation > article > header { + border-bottom-color: #334155; +} + +.dark .documentation > article > header h1 { + color: #f8fafc; +} + +.dark .docs-nav .nav-group-title { + color: #64748b; + border-top-color: #334155; +} + +.dark .docs-nav .nav-items a:hover { + background: #1e293b; + color: #f1f5f9; +} + +.dark .docs-nav .nav-items a.active { + background: #312e81; + color: #a5b4fc; +} + +.dark .nav-toggle:hover { + background: #1e293b; + color: #f1f5f9; +} + +.dark .nav-subsection { + border-left-color: #334155; +} + +/* ===== Scroll progress bar ===== */ +#scroll-progress { + position: fixed; + top: 64px; + left: 0; + height: 2px; + background: linear-gradient(90deg, #6366f1, #06b6d4); + z-index: 40; + width: 0%; + transition: width 0.1s linear; +} + +/* ===== Mobile sidebar toggle ===== */ +.mobile-sidebar-toggle { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 0.75rem; + margin-bottom: 1rem; + font-size: 0.875rem; + font-weight: 500; + color: #6366f1; + background: #eef2ff; + border: 1px solid #c7d2fe; + border-radius: 0.5rem; + cursor: pointer; + transition: all 0.15s ease; +} + +.dark .mobile-sidebar-toggle { + color: #a5b4fc; + background: #312e81; + border-color: #4338ca; +} + +.mobile-sidebar-toggle:hover { + background: #e0e7ff; +} + +.dark .mobile-sidebar-toggle:hover { + background: #3730a3; +} + +@media (min-width: 1024px) { + .mobile-sidebar-toggle { + display: none; + } +} + +/* ===== Code copy button ===== */ +.code-block-wrapper { + position: relative; +} + +.code-copy-btn { + position: absolute; + top: 0.5rem; + right: 0.5rem; + padding: 0.375rem 0.625rem; + font-size: 0.75rem; + font-family: 'Inter', system-ui, sans-serif; + color: #94a3b8; + background: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 0.375rem; + cursor: pointer; + opacity: 0; + transition: all 0.15s ease; +} + +.documentation .doc-content pre:hover .code-copy-btn { + opacity: 1; +} + +.code-copy-btn:hover { + color: #e2e8f0; + background: rgba(255, 255, 255, 0.15); +} + +.code-copy-btn.copied { + color: #4ade80; + border-color: #4ade80; +} + +/* ===== Prev/Next page navigation ===== */ +.page-nav { + display: flex; + justify-content: space-between; + gap: 1rem; + margin-top: 3rem; + padding-top: 2rem; + border-top: 1px solid #e2e8f0; +} + +.dark .page-nav { + border-top-color: #334155; +} + +.page-nav a { + display: flex; + flex-direction: column; + gap: 0.25rem; + padding: 0.75rem 1rem; + border: 1px solid #e2e8f0; + border-radius: 0.5rem; + text-decoration: none; + transition: all 0.15s ease; + max-width: 45%; +} + +.dark .page-nav a { + border-color: #334155; +} + +.page-nav a:hover { + border-color: #c7d2fe; + background: #f8fafc; +} + +.dark .page-nav a:hover { + border-color: #4338ca; + background: #1e293b; +} + +.page-nav .page-nav-label { + font-size: 0.75rem; + color: #94a3b8; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.page-nav .page-nav-title { + font-size: 0.875rem; + font-weight: 500; + color: #4f46e5; +} + +.dark .page-nav .page-nav-title { + color: #818cf8; +} + +.page-nav a.next { + text-align: right; + margin-left: auto; +} + +/* ===== Edit on GitHub ===== */ +.edit-on-github { + display: inline-flex; + align-items: center; + gap: 0.375rem; + margin-top: 1rem; + font-size: 0.8125rem; + color: #94a3b8; + text-decoration: none; + transition: color 0.15s ease; +} + +.edit-on-github:hover { + color: #6366f1; + text-decoration: none; +} + +.dark .edit-on-github:hover { + color: #818cf8; +} + +.edit-on-github svg { + width: 14px; + height: 14px; +} + +/* ===== Documentation body typography ===== */ +.documentation .doc-content { + font-size: 1rem; + line-height: 1.75; +} + +.documentation .doc-content h2 { + font-size: 1.5rem; + font-weight: 600; + margin-top: 2.5rem; + margin-bottom: 1rem; + color: #1e293b; +} + +.documentation .doc-content h3 { + font-size: 1.25rem; + font-weight: 600; + margin-top: 2rem; + margin-bottom: 0.75rem; + color: #334155; +} + +.documentation .doc-content p { + margin-bottom: 1rem; + color: #475569; +} + +.documentation .doc-content a { + color: #6366f1; + text-decoration: underline; + text-underline-offset: 2px; +} + +.documentation .doc-content a:hover { + color: #4f46e5; +} + +.documentation .doc-content ul, +.documentation .doc-content ol, +.documentation .doc-content dl, +.documentation .post-content ul, +.documentation .post-content ol, +.documentation .post-content dl, +.documentation .sectionbody ul, +.documentation .sectionbody ol, +.documentation .sectionbody dl { + margin-bottom: 1.25rem; + padding-left: 1.75rem; + color: #475569; + list-style-position: outside; +} + +.documentation .doc-content ul, +.documentation .post-content ul, +.documentation .sectionbody ul { + list-style-type: disc !important; +} + +.documentation .doc-content ul ul, +.documentation .post-content ul ul, +.documentation .sectionbody ul ul { + list-style-type: circle !important; + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.documentation .doc-content ol, +.documentation .post-content ol, +.documentation .sectionbody ol { + list-style-type: decimal !important; +} + +.doc-content nav[aria-label="Breadcrumb"] ol, +.doc-content nav ol.list-none, +ol.list-none { + list-style: none !important; + padding-left: 0 !important; +} + +.doc-content nav[aria-label="Breadcrumb"] li, +.doc-content nav ol.list-none li { + margin-bottom: 0 !important; +} + +.documentation .doc-content li, +.documentation .post-content li, +.documentation .sectionbody li { + margin-bottom: 0.625rem; + line-height: 1.7; +} + +.documentation .doc-content li::marker, +.documentation .post-content li::marker, +.documentation .sectionbody li::marker { + color: #6366f1; +} + +.documentation .doc-content dt { + font-weight: 600; + color: #1e293b; + margin-bottom: 0.25rem; +} + +.documentation .doc-content dd { + margin-left: 1.5rem; + margin-bottom: 0.75rem; + color: #475569; +} + +.documentation .doc-content pre { + background: #1e293b; + color: #e2e8f0; + padding: 1rem 1.25rem; + border-radius: 0.5rem; + overflow-x: auto; + margin: 1.5rem 0; +} + +.documentation .doc-content code { + font-family: 'JetBrains Mono', 'Fira Code', monospace; + font-size: 0.875rem; +} + +.documentation .doc-content :not(pre) > code { + background: #f1f5f9; + padding: 0.125rem 0.375rem; + border-radius: 0.25rem; + color: #1e293b; + font-size: 0.8125rem; +} + +.documentation .doc-content table { + width: 100%; + border-collapse: collapse; + margin: 1.5rem 0; +} + +.documentation .doc-content th, +.documentation .doc-content td { + padding: 0.75rem 1rem; + text-align: left; + border-bottom: 1px solid #e2e8f0; +} + +.documentation .doc-content th { + background: #f8fafc; + font-weight: 600; + color: #1e293b; +} + +/* ===== DEVGUIDE-specific: Dark mode ===== */ +.dark .documentation .doc-content h2 { + color: #f1f5f9; +} + +.dark .documentation .doc-content h3 { + color: #e2e8f0; +} + +.dark .documentation .doc-content p { + color: #94a3b8; +} + +.dark .documentation .doc-content ul, +.dark .documentation .doc-content ol, +.dark .documentation .doc-content dl, +.dark .documentation .post-content ul, +.dark .documentation .post-content ol, +.dark .documentation .post-content dl, +.dark .documentation .sectionbody ul, +.dark .documentation .sectionbody ol, +.dark .documentation .sectionbody dl { + color: #94a3b8; +} + +.dark .documentation .doc-content li::marker, +.dark .documentation .post-content li::marker, +.dark .documentation .sectionbody li::marker { + color: #818cf8; +} + +.dark .documentation .doc-content dt { + color: #f1f5f9; +} + +.dark .documentation .doc-content dd { + color: #94a3b8; +} + +.dark .documentation .doc-content :not(pre) > code { + background: #334155; + color: #e2e8f0; +} + +.dark .documentation .doc-content th, +.dark .documentation .doc-content td { + border-bottom-color: #334155; +} + +.dark .documentation .doc-content th { + background: #1e293b; + color: #f1f5f9; +} + +/* ===== DEVGUIDE-specific: Glossary ===== */ +.glossary-letter { + font-size: 1.75rem; + font-weight: 700; + color: #0f172a; + margin-top: 2.5rem; + margin-bottom: 0.75rem; + padding-bottom: 0.5rem; + border-bottom: 2px solid #c7d2fe; +} + +.dark .glossary-letter { + color: #f1f5f9; + border-bottom-color: #4338ca; +} + +.glossary-entry { + border-bottom: 1px solid #e2e8f0; + transition: background 0.15s ease; +} + +.dark .glossary-entry { + border-bottom-color: #1e293b; +} + +.glossary-entry:hover { + background: #f8fafc; +} + +.dark .glossary-entry:hover { + background: #1e293b; +} + +.glossary-entry[open] { + background: #fafafe; +} + +.dark .glossary-entry[open] { + background: #0f172a; +} + +.glossary-term { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 0.75rem 1rem; + font-size: 0.9375rem; + font-weight: 600; + color: #1e293b; + cursor: pointer; + list-style: none; + user-select: none; + transition: color 0.15s ease; +} + +.glossary-term::-webkit-details-marker { display: none; } + +.glossary-term::after { + content: ''; + flex-shrink: 0; + width: 8px; + height: 8px; + border-right: 2px solid #94a3b8; + border-bottom: 2px solid #94a3b8; + transform: rotate(-45deg); + transition: transform 0.2s ease, border-color 0.2s ease; +} + +.glossary-entry[open] .glossary-term::after { + transform: rotate(45deg); + border-color: #6366f1; +} + +.glossary-entry[open] .glossary-term { + color: #4f46e5; +} + +.dark .glossary-term { + color: #e2e8f0; +} + +.dark .glossary-term::after { + border-color: #64748b; +} + +.dark .glossary-entry[open] .glossary-term::after { + border-color: #818cf8; +} + +.dark .glossary-entry[open] .glossary-term { + color: #a5b4fc; +} + +.glossary-def { + font-size: 0.9375rem; + color: #475569; + line-height: 1.7; + padding: 0 1rem 1rem 1rem; + margin: 0; +} + +.dark .glossary-def { + color: #94a3b8; +} + +.glossary-def a { + color: #6366f1; + text-decoration: underline; + text-underline-offset: 2px; +} + +.glossary-def a:hover { + color: #4f46e5; +} + +/* ===== DEVGUIDE-specific: Active header nav ===== */ +.nav-link-active { + color: #4f46e5 !important; +} + +.dark .nav-link-active { + color: #818cf8 !important; +} + +/* ===== DEVGUIDE-specific: Mobile sidebar overlay ===== */ +@media (max-width: 1023px) { + .docs-nav { + display: none; + position: fixed; + top: 64px; + left: 0; + bottom: 0; + width: 280px; + background: white; + z-index: 45; + box-shadow: 4px 0 24px rgba(0, 0, 0, 0.15); + padding: 1rem; + overflow-y: auto; + overscroll-behavior: contain; + } + + .dark .docs-nav { + background: #0f172a; + box-shadow: 4px 0 24px rgba(0, 0, 0, 0.5); + } + + .docs-nav.mobile-open { + display: block; + } + + .docs-nav-backdrop { + display: none; + position: fixed; + inset: 0; + top: 64px; + background: rgba(0, 0, 0, 0.4); + z-index: 44; + } + + .docs-nav-backdrop.active { + display: block; + } +} diff --git a/_frontend/entrypoints/application.js b/_frontend/entrypoints/application.js new file mode 100644 index 0000000..a1045ef --- /dev/null +++ b/_frontend/entrypoints/application.js @@ -0,0 +1,21 @@ +import '../js/theme.js' +import '../js/navigation.js' + +document.addEventListener('DOMContentLoaded', function() { + // Active header nav — highlight Standards/Resources/About + var currentPath = window.location.pathname; + document.querySelectorAll('[data-nav-section]').forEach(function(el) { + var section = el.getAttribute('data-nav-section'); + var isActive = false; + if (section === 'standards') { + isActive = /^\/(icalendar|caldav|carddav|scheduling|time-zones|itip|imip|tasks|publishing|jscalendar|vcard|data-model|calendar-spam)/.test(currentPath); + } else if (section === 'resources') { + isActive = currentPath.indexOf('/resources/') === 0; + } else if (section === 'about') { + isActive = currentPath === '/about/'; + } + if (isActive) { + el.classList.add('nav-link-active'); + } + }); +}); diff --git a/_frontend/js/navigation.js b/_frontend/js/navigation.js new file mode 100644 index 0000000..a7c6f81 --- /dev/null +++ b/_frontend/js/navigation.js @@ -0,0 +1,66 @@ +/** + * Navigation Script + * Handles mobile menu toggle and active state highlighting + */ + +(function() { + 'use strict'; + + /** + * Initialize mobile menu toggle + */ + function initMobileMenu() { + var menuButton = document.getElementById('mobile-menu-btn'); + var mobileMenu = document.getElementById('mobile-menu'); + + if (menuButton && mobileMenu) { + menuButton.addEventListener('click', function() { + var isExpanded = menuButton.getAttribute('aria-expanded') === 'true'; + menuButton.setAttribute('aria-expanded', !isExpanded); + mobileMenu.classList.toggle('hidden'); + }); + } + } + + /** + * Highlight active navigation items + */ + function initActiveNav() { + var currentPath = window.location.pathname; + + // Sidebar navigation + var sidebarLinks = document.querySelectorAll('.docs-nav .nav-items a'); + sidebarLinks.forEach(function(link) { + var href = link.getAttribute('href'); + if (href) { + // Normalize paths for comparison + var linkPath = href.replace(/\/$/, ''); + var pagePath = currentPath.replace(/\/$/, ''); + if (linkPath === pagePath) { + link.classList.add('active'); + } + } + }); + + // Header navigation + var headerLinks = document.querySelectorAll('nav a[href]'); + headerLinks.forEach(function(link) { + var href = link.getAttribute('href'); + if (href && href !== '/') { + var linkPath = href.replace(/\/$/, ''); + var pagePath = currentPath.replace(/\/$/, ''); + if (pagePath.indexOf(linkPath) === 0) { + link.classList.add('active'); + } + } + }); + } + + /** + * Initialize on DOM ready + */ + document.addEventListener('DOMContentLoaded', function() { + initMobileMenu(); + initActiveNav(); + }); +})(); diff --git a/_frontend/js/theme.js b/_frontend/js/theme.js new file mode 100644 index 0000000..7bab78a --- /dev/null +++ b/_frontend/js/theme.js @@ -0,0 +1,58 @@ +/** + * Theme Toggle Script + * Handles dark/light mode switching with localStorage persistence + */ + +(function() { + 'use strict'; + + /** + * Get the user's theme preference + * Priority: localStorage > system preference + */ + function getThemePreference() { + if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) { + return localStorage.getItem('theme'); + } + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; + } + + /** + * Set the theme on the document + */ + function setTheme(theme) { + if (theme === 'dark') { + document.documentElement.classList.add('dark'); + } else { + document.documentElement.classList.remove('dark'); + } + localStorage.setItem('theme', theme); + } + + /** + * Initialize theme immediately to prevent flash + */ + setTheme(getThemePreference()); + + /** + * Handle DOM ready for toggle button + */ + document.addEventListener('DOMContentLoaded', function() { + var toggle = document.getElementById('theme-toggle'); + if (toggle) { + toggle.addEventListener('click', function() { + var currentTheme = document.documentElement.classList.contains('dark') ? 'dark' : 'light'; + setTheme(currentTheme === 'dark' ? 'light' : 'dark'); + }); + } + }); + + /** + * Handle system preference changes + */ + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) { + if (!localStorage.getItem('theme')) { + setTheme(e.matches ? 'dark' : 'light'); + } + }); +})(); diff --git a/_includes/footer.html b/_includes/footer.html index c44a30b..f905c64 100755 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,51 +1,64 @@ -