one-shot first ver
No files matched your search
@@ -0,0 +1,2 @@
|
||||
[alias]
|
||||
xtask = "run -p xtask --"
|
||||
@@ -0,0 +1,7 @@
|
||||
*~
|
||||
plan/
|
||||
/target
|
||||
/dist
|
||||
/corpus
|
||||
/log
|
||||
.DS_Store
|
||||
@@ -0,0 +1,32 @@
|
||||
# PrintCraft — instructions for agents
|
||||
|
||||
PrintCraft is a clean-room, open-source, Rust-native PDF application targeting Adobe Acrobat Pro parity. It runs natively on macOS, Windows and Linux, and on the web via WASM. It is the sibling of `../photocraft` (a Photoshop-class editor) and follows the same conventions.
|
||||
|
||||
## Start every session here
|
||||
1. Read `plan/STATUS.md`: the current milestone, the next unchecked task and any blockers.
|
||||
2. Read that task in `plan/execution-plan.md` §3, the relevant section of `plan/architecture.md`, and the README of the crate you're touching.
|
||||
3. Follow the **autonomous operation protocol** in `plan/execution-plan.md` §7 (orient → plan → implement + test → verify → record → commit). Don't stop to ask unless §7 lists the decision as the user's.
|
||||
|
||||
`plan/` is gitignored (local-only, like PhotoCraft). The machine-readable parity checklist lives in `parity/` (committed).
|
||||
|
||||
## Non-negotiables
|
||||
- **Clean-room.**
|
||||
- Never read, disassemble or copy anything inside the Acrobat bundle (names and listings only). **Never open `Contents/Resources/JavaScripts/`.**
|
||||
- Behaviour comes from public docs, specs (ISO 32000-2, the Arlington model) and black-box observation (`plan/acrobat/`).
|
||||
- Never copy GPL/AGPL code. MuPDF, Ghostscript, Poppler, veraPDF and DSS run only as external oracle processes.
|
||||
- See `plan/README.md` §Clean-room and `plan/adr/0001`.
|
||||
- **Privacy.** When observing Acrobat, use synthetic fixtures only. Never capture the Home view, recent files or account info. Capture by window id (`plan/acrobat/tools/`). Never commit Acrobat outputs, corpus files or personal data.
|
||||
- **Layering.** Nothing below L7 depends on egui/winit/eframe/rfd (`plan/architecture.md` §3). `cos`/`filters`/`crypt`/`arlington` stay standalone.
|
||||
- **Fidelity.** The PDF object graph is the model. Preserve unknown data. Saves are incremental unless a full rewrite is required. Never silently drop or repair data without recording it.
|
||||
- **Rust only** in the product and build (`xtask`). No handwritten JS/TS.
|
||||
- **Quality gates** before every commit: `cargo fmt --check`, `cargo clippy --workspace -- -D warnings`, `cargo test --workspace`, and the wasm check once `xtask ci` exists (M0).
|
||||
- **Commits:** one task id per commit (e.g. `M1.4: xref stream reader`). Commit only green states. End messages with the attribution line required by the environment.
|
||||
|
||||
## Running and looking at the app
|
||||
- `cargo run -p printcraft -- <file.pdf>` opens the desktop app.
|
||||
- `cargo xtask demo-pdf` builds `dist/demo/printcraft-showcase.pdf` (needs Chrome) for visual checks.
|
||||
- For UI work, **look at the result**: screenshot the window by id (`plan/acrobat/tools/winlist.swift` + `screencapture -l`) until the UI control channel (M3.9) exists, then use `ui.screenshot`. Compare against `plan/acrobat/02-ui-ux.md`.
|
||||
- Parallel agents: use a separate `CARGO_TARGET_DIR` per agent and separate git worktrees.
|
||||
|
||||
## Current bootstrap debt (tracked in STATUS.md)
|
||||
- `printcraft-render` renders through the `hayro` crate directly and inspects documents through `lopdf`. Both get replaced by `cos` / `model` / the DisplayList device (M1–M2, ADR-0004).
|
||||
@@ -0,0 +1,54 @@
|
||||
[workspace]
|
||||
resolver = "3"
|
||||
members = ["crates/*", "apps/*", "xtask"]
|
||||
default-members = ["crates/*", "apps/printcraft", "xtask"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
license = "MIT OR Apache-2.0"
|
||||
rust-version = "1.90"
|
||||
repository = "https://github.com/storytold/printcraft"
|
||||
|
||||
[workspace.dependencies]
|
||||
# internal
|
||||
printcraft-geom = { path = "crates/geom" }
|
||||
printcraft-render = { path = "crates/render" }
|
||||
printcraft-engine = { path = "crates/engine" }
|
||||
printcraft-ui-egui = { path = "crates/ui-egui" }
|
||||
|
||||
# pdf
|
||||
hayro = "0.7.1"
|
||||
hayro-syntax = "0.7.2"
|
||||
lopdf = "0.45"
|
||||
|
||||
# foundation
|
||||
thiserror = "2"
|
||||
serde = { version = "1", features = ["derive", "rc"] }
|
||||
serde_json = "1"
|
||||
log = "0.4"
|
||||
kurbo = "0.12"
|
||||
|
||||
# ui
|
||||
egui = "0.36"
|
||||
egui_extras = { version = "0.36", default-features = false, features = ["svg"] }
|
||||
eframe = { version = "0.36", default-features = false }
|
||||
egui_kittest = "0.36"
|
||||
rfd = "0.17"
|
||||
|
||||
[workspace.lints.rust]
|
||||
unsafe_code = "deny"
|
||||
|
||||
[workspace.lints.clippy]
|
||||
dbg_macro = "warn"
|
||||
todo = "warn"
|
||||
|
||||
[profile.dev.package."*"]
|
||||
opt-level = 2
|
||||
|
||||
[profile.dev]
|
||||
opt-level = 1
|
||||
|
||||
[profile.release]
|
||||
lto = "thin"
|
||||
codegen-units = 1
|
||||
@@ -0,0 +1,15 @@
|
||||
PrintCraft
|
||||
Copyright the PrintCraft contributors. Licensed under MIT OR Apache-2.0.
|
||||
|
||||
This product bundles or depends on third-party material under the following licences:
|
||||
|
||||
- Lucide icons (assets/icons/*.svg) — ISC License. See assets/icons/LICENSE-lucide.txt.
|
||||
- Inter typeface (assets/fonts/Inter-*.ttf) — SIL Open Font License 1.1. See assets/fonts/OFL-Inter.txt.
|
||||
- JetBrains Mono typeface (assets/fonts/JetBrainsMono-*.ttf) — SIL Open Font License 1.1. See assets/fonts/OFL-JetBrainsMono.txt.
|
||||
- hayro (rendering, via crates.io) — Apache-2.0 OR MIT. Its `embed-fonts` feature bundles the Foxit
|
||||
standard-14 Type 1 fonts under BSD-3-Clause ("Copyright 2014 PDFium Authors"), and hayro-cmap bundles
|
||||
Adobe CMap resources under BSD-3-Clause.
|
||||
- lopdf (bootstrap document inspection, via crates.io) — MIT.
|
||||
|
||||
Asset licences are not visible to cargo-deny; keep this file current whenever assets or asset-bundling
|
||||
dependencies change (plan/adr/0002, 0006).
|
||||
@@ -0,0 +1,16 @@
|
||||
PrintCraft
|
||||
==========
|
||||
|
||||
From the artcraft team
|
||||
|
||||
A clean-room, open-source PDF application written in Rust, aiming at Adobe Acrobat Pro parity. It runs natively on macOS, Windows and Linux, and in the browser via WebAssembly. It is a sibling project of PhotoCraft.
|
||||
|
||||
**Status:** early. The viewer slice works; the core PDF object layer (M1) is next. The plan lives in `plan/` (local) and the rules for contributors and agents are in `CLAUDE.md`.
|
||||
|
||||
```sh
|
||||
cargo run -p printcraft -- some.pdf # desktop app
|
||||
cargo xtask demo-pdf # build dist/demo/printcraft-showcase.pdf (needs Chrome)
|
||||
cargo run -p printcraft -- dist/demo/printcraft-showcase.pdf --panel bookmarks
|
||||
```
|
||||
|
||||
Licence: MIT OR Apache-2.0 (proposed). Third-party material is listed in `NOTICE`.
|
||||
@@ -0,0 +1,14 @@
|
||||
[package]
|
||||
name = "printcraft"
|
||||
description = "PrintCraft desktop app"
|
||||
version.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
|
||||
[dependencies]
|
||||
printcraft-ui-egui = { workspace = true }
|
||||
eframe = { workspace = true, features = ["default_fonts", "wgpu", "accesskit", "wayland", "x11"] }
|
||||
egui = { workspace = true }
|
||||
@@ -0,0 +1,56 @@
|
||||
//! PrintCraft desktop app.
|
||||
//!
|
||||
//! Usage: `printcraft [options] [files…]`
|
||||
//!
|
||||
//! View options (applied after the files open; also the seed of the UI control channel):
|
||||
//! `--page N --zoom 150 --layout continuous|two-up|single --panel comments|bookmarks|pages|fields|layers|attachments|none
|
||||
//! --theme light|dark --mode all|read|edit|convert|sign --tool <catalogue id> --left open|closed
|
||||
//! --organize on --fields on --dialog properties|shortcuts|about --palette <query> --home on`
|
||||
|
||||
use printcraft_ui_egui::PrintCraftApp;
|
||||
|
||||
fn main() -> eframe::Result {
|
||||
let mut files = Vec::new();
|
||||
let mut options: Vec<(String, String)> = Vec::new();
|
||||
let mut args = std::env::args().skip(1);
|
||||
while let Some(a) = args.next() {
|
||||
match a.as_str() {
|
||||
"--version" => {
|
||||
println!("printcraft {}", env!("CARGO_PKG_VERSION"));
|
||||
return Ok(());
|
||||
}
|
||||
flag if flag.starts_with("--") => {
|
||||
let value = args.next().unwrap_or_default();
|
||||
options.push((flag.trim_start_matches("--").to_string(), value));
|
||||
}
|
||||
_ => files.push(a),
|
||||
}
|
||||
}
|
||||
let integrated = cfg!(target_os = "macos");
|
||||
let mut viewport = egui::ViewportBuilder::default()
|
||||
.with_title("PrintCraft")
|
||||
.with_inner_size([1440.0, 920.0])
|
||||
.with_min_inner_size([820.0, 520.0])
|
||||
.with_drag_and_drop(true);
|
||||
if integrated {
|
||||
viewport = viewport.with_fullsize_content_view(true).with_titlebar_shown(false).with_title_shown(false);
|
||||
}
|
||||
let native = eframe::NativeOptions { viewport, ..Default::default() };
|
||||
eframe::run_native(
|
||||
"PrintCraft",
|
||||
native,
|
||||
Box::new(move |_cc| {
|
||||
let mut app = PrintCraftApp::new();
|
||||
app.integrated_titlebar = integrated;
|
||||
for f in files {
|
||||
app.open_path(&f);
|
||||
}
|
||||
for (k, v) in options {
|
||||
if let Err(e) = app.set_option(&k, &v) {
|
||||
eprintln!("printcraft: --{k} {v}: {e}");
|
||||
}
|
||||
}
|
||||
Ok(Box::new(app))
|
||||
}),
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
# Illustrative sample data behind the charts on page 7 of the PrintCraft showcase.
|
||||
# These are made-up numbers for demonstration, not measurements.
|
||||
chart,series,label,value
|
||||
pages_per_second,throughput,Text,189
|
||||
pages_per_second,throughput,Forms,139
|
||||
pages_per_second,throughput,Vector,94
|
||||
pages_per_second,throughput,Scans,70
|
||||
pages_per_second,throughput,Maps,43
|
||||
conformance_percent,Text,0.1,74
|
||||
conformance_percent,Text,0.2,82
|
||||
conformance_percent,Text,0.3,89
|
||||
conformance_percent,Text,0.4,94
|
||||
conformance_percent,Text,0.5,97
|
||||
conformance_percent,Vector,0.1,66
|
||||
conformance_percent,Vector,0.2,73
|
||||
conformance_percent,Vector,0.3,80
|
||||
conformance_percent,Vector,0.4,87
|
||||
conformance_percent,Vector,0.5,92
|
||||
conformance_percent,Forms,0.1,62
|
||||
conformance_percent,Forms,0.2,65
|
||||
conformance_percent,Forms,0.3,71
|
||||
conformance_percent,Forms,0.4,79
|
||||
conformance_percent,Forms,0.5,85
|
||||
|
@@ -0,0 +1,779 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>PrintCraft Showcase</title>
|
||||
<!--
|
||||
PrintCraft Showcase: source for `cargo xtask demo-pdf`.
|
||||
All prose in this file is original to the PrintCraft project.
|
||||
Placeholders substituted by the xtask:
|
||||
{{ASSETS}} file:// URL of the repository's assets/ directory
|
||||
{{MANDELBROT_PNG}} data: URI of a procedurally generated PNG
|
||||
Links to https://mark.printcraft.invalid/<kind>/<id> are *markers*: the xtask
|
||||
converts the link rectangles Chrome emits for them into real PDF annotations
|
||||
(highlight, sticky note, stamp, ...), so annotation geometry follows the layout.
|
||||
-->
|
||||
<style>
|
||||
@font-face { font-family: "PC Inter"; src: url("{{ASSETS}}/fonts/Inter-Regular.ttf"); font-weight: 400; }
|
||||
@font-face { font-family: "PC Inter"; src: url("{{ASSETS}}/fonts/Inter-Medium.ttf"); font-weight: 500; }
|
||||
@font-face { font-family: "PC Inter"; src: url("{{ASSETS}}/fonts/Inter-SemiBold.ttf"); font-weight: 600 900; }
|
||||
@font-face { font-family: "PC Mono"; src: url("{{ASSETS}}/fonts/JetBrainsMono-Regular.ttf"); }
|
||||
|
||||
@page { size: Letter; margin: 0; }
|
||||
|
||||
:root {
|
||||
--ink: #16213b;
|
||||
--ink-2: #4a5268;
|
||||
--ink-3: #7b8196;
|
||||
--paper: #fbf8f2;
|
||||
--rule: #e2dccf;
|
||||
--accent: #e4572e;
|
||||
--blue: #2a6fdb;
|
||||
--teal: #1a9e8f;
|
||||
--gold: #e9a100;
|
||||
--serif: "Hoefler Text", "Iowan Old Style", Baskerville, Georgia, serif;
|
||||
--display: Didot, "Bodoni 72", "Hoefler Text", serif;
|
||||
--sans: "Avenir Next", "PC Inter", system-ui, sans-serif;
|
||||
--ui: system-ui, -apple-system, "PC Inter", sans-serif;
|
||||
--mono: "PC Mono", Menlo, monospace;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; }
|
||||
html, body { margin: 0; padding: 0; }
|
||||
body {
|
||||
background: var(--paper);
|
||||
color: var(--ink);
|
||||
font-family: var(--serif);
|
||||
font-size: 10.5pt;
|
||||
line-height: 1.45;
|
||||
-webkit-print-color-adjust: exact;
|
||||
print-color-adjust: exact;
|
||||
font-kerning: normal;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
.page {
|
||||
position: relative;
|
||||
width: 8.5in;
|
||||
height: 11in;
|
||||
padding: 0.8in 0.85in 0.9in;
|
||||
overflow: hidden;
|
||||
break-after: page;
|
||||
background: var(--paper);
|
||||
}
|
||||
.page:last-child { break-after: auto; }
|
||||
|
||||
a { color: var(--blue); text-decoration: none; }
|
||||
a.mk { color: inherit; }
|
||||
|
||||
/* running header and folio */
|
||||
.runhead {
|
||||
position: absolute; top: 0.42in; left: 0.85in; right: 0.85in;
|
||||
display: flex; justify-content: space-between;
|
||||
font: 500 7pt var(--sans); letter-spacing: 0.18em; text-transform: uppercase;
|
||||
color: var(--ink-3);
|
||||
border-bottom: 0.5pt solid var(--rule); padding-bottom: 4pt;
|
||||
}
|
||||
.folio {
|
||||
position: absolute; bottom: 0.45in; left: 0.85in; right: 0.85in;
|
||||
display: flex; justify-content: space-between; align-items: baseline;
|
||||
font: 400 8pt var(--sans); color: var(--ink-3);
|
||||
}
|
||||
.folio b { font: 600 9pt var(--sans); color: var(--ink); font-feature-settings: "lnum", "tnum"; }
|
||||
|
||||
/* section openers */
|
||||
.kicker {
|
||||
font: 600 7.5pt var(--sans); letter-spacing: 0.24em; text-transform: uppercase;
|
||||
color: var(--accent); margin: 0 0 6pt;
|
||||
}
|
||||
h1, h2, h3 { font-weight: normal; margin: 0; }
|
||||
h2.sec {
|
||||
font-family: var(--display); font-size: 34pt; line-height: 1.02;
|
||||
letter-spacing: -0.01em; margin: 0 0 10pt;
|
||||
}
|
||||
h2.sec em { font-style: italic; color: var(--accent); }
|
||||
.dek {
|
||||
font: italic 13pt/1.4 var(--serif); color: var(--ink-2);
|
||||
max-width: 5.4in; margin: 0 0 18pt;
|
||||
}
|
||||
h3 {
|
||||
font: 600 8pt var(--sans); letter-spacing: 0.16em; text-transform: uppercase;
|
||||
color: var(--ink); margin: 16pt 0 6pt;
|
||||
}
|
||||
.rule { height: 0.5pt; background: var(--rule); margin: 14pt 0; }
|
||||
.caption { font: 400 7.5pt/1.4 var(--sans); color: var(--ink-3); margin-top: 5pt; }
|
||||
.caption b { color: var(--ink-2); font-weight: 600; }
|
||||
small, .small { font-size: 8pt; }
|
||||
|
||||
/* ---------- cover ---------- */
|
||||
.cover { background: #0f1830; color: #f6f1e7; padding: 0; }
|
||||
.cover svg.bg { position: absolute; inset: 0; width: 100%; height: 100%; }
|
||||
.cover .inner { position: absolute; left: 0.9in; right: 0.9in; top: 1.05in; bottom: 0.9in; }
|
||||
.cover .edition {
|
||||
font: 600 8pt var(--sans); letter-spacing: 0.4em; text-transform: uppercase; color: #f2c14e;
|
||||
}
|
||||
.cover h1 {
|
||||
margin-top: 2.2in;
|
||||
font-family: var(--display); font-weight: normal;
|
||||
font-size: 88pt; line-height: 0.9; letter-spacing: -0.02em;
|
||||
}
|
||||
.cover h1 .it { font-style: italic; }
|
||||
.cover .grad {
|
||||
display: inline-block;
|
||||
font: 700 30pt/1.1 var(--ui); letter-spacing: -0.01em;
|
||||
background: linear-gradient(90deg, #f2c14e 0%, #f08a5d 45%, #e4572e 70%, #b83b5e 100%);
|
||||
-webkit-background-clip: text; background-clip: text; color: transparent;
|
||||
margin-top: 14pt;
|
||||
}
|
||||
.cover .sub {
|
||||
margin-top: 18pt; max-width: 4.6in;
|
||||
font: italic 14pt/1.45 var(--serif); color: #d9d3c7;
|
||||
}
|
||||
.cover .meta {
|
||||
position: absolute; bottom: 0; left: 0; right: 0;
|
||||
display: flex; justify-content: space-between; align-items: flex-end;
|
||||
font: 500 8pt/1.5 var(--sans); letter-spacing: 0.08em; color: #a9b0c4;
|
||||
border-top: 0.5pt solid rgba(246,241,231,0.25); padding-top: 10pt;
|
||||
}
|
||||
.cover .meta strong { color: #f6f1e7; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase; }
|
||||
|
||||
/* ---------- contents ---------- */
|
||||
.toc { list-style: none; padding: 0; margin: 24pt 0 0; counter-reset: toc; }
|
||||
.toc li {
|
||||
display: grid; grid-template-columns: 0.55in 1fr auto; align-items: baseline;
|
||||
padding: 5.5pt 0; border-bottom: 0.5pt solid var(--rule);
|
||||
}
|
||||
.toc .n { font: 400 20pt var(--display); color: var(--accent); font-feature-settings: "lnum"; }
|
||||
.toc a { color: var(--ink); }
|
||||
.toc .t { font: 400 14pt var(--serif); }
|
||||
.toc .d { display: block; font: italic 9.5pt var(--serif); color: var(--ink-3); margin-top: 1pt; }
|
||||
.toc .p { font: 600 10pt var(--sans); color: var(--ink-2); font-feature-settings: "tnum"; }
|
||||
.colophon {
|
||||
position: absolute; left: 0.85in; right: 0.85in; bottom: 1.05in;
|
||||
display: grid; grid-template-columns: 1fr 1fr; gap: 24pt;
|
||||
font: 400 8pt/1.5 var(--sans); color: var(--ink-2);
|
||||
}
|
||||
.colophon h4 { font: 600 7pt var(--sans); letter-spacing: 0.2em; text-transform: uppercase; color: var(--ink); margin: 0 0 4pt; }
|
||||
|
||||
/* ---------- foreword ---------- */
|
||||
.foreword p { font-size: 12pt; line-height: 1.55; text-align: justify; hyphens: auto; margin: 0 0 9pt; }
|
||||
.foreword p.lead::first-line { font-variant-caps: small-caps; letter-spacing: 0.06em; font-feature-settings: "smcp"; }
|
||||
.signoff { font: 26pt "Snell Roundhand", "Apple Chancery", cursive; color: var(--ink); margin-top: 8pt; }
|
||||
.tracking { margin-top: 18pt; }
|
||||
.tracking div { font: 500 11pt var(--sans); text-transform: uppercase; color: var(--ink-2); padding: 3pt 0; border-bottom: 0.5pt dotted var(--rule); display: flex; justify-content: space-between; }
|
||||
.tracking span.v { font: 400 7pt var(--mono); color: var(--ink-3); letter-spacing: 0; text-transform: none; }
|
||||
|
||||
/* ---------- body text ---------- */
|
||||
.cols {
|
||||
column-count: 2; column-gap: 0.32in; column-rule: 0.5pt solid var(--rule);
|
||||
text-align: justify; hyphens: auto; -webkit-hyphens: auto;
|
||||
font-feature-settings: "kern", "liga", "onum";
|
||||
}
|
||||
.cols p { margin: 0; text-indent: 1.2em; }
|
||||
.cols p.first { text-indent: 0; }
|
||||
.cols p.first::first-letter {
|
||||
float: left; font-family: var(--display); font-size: 52pt; line-height: 0.82;
|
||||
padding: 3pt 5pt 0 0; color: var(--accent);
|
||||
}
|
||||
.cols p.first::first-line { font-variant: small-caps; letter-spacing: 0.04em; }
|
||||
.pull {
|
||||
column-span: all; margin: 12pt 0.4in; padding: 10pt 0;
|
||||
border-top: 1.5pt solid var(--ink); border-bottom: 0.5pt solid var(--ink);
|
||||
font: italic 18pt/1.3 var(--serif); text-align: center; color: var(--ink);
|
||||
font-feature-settings: "dlig", "swsh";
|
||||
text-indent: 0;
|
||||
}
|
||||
.pull cite { display: block; font: 600 7pt var(--sans); font-style: normal; letter-spacing: 0.2em; text-transform: uppercase; color: var(--accent); margin-top: 6pt; }
|
||||
sup.fn { font: 600 6.5pt var(--sans); color: var(--accent); vertical-align: super; line-height: 0; }
|
||||
.footnotes {
|
||||
position: absolute; left: 0.85in; right: 0.85in; bottom: 0.85in;
|
||||
border-top: 0.5pt solid var(--ink-3); padding-top: 6pt; width: 2.2in;
|
||||
}
|
||||
.footnotes-body { position: absolute; left: 0.85in; right: 0.85in; bottom: 0.82in; font: 7.5pt/1.45 var(--serif); color: var(--ink-2); columns: 2; column-gap: 0.32in; }
|
||||
.footnotes-body p { margin: 0 0 3pt; }
|
||||
.footnotes-body b { font: 600 6.5pt var(--sans); color: var(--accent); }
|
||||
|
||||
/* ---------- specimen tables (OpenType) ---------- */
|
||||
.spec { width: 100%; border-collapse: collapse; }
|
||||
.spec td { padding: 7pt 6pt; border-bottom: 0.5pt solid var(--rule); vertical-align: baseline; }
|
||||
.spec td.tag { font: 500 8pt var(--mono); color: var(--accent); width: 0.55in; white-space: nowrap; }
|
||||
.spec td.lbl { font: 400 7.5pt/1.3 var(--sans); color: var(--ink-3); width: 1.15in; }
|
||||
.spec td.off, .spec td.on { font-family: "Hoefler Text", serif; font-size: 17pt; line-height: 1.15; }
|
||||
.spec td.off { color: var(--ink-3); }
|
||||
.spec th { font: 600 6.5pt var(--sans); letter-spacing: 0.2em; text-transform: uppercase; color: var(--ink-3); text-align: left; padding: 0 6pt 4pt; }
|
||||
.weights { display: grid; grid-template-columns: repeat(9, 1fr); gap: 2pt; margin-top: 6pt; }
|
||||
.weights div { text-align: center; font: 26pt var(--ui); line-height: 1.1; }
|
||||
.weights span { display: block; font: 400 6.5pt var(--mono); color: var(--ink-3); }
|
||||
.scriptline { font: 30pt/1.25 "Snell Roundhand", cursive; color: var(--ink); }
|
||||
.scriptline2 { font: 22pt/1.3 "Apple Chancery", cursive; color: var(--accent); }
|
||||
|
||||
/* ---------- expressive ---------- */
|
||||
.fx-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14pt 22pt; }
|
||||
.fx { border: 0.5pt solid var(--rule); border-radius: 6pt; padding: 12pt 14pt 10pt; background: #fffdf8; position: relative; overflow: hidden; height: 1.35in; }
|
||||
.fx .caption { position: absolute; bottom: 8pt; left: 14pt; right: 14pt; }
|
||||
.shadow { font: 800 40pt var(--ui); color: #fffdf8; letter-spacing: -0.02em; text-shadow: 3pt 3pt 0 rgba(228,87,46,0.55), 6pt 6pt 0 rgba(42,111,219,0.35), 0 0 1pt rgba(22,33,59,0.9); }
|
||||
.gradtext { display: inline-block; padding-right: 4pt; font: 800 42pt/1 var(--ui); letter-spacing: -0.03em; background: linear-gradient(120deg, #2a6fdb, #1a9e8f 40%, #e9a100 70%, #e4572e); -webkit-background-clip: text; background-clip: text; color: transparent; }
|
||||
.rot { position: absolute; top: 18pt; right: 18pt; transform: rotate(-12deg); font: 700 13pt var(--sans); color: #fff; background: var(--accent); padding: 3pt 10pt; letter-spacing: 0.2em; }
|
||||
.skew { display: inline-block; transform: skewX(-18deg); font: 700 28pt var(--sans); background: var(--ink); color: var(--paper); padding: 2pt 14pt; }
|
||||
.vert-stack { font: 600 9pt var(--sans); letter-spacing: 0.3em; writing-mode: vertical-rl; transform: rotate(180deg); position: absolute; left: 12pt; top: 12pt; color: var(--teal); text-transform: uppercase; }
|
||||
.outline-text { font: 800 38pt var(--ui); color: transparent; -webkit-text-stroke: 1pt var(--ink); letter-spacing: 0.02em; }
|
||||
.tracked { font: 400 9pt var(--sans); letter-spacing: 0.6em; text-transform: uppercase; color: var(--ink-2); }
|
||||
|
||||
/* ---------- scripts ---------- */
|
||||
.scripts { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10pt; }
|
||||
.sc { border-top: 1.5pt solid var(--ink); padding: 6pt 0 0; }
|
||||
.sc .nm { font: 600 6.8pt var(--sans); letter-spacing: 0.2em; text-transform: uppercase; color: var(--ink-3); display: flex; justify-content: space-between; }
|
||||
.sc .nm i { font-style: normal; color: var(--accent); letter-spacing: 0.05em; }
|
||||
.sc .tx { font-size: 14pt; line-height: 1.35; margin-top: 3pt; }
|
||||
.sc .en { font: italic 8pt var(--serif); color: var(--ink-3); margin-top: 2pt; }
|
||||
.jp-block {
|
||||
writing-mode: vertical-rl; font: 15pt/1.7 "Hiragino Mincho ProN", serif; height: 2.7in;
|
||||
border-right: 3pt solid var(--accent); padding-right: 8pt; color: var(--ink);
|
||||
}
|
||||
.jp-wrap { display: flex; gap: 18pt; align-items: flex-start; }
|
||||
.emoji { font: 24pt/1.2 "Apple Color Emoji", sans-serif; letter-spacing: 4pt; }
|
||||
|
||||
/* ---------- math ---------- */
|
||||
math { font-family: "STIX Two Math", math; font-size: 15pt; }
|
||||
.eqs { display: grid; grid-template-columns: 1fr 1fr; gap: 12pt 24pt; }
|
||||
.eq { border-left: 2pt solid var(--teal); padding: 6pt 0 6pt 14pt; }
|
||||
.eq .caption { margin-top: 6pt; }
|
||||
.eq math[display="block"] { margin: 4pt 0; }
|
||||
|
||||
/* ---------- graphics ---------- */
|
||||
.gfx { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16pt 14pt; }
|
||||
.gfx figure { margin: 0; }
|
||||
.gfx svg { width: 100%; height: auto; display: block; border-radius: 4pt; }
|
||||
.blend { position: relative; height: 1.5in; background: #fffdf8; border-radius: 4pt; border: 0.5pt solid var(--rule); overflow: hidden; }
|
||||
.blend div { position: absolute; width: 0.95in; height: 0.95in; border-radius: 50%; }
|
||||
.blend .a { background: #e4572e; left: 0.35in; top: 0.12in; mix-blend-mode: multiply; }
|
||||
.blend .b { background: #1a9e8f; left: 0.8in; top: 0.12in; mix-blend-mode: multiply; }
|
||||
.blend .c { background: #e9a100; left: 0.575in; top: 0.5in; mix-blend-mode: multiply; }
|
||||
.blend.dark { background: #16213b; }
|
||||
.blend.dark div { mix-blend-mode: screen; }
|
||||
.blend.dark .a { background: #d0352a; } .blend.dark .b { background: #2fae3f; } .blend.dark .c { background: #2a6fdb; }
|
||||
|
||||
/* ---------- data ---------- */
|
||||
table.data { width: 100%; border-collapse: collapse; font: 400 8.5pt var(--sans); }
|
||||
table.data thead th { text-align: left; font: 600 7pt var(--sans); letter-spacing: 0.14em; text-transform: uppercase; color: #fff; background: var(--ink); padding: 6pt 8pt; }
|
||||
table.data td { padding: 5pt 8pt; border-bottom: 0.5pt solid var(--rule); }
|
||||
table.data tbody tr:nth-child(even) td { background: #f1ece2; }
|
||||
table.data td.num { text-align: right; font-feature-settings: "tnum", "lnum"; }
|
||||
.pill { display: inline-block; font: 600 6.5pt var(--sans); letter-spacing: 0.1em; text-transform: uppercase; padding: 1.5pt 6pt; border-radius: 8pt; }
|
||||
.pill.ok { background: #d8efe9; color: #0f6b5f; }
|
||||
.pill.part { background: #fbeccc; color: #8a5a00; }
|
||||
.pill.plan { background: #e3e8f5; color: #2b4a8f; }
|
||||
.charts { display: grid; grid-template-columns: 1fr 1fr; gap: 20pt; }
|
||||
.charts svg { width: 100%; height: auto; display: block; }
|
||||
.chart-title { font: 600 9pt var(--sans); color: var(--ink); margin: 0 0 2pt; }
|
||||
.chart-sub { font: 400 7.5pt var(--sans); color: var(--ink-3); margin: 0 0 6pt; }
|
||||
|
||||
/* ---------- code ---------- */
|
||||
pre.code {
|
||||
font: 8.2pt/1.55 var(--mono); background: #121a2e; color: #d7dcea; border-radius: 6pt;
|
||||
padding: 12pt 14pt; margin: 0; white-space: pre; overflow: hidden;
|
||||
font-variant-ligatures: none; counter-reset: ln;
|
||||
}
|
||||
pre.code .ln { color: #4d5877; display: inline-block; width: 1.6em; }
|
||||
.k { color: #ff8f6b; } .ty { color: #6fd3c6; } .s { color: #f2c14e; } .c { color: #7c87a6; font-style: italic; } .f { color: #8fb4ff; } .n { color: #d6a6ff; } .m { color: #ffb86b; }
|
||||
.imgrow { display: grid; grid-template-columns: 2.6in 1fr; gap: 18pt; align-items: start; margin-top: 16pt; }
|
||||
.imgrow img { width: 2.6in; height: 2.6in; border-radius: 6pt; display: block; }
|
||||
.links li { margin-bottom: 4pt; }
|
||||
|
||||
/* ---------- review ---------- */
|
||||
.review { display: grid; grid-template-columns: 3.3in 1fr; gap: 26pt; }
|
||||
.review p { font-size: 11pt; line-height: 1.7; margin: 0 0 10pt; text-align: left; }
|
||||
.canvas { position: relative; height: 6.3in; border: 0.5pt dashed var(--ink-3); border-radius: 6pt; background:
|
||||
radial-gradient(circle, #d9d2c3 0.6pt, transparent 0.7pt) 0 0 / 12pt 12pt; }
|
||||
.canvas .lab { position: absolute; font: 600 6.5pt var(--sans); letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); }
|
||||
a.box { position: absolute; display: block; color: transparent; font-size: 1pt; }
|
||||
.legend-list { font: 400 8pt/1.6 var(--sans); color: var(--ink-2); columns: 2; padding-left: 12pt; margin: 8pt 0 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- ============================ 1. COVER ============================ -->
|
||||
<section class="page cover" id="cover">
|
||||
<svg class="bg" viewBox="0 0 612 792" preserveAspectRatio="none" aria-hidden="true">
|
||||
<defs>
|
||||
<radialGradient id="glowA" cx="0.78" cy="0.22" r="0.55">
|
||||
<stop offset="0" stop-color="#e4572e" stop-opacity="0.85"/>
|
||||
<stop offset="1" stop-color="#e4572e" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="glowB" cx="0.15" cy="0.95" r="0.6">
|
||||
<stop offset="0" stop-color="#2a6fdb" stop-opacity="0.8"/>
|
||||
<stop offset="1" stop-color="#2a6fdb" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="band" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#f2c14e"/>
|
||||
<stop offset="1" stop-color="#1a9e8f"/>
|
||||
</linearGradient>
|
||||
<pattern id="dots" width="14" height="14" patternUnits="userSpaceOnUse">
|
||||
<circle cx="2" cy="2" r="0.9" fill="#f6f1e7" fill-opacity="0.18"/>
|
||||
</pattern>
|
||||
</defs>
|
||||
<rect width="612" height="792" fill="#0f1830"/>
|
||||
<rect width="612" height="792" fill="url(#glowA)"/>
|
||||
<rect width="612" height="792" fill="url(#glowB)"/>
|
||||
<rect x="330" y="0" width="282" height="330" fill="url(#dots)"/>
|
||||
<g style="mix-blend-mode:screen" opacity="0.9">
|
||||
<circle cx="470" cy="190" r="92" fill="none" stroke="url(#band)" stroke-width="1.2"/>
|
||||
<circle cx="470" cy="190" r="70" fill="none" stroke="#f6f1e7" stroke-opacity="0.35" stroke-width="0.6" stroke-dasharray="2 5"/>
|
||||
<circle cx="510" cy="230" r="46" fill="#e4572e" fill-opacity="0.55"/>
|
||||
<circle cx="440" cy="240" r="34" fill="#2a6fdb" fill-opacity="0.6"/>
|
||||
</g>
|
||||
<path d="M0 640 C 160 590, 320 700, 612 610 L 612 792 L 0 792 Z" fill="#0b1226" fill-opacity="0.55"/>
|
||||
</svg>
|
||||
<div class="inner">
|
||||
<div class="edition">Specimen · Volume One</div>
|
||||
<h1>Print<span class="it">Craft</span><br>Showcase</h1>
|
||||
<div class="grad">A tour of the page, glyph by glyph.</div>
|
||||
<p class="sub">Typography, world scripts, vector graphics, mathematics, forms and annotations — gathered in one document to put a PDF engine through its paces.</p>
|
||||
<div class="meta">
|
||||
<div><strong>PrintCraft</strong><br>Open-source PDF toolkit in Rust</div>
|
||||
<div style="text-align:right">Generated by <span style="font-family:var(--mono)">cargo xtask demo-pdf</span><br>US Letter · 8.5 × 11 in</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 2. CONTENTS ============================ -->
|
||||
<section class="page" id="contents">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>Contents</span></div>
|
||||
<div class="kicker">Inside this specimen</div>
|
||||
<h2 class="sec">Contents</h2>
|
||||
<ol class="toc">
|
||||
<li><span class="n">1</span><a href="#setting"><span class="t">Setting Text</span><span class="d">Columns, justification, hyphenation, drop caps and notes</span></a><span class="p">1</span></li>
|
||||
<li><span class="n">2</span><a href="#opentype"><span class="t">OpenType Features</span><span class="d">Ligatures, small capitals, figures, fractions, swashes, weights</span></a><span class="p">2</span></li>
|
||||
<li><span class="n">3</span><a href="#expressive"><span class="t">Expressive Type</span><span class="d">Shadows, gradients, rotation, skew and text on a path</span></a><span class="p">3</span></li>
|
||||
<li><span class="n">4</span><a href="#scripts"><span class="t">Scripts of the World</span><span class="d">Right-to-left, complex shaping, vertical CJK and emoji</span></a><span class="p">4</span></li>
|
||||
<li><span class="n">5</span><a href="#math"><span class="t">Mathematics</span><span class="d">MathML Core set in STIX Two Math</span></a><span class="p">5</span></li>
|
||||
<li><span class="n">6</span><a href="#vector"><span class="t">Vector Graphics</span><span class="d">Shadings, blend modes, clipping, masks and patterns</span></a><span class="p">6</span></li>
|
||||
<li><span class="n">7</span><a href="#data"><span class="t">Data & Tables</span><span class="d">Charts and a striped feature matrix</span></a><span class="p">7</span></li>
|
||||
<li><span class="n">8</span><a href="#code"><span class="t">Code & Images</span><span class="d">A syntax-coloured listing and a generated raster</span></a><span class="p">8</span></li>
|
||||
<li><span class="n">9</span><a href="#review"><span class="t">Review & Markup</span><span class="d">Every common annotation type, with appearance streams</span></a><span class="p">9</span></li>
|
||||
<li><span class="n">10</span><span><span class="t">Interactive Form</span><span class="d">AcroForm fields written directly by the xtask</span></span><span class="p">10</span></li>
|
||||
</ol>
|
||||
<div class="colophon">
|
||||
<div><h4>Colophon</h4>Body text is set in Hoefler Text with Didot for display, Avenir Next and Inter for labels, and JetBrains Mono for code. Layout is authored in HTML and CSS, printed by headless Chrome, then post-processed with <span style="font-family:var(--mono)">lopdf</span>.</div>
|
||||
<div><h4>What to look for</h4>Open the bookmarks, layers, attachments and comments panels. Page labels run Cover, i–ii, then 1–10. One layer adds a draft watermark; another holds print-only notes and starts hidden.</div>
|
||||
</div>
|
||||
<div class="folio"><span>PrintCraft Showcase</span><b>i</b></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 3. FOREWORD ============================ -->
|
||||
<section class="page foreword" id="foreword">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>Foreword</span></div>
|
||||
<div class="kicker">Foreword</div>
|
||||
<h2 class="sec">Why a <em>specimen?</em></h2>
|
||||
<p class="lead">A PDF reader is judged in the first second. The page appears, and either the letters sit on it the way the author intended or they do not. Every kerning pair, every ligature and every soft gradient is a small promise the file makes and the renderer must keep.</p>
|
||||
<p>This document collects those promises in one place. It was written for the people who build PrintCraft, as a single file to open after every change: if all of it still looks right, the change is probably safe. It is also, we hope, pleasant to read on its own.</p>
|
||||
<p>Nothing here is exotic. Each feature is something ordinary documents use every day — an invoice with a form field, a thesis full of equations, a contract with comments in the margin, a brochure with a translucent photograph laid over a tinted panel. What is unusual is only that they are all together, and that each page says plainly what it is testing.</p>
|
||||
<p>The layout is authored in HTML and printed by a browser; the interactive parts are then written into the file by hand, object by object. That split mirrors the real world, where most PDFs are produced by one program and amended by several others.</p>
|
||||
<div class="signoff">The PrintCraft contributors</div>
|
||||
|
||||
<h3>Tracking, from tight to airy</h3>
|
||||
<div class="tracking">
|
||||
<div style="letter-spacing:-0.04em">Measure twice, set once <span class="v">−40</span></div>
|
||||
<div style="letter-spacing:0">Measure twice, set once <span class="v">0</span></div>
|
||||
<div style="letter-spacing:0.12em">Measure twice, set once <span class="v">+120</span></div>
|
||||
<div style="letter-spacing:0.3em">Measure twice <span class="v">+300</span></div>
|
||||
</div>
|
||||
<div class="folio"><span>Foreword</span><b>ii</b></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 4. SETTING TEXT ============================ -->
|
||||
<section class="page" id="setting">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>1 · Setting Text</span></div>
|
||||
<div class="kicker">Chapter one</div>
|
||||
<h2 class="sec" id="h-setting">Setting <em>Text</em></h2>
|
||||
<p class="dek">Two justified columns with automatic hyphenation, old-style figures, a drop cap and a pull quote — the everyday machinery of a well-made page.</p>
|
||||
<div class="cols">
|
||||
<p class="first">Long before there were screens, a page of type was a negotiation between the width of a column and the length of the words that had to fill it. The compositor adjusted spaces, divided a word at a sensible syllable, and occasionally rewrote a line so the paragraph would lie flat. Justified text asks for exactly that care, and <a class="mk" href="https://mark.printcraft.invalid/highlight/body">a renderer must honour the spacing it was given</a>.<sup class="fn">1</sup></p>
|
||||
<p>A PDF does not reflow. Every glyph has already been placed by the program that wrote the file, and the reader’s job is to reproduce those positions faithfully at any zoom. That sounds simple until one remembers that a single line may mix three fonts, a ligature standing in for two letters, and a hyphen that exists only because the line happened to break there in 1994 or 2026.</p>
|
||||
<p>Old-style figures, like the ones in this paragraph’s 1,280 characters and 36 lines, rise and fall with the lowercase so that numbers do not shout. Ligatures such as <i>fi</i>, <i>fl</i> and <i>ffi</i> in words like <i>officially</i>, <i>affluent</i> and <i>afflicted</i> join letters that would otherwise collide.<sup class="fn">2</sup></p>
|
||||
<div class="pull">“The best typography is the kind you only notice when it is missing.”<cite>A working maxim of the trade</cite></div>
|
||||
<p>Hyphenation is where browsers and word processors differ most. Chrome consults the system’s hyphenation dictionaries when a paragraph declares its language and asks for automatic hyphens, which is why the words in these columns occasionally divide across lines. The result is a more even texture, with fewer rivers of white running down the column.</p>
|
||||
<p>Columns introduce their own questions: where to break, whether a heading may sit at the foot of one, and how a quotation spanning both should interrupt the flow. Here the pull quote spans the full measure and the text resumes beneath it, balanced between the two columns.</p>
|
||||
<p>Small text matters too. Notes, captions and legal lines are often set at seven or eight points, where hinting, stem darkening and subpixel positioning decide whether a reader squints. The footnotes below are set at seven and a half points in the same face as the body.<sup class="fn">3</sup></p>
|
||||
<p>Finally, notice the drop cap that opens this chapter. It is an ordinary letter, floated and enlarged, with the first line set in small capitals. A renderer need do nothing special for it, which is precisely the point: most typographic richness in a PDF is just careful placement of ordinary glyphs.</p>
|
||||
</div>
|
||||
<div class="footnotes"></div>
|
||||
<div class="footnotes-body">
|
||||
<p><b>1</b> Word spacing in PDF is usually baked into glyph positions rather than expressed with the word-spacing operator, so readers rarely need to stretch anything themselves.</p>
|
||||
<p><b>2</b> In a PDF a ligature is a single glyph; text extraction relies on the font’s ToUnicode map to recover the letters it represents.</p>
|
||||
<p><b>3</b> Try zooming to 400 percent here: well-rendered small text stays crisp and evenly weighted.</p>
|
||||
</div>
|
||||
<div class="folio"><span>Setting Text</span><b>1</b></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 5. OPENTYPE ============================ -->
|
||||
<section class="page" id="opentype">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>2 · OpenType Features</span></div>
|
||||
<div class="kicker">Chapter two</div>
|
||||
<h2 class="sec" id="h-opentype">OpenType <em>Features</em></h2>
|
||||
<p class="dek">Each row shows the same text with a feature off, then on. The glyphs differ; the underlying characters do not.</p>
|
||||
<table class="spec">
|
||||
<tr><th>Tag</th><th>Feature</th><th>Off</th><th>On</th></tr>
|
||||
<tr><td class="tag">liga</td><td class="lbl">Standard ligatures</td><td class="off" style="font-feature-settings:'liga' 0">office fluffy fjord</td><td class="on" style="font-feature-settings:'liga' 1">office fluffy fjord</td></tr>
|
||||
<tr><td class="tag">dlig</td><td class="lbl">Discretionary ligatures</td><td class="off">Asterisk & strict</td><td class="on" style="font-feature-settings:'dlig' 1">Asterisk & strict</td></tr>
|
||||
<tr><td class="tag">smcp</td><td class="lbl">Small capitals</td><td class="off">Printed in Boston</td><td class="on" style="font-feature-settings:'smcp' 1">Printed in Boston</td></tr>
|
||||
<tr><td class="tag">onum</td><td class="lbl">Old-style figures</td><td class="off" style="font-feature-settings:'lnum' 1">Since 1885: 3,467,920</td><td class="on" style="font-feature-settings:'onum' 1">Since 1885: 3,467,920</td></tr>
|
||||
<tr><td class="tag">frac</td><td class="lbl">Fractions</td><td class="off" style="font-family:var(--ui)">1/2 cup, 3/4 inch, 7/8</td><td class="on" style="font-family:var(--ui);font-feature-settings:'frac' 1">1/2 cup, 3/4 inch, 7/8</td></tr>
|
||||
<tr><td class="tag">swsh</td><td class="lbl">Swash capitals</td><td class="off" style="font-style:italic">The Quiet River</td><td class="on" style="font-style:italic;font-feature-settings:'swsh' 1">The Quiet River</td></tr>
|
||||
<tr><td class="tag">ss01</td><td class="lbl">Stylistic set 1</td><td class="off" style="font-family:'PC Inter'">a 1 4 6 9 G ?</td><td class="on" style="font-family:'PC Inter';font-feature-settings:'ss01' 1">a 1 4 6 9 G ?</td></tr>
|
||||
<tr><td class="tag">kern</td><td class="lbl">Kerning</td><td class="off" style="font-kerning:none;font-family:var(--sans)">AVATAR Type Wave</td><td class="on" style="font-kerning:normal;font-family:var(--sans)">AVATAR Type Wave</td></tr>
|
||||
<tr><td class="tag">tnum</td><td class="lbl">Tabular figures</td><td class="off" style="font-family:var(--ui);font-feature-settings:'pnum' 1">1111 / 8888</td><td class="on" style="font-family:var(--ui);font-feature-settings:'tnum' 1">1111 / 8888</td></tr>
|
||||
</table>
|
||||
|
||||
<h3>One variable font, nine weights</h3>
|
||||
<div class="weights">
|
||||
<div style="font-weight:100">Ag<span>100</span></div>
|
||||
<div style="font-weight:200">Ag<span>200</span></div>
|
||||
<div style="font-weight:300">Ag<span>300</span></div>
|
||||
<div style="font-weight:400">Ag<span>400</span></div>
|
||||
<div style="font-weight:500">Ag<span>500</span></div>
|
||||
<div style="font-weight:600">Ag<span>600</span></div>
|
||||
<div style="font-weight:700">Ag<span>700</span></div>
|
||||
<div style="font-weight:800">Ag<span>800</span></div>
|
||||
<div style="font-weight:900">Ag<span>900</span></div>
|
||||
</div>
|
||||
<p class="caption"><b>System UI</b> · a single variable font file supplies every weight; the PDF embeds each instance as its own subset.</p>
|
||||
|
||||
<h3>Script faces</h3>
|
||||
<div class="scriptline">Handsome letters, joined in flight</div>
|
||||
<div class="scriptline2">Quietly Ornamental — 1234567890</div>
|
||||
<div class="folio"><span>OpenType Features</span><b>2</b></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 6. EXPRESSIVE ============================ -->
|
||||
<section class="page" id="expressive">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>3 · Expressive Type</span></div>
|
||||
<div class="kicker">Chapter three</div>
|
||||
<h2 class="sec" id="h-expressive">Expressive <em>Type</em></h2>
|
||||
<p class="dek">Effects that become transparency groups, soft masks, clipping paths and transformed text objects once they reach PDF.</p>
|
||||
<div class="fx-grid">
|
||||
<div class="fx"><div class="shadow">Layered</div><div class="caption"><b>text-shadow</b> · two translucent offset copies composited under the glyphs</div></div>
|
||||
<div class="fx"><div class="gradtext">Spectrum</div><div class="caption"><b>background-clip: text</b> · a linear shading clipped to glyph outlines</div></div>
|
||||
<div class="fx"><div style="margin-top:22pt"><span class="skew">Skewed</span></div><div class="rot">Rotated</div><div class="caption"><b>transform</b> · skewX(−18°) on a filled box and rotate(−12°) on a label</div></div>
|
||||
<div class="fx"><div class="outline-text">Outline</div><div class="tracked" style="margin-top:4pt">Tracked to 600</div><div class="caption"><b>-webkit-text-stroke</b> · glyphs stroked, not filled (render mode 1)</div></div>
|
||||
</div>
|
||||
|
||||
<h3>Text on a curve</h3>
|
||||
<svg viewBox="0 0 520 170" style="width:100%;height:auto;display:block" aria-label="Text following a curved path">
|
||||
<defs>
|
||||
<path id="wave" d="M20 140 C 120 20, 220 20, 270 90 S 420 160, 500 40"/>
|
||||
<linearGradient id="waveGrad" x1="0" x2="1">
|
||||
<stop offset="0" stop-color="#2a6fdb"/><stop offset="0.5" stop-color="#1a9e8f"/><stop offset="1" stop-color="#e4572e"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<use href="#wave" fill="none" stroke="#e2dccf" stroke-width="14" stroke-linecap="round"/>
|
||||
<use href="#wave" fill="none" stroke="#16213b" stroke-width="0.6" stroke-dasharray="3 4"/>
|
||||
<text font-family="Hoefler Text, serif" font-size="22" font-style="italic" fill="url(#waveGrad)" dy="-10">
|
||||
<textPath href="#wave" startOffset="4%">Letters can follow any path the designer draws — up, over, and away</textPath>
|
||||
</text>
|
||||
</svg>
|
||||
<p class="caption"><b>SVG textPath</b> · each glyph is positioned and rotated individually along a cubic Bézier, filled with a gradient.</p>
|
||||
|
||||
<h3>Hierarchy through contrast</h3>
|
||||
<div style="display:grid;grid-template-columns:1.4fr 1fr;gap:20pt;align-items:end">
|
||||
<div style="font:italic 400 32pt/1 var(--display);letter-spacing:-0.02em">Contrast is the<br><span style="font:800 32pt/1 var(--ui);font-style:normal;letter-spacing:-0.04em;color:var(--accent)">engine</span> of design.</div>
|
||||
<div style="font:10pt/1.5 var(--serif);color:var(--ink-2)">Pair a hairline Didot italic with a heavy grotesque and the eye knows where to go. The PDF sees only two fonts and a handful of positioning operators; the hierarchy is entirely in the choices.</div>
|
||||
</div>
|
||||
<div class="folio"><span>Expressive Type</span><b>3</b></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 7. SCRIPTS ============================ -->
|
||||
<section class="page" id="scripts">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>4 · Scripts of the World</span></div>
|
||||
<div class="kicker">Chapter four</div>
|
||||
<h2 class="sec" id="h-scripts">Scripts of the <em>World</em></h2>
|
||||
<p class="dek">A short greeting — roughly, “every letter deserves a good home” — in writing systems that need bidirectional layout, contextual shaping, reordering and vertical setting.</p>
|
||||
<div style="display:grid;grid-template-columns:1fr 1.25in;gap:18pt">
|
||||
<div class="scripts">
|
||||
<div class="sc" lang="ar" dir="rtl"><div class="nm" dir="ltr">Arabic <i>RTL · joining</i></div><div class="tx" style="font-family:'Geeza Pro'">لكل حرف بيت جميل</div><div class="en" dir="ltr">Geeza Pro</div></div>
|
||||
<div class="sc" lang="he" dir="rtl"><div class="nm" dir="ltr">Hebrew <i>RTL</i></div><div class="tx" style="font-family:'SF Hebrew','Arial Hebrew',sans-serif">לכל אות יש בית טוב</div><div class="en" dir="ltr">SF Hebrew</div></div>
|
||||
<div class="sc" lang="hi"><div class="nm">Devanagari <i>conjuncts</i></div><div class="tx" style="font-family:'Kohinoor Devanagari'">हर अक्षर का सुंदर घर</div><div class="en">Kohinoor Devanagari</div></div>
|
||||
<div class="sc" lang="th"><div class="nm">Thai <i>no spaces</i></div><div class="tx" style="font-family:Thonburi,sans-serif">ทุกตัวอักษรมีบ้านที่ดี</div><div class="en">Thonburi</div></div>
|
||||
<div class="sc" lang="el"><div class="nm">Greek <i>polytonic</i></div><div class="tx" style="font-family:'Hoefler Text',serif">Κάθε γράμμα ἔχει σπίτι</div><div class="en">Hoefler Text</div></div>
|
||||
<div class="sc" lang="ru"><div class="nm">Cyrillic</div><div class="tx" style="font-family:Baskerville,serif">У каждой буквы есть дом</div><div class="en">Baskerville</div></div>
|
||||
<div class="sc" lang="zh-Hans"><div class="nm">Chinese <i>simplified</i></div><div class="tx" style="font-family:'PingFang SC','Hiragino Sans GB',sans-serif">每个字都有一个好家</div><div class="en">PingFang SC</div></div>
|
||||
<div class="sc" lang="ko"><div class="nm">Korean <i>Hangul</i></div><div class="tx" style="font-family:'Apple SD Gothic Neo',sans-serif">모든 글자에게 좋은 집을</div><div class="en">Apple SD Gothic Neo</div></div>
|
||||
<div class="sc"><div class="nm">IPA <i>phonetics</i></div><div class="tx" style="font-family:'Charis SIL','Hoefler Text','Times New Roman',serif">/ˈtaɪpˌsɛtɪŋ ɪz ˈkræft/</div><div class="en">International Phonetic Alphabet</div></div>
|
||||
<div class="sc" lang="hy"><div class="nm">Armenian</div><div class="tx" style="font-family:'SF Armenian',sans-serif">Ամեն տառ ունի տուն</div><div class="en">SF Armenian</div></div>
|
||||
<div class="sc" lang="ka"><div class="nm">Georgian</div><div class="tx" style="font-family:'SF Georgian',sans-serif">ყველა ასოს აქვს სახლი</div><div class="en">SF Georgian</div></div>
|
||||
<div class="sc" lang="ta"><div class="nm">Tamil</div><div class="tx" style="font-family:'Tamil Sangam MN',sans-serif">ஒவ்வொரு எழுத்துக்கும் வீடு</div><div class="en">Tamil Sangam MN</div></div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="sc" lang="ja" style="border-top:none;padding:0"><div class="nm">Japanese <i>vertical</i></div>
|
||||
<div class="jp-wrap" style="margin-top:6pt"><div class="jp-block">すべての文字に、<br>よい家を。<br>縦書きで読む。</div></div>
|
||||
<div class="en" style="margin-top:6pt">Hiragino Mincho ProN, writing-mode: vertical-rl</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Mixed direction in one line</h3>
|
||||
<p style="font-size:12pt;margin:0">The word <span lang="ar" style="font-family:'Geeza Pro'">كتاب</span> means “book”, and <span lang="he" style="font-family:'SF Hebrew'">ספר</span> does too — the bidi algorithm keeps each run in its own direction while the sentence stays left-to-right, even across numbers like <span lang="ar" style="font-family:'Geeza Pro'">٣٤٥</span> and 345.</p>
|
||||
|
||||
<h3>Colour emoji</h3>
|
||||
<div class="emoji">📄🖋️🎨📐🔍🌍🧮✅🦀📎</div>
|
||||
<p class="caption"><b>Apple Color Emoji</b> · bitmap (sbix) glyphs that Chrome places into the PDF as images.</p>
|
||||
<div class="folio"><span>Scripts of the World</span><b>4</b></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 8. MATH ============================ -->
|
||||
<section class="page" id="math">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>5 · Mathematics</span></div>
|
||||
<div class="kicker">Chapter five</div>
|
||||
<h2 class="sec" id="h-math"><em>Mathematics</em></h2>
|
||||
<p class="dek">Equations written in MathML Core and laid out by the browser: stretchy delimiters, radicals, large operators, scripts and matrices.</p>
|
||||
<div class="eqs">
|
||||
<div class="eq">
|
||||
<math display="block"><mi>x</mi><mo>=</mo><mfrac><mrow><mo>−</mo><mi>b</mi><mo>±</mo><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mo>−</mo><mn>4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></math>
|
||||
<div class="caption"><b>Quadratic formula</b> · fraction, radical, superscript</div>
|
||||
</div>
|
||||
<div class="eq">
|
||||
<math display="block"><msubsup><mo>∫</mo><mrow><mo>−</mo><mi>∞</mi></mrow><mi>∞</mi></msubsup><msup><mi>e</mi><mrow><mo>−</mo><msup><mi>x</mi><mn>2</mn></msup></mrow></msup><mspace width="0.17em"/><mi>d</mi><mi>x</mi><mo>=</mo><msqrt><mi>π</mi></msqrt></math>
|
||||
<div class="caption"><b>Gaussian integral</b> · large operator with limits</div>
|
||||
</div>
|
||||
<div class="eq">
|
||||
<math display="block"><msup><mi>e</mi><mrow><mi>i</mi><mi>π</mi></mrow></msup><mo>+</mo><mn>1</mn><mo>=</mo><mn>0</mn></math>
|
||||
<div class="caption"><b>Euler’s identity</b> · five constants, one line</div>
|
||||
</div>
|
||||
<div class="eq">
|
||||
<math display="block"><munderover><mo>∑</mo><mrow><mi>n</mi><mo>=</mo><mn>1</mn></mrow><mi>∞</mi></munderover><mfrac><mn>1</mn><msup><mi>n</mi><mn>2</mn></msup></mfrac><mo>=</mo><mfrac><msup><mi>π</mi><mn>2</mn></msup><mn>6</mn></mfrac></math>
|
||||
<div class="caption"><b>Basel problem</b> · summation with under- and over-scripts</div>
|
||||
</div>
|
||||
<div class="eq">
|
||||
<math display="block"><mi mathvariant="normal">R</mi><mo>(</mo><mi>θ</mi><mo>)</mo><mo>=</mo><mrow><mo>[</mo><mtable><mtr><mtd><mi>cos</mi><mi>θ</mi></mtd><mtd><mo>−</mo><mi>sin</mi><mi>θ</mi></mtd></mtr><mtr><mtd><mi>sin</mi><mi>θ</mi></mtd><mtd><mi>cos</mi><mi>θ</mi></mtd></mtr></mtable><mo>]</mo></mrow></math>
|
||||
<div class="caption"><b>Rotation matrix</b> · the transform behind every rotated page</div>
|
||||
</div>
|
||||
<div class="eq">
|
||||
<math display="block"><mi mathvariant="bold">B</mi><mo>(</mo><mi>t</mi><mo>)</mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mn>3</mn></munderover><mrow><mo>(</mo><mfrac linethickness="0"><mn>3</mn><mi>i</mi></mfrac><mo>)</mo></mrow><msup><mrow><mo>(</mo><mn>1</mn><mo>−</mo><mi>t</mi><mo>)</mo></mrow><mrow><mn>3</mn><mo>−</mo><mi>i</mi></mrow></msup><msup><mi>t</mi><mi>i</mi></msup><msub><mi mathvariant="bold">P</mi><mi>i</mi></msub></math>
|
||||
<div class="caption"><b>Cubic Bézier</b> · the curve PDF paths are made of</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Inline mathematics</h3>
|
||||
<p style="font-size:11.5pt;line-height:1.7;text-align:justify;hyphens:auto;margin:0">A PDF page maps user space to device space with a matrix <math><mrow><mo>[</mo><mi>a</mi><mspace width="0.2em"/><mi>b</mi><mspace width="0.2em"/><mi>c</mi><mspace width="0.2em"/><mi>d</mi><mspace width="0.2em"/><mi>e</mi><mspace width="0.2em"/><mi>f</mi><mo>]</mo></mrow></math>, so a point <math><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></math> lands at <math><mo>(</mo><mi>a</mi><mi>x</mi><mo>+</mo><mi>c</mi><mi>y</mi><mo>+</mo><mi>e</mi><mo>,</mo><mspace width="0.2em"/><mi>b</mi><mi>x</mi><mo>+</mo><mi>d</mi><mi>y</mi><mo>+</mo><mi>f</mi><mo>)</mo></math>. With one point equal to <math><mfrac><mn>1</mn><mn>72</mn></mfrac></math> inch, a Letter page measures <math><mn>612</mn><mo>×</mo><mn>792</mn></math> points, and a 300 dpi raster of it holds roughly <math><mn>8.4</mn><mo>×</mo><msup><mn>10</mn><mn>6</mn></msup></math> pixels.</p>
|
||||
|
||||
<h3>Symbols and arrows</h3>
|
||||
<div style="font:17pt/1.5 'STIX Two Math',serif;letter-spacing:6pt;color:var(--ink-2)">∀ ∃ ∅ ∇ ∂ ∈ ∉ ⊂ ⊆ ∪ ∩ ≤ ≥ ≠ ≈ ≡ ∞ ℵ ℝ ℂ ℤ ℕ → ⇒ ⇔ ↦ ⟨ ⟩ ⌈ ⌉</div>
|
||||
<div class="folio"><span>Mathematics</span><b>5</b></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 9. VECTOR ============================ -->
|
||||
<section class="page" id="vector">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>6 · Vector Graphics</span></div>
|
||||
<div class="kicker">Chapter six</div>
|
||||
<h2 class="sec" id="h-vector">Vector <em>Graphics</em></h2>
|
||||
<p class="dek">Nine small plates, each exercising one piece of the PDF imaging model.</p>
|
||||
<div class="gfx">
|
||||
<figure>
|
||||
<svg viewBox="0 0 160 120"><defs><linearGradient id="lg1" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#2a6fdb"/><stop offset="0.5" stop-color="#1a9e8f"/><stop offset="1" stop-color="#e9a100"/></linearGradient></defs><rect width="160" height="120" rx="6" fill="url(#lg1)"/></svg>
|
||||
<figcaption class="caption"><b>Axial shading</b> · three-stop linear gradient</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<svg viewBox="0 0 160 120"><defs><radialGradient id="rg1" cx="0.35" cy="0.35" r="0.75"><stop offset="0" stop-color="#fff5d6"/><stop offset="0.35" stop-color="#e9a100"/><stop offset="0.75" stop-color="#e4572e"/><stop offset="1" stop-color="#16213b"/></radialGradient></defs><rect width="160" height="120" rx="6" fill="#16213b"/><circle cx="80" cy="60" r="52" fill="url(#rg1)"/></svg>
|
||||
<figcaption class="caption"><b>Radial shading</b> · off-centre focal point</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<div class="blend"><div class="a"></div><div class="b"></div><div class="c"></div></div>
|
||||
<figcaption class="caption"><b>Multiply</b> · subtractive overlaps, /BM /Multiply</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<div class="blend dark"><div class="a"></div><div class="b"></div><div class="c"></div></div>
|
||||
<figcaption class="caption"><b>Screen</b> · additive light, /BM /Screen</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<svg viewBox="0 0 160 120"><defs><clipPath id="cp1"><text x="80" y="88" text-anchor="middle" font-family="Didot, serif" font-size="70" font-weight="bold">Clip</text></clipPath><linearGradient id="lg2" x1="0" x2="0" y1="0" y2="1"><stop offset="0" stop-color="#e4572e"/><stop offset="1" stop-color="#b83b5e"/></linearGradient></defs><rect width="160" height="120" rx="6" fill="#f1ece2"/><g clip-path="url(#cp1)"><rect width="160" height="120" fill="url(#lg2)"/><g stroke="#f2c14e" stroke-width="3">
|
||||
<line x1="0" y1="10" x2="160" y2="130"/><line x1="0" y1="40" x2="160" y2="160"/><line x1="0" y1="-20" x2="160" y2="100"/><line x1="0" y1="-50" x2="160" y2="70"/></g></g></svg>
|
||||
<figcaption class="caption"><b>Clipping path</b> · glyph outlines as a clip</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<svg viewBox="0 0 160 120"><defs><linearGradient id="fade" x1="0" x2="1"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><mask id="m1"><rect width="160" height="120" fill="url(#fade)"/></mask></defs><rect width="160" height="120" rx="6" fill="#f1ece2"/><g mask="url(#m1)"><rect x="12" y="14" width="136" height="92" rx="8" fill="#2a6fdb"/><circle cx="60" cy="60" r="26" fill="#f2c14e"/><circle cx="104" cy="60" r="26" fill="#e4572e"/></g></svg>
|
||||
<figcaption class="caption"><b>Soft mask</b> · luminosity gradient fades artwork</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<svg viewBox="0 0 160 120"><rect width="160" height="120" rx="6" fill="#fffdf8" stroke="#e2dccf"/><g fill="none" stroke="#16213b" stroke-width="2.5"><path d="M16 26 H144" stroke-dasharray="12 6"/><path d="M16 46 H144" stroke-dasharray="2 6" stroke-linecap="round"/><path d="M16 66 H144" stroke-dasharray="18 5 3 5" stroke="#e4572e"/><path d="M16 96 Q 50 70 80 96 T 144 96" stroke="#1a9e8f" stroke-width="5" stroke-linejoin="round" stroke-dasharray="1 9" stroke-linecap="round"/></g></svg>
|
||||
<figcaption class="caption"><b>Dash patterns</b> · caps, joins and phase</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<svg viewBox="0 0 160 120"><defs><pattern id="checks" width="16" height="16" patternUnits="userSpaceOnUse"><rect width="16" height="16" fill="#f1ece2"/><rect width="8" height="8" fill="#16213b"/><rect x="8" y="8" width="8" height="8" fill="#16213b"/></pattern><pattern id="hatch" width="8" height="8" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><rect width="8" height="8" fill="#fbeccc"/><line x1="0" y1="0" x2="0" y2="8" stroke="#e9a100" stroke-width="3"/></pattern></defs><rect width="160" height="120" rx="6" fill="url(#checks)"/><circle cx="80" cy="60" r="40" fill="url(#hatch)" stroke="#16213b" stroke-width="2"/></svg>
|
||||
<figcaption class="caption"><b>Tiling patterns</b> · checks and rotated hatch</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<svg viewBox="0 0 160 120"><rect width="160" height="120" rx="6" fill="#16213b"/><g transform="translate(80 60)"><g fill="none" stroke-width="1.2">
|
||||
<path id="star" d="M0 -46 L13 -14 L46 -14 L19 6 L29 40 L0 20 L-29 40 L-19 6 L-46 -14 L-13 -14 Z" stroke="#f2c14e" fill="#f2c14e" fill-opacity="0.25" fill-rule="evenodd"/>
|
||||
<path d="M0 -46 L27 37 L-44 -14 L44 -14 L-27 37 Z" stroke="#e4572e" fill="#e4572e" fill-opacity="0.45" fill-rule="evenodd"/></g></g></svg>
|
||||
<figcaption class="caption"><b>Fill rules</b> · even-odd pentagram, 45% opacity</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
<div class="rule"></div>
|
||||
<svg viewBox="0 0 520 110" style="width:100%;height:auto;display:block">
|
||||
<defs><linearGradient id="spec" x1="0" x2="1"><stop offset="0" stop-color="#16213b"/><stop offset="0.25" stop-color="#2a6fdb"/><stop offset="0.5" stop-color="#1a9e8f"/><stop offset="0.75" stop-color="#e9a100"/><stop offset="1" stop-color="#e4572e"/></linearGradient></defs>
|
||||
<g style="mix-blend-mode:multiply">
|
||||
<path d="M0 80 C 80 10, 160 110, 260 50 S 440 20, 520 70 L520 110 L0 110Z" fill="url(#spec)" opacity="0.85"/>
|
||||
<path d="M0 95 C 100 40, 200 120, 300 70 S 460 60, 520 90 L520 110 L0 110Z" fill="#e4572e" opacity="0.5"/>
|
||||
<path d="M0 60 C 120 100, 240 20, 360 80 S 480 40, 520 55" fill="none" stroke="#16213b" stroke-width="1.2" stroke-dasharray="4 3"/>
|
||||
</g>
|
||||
</svg>
|
||||
<p class="caption"><b>Layered waves</b> · five-stop shading, 50% overlay in multiply mode, dashed stroke over the top.</p>
|
||||
<div class="folio"><span>Vector Graphics</span><b>6</b></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 10. DATA ============================ -->
|
||||
<section class="page" id="data">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>7 · Data & Tables</span></div>
|
||||
<div class="kicker">Chapter seven</div>
|
||||
<h2 class="sec" id="h-data">Data & <em>Tables</em></h2>
|
||||
<p class="dek">Charts drawn as SVG and a striped table. All figures are illustrative sample data, not measurements.</p>
|
||||
<div class="charts">
|
||||
<div>
|
||||
<p class="chart-title">Pages per second, by document type</p>
|
||||
<p class="chart-sub">Illustrative sample data · higher is better</p>
|
||||
<svg viewBox="0 0 260 180" aria-label="Bar chart">
|
||||
<g font-family="Avenir Next, sans-serif" font-size="7" fill="#7b8196">
|
||||
<g stroke="#e2dccf" stroke-width="0.5"><line x1="30" x2="255" y1="150" y2="150" stroke="#7b8196"/><line x1="30" x2="255" y1="120" y2="120"/><line x1="30" x2="255" y1="90" y2="90"/><line x1="30" x2="255" y1="60" y2="60"/><line x1="30" x2="255" y1="30" y2="30"/></g>
|
||||
<text x="24" y="152" text-anchor="end">0</text><text x="24" y="122" text-anchor="end">50</text><text x="24" y="92" text-anchor="end">100</text><text x="24" y="62" text-anchor="end">150</text><text x="24" y="32" text-anchor="end">200</text>
|
||||
</g>
|
||||
<g fill="#2a6fdb">
|
||||
<path d="M40 150 V40.8 a4 4 0 0 1 4 -4 h22 a4 4 0 0 1 4 4 V150 Z"/>
|
||||
<path d="M84 150 V70.8 a4 4 0 0 1 4 -4 h22 a4 4 0 0 1 4 4 V150 Z"/>
|
||||
<path d="M128 150 V97.8 a4 4 0 0 1 4 -4 h22 a4 4 0 0 1 4 4 V150 Z"/>
|
||||
<path d="M172 150 V112.2 a4 4 0 0 1 4 -4 h22 a4 4 0 0 1 4 4 V150 Z"/>
|
||||
<path d="M216 150 V128.4 a4 4 0 0 1 4 -4 h22 a4 4 0 0 1 4 4 V150 Z"/>
|
||||
</g>
|
||||
<g font-family="Avenir Next, sans-serif" font-size="7.5" fill="#16213b" text-anchor="middle" font-weight="600">
|
||||
<text x="55" y="32">189</text><text x="99" y="62">139</text><text x="143" y="89">94</text><text x="187" y="104">70</text><text x="231" y="120">43</text>
|
||||
</g>
|
||||
<g font-family="Avenir Next, sans-serif" font-size="7" fill="#4a5268" text-anchor="middle">
|
||||
<text x="55" y="162">Text</text><text x="99" y="162">Forms</text><text x="143" y="162">Vector</text><text x="187" y="162">Scans</text><text x="231" y="162">Maps</text>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
<div>
|
||||
<p class="chart-title">Renderer conformance over releases</p>
|
||||
<p class="chart-sub">Illustrative sample data · % of test pages matching reference</p>
|
||||
<svg viewBox="0 0 260 180" aria-label="Line chart">
|
||||
<g font-family="Avenir Next, sans-serif" font-size="7" fill="#7b8196">
|
||||
<g stroke="#e2dccf" stroke-width="0.5"><line x1="30" x2="220" y1="150" y2="150" stroke="#7b8196"/><line x1="30" x2="220" y1="120" y2="120"/><line x1="30" x2="220" y1="90" y2="90"/><line x1="30" x2="220" y1="60" y2="60"/><line x1="30" x2="220" y1="30" y2="30"/></g>
|
||||
<text x="24" y="152" text-anchor="end">60</text><text x="24" y="122" text-anchor="end">70</text><text x="24" y="92" text-anchor="end">80</text><text x="24" y="62" text-anchor="end">90</text><text x="24" y="32" text-anchor="end">100</text>
|
||||
<g text-anchor="middle" fill="#4a5268"><text x="36" y="162">0.1</text><text x="82" y="162">0.2</text><text x="128" y="162">0.3</text><text x="174" y="162">0.4</text><text x="214" y="162">0.5</text></g>
|
||||
</g>
|
||||
<g fill="none" stroke-width="2" stroke-linejoin="round" stroke-linecap="round">
|
||||
<polyline stroke="#2a6fdb" points="36,108 82,84 128,63 174,48 214,39"/>
|
||||
<polyline stroke="#1a9e8f" points="36,132 82,111 128,90 174,69 214,54"/>
|
||||
<polyline stroke="#e4572e" points="36,144 82,135 128,117 174,93 214,75"/>
|
||||
</g>
|
||||
<g stroke="#fbf8f2" stroke-width="2">
|
||||
<circle cx="214" cy="39" r="4" fill="#2a6fdb"/><circle cx="214" cy="54" r="4" fill="#1a9e8f"/><circle cx="214" cy="75" r="4" fill="#e4572e"/>
|
||||
</g>
|
||||
<g font-family="Avenir Next, sans-serif" font-size="7.5" fill="#16213b" font-weight="600">
|
||||
<text x="222" y="41">Text 97</text><text x="222" y="56">Vector 92</text><text x="222" y="77">Forms 85</text>
|
||||
</g>
|
||||
</svg>
|
||||
<div style="display:flex;gap:14pt;font:400 7.5pt var(--sans);color:var(--ink-2);margin:2pt 0 0 30pt">
|
||||
<span><span style="display:inline-block;width:8pt;height:8pt;border-radius:2pt;background:#2a6fdb;vertical-align:-1pt"></span> Text</span>
|
||||
<span><span style="display:inline-block;width:8pt;height:8pt;border-radius:2pt;background:#1a9e8f;vertical-align:-1pt"></span> Vector</span>
|
||||
<span><span style="display:inline-block;width:8pt;height:8pt;border-radius:2pt;background:#e4572e;vertical-align:-1pt"></span> Forms</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3 style="margin-top:22pt">Where each PDF feature lives in this file</h3>
|
||||
<table class="data">
|
||||
<thead><tr><th>Feature</th><th>PDF object</th><th>Produced by</th><th>Page</th><th>Status</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Embedded font subsets</td><td>/FontFile2, /FontFile3</td><td>Chrome</td><td class="num">all</td><td><span class="pill ok">Present</span></td></tr>
|
||||
<tr><td>Tagged structure</td><td>/StructTreeRoot</td><td>Chrome</td><td class="num">all</td><td><span class="pill ok">Present</span></td></tr>
|
||||
<tr><td>Axial & radial shadings</td><td>/ShadingType 2, 3</td><td>Chrome</td><td class="num">6</td><td><span class="pill ok">Present</span></td></tr>
|
||||
<tr><td>Blend modes</td><td>/ExtGState /BM</td><td>Chrome</td><td class="num">6</td><td><span class="pill ok">Present</span></td></tr>
|
||||
<tr><td>Bookmarks</td><td>/Outlines</td><td>Chrome, xtask</td><td class="num">—</td><td><span class="pill ok">Present</span></td></tr>
|
||||
<tr><td>Page labels</td><td>/PageLabels</td><td>xtask</td><td class="num">—</td><td><span class="pill ok">Present</span></td></tr>
|
||||
<tr><td>Optional content</td><td>/OCProperties</td><td>xtask</td><td class="num">9, 10</td><td><span class="pill part">Two layers</span></td></tr>
|
||||
<tr><td>Annotations</td><td>/Annots with /AP</td><td>xtask</td><td class="num">1, 9, 10</td><td><span class="pill ok">Present</span></td></tr>
|
||||
<tr><td>Form fields</td><td>/AcroForm</td><td>xtask</td><td class="num">10</td><td><span class="pill ok">Present</span></td></tr>
|
||||
<tr><td>File attachments</td><td>/EmbeddedFiles</td><td>xtask</td><td class="num">—</td><td><span class="pill ok">Present</span></td></tr>
|
||||
<tr><td>Digital signature</td><td>/FT /Sig</td><td>xtask</td><td class="num">10</td><td><span class="pill plan">Unsigned</span></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="folio"><span>Data & Tables</span><b>7</b></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 11. CODE ============================ -->
|
||||
<section class="page" id="code">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>8 · Code & Images</span></div>
|
||||
<div class="kicker">Chapter eight</div>
|
||||
<h2 class="sec" id="h-code">Code & <em>Images</em></h2>
|
||||
<p class="dek">A monospaced listing with syntax colouring, and the raster that it describes.</p>
|
||||
<pre class="code"><span class="ln">1</span><span class="c">// Escape-time rendering of the Mandelbrot set into an RGB buffer.</span>
|
||||
<span class="ln">2</span><span class="k">fn</span> <span class="f">mandelbrot</span>(width: <span class="ty">u32</span>, height: <span class="ty">u32</span>) -> <span class="ty">Vec</span><<span class="ty">u8</span>> {
|
||||
<span class="ln">3</span> <span class="k">let mut</span> rgb = <span class="ty">Vec</span>::<span class="f">with_capacity</span>((width * height * <span class="m">3</span>) <span class="k">as</span> <span class="ty">usize</span>);
|
||||
<span class="ln">4</span> <span class="k">for</span> py <span class="k">in</span> <span class="m">0</span>..height {
|
||||
<span class="ln">5</span> <span class="k">for</span> px <span class="k">in</span> <span class="m">0</span>..width {
|
||||
<span class="ln">6</span> <span class="k">let</span> c = (<span class="m">-2.2</span> + <span class="m">3.0</span> * px <span class="k">as</span> <span class="ty">f64</span> / width <span class="k">as</span> <span class="ty">f64</span>,
|
||||
<span class="ln">7</span> <span class="m">-1.5</span> + <span class="m">3.0</span> * py <span class="k">as</span> <span class="ty">f64</span> / height <span class="k">as</span> <span class="ty">f64</span>);
|
||||
<span class="ln">8</span> <span class="k">let</span> (<span class="k">mut</span> z, <span class="k">mut</span> n) = ((<span class="m">0.0</span>, <span class="m">0.0</span>), <span class="m">0</span>);
|
||||
<span class="ln">9</span> <span class="k">while</span> n < <span class="n">MAX_ITER</span> && z.<span class="m">0</span> * z.<span class="m">0</span> + z.<span class="m">1</span> * z.<span class="m">1</span> <= <span class="m">4.0</span> {
|
||||
<span class="ln">10</span> z = (z.<span class="m">0</span> * z.<span class="m">0</span> - z.<span class="m">1</span> * z.<span class="m">1</span> + c.<span class="m">0</span>, <span class="m">2.0</span> * z.<span class="m">0</span> * z.<span class="m">1</span> + c.<span class="m">1</span>);
|
||||
<span class="ln">11</span> n += <span class="m">1</span>;
|
||||
<span class="ln">12</span> }
|
||||
<span class="ln">13</span> rgb.<span class="f">extend_from_slice</span>(&<span class="f">palette</span>(n)); <span class="c">// smooth colour ramp</span>
|
||||
<span class="ln">14</span> }
|
||||
<span class="ln">15</span> }
|
||||
<span class="ln">16</span> rgb
|
||||
<span class="ln">17</span>}</pre>
|
||||
<div class="imgrow">
|
||||
<figure style="margin:0"><img src="{{MANDELBROT_PNG}}" alt="Procedurally generated Mandelbrot set"></figure>
|
||||
<div>
|
||||
<h3 style="margin-top:0">A generated raster</h3>
|
||||
<p style="margin:0 0 8pt;font-size:10.5pt;text-align:justify;hyphens:auto">The image at left is computed by the xtask each time the showcase is built, encoded as PNG and handed to Chrome, which embeds it as an image XObject. Nothing is downloaded and no third-party artwork is involved, so the file stays reproducible and free to redistribute.</p>
|
||||
<p style="margin:0 0 8pt;font-size:10.5pt;text-align:justify;hyphens:auto">At 60 dpi the fractal edge looks smooth; zoom in and the individual pixels appear, a useful check that the viewer switches from filtered to nearest-neighbour sampling at the right moment.</p>
|
||||
<h3>Links</h3>
|
||||
<ul class="links" style="padding-left:14pt;margin:0;font-size:10pt">
|
||||
<li>External: <a href="https://example.com/">https://example.com/</a></li>
|
||||
<li>External: <a href="https://example.org/printcraft">example.org/printcraft</a></li>
|
||||
<li>Internal: back to <a href="#contents">the contents</a> or ahead to <a href="#review">review & markup</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="folio"><span>Code & Images</span><b>8</b></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ 12. REVIEW ============================ -->
|
||||
<section class="page" id="review">
|
||||
<div class="runhead"><span>PrintCraft Showcase</span><span>9 · Review & Markup</span></div>
|
||||
<div class="kicker">Chapter nine</div>
|
||||
<h2 class="sec" id="h-review">Review & <em>Markup</em></h2>
|
||||
<p class="dek">Every annotation on this page was added after printing, each with its own appearance stream, author, date and unique name.</p>
|
||||
<div class="review">
|
||||
<div>
|
||||
<h3 style="margin-top:0">Text markup</h3>
|
||||
<p>Reviewers rarely rewrite a document; they <a class="mk" href="https://mark.printcraft.invalid/highlight/review">highlight the phrase that matters</a>, <a class="mk" href="https://mark.printcraft.invalid/underline/review">underline a claim that needs a source</a>, and <a class="mk" href="https://mark.printcraft.invalid/strikeout/review">strike out a redundant word</a> before moving on.</p>
|
||||
<p>A wavy line says <a class="mk" href="https://mark.printcraft.invalid/squiggly/review">check the spelling here</a>, while a caret marks where text should<a class="mk" href="https://mark.printcraft.invalid/caret/review"> </a>be inserted.</p>
|
||||
<h3>Comments</h3>
|
||||
<p>Sticky notes carry threaded replies, and a free-text box writes directly on the page. The paperclip holds an attached file that can be saved from the comment itself.</p>
|
||||
<h3>Legend</h3>
|
||||
<ol class="legend-list">
|
||||
<li>Highlight</li><li>Underline</li><li>StrikeOut</li><li>Squiggly</li><li>Caret</li><li>Text + Popup</li><li>FreeText</li><li>Line (arrow)</li><li>Square</li><li>Circle</li><li>Polygon</li><li>PolyLine</li><li>Ink</li><li>Stamp</li><li>FileAttachment</li><li>Link</li>
|
||||
</ol>
|
||||
</div>
|
||||
<div class="canvas">
|
||||
<span class="lab" style="left:10pt;top:8pt">Review canvas</span>
|
||||
<a class="box" style="left:12pt;top:26pt;width:152pt;height:40pt" href="https://mark.printcraft.invalid/freetext/1">.</a>
|
||||
<a class="box" style="left:196pt;top:22pt;width:20pt;height:20pt" href="https://mark.printcraft.invalid/note/1">.</a>
|
||||
<a class="box" style="left:196pt;top:60pt;width:18pt;height:22pt" href="https://mark.printcraft.invalid/attach/1">.</a>
|
||||
<a class="box" style="left:16pt;top:88pt;width:90pt;height:60pt" href="https://mark.printcraft.invalid/square/1">.</a>
|
||||
<a class="box" style="left:120pt;top:92pt;width:90pt;height:60pt" href="https://mark.printcraft.invalid/circle/1">.</a>
|
||||
<a class="box" style="left:16pt;top:170pt;width:94pt;height:80pt" href="https://mark.printcraft.invalid/polygon/1">.</a>
|
||||
<a class="box" style="left:120pt;top:170pt;width:96pt;height:80pt" href="https://mark.printcraft.invalid/polyline/1">.</a>
|
||||
<a class="box" style="left:16pt;top:268pt;width:196pt;height:40pt" href="https://mark.printcraft.invalid/line/1">.</a>
|
||||
<a class="box" style="left:16pt;top:322pt;width:196pt;height:50pt" href="https://mark.printcraft.invalid/ink/1">.</a>
|
||||
<a class="box" style="left:30pt;top:388pt;width:170pt;height:56pt" href="https://mark.printcraft.invalid/stamp/1">.</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="folio"><span>Review & Markup</span><b>9</b></div>
|
||||
</section>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,92 @@
|
||||
Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION AND CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
@@ -0,0 +1,93 @@
|
||||
Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
https://openfontlicense.org
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
@@ -0,0 +1,43 @@
|
||||
ISC License
|
||||
|
||||
Copyright (c) 2026 Lucide Icons and Contributors
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
---
|
||||
|
||||
The following Lucide icons are derived from the Feather project:
|
||||
|
||||
airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out
|
||||
|
||||
The MIT License (MIT) (for the icons listed above)
|
||||
|
||||
Copyright (c) 2013-present Cole Bemis
|
||||
|
||||
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.
|
||||
@@ -0,0 +1,19 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-accessibility"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="16" cy="4" r="1" />
|
||||
<path d="m18 19 1-7-6 1" />
|
||||
<path d="m5 8 3-3 5.5 3-2.36 3.5" />
|
||||
<path d="M4.24 14.5a5 5 0 0 0 6.88 6" />
|
||||
<path d="M13.76 17.5a5 5 0 0 0-6.88-6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 482 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-align-left"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M21 5H3" />
|
||||
<path d="M15 12H3" />
|
||||
<path d="M17 19H3" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 360 B |
@@ -0,0 +1,16 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<rect x="2" y="4" width="20" height="16" rx="2" />
|
||||
<path d="M10 4v4" />
|
||||
<path d="M2 8h20" />
|
||||
<path d="M6 4v4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 329 B |
@@ -0,0 +1,16 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M8 3 4 7l4 4" />
|
||||
<path d="M4 7h16" />
|
||||
<path d="m16 21 4-4-4-4" />
|
||||
<path d="M20 17H4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 313 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-arrow-up-down"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m21 16-4 4-4-4" />
|
||||
<path d="M17 20V4" />
|
||||
<path d="m3 8 4-4 4 4" />
|
||||
<path d="M7 4v16" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 397 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-arrow-up-right"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M7 7h10v10" />
|
||||
<path d="M7 17 17 7" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 345 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-badge-check"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z" />
|
||||
<path d="m16 9-5.5 5.5L8 12" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 499 B |
@@ -0,0 +1,19 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M10 10.01h.01" />
|
||||
<path d="M10 14.01h.01" />
|
||||
<path d="M14 10.01h.01" />
|
||||
<path d="M14 14.01h.01" />
|
||||
<path d="M18 6v12" />
|
||||
<path d="M6 6v12" />
|
||||
<rect x="2" y="6" width="20" height="12" rx="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 424 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-bell"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M10.268 21a2 2 0 0 0 3.464 0" />
|
||||
<path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 468 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="15" cy="9" r="7" />
|
||||
<circle cx="9" cy="15" r="7" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 276 B |
@@ -0,0 +1,15 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-bold"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 368 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-book-open"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M12 5v16" />
|
||||
<path d="M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 467 B |
@@ -0,0 +1,15 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-bookmark"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 421 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-braces"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1" />
|
||||
<path d="M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 457 B |
@@ -0,0 +1,16 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m16 22-1-4" />
|
||||
<path d="M19 14a1 1 0 0 0 1-1v-1a2 2 0 0 0-2-2h-3a1 1 0 0 1-1-1V4a2 2 0 0 0-4 0v5a1 1 0 0 1-1 1H6a2 2 0 0 0-2 2v1a1 1 0 0 0 1 1" />
|
||||
<path d="M19 14H5l-1.973 6.767A1 1 0 0 0 4 22h16a1 1 0 0 0 .973-1.233z" />
|
||||
<path d="m8 22 1-4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 470 B |
@@ -0,0 +1,15 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m11 10 3 3" />
|
||||
<path d="M6.5 21A3.5 3.5 0 1 0 3 17.5a2.62 2.62 0 0 1-.708 1.792A1 1 0 0 0 3 21z" />
|
||||
<path d="M9.969 17.031 21.378 5.624a1 1 0 0 0-3.002-3.002L6.967 14.031" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 398 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-camera"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z" />
|
||||
<circle cx="12" cy="13" r="3" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 514 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-check-circle-2"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
<path d="m16 9-5.5 5.5L8 12" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 363 B |
@@ -0,0 +1,13 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M20 6 9 17l-5-5" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 239 B |
@@ -0,0 +1,13 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m6 9 6 6 6-6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 236 B |
@@ -0,0 +1,15 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-chevron-left"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m15 18-6-6 6-6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 321 B |
@@ -0,0 +1,13 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m9 18 6-6-6-6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 237 B |
@@ -0,0 +1,15 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-chevron-up"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m18 15-6-6-6 6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 319 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m11 17-5-5 5-5" />
|
||||
<path d="m18 17-5-5 5-5" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 268 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m6 17 5-5-5-5" />
|
||||
<path d="m13 17 5-5-5-5" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 267 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-circle-check"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
<path d="m16 9-5.5 5.5L8 12" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 361 B |
@@ -0,0 +1,20 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M10.1 2.182a10 10 0 0 1 3.8 0" />
|
||||
<path d="M13.9 21.818a10 10 0 0 1-3.8 0" />
|
||||
<path d="M17.609 3.721a10 10 0 0 1 2.69 2.7" />
|
||||
<path d="M2.182 13.9a10 10 0 0 1 0-3.8" />
|
||||
<path d="M20.279 17.609a10 10 0 0 1-2.7 2.69" />
|
||||
<path d="M21.818 10.1a10 10 0 0 1 0 3.8" />
|
||||
<path d="M3.721 6.391a10 10 0 0 1 2.7-2.69" />
|
||||
<path d="M6.391 20.279a10 10 0 0 1-2.69-2.7" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 590 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="1" />
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 279 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-circle-help"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
<path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" />
|
||||
<path d="M12 17h.01" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 404 B |
@@ -0,0 +1,15 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-circle"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 321 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-clock-3"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
<path d="M12 6v6h4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 347 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
<path d="M12 6v6l4 2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 271 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-cloud-upload"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M12 13v8" />
|
||||
<path d="M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242" />
|
||||
<path d="m8 17 4-4 4 4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 416 B |
@@ -0,0 +1,15 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-cloud"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 351 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-columns-2"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<rect width="18" height="18" x="3" y="3" rx="2" />
|
||||
<path d="M12 3v18" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 365 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
<path d="m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 351 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
<path d="M12 18a6 6 0 0 0 0-12v12z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 285 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-copy-plus"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<line x1="15" x2="15" y1="12" y2="18" />
|
||||
<line x1="12" x2="18" y1="15" y2="15" />
|
||||
<rect width="14" height="14" x="8" y="8" rx="2" ry="2" />
|
||||
<path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 505 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<rect width="14" height="14" x="8" y="8" rx="2" ry="2" />
|
||||
<path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 339 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 2v14a2 2 0 0 0 2 2h14" />
|
||||
<path d="M18 22V8a2 2 0 0 0-2-2H2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 288 B |
@@ -0,0 +1,13 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 325 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-ellipsis-vertical"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="1" />
|
||||
<circle cx="12" cy="5" r="1" />
|
||||
<circle cx="12" cy="19" r="1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 400 B |
@@ -0,0 +1,15 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="1" />
|
||||
<circle cx="19" cy="12" r="1" />
|
||||
<circle cx="5" cy="12" r="1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 312 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M21 21H8a2 2 0 0 1-1.42-.587l-3.994-3.999a2 2 0 0 1 0-2.828l10-10a2 2 0 0 1 2.829 0l5.999 6a2 2 0 0 1 0 2.828L12.834 21" />
|
||||
<path d="m5.082 11.09 8.828 8.828" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 383 B |
@@ -0,0 +1,16 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49" />
|
||||
<path d="M14.084 14.158a3 3 0 0 1-4.242-4.242" />
|
||||
<path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143" />
|
||||
<path d="m2 2 20 20" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 504 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0" />
|
||||
<circle cx="12" cy="12" r="3" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 360 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-check"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="m9 15 2 2 4-4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 483 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-down"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="M12 18v-6" />
|
||||
<path d="m9 15 3 3 3-3" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 507 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-input"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M4 11V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-1" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="M2 15h10" />
|
||||
<path d="m9 18 3-3-3-3" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 511 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-lock-2"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M4 9.8V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-3" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="M9 17v-2a2 2 0 0 0-4 0v2" />
|
||||
<rect width="8" height="5" x="3" y="17" rx="1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 536 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-minus"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="M9 15h6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 477 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-output"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M4.226 20.925A2 2 0 0 0 6 22h12a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v3.127" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="m5 11-3 3" />
|
||||
<path d="m5 17-3-3h10" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 524 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-pen-line"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M14.364 13.634a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506l4.013-4.009a1 1 0 0 0-3.004-3.004z" />
|
||||
<path d="M14.487 7.858A1 1 0 0 1 14 7V2" />
|
||||
<path d="M20 19.645V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l2.516 2.516" />
|
||||
<path d="M8 18h1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 617 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-plus-2"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M11.35 22H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v5.35" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="M14 19h6" />
|
||||
<path d="M17 16v6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 496 B |
@@ -0,0 +1,16 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="M9 15h6" />
|
||||
<path d="M12 18v-6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 421 B |
@@ -0,0 +1,20 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-scan"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M20 10V8a2.4 2.4 0 0 0-.706-1.704l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.35" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="M16 14a2 2 0 0 0-2 2" />
|
||||
<path d="M16 22a2 2 0 0 1-2-2" />
|
||||
<path d="M20 14a2 2 0 0 1 2 2" />
|
||||
<path d="M20 22a2 2 0 0 0 2-2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 590 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-search"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<circle cx="11.5" cy="14.5" r="2.5" />
|
||||
<path d="M13.3 16.3 15 18" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 528 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-symlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M4 11V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h7" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="m10 18 3-3-3-3" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 506 B |
@@ -0,0 +1,19 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-text"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="M10 9H8" />
|
||||
<path d="M16 13H8" />
|
||||
<path d="M16 17H8" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 524 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-file-x"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
|
||||
<path d="M14 2v5a1 1 0 0 0 1 1h5" />
|
||||
<path d="m14.5 12.5-5 5" />
|
||||
<path d="m9.5 12.5 5 5" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 509 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-files"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M15 2h-4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V8" />
|
||||
<path d="M16.706 2.706A2.4 2.4 0 0 0 15 2v5a1 1 0 0 0 1 1h5a2.4 2.4 0 0 0-.706-1.706z" />
|
||||
<path d="M5 7a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 1.732-1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 520 B |
@@ -0,0 +1,22 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-film"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<rect width="18" height="18" x="3" y="3" rx="2" />
|
||||
<path d="M7 3v18" />
|
||||
<path d="M3 7.5h4" />
|
||||
<path d="M3 12h18" />
|
||||
<path d="M3 16.5h4" />
|
||||
<path d="M17 3v18" />
|
||||
<path d="M17 7.5h4" />
|
||||
<path d="M17 16.5h4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 507 B |
@@ -0,0 +1,15 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-filter"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 447 B |
@@ -0,0 +1,13 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 401 B |
@@ -0,0 +1,15 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M12 10v6" />
|
||||
<path d="M9 13h6" />
|
||||
<path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 389 B |
@@ -0,0 +1,13 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 342 B |
@@ -0,0 +1,14 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m12 14 4-4" />
|
||||
<path d="M3.34 19a10 10 0 1 1 17.32 0" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 278 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-git-compare"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="18" cy="18" r="3" />
|
||||
<circle cx="6" cy="6" r="3" />
|
||||
<path d="M13 6h3a2 2 0 0 1 2 2v7" />
|
||||
<path d="M11 18H8a2 2 0 0 1-2-2V9" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 437 B |
@@ -0,0 +1,17 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<rect width="18" height="18" x="3" y="3" rx="2" />
|
||||
<path d="M3 9h18" />
|
||||
<path d="M3 15h18" />
|
||||
<path d="M9 3v18" />
|
||||
<path d="M15 3v18" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 355 B |
@@ -0,0 +1,16 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2" />
|
||||
<path d="M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2" />
|
||||
<path d="M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8" />
|
||||
<path d="M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 483 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-hash"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<line x1="4" x2="20" y1="9" y2="9" />
|
||||
<line x1="4" x2="20" y1="15" y2="15" />
|
||||
<line x1="10" x2="8" y1="3" y2="21" />
|
||||
<line x1="16" x2="14" y1="3" y2="21" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 448 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-heading"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M6 12h12" />
|
||||
<path d="M6 20V4" />
|
||||
<path d="M18 20V4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 357 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-highlighter"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m9 11-6 6v3h9l3-3" />
|
||||
<path d="m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 399 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-house"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8" />
|
||||
<path d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 459 B |
@@ -0,0 +1,19 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-image-plus"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M16 5h6" />
|
||||
<path d="M19 2v6" />
|
||||
<path d="M21 11.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7.5" />
|
||||
<path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />
|
||||
<circle cx="9" cy="9" r="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 502 B |
@@ -0,0 +1,15 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<rect width="18" height="18" x="3" y="3" rx="2" ry="2" />
|
||||
<circle cx="9" cy="9" r="2" />
|
||||
<path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 358 B |
@@ -0,0 +1,15 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
<path d="M12 16v-4" />
|
||||
<path d="M12 8h.01" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 294 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-italic"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<line x1="19" x2="10" y1="4" y2="4" />
|
||||
<line x1="14" x2="5" y1="20" y2="20" />
|
||||
<line x1="15" x2="9" y1="4" y2="20" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 409 B |
@@ -0,0 +1,20 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-languages"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m5 8 6 6" />
|
||||
<path d="m4 14 6-6 2-3" />
|
||||
<path d="M2 5h12" />
|
||||
<path d="M7 2h1" />
|
||||
<path d="m22 22-5-10-5 10" />
|
||||
<path d="M14 18h6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 442 B |
@@ -0,0 +1,15 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M3.704 14.467a10 8 0 1 1 3.115 2.375" />
|
||||
<path d="M7 22a5 5 0 0 1-2-3.994" />
|
||||
<circle cx="5" cy="16" r="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 333 B |
@@ -0,0 +1,15 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z" />
|
||||
<path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12" />
|
||||
<path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 510 B |
@@ -0,0 +1,18 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-layout-grid"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<rect width="7" height="7" x="3" y="3" rx="1" />
|
||||
<rect width="7" height="7" x="14" y="3" rx="1" />
|
||||
<rect width="7" height="7" x="14" y="14" rx="1" />
|
||||
<rect width="7" height="7" x="3" y="14" rx="1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 498 B |