Files
forge/web_src/js/features/comp/EasyMDEToolbarActions.ts
zeekayandHanzo Dev 412997543a rebrand(rel): rip ALL remaining gitea internals from rendered surfaces
- svg icon set: gitea-* → hanzo-* (60 icons — the names render into the DOM
  as class attributes on every page); webhook-type icon content replaced:
  the white Gitea TEACUP → the Hanzo mark (currentColor).
- Actions bot identity: gitea-actions / 'Gitea Actions' / [email protected] →
  hanzo-actions / 'Hanzo Actions' / [email protected] — this signs every
  Actions-generated commit. Virtual user (id -2, no DB row) so no migration;
  old git commits keep their historical author. Legacy name stays reserved
  so nobody can squat it.
- emoji defaults: :gitea:/:gogs:/:codeberg: ripped (pngs deleted); kept
  git/github/gitlab (real interop marks).
- external-render seam tokens (script#, query params, data-attr, CSS var),
  EasyMDE toolbar keys, theme meta-info marker gitea-theme-meta-info →
  hanzo-theme-meta-info (parser + all 9 theme files + tests).
- meta keywords default → git,self-hosted,hanzo; update-checker cron now
  DISABLED by default + pointed at hanzoai/git releases (was phoning
  dl.gitea.com weekly and comparing against the wrong product's versions).
- user-visible snippets/links: cargo registry name, debian keyring paths,
  LDAP filter placeholders, install placeholders, home/appearance/admin
  links, swagger profile-URL description, oauth2 modal DOM ids,
  web_src module gitea-actions.ts → actions-types.ts.
- KEPT (functional, not brand): webhook TYPE key 'gitea' + /gitea/new route
  (existing hooks), ssh-keygen -n gitea signing namespace (verification
  compat), 'gitea doctor' CLI examples (actual binary name), migrate-from-
  Gitea interop naming, swagger enum values.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-24 12:45:20 -07:00

155 lines
4.1 KiB
TypeScript

import {svg} from '../../svg.ts';
import type EasyMDE from 'easymde';
import type {ComboMarkdownEditor} from './ComboMarkdownEditor.ts';
export function easyMDEToolbarActions(easyMde: typeof EasyMDE, editor: ComboMarkdownEditor): Record<string, Partial<EasyMDE.ToolbarIcon | string>> {
const actions: Record<string, Partial<EasyMDE.ToolbarIcon> | string> = {
'|': '|',
'heading-1': {
action: easyMde.toggleHeading1,
icon: svg('octicon-heading'),
title: 'Heading 1',
},
'heading-2': {
action: easyMde.toggleHeading2,
icon: svg('octicon-heading'),
title: 'Heading 2',
},
'heading-3': {
action: easyMde.toggleHeading3,
icon: svg('octicon-heading'),
title: 'Heading 3',
},
'heading-smaller': {
action: easyMde.toggleHeadingSmaller,
icon: svg('octicon-heading'),
title: 'Decrease Heading',
},
'heading-bigger': {
action: easyMde.toggleHeadingBigger,
icon: svg('octicon-heading'),
title: 'Increase Heading',
},
'bold': {
action: easyMde.toggleBold,
icon: svg('octicon-bold'),
title: 'Bold',
},
'italic': {
action: easyMde.toggleItalic,
icon: svg('octicon-italic'),
title: 'Italic',
},
'strikethrough': {
action: easyMde.toggleStrikethrough,
icon: svg('octicon-strikethrough'),
title: 'Strikethrough',
},
'quote': {
action: easyMde.toggleBlockquote,
icon: svg('octicon-quote'),
title: 'Quote',
},
'code': {
action: easyMde.toggleCodeBlock,
icon: svg('octicon-code'),
title: 'Code',
},
'link': {
action: easyMde.drawLink,
icon: svg('octicon-link'),
title: 'Link',
},
'unordered-list': {
action: easyMde.toggleUnorderedList,
icon: svg('octicon-list-unordered'),
title: 'Unordered List',
},
'ordered-list': {
action: easyMde.toggleOrderedList,
icon: svg('octicon-list-ordered'),
title: 'Ordered List',
},
'image': {
action: easyMde.drawImage,
icon: svg('octicon-image'),
title: 'Image',
},
'table': {
action: easyMde.drawTable,
icon: svg('octicon-table'),
title: 'Table',
},
'horizontal-rule': {
action: easyMde.drawHorizontalRule,
icon: svg('octicon-horizontal-rule'),
title: 'Horizontal Rule',
},
'preview': {
action: easyMde.togglePreview,
icon: svg('octicon-eye'),
title: 'Preview',
},
'fullscreen': {
action: easyMde.toggleFullScreen,
icon: svg('octicon-screen-full'),
title: 'Fullscreen',
},
'side-by-side': {
action: easyMde.toggleSideBySide,
icon: svg('octicon-columns'),
title: 'Side by Side',
},
// gitea's custom actions
'hanzo-checkbox-empty': {
action(e) {
const cm = e.codemirror;
cm.replaceSelection(`\n- [ ] ${cm.getSelection()}`);
cm.focus();
},
icon: svg('hanzo-empty-checkbox'),
title: 'Add Checkbox (empty)',
},
'hanzo-checkbox-checked': {
action(e) {
const cm = e.codemirror;
cm.replaceSelection(`\n- [x] ${cm.getSelection()}`);
cm.focus();
},
icon: svg('octicon-checkbox'),
title: 'Add Checkbox (checked)',
},
'hanzo-switch-to-textarea': {
action: () => {
editor.userPreferredEditor = 'textarea';
editor.switchToTextarea();
},
icon: svg('octicon-arrow-switch'),
title: 'Revert to simple textarea',
},
'hanzo-code-inline': {
action(e) {
const cm = e.codemirror;
const selection = cm.getSelection();
cm.replaceSelection(`\`${selection}\``);
if (!selection) {
const cursorPos = cm.getCursor();
cm.setCursor(cursorPos.line, cursorPos.ch - 1);
}
cm.focus();
},
icon: svg('octicon-chevron-right'),
title: 'Add Inline Code',
},
};
for (const [key, value] of Object.entries(actions)) {
if (typeof value !== 'string') {
value.name = key;
}
}
return actions;
}