@ablogcms/tooltip 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.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # @ablogcms/tooltip
2
+
3
+ `.js-acms-tooltip` / `.js-acms-tooltip-hover` を持つ要素を監視し、ツールチップ表示と
4
+ アクセシビリティ属性(`aria-describedby` 等)の付与を行う `TooltipManager` を提供するパッケージ。
5
+
6
+ ## 使い方
7
+
8
+ ```tsx
9
+ import { TooltipManager } from '@ablogcms/tooltip';
10
+
11
+ render(<TooltipManager />, element);
12
+ ```
13
+
14
+ ページに 1 度だけマウントすると、初期 DOM とその後 `MutationObserver` で検知した追加要素の
15
+ 両方に対して属性変換・アクセシビリティ属性付与・ツールチップ表示を行う。
package/dist/a11y.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare const setA11yAttributesToTooltipTrigger: (element: HTMLElement, tooltipId: string) => void;
@@ -0,0 +1,86 @@
1
+ // src/tooltip-manager.tsx
2
+ import { Tooltip } from "@ablogcms/components/tooltip";
3
+ import useMutationObserver from "@ablogcms/react-hooks/use-mutation-observer";
4
+ import useEffectOnce from "@ablogcms/react-hooks/use-effect-once";
5
+
6
+ // src/compatibility.ts
7
+ function convertPosition(position) {
8
+ switch (position) {
9
+ case "right":
10
+ return "right";
11
+ case "left":
12
+ return "left";
13
+ case "bottom":
14
+ return "bottom";
15
+ case "top":
16
+ return "top";
17
+ case "top-left":
18
+ return "top-start";
19
+ case "top-right":
20
+ return "top-end";
21
+ case "bottom-left":
22
+ return "bottom-start";
23
+ case "bottom-right":
24
+ return "bottom-end";
25
+ default:
26
+ return "top";
27
+ }
28
+ }
29
+ var fixTooltipAttribute = (element, tooltipId2) => {
30
+ if (!element.hasAttribute("data-tooltip-id")) {
31
+ element.setAttribute("data-tooltip-id", tooltipId2);
32
+ const html = element.getAttribute("data-acms-tooltip") || "\u3053\u3053\u306B\u30D8\u30EB\u30D7\u304C\u5165\u308A\u307E\u3059\u3002";
33
+ element.setAttribute("data-tooltip-html", html);
34
+ element.removeAttribute("data-acms-tooltip");
35
+ const pos = convertPosition(element.getAttribute("data-acms-position"));
36
+ if (pos) {
37
+ element.setAttribute("data-tooltip-place", pos);
38
+ element.removeAttribute("data-acms-position");
39
+ }
40
+ }
41
+ };
42
+
43
+ // src/a11y.ts
44
+ var setA11yAttributesToTooltipTrigger = (element, tooltipId2) => {
45
+ element.setAttribute("role", "button");
46
+ element.setAttribute("tabindex", "0");
47
+ element.setAttribute("aria-label", ACMS.i18n("tooltip.trigger.label"));
48
+ element.setAttribute("aria-describedby", tooltipId2);
49
+ };
50
+
51
+ // src/tooltip-manager.tsx
52
+ import { jsx } from "react/jsx-runtime";
53
+ var selector = ".js-acms-tooltip, .js-acms-tooltip-hover";
54
+ var tooltipId = "acms-tooltip";
55
+ function TooltipManager() {
56
+ useEffectOnce(() => {
57
+ const elements = document.querySelectorAll(selector);
58
+ elements.forEach((element) => fixTooltipAttribute(element, tooltipId));
59
+ elements.forEach((element) => setA11yAttributesToTooltipTrigger(element, tooltipId));
60
+ });
61
+ useMutationObserver(
62
+ (mutations) => {
63
+ for (const mutation of mutations) {
64
+ for (const node of mutation.addedNodes) {
65
+ if (!(node instanceof HTMLElement)) continue;
66
+ if (node.matches(selector)) {
67
+ fixTooltipAttribute(node, tooltipId);
68
+ setA11yAttributesToTooltipTrigger(node, tooltipId);
69
+ }
70
+ const elements = node.querySelectorAll(selector);
71
+ elements.forEach((element) => fixTooltipAttribute(element, tooltipId));
72
+ elements.forEach((element) => setA11yAttributesToTooltipTrigger(element, tooltipId));
73
+ }
74
+ }
75
+ },
76
+ { childList: true, subtree: true },
77
+ document.body
78
+ );
79
+ return /* @__PURE__ */ jsx(Tooltip, { id: tooltipId });
80
+ }
81
+ var tooltip_manager_default = TooltipManager;
82
+
83
+ export {
84
+ tooltip_manager_default
85
+ };
86
+ //# sourceMappingURL=chunk-BSOPUT4P.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tooltip-manager.tsx","../src/compatibility.ts","../src/a11y.ts"],"sourcesContent":["import { Tooltip } from '@ablogcms/components/tooltip';\nimport useMutationObserver from '@ablogcms/react-hooks/use-mutation-observer';\nimport useEffectOnce from '@ablogcms/react-hooks/use-effect-once';\nimport { fixTooltipAttribute } from './compatibility';\nimport { setA11yAttributesToTooltipTrigger } from './a11y';\n\nconst selector = '.js-acms-tooltip, .js-acms-tooltip-hover';\nconst tooltipId = 'acms-tooltip';\n\nfunction TooltipManager() {\n useEffectOnce(() => {\n // 初期要素に変換適用\n const elements = document.querySelectorAll<HTMLElement>(selector);\n elements.forEach((element) => fixTooltipAttribute(element, tooltipId));\n elements.forEach((element) => setA11yAttributesToTooltipTrigger(element, tooltipId));\n });\n\n useMutationObserver(\n (mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (!(node instanceof HTMLElement)) continue;\n if (node.matches(selector)) {\n fixTooltipAttribute(node, tooltipId);\n setA11yAttributesToTooltipTrigger(node, tooltipId);\n }\n const elements = node.querySelectorAll<HTMLElement>(selector);\n elements.forEach((element) => fixTooltipAttribute(element, tooltipId));\n elements.forEach((element) => setA11yAttributesToTooltipTrigger(element, tooltipId));\n }\n }\n },\n { childList: true, subtree: true },\n document.body\n );\n\n return <Tooltip id={tooltipId} />;\n}\n\nexport default TooltipManager;\n","function convertPosition(position?: string | null): string | undefined {\n switch (position) {\n case 'right':\n return 'right';\n case 'left':\n return 'left';\n case 'bottom':\n return 'bottom';\n case 'top':\n return 'top';\n case 'top-left':\n return 'top-start';\n case 'top-right':\n return 'top-end';\n case 'bottom-left':\n return 'bottom-start';\n case 'bottom-right':\n return 'bottom-end';\n default:\n return 'top';\n }\n}\n\n/**\n * ツールチップ要素をReactTooltipの形式に変換\n * 旧ツールチップとの互換性を保つために使用\n * @param element - 変換対象のHTMLElement\n */\nexport const fixTooltipAttribute = (element: HTMLElement, tooltipId: string) => {\n if (!element.hasAttribute('data-tooltip-id')) {\n element.setAttribute('data-tooltip-id', tooltipId);\n\n const html = element.getAttribute('data-acms-tooltip') || 'ここにヘルプが入ります。';\n element.setAttribute('data-tooltip-html', html);\n element.removeAttribute('data-acms-tooltip');\n\n const pos = convertPosition(element.getAttribute('data-acms-position'));\n if (pos) {\n element.setAttribute('data-tooltip-place', pos);\n element.removeAttribute('data-acms-position');\n }\n }\n};\n","export const setA11yAttributesToTooltipTrigger = (element: HTMLElement, tooltipId: string) => {\n element.setAttribute('role', 'button');\n element.setAttribute('tabindex', '0');\n element.setAttribute('aria-label', ACMS.i18n('tooltip.trigger.label'));\n element.setAttribute('aria-describedby', tooltipId);\n};\n"],"mappings":";AAAA,SAAS,eAAe;AACxB,OAAO,yBAAyB;AAChC,OAAO,mBAAmB;;;ACF1B,SAAS,gBAAgB,UAA8C;AACrE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAOO,IAAM,sBAAsB,CAAC,SAAsBA,eAAsB;AAC9E,MAAI,CAAC,QAAQ,aAAa,iBAAiB,GAAG;AAC5C,YAAQ,aAAa,mBAAmBA,UAAS;AAEjD,UAAM,OAAO,QAAQ,aAAa,mBAAmB,KAAK;AAC1D,YAAQ,aAAa,qBAAqB,IAAI;AAC9C,YAAQ,gBAAgB,mBAAmB;AAE3C,UAAM,MAAM,gBAAgB,QAAQ,aAAa,oBAAoB,CAAC;AACtE,QAAI,KAAK;AACP,cAAQ,aAAa,sBAAsB,GAAG;AAC9C,cAAQ,gBAAgB,oBAAoB;AAAA,IAC9C;AAAA,EACF;AACF;;;AC1CO,IAAM,oCAAoC,CAAC,SAAsBC,eAAsB;AAC5F,UAAQ,aAAa,QAAQ,QAAQ;AACrC,UAAQ,aAAa,YAAY,GAAG;AACpC,UAAQ,aAAa,cAAc,KAAK,KAAK,uBAAuB,CAAC;AACrE,UAAQ,aAAa,oBAAoBA,UAAS;AACpD;;;AF+BS;AA9BT,IAAM,WAAW;AACjB,IAAM,YAAY;AAElB,SAAS,iBAAiB;AACxB,gBAAc,MAAM;AAElB,UAAM,WAAW,SAAS,iBAA8B,QAAQ;AAChE,aAAS,QAAQ,CAAC,YAAY,oBAAoB,SAAS,SAAS,CAAC;AACrE,aAAS,QAAQ,CAAC,YAAY,kCAAkC,SAAS,SAAS,CAAC;AAAA,EACrF,CAAC;AAED;AAAA,IACE,CAAC,cAAc;AACb,iBAAW,YAAY,WAAW;AAChC,mBAAW,QAAQ,SAAS,YAAY;AACtC,cAAI,EAAE,gBAAgB,aAAc;AACpC,cAAI,KAAK,QAAQ,QAAQ,GAAG;AAC1B,gCAAoB,MAAM,SAAS;AACnC,8CAAkC,MAAM,SAAS;AAAA,UACnD;AACA,gBAAM,WAAW,KAAK,iBAA8B,QAAQ;AAC5D,mBAAS,QAAQ,CAAC,YAAY,oBAAoB,SAAS,SAAS,CAAC;AACrE,mBAAS,QAAQ,CAAC,YAAY,kCAAkC,SAAS,SAAS,CAAC;AAAA,QACrF;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,WAAW,MAAM,SAAS,KAAK;AAAA,IACjC,SAAS;AAAA,EACX;AAEA,SAAO,oBAAC,WAAQ,IAAI,WAAW;AACjC;AAEA,IAAO,0BAAQ;","names":["tooltipId","tooltipId"]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * ツールチップ要素をReactTooltipの形式に変換
3
+ * 旧ツールチップとの互換性を保つために使用
4
+ * @param element - 変換対象のHTMLElement
5
+ */
6
+ export declare const fixTooltipAttribute: (element: HTMLElement, tooltipId: string) => void;
@@ -0,0 +1 @@
1
+ export { default as TooltipManager } from './tooltip-manager.js';
package/dist/index.mjs ADDED
@@ -0,0 +1,7 @@
1
+ import {
2
+ tooltip_manager_default
3
+ } from "./chunk-BSOPUT4P.mjs";
4
+ export {
5
+ tooltip_manager_default as TooltipManager
6
+ };
7
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ declare function TooltipManager(): import("react").JSX.Element;
2
+ export default TooltipManager;
@@ -0,0 +1,7 @@
1
+ import {
2
+ tooltip_manager_default
3
+ } from "./chunk-BSOPUT4P.mjs";
4
+ export {
5
+ tooltip_manager_default as default
6
+ };
7
+ //# sourceMappingURL=tooltip-manager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@ablogcms/tooltip",
3
+ "version": "3.2.28-beta.0",
4
+ "type": "module",
5
+ "description": "ツールチップ属性監視と表示制御",
6
+ "license": "MIT",
7
+ "homepage": "https://www.a-blogcms.jp",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+ssh://git@bitbucket.org:appleple/ablogcms.git",
11
+ "directory": "packages/frontend/tooltip"
12
+ },
13
+ "sideEffects": false,
14
+ "dependencies": {
15
+ "@ablogcms/components": "3.2.28-beta.0",
16
+ "@ablogcms/react-hooks": "3.2.28-beta.0"
17
+ },
18
+ "devDependencies": {
19
+ "vitest": "^4.1.9"
20
+ },
21
+ "peerDependencies": {
22
+ "react": "^19",
23
+ "@types/react": "^19.2.17"
24
+ },
25
+ "peerDependenciesMeta": {
26
+ "@types/react": {
27
+ "optional": true
28
+ }
29
+ },
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.mjs",
34
+ "default": "./dist/index.mjs"
35
+ },
36
+ "./tooltip-manager": {
37
+ "types": "./dist/tooltip-manager.d.ts",
38
+ "import": "./dist/tooltip-manager.mjs",
39
+ "default": "./dist/tooltip-manager.mjs"
40
+ }
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "files": [
46
+ "dist"
47
+ ],
48
+ "scripts": {
49
+ "build": "node ../../../tools/build-package.mjs"
50
+ }
51
+ }