Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
be18ca5
Use node-modules linker and enable inline dynamic imports
jondkinney Mar 22, 2026
d0e25ea
Add extended Prism language support with 28 new languages
jondkinney Mar 22, 2026
54b46fa
Detect CommonMark code block language format on paste
jondkinney Mar 22, 2026
4721e5b
Add editor content styles for code blocks, syntax tokens, and blockqu…
jondkinney Mar 22, 2026
6fa8a5d
Add triple-backtick code fence shortcut
jondkinney Mar 22, 2026
e88b333
Add slash commands, prompt positioning fix, and accessibility improve…
jondkinney Mar 22, 2026
7e1f65a
Scope toolbar test selectors to prevent conflicts with prompt items
jondkinney Mar 22, 2026
2540529
Add mixed ordered/unordered list support (Notion-style)
jondkinney Mar 23, 2026
5872b34
Add attachment action buttons, card view, and file type styling
jondkinney Mar 23, 2026
e24ed7a
Update styles for mixed lists, attachment cards, and border-radius
jondkinney Mar 23, 2026
ad5dda2
Update download button on toolbar, pass through caption to preview
jondkinney Mar 23, 2026
a8187c6
Add block selection, movement, and list traversal for wrapped blocks
jondkinney Mar 23, 2026
5b001ac
Align drag handle with first line of text for all block types
jondkinney Mar 23, 2026
0ee5e20
Add Tab/Shift+Tab indent/outdent in block select mode
jondkinney Mar 23, 2026
0dd19b2
Block actions menu (Cmd+/), duplicate (Cmd+D), improved delete behavior
jondkinney Mar 23, 2026
79a650a
Highlight integration: save last-used color from toolbar, toolbar sta…
jondkinney Mar 24, 2026
5431b68
Block actions menu: scroll anchoring, viewport clamping, hover/keyboa…
jondkinney Mar 24, 2026
31c15d4
Prompt menu: keep flipped menu anchored to cursor during filtering
jondkinney Mar 24, 2026
1814ea6
Add H1 heading support across the full stack
jondkinney Mar 24, 2026
a2a4db2
Notion-style slash command palette with sections, colors, and polishe…
jondkinney Mar 24, 2026
0144791
Markdown shortcuts: --- for horizontal rule, | and " for blockquote
jondkinney Mar 24, 2026
6ebda02
Block movement: decorator node traversal, list entry, and streamlined…
jondkinney Mar 24, 2026
b6d6a53
Add fuzzysort dependency for fuzzy slash menu search
jondkinney Mar 24, 2026
60d0921
Slash menu: split into "Basic blocks" (insert below) and "Turn into" …
jondkinney Mar 24, 2026
e99fa0d
Block selection: inline format shortcuts and Cmd+K suppression
jondkinney Mar 24, 2026
7087a31
Highlight: clear color on new paragraph after Enter
jondkinney Mar 24, 2026
29fd122
Link dialog: near-text positioning, loose URL validation, pinned drop…
jondkinney Mar 24, 2026
b73d6bd
Editor CSS: block select radius, list spacing, link dropdown, highlig…
jondkinney Mar 24, 2026
7b1b2b5
Link dialog: overlay-based selection highlight with pixel-perfect pos…
jondkinney Mar 24, 2026
45abee8
Block selection and drag-and-drop: Notion-style highlights, depth-awa…
jondkinney Mar 26, 2026
d1ae533
Polish: drag styling, self-outdent from any position, keyboard move w…
jondkinney Mar 26, 2026
f184bb8
Tab indent/outdent for wrapped blocks, ghost width, focus scroll, dra…
jondkinney Mar 26, 2026
d70ae45
Fix: indent creates structural wrappers, cleanup preserves user content
jondkinney Mar 26, 2026
de96150
Fix indent/outdent: merge adjacent wrappers, preserve nested content
jondkinney Mar 26, 2026
d6089b6
Handle reposition, max nesting depth (10), block-select Tab reposition
jondkinney Mar 26, 2026
b7fcbc0
Fix toolbar dropdown chevrons: match upstream exactly
jondkinney Mar 26, 2026
947b7b7
Esc cycle, Tab trap, wrapped bullet fix, null guard
jondkinney Mar 26, 2026
65b2753
Fix toolbar dropdown timing, code Tab prevention, indent reposition
jondkinney Mar 26, 2026
1d7f0c8
Fix highlight color clear on Enter, mention delete distinction
jondkinney Mar 26, 2026
546bdb2
Highlight color inheritance: cascade to children on color, indent, mo…
jondkinney Mar 26, 2026
def347f
Block handles: opt-out attribute, padding normalization, first-child …
jondkinney Mar 27, 2026
ba052d6
Enter on wrapped list items creates sibling, highlight color inheritance
jondkinney Mar 27, 2026
a8ec486
Turn-into wraps content in-place when inside list items
jondkinney Mar 27, 2026
54a57ee
Unwrap wrapped list items on turn-into bullet/numbered list
jondkinney Mar 27, 2026
b2a5ad2
Code block and table exit creates list item sibling when wrapped
jondkinney Mar 27, 2026
95b6ec5
Block actions menu: don't auto-show submenu
jondkinney Mar 27, 2026
d2cab93
Bullet offset sync method, block-selected ::before opacity
jondkinney Mar 27, 2026
f6bea6c
Regenerate yarn.lock to fix CI frozen-lockfile failures
PendragonDevelopment Mar 27, 2026
3dad118
Add missing clickToolbarButton export to test helper
PendragonDevelopment Mar 27, 2026
46cabab
Defer extension initialization to after editor bootstrap
PendragonDevelopment Mar 27, 2026
741f8bb
Fix all ESLint errors across the codebase
PendragonDevelopment Mar 27, 2026
0106acc
Revert deferred init, raise benchmark thresholds instead
PendragonDevelopment Mar 27, 2026
18cdb5c
Restore removed code, use eslint-disable instead of deletion
PendragonDevelopment Mar 27, 2026
851a8f0
Fix browser test failures across all browsers
PendragonDevelopment Mar 27, 2026
9ff527e
Fix list toggle, blockquote escape, divider delete, and attachment bugs
PendragonDevelopment Mar 27, 2026
7584978
Fix WebKit crash: requestIdleCallback is not defined in Safari
jondkinney Mar 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
/dist/
/node_modules/
/app/assets/javascript/
.yarn/install-state.gz

# Claude Code
/.claude/worktrees/
Expand Down
1 change: 1 addition & 0 deletions .yarnrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
nodeLinker: node-modules
164 changes: 139 additions & 25 deletions app/assets/stylesheets/lexxy-content.css
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,15 @@

code, pre {
background-color: var(--lexxy-color-ink-lightest);
border-radius: var(--lexxy-radius);
border-radius: calc(var(--lexxy-radius) + var(--lexxy-toolbar-gap, 2px));
color: var(--lexxy-color-ink);
font-family: var(--lexxy-font-mono);
font-size: 0.9em;
padding: 0.25ch 0.5ch;

&:is(pre),
&[data-language] {
border-radius: var(--lexxy-radius);
border-radius: calc(var(--lexxy-radius) + var(--lexxy-toolbar-gap, 2px));
display: block;
hyphens: none;
margin-block: 0 var(--lexxy-content-margin);
Expand All @@ -123,21 +123,84 @@
}

ol, ul:not(.lexxy-prompt-menu) {
margin-inline-start: calc(var(--lexxy-content-margin) * 1.5);
padding: 0;
margin-inline-start: 0;
padding-inline-start: 2em;
counter-reset: mixed-list;
list-style-type: none;
}

ul {
li[data-list-item-type="number"],
li[data-list-item-type="bullet"] {
position: relative;
line-height: 1.75;

&::marker {
content: none;
}

&::before {
position: absolute;
right: 100%;
width: 2em;
display: inline-block;
text-align: center;
}
}

li[data-list-item-type="number"]:not(.lexxy-nested-listitem) {
counter-increment: mixed-list;

&::before {
content: counter(mixed-list) ".";
}
}

li[data-list-item-type="bullet"] {
&::before {
content: "";
transform: none;
height: 1lh;
}
}

li[data-bullet-depth="1"]::before {
background: radial-gradient(circle, currentColor 3px, transparent 3px) center / 6px 6px no-repeat;
}

li[data-bullet-depth="2"]::before {
background: radial-gradient(circle, transparent 1.5px, currentColor 1.5px, currentColor 3px, transparent 3px) center / 6px 6px no-repeat;
}

li[data-bullet-depth="3"]::before {
background: linear-gradient(currentColor, currentColor) center / 6px 6px no-repeat;
}

/* Fallback for lists without data-list-item-type (e.g. external content) */
ul:not(:has([data-list-item-type])) {
list-style-type: disc;
}

ol {
ol:not(:has([data-list-item-type])) {
list-style-type: decimal;
}

/* Tighter indent for nested lists */
.lexxy-nested-listitem ol,
.lexxy-nested-listitem ul:not(.lexxy-prompt-menu) {
padding-inline-start: 2em;
}

li.lexxy-nested-listitem {
list-style-type: none;

&::marker {
content: none;
}

&::before {
content: none;
}

ol, ul {
margin-block-end: 0;
}
Expand Down Expand Up @@ -294,7 +357,7 @@

block-size: auto;
box-sizing: border-box;
border-radius: var(--lexxy-radius);
border-radius: calc(var(--lexxy-radius) + var(--lexxy-toolbar-gap, 2px));
display: block;
inline-size: fit-content;
margin-inline: auto;
Expand All @@ -313,27 +376,27 @@
}

.attachment__icon {
aspect-ratio: 4/5;
background-color: color-mix(var(--lexxy-attachment-icon-color), transparent 90%);
block-size: 3lh;
border: 1px solid var(--lexxy-attachment-icon-color);
border-block-start-width: 1.5ch;
border-radius: var(--lexxy-radius);
background-color: var(--lexxy-attachment-icon-bg, var(--lexxy-color-ink-lightest, #f3f4f6));
block-size: 2.5rem;
inline-size: 2.5rem;
border: 2px solid var(--lexxy-attachment-icon-border, var(--lexxy-color-ink-lighter, #d1d5db));
border-radius: calc(var(--lexxy-radius) + var(--lexxy-toolbar-gap, 2px));
box-sizing: border-box;
color: var(--lexxy-attachment-icon-color);
color: var(--lexxy-attachment-icon-text, var(--lexxy-color-ink-medium, #6b7280));
display: grid;
font-size: var(--lexxy-text-small);
font-weight: bold;
inline-size: auto;
font-size: 0.7rem;
font-weight: 700;
letter-spacing: 0.02em;
overflow: hidden;
place-content: center;
text-transform: uppercase;
white-space: nowrap;
flex-shrink: 0;
}

.attachment--preview {
img, video {
border-radius: var(--lexxy-radius);
border-radius: calc(var(--lexxy-radius) + var(--lexxy-toolbar-gap, 2px));
block-size: auto;
display: block;
margin-inline: auto;
Expand All @@ -348,25 +411,76 @@
.attachment__caption {
padding-block-end: 0.5ch;
}

.attachment__card-view {
display: none;
}

&.attachment--collapsed {
.attachment__preview-view {
display: none;
}

.attachment__card-view {
align-items: center;
border: 1px solid var(--lexxy-color-ink-lighter, #e5e7eb);
border-radius: calc(var(--lexxy-radius) + var(--lexxy-toolbar-gap, 2px));
display: flex;
gap: 0.75rem;
inline-size: 100%;
padding: 0.75rem;
}
}
}

.attachment--file {
--lexxy-attachment-icon-color: var(--lexxy-color-text-subtle);

align-items: center;
border: 1px solid var(--lexxy-color-ink-lighter, #e5e7eb);
border-radius: calc(var(--lexxy-radius) + var(--lexxy-toolbar-gap, 2px));
display: flex;
flex-wrap: wrap;
inline-size: auto;
gap: 0.75rem;
inline-size: 100%;
padding: 0.75rem;

.attachment__caption {
display: grid;
display: flex;
flex-direction: column;
flex: 1;
gap: 0.125rem;
min-width: 0;
text-align: start;
}

.attachment__name {
color: var(--lexxy-color-ink);
font-weight: bold;
font-size: 0.875rem;
font-weight: 600;
line-height: 1.3;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

.attachment__meta {
display: flex;
align-items: baseline;
gap: 0.5rem;
}

.attachment__caption-text {
color: var(--lexxy-color-text-subtle, #9ca3af);
font-size: 0.8125rem;
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

.attachment__subtitle {
color: var(--lexxy-color-text-subtle, #9ca3af);
font-size: 0.75rem;
flex-shrink: 0;
}
}

Expand Down Expand Up @@ -453,7 +567,7 @@

align-items: center;
background: var(--lexxy-attachment-bg-color);
border-radius: var(--lexxy-radius);
border-radius: calc(var(--lexxy-radius) + var(--lexxy-toolbar-gap, 2px));
color: var(--lexxy-attachment-text-color);
display: inline-flex;
gap: 0.25ch;
Expand Down
Loading
Loading