@godxjp/ui 31.26.2 → 31.28.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 (54) hide show
  1. package/agent/START-HERE.md +7 -7
  2. package/agent/components/BlockEditor.json +91 -0
  3. package/agent/components/CommandPalette.json +5 -0
  4. package/agent/components/EmojiPicker.json +78 -0
  5. package/agent/components/Markdown.json +16 -0
  6. package/agent/components/PageContainer.json +11 -1
  7. package/agent/components/PageCover.json +75 -0
  8. package/agent/components/Tree.json +6 -0
  9. package/agent/components-index.json +15 -0
  10. package/agent/components.json +282 -1
  11. package/agent/index.json +8 -8
  12. package/agent/llms.txt +7 -7
  13. package/agent/tokens.json +108 -0
  14. package/dist/components/data-display/tree.js +5 -0
  15. package/dist/components/data-entry/command-palette.d.ts +5 -0
  16. package/dist/components/data-entry/command-palette.js +1 -0
  17. package/dist/components/data-entry/emoji-data.d.ts +43 -0
  18. package/dist/components/data-entry/emoji-data.js +54 -0
  19. package/dist/components/data-entry/emoji-picker.d.ts +13 -0
  20. package/dist/components/data-entry/emoji-picker.js +272 -0
  21. package/dist/components/data-entry/index.d.ts +2 -0
  22. package/dist/components/data-entry/index.js +2 -0
  23. package/dist/components/layout/index.d.ts +2 -0
  24. package/dist/components/layout/index.js +2 -0
  25. package/dist/components/layout/page-container.d.ts +1 -1
  26. package/dist/components/layout/page-container.js +8 -1
  27. package/dist/components/layout/page-cover.d.ts +14 -0
  28. package/dist/components/layout/page-cover.js +127 -0
  29. package/dist/contracts/measurement.json +1 -1
  30. package/dist/i18n/messages/en.json +25 -0
  31. package/dist/i18n/messages/ja.json +25 -0
  32. package/dist/i18n/messages/vi.json +25 -0
  33. package/dist/props/components/data-display.prop.d.ts +6 -0
  34. package/dist/props/components/data-entry.prop.d.ts +26 -0
  35. package/dist/props/components/layout.prop.d.ts +49 -2
  36. package/dist/props/registry.d.ts +85 -1
  37. package/dist/props/registry.js +95 -1
  38. package/dist/styles/control.css +81 -0
  39. package/dist/styles/data-display-layout.css +315 -2
  40. package/dist/styles/focus-ring.css +4 -0
  41. package/dist/styles/layers.json +26 -1
  42. package/dist/styles/layout.css +113 -0
  43. package/dist/tokens/components/control.css +10 -0
  44. package/dist/tokens/components/data-display.css +9 -0
  45. package/dist/tokens/semantic/layout.css +14 -0
  46. package/docs/FRAME-COVERAGE-REPORT.md +5 -2
  47. package/docs/data-entry/block-editor.tsx +105 -0
  48. package/docs/data-entry/emoji-picker.tsx +35 -0
  49. package/docs/i18n/messages/en.json +40 -0
  50. package/docs/i18n/messages/ja.json +40 -0
  51. package/docs/i18n/messages/vi.json +40 -0
  52. package/docs/layout/page-cover.tsx +56 -0
  53. package/package.json +28 -4
  54. package/scripts/prune-css.mjs +1 -1
@@ -0,0 +1,105 @@
1
+ import * as React from "react";
2
+ import { BlockEditor } from "@godxjp/block-editor";
3
+ import {
4
+ Card,
5
+ CardContent,
6
+ CardDescription,
7
+ CardHeader,
8
+ CardTitle,
9
+ CodeBlock,
10
+ } from "@godxjp/ui/data-display";
11
+ import { Form, FormField } from "@godxjp/ui/data-entry";
12
+ import { Button } from "@godxjp/ui/general";
13
+ import { useTranslation } from "@godxjp/ui/i18n";
14
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
15
+
16
+ import shot from "../assets/shot-landscape.svg";
17
+
18
+ const initial = `# 議事録 2026-10-05
19
+
20
+ > [!NOTE] 次回まで
21
+ > 決済モジュールの再発行は **税率変更後** のケースを追加する
22
+
23
+ - [ ] 仕様の確認
24
+ - [x] [[Guide|設計ガイド]] の更新
25
+
26
+ :::toggle[詳細]
27
+ 「/」でブロックを挿入、⋮⋮ でドラッグ。
28
+ :::
29
+ `;
30
+
31
+ /** The host's page index — targets are ids, labels are localized like any other copy. */
32
+ const PAGES = [
33
+ { target: "Guide", labelKey: "blockEditorDocs.pages.guide" },
34
+ { target: "Setup", labelKey: "blockEditorDocs.pages.setup" },
35
+ { target: "Release", labelKey: "blockEditorDocs.pages.release" },
36
+ ] as const;
37
+
38
+ /** Stands in for the host's storage: a real app uploads the file and returns `asset:<id>`. */
39
+ async function demoUpload(file: File) {
40
+ await new Promise((resolve) => setTimeout(resolve, 800));
41
+ return { url: shot, name: file.name };
42
+ }
43
+
44
+ /**
45
+ * @godxjp/block-editor — the block editor (gh#1156). A page form: the editor inside a FormField,
46
+ * the Markdown it saves shown beside it (exactly what `normalize()` returns), files through the
47
+ * host's `upload`, `[[` suggestions from the host's page index.
48
+ */
49
+ export default function Demo() {
50
+ const { t } = useTranslation();
51
+ const [body, setBody] = React.useState(initial);
52
+ return (
53
+ <PageContainer title="BlockEditor" subtitle={t("blockEditorDocs.subtitle")}>
54
+ <Card>
55
+ <CardHeader>
56
+ <CardTitle level={2}>{t("blockEditorDocs.edit.title")}</CardTitle>
57
+ <CardDescription>{t("blockEditorDocs.edit.description")}</CardDescription>
58
+ </CardHeader>
59
+ <CardContent>
60
+ <Form onSubmit={(event) => event.preventDefault()}>
61
+ <Flex direction="col" gap="md">
62
+ <FormField id="block-body" label={t("blockEditorDocs.edit.label")}>
63
+ <BlockEditor
64
+ value={body}
65
+ onValueChange={setBody}
66
+ upload={demoUpload}
67
+ suggestWikilinks={(query) =>
68
+ PAGES.map((p) => ({ target: p.target, label: t(p.labelKey) })).filter((p) =>
69
+ `${p.target} ${p.label}`.toLowerCase().includes(query.toLowerCase()),
70
+ )
71
+ }
72
+ />
73
+ </FormField>
74
+ <Flex justify="end">
75
+ <Button type="submit">{t("blockEditorDocs.edit.save")}</Button>
76
+ </Flex>
77
+ </Flex>
78
+ </Form>
79
+ </CardContent>
80
+ </Card>
81
+ <Card>
82
+ <CardHeader>
83
+ <CardTitle level={2}>{t("blockEditorDocs.markdown.title")}</CardTitle>
84
+ <CardDescription>{t("blockEditorDocs.markdown.description")}</CardDescription>
85
+ </CardHeader>
86
+ <CardContent>
87
+ <CodeBlock language="markdown">{body}</CodeBlock>
88
+ </CardContent>
89
+ </Card>
90
+ <Card>
91
+ <CardHeader>
92
+ <CardTitle level={2}>{t("blockEditorDocs.readOnly.title")}</CardTitle>
93
+ <CardDescription>{t("blockEditorDocs.readOnly.description")}</CardDescription>
94
+ </CardHeader>
95
+ <CardContent>
96
+ <BlockEditor
97
+ defaultValue={initial}
98
+ readOnly
99
+ aria-label={t("blockEditorDocs.readOnly.label")}
100
+ />
101
+ </CardContent>
102
+ </Card>
103
+ </PageContainer>
104
+ );
105
+ }
@@ -0,0 +1,35 @@
1
+ import * as React from "react";
2
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
3
+ import { EmojiPicker, FormField } from "@godxjp/ui/data-entry";
4
+ import { Text } from "@godxjp/ui/general";
5
+ import { useTranslation } from "@godxjp/ui/i18n";
6
+ import { Flex, PageContainer } from "@godxjp/ui/layout";
7
+
8
+ /**
9
+ * EmojiPicker (gh#1164) — a page icon chosen from the active language's emoji keywords, with
10
+ * recents and "remove icon".
11
+ */
12
+ export default function Demo() {
13
+ const { t } = useTranslation();
14
+ const [icon, setIcon] = React.useState<string | null>(null);
15
+ return (
16
+ <PageContainer title="EmojiPicker" subtitle={t("emojiPickerDocs.subtitle")}>
17
+ <Card>
18
+ <CardHeader>
19
+ <CardTitle level={2}>{t("emojiPickerDocs.title")}</CardTitle>
20
+ <CardDescription>{t("emojiPickerDocs.description")}</CardDescription>
21
+ </CardHeader>
22
+ <CardContent>
23
+ <Flex direction="col" gap="sm">
24
+ <FormField id="page-icon" label={t("emojiPickerDocs.label")}>
25
+ <EmojiPicker value={icon} onValueChange={setIcon} />
26
+ </FormField>
27
+ <Text size="sm" tone="muted">
28
+ {icon ? t("emojiPickerDocs.chosen", { icon }) : t("emojiPickerDocs.none")}
29
+ </Text>
30
+ </Flex>
31
+ </CardContent>
32
+ </Card>
33
+ </PageContainer>
34
+ );
35
+ }
@@ -1598,5 +1598,45 @@
1598
1598
  "description": "The toolbar stays focusable, but its actions do nothing.",
1599
1599
  "label": "Body (view only)"
1600
1600
  }
1601
+ },
1602
+ "blockEditorDocs": {
1603
+ "subtitle": "@godxjp/block-editor · / block menu · drag handle · format toolbar · saves Markdown",
1604
+ "edit": {
1605
+ "title": "Edit a page",
1606
+ "description": "Type / for blocks, select text for formatting, drag ⋮⋮ to move a block (Alt+Shift+↑↓ from the keyboard).",
1607
+ "label": "Body",
1608
+ "save": "Save"
1609
+ },
1610
+ "markdown": {
1611
+ "title": "What it saves",
1612
+ "description": "The canonical Markdown — exactly what normalize() from @godxjp/markdown/codec returns.",
1613
+ "label": "Markdown"
1614
+ },
1615
+ "readOnly": {
1616
+ "title": "Read-only",
1617
+ "description": "No handle, no menus; the body renders as Prose.",
1618
+ "label": "Body (view only)"
1619
+ },
1620
+ "pages": {
1621
+ "guide": "Design guide",
1622
+ "setup": "Setup",
1623
+ "release": "Release steps"
1624
+ }
1625
+ },
1626
+ "pageCoverDocs": {
1627
+ "title": "Quarterly planning notes",
1628
+ "icon": "Page icon",
1629
+ "reposition": "Reposition",
1630
+ "done": "Done",
1631
+ "body": "Drag the cover while repositioning, or use the arrow keys; the icon opens the emoji picker.",
1632
+ "position": "Focal point: {value}% from the top"
1633
+ },
1634
+ "emojiPickerDocs": {
1635
+ "subtitle": "Search in your language · categories · recents · keyboard grid",
1636
+ "title": "Choose a page icon",
1637
+ "description": "Type a keyword in the current language, or browse the categories. Arrow keys move through the grid; Enter picks.",
1638
+ "label": "Icon",
1639
+ "chosen": "Chosen: {icon}",
1640
+ "none": "No icon"
1601
1641
  }
1602
1642
  }
@@ -1591,5 +1591,45 @@
1591
1591
  "description": "ツールバーはフォーカスできますが、操作は無効です。",
1592
1592
  "label": "本文(閲覧のみ)"
1593
1593
  }
1594
+ },
1595
+ "blockEditorDocs": {
1596
+ "subtitle": "@godxjp/block-editor · 「/」でブロック · ドラッグハンドル · 書式ツールバー · Markdown で保存",
1597
+ "edit": {
1598
+ "title": "ページを編集",
1599
+ "description": "「/」でブロックを挿入、文字を選ぶと書式、⋮⋮ でブロックを移動(キーボードは Alt+Shift+↑↓)。",
1600
+ "label": "本文",
1601
+ "save": "保存"
1602
+ },
1603
+ "markdown": {
1604
+ "title": "保存される内容",
1605
+ "description": "正規化された Markdown — @godxjp/markdown/codec の normalize() と同じ結果です。",
1606
+ "label": "Markdown"
1607
+ },
1608
+ "readOnly": {
1609
+ "title": "閲覧のみ",
1610
+ "description": "ハンドルもメニューも出ません。本文は Prose で表示されます。",
1611
+ "label": "本文(閲覧のみ)"
1612
+ },
1613
+ "pages": {
1614
+ "guide": "設計ガイド",
1615
+ "setup": "セットアップ",
1616
+ "release": "リリース手順"
1617
+ }
1618
+ },
1619
+ "pageCoverDocs": {
1620
+ "title": "四半期計画メモ",
1621
+ "icon": "ページアイコン",
1622
+ "reposition": "位置を調整",
1623
+ "done": "完了",
1624
+ "body": "位置を調整中はカバー画像をドラッグするか矢印キーで動かせます。アイコンを押すと絵文字ピッカーが開きます。",
1625
+ "position": "焦点: 上から {value}%"
1626
+ },
1627
+ "emojiPickerDocs": {
1628
+ "subtitle": "言語に合わせた検索 · カテゴリ · 最近使った絵文字 · キーボード操作",
1629
+ "title": "ページアイコンを選ぶ",
1630
+ "description": "表示中の言語でキーワードを入力するか、カテゴリから選びます。矢印キーで移動し、Enter で決定します。",
1631
+ "label": "アイコン",
1632
+ "chosen": "選択中: {icon}",
1633
+ "none": "アイコンなし"
1594
1634
  }
1595
1635
  }
@@ -1591,5 +1591,45 @@
1591
1591
  "description": "Thanh công cụ vẫn nhận focus nhưng thao tác bị vô hiệu.",
1592
1592
  "label": "Nội dung (chỉ xem)"
1593
1593
  }
1594
+ },
1595
+ "blockEditorDocs": {
1596
+ "subtitle": "@godxjp/block-editor · menu khối / · tay nắm kéo · thanh định dạng · lưu Markdown",
1597
+ "edit": {
1598
+ "title": "Sửa trang",
1599
+ "description": "Gõ / để chèn khối, chọn chữ để định dạng, kéo ⋮⋮ để di chuyển khối (bàn phím: Alt+Shift+↑↓).",
1600
+ "label": "Nội dung",
1601
+ "save": "Lưu"
1602
+ },
1603
+ "markdown": {
1604
+ "title": "Nội dung được lưu",
1605
+ "description": "Markdown chuẩn hoá — đúng kết quả normalize() của @godxjp/markdown/codec.",
1606
+ "label": "Markdown"
1607
+ },
1608
+ "readOnly": {
1609
+ "title": "Chỉ xem",
1610
+ "description": "Không có tay nắm, không có menu; nội dung hiển thị bằng Prose.",
1611
+ "label": "Nội dung (chỉ xem)"
1612
+ },
1613
+ "pages": {
1614
+ "guide": "Hướng dẫn thiết kế",
1615
+ "setup": "Cài đặt",
1616
+ "release": "Các bước phát hành"
1617
+ }
1618
+ },
1619
+ "pageCoverDocs": {
1620
+ "title": "Ghi chú kế hoạch quý",
1621
+ "icon": "Biểu tượng trang",
1622
+ "reposition": "Chỉnh vị trí",
1623
+ "done": "Xong",
1624
+ "body": "Khi đang chỉnh vị trí, kéo ảnh bìa hoặc dùng phím mũi tên; bấm biểu tượng để mở bộ chọn emoji.",
1625
+ "position": "Tiêu điểm: {value}% tính từ trên"
1626
+ },
1627
+ "emojiPickerDocs": {
1628
+ "subtitle": "Tìm theo ngôn ngữ · danh mục · dùng gần đây · điều khiển bằng bàn phím",
1629
+ "title": "Chọn biểu tượng trang",
1630
+ "description": "Gõ từ khoá theo ngôn ngữ hiện tại hoặc duyệt danh mục. Phím mũi tên để di chuyển, Enter để chọn.",
1631
+ "label": "Biểu tượng",
1632
+ "chosen": "Đã chọn: {icon}",
1633
+ "none": "Không có biểu tượng"
1594
1634
  }
1595
1635
  }
@@ -0,0 +1,56 @@
1
+ import * as React from "react";
2
+ import { Prose } from "@godxjp/ui/data-display";
3
+ import { EmojiPicker } from "@godxjp/ui/data-entry";
4
+ import { Button, Text } from "@godxjp/ui/general";
5
+ import { useTranslation } from "@godxjp/ui/i18n";
6
+ import { PageContainer, PageCover } from "@godxjp/ui/layout";
7
+
8
+ import shot from "../assets/shot-landscape.svg";
9
+
10
+ /**
11
+ * PageCover + PageContainer `icon` / headerScale="display" (gh#1160) — a Notion / note.com page:
12
+ * a banner cover you can reposition (drag, or the arrow keys while repositioning), the page icon
13
+ * over its edge (chosen with EmojiPicker), and the article's display-size title.
14
+ */
15
+ export default function Demo() {
16
+ const { t } = useTranslation();
17
+ const [y, setY] = React.useState(40);
18
+ const [moving, setMoving] = React.useState(false);
19
+ const [icon, setIcon] = React.useState<string | null>("📘");
20
+ return (
21
+ <PageContainer
22
+ title={t("pageCoverDocs.title")}
23
+ headerScale="display"
24
+ icon={
25
+ <EmojiPicker
26
+ value={icon}
27
+ onValueChange={setIcon}
28
+ size="lg"
29
+ aria-label={t("pageCoverDocs.icon")}
30
+ />
31
+ }
32
+ cover={
33
+ <PageCover
34
+ src={shot}
35
+ alt=""
36
+ positionY={y}
37
+ onPositionChange={setY}
38
+ repositioning={moving}
39
+ onRepositioningChange={setMoving}
40
+ actions={
41
+ <Button size="sm" variant="secondary" onClick={() => setMoving((m) => !m)}>
42
+ {moving ? t("pageCoverDocs.done") : t("pageCoverDocs.reposition")}
43
+ </Button>
44
+ }
45
+ />
46
+ }
47
+ >
48
+ <Prose measure="medium">
49
+ <p>{t("pageCoverDocs.body")}</p>
50
+ </Prose>
51
+ <Text size="sm" tone="muted">
52
+ {t("pageCoverDocs.position", { value: y })}
53
+ </Text>
54
+ </PageContainer>
55
+ );
56
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@godxjp/ui",
3
- "version": "31.26.2",
4
- "godxUiMcp": "31.26.2",
3
+ "version": "31.28.0",
4
+ "godxUiMcp": "31.28.0",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -315,7 +315,7 @@
315
315
  "audit:component-cases": "node scripts/check-component-case-evidence.mjs",
316
316
  "audit:examples": "node scripts/ui-audit.mjs docs",
317
317
  "build": "tsup && tsc -p tsconfig.build.json && node scripts/copy-styles.mjs && node scripts/fix-esm-extensions.mjs && node scripts/add-use-client.mjs",
318
- "build:packages": "cd packages/markdown && node ../../node_modules/tsup/dist/cli-default.js && cd ../editor && node ../../node_modules/tsup/dist/cli-default.js",
318
+ "build:packages": "cd packages/markdown && node ../../node_modules/tsup/dist/cli-default.js && cd ../editor && node ../../node_modules/tsup/dist/cli-default.js && cd ../block-editor && node ../../node_modules/tsup/dist/cli-default.js",
319
319
  "build:jis-level1-fonts": "node scripts/build-jis-level1-fonts.mjs",
320
320
  "capture:voiceover": "node scripts/capture-voiceover-evidence.mjs",
321
321
  "check:agent-catalog": "node scripts/gen-agent-catalog.mjs --check",
@@ -417,7 +417,7 @@
417
417
  "test:visual:topbar-collision": "node scripts/topbar-collision-visual.mjs",
418
418
  "test:watch": "vitest",
419
419
  "typecheck": "node node_modules/typescript-7/bin/tsc --noEmit -p tsconfig.json && pnpm typecheck:packages",
420
- "typecheck:packages": "node node_modules/typescript-7/bin/tsc --noEmit -p packages/markdown/tsconfig.json && node node_modules/typescript-7/bin/tsc --noEmit -p packages/editor/tsconfig.json",
420
+ "typecheck:packages": "node node_modules/typescript-7/bin/tsc --noEmit -p packages/markdown/tsconfig.json && node node_modules/typescript-7/bin/tsc --noEmit -p packages/editor/tsconfig.json && node node_modules/typescript-7/bin/tsc --noEmit -p packages/block-editor/tsconfig.json",
421
421
  "typecheck:docs": "node node_modules/typescript-7/bin/tsc --noEmit -p tsconfig.docs.json",
422
422
  "typecheck:mcp": "node node_modules/typescript-7/bin/tsc --noEmit -p mcp/tsconfig.json",
423
423
  "typecheck:ts6": "tsc --noEmit -p tsconfig.json",
@@ -483,6 +483,7 @@
483
483
  "cmdk": "^1.1.1",
484
484
  "date-fns": "^4.1.0",
485
485
  "embla-carousel-react": "^8.6.0",
486
+ "emojibase-data": "^17.0.0",
486
487
  "input-otp": "^1.5.0",
487
488
  "lucide-react": "^1.37.0",
488
489
  "qrcode.react": "4.2.0",
@@ -500,6 +501,7 @@
500
501
  "devDependencies": {
501
502
  "@axe-core/playwright": "^4.13.0",
502
503
  "@eslint/js": "^10.0.1",
504
+ "@floating-ui/dom": "^1.8.0",
503
505
  "@hookform/resolvers": "^5.9.1",
504
506
  "@radix-ui/react-accordion": "^1.2.20",
505
507
  "@radix-ui/react-avatar": "^1.2.6",
@@ -515,6 +517,18 @@
515
517
  "@testing-library/jest-dom": "^7.0.1",
516
518
  "@testing-library/react": "^16.3.3",
517
519
  "@testing-library/user-event": "^14.6.6",
520
+ "@tiptap/core": "3.31.4",
521
+ "@tiptap/extension-bubble-menu": "3.31.4",
522
+ "@tiptap/extension-details": "3.31.4",
523
+ "@tiptap/extension-image": "3.31.4",
524
+ "@tiptap/extension-list": "3.31.4",
525
+ "@tiptap/extension-table": "3.31.4",
526
+ "@tiptap/extension-text-style": "3.31.4",
527
+ "@tiptap/extensions": "3.31.4",
528
+ "@tiptap/pm": "3.31.4",
529
+ "@tiptap/react": "3.31.4",
530
+ "@tiptap/starter-kit": "3.31.4",
531
+ "@tiptap/suggestion": "3.31.4",
518
532
  "@types/hast": "^3.0.5",
519
533
  "@types/mdast": "^4.0.4",
520
534
  "@types/node": "^26.4.0",
@@ -531,7 +545,17 @@
531
545
  "globals": "^17.11.0",
532
546
  "jsdom": "^30.0.1",
533
547
  "jsqr": "^1.4.0",
548
+ "mdast-util-directive": "^3.1.1",
549
+ "mdast-util-from-markdown": "^2.1.0",
550
+ "mdast-util-frontmatter": "^2.0.1",
551
+ "mdast-util-gfm": "^3.1.0",
552
+ "mdast-util-to-markdown": "^2.2.0",
534
553
  "mermaid": "^11.17.2",
554
+ "micromark-extension-cjk-friendly": "^2.0.2",
555
+ "micromark-extension-directive": "^4.0.0",
556
+ "micromark-extension-frontmatter": "^2.0.0",
557
+ "micromark-extension-gfm": "^3.0.0",
558
+ "micromark-util-types": "^2.0.3",
535
559
  "playwright": "^1.62.1",
536
560
  "pngjs": "^7.0.0",
537
561
  "prettier": "^3.9.6",
@@ -128,7 +128,7 @@ let sawNamespace = false;
128
128
  // `@godxjp/editor` / `@godxjp/markdown` too (gh#1114): their components render kit components, and
129
129
  // the manifest maps `MarkdownEditor` to the layers those need.
130
130
  const IMPORT =
131
- /(?:import|export)\s+(type\s+)?([^;'"]*?)\s*from\s*["'](@godxjp\/(?:ui|editor|markdown)(?:\/[^"']*)?)["']/g;
131
+ /(?:import|export)\s+(type\s+)?([^;'"]*?)\s*from\s*["'](@godxjp\/(?:ui|editor|block-editor|markdown)(?:\/[^"']*)?)["']/g;
132
132
  for (const file of new Set(sources)) {
133
133
  const src = readFileSync(file, "utf8");
134
134
  for (const m of src.matchAll(IMPORT)) {