Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
183 commits
Select commit Hold shift + click to select a range
afaa1e7
add workspacemd
hannessolo Mar 31, 2026
df69347
add more details
hannessolo Mar 31, 2026
38de5c9
list responsibilities of blocks more generically
hannessolo Mar 31, 2026
67b2530
add backend fetch details
hannessolo Mar 31, 2026
0383163
feat: basic chat ui - initial commit
sharanyavinod Mar 31, 2026
b0d899d
fix: add basic controller + empty state
sharanyavinod Apr 1, 2026
798985b
chore: update lock
sharanyavinod Apr 1, 2026
528837b
fix: add init for block
sharanyavinod Apr 1, 2026
37ff3d3
doc: cleanup chat doc
sharanyavinod Apr 1, 2026
cbf8bbe
chore: rename to consistent pattern
sharanyavinod Apr 1, 2026
83a72fe
replace postmessage api with props/events model
hannessolo Apr 1, 2026
fa6fba9
fix: adapt styles
sharanyavinod Apr 1, 2026
23d4b88
fix: simple toggle of btn icons
sharanyavinod Apr 1, 2026
4bf3ed6
chore: update stop svg
sharanyavinod Apr 1, 2026
893f81c
chore: fix alignment
sharanyavinod Apr 2, 2026
d974352
chore: fix positioning
sharanyavinod Apr 2, 2026
0c95872
chore: fix positioning
sharanyavinod Apr 2, 2026
21b174e
Merge pull request #303 from adobe/feat/chat-ui-setup
hannessolo Apr 2, 2026
6eade5e
fix capitalization
hannessolo Apr 2, 2026
eb37d79
rename shared to workspace-shared
hannessolo Apr 2, 2026
958f8e8
Merge branch 'main' into ew
hannessolo Apr 2, 2026
650bf44
Merge branch 'ew' into ew-layout
hannessolo Apr 2, 2026
ed23a24
Merge branch 'ew-panels' into ew-layout
hannessolo Apr 2, 2026
a7ed4b1
wip: layut
hannessolo Apr 2, 2026
b82d942
fix import to lit
hannessolo Apr 7, 2026
5315aa4
Merge branch 'main' into ew-layout
hannessolo Apr 7, 2026
eca555e
Merge branch 'main' into ew-layout
hannessolo Apr 7, 2026
623ef2d
feat: chat agent connection (#323)
sharanyavinod Apr 7, 2026
76d87e2
chore: add daFetch to nx2
sharanyavinod Apr 8, 2026
568e9a1
chore: add support for stage fetch
sharanyavinod Apr 8, 2026
3b431b0
Merge pull request #297 from adobe/ew-workmd
hannessolo Apr 8, 2026
62d8cb7
Merge branch 'ew' into ew-layout
hannessolo Apr 8, 2026
84386e9
add canvas
hannessolo Apr 8, 2026
5786874
Merge branch 'main' into ew
hannessolo Apr 8, 2026
dbfb0ec
Merge branch 'ew' into ew-layout
hannessolo Apr 8, 2026
0ee7650
remove panel block
hannessolo Apr 8, 2026
5c6033f
Merge pull request #326 from adobe/chore/add-dafetch
hannessolo Apr 8, 2026
2c37c2d
move close icons to panel
hannessolo Apr 8, 2026
80280c3
Merge branch 'ew' into ew-quickedit
hannessolo Apr 9, 2026
3529e6e
feat: introduce chat welcome page (#332)
sharanyavinod Apr 9, 2026
91f2fc4
wip: add editor
hannessolo Apr 9, 2026
6ba962c
Merge branch 'ew' into ew-layout
hannessolo Apr 9, 2026
171bf92
Merge pull request #327 from adobe/ew-layout
hannessolo Apr 9, 2026
965bfe3
Merge branch 'ew' into ew-quickedit
hannessolo Apr 9, 2026
2afb80e
feat: preserve conversation history (#333)
sharanyavinod Apr 9, 2026
1058500
fix: remove static values and cleanup styles
sharanyavinod Apr 9, 2026
b1afb0d
feat: add option to insert buttons in panel header
sharanyavinod Apr 9, 2026
5a9476a
chore: code cleanup
sharanyavinod Apr 9, 2026
93ffbb6
chore: code cleanup
sharanyavinod Apr 9, 2026
5013d30
style: fix dark mode
sharanyavinod Apr 9, 2026
1a563af
chore: cleanup
sharanyavinod Apr 9, 2026
feefa39
chore: cleanup
sharanyavinod Apr 9, 2026
e4338ea
Merge pull request #334 from adobe/fix/ew-chat-integration
hannessolo Apr 10, 2026
846af82
Merge remote-tracking branch 'origin/ew' into ew-quickedit
hannessolo Apr 13, 2026
8f15ccf
feat: Implement basic browse. (#344)
kozmaadrian Apr 13, 2026
c86fc0b
restructure editors
hannessolo Apr 13, 2026
a4a37b0
remove qe-plus features
hannessolo Apr 13, 2026
f3dab10
restructure
hannessolo Apr 13, 2026
28c2d4d
feat: reusable menu and popover (#350)
sharanyavinod Apr 14, 2026
d295115
address pr feedback
hannessolo Apr 14, 2026
8f47f3f
cleanup
hannessolo Apr 14, 2026
ed91665
close port
hannessolo Apr 14, 2026
8af5ff5
change initialization of qe port
hannessolo Apr 14, 2026
d991946
remove html extension
hannessolo Apr 14, 2026
84758dd
Merge remote-tracking branch 'origin/ew' into ew-quickedit
hannessolo Apr 14, 2026
418e324
fix fetch
hannessolo Apr 14, 2026
b565f67
Merge pull request #351 from adobe/ew-quickedit
hannessolo Apr 14, 2026
9670d9c
change quick edit branch
hannessolo Apr 14, 2026
8bf0820
implement slash menu from scratch
hannessolo Apr 16, 2026
3c44b70
add slash menu hint
hannessolo Apr 16, 2026
639f404
add block editing items
hannessolo Apr 16, 2026
9df56bd
add block editing items
hannessolo Apr 16, 2026
e8e3288
add missing files
hannessolo Apr 16, 2026
08af0cd
properly position slash menu hint
hannessolo Apr 16, 2026
055e4ac
position popover on scroll
hannessolo Apr 16, 2026
1783d89
feat: reusable picker (#357)
sharanyavinod Apr 16, 2026
2da4fa4
Refactor event handling
hannessolo Apr 16, 2026
ed81b55
pr feedback
hannessolo Apr 16, 2026
7ef0a5f
Merge remote-tracking branch 'origin/ew' into ew-tools-v2
hannessolo Apr 16, 2026
42067c9
Merge pull request #360 from adobe/ew-tools-v2
hannessolo Apr 16, 2026
970524c
style: fix styling issues (#363)
sharanyavinod Apr 17, 2026
a0a9d12
add wiring for popup
hannessolo Apr 17, 2026
2c0e30e
feat: Add basic breadcrumb. (#349)
kozmaadrian Apr 17, 2026
65b395c
implement basics
hannessolo Apr 17, 2026
e1bf5fa
clean up css
hannessolo Apr 17, 2026
6322cd2
feat: introduce tools support (#352)
sharanyavinod Apr 20, 2026
aaf32b1
correctly show toolbar on wysiwyg view
hannessolo Apr 21, 2026
f6cae37
fix toolbar focus and states
hannessolo Apr 21, 2026
9afef04
refactor toolbar
hannessolo Apr 21, 2026
23722ef
fix scroll
hannessolo Apr 21, 2026
9221248
add link editing support
hannessolo Apr 21, 2026
4df3143
refactor toolbar into web component
hannessolo Apr 21, 2026
efd8abb
update qe
hannessolo Apr 21, 2026
bfc91be
fix: resolve popover positioning issues (#367)
sharanyavinod Apr 22, 2026
2edf9d3
support qe version select
hannessolo Apr 22, 2026
eebd3ee
refactor wrapper function
hannessolo Apr 22, 2026
2fe7ed1
add plugins from da
hannessolo Apr 22, 2026
ee50eb2
implement undo/redo
hannessolo Apr 22, 2026
dacaeb2
prevent selection of non-text nodes
hannessolo Apr 22, 2026
46bd022
fix table wrapping
hannessolo Apr 22, 2026
26769f5
refactor menu command structure
hannessolo Apr 22, 2026
9cf1874
pr feedback
hannessolo Apr 22, 2026
c326546
Merge branch 'ew-toolbar' into ew-plugins
hannessolo Apr 22, 2026
12f8081
remove magic number
hannessolo Apr 23, 2026
701e1e3
Merge branch 'ew-toolbar' into ew-plugins
hannessolo Apr 23, 2026
fcc3325
improve toolbar styling
hannessolo Apr 23, 2026
d7e993e
Merge pull request #380 from adobe/ew-toolbar
hannessolo Apr 23, 2026
ccf2f0f
Merge branch 'ew' into ew-plugins
hannessolo Apr 23, 2026
4873cd9
change select icon
hannessolo Apr 23, 2026
c944ac8
improve publish button
hannessolo Apr 23, 2026
f441292
icons
hannessolo Apr 23, 2026
59d3fa3
feat: Enhance browse UI by adding extra columns (#368)
kozmaadrian Apr 23, 2026
a31a35f
feat: chat prompt picker (#375)
sharanyavinod Apr 23, 2026
9bdf3be
feat: chat context pills (#382)
sharanyavinod Apr 23, 2026
3d9d079
boilerplate for right sid extensions
hannessolo Apr 23, 2026
b5941c2
pr feedback
hannessolo Apr 23, 2026
e3310a2
Merge pull request #385 from adobe/ew-plugins
hannessolo Apr 24, 2026
ef95a18
add split view
hannessolo Apr 24, 2026
f66e5f3
fix toolbar
hannessolo Apr 24, 2026
0a5e975
feat: setup tools panel (#387)
sharanyavinod Apr 24, 2026
b33ab3e
Merge branch 'ew' into ew-splitview
hannessolo Apr 24, 2026
cba397c
Merge pull request #388 from adobe/ew-splitview
hannessolo Apr 24, 2026
0c70a87
fix: avoid using fragment panels (#390)
sharanyavinod Apr 24, 2026
647a565
implement breadcrumbs in header
hannessolo Apr 24, 2026
a9f078c
Merge branch 'ew' into ew-lib
hannessolo Apr 24, 2026
060ae30
correctly show extensions
hannessolo Apr 24, 2026
ffce2f3
wire slash menu
hannessolo Apr 24, 2026
47068fb
remove large variant from breadcrumbs
hannessolo Apr 27, 2026
615be2e
Merge pull request #391 from adobe/ew-breadcrumb
hannessolo Apr 27, 2026
5708720
fix context after tool approval
hannessolo Apr 27, 2026
8b2c94c
Merge pull request #395 from adobe/ew-fix-collab
hannessolo Apr 27, 2026
11db705
Merge branch 'ew' into ew-lib
hannessolo Apr 28, 2026
c23d71d
restructure extensions
hannessolo Apr 28, 2026
8aff989
add sections
hannessolo Apr 28, 2026
180fd33
fix preview bug
hannessolo Apr 28, 2026
b3b5935
add external opener
hannessolo Apr 28, 2026
7bf0042
fix style loading
hannessolo Apr 28, 2026
2361076
missing files
hannessolo Apr 28, 2026
8556c02
restore focus after preview
hannessolo Apr 29, 2026
103fef5
dont cache failed responses in da config
hannessolo Apr 29, 2026
d6f0a94
Merge pull request #396 from adobe/ew-lib
hannessolo Apr 29, 2026
67792c2
feat: outline panel (#404)
sharanyavinod Apr 29, 2026
ba4c3af
hotfix da colorscheme
hannessolo Apr 30, 2026
6bfb041
Merge branch 'main' into ew-shell
hannessolo Apr 30, 2026
0dd67c4
fix ims selector not loading
hannessolo May 5, 2026
a85aaba
feat: move in outline (#414)
sharanyavinod May 5, 2026
e1228e6
feat: file explorer (#416)
sharanyavinod May 5, 2026
9c7c36e
feat: open media files from browse (#418)
sharanyavinod May 5, 2026
81cfd8b
move ew files to da-live
hannessolo May 6, 2026
2d160b7
update worklog
hannessolo May 6, 2026
981ad01
restore ew actions, remove migrated files
hannessolo May 7, 2026
f471d86
feat: add to chat (#424)
sharanyavinod May 7, 2026
de31d76
change style of publish button
hannessolo May 7, 2026
011257d
export getstyle
hannessolo May 7, 2026
8a99662
feat: chat skills via slash menu (#425)
sharanyavinod May 7, 2026
f44359b
Merge remote-tracking branch 'origin/main' into ew-shell
hannessolo May 8, 2026
dff0ff2
move chat back to shell
hannessolo May 8, 2026
4a604e9
Merge remote-tracking branch 'origin/main' into ew-shell
hannessolo May 8, 2026
d580c0d
cleanup
hannessolo May 8, 2026
ce951ff
Merge branch 'main' into ew-shell
hannessolo May 11, 2026
37c835d
fix currentcolor
hannessolo May 11, 2026
b160e47
Merge ew into ew-shell: chat slash menu, file explorer, outline drag,…
hannessolo May 11, 2026
49fbd4b
Remove app-side files incorrectly added by ew merge
hannessolo May 11, 2026
7baf551
fix stripping index
hannessolo May 11, 2026
c8d1058
remove script
hannessolo May 11, 2026
7fac03e
remove ims unnecessary code
hannessolo May 11, 2026
fefb5f6
fix: browse scroll (#434)
sharanyavinod May 11, 2026
b41ef18
Merge branch 'ew' into ew-shell
hannessolo May 11, 2026
5e2ddfc
feat: reusable dialog + toast (#439)
sharanyavinod May 15, 2026
1f6002b
fix chat icons
hannessolo May 12, 2026
5371f56
switch icon loading method
hannessolo May 18, 2026
e39cf29
further clean up icons
hannessolo May 18, 2026
aca3644
remove hash controller
hannessolo May 18, 2026
4b1c92d
Merge remote-tracking branch 'origin/main' into ew-shell
hannessolo May 18, 2026
5e4f39a
remove md file
hannessolo May 18, 2026
938ed31
feat(nx2): add provider support to loadBlock
anfibiacreativa May 19, 2026
c200c6b
feat(chat): link Manage Skills/Prompts to the skills app
anfibiacreativa May 19, 2026
41ef2c6
fix(nx2): load provider blocks from /blocks instead of /apps
anfibiacreativa May 19, 2026
612cdbe
Merge branch 'main' into ew-shell
hannessolo May 20, 2026
936145d
remove style file
hannessolo May 20, 2026
4f37637
set nx initialized flag
hannessolo May 20, 2026
ffdd484
fix(ew): address PR review + merge ew-shell
anfibiacreativa May 20, 2026
6b00cec
Merge pull request #446 from adobe/ew-provider-support-v2
anfibiacreativa May 20, 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
6 changes: 6 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Nexter (da-nx)

A shell/framework for Adobe AEM Edge Delivery Services. Provides shared blocks, styles, scripts, and utilities consumed by Adobe sites like da.live.

## Decisions & rationale
Expand Down Expand Up @@ -49,6 +50,11 @@ A shell/framework for Adobe AEM Edge Delivery Services. Provides shared blocks,
- Functions and styles in the public SDK cannot be broken in any way, they must always maintain backwards compatibility or provide an in-place upgrade of existing functionality.
- Any commits to `/nx/public` must be intentional as they may be used in the wild.

## Reuse before building

- Before implementing a utility, parser, or helper, check whether an equivalent already exists in the codebase — search both `nx/` and `nx2/`. Common examples: markdown parsing (`nx/deps/mdast`), IMS auth (`nx2/utils/ims.js`), hash routing (`nx2/utils/utils.js`).
- Also check `package.json` dependencies before reaching for a third-party package. The project already bundles remark, unified, mdast utilities, Lit, CodeMirror, and others that can be reused rather than re-implemented.

## JavaScript conventions not enforced by lint

- As a project purposefully avoiding TypeScript and build tools, be mindful of how variables and properties are named. If you see `somethingUrl`, this should be a proper URL object. If you see `href` this would imply a string that has all parts of a url: origin, pathname, search, hash, etc. but is not an actual URL object.
Expand Down
214 changes: 213 additions & 1 deletion WORKLOG.md

Large diffs are not rendered by default.

88 changes: 88 additions & 0 deletions docs/canvas-events.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Canvas Events

Communication within the canvas block uses two mechanisms: **DOM CustomEvents** for component-tree-local signalling, and **observables** for cross-cutting concerns that span component boundaries.

---

## Observable signals

Observables represent **core editor interactions** — the signals that any panel or block may need to participate in, now or in the future. They are the designed extension points for new panels and blocks: a panel added months later can subscribe immediately on connect and participate in the same interactions as everything built today, with no wiring changes required elsewhere.

This is the key difference from DOM CustomEvents: events require a DOM ancestor relationship to be in place at the time of wiring. Observables have no such constraint — subscribers connect asynchronously, in any order, from any location in the tree.

Use an observable when the signal is a **change notification** that unrelated components need to react to. Use the **extensions bridge** (`editor-utils/extensions-bridge.js`) when a panel wants to imperatively modify the editor — block insert, move, delete. The bridge gives synchronous view access; `editorHtmlChange` then propagates the result to any observer. Do not create a new observable for editor commands.

They live in `editor-utils/document.js` and follow a consistent shape:

```js
const myObservable = (() => {
const listeners = new Set();
return {
emit(value) { listeners.forEach((fn) => fn(value)); },
subscribe(fn) {
listeners.add(fn);
return () => listeners.delete(fn); // call the return value to unsubscribe
},
};
})();
```

### Two variants — choose deliberately

**State observable** — fires the last-known value immediately on subscribe, then on every subsequent change. Use when a subscriber needs the current value at mount time (e.g. a panel that opens after the document is already loaded).

**Event observable** — fires only going forward; no replay on subscribe. Use when the signal is a momentary occurrence with no meaningful "current value" (e.g. a selection change or a user action).

Getting this wrong causes bugs: a state observable replaying stale data on mount, or an event observable leaving a late subscriber with no initial state.

### Before adding a new observable

Check the registry below. If the data you need is already emitted, subscribe to the existing observable — don't introduce a parallel channel for the same information. If you do need a new one, add it to `editor-utils/document.js` and register it here.

### Registry

| Name | Variant | Description |
|---|---|---|
| `editorHtmlChange` | State | Serialised AEM HTML of the active document; rebuilds on every structural change |
| `editorSelectChange` | Event | Active block/section selection; emitted by any participant, consumed by all others |

---

### `editorHtmlChange`

```js
import { editorHtmlChange } from '../editor-utils/document.js';
const unsub = editorHtmlChange.subscribe((aemHtml) => { … });
```

Emits the full serialised AEM HTML of the active document after every structural change. Subscribers receive the last-known value immediately on subscribe. Used by `nx-page-outline` to rebuild the block tree.

### `editorSelectChange`

```js
import { editorSelectChange } from '../editor-utils/document.js';
const unsub = editorSelectChange.subscribe(({ blockIndex, source, blockName, proseIndex, innerText }) => { … });
```

Emits whenever the active block/section selection changes — from the canvas (cursor move) or from a panel (e.g. outline click). Does not replay on subscribe. Every participant both emits and subscribes; use `source` to skip your own echoes and prevent feedback loops.

`document.js` automatically enriches events with block metadata derived from the current `editorHtmlChange` state. Consumers that only need `blockIndex` and `source` are unaffected.

| Field | Type | Description |
|---|---|---|
| `blockIndex` | `number` | Zero-based index across all blocks in the document (`-1` = no specific block) |
| `source` | `string` | Emitter identity — `'wysiwyg'`, `'outline'`, or `'doc'` |
| `blockName` | `string \| undefined` | Block class name (e.g. `'hero'`); absent when no matching block is found |
| `proseIndex` | `number \| undefined` | ProseMirror position of the block's first editable node |
| `innerText` | `string \| undefined` | Plain-text content of the block at selection time |
| `explicit` | `boolean \| undefined` | `true` when the selection was a deliberate block selection (NodeSelection); `false`/absent for cursor-driven TextSelection. Currently set only by `source: 'doc'` |

#### Known gap — chat context requires explicit block selection

The canvas chat bridge only adds context when `source === 'doc'` and `explicit === true` — meaning the user clicked the block select handle in the doc editor, producing a `NodeSelection`.

Two cases are intentionally excluded:

- **Cursor movement in doc** (`source: 'doc'`, `explicit: false`): cursor crossing a block boundary by typing or keyboard navigation does not update chat context, only the outline highlight. Chat context is only replaced by a new explicit selection — this mirrors the editor's own visual behaviour, where `NodeSelection` persists until another explicit selection is made.
- **wysiwyg entirely** (`source: 'wysiwyg'`): the WYSIWYG editor has no block-select handle equivalent, so all wysiwyg events are excluded. If a block-selection affordance is added to wysiwyg in the future, it should emit `explicit: true` to opt in.

Loading
Loading