@san-siva/blogkit 1.1.43 → 1.1.44
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/dist/cjs/components/Checkbox.js +14 -0
- package/dist/cjs/components/Checkbox.js.map +1 -0
- package/dist/cjs/components/WidthModeToggle.js +18 -0
- package/dist/cjs/components/WidthModeToggle.js.map +1 -0
- package/dist/cjs/context/WidthModeContext.js +23 -0
- package/dist/cjs/context/WidthModeContext.js.map +1 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/staticComponents/CheckListStatic.js +2 -1
- package/dist/cjs/staticComponents/CheckListStatic.js.map +1 -1
- package/dist/esm/components/Checkbox.js +10 -0
- package/dist/esm/components/Checkbox.js.map +1 -0
- package/dist/esm/components/WidthModeToggle.js +14 -0
- package/dist/esm/components/WidthModeToggle.js.map +1 -0
- package/dist/esm/context/WidthModeContext.js +20 -0
- package/dist/esm/context/WidthModeContext.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/staticComponents/CheckListStatic.js +2 -1
- package/dist/esm/staticComponents/CheckListStatic.js.map +1 -1
- package/dist/types/components/Checkbox.d.ts +7 -0
- package/dist/types/components/Checkbox.d.ts.map +1 -0
- package/dist/types/components/Checkbox.test.d.ts +2 -0
- package/dist/types/components/Checkbox.test.d.ts.map +1 -0
- package/dist/types/components/WidthModeToggle.d.ts +3 -0
- package/dist/types/components/WidthModeToggle.d.ts.map +1 -0
- package/dist/types/context/WidthModeContext.d.ts +12 -0
- package/dist/types/context/WidthModeContext.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/staticComponents/CheckListStatic.d.ts +1 -0
- package/dist/types/staticComponents/CheckListStatic.d.ts.map +1 -1
- package/dist/types/staticComponents/CheckListStatic.test.d.ts +2 -0
- package/dist/types/staticComponents/CheckListStatic.test.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/components/Checkbox.test.tsx +32 -0
- package/src/components/Checkbox.tsx +24 -0
- package/src/index.ts +1 -0
- package/src/staticComponents/CheckListStatic.test.tsx +29 -0
- package/src/staticComponents/CheckListStatic.tsx +3 -5
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
var CheckList_module = require('../styles/CheckList.module.scss.js');
|
|
8
|
+
|
|
9
|
+
const Checkbox = ({ isChecked = false, onClick }) => {
|
|
10
|
+
return (jsxRuntime.jsx("div", { className: `${CheckList_module.default['check-list__item__input']} ${isChecked ? CheckList_module.default['check-list__item__input--checked'] : ''}`, onClick: onClick, role: onClick ? 'checkbox' : undefined, "aria-checked": onClick ? isChecked : undefined, tabIndex: onClick ? 0 : undefined }));
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
exports.default = Checkbox;
|
|
14
|
+
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/Checkbox.tsx"],"sourcesContent":["'use client';\n\nimport styles from '../styles/CheckList.module.scss';\n\ninterface CheckboxProperties {\n\tisChecked?: boolean;\n\tonClick?: () => void;\n}\n\nconst Checkbox = ({ isChecked = false, onClick }: CheckboxProperties) => {\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles['check-list__item__input']} ${\n\t\t\t\tisChecked ? styles['check-list__item__input--checked'] : ''\n\t\t\t}`}\n\t\t\tonClick={onClick}\n\t\t\trole={onClick ? 'checkbox' : undefined}\n\t\t\taria-checked={onClick ? isChecked : undefined}\n\t\t\ttabIndex={onClick ? 0 : undefined}\n\t\t/>\n\t);\n};\n\nexport default Checkbox;\n"],"names":["_jsx","styles"],"mappings":";;;;;;;AASA,MAAM,QAAQ,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,EAAE,OAAO,EAAsB,KAAI;AACvE,IAAA,QACCA,cAAA,CAAA,KAAA,EAAA,EACC,SAAS,EAAE,CAAA,EAAGC,wBAAM,CAAC,yBAAyB,CAAC,CAAA,CAAA,EAC9C,SAAS,GAAGA,wBAAM,CAAC,kCAAkC,CAAC,GAAG,EAC1D,CAAA,CAAE,EACF,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,EAAA,cAAA,EACxB,OAAO,GAAG,SAAS,GAAG,SAAS,EAC7C,QAAQ,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS,EAAA,CAChC;AAEJ;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
var WidthModeContext = require('../context/WidthModeContext.js');
|
|
8
|
+
|
|
9
|
+
const WidthModeToggle = () => {
|
|
10
|
+
const widthMode = WidthModeContext.useWidthMode();
|
|
11
|
+
if (!widthMode)
|
|
12
|
+
return null;
|
|
13
|
+
const { increasedWidthMode, setIncreasedWidthMode } = widthMode;
|
|
14
|
+
return (jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: increasedWidthMode, onChange: event => setIncreasedWidthMode(event.target.checked) }), "Increased width mode"] }));
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
exports.default = WidthModeToggle;
|
|
18
|
+
//# sourceMappingURL=WidthModeToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidthModeToggle.js","sources":["../../../src/components/WidthModeToggle.tsx"],"sourcesContent":["'use client';\n\nimport { useWidthMode } from '../context/WidthModeContext';\n\nconst WidthModeToggle = () => {\n\tconst widthMode = useWidthMode();\n\tif (!widthMode) return null;\n\n\tconst { increasedWidthMode, setIncreasedWidthMode } = widthMode;\n\n\treturn (\n\t\t<label style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tchecked={increasedWidthMode}\n\t\t\t\tonChange={event => setIncreasedWidthMode(event.target.checked)}\n\t\t\t/>\n\t\t\tIncreased width mode\n\t\t</label>\n\t);\n};\n\nexport default WidthModeToggle;\n"],"names":["useWidthMode","_jsxs","_jsx"],"mappings":";;;;;;;AAIA,MAAM,eAAe,GAAG,MAAK;AAC5B,IAAA,MAAM,SAAS,GAAGA,6BAAY,EAAE;AAChC,IAAA,IAAI,CAAC,SAAS;AAAE,QAAA,OAAO,IAAI;AAE3B,IAAA,MAAM,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,GAAG,SAAS;IAE/D,QACCC,2BAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAA,QAAA,EAAA,CACrEC,cAAA,CAAA,OAAA,EAAA,EACC,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,KAAK,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAA,CAC7D,EAAA,sBAAA,CAAA,EAAA,CAEK;AAEV;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
|
|
7
|
+
const STORAGE_KEY = 'blogkit:increased-width-mode';
|
|
8
|
+
const WidthModeContext = react.createContext(null);
|
|
9
|
+
const WidthModeProvider = ({ children }) => {
|
|
10
|
+
const [increasedWidthMode, setIncreasedWidthMode] = react.useState(false);
|
|
11
|
+
react.useEffect(() => {
|
|
12
|
+
setIncreasedWidthMode(localStorage.getItem(STORAGE_KEY) === 'true');
|
|
13
|
+
}, []);
|
|
14
|
+
react.useEffect(() => {
|
|
15
|
+
localStorage.setItem(STORAGE_KEY, String(increasedWidthMode));
|
|
16
|
+
}, [increasedWidthMode]);
|
|
17
|
+
return (jsxRuntime.jsx(WidthModeContext.Provider, { value: { increasedWidthMode, setIncreasedWidthMode }, children: children }));
|
|
18
|
+
};
|
|
19
|
+
const useWidthMode = () => react.useContext(WidthModeContext);
|
|
20
|
+
|
|
21
|
+
exports.WidthModeProvider = WidthModeProvider;
|
|
22
|
+
exports.useWidthMode = useWidthMode;
|
|
23
|
+
//# sourceMappingURL=WidthModeContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidthModeContext.js","sources":["../../../src/context/WidthModeContext.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, useContext, useEffect, useState } from 'react';\nimport type { ReactNode } from 'react';\n\nconst STORAGE_KEY = 'blogkit:increased-width-mode';\n\ninterface WidthModeContextValue {\n\tincreasedWidthMode: boolean;\n\tsetIncreasedWidthMode: (value: boolean) => void;\n}\n\nconst WidthModeContext = createContext<WidthModeContextValue | null>(null);\n\ninterface WidthModeProviderProperties {\n\tchildren: ReactNode;\n}\n\nexport const WidthModeProvider = ({ children }: WidthModeProviderProperties) => {\n\tconst [increasedWidthMode, setIncreasedWidthMode] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetIncreasedWidthMode(localStorage.getItem(STORAGE_KEY) === 'true');\n\t}, []);\n\n\tuseEffect(() => {\n\t\tlocalStorage.setItem(STORAGE_KEY, String(increasedWidthMode));\n\t}, [increasedWidthMode]);\n\n\treturn (\n\t\t<WidthModeContext.Provider\n\t\t\tvalue={{ increasedWidthMode, setIncreasedWidthMode }}\n\t\t>\n\t\t\t{children}\n\t\t</WidthModeContext.Provider>\n\t);\n};\n\nexport const useWidthMode = () => useContext(WidthModeContext);\n"],"names":["createContext","useState","useEffect","_jsx","useContext"],"mappings":";;;;;AAKA,MAAM,WAAW,GAAG,8BAA8B;AAOlD,MAAM,gBAAgB,GAAGA,mBAAa,CAA+B,IAAI,CAAC;MAM7D,iBAAiB,GAAG,CAAC,EAAE,QAAQ,EAA+B,KAAI;IAC9E,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAGC,cAAQ,CAAC,KAAK,CAAC;IAEnEC,eAAS,CAAC,MAAK;QACd,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC;IACpE,CAAC,EAAE,EAAE,CAAC;IAENA,eAAS,CAAC,MAAK;QACd,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC9D,IAAA,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;AAExB,IAAA,QACCC,cAAA,CAAC,gBAAgB,CAAC,QAAQ,IACzB,KAAK,EAAE,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,YAEnD,QAAQ,EAAA,CACkB;AAE9B;AAEO,MAAM,YAAY,GAAG,MAAMC,gBAAU,CAAC,gBAAgB;;;;;"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -9,6 +9,7 @@ var Mermaid = require('./components/Mermaid.js');
|
|
|
9
9
|
var BlogLink = require('./components/BlogLink.js');
|
|
10
10
|
var Table = require('./components/Table.js');
|
|
11
11
|
var CheckList = require('./components/CheckList.js');
|
|
12
|
+
var Checkbox = require('./components/Checkbox.js');
|
|
12
13
|
var index = require('./utils/index.js');
|
|
13
14
|
|
|
14
15
|
|
|
@@ -22,6 +23,7 @@ exports.Mermaid = Mermaid.default;
|
|
|
22
23
|
exports.BlogLink = BlogLink.default;
|
|
23
24
|
exports.Table = Table.default;
|
|
24
25
|
exports.CheckList = CheckList.default;
|
|
26
|
+
exports.Checkbox = Checkbox.default;
|
|
25
27
|
exports.generateIdForBlogTitle = index.generateIdForBlogTitle;
|
|
26
28
|
exports.generateUrlForBlogTitle = index.generateUrlForBlogTitle;
|
|
27
29
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var Checkbox = require('../components/Checkbox.js');
|
|
6
7
|
var CheckList_module = require('../styles/CheckList.module.scss.js');
|
|
7
8
|
|
|
8
9
|
const CheckListStatic = ({ items, hasMarginUp = false, hasMarginDown = false, }) => {
|
|
9
|
-
return (jsxRuntime.jsx("div", { className: `${CheckList_module.default['check-list']} ${hasMarginUp ? CheckList_module.default['margin-top--1'] : ''} ${hasMarginDown ? CheckList_module.default['margin-bottom--2'] : ''}`, children: items.map((item) => (jsxRuntime.jsxs("div", { className: CheckList_module.default['check-list__item'], "data-id": item.id, children: [jsxRuntime.jsx(
|
|
10
|
+
return (jsxRuntime.jsx("div", { className: `${CheckList_module.default['check-list']} ${hasMarginUp ? CheckList_module.default['margin-top--1'] : ''} ${hasMarginDown ? CheckList_module.default['margin-bottom--2'] : ''}`, children: items.map((item) => (jsxRuntime.jsxs("div", { className: CheckList_module.default['check-list__item'], "data-id": item.id, children: [jsxRuntime.jsx(Checkbox.default, { isChecked: item.isChecked, onClick: item.onClick }), item.children] }, item.id))) }));
|
|
10
11
|
};
|
|
11
12
|
|
|
12
13
|
exports.default = CheckListStatic;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckListStatic.js","sources":["../../../src/staticComponents/CheckListStatic.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactElement } from 'react';\n\nimport styles from '../styles/CheckList.module.scss';\n\nexport interface CheckListItem {\n\tid: string;\n\tchildren: ReactElement<HTMLAttributes<HTMLParagraphElement>, 'p'>;\n\tisChecked?: boolean;\n}\n\ninterface CheckListProperties {\n\titems: CheckListItem[];\n\thasMarginUp?: boolean;\n\thasMarginDown?: boolean;\n}\n\nconst CheckListStatic = ({\n\titems,\n\thasMarginUp = false,\n\thasMarginDown = false,\n}: CheckListProperties) => {\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles['check-list']} ${hasMarginUp ? styles['margin-top--1'] : ''} ${\n\t\t\t\thasMarginDown ? styles['margin-bottom--2'] : ''\n\t\t\t}`}\n\t\t>\n\t\t\t{items.map((item) => (\n\t\t\t\t<div key={item.id} className={styles['check-list__item']} data-id={item.id}>\n\t\t\t\t\t<
|
|
1
|
+
{"version":3,"file":"CheckListStatic.js","sources":["../../../src/staticComponents/CheckListStatic.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactElement } from 'react';\n\nimport Checkbox from '../components/Checkbox';\nimport styles from '../styles/CheckList.module.scss';\n\nexport interface CheckListItem {\n\tid: string;\n\tchildren: ReactElement<HTMLAttributes<HTMLParagraphElement>, 'p'>;\n\tisChecked?: boolean;\n\tonClick?: () => void;\n}\n\ninterface CheckListProperties {\n\titems: CheckListItem[];\n\thasMarginUp?: boolean;\n\thasMarginDown?: boolean;\n}\n\nconst CheckListStatic = ({\n\titems,\n\thasMarginUp = false,\n\thasMarginDown = false,\n}: CheckListProperties) => {\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles['check-list']} ${hasMarginUp ? styles['margin-top--1'] : ''} ${\n\t\t\t\thasMarginDown ? styles['margin-bottom--2'] : ''\n\t\t\t}`}\n\t\t>\n\t\t\t{items.map((item) => (\n\t\t\t\t<div key={item.id} className={styles['check-list__item']} data-id={item.id}>\n\t\t\t\t\t<Checkbox isChecked={item.isChecked} onClick={item.onClick} />\n\t\t\t\t\t{item.children}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n};\n\nexport default CheckListStatic;\n"],"names":["_jsx","styles","_jsxs","Checkbox"],"mappings":";;;;;;;;AAkBA,MAAM,eAAe,GAAG,CAAC,EACxB,KAAK,EACL,WAAW,GAAG,KAAK,EACnB,aAAa,GAAG,KAAK,GACA,KAAI;AACzB,IAAA,QACCA,cAAA,CAAA,KAAA,EAAA,EACC,SAAS,EAAE,CAAA,EAAGC,wBAAM,CAAC,YAAY,CAAC,CAAA,CAAA,EAAI,WAAW,GAAGA,wBAAM,CAAC,eAAe,CAAC,GAAG,EAAE,IAC/E,aAAa,GAAGA,wBAAM,CAAC,kBAAkB,CAAC,GAAG,EAC9C,CAAA,CAAE,EAAA,QAAA,EAED,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MACfC,eAAA,CAAA,KAAA,EAAA,EAAmB,SAAS,EAAED,wBAAM,CAAC,kBAAkB,CAAC,aAAW,IAAI,CAAC,EAAE,EAAA,QAAA,EAAA,CACzED,cAAA,CAACG,gBAAQ,EAAA,EAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAA,CAAI,EAC7D,IAAI,CAAC,QAAQ,CAAA,EAAA,EAFL,IAAI,CAAC,EAAE,CAGX,CACN,CAAC,EAAA,CACG;AAER;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import styles from '../styles/CheckList.module.scss.js';
|
|
4
|
+
|
|
5
|
+
const Checkbox = ({ isChecked = false, onClick }) => {
|
|
6
|
+
return (jsx("div", { className: `${styles['check-list__item__input']} ${isChecked ? styles['check-list__item__input--checked'] : ''}`, onClick: onClick, role: onClick ? 'checkbox' : undefined, "aria-checked": onClick ? isChecked : undefined, tabIndex: onClick ? 0 : undefined }));
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export { Checkbox as default };
|
|
10
|
+
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/Checkbox.tsx"],"sourcesContent":["'use client';\n\nimport styles from '../styles/CheckList.module.scss';\n\ninterface CheckboxProperties {\n\tisChecked?: boolean;\n\tonClick?: () => void;\n}\n\nconst Checkbox = ({ isChecked = false, onClick }: CheckboxProperties) => {\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles['check-list__item__input']} ${\n\t\t\t\tisChecked ? styles['check-list__item__input--checked'] : ''\n\t\t\t}`}\n\t\t\tonClick={onClick}\n\t\t\trole={onClick ? 'checkbox' : undefined}\n\t\t\taria-checked={onClick ? isChecked : undefined}\n\t\t\ttabIndex={onClick ? 0 : undefined}\n\t\t/>\n\t);\n};\n\nexport default Checkbox;\n"],"names":["_jsx"],"mappings":";;;AASA,MAAM,QAAQ,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,EAAE,OAAO,EAAsB,KAAI;AACvE,IAAA,QACCA,GAAA,CAAA,KAAA,EAAA,EACC,SAAS,EAAE,CAAA,EAAG,MAAM,CAAC,yBAAyB,CAAC,CAAA,CAAA,EAC9C,SAAS,GAAG,MAAM,CAAC,kCAAkC,CAAC,GAAG,EAC1D,CAAA,CAAE,EACF,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,EAAA,cAAA,EACxB,OAAO,GAAG,SAAS,GAAG,SAAS,EAC7C,QAAQ,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS,EAAA,CAChC;AAEJ;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useWidthMode } from '../context/WidthModeContext.js';
|
|
4
|
+
|
|
5
|
+
const WidthModeToggle = () => {
|
|
6
|
+
const widthMode = useWidthMode();
|
|
7
|
+
if (!widthMode)
|
|
8
|
+
return null;
|
|
9
|
+
const { increasedWidthMode, setIncreasedWidthMode } = widthMode;
|
|
10
|
+
return (jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: [jsx("input", { type: "checkbox", checked: increasedWidthMode, onChange: event => setIncreasedWidthMode(event.target.checked) }), "Increased width mode"] }));
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { WidthModeToggle as default };
|
|
14
|
+
//# sourceMappingURL=WidthModeToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidthModeToggle.js","sources":["../../../src/components/WidthModeToggle.tsx"],"sourcesContent":["'use client';\n\nimport { useWidthMode } from '../context/WidthModeContext';\n\nconst WidthModeToggle = () => {\n\tconst widthMode = useWidthMode();\n\tif (!widthMode) return null;\n\n\tconst { increasedWidthMode, setIncreasedWidthMode } = widthMode;\n\n\treturn (\n\t\t<label style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tchecked={increasedWidthMode}\n\t\t\t\tonChange={event => setIncreasedWidthMode(event.target.checked)}\n\t\t\t/>\n\t\t\tIncreased width mode\n\t\t</label>\n\t);\n};\n\nexport default WidthModeToggle;\n"],"names":["_jsxs","_jsx"],"mappings":";;;AAIA,MAAM,eAAe,GAAG,MAAK;AAC5B,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,IAAI,CAAC,SAAS;AAAE,QAAA,OAAO,IAAI;AAE3B,IAAA,MAAM,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,GAAG,SAAS;IAE/D,QACCA,gBAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAA,QAAA,EAAA,CACrEC,GAAA,CAAA,OAAA,EAAA,EACC,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,KAAK,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAA,CAC7D,EAAA,sBAAA,CAAA,EAAA,CAEK;AAEV;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { createContext, useContext, useState, useEffect } from 'react';
|
|
4
|
+
|
|
5
|
+
const STORAGE_KEY = 'blogkit:increased-width-mode';
|
|
6
|
+
const WidthModeContext = createContext(null);
|
|
7
|
+
const WidthModeProvider = ({ children }) => {
|
|
8
|
+
const [increasedWidthMode, setIncreasedWidthMode] = useState(false);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
setIncreasedWidthMode(localStorage.getItem(STORAGE_KEY) === 'true');
|
|
11
|
+
}, []);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
localStorage.setItem(STORAGE_KEY, String(increasedWidthMode));
|
|
14
|
+
}, [increasedWidthMode]);
|
|
15
|
+
return (jsx(WidthModeContext.Provider, { value: { increasedWidthMode, setIncreasedWidthMode }, children: children }));
|
|
16
|
+
};
|
|
17
|
+
const useWidthMode = () => useContext(WidthModeContext);
|
|
18
|
+
|
|
19
|
+
export { WidthModeProvider, useWidthMode };
|
|
20
|
+
//# sourceMappingURL=WidthModeContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidthModeContext.js","sources":["../../../src/context/WidthModeContext.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, useContext, useEffect, useState } from 'react';\nimport type { ReactNode } from 'react';\n\nconst STORAGE_KEY = 'blogkit:increased-width-mode';\n\ninterface WidthModeContextValue {\n\tincreasedWidthMode: boolean;\n\tsetIncreasedWidthMode: (value: boolean) => void;\n}\n\nconst WidthModeContext = createContext<WidthModeContextValue | null>(null);\n\ninterface WidthModeProviderProperties {\n\tchildren: ReactNode;\n}\n\nexport const WidthModeProvider = ({ children }: WidthModeProviderProperties) => {\n\tconst [increasedWidthMode, setIncreasedWidthMode] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetIncreasedWidthMode(localStorage.getItem(STORAGE_KEY) === 'true');\n\t}, []);\n\n\tuseEffect(() => {\n\t\tlocalStorage.setItem(STORAGE_KEY, String(increasedWidthMode));\n\t}, [increasedWidthMode]);\n\n\treturn (\n\t\t<WidthModeContext.Provider\n\t\t\tvalue={{ increasedWidthMode, setIncreasedWidthMode }}\n\t\t>\n\t\t\t{children}\n\t\t</WidthModeContext.Provider>\n\t);\n};\n\nexport const useWidthMode = () => useContext(WidthModeContext);\n"],"names":["_jsx"],"mappings":";;;AAKA,MAAM,WAAW,GAAG,8BAA8B;AAOlD,MAAM,gBAAgB,GAAG,aAAa,CAA+B,IAAI,CAAC;MAM7D,iBAAiB,GAAG,CAAC,EAAE,QAAQ,EAA+B,KAAI;IAC9E,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IAEnE,SAAS,CAAC,MAAK;QACd,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC;IACpE,CAAC,EAAE,EAAE,CAAC;IAEN,SAAS,CAAC,MAAK;QACd,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC9D,IAAA,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;AAExB,IAAA,QACCA,GAAA,CAAC,gBAAgB,CAAC,QAAQ,IACzB,KAAK,EAAE,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,YAEnD,QAAQ,EAAA,CACkB;AAE9B;AAEO,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,gBAAgB;;;;"}
|
package/dist/esm/index.js
CHANGED
|
@@ -7,5 +7,6 @@ export { default as Mermaid } from './components/Mermaid.js';
|
|
|
7
7
|
export { default as BlogLink } from './components/BlogLink.js';
|
|
8
8
|
export { default as Table } from './components/Table.js';
|
|
9
9
|
export { default as CheckList } from './components/CheckList.js';
|
|
10
|
+
export { default as Checkbox } from './components/Checkbox.js';
|
|
10
11
|
export { generateIdForBlogTitle, generateUrlForBlogTitle } from './utils/index.js';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import Checkbox from '../components/Checkbox.js';
|
|
2
3
|
import styles from '../styles/CheckList.module.scss.js';
|
|
3
4
|
|
|
4
5
|
const CheckListStatic = ({ items, hasMarginUp = false, hasMarginDown = false, }) => {
|
|
5
|
-
return (jsx("div", { className: `${styles['check-list']} ${hasMarginUp ? styles['margin-top--1'] : ''} ${hasMarginDown ? styles['margin-bottom--2'] : ''}`, children: items.map((item) => (jsxs("div", { className: styles['check-list__item'], "data-id": item.id, children: [jsx(
|
|
6
|
+
return (jsx("div", { className: `${styles['check-list']} ${hasMarginUp ? styles['margin-top--1'] : ''} ${hasMarginDown ? styles['margin-bottom--2'] : ''}`, children: items.map((item) => (jsxs("div", { className: styles['check-list__item'], "data-id": item.id, children: [jsx(Checkbox, { isChecked: item.isChecked, onClick: item.onClick }), item.children] }, item.id))) }));
|
|
6
7
|
};
|
|
7
8
|
|
|
8
9
|
export { CheckListStatic as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckListStatic.js","sources":["../../../src/staticComponents/CheckListStatic.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactElement } from 'react';\n\nimport styles from '../styles/CheckList.module.scss';\n\nexport interface CheckListItem {\n\tid: string;\n\tchildren: ReactElement<HTMLAttributes<HTMLParagraphElement>, 'p'>;\n\tisChecked?: boolean;\n}\n\ninterface CheckListProperties {\n\titems: CheckListItem[];\n\thasMarginUp?: boolean;\n\thasMarginDown?: boolean;\n}\n\nconst CheckListStatic = ({\n\titems,\n\thasMarginUp = false,\n\thasMarginDown = false,\n}: CheckListProperties) => {\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles['check-list']} ${hasMarginUp ? styles['margin-top--1'] : ''} ${\n\t\t\t\thasMarginDown ? styles['margin-bottom--2'] : ''\n\t\t\t}`}\n\t\t>\n\t\t\t{items.map((item) => (\n\t\t\t\t<div key={item.id} className={styles['check-list__item']} data-id={item.id}>\n\t\t\t\t\t<
|
|
1
|
+
{"version":3,"file":"CheckListStatic.js","sources":["../../../src/staticComponents/CheckListStatic.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactElement } from 'react';\n\nimport Checkbox from '../components/Checkbox';\nimport styles from '../styles/CheckList.module.scss';\n\nexport interface CheckListItem {\n\tid: string;\n\tchildren: ReactElement<HTMLAttributes<HTMLParagraphElement>, 'p'>;\n\tisChecked?: boolean;\n\tonClick?: () => void;\n}\n\ninterface CheckListProperties {\n\titems: CheckListItem[];\n\thasMarginUp?: boolean;\n\thasMarginDown?: boolean;\n}\n\nconst CheckListStatic = ({\n\titems,\n\thasMarginUp = false,\n\thasMarginDown = false,\n}: CheckListProperties) => {\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles['check-list']} ${hasMarginUp ? styles['margin-top--1'] : ''} ${\n\t\t\t\thasMarginDown ? styles['margin-bottom--2'] : ''\n\t\t\t}`}\n\t\t>\n\t\t\t{items.map((item) => (\n\t\t\t\t<div key={item.id} className={styles['check-list__item']} data-id={item.id}>\n\t\t\t\t\t<Checkbox isChecked={item.isChecked} onClick={item.onClick} />\n\t\t\t\t\t{item.children}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n};\n\nexport default CheckListStatic;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;AAkBA,MAAM,eAAe,GAAG,CAAC,EACxB,KAAK,EACL,WAAW,GAAG,KAAK,EACnB,aAAa,GAAG,KAAK,GACA,KAAI;AACzB,IAAA,QACCA,GAAA,CAAA,KAAA,EAAA,EACC,SAAS,EAAE,CAAA,EAAG,MAAM,CAAC,YAAY,CAAC,CAAA,CAAA,EAAI,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,IAC/E,aAAa,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAC9C,CAAA,CAAE,EAAA,QAAA,EAED,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MACfC,IAAA,CAAA,KAAA,EAAA,EAAmB,SAAS,EAAE,MAAM,CAAC,kBAAkB,CAAC,aAAW,IAAI,CAAC,EAAE,EAAA,QAAA,EAAA,CACzED,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAA,CAAI,EAC7D,IAAI,CAAC,QAAQ,CAAA,EAAA,EAFL,IAAI,CAAC,EAAE,CAGX,CACN,CAAC,EAAA,CACG;AAER;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox.tsx"],"names":[],"mappings":"AAIA,UAAU,kBAAkB;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,QAAQ,GAAI,wBAAgC,kBAAkB,gCAYnE,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.test.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidthModeToggle.d.ts","sourceRoot":"","sources":["../../../src/components/WidthModeToggle.tsx"],"names":[],"mappings":"AAIA,QAAA,MAAM,eAAe,0CAgBpB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
interface WidthModeContextValue {
|
|
3
|
+
increasedWidthMode: boolean;
|
|
4
|
+
setIncreasedWidthMode: (value: boolean) => void;
|
|
5
|
+
}
|
|
6
|
+
interface WidthModeProviderProperties {
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export declare const WidthModeProvider: ({ children }: WidthModeProviderProperties) => import("react").JSX.Element;
|
|
10
|
+
export declare const useWidthMode: () => WidthModeContextValue | null;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=WidthModeContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidthModeContext.d.ts","sourceRoot":"","sources":["../../../src/context/WidthModeContext.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,UAAU,qBAAqB;IAC9B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAChD;AAID,UAAU,2BAA2B;IACpC,QAAQ,EAAE,SAAS,CAAC;CACpB;AAED,eAAO,MAAM,iBAAiB,GAAI,cAAc,2BAA2B,gCAkB1E,CAAC;AAEF,eAAO,MAAM,YAAY,oCAAqC,CAAC"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -7,5 +7,6 @@ export { default as Mermaid } from './components/Mermaid';
|
|
|
7
7
|
export { default as BlogLink } from './components/BlogLink';
|
|
8
8
|
export { default as Table } from './components/Table';
|
|
9
9
|
export { default as CheckList, type CheckListItem } from './components/CheckList';
|
|
10
|
+
export { default as Checkbox } from './components/Checkbox';
|
|
10
11
|
export { generateIdForBlogTitle, generateUrlForBlogTitle } from './utils';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckListStatic.d.ts","sourceRoot":"","sources":["../../../src/staticComponents/CheckListStatic.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"CheckListStatic.d.ts","sourceRoot":"","sources":["../../../src/staticComponents/CheckListStatic.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAK1D,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,oBAAoB,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,mBAAmB;IAC5B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,QAAA,MAAM,eAAe,GAAI,wCAItB,mBAAmB,gCAerB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckListStatic.test.d.ts","sourceRoot":"","sources":["../../../src/staticComponents/CheckListStatic.test.tsx"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@san-siva/blogkit",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.44",
|
|
4
4
|
"description": "A reusable blog component library for React/Next.js applications with code highlighting, diagrams, and rich content features",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { renderToStaticMarkup } from 'react-dom/server';
|
|
3
|
+
|
|
4
|
+
import Checkbox from './Checkbox';
|
|
5
|
+
|
|
6
|
+
describe('Checkbox', () => {
|
|
7
|
+
it('renders unchecked by default with no interactive attributes', () => {
|
|
8
|
+
const html = renderToStaticMarkup(<Checkbox />);
|
|
9
|
+
expect(html).not.toContain('role="checkbox"');
|
|
10
|
+
expect(html).not.toContain('tabindex');
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('adds role, aria-checked and tabIndex when onClick is provided', () => {
|
|
14
|
+
const html = renderToStaticMarkup(<Checkbox isChecked onClick={() => {}} />);
|
|
15
|
+
expect(html).toContain('role="checkbox"');
|
|
16
|
+
expect(html).toContain('aria-checked="true"');
|
|
17
|
+
expect(html).toContain('tabindex="0"');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('renders a different className when checked vs unchecked', () => {
|
|
21
|
+
const uncheckedHtml = renderToStaticMarkup(<Checkbox isChecked={false} />);
|
|
22
|
+
const checkedHtml = renderToStaticMarkup(<Checkbox isChecked />);
|
|
23
|
+
expect(checkedHtml).not.toBe(uncheckedHtml);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('wires the onClick prop through to the rendered element', () => {
|
|
27
|
+
const onClick = vi.fn();
|
|
28
|
+
const element = Checkbox({ onClick });
|
|
29
|
+
element.props.onClick();
|
|
30
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import styles from '../styles/CheckList.module.scss';
|
|
4
|
+
|
|
5
|
+
interface CheckboxProperties {
|
|
6
|
+
isChecked?: boolean;
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const Checkbox = ({ isChecked = false, onClick }: CheckboxProperties) => {
|
|
11
|
+
return (
|
|
12
|
+
<div
|
|
13
|
+
className={`${styles['check-list__item__input']} ${
|
|
14
|
+
isChecked ? styles['check-list__item__input--checked'] : ''
|
|
15
|
+
}`}
|
|
16
|
+
onClick={onClick}
|
|
17
|
+
role={onClick ? 'checkbox' : undefined}
|
|
18
|
+
aria-checked={onClick ? isChecked : undefined}
|
|
19
|
+
tabIndex={onClick ? 0 : undefined}
|
|
20
|
+
/>
|
|
21
|
+
);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default Checkbox;
|
package/src/index.ts
CHANGED
|
@@ -8,6 +8,7 @@ export { default as Mermaid } from './components/Mermaid';
|
|
|
8
8
|
export { default as BlogLink } from './components/BlogLink';
|
|
9
9
|
export { default as Table } from './components/Table';
|
|
10
10
|
export { default as CheckList, type CheckListItem } from './components/CheckList';
|
|
11
|
+
export { default as Checkbox } from './components/Checkbox';
|
|
11
12
|
|
|
12
13
|
// Utilities
|
|
13
14
|
export { generateIdForBlogTitle, generateUrlForBlogTitle } from './utils';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { renderToStaticMarkup } from 'react-dom/server';
|
|
3
|
+
|
|
4
|
+
import CheckListStatic from './CheckListStatic';
|
|
5
|
+
|
|
6
|
+
describe('CheckListStatic', () => {
|
|
7
|
+
it('renders one item per entry', () => {
|
|
8
|
+
const html = renderToStaticMarkup(
|
|
9
|
+
<CheckListStatic
|
|
10
|
+
items={[
|
|
11
|
+
{ id: 'a', children: <p>A</p> },
|
|
12
|
+
{ id: 'b', children: <p>B</p> },
|
|
13
|
+
]}
|
|
14
|
+
/>
|
|
15
|
+
);
|
|
16
|
+
expect(html).toContain('data-id="a"');
|
|
17
|
+
expect(html).toContain('data-id="b"');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("wires each item's onClick through to its Checkbox", () => {
|
|
21
|
+
const onClick = vi.fn();
|
|
22
|
+
const element = CheckListStatic({
|
|
23
|
+
items: [{ id: 'a', children: <p>A</p>, onClick }],
|
|
24
|
+
});
|
|
25
|
+
const checkbox = element.props.children[0].props.children[0];
|
|
26
|
+
checkbox.props.onClick();
|
|
27
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { HTMLAttributes, ReactElement } from 'react';
|
|
2
2
|
|
|
3
|
+
import Checkbox from '../components/Checkbox';
|
|
3
4
|
import styles from '../styles/CheckList.module.scss';
|
|
4
5
|
|
|
5
6
|
export interface CheckListItem {
|
|
6
7
|
id: string;
|
|
7
8
|
children: ReactElement<HTMLAttributes<HTMLParagraphElement>, 'p'>;
|
|
8
9
|
isChecked?: boolean;
|
|
10
|
+
onClick?: () => void;
|
|
9
11
|
}
|
|
10
12
|
|
|
11
13
|
interface CheckListProperties {
|
|
@@ -27,11 +29,7 @@ const CheckListStatic = ({
|
|
|
27
29
|
>
|
|
28
30
|
{items.map((item) => (
|
|
29
31
|
<div key={item.id} className={styles['check-list__item']} data-id={item.id}>
|
|
30
|
-
<
|
|
31
|
-
className={`${styles['check-list__item__input']} ${
|
|
32
|
-
item.isChecked ? styles['check-list__item__input--checked'] : ''
|
|
33
|
-
}`}
|
|
34
|
-
/>
|
|
32
|
+
<Checkbox isChecked={item.isChecked} onClick={item.onClick} />
|
|
35
33
|
{item.children}
|
|
36
34
|
</div>
|
|
37
35
|
))}
|