@openleaf-editor/ui 0.1.0-beta.1 → 0.1.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +85 -0
  2. package/dist/block-type.d.ts +5 -0
  3. package/dist/block-type.d.ts.map +1 -0
  4. package/dist/block-type.js +133 -0
  5. package/dist/block-type.js.map +1 -0
  6. package/dist/content-css.d.ts +31 -0
  7. package/dist/content-css.d.ts.map +1 -0
  8. package/dist/content-css.js +272 -0
  9. package/dist/content-css.js.map +1 -0
  10. package/dist/css.d.ts +23 -0
  11. package/dist/css.d.ts.map +1 -0
  12. package/dist/css.js +813 -0
  13. package/dist/css.js.map +1 -0
  14. package/dist/dialog.d.ts +158 -18
  15. package/dist/dialog.d.ts.map +1 -1
  16. package/dist/dialog.js +605 -130
  17. package/dist/dialog.js.map +1 -1
  18. package/dist/floating.d.ts +29 -0
  19. package/dist/floating.d.ts.map +1 -0
  20. package/dist/floating.js +130 -0
  21. package/dist/floating.js.map +1 -0
  22. package/dist/help.d.ts +9 -0
  23. package/dist/help.d.ts.map +1 -0
  24. package/dist/help.js +97 -0
  25. package/dist/help.js.map +1 -0
  26. package/dist/i18n.d.ts +39 -0
  27. package/dist/i18n.d.ts.map +1 -0
  28. package/dist/i18n.js +114 -0
  29. package/dist/i18n.js.map +1 -0
  30. package/dist/icons.d.ts +7 -1
  31. package/dist/icons.d.ts.map +1 -1
  32. package/dist/icons.js +10 -2
  33. package/dist/icons.js.map +1 -1
  34. package/dist/index.d.ts +15 -7
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +14 -6
  37. package/dist/index.js.map +1 -1
  38. package/dist/items.d.ts +2 -1
  39. package/dist/items.d.ts.map +1 -1
  40. package/dist/items.js +263 -17
  41. package/dist/items.js.map +1 -1
  42. package/dist/live.d.ts +42 -0
  43. package/dist/live.d.ts.map +1 -0
  44. package/dist/live.js +83 -0
  45. package/dist/live.js.map +1 -0
  46. package/dist/menu.d.ts +85 -0
  47. package/dist/menu.d.ts.map +1 -0
  48. package/dist/menu.js +500 -0
  49. package/dist/menu.js.map +1 -0
  50. package/dist/openleaf.css +325 -7
  51. package/dist/overflow.d.ts +44 -0
  52. package/dist/overflow.d.ts.map +1 -0
  53. package/dist/overflow.js +323 -0
  54. package/dist/overflow.js.map +1 -0
  55. package/dist/pickers.d.ts +43 -0
  56. package/dist/pickers.d.ts.map +1 -0
  57. package/dist/pickers.js +52 -0
  58. package/dist/pickers.js.map +1 -0
  59. package/dist/registry.d.ts +72 -18
  60. package/dist/registry.d.ts.map +1 -1
  61. package/dist/registry.js +7 -6
  62. package/dist/registry.js.map +1 -1
  63. package/dist/skins.d.ts.map +1 -1
  64. package/dist/skins.js +48 -14
  65. package/dist/skins.js.map +1 -1
  66. package/dist/styles.d.ts +61 -1
  67. package/dist/styles.d.ts.map +1 -1
  68. package/dist/styles.js +77 -421
  69. package/dist/styles.js.map +1 -1
  70. package/dist/testing.d.ts +3 -0
  71. package/dist/testing.d.ts.map +1 -0
  72. package/dist/testing.js +3 -0
  73. package/dist/testing.js.map +1 -0
  74. package/dist/toolbar.d.ts +91 -12
  75. package/dist/toolbar.d.ts.map +1 -1
  76. package/dist/toolbar.js +459 -127
  77. package/dist/toolbar.js.map +1 -1
  78. package/dist/upload.d.ts +11 -0
  79. package/dist/upload.d.ts.map +1 -1
  80. package/dist/upload.js +15 -1
  81. package/dist/upload.js.map +1 -1
  82. package/package.json +17 -3
package/dist/index.d.ts CHANGED
@@ -1,9 +1,17 @@
1
- export { Toolbar, type ToolbarOptions } from './toolbar.js';
2
- export { DEFAULT_LAYOUT, LAYOUT_WITH_COLOUR, allToolbarItems, clearToolbarItems, getToolbarItem, onRegistryChange, registerToolbarItem, type ToolbarContext, type ToolbarControl, type ToolbarItemSpec, } from './registry.js';
3
- export { SOURCE_TOGGLE_EVENT, registerDefaultItems } from './items.js';
4
- export { CSS, ensureStyles, markStylesExternal, registerStyles } from './styles.js';
5
- export { ensureSprite, iconElement, iconNames, registerIcons, type IconName } from './icons.js';
6
- export { promptForImage, promptForLink, type ImagePromptOptions, type ImageResult, type LinkResult, } from './dialog.js';
7
- export { IMAGE_ACCEPT, canUploadImages, imageFilesFrom, imageUploaderFor, isUploadableImage, registerImageUploader, runUploader, type ImageUploadResult, type ImageUploader, } from './upload.js';
1
+ export { Toolbar, type ToolbarHandle, type ToolbarOptions } from './toolbar.js';
2
+ export { DEFAULT_LAYOUT, LAYOUT_WITH_COLOUR, allToolbarItems, getToolbarItem, onRegistryChange, registerToolbarItem, type ToolbarContext, type ToolbarControl, type ToolbarItemSpec, type ToolbarSelectOption, } from './registry.js';
3
+ export { SOURCE_TOGGLE_EVENT, FULLSCREEN_TOGGLE_EVENT, VISUAL_AIDS_TOGGLE_EVENT, registerDefaultItems } from './items.js';
4
+ export { t, fill, setUiLocale, uiLocale, registerTranslations, onLocaleChange, withLocale, } from './i18n.js';
5
+ export { MenuBar, PopupMenu, DEFAULT_MENUBAR, selectMenus, LINK_CONTEXT_ITEMS, IMAGE_CONTEXT_ITEMS, TABLE_CONTEXT_ITEMS, type MenuSpec, type MenuEntry, type MenuItemRef, } from './menu.js';
6
+ export { announce, disposeLiveRegion, liveRegion } from './live.js';
7
+ export { promptHelp } from './help.js';
8
+ export { FloatingToolbars, DEFAULT_SELECTION_LAYOUT, DEFAULT_INSERT_LAYOUT, } from './floating.js';
9
+ export { loadContentCss, contentCssUrls, scopeContentCss } from './content-css.js';
10
+ export { CSS } from './css.js';
11
+ export { ensureStyles, markStylesExternal, registerStyles } from './styles.js';
12
+ export { DIRECTIONAL, ensureSprite, iconElement, iconNames, registerIcons, type IconName, } from './icons.js';
13
+ export { promptFields, promptForImage, promptForLink, promptForMedia, type FieldOption, type FieldSpec, type ImagePromptOptions, type ImageResult, type LinkResult, type MediaPromptOptions, type MediaResult, type MediaSourceResult, type PromptFormOptions, } from './dialog.js';
14
+ export { filePickerFor, listedImageClasses, listedImages, listedLinks, registerFilePicker, registerImageClasses, registerImageList, registerLinkList, type FilePicker, type FilePickerKind, type ListedResource, type PickedResource, } from './pickers.js';
15
+ export { IMAGE_ACCEPT, canUploadImages, imageFilesFrom, imageUploaderFor, isUploadableImage, isUploadableImageType, registerImageUploader, runUploader, type ImageUploadResult, type ImageUploader, } from './upload.js';
8
16
  export { BUILT_IN_SKINS, applyColourScheme, applySkin, availableSkins, ensureSkins, registerSkin, type ColourScheme, type Skin, } from './skins.js';
9
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC/F,OAAO,EACL,cAAc,EACd,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,WAAW,EACX,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,IAAI,GACV,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAC/E,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACzH,OAAO,EACL,CAAC,EACD,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,cAAc,EACd,UAAU,GACX,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,QAAQ,EACb,KAAK,SAAS,EAGd,KAAK,WAAW,GACjB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,EACL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,SAAS,EACT,aAAa,EACb,KAAK,QAAQ,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,WAAW,EACX,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,IAAI,GACV,MAAM,YAAY,CAAA"}
package/dist/index.js CHANGED
@@ -1,9 +1,17 @@
1
1
  export { Toolbar } from './toolbar.js';
2
- export { DEFAULT_LAYOUT, LAYOUT_WITH_COLOUR, allToolbarItems, clearToolbarItems, getToolbarItem, onRegistryChange, registerToolbarItem, } from './registry.js';
3
- export { SOURCE_TOGGLE_EVENT, registerDefaultItems } from './items.js';
4
- export { CSS, ensureStyles, markStylesExternal, registerStyles } from './styles.js';
5
- export { ensureSprite, iconElement, iconNames, registerIcons } from './icons.js';
6
- export { promptForImage, promptForLink, } from './dialog.js';
7
- export { IMAGE_ACCEPT, canUploadImages, imageFilesFrom, imageUploaderFor, isUploadableImage, registerImageUploader, runUploader, } from './upload.js';
2
+ export { DEFAULT_LAYOUT, LAYOUT_WITH_COLOUR, allToolbarItems, getToolbarItem, onRegistryChange, registerToolbarItem, } from './registry.js';
3
+ export { SOURCE_TOGGLE_EVENT, FULLSCREEN_TOGGLE_EVENT, VISUAL_AIDS_TOGGLE_EVENT, registerDefaultItems } from './items.js';
4
+ export { t, fill, setUiLocale, uiLocale, registerTranslations, onLocaleChange, withLocale, } from './i18n.js';
5
+ export { MenuBar, PopupMenu, DEFAULT_MENUBAR, selectMenus, LINK_CONTEXT_ITEMS, IMAGE_CONTEXT_ITEMS, TABLE_CONTEXT_ITEMS, } from './menu.js';
6
+ export { announce, disposeLiveRegion, liveRegion } from './live.js';
7
+ export { promptHelp } from './help.js';
8
+ export { FloatingToolbars, DEFAULT_SELECTION_LAYOUT, DEFAULT_INSERT_LAYOUT, } from './floating.js';
9
+ export { loadContentCss, contentCssUrls, scopeContentCss } from './content-css.js';
10
+ export { CSS } from './css.js';
11
+ export { ensureStyles, markStylesExternal, registerStyles } from './styles.js';
12
+ export { DIRECTIONAL, ensureSprite, iconElement, iconNames, registerIcons, } from './icons.js';
13
+ export { promptFields, promptForImage, promptForLink, promptForMedia, } from './dialog.js';
14
+ export { filePickerFor, listedImageClasses, listedImages, listedLinks, registerFilePicker, registerImageClasses, registerImageList, registerLinkList, } from './pickers.js';
15
+ export { IMAGE_ACCEPT, canUploadImages, imageFilesFrom, imageUploaderFor, isUploadableImage, isUploadableImageType, registerImageUploader, runUploader, } from './upload.js';
8
16
  export { BUILT_IN_SKINS, applyColourScheme, applySkin, availableSkins, ensureSkins, registerSkin, } from './skins.js';
9
17
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAA;AAC3D,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GAIpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAA;AAC/F,OAAO,EACL,cAAc,EACd,aAAa,GAId,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,GAGZ,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,WAAW,EACX,YAAY,GAGb,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2C,MAAM,cAAc,CAAA;AAC/E,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GAKpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACzH,OAAO,EACL,CAAC,EACD,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,cAAc,EACd,UAAU,GACX,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GAMpB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,EACL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,SAAS,EACT,aAAa,GAEd,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,GAUf,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GAKjB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,GAGZ,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,WAAW,EACX,YAAY,GAGb,MAAM,YAAY,CAAA"}
package/dist/items.d.ts CHANGED
@@ -8,6 +8,7 @@
8
8
  */
9
9
  /** Event the host listens for to switch between rich and source views. */
10
10
  export declare const SOURCE_TOGGLE_EVENT = "openleaf:toggle-source";
11
- /** Register the built-in items. Idempotent. */
11
+ export declare const FULLSCREEN_TOGGLE_EVENT = "openleaf:toggle-fullscreen";
12
+ export declare const VISUAL_AIDS_TOGGLE_EVENT = "openleaf:toggle-visual-aids";
12
13
  export declare function registerDefaultItems(): void;
13
14
  //# sourceMappingURL=items.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../src/items.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA+BH,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,2BAA2B,CAAA;AAI3D,+CAA+C;AAC/C,wBAAgB,oBAAoB,IAAI,IAAI,CA+O3C"}
1
+ {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../src/items.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgDH,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,2BAA2B,CAAA;AAC3D,eAAO,MAAM,uBAAuB,+BAA+B,CAAA;AACnE,eAAO,MAAM,wBAAwB,gCAAgC,CAAA;AAmFrE,wBAAgB,oBAAoB,IAAI,IAAI,CAyZ3C"}
package/dist/items.js CHANGED
@@ -6,18 +6,112 @@
6
6
  * document, that knowledge belongs in `@openleaf-editor/core` where a keyboard
7
7
  * shortcut and a test can reach it too.
8
8
  */
9
- import { activeLink, activeTextAlign, insertHorizontalRule, insertImage, isMarkActive, isNodeActive, redo, setLink, toggleBlockquote, toggleBold, toggleBulletList, toggleCodeBlock, toggleInlineCode, toggleItalic, toggleOrderedList, toggleStrike, toggleTextAlign, toggleUnderline, undo, unsetLink, } from '@openleaf-editor/core';
9
+ import { activeFontFamily, activeFontSize, activeLineHeight, activeLink, FONT_FAMILIES, FONT_SIZE_PRESETS, indent, insertHorizontalRule, insertImage, isMarkActive, isNodeActive, LINE_HEIGHT_PRESETS, outdent, redo, safeFontFamily, selectedImage, setFontFamily, setFontSize, setLineHeight, setLink, toggleBlockquote, toggleBold, toggleBulletList, toggleCodeBlock, toggleInlineCode, toggleItalic, toggleOrderedList, toggleStrike, toggleTextAlign, toggleUnderline, undo, unsetLink, updateImage, } from '@openleaf-editor/core';
10
+ import { TextSelection } from 'prosemirror-state';
10
11
  import { promptForImage, promptForLink } from './dialog.js';
11
- import { registerToolbarItem } from './registry.js';
12
+ import { promptHelp } from './help.js';
13
+ import { getToolbarItem, registerToolbarItem } from './registry.js';
12
14
  import { imageUploaderFor, runUploader } from './upload.js';
15
+ import { blockTypeControl } from './block-type.js';
13
16
  /** Event the host listens for to switch between rich and source views. */
14
17
  export const SOURCE_TOGGLE_EVENT = 'openleaf:toggle-source';
15
- let registered = false;
18
+ export const FULLSCREEN_TOGGLE_EVENT = 'openleaf:toggle-fullscreen';
19
+ export const VISUAL_AIDS_TOGGLE_EVENT = 'openleaf:toggle-visual-aids';
20
+ const alignCache = new WeakMap();
21
+ /**
22
+ * One selection walk per state, shared by every alignment button on every bar.
23
+ *
24
+ * Each of the four buttons used to answer `isEnabled` by dry-running its own
25
+ * command, and `toggleTextAlign` walks the selection twice on its own -- twelve
26
+ * identical walks of every selected block, per transaction, per toolbar. With
27
+ * two bars and two floating bars over a Select-All on a hundred-page document
28
+ * that was ~48,000 wasted node visits inside `dispatchTransaction`.
29
+ *
30
+ * Keyed on the state, so the second, third and fourth toolbar reading the same
31
+ * transaction pay nothing. Membership is "carries an align attribute", exactly
32
+ * as core decides it, so a plugin block that opts in still works.
33
+ */
34
+ function alignFacts(state) {
35
+ const hit = alignCache.get(state);
36
+ if (hit)
37
+ return hit;
38
+ let any = false;
39
+ let mixed = false;
40
+ let align = null;
41
+ const { from, to } = state.selection;
42
+ state.doc.nodesBetween(from, to, (node) => {
43
+ if (!node.isTextblock)
44
+ return true;
45
+ if (Object.hasOwn(node.attrs, 'align')) {
46
+ const value = node.attrs['align'] ?? null;
47
+ if (!any) {
48
+ any = true;
49
+ align = value;
50
+ }
51
+ else if (value !== align) {
52
+ // Mixed reports null, like core: showing the first block's value as the
53
+ // state of all of them is a lie the author acts on.
54
+ mixed = true;
55
+ }
56
+ }
57
+ return false;
58
+ });
59
+ const facts = { any, align: mixed ? null : align };
60
+ alignCache.set(state, facts);
61
+ return facts;
62
+ }
16
63
  /** Register the built-in items. Idempotent. */
64
+ /**
65
+ * The span of the link the caret sits in, or null when it is not in one.
66
+ *
67
+ * `setLink` and `unsetLink` both refuse an empty selection, which is right --
68
+ * there is nothing to mark. But an author who right-clicks a link, or puts the
69
+ * caret in one and presses the toolbar button, means "this link", and the range
70
+ * of a mark is something only the document can answer.
71
+ */
72
+ function linkRange(state) {
73
+ const type = state.schema.marks['link'];
74
+ if (!type || !state.selection.empty)
75
+ return null;
76
+ const $pos = state.selection.$from;
77
+ const mark = type.isInSet($pos.marks());
78
+ if (!mark)
79
+ return null;
80
+ const parent = $pos.parent;
81
+ let start = $pos.index();
82
+ let end = $pos.indexAfter();
83
+ while (start > 0 && mark.isInSet(parent.child(start - 1).marks))
84
+ start -= 1;
85
+ while (end < parent.childCount && mark.isInSet(parent.child(end).marks))
86
+ end += 1;
87
+ let from = $pos.start();
88
+ for (let i = 0; i < start; i += 1)
89
+ from += parent.child(i).nodeSize;
90
+ let to = from;
91
+ for (let i = start; i < end; i += 1)
92
+ to += parent.child(i).nodeSize;
93
+ return { from, to };
94
+ }
95
+ /** Widen a caret inside a link to cover the whole link, so a command can act. */
96
+ function selectLink(view) {
97
+ const range = linkRange(view.state);
98
+ if (!range)
99
+ return;
100
+ view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, range.from, range.to)));
101
+ }
17
102
  export function registerDefaultItems() {
18
- if (registered)
103
+ if (getToolbarItem('undo') && getToolbarItem('blockType') && getToolbarItem('source'))
19
104
  return;
20
- registered = true;
105
+ registerToolbarItem({
106
+ id: 'blockType',
107
+ // `custom`, not `select`: it builds its own DOM because it carries formats
108
+ // the host injects at mount time. `type: 'select'` is the declarative
109
+ // contract for a fixed preset list, which this is not.
110
+ type: 'custom',
111
+ kind: 'action',
112
+ label: 'Paragraph style',
113
+ render: ({ view, host, formats }) => blockTypeControl(view, host, formats ?? []),
114
+ });
21
115
  registerToolbarItem({
22
116
  id: 'undo',
23
117
  type: 'button',
@@ -67,6 +161,49 @@ export function registerDefaultItems() {
67
161
  shortcut: item.label,
68
162
  });
69
163
  }
164
+ /* ---- typography ----
165
+ Preset selects over core's font / size / line-height commands. The schema
166
+ already models these so inherited HTML stays editable; these controls are
167
+ the chrome that was missing from the default bar. */
168
+ registerToolbarItem({
169
+ id: 'fontFamily',
170
+ type: 'select',
171
+ label: 'Font family',
172
+ selectMod: 'wide',
173
+ options: [
174
+ { value: '', label: 'Default' },
175
+ // Option values are the validated spelling the schema stores (quoted when
176
+ // the name has a space), so getValue can match them after a round-trip.
177
+ ...FONT_FAMILIES.map((family) => ({
178
+ value: safeFontFamily(family) ?? family,
179
+ label: family,
180
+ })),
181
+ ],
182
+ getValue: (state) => activeFontFamily(state) ?? '',
183
+ applyValue: (value) => setFontFamily(value === '' ? null : value),
184
+ });
185
+ registerToolbarItem({
186
+ id: 'fontSize',
187
+ type: 'select',
188
+ label: 'Font size',
189
+ options: [
190
+ { value: '', label: 'Default' },
191
+ ...FONT_SIZE_PRESETS.map((px) => ({ value: `${px}px`, label: String(px) })),
192
+ ],
193
+ getValue: (state) => activeFontSize(state) ?? '',
194
+ applyValue: (value) => setFontSize(value === '' ? null : value),
195
+ });
196
+ registerToolbarItem({
197
+ id: 'lineHeight',
198
+ type: 'select',
199
+ label: 'Line height',
200
+ options: [
201
+ { value: '', label: 'Default' },
202
+ ...LINE_HEIGHT_PRESETS.map((value) => ({ value, label: value })),
203
+ ],
204
+ getValue: (state) => activeLineHeight(state) ?? '',
205
+ applyValue: (value) => setLineHeight(value === '' ? null : value),
206
+ });
70
207
  /* ---- block structure ----
71
208
  These get toggle semantics too. A blockquote or a list is a state the
72
209
  cursor is either in or not, exactly like bold, and leaving them as plain
@@ -132,10 +269,32 @@ export function registerDefaultItems() {
132
269
  label: item.label,
133
270
  icon: item.icon,
134
271
  command: toggleTextAlign(item.align),
135
- isActive: (state) => activeTextAlign(state) === item.align,
272
+ // Both predicates come off one cached walk. Without the explicit
273
+ // isEnabled the toolbar dry-runs `command`, and toggleTextAlign walks the
274
+ // selection twice on its own -- see alignFacts.
275
+ isEnabled: (state) => alignFacts(state).any,
276
+ isActive: (state) => alignFacts(state).align === item.align,
136
277
  shortcut: item.label,
137
278
  });
138
279
  }
280
+ registerToolbarItem({
281
+ id: 'indent',
282
+ type: 'button',
283
+ kind: 'action',
284
+ label: 'Indent',
285
+ icon: 'indent',
286
+ command: indent,
287
+ shortcut: 'Indent',
288
+ });
289
+ registerToolbarItem({
290
+ id: 'outdent',
291
+ type: 'button',
292
+ kind: 'action',
293
+ label: 'Outdent',
294
+ icon: 'outdent',
295
+ command: outdent,
296
+ shortcut: 'Outdent',
297
+ });
139
298
  /* ---- insertions ---- */
140
299
  registerToolbarItem({
141
300
  id: 'link',
@@ -143,16 +302,27 @@ export function registerDefaultItems() {
143
302
  kind: 'toggle',
144
303
  label: 'Link',
145
304
  icon: 'link',
146
- // Enabled only with a selection: a link needs text to attach to, and
147
- // silently doing nothing on an empty caret is worse than being disabled.
148
- isEnabled: (state) => !state.selection.empty,
305
+ // A selection to attach the link to, or a caret already inside one. Those
306
+ // two used to disagree: `isActive` said "in a link" while `isEnabled` said
307
+ // "there is a selection", so right-clicking a link -- which places a
308
+ // COLLAPSED caret -- rendered a control that was aria-pressed and
309
+ // aria-disabled at once and refused the click. The context menu built for
310
+ // exactly that gesture could therefore never edit a link, and the "Edit
311
+ // link" dialog title was unreachable.
312
+ isEnabled: (state) => !state.selection.empty || linkRange(state) !== null,
149
313
  isActive: (state) => activeLink(state) !== null,
150
314
  run: ({ view, host }) => {
315
+ selectLink(view);
151
316
  const existing = activeLink(view.state);
317
+ // All five modelled attrs: dropping `rel`/`id` here is how Save used to
318
+ // wipe them even when the author changed nothing (#108).
152
319
  void promptForLink(host.ownerDocument, {
153
320
  href: existing?.['href'] ?? '',
321
+ title: existing?.['title'] ?? null,
154
322
  target: existing?.['target'] ?? null,
155
- }).then((result) => {
323
+ rel: existing?.['rel'] ?? null,
324
+ id: existing?.['id'] ?? null,
325
+ }, host).then((result) => {
156
326
  if (!result) {
157
327
  view.focus();
158
328
  return;
@@ -168,7 +338,12 @@ export function registerDefaultItems() {
168
338
  kind: 'action',
169
339
  label: 'Remove link',
170
340
  icon: 'unlink',
171
- command: unsetLink,
341
+ isEnabled: (state) => unsetLink(state) || linkRange(state) !== null,
342
+ run: ({ view }) => {
343
+ selectLink(view);
344
+ unsetLink(view.state, view.dispatch, view);
345
+ view.focus();
346
+ },
172
347
  });
173
348
  registerToolbarItem({
174
349
  id: 'image',
@@ -176,25 +351,64 @@ export function registerDefaultItems() {
176
351
  kind: 'action',
177
352
  label: 'Insert image',
178
353
  icon: 'image',
354
+ // Insert and edit are the same control, as they are for media: a separate
355
+ // "image properties" item is one the author has to discover, and without
356
+ // it there is no way to revise alt text after insert.
357
+ labelFor: (state) => (selectedImage(state) ? 'Edit image' : 'Insert image'),
179
358
  run: ({ view, host }) => {
180
359
  // One item, two dialogs, decided by whether this page can upload. A file
181
360
  // picker that appears and then fails because no uploader was registered is
182
361
  // worse than no picker: the author has already chosen the file.
183
362
  const uploader = imageUploaderFor(host);
184
- const options = uploader
185
- ? { upload: (file) => runUploader(uploader, file, host) }
186
- : {};
363
+ const current = selectedImage(view.state);
364
+ const options = {
365
+ host,
366
+ ...(uploader ? { upload: (file) => runUploader(uploader, file, host) } : {}),
367
+ ...(current
368
+ ? {
369
+ existing: {
370
+ src: current.src,
371
+ alt: current.alt,
372
+ title: current.title,
373
+ className: current.className,
374
+ align: current.align,
375
+ caption: current.caption,
376
+ width: current.width,
377
+ height: current.height,
378
+ },
379
+ }
380
+ : {}),
381
+ };
187
382
  void promptForImage(host.ownerDocument, options).then((result) => {
188
383
  if (!result) {
189
384
  view.focus();
190
385
  return;
191
386
  }
192
- insertImage({
387
+ const attrs = {
193
388
  src: result.src,
194
389
  alt: result.alt,
390
+ title: result.title,
195
391
  width: result.width,
196
392
  height: result.height,
197
- })(view.state, view.dispatch, view);
393
+ align: result.align,
394
+ className: result.className,
395
+ caption: result.caption,
396
+ };
397
+ if (current) {
398
+ updateImage(attrs)(view.state, view.dispatch, view);
399
+ }
400
+ else {
401
+ insertImage({
402
+ src: result.src,
403
+ alt: result.alt,
404
+ title: result.title,
405
+ width: result.width,
406
+ height: result.height,
407
+ align: result.align,
408
+ className: result.className,
409
+ ...(result.caption ? { caption: result.caption } : {}),
410
+ })(view.state, view.dispatch, view);
411
+ }
198
412
  view.focus();
199
413
  });
200
414
  },
@@ -220,7 +434,39 @@ export function registerDefaultItems() {
220
434
  // that escape hatch exists.
221
435
  isActive: () => false,
222
436
  run: ({ host }) => {
223
- host.dispatchEvent(new CustomEvent(SOURCE_TOGGLE_EVENT, { bubbles: true }));
437
+ host.dispatchEvent(new CustomEvent(SOURCE_TOGGLE_EVENT, { bubbles: true, composed: true }));
438
+ },
439
+ });
440
+ registerToolbarItem({
441
+ id: 'fullscreen',
442
+ type: 'button',
443
+ kind: 'toggle',
444
+ label: 'Fullscreen',
445
+ icon: 'fullscreen',
446
+ isActive: () => false,
447
+ run: ({ host }) => {
448
+ host.dispatchEvent(new CustomEvent(FULLSCREEN_TOGGLE_EVENT, { bubbles: true, composed: true }));
449
+ },
450
+ });
451
+ registerToolbarItem({
452
+ id: 'visualAids',
453
+ type: 'button',
454
+ kind: 'toggle',
455
+ label: 'Visual aids',
456
+ icon: 'visualAids',
457
+ isActive: () => false,
458
+ run: ({ host }) => {
459
+ host.dispatchEvent(new CustomEvent(VISUAL_AIDS_TOGGLE_EVENT, { bubbles: true, composed: true }));
460
+ },
461
+ });
462
+ registerToolbarItem({
463
+ id: 'help',
464
+ type: 'button',
465
+ kind: 'action',
466
+ label: 'Help',
467
+ icon: 'help',
468
+ run: ({ host }) => {
469
+ promptHelp(host.ownerDocument, host);
224
470
  },
225
471
  });
226
472
  }
package/dist/items.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"items.js","sourceRoot":"","sources":["../src/items.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,IAAI,EACJ,SAAS,GAEV,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE3D,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAwB,CAAA;AAE3D,IAAI,UAAU,GAAG,KAAK,CAAA;AAEtB,+CAA+C;AAC/C,MAAM,UAAU,oBAAoB;IAClC,IAAI,UAAU;QAAE,OAAM;IACtB,UAAU,GAAG,IAAI,CAAA;IAEjB,mBAAmB,CAAC;QAClB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAA;IAaF,MAAM,SAAS,GAAe;QAC5B,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE;QAChF,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE;QACpF;YACE,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,eAAe;SACzB;QACD;YACE,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,YAAY;SACtB;QACD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE;KAC5F,CAAA;IAED,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,mBAAmB,CAAC;YAClB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;YACnD,QAAQ,EAAE,IAAI,CAAC,KAAK;SACrB,CAAC,CAAA;IACJ,CAAC;IAED;;;;yDAIqD;IAErD,mBAAmB,CAAC;QAClB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC;QACvD,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,iBAAiB;QAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC;QACxD,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC;QACtD,QAAQ,EAAE,YAAY;KACvB,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC;QACtD,QAAQ,EAAE,YAAY;KACvB,CAAC,CAAA;IAEF;;;;;+DAK2D;IAE3D,MAAM,UAAU,GAAuE;QACrF,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1E,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;QAClF,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE;QAC9E,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE;KACjF,CAAA;IAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,mBAAmB,CAAC;YAClB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;YACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK;YAC1D,QAAQ,EAAE,IAAI,CAAC,KAAK;SACrB,CAAC,CAAA;IACJ,CAAC;IAED,0BAA0B;IAE1B,mBAAmB,CAAC;QAClB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,qEAAqE;QACrE,yEAAyE;QACzE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK;QAC5C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI;QAC/C,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;YACtB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACvC,KAAK,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE;gBACrC,IAAI,EAAG,QAAQ,EAAE,CAAC,MAAM,CAAwB,IAAI,EAAE;gBACtD,MAAM,EAAG,QAAQ,EAAE,CAAC,QAAQ,CAAwB,IAAI,IAAI;aAC7D,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,KAAK,EAAE,CAAA;oBACZ,OAAM;gBACR,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAChD,IAAI,CAAC,KAAK,EAAE,CAAA;YACd,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,SAAS;KACnB,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;YACtB,yEAAyE;YACzE,2EAA2E;YAC3E,gEAAgE;YAChE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;YACvC,MAAM,OAAO,GAAG,QAAQ;gBACtB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;gBAC/D,CAAC,CAAC,EAAE,CAAA;YAEN,KAAK,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,KAAK,EAAE,CAAA;oBACZ,OAAM;gBACR,CAAC;gBACD,WAAW,CAAC;oBACV,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;iBACtB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBACnC,IAAI,CAAC,KAAK,EAAE,CAAA;YACd,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,oBAAoB;QAC7B,QAAQ,EAAE,iBAAiB;KAC5B,CAAC,CAAA;IAEF,oBAAoB;IAEpB,mBAAmB,CAAC;QAClB,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,QAAQ;QACd,4EAA4E;QAC5E,0EAA0E;QAC1E,4BAA4B;QAC5B,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QACrB,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAChB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC7E,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"items.js","sourceRoot":"","sources":["../src/items.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,MAAM,EACN,oBAAoB,EACpB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,OAAO,EACP,IAAI,EACJ,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,OAAO,EACP,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,IAAI,EACJ,SAAS,EACT,WAAW,GAEZ,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAwB,CAAA;AAC3D,MAAM,CAAC,MAAM,uBAAuB,GAAG,4BAA4B,CAAA;AACnE,MAAM,CAAC,MAAM,wBAAwB,GAAG,6BAA6B,CAAA;AAKrE,MAAM,UAAU,GAAG,IAAI,OAAO,EAA2B,CAAA;AAEzD;;;;;;;;;;;;GAYG;AACH,SAAS,UAAU,CAAC,KAAkB;IACpC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACjC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAA;IACnB,IAAI,GAAG,GAAG,KAAK,CAAA;IACf,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,IAAI,KAAK,GAAiB,IAAI,CAAA;IAC9B,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,CAAA;IACpC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QACxC,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAA;QAClC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,KAAK,GAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,IAAI,IAAI,CAAA;YAC3D,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,GAAG,IAAI,CAAA;gBACV,KAAK,GAAG,KAAK,CAAA;YACf,CAAC;iBAAM,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC3B,wEAAwE;gBACxE,oDAAoD;gBACpD,KAAK,GAAG,IAAI,CAAA;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;IACF,MAAM,KAAK,GAAe,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAA;IAC9D,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC5B,OAAO,KAAK,CAAA;AACd,CAAC;AAED,+CAA+C;AAC/C;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,KAAkB;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACvC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAA;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;IACxB,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;IAC3B,OAAO,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,KAAK,IAAI,CAAC,CAAA;IAC3E,OAAO,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAAE,GAAG,IAAI,CAAC,CAAA;IACjF,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC;QAAE,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IACnE,IAAI,EAAE,GAAG,IAAI,CAAA;IACb,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;QAAE,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IACnE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AACrB,CAAC;AAED,iFAAiF;AACjF,SAAS,UAAU,CAAC,IAAgB;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnC,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,IAAI,CAAC,QAAQ,CACX,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CACvF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,WAAW,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC;QAAE,OAAM;IAE7F,mBAAmB,CAAC;QAClB,EAAE,EAAE,WAAW;QACf,2EAA2E;QAC3E,sEAAsE;QACtE,uDAAuD;QACvD,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;KACjF,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAA;IAaF,MAAM,SAAS,GAAe;QAC5B,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE;QAChF,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE;QACpF;YACE,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,eAAe;SACzB;QACD;YACE,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,YAAY;SACtB;QACD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE;KAC5F,CAAA;IAED,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,mBAAmB,CAAC;YAClB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;YACnD,QAAQ,EAAE,IAAI,CAAC,KAAK;SACrB,CAAC,CAAA;IACJ,CAAC;IAED;;;2DAGuD;IAEvD,mBAAmB,CAAC;QAClB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;YAC/B,0EAA0E;YAC1E,wEAAwE;YACxE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAChC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,MAAM;gBACvC,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;SACJ;QACD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE;QAClD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;KAClE,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;YAC/B,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SAC5E;QACD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE;QAChD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;KAChE,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;YAC/B,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SACjE;QACD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE;QAClD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;KAClE,CAAC,CAAA;IAEF;;;;yDAIqD;IAErD,mBAAmB,CAAC;QAClB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC;QACvD,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,iBAAiB;QAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC;QACxD,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC;QACtD,QAAQ,EAAE,YAAY;KACvB,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC;QACtD,QAAQ,EAAE,YAAY;KACvB,CAAC,CAAA;IAEF;;;;;+DAK2D;IAE3D,MAAM,UAAU,GAAuE;QACrF,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1E,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;QAClF,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE;QAC9E,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE;KACjF,CAAA;IAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,mBAAmB,CAAC;YAClB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;YACpC,iEAAiE;YACjE,0EAA0E;YAC1E,gDAAgD;YAChD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG;YAC3C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;YAC3D,QAAQ,EAAE,IAAI,CAAC,KAAK;SACrB,CAAC,CAAA;IACJ,CAAC;IAED,mBAAmB,CAAC;QAClB,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,QAAQ;KACnB,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,SAAS;KACpB,CAAC,CAAA;IAEF,0BAA0B;IAE1B,mBAAmB,CAAC;QAClB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,0EAA0E;QAC1E,2EAA2E;QAC3E,qEAAqE;QACrE,kEAAkE;QAClE,0EAA0E;QAC1E,wEAAwE;QACxE,sCAAsC;QACtC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI;QACzE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI;QAC/C,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;YACtB,UAAU,CAAC,IAAI,CAAC,CAAA;YAChB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACvC,wEAAwE;YACxE,yDAAyD;YACzD,KAAK,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE;gBACrC,IAAI,EAAG,QAAQ,EAAE,CAAC,MAAM,CAAwB,IAAI,EAAE;gBACtD,KAAK,EAAG,QAAQ,EAAE,CAAC,OAAO,CAAwB,IAAI,IAAI;gBAC1D,MAAM,EAAG,QAAQ,EAAE,CAAC,QAAQ,CAAwB,IAAI,IAAI;gBAC5D,GAAG,EAAG,QAAQ,EAAE,CAAC,KAAK,CAAwB,IAAI,IAAI;gBACtD,EAAE,EAAG,QAAQ,EAAE,CAAC,IAAI,CAAwB,IAAI,IAAI;aACrD,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACvB,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,KAAK,EAAE,CAAA;oBACZ,OAAM;gBACR,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAChD,IAAI,CAAC,KAAK,EAAE,CAAA;YACd,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI;QACnE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAChB,UAAU,CAAC,IAAI,CAAC,CAAA;YAChB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;KACF,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,OAAO;QACb,0EAA0E;QAC1E,yEAAyE;QACzE,sDAAsD;QACtD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;QAC3E,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;YACtB,yEAAyE;YACzE,2EAA2E;YAC3E,gEAAgE;YAChE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;YACvC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACzC,MAAM,OAAO,GAAG;gBACd,IAAI;gBACJ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClF,GAAG,CAAC,OAAO;oBACT,CAAC,CAAC;wBACE,QAAQ,EAAE;4BACR,GAAG,EAAE,OAAO,CAAC,GAAG;4BAChB,GAAG,EAAE,OAAO,CAAC,GAAG;4BAChB,KAAK,EAAE,OAAO,CAAC,KAAK;4BACpB,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;4BACpB,OAAO,EAAE,OAAO,CAAC,OAAO;4BACxB,KAAK,EAAE,OAAO,CAAC,KAAK;4BACpB,MAAM,EAAE,OAAO,CAAC,MAAM;yBACvB;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAA;YAED,KAAK,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,KAAK,EAAE,CAAA;oBACZ,OAAM;gBACR,CAAC;gBACD,MAAM,KAAK,GAAG;oBACZ,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;iBACxB,CAAA;gBACD,IAAI,OAAO,EAAE,CAAC;oBACZ,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBACrD,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC;wBACV,GAAG,EAAE,MAAM,CAAC,GAAG;wBACf,GAAG,EAAE,MAAM,CAAC,GAAG;wBACf,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACvD,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBACrC,CAAC;gBACD,IAAI,CAAC,KAAK,EAAE,CAAA;YACd,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,oBAAoB;QAC7B,QAAQ,EAAE,iBAAiB;KAC5B,CAAC,CAAA;IAEF,oBAAoB;IAEpB,mBAAmB,CAAC;QAClB,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,QAAQ;QACd,4EAA4E;QAC5E,0EAA0E;QAC1E,4BAA4B;QAC5B,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QACrB,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAChB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC7F,CAAC;KACF,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QACrB,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAChB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACjG,CAAC;KACF,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QACrB,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAChB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAClG,CAAC;KACF,CAAC,CAAA;IAEF,mBAAmB,CAAC;QAClB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAChB,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QACtC,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
package/dist/live.d.ts ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The one live region an editor speaks through.
3
+ *
4
+ * Every announcement in the editor -- a formatting toggle, an import warning, a
5
+ * colour applied, a find result -- has to land in a node that is IN the document
6
+ * before the text changes. A region built and left detached is not a quiet
7
+ * region; it is a silent one, and nothing about the markup says so.
8
+ *
9
+ * That is exactly how the toolbar failed: each `Toolbar` built its own region and
10
+ * relied on the host to mount one of them, so a secondary or floating bar spoke
11
+ * into a detached `<div>` -- and `toolbar="none" toolbar2="bold italic"` mounted
12
+ * no region at all, leaving Ctrl+B completely silent.
13
+ *
14
+ * So the region belongs to the HOST, not to any one control. One per editor:
15
+ * two polite regions on one host race each other, and a screen reader reads
16
+ * whichever it noticed, in whichever order.
17
+ */
18
+ /** The host's live region, created and mounted on first use. */
19
+ export declare function liveRegion(host: HTMLElement): HTMLDivElement;
20
+ /**
21
+ * Say something to a screen reader.
22
+ *
23
+ * Cleared and then set on a timer, for two reasons that both matter: replacing a
24
+ * region's text with the identical string is not a change and is not announced,
25
+ * and the delay coalesces a held shortcut into one utterance instead of thirty.
26
+ */
27
+ export declare function announce(host: HTMLElement, message: string): void;
28
+ /**
29
+ * Remove a host's live region and cancel anything queued for it.
30
+ *
31
+ * The region is the host's, not any one toolbar's -- several bars share it --
32
+ * so no `Toolbar.destroy()` may take it away while another bar is still using
33
+ * it. It goes when the editor itself goes, and it has to go then: the element
34
+ * reads its own `innerHTML` back as document content when it rebuilds, so a
35
+ * region left behind becomes the author's document and is posted to the server.
36
+ *
37
+ * The pending timer is cleared as well. It holds a reference to the detached
38
+ * node and would write into it after teardown -- harmless, but it is a timer
39
+ * outliving the thing it was announcing for.
40
+ */
41
+ export declare function disposeLiveRegion(host: HTMLElement): void;
42
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,gEAAgE;AAChE,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,CAc5D;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAYjE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAOzD"}
package/dist/live.js ADDED
@@ -0,0 +1,83 @@
1
+ /**
2
+ * The one live region an editor speaks through.
3
+ *
4
+ * Every announcement in the editor -- a formatting toggle, an import warning, a
5
+ * colour applied, a find result -- has to land in a node that is IN the document
6
+ * before the text changes. A region built and left detached is not a quiet
7
+ * region; it is a silent one, and nothing about the markup says so.
8
+ *
9
+ * That is exactly how the toolbar failed: each `Toolbar` built its own region and
10
+ * relied on the host to mount one of them, so a secondary or floating bar spoke
11
+ * into a detached `<div>` -- and `toolbar="none" toolbar2="bold italic"` mounted
12
+ * no region at all, leaving Ctrl+B completely silent.
13
+ *
14
+ * So the region belongs to the HOST, not to any one control. One per editor:
15
+ * two polite regions on one host race each other, and a screen reader reads
16
+ * whichever it noticed, in whichever order.
17
+ */
18
+ /** Marks the host's own region, so a second call finds it rather than adding one. */
19
+ const REGION_CLASS = 'ol-live-region';
20
+ /**
21
+ * Pending announcements, keyed by host.
22
+ *
23
+ * Per host rather than per caller: two controls announcing in the same tick are
24
+ * two utterances a screen reader will queue and read one after the other, over
25
+ * the top of the author's typing. The last one is the one that matters.
26
+ */
27
+ const timers = new WeakMap();
28
+ /** The host's live region, created and mounted on first use. */
29
+ export function liveRegion(host) {
30
+ const existing = host.querySelector(`:scope > .${REGION_CLASS}`);
31
+ if (existing)
32
+ return existing;
33
+ const el = host.ownerDocument.createElement('div');
34
+ // `ol-live` is the visually-hidden rule; the second class is the marker.
35
+ el.className = `ol-live ${REGION_CLASS}`;
36
+ // Polite and atomic: an assertive region would interrupt the author mid-word,
37
+ // and a non-atomic one can read partial updates.
38
+ el.setAttribute('role', 'status');
39
+ el.setAttribute('aria-live', 'polite');
40
+ el.setAttribute('aria-atomic', 'true');
41
+ host.appendChild(el);
42
+ return el;
43
+ }
44
+ /**
45
+ * Say something to a screen reader.
46
+ *
47
+ * Cleared and then set on a timer, for two reasons that both matter: replacing a
48
+ * region's text with the identical string is not a change and is not announced,
49
+ * and the delay coalesces a held shortcut into one utterance instead of thirty.
50
+ */
51
+ export function announce(host, message) {
52
+ const el = liveRegion(host);
53
+ el.textContent = '';
54
+ const pending = timers.get(host);
55
+ if (pending !== undefined)
56
+ clearTimeout(pending);
57
+ timers.set(host, setTimeout(() => {
58
+ timers.delete(host);
59
+ el.textContent = message;
60
+ }, 60));
61
+ }
62
+ /**
63
+ * Remove a host's live region and cancel anything queued for it.
64
+ *
65
+ * The region is the host's, not any one toolbar's -- several bars share it --
66
+ * so no `Toolbar.destroy()` may take it away while another bar is still using
67
+ * it. It goes when the editor itself goes, and it has to go then: the element
68
+ * reads its own `innerHTML` back as document content when it rebuilds, so a
69
+ * region left behind becomes the author's document and is posted to the server.
70
+ *
71
+ * The pending timer is cleared as well. It holds a reference to the detached
72
+ * node and would write into it after teardown -- harmless, but it is a timer
73
+ * outliving the thing it was announcing for.
74
+ */
75
+ export function disposeLiveRegion(host) {
76
+ const pending = timers.get(host);
77
+ if (pending !== undefined) {
78
+ clearTimeout(pending);
79
+ timers.delete(host);
80
+ }
81
+ host.querySelector(`:scope > .${REGION_CLASS}`)?.remove();
82
+ }
83
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,qFAAqF;AACrF,MAAM,YAAY,GAAG,gBAAgB,CAAA;AAErC;;;;;;GAMG;AACH,MAAM,MAAM,GAAG,IAAI,OAAO,EAA8C,CAAA;AAExE,gEAAgE;AAChE,MAAM,UAAU,UAAU,CAAC,IAAiB;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAiB,aAAa,YAAY,EAAE,CAAC,CAAA;IAChF,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAClD,yEAAyE;IACzE,EAAE,CAAC,SAAS,GAAG,WAAW,YAAY,EAAE,CAAA;IACxC,8EAA8E;IAC9E,iDAAiD;IACjD,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACjC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IACtC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IACtC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IACpB,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAiB,EAAE,OAAe;IACzD,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC3B,EAAE,CAAC,WAAW,GAAG,EAAE,CAAA;IACnB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAChC,IAAI,OAAO,KAAK,SAAS;QAAE,YAAY,CAAC,OAAO,CAAC,CAAA;IAChD,MAAM,CAAC,GAAG,CACR,IAAI,EACJ,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACnB,EAAE,CAAC,WAAW,GAAG,OAAO,CAAA;IAC1B,CAAC,EAAE,EAAE,CAAC,CACP,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAChC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,YAAY,CAAC,OAAO,CAAC,CAAA;QACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,aAAa,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,CAAA;AAC3D,CAAC"}