Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
8294d84
docs(spec): plan the frappe-ui beta.25 -> beta.45 upgrade
NagariaHussain Aug 11, 2026
f177792
chore(deps): upgrade frappe-ui to 1.0.0-beta.45
NagariaHussain Aug 11, 2026
1584482
refactor(tokens): move radius aliases to the numbered scale
NagariaHussain Aug 11, 2026
765f74e
refactor(tokens): shift the chromatic ink scales one level
NagariaHussain Aug 11, 2026
217c840
fix(ui): migrate the silent component API breaks in frappe-ui 1.0.0
NagariaHussain Aug 11, 2026
2138bd8
test(e2e): update the reorder-label selector for the numbered radius
NagariaHussain Aug 11, 2026
f2fcc62
docs(spec): reconcile the upgrade spec with what landed
NagariaHussain Aug 11, 2026
9f57c88
fix(og): carry the oklch token values frappe-ui now emits
NagariaHussain Aug 12, 2026
cccc993
fix(editor): stop the callout markdown round-trip from growing
NagariaHussain Aug 12, 2026
5b54bb6
fix(ui): name icons the way v1 does, so they render again
NagariaHussain Aug 12, 2026
4b9f0dd
fix(sidebar): drop the wrapper padding SidebarHeader now supplies
NagariaHussain Aug 12, 2026
777966d
refactor(theme): hand the flash-free swap to frappe-ui
NagariaHussain Aug 12, 2026
5ff0267
fix(tabs): apply the panel's display only while it is active
NagariaHussain Aug 12, 2026
85bfc5c
style(tabs): use the subtle pill track on change requests
NagariaHussain Aug 13, 2026
3c45a1c
fix(tree): render the Unpublish icon, and guard the whole class
NagariaHussain Aug 13, 2026
2d643ab
chore(deps): upgrade frappe-ui to 1.0.0-beta.55
NagariaHussain Aug 26, 2026
0862de8
style(shell): drop the rounded card around the content column
NagariaHussain Aug 26, 2026
aafd1ea
refactor(lists): follow the frappe-ui list recipe
NagariaHussain Aug 26, 2026
46270f5
feat(spaces): show each space as a feed row with its page count
NagariaHussain Aug 26, 2026
abdbfd6
feat(spaces): add a published filter, a result tally, and a narrower …
NagariaHussain Aug 26, 2026
96ea77b
refactor(spaces): scroll the list through a pane-wide ScrollArea
NagariaHussain Aug 26, 2026
2dfc31c
docs(callouts): spec the container node + Alert-parity restyle
NagariaHussain Aug 27, 2026
015c148
feat(git-sync): accept an arbitrary branch name, checked on create
NagariaHussain Aug 27, 2026
9970048
feat(spaces): add last-updated and open change requests to the list
NagariaHussain Aug 27, 2026
8bdc45e
feat(callouts): make the callout a container node
NagariaHussain Aug 27, 2026
41dc191
refactor(spaces): return the list rows to the feed recipe
NagariaHussain Aug 27, 2026
19ce9ee
docs(callouts): log phase 1 in the spec
NagariaHussain Aug 27, 2026
fe6f104
feat(callouts): edit the title in place, and give the body real exits
NagariaHussain Aug 27, 2026
a392bed
fix(dev): stop pre-bundling frappe-ui so vite dev starts
NagariaHussain Aug 27, 2026
9631c12
style(callouts): match frappe-ui's Alert in the editor
NagariaHussain Aug 27, 2026
01a03e3
style(callouts): match Alert on the public page and in print
NagariaHussain Aug 27, 2026
9faf42b
test(callouts): cover the published page, and log the remaining phases
NagariaHussain Aug 27, 2026
001d79c
fix(callouts): make the title a real value, not a placeholder
NagariaHussain Aug 27, 2026
d50c45b
style(callouts): align the body with the title, not the container
NagariaHussain Aug 27, 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
491 changes: 374 additions & 117 deletions e2e/tests/callout-rich-text.spec.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion e2e/tests/change-request-flow.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,7 @@ test.describe('Change Request Flow', () => {
await page.waitForLoadState('networkidle');

const changeCard = page
.locator('div.border.border-outline-gray-2.rounded-lg.overflow-hidden')
.locator('div.border.border-outline-gray-2.rounded-6.overflow-hidden')
.filter({ has: page.getByText(movedTitle, { exact: true }) })
.first();
await expect(
Expand Down
65 changes: 54 additions & 11 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,20 @@
"dependencies": {
"@floating-ui/dom": "^1.6.0",
"@pierre/diffs": "^1.2.11",
"@tiptap/core": "^3.26.0",
"@tiptap/extension-image": "^3.26.0",
"@tiptap/extension-list": "^3.26.0",
"@tiptap/extension-table": "^3.26.0",
"@tiptap/extensions": "^3.26.0",
"@tiptap/markdown": "^3.26.0",
"@tiptap/pm": "^3.26.0",
"@tiptap/starter-kit": "^3.26.0",
"@tiptap/suggestion": "^3.26.0",
"@tiptap/vue-3": "^3.26.0",
"@tiptap/core": "^3.29.2",
"@tiptap/extension-image": "^3.29.2",
"@tiptap/extension-list": "^3.29.2",
"@tiptap/extension-table": "^3.29.2",
"@tiptap/extensions": "^3.29.2",
"@tiptap/markdown": "^3.29.2",
"@tiptap/pm": "^3.29.2",
"@tiptap/starter-kit": "^3.29.2",
"@tiptap/suggestion": "^3.29.2",
"@tiptap/vue-3": "^3.29.2",
"@vueuse/core": "^14.1.0",
"@vueuse/integrations": "^14.3.0",
"@vueuse/router": "^14.2.1",
"frappe-ui": "1.0.0-beta.25",
"frappe-ui": "1.0.0-beta.55",
"fuzzysort": "^3.1.0",
"highlight.js": "~11.11.0",
"idb-keyval": "^6.2.0",
Expand All @@ -49,6 +49,49 @@
"vite": "^5.4.10"
},
"resolutions": {
"@tiptap/core": "3.29.2",
"@tiptap/extension-blockquote": "3.29.2",
"@tiptap/extension-bold": "3.29.2",
"@tiptap/extension-bubble-menu": "3.29.2",
"@tiptap/extension-bullet-list": "3.29.2",
"@tiptap/extension-code": "3.29.2",
"@tiptap/extension-code-block": "3.29.2",
"@tiptap/extension-code-block-lowlight": "3.29.2",
"@tiptap/extension-color": "3.29.2",
"@tiptap/extension-document": "3.29.2",
"@tiptap/extension-dropcursor": "3.29.2",
"@tiptap/extension-floating-menu": "3.29.2",
"@tiptap/extension-gapcursor": "3.29.2",
"@tiptap/extension-hard-break": "3.29.2",
"@tiptap/extension-heading": "3.29.2",
"@tiptap/extension-highlight": "3.29.2",
"@tiptap/extension-horizontal-rule": "3.29.2",
"@tiptap/extension-image": "3.29.2",
"@tiptap/extension-italic": "3.29.2",
"@tiptap/extension-link": "3.29.2",
"@tiptap/extension-list": "3.29.2",
"@tiptap/extension-list-item": "3.29.2",
"@tiptap/extension-list-keymap": "3.29.2",
"@tiptap/extension-mention": "3.29.2",
"@tiptap/extension-node-range": "3.29.2",
"@tiptap/extension-ordered-list": "3.29.2",
"@tiptap/extension-paragraph": "3.29.2",
"@tiptap/extension-placeholder": "3.29.2",
"@tiptap/extension-strike": "3.29.2",
"@tiptap/extension-table": "3.29.2",
"@tiptap/extension-task-item": "3.29.2",
"@tiptap/extension-task-list": "3.29.2",
"@tiptap/extension-text": "3.29.2",
"@tiptap/extension-text-align": "3.29.2",
"@tiptap/extension-text-style": "3.29.2",
"@tiptap/extension-typography": "3.29.2",
"@tiptap/extension-underline": "3.29.2",
"@tiptap/extensions": "3.29.2",
"@tiptap/markdown": "3.29.2",
"@tiptap/pm": "3.29.2",
"@tiptap/starter-kit": "3.29.2",
"@tiptap/suggestion": "3.29.2",
"@tiptap/vue-3": "3.29.2",
"shiki": "^3.23.0",
"@shikijs/themes": "^3.23.0",
"prosemirror-model": "^1.25.9",
Expand Down
3 changes: 3 additions & 0 deletions frontend/src/.tokens-v2-ink-shift
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
The ink scale shift (tokens-v2 --ink-shift, #1016) ran here on 2026-08-11T09:28:35.436Z.
A second run would double-shift every chromatic ink token.
Delete this file only to re-run the shift on purpose.
7 changes: 3 additions & 4 deletions frontend/src/components/AssignDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@
<p class="text-ink-gray-7">
{{ __('Assign this change request to a reviewer. They will be notified and it will appear in their "Assigned to me" list.') }}
</p>
<Autocomplete
<MultiSelect
v-model="selected"
:options="userOptions"
:placeholder="__('Search people...')"
multiple
/>
</div>
</template>
Expand All @@ -34,9 +33,9 @@

<script setup>
import {
Autocomplete,
Button,
Dialog,
MultiSelect,
createListResource,
createResource,
toast,
Expand Down Expand Up @@ -77,7 +76,7 @@ const assignResource = createResource({
});

async function handleAssign(close) {
const assignTo = selected.value.map((o) => o.value || o);
const assignTo = selected.value;
if (!assignTo.length) return;
try {
await assignResource.submit({
Expand Down
41 changes: 37 additions & 4 deletions frontend/src/components/Autocomplete.vue
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
- local (default): filters `options` client-side as the user types.
- remote (`remote`): leaves filtering to the parent — emits `search` (debounced)
and `load-more` (on scroll) so the parent can page a server-side list.

`allow-custom` lets the typed text stand as the value when it matches no
option (branch names the picker can't list), committed on Enter or on leaving
the field.
-->
<template>
<div class="flex flex-col gap-1" ref="root">
Expand All @@ -23,11 +27,12 @@
:placeholder="placeholder"
:disabled="disabled"
autocomplete="off"
class="form-input w-full rounded bg-surface-gray-2 pr-8 text-base text-ink-gray-8 disabled:cursor-not-allowed disabled:opacity-60"
class="form-input w-full rounded-4 bg-surface-gray-2 pr-8 text-base text-ink-gray-8 disabled:cursor-not-allowed disabled:opacity-60"
@focus="open"
@input="onInput"
@keydown.down.prevent="move(1)"
@keydown.up.prevent="move(-1)"
@blur="onBlur"
@keydown.enter.prevent="selectHighlighted"
@keydown.esc.prevent="close"
/>
Expand All @@ -43,7 +48,7 @@
<div
v-if="isOpen"
ref="list"
class="fixed z-[9999] max-h-56 overflow-auto rounded border border-outline-gray-2 bg-surface-base py-1 shadow-lg"
class="fixed z-[9999] max-h-56 overflow-auto rounded-4 border border-outline-gray-2 bg-surface-base py-1 shadow-lg"
:style="menuStyle"
@scroll="onScroll"
@pointerdown.stop
Expand Down Expand Up @@ -97,6 +102,8 @@ const props = defineProps({
hasMore: { type: Boolean, default: false },
// remote: parent owns filtering (server-side search + paging).
remote: { type: Boolean, default: false },
// allowCustom: a typed value that matches no option is kept as-is.
allowCustom: { type: Boolean, default: false },
});

const emit = defineEmits(['update:modelValue', 'search', 'load-more']);
Expand Down Expand Up @@ -159,6 +166,23 @@ function close() {
query.value = '';
}

// Keep what the user typed when it matches no option. Runs on Enter and on
// leaving the field, so clicking straight through to a dialog action still
// commits the branch name.
function commitCustom() {
if (!props.allowCustom) return;
const typed = query.value.trim();
if (typed && typed !== props.modelValue) {
emit('update:modelValue', typed);
}
}

function onBlur() {
if (!isOpen.value) return;
commitCustom();
close();
}

let searchTimer = null;
function onInput(event) {
query.value = event.target.value;
Expand Down Expand Up @@ -189,7 +213,13 @@ function move(delta) {

function selectHighlighted() {
const opt = displayedOptions.value[highlighted.value];
if (opt) select(opt);
if (opt) {
select(opt);
return;
}
commitCustom();
close();
input.value?.blur();
}

function onScroll() {
Expand All @@ -201,7 +231,10 @@ function onScroll() {
}

function onClickOutside(event) {
if (root.value && !root.value.contains(event.target)) close();
if (root.value && !root.value.contains(event.target)) {
commitCustom();
close();
}
}
document.addEventListener('mousedown', onClickOutside);
// Capture phase so scrolling *inside* the dialog body (not just the window)
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/CollapsibleSection.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<template>
<div class="rounded-lg border border-outline-gray-2 bg-surface-gray-1">
<div class="rounded-6 border border-outline-gray-2 bg-surface-gray-1">
<button
type="button"
class="flex w-full items-center justify-between gap-2 p-3 text-left"
Expand Down
24 changes: 12 additions & 12 deletions frontend/src/components/ContributionBanner.vue
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<template #meta>
<span
v-if="reviewFeedback"
class="truncate text-xs text-ink-red-8 min-w-0"
class="truncate text-xs text-ink-red-7 min-w-0"
:title="reviewFeedback"
>
{{ reviewFeedback }}
Expand Down Expand Up @@ -77,7 +77,7 @@
</template>

<template v-else-if="changeRequestStatus === 'Approved'">
<span class="text-sm-medium text-ink-green-7">
<span class="text-sm-medium text-ink-green-6">
{{ __('Approved! Ready to merge.') }}
</span>
<Button
Expand Down Expand Up @@ -114,7 +114,7 @@
<div
v-for="change in crStore.changes"
:key="change.doc_key"
class="flex items-start gap-3 p-3 rounded-lg border border-outline-gray-2 hover:bg-surface-gray-1"
class="flex items-start gap-3 p-3 rounded-6 border border-outline-gray-2 hover:bg-surface-gray-1"
>
<div
class="flex items-center justify-center size-8 rounded-full shrink-0"
Expand Down Expand Up @@ -263,7 +263,7 @@ const syncStateTheme = computed(() => {
return 'red';
}
if (draftStore.hasPendingMutations || draftStore.sync.status === 'saving') {
return 'orange';
return 'amber';
}
if (draftStore.hasUnsavedEditorContent) {
return 'gray';
Expand Down Expand Up @@ -320,7 +320,7 @@ const props = defineProps({

const STATUS_BADGE_THEME = {
Draft: 'gray',
'In Review': 'orange',
'In Review': 'amber',
'Changes Requested': 'red',
Approved: 'green',
Merged: 'green',
Expand Down Expand Up @@ -401,7 +401,7 @@ const menuOptions = computed(() => {
if (crStore.changeCount > 0) {
options.push({
label: __('View changes ({0})', [crStore.changeCount]),
icon: 'list',
icon: 'lucide-list',
onClick: () => {
showChangesDialog.value = true;
},
Expand All @@ -410,7 +410,7 @@ const menuOptions = computed(() => {
if (canShowArchive.value) {
options.push({
label: __('Discard Changes'),
icon: 'archive',
icon: 'lucide-archive',
onClick: () => emit('withdraw'),
});
}
Expand All @@ -426,33 +426,33 @@ const BANNER_CONFIG = {
},
'In Review': {
class:
'bg-surface-amber-2 border-b border-outline-amber-2 text-ink-amber-8',
'bg-surface-amber-2 border-b border-outline-amber-2 text-ink-amber-7',
icon: 'lucide-clock',
title: __('In Review'),
description: __('Your change request is being reviewed'),
},
'Changes Requested': {
class: 'bg-surface-red-2 border-b border-outline-red-2 text-ink-red-8',
class: 'bg-surface-red-2 border-b border-outline-red-2 text-ink-red-7',
icon: 'lucide-x-circle',
title: __('Changes Requested'),
description: __('Please review the feedback and update your changes'),
},
Approved: {
class:
'bg-surface-green-2 border-b border-outline-green-2 text-ink-green-8',
'bg-surface-green-2 border-b border-outline-green-2 text-ink-green-7',
icon: 'lucide-check-circle',
title: __('Approved'),
description: __('Approved and ready to merge'),
},
Merged: {
class:
'bg-surface-green-2 border-b border-outline-green-2 text-ink-green-8',
'bg-surface-green-2 border-b border-outline-green-2 text-ink-green-7',
icon: 'lucide-check-circle',
title: __('Merged'),
description: __('Your changes have been merged'),
},
Rejected: {
class: 'bg-surface-red-2 border-b border-outline-red-2 text-ink-red-8',
class: 'bg-surface-red-2 border-b border-outline-red-2 text-ink-red-7',
icon: 'lucide-x-circle',
title: __('Rejected'),
description: __('This change request was rejected and will not be merged'),
Expand Down
Loading
Loading