@ablogcms/block-editor 3.2.28-beta.0

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 (267) hide show
  1. package/README.md +21 -0
  2. package/dist/chunk-4KUPYKHV.mjs +34 -0
  3. package/dist/chunk-4KUPYKHV.mjs.map +1 -0
  4. package/dist/chunk-57Q3DEDF.mjs +23 -0
  5. package/dist/chunk-57Q3DEDF.mjs.map +1 -0
  6. package/dist/chunk-DUT25D7Z.mjs +20 -0
  7. package/dist/chunk-DUT25D7Z.mjs.map +1 -0
  8. package/dist/chunk-EM5TLDPY.mjs +17 -0
  9. package/dist/chunk-EM5TLDPY.mjs.map +1 -0
  10. package/dist/chunk-GIHTGDIW.mjs +23 -0
  11. package/dist/chunk-GIHTGDIW.mjs.map +1 -0
  12. package/dist/chunk-HNSTT2Z4.mjs +87 -0
  13. package/dist/chunk-HNSTT2Z4.mjs.map +1 -0
  14. package/dist/chunk-JYUNKG2P.mjs +88 -0
  15. package/dist/chunk-JYUNKG2P.mjs.map +1 -0
  16. package/dist/chunk-OFWQRNO2.mjs +56 -0
  17. package/dist/chunk-OFWQRNO2.mjs.map +1 -0
  18. package/dist/chunk-OZG2BL6F.mjs +61 -0
  19. package/dist/chunk-OZG2BL6F.mjs.map +1 -0
  20. package/dist/chunk-S24TRRWW.mjs +3126 -0
  21. package/dist/chunk-S24TRRWW.mjs.map +1 -0
  22. package/dist/chunk-TKSGCO5Z.mjs +2813 -0
  23. package/dist/chunk-TKSGCO5Z.mjs.map +1 -0
  24. package/dist/chunk-XGAKMQH4.mjs +627 -0
  25. package/dist/chunk-XGAKMQH4.mjs.map +1 -0
  26. package/dist/components/BlockEditor/BlockEditor.d.ts +36 -0
  27. package/dist/components/BlockEditor/BlockEditor.mjs +19 -0
  28. package/dist/components/BlockEditor/BlockEditor.mjs.map +1 -0
  29. package/dist/components/BlockEditor/index.d.ts +1 -0
  30. package/dist/components/BlockEditor/types.d.ts +10 -0
  31. package/dist/components/menus/ContentItemMenu/ContentItemMenu.d.ts +10 -0
  32. package/dist/components/menus/ContentItemMenu/components/BlockMenus.d.ts +8 -0
  33. package/dist/components/menus/ContentItemMenu/components/IdEditor.d.ts +5 -0
  34. package/dist/components/menus/ContentItemMenu/hooks/useContentItemActions.d.ts +17 -0
  35. package/dist/components/menus/ContentItemMenu/hooks/useData.d.ts +13 -0
  36. package/dist/components/menus/ContentItemMenu/index.d.ts +1 -0
  37. package/dist/components/menus/LinkMenu/LinkMenu.d.ts +4 -0
  38. package/dist/components/menus/LinkMenu/index.d.ts +1 -0
  39. package/dist/components/menus/TextMenu/TextMenu.d.ts +6 -0
  40. package/dist/components/menus/TextMenu/components/ContentTypePicker.d.ts +8 -0
  41. package/dist/components/menus/TextMenu/components/CustomClassPicker.d.ts +6 -0
  42. package/dist/components/menus/TextMenu/components/EditLinkPopover.d.ts +8 -0
  43. package/dist/components/menus/TextMenu/components/FontFamilyPicker.d.ts +5 -0
  44. package/dist/components/menus/TextMenu/components/FontSizePicker.d.ts +5 -0
  45. package/dist/components/menus/TextMenu/hooks/useTextmenuCommands.d.ts +25 -0
  46. package/dist/components/menus/TextMenu/hooks/useTextmenuStates.d.ts +22 -0
  47. package/dist/components/menus/TextMenu/index.d.ts +1 -0
  48. package/dist/components/menus/index.d.ts +3 -0
  49. package/dist/components/menus/types.d.ts +18 -0
  50. package/dist/components/panels/AlignPicker/AlignPicker.d.ts +5 -0
  51. package/dist/components/panels/AlignPicker/AlignPicker.mjs +12 -0
  52. package/dist/components/panels/AlignPicker/AlignPicker.mjs.map +1 -0
  53. package/dist/components/panels/AlignPicker/index.d.ts +1 -0
  54. package/dist/components/panels/Colorpicker/ColorButton.d.ts +6 -0
  55. package/dist/components/panels/Colorpicker/ColorButton.mjs +10 -0
  56. package/dist/components/panels/Colorpicker/ColorButton.mjs.map +1 -0
  57. package/dist/components/panels/Colorpicker/Colorpicker.d.ts +6 -0
  58. package/dist/components/panels/Colorpicker/index.d.ts +1 -0
  59. package/dist/components/panels/LinkEditorPanel/LinkEditorPanel.d.ts +17 -0
  60. package/dist/components/panels/LinkEditorPanel/index.d.ts +1 -0
  61. package/dist/components/panels/LinkPreviewPanel/LinkPreviewPanel.d.ts +6 -0
  62. package/dist/components/panels/LinkPreviewPanel/index.d.ts +1 -0
  63. package/dist/components/panels/index.d.ts +4 -0
  64. package/dist/components/ui/Icon.d.ts +5 -0
  65. package/dist/components/ui/Icon.mjs +7 -0
  66. package/dist/components/ui/Icon.mjs.map +1 -0
  67. package/dist/components/ui/Surface.d.ts +6 -0
  68. package/dist/components/ui/Surface.mjs +10 -0
  69. package/dist/components/ui/Surface.mjs.map +1 -0
  70. package/dist/components/ui/Toolbar.d.ts +45 -0
  71. package/dist/components/ui/Toolbar.mjs +11 -0
  72. package/dist/components/ui/Toolbar.mjs.map +1 -0
  73. package/dist/config/blockMenuCategories.d.ts +22 -0
  74. package/dist/config/blockMenuCategories.mjs +19 -0
  75. package/dist/config/blockMenuCategories.mjs.map +1 -0
  76. package/dist/config/blocks/__tests__/createMockEditor.d.ts +29 -0
  77. package/dist/config/blocks/blockquote.d.ts +3 -0
  78. package/dist/config/blocks/bulletList.d.ts +3 -0
  79. package/dist/config/blocks/codeBlock.d.ts +3 -0
  80. package/dist/config/blocks/columns1.d.ts +3 -0
  81. package/dist/config/blocks/columns2.d.ts +3 -0
  82. package/dist/config/blocks/columns3.d.ts +3 -0
  83. package/dist/config/blocks/createHeadingActions.d.ts +7 -0
  84. package/dist/config/blocks/file.d.ts +3 -0
  85. package/dist/config/blocks/heading1.d.ts +3 -0
  86. package/dist/config/blocks/heading2.d.ts +3 -0
  87. package/dist/config/blocks/heading3.d.ts +3 -0
  88. package/dist/config/blocks/heading4.d.ts +3 -0
  89. package/dist/config/blocks/heading5.d.ts +3 -0
  90. package/dist/config/blocks/heading6.d.ts +3 -0
  91. package/dist/config/blocks/horizontalRule.d.ts +3 -0
  92. package/dist/config/blocks/image.d.ts +3 -0
  93. package/dist/config/blocks/index.d.ts +13 -0
  94. package/dist/config/blocks/linkButton.d.ts +3 -0
  95. package/dist/config/blocks/numberedList.d.ts +3 -0
  96. package/dist/config/blocks/paragraph.d.ts +3 -0
  97. package/dist/config/blocks/table.d.ts +3 -0
  98. package/dist/context/EditorExtensions.d.ts +12 -0
  99. package/dist/context/EditorExtensions.mjs +18 -0
  100. package/dist/context/EditorExtensions.mjs.map +1 -0
  101. package/dist/context/EditorSettings.d.ts +7 -0
  102. package/dist/context/EditorSettings.mjs +12 -0
  103. package/dist/context/EditorSettings.mjs.map +1 -0
  104. package/dist/dataview/column-type.d.ts +11 -0
  105. package/dist/dataview/column-type.mjs +14 -0
  106. package/dist/dataview/column-type.mjs.map +1 -0
  107. package/dist/extensions/BaseBlock/BaseBlock.d.ts +12 -0
  108. package/dist/extensions/BaseBlock/index.d.ts +1 -0
  109. package/dist/extensions/BlockquoteFigure/BlockquoteFigure.d.ts +11 -0
  110. package/dist/extensions/BlockquoteFigure/Quote/Quote.d.ts +3 -0
  111. package/dist/extensions/BlockquoteFigure/Quote/index.d.ts +1 -0
  112. package/dist/extensions/BlockquoteFigure/QuoteCaption/QuoteCaption.d.ts +3 -0
  113. package/dist/extensions/BlockquoteFigure/QuoteCaption/index.d.ts +1 -0
  114. package/dist/extensions/BlockquoteFigure/index.d.ts +1 -0
  115. package/dist/extensions/CustomConvertBlock/CustomConvertBlock.d.ts +14 -0
  116. package/dist/extensions/CustomConvertBlock/index.d.ts +1 -0
  117. package/dist/extensions/CustomMark/CustomMark.d.ts +3 -0
  118. package/dist/extensions/CustomMark/index.d.ts +1 -0
  119. package/dist/extensions/Document/Document.d.ts +2 -0
  120. package/dist/extensions/Document/index.d.ts +1 -0
  121. package/dist/extensions/Figcaption/Figcaption.d.ts +5 -0
  122. package/dist/extensions/Figcaption/index.d.ts +1 -0
  123. package/dist/extensions/Figure/Figure.d.ts +5 -0
  124. package/dist/extensions/Figure/index.d.ts +1 -0
  125. package/dist/extensions/FileBlock/FileBlock.d.ts +25 -0
  126. package/dist/extensions/FileBlock/components/FileBlockCaption.d.ts +6 -0
  127. package/dist/extensions/FileBlock/components/FileBlockMenu.d.ts +4 -0
  128. package/dist/extensions/FileBlock/components/FileBlockView.d.ts +9 -0
  129. package/dist/extensions/FileBlock/index.d.ts +1 -0
  130. package/dist/extensions/FileBlock/mediaUpdateHooks.d.ts +10 -0
  131. package/dist/extensions/FontStyle/FontStyle.d.ts +20 -0
  132. package/dist/extensions/FontStyle/index.d.ts +1 -0
  133. package/dist/extensions/Heading/Heading.d.ts +2 -0
  134. package/dist/extensions/Heading/index.d.ts +1 -0
  135. package/dist/extensions/HorizontalRule/HorizontalRule.d.ts +2 -0
  136. package/dist/extensions/HorizontalRule/index.d.ts +1 -0
  137. package/dist/extensions/Image/Image.d.ts +2 -0
  138. package/dist/extensions/Image/index.d.ts +1 -0
  139. package/dist/extensions/ImageBlock/ImageBlock.d.ts +34 -0
  140. package/dist/extensions/ImageBlock/components/ImageBlockCaption.d.ts +6 -0
  141. package/dist/extensions/ImageBlock/components/ImageBlockLink.d.ts +6 -0
  142. package/dist/extensions/ImageBlock/components/ImageBlockMenu.d.ts +4 -0
  143. package/dist/extensions/ImageBlock/components/ImageBlockView.d.ts +9 -0
  144. package/dist/extensions/ImageBlock/components/ImageBlockWidth.d.ts +5 -0
  145. package/dist/extensions/ImageBlock/index.d.ts +1 -0
  146. package/dist/extensions/ImageBlock/mediaUpdateHooks.d.ts +10 -0
  147. package/dist/extensions/Link/Link.d.ts +4 -0
  148. package/dist/extensions/Link/index.d.ts +1 -0
  149. package/dist/extensions/LinkButton/LinkButton.d.ts +15 -0
  150. package/dist/extensions/LinkButton/components/LinkButtonMenu.d.ts +4 -0
  151. package/dist/extensions/LinkButton/components/LinkButtonView.d.ts +7 -0
  152. package/dist/extensions/LinkButton/index.d.ts +1 -0
  153. package/dist/extensions/MediaUpload/MediaUpload.d.ts +12 -0
  154. package/dist/extensions/MediaUpload/index.d.ts +1 -0
  155. package/dist/extensions/MediaUpload/view/Dropzone.d.ts +7 -0
  156. package/dist/extensions/MediaUpload/view/filterFilesByMediaType.d.ts +10 -0
  157. package/dist/extensions/MediaUpload/view/hooks.d.ts +26 -0
  158. package/dist/extensions/MediaUpload/view/index.d.ts +1 -0
  159. package/dist/extensions/MediaUpload/view/insertMediaBlocks.d.ts +22 -0
  160. package/dist/extensions/MultiColumn/Column.d.ts +3 -0
  161. package/dist/extensions/MultiColumn/Columns.d.ts +16 -0
  162. package/dist/extensions/MultiColumn/index.d.ts +2 -0
  163. package/dist/extensions/PasteHandler/PasteHandler.d.ts +4 -0
  164. package/dist/extensions/PasteHandler/index.d.ts +1 -0
  165. package/dist/extensions/Selection/Selection.d.ts +3 -0
  166. package/dist/extensions/Selection/index.d.ts +1 -0
  167. package/dist/extensions/SlashCommand/BlockMenu.d.ts +9 -0
  168. package/dist/extensions/SlashCommand/SlashCommand.d.ts +18 -0
  169. package/dist/extensions/SlashCommand/index.d.ts +1 -0
  170. package/dist/extensions/Table/Cell.d.ts +12 -0
  171. package/dist/extensions/Table/Header.d.ts +9 -0
  172. package/dist/extensions/Table/Row.d.ts +2 -0
  173. package/dist/extensions/Table/Table.d.ts +9 -0
  174. package/dist/extensions/Table/index.d.ts +4 -0
  175. package/dist/extensions/Table/menus/ColorPicker.d.ts +4 -0
  176. package/dist/extensions/Table/menus/TableColumn/index.d.ts +4 -0
  177. package/dist/extensions/Table/menus/TableColumn/utils.d.ts +8 -0
  178. package/dist/extensions/Table/menus/TableMenu/index.d.ts +4 -0
  179. package/dist/extensions/Table/menus/TableRow/index.d.ts +4 -0
  180. package/dist/extensions/Table/menus/TableRow/utils.d.ts +8 -0
  181. package/dist/extensions/Table/menus/hooks.d.ts +5 -0
  182. package/dist/extensions/Table/menus/index.d.ts +3 -0
  183. package/dist/extensions/Table/utils.d.ts +44 -0
  184. package/dist/extensions/TrailingNode/index.d.ts +1 -0
  185. package/dist/extensions/TrailingNode/trailing-node.d.ts +11 -0
  186. package/dist/extensions/extension-kit.d.ts +10 -0
  187. package/dist/extensions/index.d.ts +34 -0
  188. package/dist/extensions/mediaBlockContent.d.ts +41 -0
  189. package/dist/hooks/resolveCommands.d.ts +10 -0
  190. package/dist/hooks/useBlockEditor.d.ts +27 -0
  191. package/dist/hooks/useBlockMenus.d.ts +17 -0
  192. package/dist/hooks/useEditorViewDom.d.ts +15 -0
  193. package/dist/hooks/useFrequentlyUsed.d.ts +6 -0
  194. package/dist/hooks/useSettings.d.ts +10 -0
  195. package/dist/index.d.ts +5 -0
  196. package/dist/index.mjs +33 -0
  197. package/dist/index.mjs.map +1 -0
  198. package/dist/lib/utils/commandUsageStorage.d.ts +14 -0
  199. package/dist/lib/utils/index.d.ts +5 -0
  200. package/dist/lib/utils/isCustomNodeSelected.d.ts +4 -0
  201. package/dist/lib/utils/isTextSelected.d.ts +5 -0
  202. package/dist/tiptap/core.d.ts +1 -0
  203. package/dist/tiptap/core.mjs +3 -0
  204. package/dist/tiptap/core.mjs.map +1 -0
  205. package/dist/tiptap/pm/changeset.d.ts +1 -0
  206. package/dist/tiptap/pm/changeset.mjs +3 -0
  207. package/dist/tiptap/pm/changeset.mjs.map +1 -0
  208. package/dist/tiptap/pm/commands.d.ts +1 -0
  209. package/dist/tiptap/pm/commands.mjs +3 -0
  210. package/dist/tiptap/pm/commands.mjs.map +1 -0
  211. package/dist/tiptap/pm/dropcursor.d.ts +1 -0
  212. package/dist/tiptap/pm/dropcursor.mjs +3 -0
  213. package/dist/tiptap/pm/dropcursor.mjs.map +1 -0
  214. package/dist/tiptap/pm/gapcursor.d.ts +1 -0
  215. package/dist/tiptap/pm/gapcursor.mjs +3 -0
  216. package/dist/tiptap/pm/gapcursor.mjs.map +1 -0
  217. package/dist/tiptap/pm/history.d.ts +1 -0
  218. package/dist/tiptap/pm/history.mjs +3 -0
  219. package/dist/tiptap/pm/history.mjs.map +1 -0
  220. package/dist/tiptap/pm/inputrules.d.ts +1 -0
  221. package/dist/tiptap/pm/inputrules.mjs +3 -0
  222. package/dist/tiptap/pm/inputrules.mjs.map +1 -0
  223. package/dist/tiptap/pm/keymap.d.ts +1 -0
  224. package/dist/tiptap/pm/keymap.mjs +3 -0
  225. package/dist/tiptap/pm/keymap.mjs.map +1 -0
  226. package/dist/tiptap/pm/model.d.ts +1 -0
  227. package/dist/tiptap/pm/model.mjs +3 -0
  228. package/dist/tiptap/pm/model.mjs.map +1 -0
  229. package/dist/tiptap/pm/schema-list.d.ts +1 -0
  230. package/dist/tiptap/pm/schema-list.mjs +3 -0
  231. package/dist/tiptap/pm/schema-list.mjs.map +1 -0
  232. package/dist/tiptap/pm/state.d.ts +1 -0
  233. package/dist/tiptap/pm/state.mjs +3 -0
  234. package/dist/tiptap/pm/state.mjs.map +1 -0
  235. package/dist/tiptap/pm/tables.d.ts +1 -0
  236. package/dist/tiptap/pm/tables.mjs +3 -0
  237. package/dist/tiptap/pm/tables.mjs.map +1 -0
  238. package/dist/tiptap/pm/transform.d.ts +1 -0
  239. package/dist/tiptap/pm/transform.mjs +3 -0
  240. package/dist/tiptap/pm/transform.mjs.map +1 -0
  241. package/dist/tiptap/pm/view.d.ts +1 -0
  242. package/dist/tiptap/pm/view.mjs +3 -0
  243. package/dist/tiptap/pm/view.mjs.map +1 -0
  244. package/dist/tiptap/react.d.ts +1 -0
  245. package/dist/tiptap/react.mjs +3 -0
  246. package/dist/tiptap/react.mjs.map +1 -0
  247. package/dist/tiptap/suggestion.d.ts +3 -0
  248. package/dist/tiptap/suggestion.mjs +8 -0
  249. package/dist/tiptap/suggestion.mjs.map +1 -0
  250. package/dist/tiptap/tiptap.d.ts +48 -0
  251. package/dist/tiptap/tiptap.mjs +41 -0
  252. package/dist/tiptap/tiptap.mjs.map +1 -0
  253. package/dist/types/index.d.ts +149 -0
  254. package/dist/types/index.mjs +1 -0
  255. package/dist/types/index.mjs.map +1 -0
  256. package/dist/utils/createBlockMenu.d.ts +30 -0
  257. package/dist/utils/createProps.d.ts +7 -0
  258. package/dist/utils/createProps.mjs +7 -0
  259. package/dist/utils/createProps.mjs.map +1 -0
  260. package/dist/utils/mergeBlockDefinitions.d.ts +10 -0
  261. package/dist/utils/mergeBlockDefinitions.mjs +8 -0
  262. package/dist/utils/mergeBlockDefinitions.mjs.map +1 -0
  263. package/dist/utils/mergeSettings.d.ts +11 -0
  264. package/dist/utils/normalizeSettings.d.ts +28 -0
  265. package/dist/utils/normalizeSettings.mjs +13 -0
  266. package/dist/utils/normalizeSettings.mjs.map +1 -0
  267. package/package.json +243 -0
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # @ablogcms/block-editor
2
+
3
+ Tiptap ベースのブロックエディタ。エントリー本文編集の主要 UI で、テーブル・画像ブロック・貼り付け
4
+ ハンドリングなどの拡張を含む。
5
+
6
+ ## 使い方
7
+
8
+ ```tsx
9
+ import { BlockEditor, normalizeSettings, DEFAULT_EDITOR_SETTINGS } from '@ablogcms/block-editor';
10
+
11
+ const settings = normalizeSettings(rawSettingsFromServer);
12
+
13
+ <BlockEditor editorSettings={settings ?? DEFAULT_EDITOR_SETTINGS} onUpdate={(html) => console.log(html)} />;
14
+ ```
15
+
16
+ - `editorSettings`: 機能フラグ・ブロックメニュー・フォントサイズ・カラーパレットなどの設定
17
+ (`EditorSettings`)。このパッケージ自体はデータ取得を行わないため、呼び出し側が取得して渡す。
18
+ - `onUpdate(html)`: 本文が変更されるたびに、シリアライズ後の HTML 文字列を渡して呼ばれる。
19
+ - `settings`: エディター個別の宣言的な上書き設定(`allow` / `deny` / `blocks` など)。
20
+ - `normalizeSettings(raw)`: サーバーの生レスポンスを `EditorSettings` に変換する純粋関数。
21
+ - `SettingsProvider` / `useSettingsContext`: `EditorSettings` をツリーの深い位置まで配る Context。
@@ -0,0 +1,34 @@
1
+ // src/utils/createProps.ts
2
+ import { attributesToProps } from "@ablogcms/utils/react";
3
+ function createProps(element, options = {}) {
4
+ const input = element.querySelector('input[type="hidden"]');
5
+ if (!input) {
6
+ throw new Error("Not found hidden input element!");
7
+ }
8
+ return {
9
+ defaultValue: input.value,
10
+ ...ACMS.Config.blockEditorConfig.editorProps,
11
+ // `<acms-block-editor>` 自身の属性(settings 等。data-* ではない独自属性。カスタム要素自身の
12
+ // 属性はその要素の公開 API であり HTML 標準要素向けの data-* 制約は適用されないため、
13
+ // `<acms-unit-editor>` 等の兄弟要素と同じ設計。README.md 参照)をすべて props 化する。
14
+ // 旧 `.js-block-editor`(公開仕様は data-settings)は upgradeLegacyBlockEditors
15
+ // (elements/upgrade-legacy-marks.ts)が data- を外した属性へ変換したうえでこの要素に
16
+ // 合流させるため、旧仕様もこの経路で読める。
17
+ ...attributesToProps(element),
18
+ ...options,
19
+ onUpdate: (newValue) => {
20
+ if (options.onUpdate) {
21
+ options.onUpdate(newValue);
22
+ }
23
+ input.value = newValue;
24
+ if (options.onInputChange) {
25
+ options.onInputChange(newValue);
26
+ }
27
+ }
28
+ };
29
+ }
30
+
31
+ export {
32
+ createProps
33
+ };
34
+ //# sourceMappingURL=chunk-4KUPYKHV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/createProps.ts"],"sourcesContent":["import { attributesToProps } from '@ablogcms/utils/react';\nimport type { BlockEditor } from '../components/BlockEditor';\n\ntype BlockEditorProps = React.ComponentPropsWithoutRef<typeof BlockEditor>;\n\ninterface CreatePropsOptions extends Partial<BlockEditorProps> {\n onInputChange?: (newValue: string) => void;\n}\n\nexport default function createProps(element: HTMLElement, options: CreatePropsOptions = {}) {\n const input = element.querySelector<HTMLInputElement>('input[type=\"hidden\"]');\n\n if (!input) {\n throw new Error('Not found hidden input element!');\n }\n\n return {\n defaultValue: input.value,\n ...ACMS.Config.blockEditorConfig.editorProps,\n // `<acms-block-editor>` 自身の属性(settings 等。data-* ではない独自属性。カスタム要素自身の\n // 属性はその要素の公開 API であり HTML 標準要素向けの data-* 制約は適用されないため、\n // `<acms-unit-editor>` 等の兄弟要素と同じ設計。README.md 参照)をすべて props 化する。\n // 旧 `.js-block-editor`(公開仕様は data-settings)は upgradeLegacyBlockEditors\n // (elements/upgrade-legacy-marks.ts)が data- を外した属性へ変換したうえでこの要素に\n // 合流させるため、旧仕様もこの経路で読める。\n ...attributesToProps<Partial<BlockEditorProps>>(element),\n ...options,\n onUpdate: (newValue: string) => {\n if (options.onUpdate) {\n options.onUpdate(newValue);\n }\n input.value = newValue;\n if (options.onInputChange) {\n options.onInputChange(newValue);\n }\n },\n };\n}\n"],"mappings":";AAAA,SAAS,yBAAyB;AASnB,SAAR,YAA6B,SAAsB,UAA8B,CAAC,GAAG;AAC1F,QAAM,QAAQ,QAAQ,cAAgC,sBAAsB;AAE5E,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,SAAO;AAAA,IACL,cAAc,MAAM;AAAA,IACpB,GAAG,KAAK,OAAO,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOjC,GAAG,kBAA6C,OAAO;AAAA,IACvD,GAAG;AAAA,IACH,UAAU,CAAC,aAAqB;AAC9B,UAAI,QAAQ,UAAU;AACpB,gBAAQ,SAAS,QAAQ;AAAA,MAC3B;AACA,YAAM,QAAQ;AACd,UAAI,QAAQ,eAAe;AACzB,gBAAQ,cAAc,QAAQ;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,23 @@
1
+ // src/components/ui/Icon.tsx
2
+ import { memo } from "react";
3
+ import classnames from "classnames";
4
+ import { Icon as BaseIcon } from "@ablogcms/components/icon";
5
+ import { jsx } from "react/jsx-runtime";
6
+ var Icon = memo(({ size = "md", ...props }) => {
7
+ return /* @__PURE__ */ jsx(
8
+ BaseIcon,
9
+ {
10
+ className: classnames("acms-admin-block-editor-icon", {
11
+ [`acms-admin-block-editor-icon-${size}`]: size !== "md"
12
+ }),
13
+ "aria-hidden": "true",
14
+ ...props
15
+ }
16
+ );
17
+ });
18
+ Icon.displayName = "Icon";
19
+
20
+ export {
21
+ Icon
22
+ };
23
+ //# sourceMappingURL=chunk-57Q3DEDF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/Icon.tsx"],"sourcesContent":["import { memo } from 'react';\nimport classnames from 'classnames';\nimport { Icon as BaseIcon } from '@ablogcms/components/icon';\n\nexport interface IconProps extends React.ComponentPropsWithoutRef<typeof BaseIcon> {\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const Icon = memo(({ size = 'md', ...props }: IconProps) => {\n return (\n <BaseIcon\n className={classnames('acms-admin-block-editor-icon', {\n [`acms-admin-block-editor-icon-${size}`]: size !== 'md',\n })}\n aria-hidden=\"true\"\n {...props}\n />\n );\n});\n\nIcon.displayName = 'Icon';\n"],"mappings":";AAAA,SAAS,YAAY;AACrB,OAAO,gBAAgB;AACvB,SAAS,QAAQ,gBAAgB;AAQ7B;AAFG,IAAM,OAAO,KAAK,CAAC,EAAE,OAAO,MAAM,GAAG,MAAM,MAAiB;AACjE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,WAAW,gCAAgC;AAAA,QACpD,CAAC,gCAAgC,IAAI,EAAE,GAAG,SAAS;AAAA,MACrD,CAAC;AAAA,MACD,eAAY;AAAA,MACX,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AAED,KAAK,cAAc;","names":[]}
@@ -0,0 +1,20 @@
1
+ import {
2
+ DEFAULT_EDITOR_SETTINGS
3
+ } from "./chunk-JYUNKG2P.mjs";
4
+
5
+ // src/context/EditorSettings.tsx
6
+ import { createContext, useContext } from "react";
7
+ import { jsx } from "react/jsx-runtime";
8
+ var SettingsContext = createContext(DEFAULT_EDITOR_SETTINGS);
9
+ function SettingsProvider({ children, settings }) {
10
+ return /* @__PURE__ */ jsx(SettingsContext.Provider, { value: settings, children });
11
+ }
12
+ var useSettingsContext = () => {
13
+ return useContext(SettingsContext);
14
+ };
15
+
16
+ export {
17
+ SettingsProvider,
18
+ useSettingsContext
19
+ };
20
+ //# sourceMappingURL=chunk-DUT25D7Z.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/EditorSettings.tsx"],"sourcesContent":["import React, { createContext, useContext } from 'react';\nimport type { EditorSettings } from '../types';\nimport { DEFAULT_EDITOR_SETTINGS } from '../utils/normalizeSettings';\n\nconst SettingsContext = createContext<EditorSettings>(DEFAULT_EDITOR_SETTINGS);\n\nexport function SettingsProvider({ children, settings }: { children: React.ReactNode; settings: EditorSettings }) {\n return <SettingsContext.Provider value={settings}>{children}</SettingsContext.Provider>;\n}\n\nexport const useSettingsContext = (): EditorSettings => {\n return useContext(SettingsContext);\n};\n"],"mappings":";;;;;AAAA,SAAgB,eAAe,kBAAkB;AAOxC;AAHT,IAAM,kBAAkB,cAA8B,uBAAuB;AAEtE,SAAS,iBAAiB,EAAE,UAAU,SAAS,GAA4D;AAChH,SAAO,oBAAC,gBAAgB,UAAhB,EAAyB,OAAO,UAAW,UAAS;AAC9D;AAEO,IAAM,qBAAqB,MAAsB;AACtD,SAAO,WAAW,eAAe;AACnC;","names":[]}
@@ -0,0 +1,17 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-TKSGCO5Z.mjs";
4
+
5
+ // src/components/ui/Surface.tsx
6
+ import { forwardRef } from "react";
7
+ import { jsx } from "react/jsx-runtime";
8
+ var Surface = forwardRef(({ children, className, ...props }, ref) => {
9
+ const surfaceClass = cn("acms-admin-block-editor-surface", className);
10
+ return /* @__PURE__ */ jsx("div", { className: surfaceClass, ...props, ref, children });
11
+ });
12
+ Surface.displayName = "Surface";
13
+
14
+ export {
15
+ Surface
16
+ };
17
+ //# sourceMappingURL=chunk-EM5TLDPY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/Surface.tsx"],"sourcesContent":["import { HTMLProps, forwardRef } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SurfaceProps = HTMLProps<HTMLDivElement> & {\n withShadow?: boolean;\n withBorder?: boolean;\n};\n\nexport const Surface = forwardRef<HTMLDivElement, SurfaceProps>(({ children, className, ...props }, ref) => {\n const surfaceClass = cn('acms-admin-block-editor-surface', className);\n\n return (\n <div className={surfaceClass} {...props} ref={ref}>\n {children}\n </div>\n );\n});\n\nSurface.displayName = 'Surface';\n"],"mappings":";;;;;AAAA,SAAoB,kBAAkB;AAYlC;AAJG,IAAM,UAAU,WAAyC,CAAC,EAAE,UAAU,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC1G,QAAM,eAAe,GAAG,mCAAmC,SAAS;AAEpE,SACE,oBAAC,SAAI,WAAW,cAAe,GAAG,OAAO,KACtC,UACH;AAEJ,CAAC;AAED,QAAQ,cAAc;","names":[]}
@@ -0,0 +1,23 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-TKSGCO5Z.mjs";
4
+
5
+ // src/components/panels/Colorpicker/ColorButton.tsx
6
+ import { memo, useCallback } from "react";
7
+ import { jsx } from "react/jsx-runtime";
8
+ var ColorButton = memo(({ color, active, onColorChange }) => {
9
+ const wrapperClassName = cn("acms-admin-block-editor-text-menu-color-picker-palette-item", active && "active");
10
+ const bubbleClassName = cn("acms-admin-block-editor-text-menu-color-picker-palette-bubble", active && `active`);
11
+ const handleClick = useCallback(() => {
12
+ if (onColorChange) {
13
+ onColorChange(color || "");
14
+ }
15
+ }, [onColorChange, color]);
16
+ return /* @__PURE__ */ jsx("button", { type: "button", onClick: handleClick, className: wrapperClassName, "aria-label": `select ${color}`, children: /* @__PURE__ */ jsx("span", { style: { backgroundColor: color, color }, className: bubbleClassName }) });
17
+ });
18
+ ColorButton.displayName = "ColorButton";
19
+
20
+ export {
21
+ ColorButton
22
+ };
23
+ //# sourceMappingURL=chunk-GIHTGDIW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/panels/Colorpicker/ColorButton.tsx"],"sourcesContent":["import { memo, useCallback } from 'react';\nimport { cn } from '../../../lib/utils';\n\nexport type ColorButtonProps = {\n color?: string;\n active?: boolean;\n onColorChange?: (color: string) => void;\n};\n\nexport const ColorButton = memo(({ color, active, onColorChange }: ColorButtonProps) => {\n const wrapperClassName = cn('acms-admin-block-editor-text-menu-color-picker-palette-item', active && 'active');\n const bubbleClassName = cn('acms-admin-block-editor-text-menu-color-picker-palette-bubble', active && `active`);\n\n const handleClick = useCallback(() => {\n if (onColorChange) {\n onColorChange(color || '');\n }\n }, [onColorChange, color]);\n\n return (\n <button type=\"button\" onClick={handleClick} className={wrapperClassName} aria-label={`select ${color}`}>\n <span style={{ backgroundColor: color, color }} className={bubbleClassName} />\n </button>\n );\n});\n\nColorButton.displayName = 'ColorButton';\n"],"mappings":";;;;;AAAA,SAAS,MAAM,mBAAmB;AAqB5B;AAZC,IAAM,cAAc,KAAK,CAAC,EAAE,OAAO,QAAQ,cAAc,MAAwB;AACtF,QAAM,mBAAmB,GAAG,+DAA+D,UAAU,QAAQ;AAC7G,QAAM,kBAAkB,GAAG,iEAAiE,UAAU,QAAQ;AAE9G,QAAM,cAAc,YAAY,MAAM;AACpC,QAAI,eAAe;AACjB,oBAAc,SAAS,EAAE;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,eAAe,KAAK,CAAC;AAEzB,SACE,oBAAC,YAAO,MAAK,UAAS,SAAS,aAAa,WAAW,kBAAkB,cAAY,UAAU,KAAK,IAClG,8BAAC,UAAK,OAAO,EAAE,iBAAiB,OAAO,MAAM,GAAG,WAAW,iBAAiB,GAC9E;AAEJ,CAAC;AAED,YAAY,cAAc;","names":[]}
@@ -0,0 +1,87 @@
1
+ import {
2
+ Surface
3
+ } from "./chunk-EM5TLDPY.mjs";
4
+
5
+ // src/components/ui/Toolbar.tsx
6
+ import { forwardRef, useRef } from "react";
7
+ import { renderToStaticMarkup } from "react-dom/server";
8
+ import classnames from "classnames";
9
+ import { TooltipCommand } from "@ablogcms/components/tooltip";
10
+ import useMergeRefs from "@ablogcms/react-hooks/use-merge-refs";
11
+ import useToolbar from "@ablogcms/react-hooks/use-toolbar";
12
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
+ var ToolbarRoot = forwardRef(
14
+ ({ shouldShowContent = true, children, orientation, direction, className, ...props }, forwardRef2) => {
15
+ const ref = useRef(null);
16
+ const setRef = useMergeRefs(forwardRef2, ref);
17
+ const { toolbarProps } = useToolbar({ orientation, direction });
18
+ const toolbarClassName = classnames("acms-admin-block-editor-toolbar", className);
19
+ return shouldShowContent && /* @__PURE__ */ jsx(Surface, { className: toolbarClassName, ...toolbarProps({ ref: setRef, ...props }), children });
20
+ }
21
+ );
22
+ ToolbarRoot.displayName = "Toolbar";
23
+ var ToolbarDivider = forwardRef(({ horizontal, className, ...rest }, ref) => {
24
+ const dividerClassName = classnames(
25
+ "acms-admin-block-editor-toolbar-divider",
26
+ horizontal ? "acms-admin-block-editor-toolbar-divider-horizontal" : "",
27
+ className
28
+ );
29
+ return /* @__PURE__ */ jsx("div", { className: dividerClassName, ref, ...rest });
30
+ });
31
+ ToolbarDivider.displayName = "Toolbar.Divider";
32
+ var ToolbarButton = forwardRef(
33
+ ({
34
+ active,
35
+ children,
36
+ size = "medium",
37
+ variant = "primary",
38
+ className,
39
+ tooltip,
40
+ tooltipShortcut,
41
+ activeClassname,
42
+ ...rest
43
+ }, ref) => {
44
+ const buttonClassName = classnames(
45
+ "acms-admin-block-editor-button",
46
+ variant === "primary" && classnames(
47
+ "acms-admin-block-editor-button-primary",
48
+ active && classnames("acms-admin-block-editor-button-active", activeClassname)
49
+ ),
50
+ variant === "secondary" && classnames(
51
+ "acms-admin-block-editor-button-secondary",
52
+ active && classnames("acms-admin-block-editor-button-active", activeClassname)
53
+ ),
54
+ size === "medium" && "acms-admin-block-editor-button-icon",
55
+ size === "small" && "acms-admin-block-editor-button-icon-small",
56
+ className
57
+ );
58
+ return /* @__PURE__ */ jsx(
59
+ "button",
60
+ {
61
+ type: "button",
62
+ className: buttonClassName,
63
+ ref,
64
+ ...rest,
65
+ "aria-pressed": active,
66
+ "data-tooltip-id": "block-editor-shared-tooltip",
67
+ "data-tooltip-html": tooltip && renderToStaticMarkup(
68
+ /* @__PURE__ */ jsxs(Fragment, { children: [
69
+ tooltip,
70
+ /* @__PURE__ */ jsx(TooltipCommand, { commands: tooltipShortcut ?? [] })
71
+ ] })
72
+ ),
73
+ children
74
+ }
75
+ );
76
+ }
77
+ );
78
+ ToolbarButton.displayName = "ToolbarButton";
79
+ var Toolbar = Object.assign(ToolbarRoot, {
80
+ Divider: ToolbarDivider,
81
+ Button: ToolbarButton
82
+ });
83
+
84
+ export {
85
+ Toolbar
86
+ };
87
+ //# sourceMappingURL=chunk-HNSTT2Z4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/Toolbar.tsx"],"sourcesContent":["import { ButtonHTMLAttributes, HTMLProps, forwardRef, useRef } from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport classnames from 'classnames';\nimport { TooltipCommand } from '@ablogcms/components/tooltip';\nimport useMergeRefs from '@ablogcms/react-hooks/use-merge-refs';\nimport useToolbar, { UseToolbarOptions } from '@ablogcms/react-hooks/use-toolbar';\nimport { Surface } from './Surface';\n\nexport interface ToolbarRootProps extends UseToolbarOptions, HTMLProps<HTMLDivElement> {\n shouldShowContent?: boolean;\n}\n\nconst ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(\n ({ shouldShowContent = true, children, orientation, direction, className, ...props }, forwardRef) => {\n const ref = useRef<HTMLDivElement>(null);\n const setRef = useMergeRefs(forwardRef, ref);\n const { toolbarProps } = useToolbar({ orientation, direction });\n const toolbarClassName = classnames('acms-admin-block-editor-toolbar', className);\n\n return (\n shouldShowContent && (\n <Surface className={toolbarClassName} {...toolbarProps({ ref: setRef, ...props })}>\n {children}\n </Surface>\n )\n );\n }\n);\n\nToolbarRoot.displayName = 'Toolbar';\n\nexport type ToolbarDividerProps = {\n horizontal?: boolean;\n} & HTMLProps<HTMLDivElement>;\n\nconst ToolbarDivider = forwardRef<HTMLDivElement, ToolbarDividerProps>(({ horizontal, className, ...rest }, ref) => {\n const dividerClassName = classnames(\n 'acms-admin-block-editor-toolbar-divider',\n horizontal ? 'acms-admin-block-editor-toolbar-divider-horizontal' : '',\n className\n );\n\n return <div className={dividerClassName} ref={ref} {...rest} />;\n});\n\nToolbarDivider.displayName = 'Toolbar.Divider';\n\nexport type ButtonVariant = 'primary' | 'secondary';\nexport type ButtonSize = 'medium' | 'small';\n\nexport type ToolbarButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /**\n * ボタンのバリエーション\n * @default primary\n */\n variant?: ButtonVariant;\n active?: boolean;\n activeClassname?: string;\n tooltip?: string;\n tooltipShortcut?: string[];\n /**\n * ボタンのサイズ\n * @default medium\n */\n size?: ButtonSize;\n};\n\nconst ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n (\n {\n active,\n children,\n size = 'medium',\n variant = 'primary',\n className,\n tooltip,\n tooltipShortcut,\n activeClassname,\n ...rest\n },\n ref\n ) => {\n const buttonClassName = classnames(\n 'acms-admin-block-editor-button',\n\n variant === 'primary' &&\n classnames(\n 'acms-admin-block-editor-button-primary',\n active && classnames('acms-admin-block-editor-button-active', activeClassname)\n ),\n\n variant === 'secondary' &&\n classnames(\n 'acms-admin-block-editor-button-secondary',\n active && classnames('acms-admin-block-editor-button-active', activeClassname)\n ),\n\n size === 'medium' && 'acms-admin-block-editor-button-icon',\n size === 'small' && 'acms-admin-block-editor-button-icon-small',\n\n className\n );\n\n return (\n <button\n type=\"button\"\n className={buttonClassName}\n ref={ref}\n {...rest}\n aria-pressed={active}\n data-tooltip-id=\"block-editor-shared-tooltip\"\n data-tooltip-html={\n tooltip &&\n renderToStaticMarkup(\n <>\n {tooltip}\n <TooltipCommand commands={tooltipShortcut ?? []} />\n </>\n )\n }\n >\n {children}\n </button>\n );\n }\n);\n\nToolbarButton.displayName = 'ToolbarButton';\n\nexport const Toolbar = Object.assign(ToolbarRoot, {\n Divider: ToolbarDivider,\n Button: ToolbarButton,\n});\n"],"mappings":";;;;;AAAA,SAA0C,YAAY,cAAc;AACpE,SAAS,4BAA4B;AACrC,OAAO,gBAAgB;AACvB,SAAS,sBAAsB;AAC/B,OAAO,kBAAkB;AACzB,OAAO,gBAAuC;AAgBtC,SA6FI,UA7FJ,KA6FI,YA7FJ;AATR,IAAM,cAAc;AAAA,EAClB,CAAC,EAAE,oBAAoB,MAAM,UAAU,aAAa,WAAW,WAAW,GAAG,MAAM,GAAGA,gBAAe;AACnG,UAAM,MAAM,OAAuB,IAAI;AACvC,UAAM,SAAS,aAAaA,aAAY,GAAG;AAC3C,UAAM,EAAE,aAAa,IAAI,WAAW,EAAE,aAAa,UAAU,CAAC;AAC9D,UAAM,mBAAmB,WAAW,mCAAmC,SAAS;AAEhF,WACE,qBACE,oBAAC,WAAQ,WAAW,kBAAmB,GAAG,aAAa,EAAE,KAAK,QAAQ,GAAG,MAAM,CAAC,GAC7E,UACH;AAAA,EAGN;AACF;AAEA,YAAY,cAAc;AAM1B,IAAM,iBAAiB,WAAgD,CAAC,EAAE,YAAY,WAAW,GAAG,KAAK,GAAG,QAAQ;AAClH,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,aAAa,uDAAuD;AAAA,IACpE;AAAA,EACF;AAEA,SAAO,oBAAC,SAAI,WAAW,kBAAkB,KAAW,GAAG,MAAM;AAC/D,CAAC;AAED,eAAe,cAAc;AAsB7B,IAAM,gBAAgB;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,kBAAkB;AAAA,MACtB;AAAA,MAEA,YAAY,aACV;AAAA,QACE;AAAA,QACA,UAAU,WAAW,yCAAyC,eAAe;AAAA,MAC/E;AAAA,MAEF,YAAY,eACV;AAAA,QACE;AAAA,QACA,UAAU,WAAW,yCAAyC,eAAe;AAAA,MAC/E;AAAA,MAEF,SAAS,YAAY;AAAA,MACrB,SAAS,WAAW;AAAA,MAEpB;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACC,GAAG;AAAA,QACJ,gBAAc;AAAA,QACd,mBAAgB;AAAA,QAChB,qBACE,WACA;AAAA,UACE,iCACG;AAAA;AAAA,YACD,oBAAC,kBAAe,UAAU,mBAAmB,CAAC,GAAG;AAAA,aACnD;AAAA,QACF;AAAA,QAGD;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;AAErB,IAAM,UAAU,OAAO,OAAO,aAAa;AAAA,EAChD,SAAS;AAAA,EACT,QAAQ;AACV,CAAC;","names":["forwardRef"]}
@@ -0,0 +1,88 @@
1
+ import {
2
+ mergeBlockDefinitions
3
+ } from "./chunk-XGAKMQH4.mjs";
4
+
5
+ // src/utils/createBlockMenu.ts
6
+ var DEFAULT_GROUP_TITLE = "\u30B0\u30EB\u30FC\u30D7";
7
+ var buildIdentifier = (type, className) => className ? `${type}.${className}` : type;
8
+ function createBlockMenu(raw, masters) {
9
+ const byIdentifier = /* @__PURE__ */ new Map();
10
+ let currentGroup = DEFAULT_GROUP_TITLE;
11
+ for (const entry of raw) {
12
+ const master = masters[entry.type];
13
+ if (!master) {
14
+ continue;
15
+ }
16
+ if (entry.group !== "" && entry.group !== currentGroup) {
17
+ currentGroup = entry.group;
18
+ }
19
+ const className = entry.class || void 0;
20
+ const identifier = buildIdentifier(entry.type, className);
21
+ const command = {
22
+ name: entry.type,
23
+ identifier,
24
+ label: entry.label || master.label,
25
+ description: master.description,
26
+ iconName: master.icon,
27
+ aliases: master.aliases,
28
+ isTextMenu: master.isTextMenu,
29
+ class: className,
30
+ isDisabled: () => false
31
+ };
32
+ byIdentifier.delete(identifier);
33
+ byIdentifier.set(identifier, { group: currentGroup, command });
34
+ }
35
+ const commandsByGroup = /* @__PURE__ */ new Map();
36
+ const groupOrder = [];
37
+ for (const { group, command } of byIdentifier.values()) {
38
+ if (!commandsByGroup.has(group)) {
39
+ commandsByGroup.set(group, []);
40
+ groupOrder.push(group);
41
+ }
42
+ commandsByGroup.get(group).push(command);
43
+ }
44
+ return groupOrder.map((title, index) => ({
45
+ name: `group-${index + 1}`,
46
+ title,
47
+ commands: commandsByGroup.get(title) ?? []
48
+ }));
49
+ }
50
+
51
+ // src/utils/normalizeSettings.ts
52
+ var defaultFeatures = {
53
+ textItalic: false,
54
+ textUnderline: false,
55
+ textStrike: false,
56
+ textCode: false,
57
+ textMarker: false,
58
+ textColor: false,
59
+ fontSize: false,
60
+ fontFamily: false,
61
+ textSubscript: false,
62
+ textSuperscript: false,
63
+ customClass: false,
64
+ tableBgColor: false,
65
+ imageDefaultLightbox: true
66
+ };
67
+ function normalizeSettings(raw, blockDefinitions) {
68
+ const { features, blockMenus, fontSize, fontFamily, customClass, imageSizes, colorPalette } = raw ?? {};
69
+ const masters = mergeBlockDefinitions(blockDefinitions);
70
+ return {
71
+ features: features ?? defaultFeatures,
72
+ blockMenus: createBlockMenu(blockMenus ?? [], masters),
73
+ fontSize: fontSize ?? [],
74
+ fontFamily: fontFamily ?? [],
75
+ customClass: customClass ?? [],
76
+ imageSizes: imageSizes ?? [],
77
+ colorPalette: colorPalette ?? []
78
+ };
79
+ }
80
+ var DEFAULT_EDITOR_SETTINGS = normalizeSettings();
81
+
82
+ export {
83
+ buildIdentifier,
84
+ defaultFeatures,
85
+ normalizeSettings,
86
+ DEFAULT_EDITOR_SETTINGS
87
+ };
88
+ //# sourceMappingURL=chunk-JYUNKG2P.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/createBlockMenu.ts","../src/utils/normalizeSettings.ts"],"sourcesContent":["import type { BlockMenuItem, BlockTypeMaster, CommandItem } from '../types';\n\n/**\n * PHP SettingsJson から届く、ブロックメニュー 1 件分のコンフィグ値。\n * グループ階層を持たず、entry の配列として送られる。\n */\nexport interface RawBlockMenuEntry {\n type: string;\n label: string;\n class: string;\n group: string;\n}\n\nexport type RawBlockMenu = RawBlockMenuEntry[];\n\n/** 最初の entry が group を指定しなかった場合のフォールバックグループ名。 */\nconst DEFAULT_GROUP_TITLE = 'グループ';\n\n/**\n * type と class から識別子を生成する。\n * - class なし: `type`\n * - class あり: `type.class`\n * allow / deny の判定や、同 type の class 違いを区別する用途で使う。\n */\nexport const buildIdentifier = (type: string, className: string | undefined): string =>\n className ? `${type}.${className}` : type;\n\ninterface PositionedCommand {\n group: string;\n command: CommandItem;\n}\n\n/**\n * API レスポンスの blockMenus を TS マスターと合体させて `BlockMenuItem[]` に展開する。\n *\n * - 入力は entry の配列。マスターに該当 type が無ければ除外。\n * - label が空文字なら master.label を採用、class が空文字なら undefined とする\n * - 空 group は直前の entry の group を引き継ぐ(=admin の挿入順の慣習を維持)\n * - identifier (`type` または `type.class`) を CommandItem に焼き込む\n * - 同 identifier が複数あれば後勝ち(最後の entry の位置・内容で上書き)\n * - isDisabled などのランタイム関数は useBlockMenus.resolveCommands が後段で差し込むため、ここではスタブ\n */\nexport default function createBlockMenu(raw: RawBlockMenu, masters: Record<string, BlockTypeMaster>): BlockMenuItem[] {\n const byIdentifier = new Map<string, PositionedCommand>();\n let currentGroup = DEFAULT_GROUP_TITLE;\n\n for (const entry of raw) {\n const master = masters[entry.type];\n if (!master) {\n continue;\n }\n\n if (entry.group !== '' && entry.group !== currentGroup) {\n currentGroup = entry.group;\n }\n\n const className = entry.class || undefined;\n const identifier = buildIdentifier(entry.type, className);\n const command: CommandItem = {\n name: entry.type,\n identifier,\n label: entry.label || master.label,\n description: master.description,\n iconName: master.icon,\n aliases: master.aliases,\n isTextMenu: master.isTextMenu,\n class: className,\n isDisabled: () => false,\n };\n\n // 後勝ち: Map に identifier をキーにして set し直すと、挿入順は最後の位置に揃う\n byIdentifier.delete(identifier);\n byIdentifier.set(identifier, { group: currentGroup, command });\n }\n\n const commandsByGroup = new Map<string, CommandItem[]>();\n const groupOrder: string[] = [];\n\n for (const { group, command } of byIdentifier.values()) {\n if (!commandsByGroup.has(group)) {\n commandsByGroup.set(group, []);\n groupOrder.push(group);\n }\n commandsByGroup.get(group)!.push(command);\n }\n\n return groupOrder.map((title, index) => ({\n name: `group-${index + 1}`,\n title,\n commands: commandsByGroup.get(title) ?? [],\n }));\n}\n","import createBlockMenu, { type RawBlockMenu } from './createBlockMenu';\nimport { mergeBlockDefinitions } from './mergeBlockDefinitions';\nimport type {\n BlockDefinition,\n CustomClassItem,\n ImageSizesItem,\n FontSizeItem,\n FontFamilyItem,\n FeaturesSetting,\n EditorSettings,\n} from '../types/index';\n\n/**\n * PHP `ACMS_GET_Admin_BlockEditor_SettingsJson`(`ajax/edit/block-editor/settings.json`)が返す\n * 未整形のレスポンス形。このパッケージ自身は fetch しないため、呼び出し側(コア側の\n * データ取得フック)がこの型でレスポンスを受け取り、normalizeSettings に渡して EditorSettings へ変換する。\n */\nexport interface RawSettingsResponse {\n features?: FeaturesSetting;\n blockMenus?: RawBlockMenu;\n fontSize?: FontSizeItem[];\n fontFamily?: FontFamilyItem[];\n customClass?: CustomClassItem[];\n imageSizes?: ImageSizesItem[];\n colorPalette?: string[];\n}\n\nexport const defaultFeatures: FeaturesSetting = {\n textItalic: false,\n textUnderline: false,\n textStrike: false,\n textCode: false,\n textMarker: false,\n textColor: false,\n fontSize: false,\n fontFamily: false,\n textSubscript: false,\n textSuperscript: false,\n customClass: false,\n tableBgColor: false,\n imageDefaultLightbox: true,\n};\n\n/**\n * RawSettingsResponse(サーバーから届く未整形の値)を EditorSettings(パッケージが要求する完全な形)に変換する。\n * 欠けている項目は既定値で埋め、blockMenus は TS 側マスター (BLOCK_DEFINITIONS) と突き合わせて組み立てる。\n * このパッケージ自体はデータを取得しない方針のため、取得済みのレスポンスを整形するここが唯一の変換経路になる。\n *\n * `blockDefinitions` はプラグインが `registerBlockDefinition` で登録した追加マスター。\n * `mergeBlockDefinitions` でコアの `BLOCK_DEFINITIONS` と合成してから `createBlockMenu` に渡す。\n */\nexport function normalizeSettings(\n raw?: RawSettingsResponse,\n blockDefinitions?: Record<string, BlockDefinition>\n): EditorSettings {\n const { features, blockMenus, fontSize, fontFamily, customClass, imageSizes, colorPalette } = raw ?? {};\n const masters = mergeBlockDefinitions(blockDefinitions);\n return {\n features: features ?? defaultFeatures,\n blockMenus: createBlockMenu(blockMenus ?? [], masters),\n fontSize: fontSize ?? [],\n fontFamily: fontFamily ?? [],\n customClass: customClass ?? [],\n imageSizes: imageSizes ?? [],\n colorPalette: colorPalette ?? [],\n };\n}\n\n/** raw レスポンスが無い(未取得・注入なし)場合に使う既定の EditorSettings。 */\nexport const DEFAULT_EDITOR_SETTINGS: EditorSettings = normalizeSettings();\n"],"mappings":";;;;;AAgBA,IAAM,sBAAsB;AAQrB,IAAM,kBAAkB,CAAC,MAAc,cAC5C,YAAY,GAAG,IAAI,IAAI,SAAS,KAAK;AAiBxB,SAAR,gBAAiC,KAAmB,SAA2D;AACpH,QAAM,eAAe,oBAAI,IAA+B;AACxD,MAAI,eAAe;AAEnB,aAAW,SAAS,KAAK;AACvB,UAAM,SAAS,QAAQ,MAAM,IAAI;AACjC,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,QAAI,MAAM,UAAU,MAAM,MAAM,UAAU,cAAc;AACtD,qBAAe,MAAM;AAAA,IACvB;AAEA,UAAM,YAAY,MAAM,SAAS;AACjC,UAAM,aAAa,gBAAgB,MAAM,MAAM,SAAS;AACxD,UAAM,UAAuB;AAAA,MAC3B,MAAM,MAAM;AAAA,MACZ;AAAA,MACA,OAAO,MAAM,SAAS,OAAO;AAAA,MAC7B,aAAa,OAAO;AAAA,MACpB,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,OAAO;AAAA,MACP,YAAY,MAAM;AAAA,IACpB;AAGA,iBAAa,OAAO,UAAU;AAC9B,iBAAa,IAAI,YAAY,EAAE,OAAO,cAAc,QAAQ,CAAC;AAAA,EAC/D;AAEA,QAAM,kBAAkB,oBAAI,IAA2B;AACvD,QAAM,aAAuB,CAAC;AAE9B,aAAW,EAAE,OAAO,QAAQ,KAAK,aAAa,OAAO,GAAG;AACtD,QAAI,CAAC,gBAAgB,IAAI,KAAK,GAAG;AAC/B,sBAAgB,IAAI,OAAO,CAAC,CAAC;AAC7B,iBAAW,KAAK,KAAK;AAAA,IACvB;AACA,oBAAgB,IAAI,KAAK,EAAG,KAAK,OAAO;AAAA,EAC1C;AAEA,SAAO,WAAW,IAAI,CAAC,OAAO,WAAW;AAAA,IACvC,MAAM,SAAS,QAAQ,CAAC;AAAA,IACxB;AAAA,IACA,UAAU,gBAAgB,IAAI,KAAK,KAAK,CAAC;AAAA,EAC3C,EAAE;AACJ;;;AChEO,IAAM,kBAAmC;AAAA,EAC9C,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,sBAAsB;AACxB;AAUO,SAAS,kBACd,KACA,kBACgB;AAChB,QAAM,EAAE,UAAU,YAAY,UAAU,YAAY,aAAa,YAAY,aAAa,IAAI,OAAO,CAAC;AACtG,QAAM,UAAU,sBAAsB,gBAAgB;AACtD,SAAO;AAAA,IACL,UAAU,YAAY;AAAA,IACtB,YAAY,gBAAgB,cAAc,CAAC,GAAG,OAAO;AAAA,IACrD,UAAU,YAAY,CAAC;AAAA,IACvB,YAAY,cAAc,CAAC;AAAA,IAC3B,aAAa,eAAe,CAAC;AAAA,IAC7B,YAAY,cAAc,CAAC;AAAA,IAC3B,cAAc,gBAAgB,CAAC;AAAA,EACjC;AACF;AAGO,IAAM,0BAA0C,kBAAkB;","names":[]}
@@ -0,0 +1,56 @@
1
+ import {
2
+ Toolbar
3
+ } from "./chunk-HNSTT2Z4.mjs";
4
+ import {
5
+ Icon
6
+ } from "./chunk-57Q3DEDF.mjs";
7
+
8
+ // src/components/panels/AlignPicker/AlignPicker.tsx
9
+ import {
10
+ Menu,
11
+ MenuTrigger,
12
+ MenuList,
13
+ MenuGroup,
14
+ MenuItemRadio,
15
+ MenuItemRadioGroup,
16
+ MenuPopover
17
+ } from "@ablogcms/components/dropdown-menu";
18
+ import { jsx, jsxs } from "react/jsx-runtime";
19
+ function AlignPicker({ align, onChange }) {
20
+ return /* @__PURE__ */ jsxs(Menu, { closeOnSelect: true, children: [
21
+ /* @__PURE__ */ jsx(MenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Toolbar.Button, { type: "button", tooltip: "\u914D\u7F6E", "aria-label": "\u914D\u7F6E\u3092\u8A2D\u5B9A", children: [
22
+ align === "left" && /* @__PURE__ */ jsx(Icon, { name: "format_align_left" }),
23
+ align === "center" && /* @__PURE__ */ jsx(Icon, { name: "format_align_center" }),
24
+ align === "right" && /* @__PURE__ */ jsx(Icon, { name: "format_align_right" }),
25
+ /* @__PURE__ */ jsx(Icon, { name: "keyboard_arrow_down" })
26
+ ] }) }),
27
+ /* @__PURE__ */ jsx(MenuPopover, { size: "medium", "data-elevation": "3", children: /* @__PURE__ */ jsx(MenuList, { children: /* @__PURE__ */ jsx(MenuGroup, { title: "\u914D\u7F6E", children: /* @__PURE__ */ jsxs(
28
+ MenuItemRadioGroup,
29
+ {
30
+ defaultValue: align,
31
+ onValueChange: (value) => {
32
+ onChange(value);
33
+ },
34
+ children: [
35
+ /* @__PURE__ */ jsxs(MenuItemRadio, { value: "left", children: [
36
+ /* @__PURE__ */ jsx(Icon, { name: "format_align_left" }),
37
+ "\u5DE6\u63C3\u3048"
38
+ ] }, "align-left"),
39
+ /* @__PURE__ */ jsxs(MenuItemRadio, { value: "center", children: [
40
+ /* @__PURE__ */ jsx(Icon, { name: "format_align_center" }),
41
+ "\u4E2D\u592E\u63C3\u3048"
42
+ ] }, "align-center"),
43
+ /* @__PURE__ */ jsxs(MenuItemRadio, { value: "right", children: [
44
+ /* @__PURE__ */ jsx(Icon, { name: "format_align_right" }),
45
+ "\u53F3\u63C3\u3048"
46
+ ] }, "align-right")
47
+ ]
48
+ }
49
+ ) }) }) })
50
+ ] });
51
+ }
52
+
53
+ export {
54
+ AlignPicker
55
+ };
56
+ //# sourceMappingURL=chunk-OFWQRNO2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/panels/AlignPicker/AlignPicker.tsx"],"sourcesContent":["import {\n Menu,\n MenuTrigger,\n MenuList,\n MenuGroup,\n MenuItemRadio,\n MenuItemRadioGroup,\n MenuPopover,\n} from '@ablogcms/components/dropdown-menu';\nimport { Toolbar } from '../../ui/Toolbar';\nimport { Icon } from '../../ui/Icon';\n\nexport type AlignPickerProps = {\n align: 'left' | 'center' | 'right';\n onChange: (align: 'left' | 'center' | 'right') => void;\n};\n\nexport function AlignPicker({ align, onChange }: AlignPickerProps) {\n return (\n <Menu closeOnSelect>\n <MenuTrigger asChild>\n <Toolbar.Button type=\"button\" tooltip=\"配置\" aria-label=\"配置を設定\">\n {align === 'left' && <Icon name=\"format_align_left\" />}\n {align === 'center' && <Icon name=\"format_align_center\" />}\n {align === 'right' && <Icon name=\"format_align_right\" />}\n <Icon name=\"keyboard_arrow_down\" />\n </Toolbar.Button>\n </MenuTrigger>\n <MenuPopover size=\"medium\" data-elevation=\"3\">\n <MenuList>\n <MenuGroup title=\"配置\">\n <MenuItemRadioGroup\n defaultValue={align}\n onValueChange={(value) => {\n onChange(value as 'left' | 'center' | 'right');\n }}\n >\n <MenuItemRadio key=\"align-left\" value=\"left\">\n <Icon name=\"format_align_left\" />\n 左揃え\n </MenuItemRadio>\n <MenuItemRadio key=\"align-center\" value=\"center\">\n <Icon name=\"format_align_center\" />\n 中央揃え\n </MenuItemRadio>\n <MenuItemRadio key=\"align-right\" value=\"right\">\n <Icon name=\"format_align_right\" />\n 右揃え\n </MenuItemRadio>\n </MenuItemRadioGroup>\n </MenuGroup>\n </MenuList>\n </MenuPopover>\n </Menu>\n );\n}\n"],"mappings":";;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAaC,SACuB,KADvB;AAJD,SAAS,YAAY,EAAE,OAAO,SAAS,GAAqB;AACjE,SACE,qBAAC,QAAK,eAAa,MACjB;AAAA,wBAAC,eAAY,SAAO,MAClB,+BAAC,QAAQ,QAAR,EAAe,MAAK,UAAS,SAAQ,gBAAK,cAAW,kCACnD;AAAA,gBAAU,UAAU,oBAAC,QAAK,MAAK,qBAAoB;AAAA,MACnD,UAAU,YAAY,oBAAC,QAAK,MAAK,uBAAsB;AAAA,MACvD,UAAU,WAAW,oBAAC,QAAK,MAAK,sBAAqB;AAAA,MACtD,oBAAC,QAAK,MAAK,uBAAsB;AAAA,OACnC,GACF;AAAA,IACA,oBAAC,eAAY,MAAK,UAAS,kBAAe,KACxC,8BAAC,YACC,8BAAC,aAAU,OAAM,gBACf;AAAA,MAAC;AAAA;AAAA,QACC,cAAc;AAAA,QACd,eAAe,CAAC,UAAU;AACxB,mBAAS,KAAoC;AAAA,QAC/C;AAAA,QAEA;AAAA,+BAAC,iBAA+B,OAAM,QACpC;AAAA,gCAAC,QAAK,MAAK,qBAAoB;AAAA,YAAE;AAAA,eADhB,YAGnB;AAAA,UACA,qBAAC,iBAAiC,OAAM,UACtC;AAAA,gCAAC,QAAK,MAAK,uBAAsB;AAAA,YAAE;AAAA,eADlB,cAGnB;AAAA,UACA,qBAAC,iBAAgC,OAAM,SACrC;AAAA,gCAAC,QAAK,MAAK,sBAAqB;AAAA,YAAE;AAAA,eADjB,aAGnB;AAAA;AAAA;AAAA,IACF,GACF,GACF,GACF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,61 @@
1
+ // src/extensions/MultiColumn/Columns.ts
2
+ import { Node, mergeAttributes } from "@tiptap/core";
3
+ var Columns = Node.create({
4
+ name: "columns",
5
+ group: "columns",
6
+ // 1-3カラムまで対応
7
+ content: "column column? column?",
8
+ defining: true,
9
+ isolating: true,
10
+ addAttributes() {
11
+ return {
12
+ layout: {
13
+ default: "two-column" /* TwoColumn */,
14
+ parseHTML: (element) => element.getAttribute("data-layout"),
15
+ renderHTML: (attributes) => ({
16
+ "data-layout": attributes.layout
17
+ })
18
+ }
19
+ };
20
+ },
21
+ addCommands() {
22
+ return {
23
+ setColumns: (layout = "two-column" /* TwoColumn */) => ({ commands }) => {
24
+ let count = 2;
25
+ if (layout === "one-column" /* OneColumn */) {
26
+ count = 1;
27
+ } else if (layout === "three-column" /* ThreeColumn */) {
28
+ count = 3;
29
+ }
30
+ const columns = Array.from({ length: count }, () => '<div data-type="column"><p></p></div>');
31
+ return commands.insertContent(`<div data-type="columns" data-layout="${layout}">${columns.join("")}</div>`);
32
+ },
33
+ setLayout: (layout) => ({ commands }) => commands.updateAttributes("columns", { layout })
34
+ };
35
+ },
36
+ renderHTML({ HTMLAttributes }) {
37
+ const layout = HTMLAttributes["data-layout"] || "two-column" /* TwoColumn */;
38
+ return [
39
+ "div",
40
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
41
+ id: HTMLAttributes.id,
42
+ class: `layout-${layout}`,
43
+ "data-type": "columns",
44
+ "data-layout": layout
45
+ }),
46
+ 0
47
+ ];
48
+ },
49
+ parseHTML() {
50
+ return [
51
+ {
52
+ tag: 'div[data-type="columns"]'
53
+ }
54
+ ];
55
+ }
56
+ });
57
+
58
+ export {
59
+ Columns
60
+ };
61
+ //# sourceMappingURL=chunk-OZG2BL6F.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extensions/MultiColumn/Columns.ts"],"sourcesContent":["import { Node, mergeAttributes } from '@tiptap/core';\n\nexport enum ColumnLayout {\n OneColumn = 'one-column',\n TwoColumn = 'two-column',\n ThreeColumn = 'three-column',\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n columns: {\n setColumns: (layout?: ColumnLayout) => ReturnType;\n setLayout: (layout: ColumnLayout) => ReturnType;\n };\n }\n}\n\nexport const Columns = Node.create({\n name: 'columns',\n\n group: 'columns',\n\n // 1-3カラムまで対応\n content: 'column column? column?',\n\n defining: true,\n\n isolating: true,\n\n addAttributes() {\n return {\n layout: {\n default: ColumnLayout.TwoColumn,\n parseHTML: (element) => element.getAttribute('data-layout'),\n renderHTML: (attributes) => ({\n 'data-layout': attributes.layout,\n }),\n },\n };\n },\n\n addCommands() {\n return {\n setColumns:\n (layout = ColumnLayout.TwoColumn) =>\n ({ commands }) => {\n let count = 2;\n if (layout === ColumnLayout.OneColumn) {\n count = 1;\n } else if (layout === ColumnLayout.ThreeColumn) {\n count = 3;\n }\n const columns = Array.from({ length: count }, () => '<div data-type=\"column\"><p></p></div>');\n\n return commands.insertContent(`<div data-type=\"columns\" data-layout=\"${layout}\">${columns.join('')}</div>`);\n },\n setLayout:\n (layout: ColumnLayout) =>\n ({ commands }) =>\n commands.updateAttributes('columns', { layout }),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const layout = HTMLAttributes['data-layout'] || ColumnLayout.TwoColumn;\n\n return [\n 'div',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n id: HTMLAttributes.id,\n class: `layout-${layout}`,\n 'data-type': 'columns',\n 'data-layout': layout,\n }),\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"columns\"]',\n },\n ];\n },\n});\n\nexport default Columns;\n"],"mappings":";AAAA,SAAS,MAAM,uBAAuB;AAiB/B,IAAM,UAAU,KAAK,OAAO;AAAA,EACjC,MAAM;AAAA,EAEN,OAAO;AAAA;AAAA,EAGP,SAAS;AAAA,EAET,UAAU;AAAA,EAEV,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,aAAa;AAAA,QAC1D,YAAY,CAAC,gBAAgB;AAAA,UAC3B,eAAe,WAAW;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,YACE,CAAC,SAAS,iCACV,CAAC,EAAE,SAAS,MAAM;AAChB,YAAI,QAAQ;AACZ,YAAI,WAAW,8BAAwB;AACrC,kBAAQ;AAAA,QACV,WAAW,WAAW,kCAA0B;AAC9C,kBAAQ;AAAA,QACV;AACA,cAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,MAAM,uCAAuC;AAE3F,eAAO,SAAS,cAAc,yCAAyC,MAAM,KAAK,QAAQ,KAAK,EAAE,CAAC,QAAQ;AAAA,MAC5G;AAAA,MACF,WACE,CAAC,WACD,CAAC,EAAE,SAAS,MACV,SAAS,iBAAiB,WAAW,EAAE,OAAO,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,eAAe,GAAG;AAC7B,UAAM,SAAS,eAAe,aAAa,KAAK;AAEhD,WAAO;AAAA,MACL;AAAA,MACA,gBAAgB,KAAK,QAAQ,gBAAgB,gBAAgB;AAAA,QAC3D,IAAI,eAAe;AAAA,QACnB,OAAO,UAAU,MAAM;AAAA,QACvB,aAAa;AAAA,QACb,eAAe;AAAA,MACjB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF,CAAC;","names":[]}