@memobit/libs 3.3.0 → 3.4.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.
@@ -1 +1 @@
1
- .NotificationPanel{position:relative}.NotificationPanel__button{align-items:center;gap:var(--spacing-8);border:1px solid var(--border-color);border-radius:var(--radius);background:var(--card-background-color);color:var(--body-title-color);padding:var(--spacing-8) var(--spacing-12);cursor:pointer;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);display:inline-flex}.NotificationPanel__button--critical{border-color:color-mix(in srgb, var(--button-danger-border-color) 55%, var(--border-color));background:color-mix(in srgb, var(--button-danger-border-color) 12%, transparent)}.NotificationPanel__badge{min-width:var(--spacing-20);height:var(--spacing-20);border-radius:var(--radius-full);font-size:var(--font-size-xs);background:var(--button-danger-background-color);color:var(--button-danger-color);padding:0 var(--spacing-4);justify-content:center;align-items:center;display:inline-flex}.NotificationPanel__backdrop{z-index:9998;position:fixed;inset:0}.NotificationPanel__panel{z-index:9999;background:var(--card-background-color);border:1px solid var(--border-color);border-radius:var(--radius);width:min(420px,80vw);box-shadow:var(--card-box-shadow);padding:var(--spacing-12);position:fixed;top:0;left:0}.NotificationPanel__title{margin:0 0 var(--spacing-8) 0;font-size:var(--font-size-sm);color:var(--body-title-color);font-weight:var(--font-weight-medium)}.NotificationPanel__list{gap:var(--spacing-4);flex-direction:column;max-height:260px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}.NotificationPanel__list::-webkit-scrollbar{width:var(--scrollbar-size)}.NotificationPanel__list::-webkit-scrollbar-track{background:var(--scrollbar-track-color)}.NotificationPanel__list::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-color);border-radius:var(--scrollbar-radius)}.NotificationPanel__list::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover-color)}.NotificationPanel__list{scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb-color) var(--scrollbar-track-color)}.NotificationPanel__item{font-size:var(--font-size-sm);color:var(--body-color);padding:var(--spacing-8);border-radius:var(--radius-sm);border:1px solid #0000}.NotificationPanel__item--critical{border-color:color-mix(in srgb, var(--button-danger-border-color) 50%, var(--border-color));background:color-mix(in srgb, var(--button-danger-border-color) 10%, transparent)}.NotificationPanel__empty{color:var(--body-sub-title-color);font-size:var(--font-size-sm);margin:0}
1
+ .NotificationPanel{position:relative}.NotificationPanel__button{align-items:center;gap:var(--spacing-8);border:1px solid var(--border-color);border-radius:var(--radius);background:var(--card-background-color);color:var(--body-title-color);padding:var(--spacing-8) var(--spacing-12);cursor:pointer;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);display:inline-flex}.NotificationPanel__button--critical{border-color:color-mix(in srgb, var(--button-danger-border-color) 55%, var(--border-color));background:color-mix(in srgb, var(--button-danger-border-color) 12%, transparent)}.NotificationPanel__badge{min-width:var(--spacing-20);height:var(--spacing-20);border-radius:var(--radius-full);font-size:var(--font-size-xs);background:var(--button-danger-background-color);color:var(--button-danger-color);padding:0 var(--spacing-4);justify-content:center;align-items:center;display:inline-flex}.NotificationPanel__backdrop{z-index:9998;position:fixed;inset:0}.NotificationPanel__panel{z-index:9999;background:var(--card-background-color);border:1px solid var(--border-color);border-radius:var(--radius);width:min(420px,80vw);box-shadow:var(--card-box-shadow);padding:var(--spacing-12);position:fixed;top:0;left:0}.NotificationPanel__title{margin:0 0 var(--spacing-8) 0;font-size:var(--font-size-sm);color:var(--body-title-color);font-weight:var(--font-weight-medium)}.NotificationPanel__list{gap:var(--spacing-4);flex-direction:column;max-height:260px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}.NotificationPanel__list::-webkit-scrollbar{width:var(--scrollbar-size)}.NotificationPanel__list::-webkit-scrollbar-track{background:var(--scrollbar-track-color)}.NotificationPanel__list::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-color);border-radius:var(--scrollbar-radius)}.NotificationPanel__list::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover-color)}.NotificationPanel__list{scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb-color) var(--scrollbar-track-color)}.NotificationPanel__item{font-size:var(--font-size-sm);color:var(--body-color);padding:var(--spacing-8);border-radius:var(--radius-sm);border:1px solid #0000}.NotificationPanel__item--critical{border-color:color-mix(in srgb, var(--button-danger-border-color) 50%, var(--border-color));background:color-mix(in srgb, var(--button-danger-border-color) 10%, transparent)}.NotificationPanel__item--clickable{cursor:pointer;transition:background-color var(--transition-fast)}.NotificationPanel__item--clickable:hover{background:color-mix(in srgb, var(--body-accent-color) 14%, transparent)}.NotificationPanel__empty{color:var(--body-sub-title-color);font-size:var(--font-size-sm);margin:0}
@@ -1,17 +1,17 @@
1
1
  import './NotificationPanel.css';
2
2
  /* empty css */
3
- import { useEffect as p, useRef as N, useState as g } from "react";
4
- import { Fragment as k, jsx as n, jsxs as d } from "react/jsx-runtime";
5
- import { createPortal as w } from "react-dom";
6
- var S = ({ items: i, buttonLabel: _ = "Alerts", panelTitle: y = "Notifications", emptyMessage: P = "No active notifications." }) => {
7
- const [o, m] = g(!1), [v, u] = g({ opacity: 0 }), s = N(null), f = N(null), b = i.some((t) => t.severity === "critical");
8
- return p(() => {
9
- if (!o || !s.current || !f.current) return;
3
+ import { useEffect as N, useRef as _, useState as g } from "react";
4
+ import { Fragment as w, jsx as n, jsxs as u } from "react/jsx-runtime";
5
+ import { createPortal as E } from "react-dom";
6
+ var B = ({ items: i, buttonLabel: y = "Alerts", panelTitle: P = "Notifications", emptyMessage: v = "No active notifications.", onItemClick: m }) => {
7
+ const [o, s] = g(!1), [b, h] = g({ opacity: 0 }), f = _(null), d = _(null), R = i.some((t) => t.severity === "critical");
8
+ return N(() => {
9
+ if (!o || !f.current || !d.current) return;
10
10
  const t = requestAnimationFrame(() => {
11
- if (!s.current || !f.current) return;
12
- const c = s.current.getBoundingClientRect(), a = f.current.getBoundingClientRect(), h = document.documentElement.clientWidth, R = document.documentElement.clientHeight, e = 8;
13
- let l = c.bottom + e, r = c.right - a.width;
14
- r < e && (r = e), r + a.width > h - e && (r = h - a.width - e), l + a.height > R - e && (l = c.top - a.height - e), l < e && (l = e), u({
11
+ if (!f.current || !d.current) return;
12
+ const a = f.current.getBoundingClientRect(), c = d.current.getBoundingClientRect(), p = document.documentElement.clientWidth, k = document.documentElement.clientHeight, e = 8;
13
+ let l = a.bottom + e, r = a.right - c.width;
14
+ r < e && (r = e), r + c.width > p - e && (r = p - c.width - e), l + c.height > k - e && (l = a.top - c.height - e), l < e && (l = e), h({
15
15
  position: "fixed",
16
16
  top: l,
17
17
  left: r,
@@ -19,42 +19,49 @@ var S = ({ items: i, buttonLabel: _ = "Alerts", panelTitle: y = "Notifications",
19
19
  });
20
20
  });
21
21
  return () => cancelAnimationFrame(t);
22
- }, [o]), p(() => {
22
+ }, [o]), N(() => {
23
23
  if (!o) return;
24
- const t = (c) => {
25
- c.key === "Escape" && m(!1);
24
+ const t = (a) => {
25
+ a.key === "Escape" && s(!1);
26
26
  };
27
27
  return document.addEventListener("keydown", t), () => document.removeEventListener("keydown", t);
28
- }, [o]), /* @__PURE__ */ d("div", {
28
+ }, [o]), /* @__PURE__ */ u("div", {
29
29
  className: "NotificationPanel",
30
- children: [/* @__PURE__ */ d("button", {
31
- ref: s,
30
+ children: [/* @__PURE__ */ u("button", {
31
+ ref: f,
32
32
  type: "button",
33
- className: `NotificationPanel__button${b ? " NotificationPanel__button--critical" : ""}`,
33
+ className: `NotificationPanel__button${R ? " NotificationPanel__button--critical" : ""}`,
34
34
  onClick: () => {
35
- u({ opacity: 0 }), m((t) => !t);
35
+ h({ opacity: 0 }), s((t) => !t);
36
36
  },
37
- children: [_, i.length > 0 && /* @__PURE__ */ n("span", {
37
+ children: [y, i.length > 0 && /* @__PURE__ */ n("span", {
38
38
  className: "NotificationPanel__badge",
39
39
  children: i.length
40
40
  })]
41
- }), o && w(/* @__PURE__ */ d(k, { children: [/* @__PURE__ */ n("div", {
41
+ }), o && E(/* @__PURE__ */ u(w, { children: [/* @__PURE__ */ n("div", {
42
42
  className: "NotificationPanel__backdrop",
43
- onClick: () => m(!1)
44
- }), /* @__PURE__ */ d("div", {
45
- ref: f,
43
+ onClick: () => s(!1)
44
+ }), /* @__PURE__ */ u("div", {
45
+ ref: d,
46
46
  className: "NotificationPanel__panel",
47
- style: v,
47
+ style: b,
48
48
  children: [/* @__PURE__ */ n("h4", {
49
49
  className: "NotificationPanel__title",
50
- children: y
50
+ children: P
51
51
  }), i.length === 0 ? /* @__PURE__ */ n("p", {
52
52
  className: "NotificationPanel__empty",
53
- children: P
53
+ children: v
54
54
  }) : /* @__PURE__ */ n("ul", {
55
55
  className: "NotificationPanel__list",
56
56
  children: i.map((t) => /* @__PURE__ */ n("li", {
57
- className: `NotificationPanel__item${t.severity === "critical" ? " NotificationPanel__item--critical" : ""}`,
57
+ className: [
58
+ "NotificationPanel__item",
59
+ t.severity === "critical" ? "NotificationPanel__item--critical" : "",
60
+ m ? "NotificationPanel__item--clickable" : ""
61
+ ].filter(Boolean).join(" "),
62
+ onClick: m ? () => {
63
+ s(!1), m(t);
64
+ } : void 0,
58
65
  children: t.message
59
66
  }, t.id))
60
67
  })]
@@ -62,5 +69,5 @@ var S = ({ items: i, buttonLabel: _ = "Alerts", panelTitle: y = "Notifications",
62
69
  });
63
70
  };
64
71
  export {
65
- S as NotificationPanel
72
+ B as NotificationPanel
66
73
  };
@@ -23,7 +23,7 @@ var r = (i) => {
23
23
  const o = {
24
24
  ...i,
25
25
  lib: d,
26
- libBuildNumber: 463,
26
+ libBuildNumber: 467,
27
27
  libCommit: n,
28
28
  libBuildDate: t
29
29
  };
package/dist/index.d.ts CHANGED
@@ -2433,6 +2433,12 @@ declare interface NotificationPanelProps {
2433
2433
  buttonLabel?: string;
2434
2434
  panelTitle?: string;
2435
2435
  emptyMessage?: string;
2436
+ /**
2437
+ * Makes each row a way into whatever it is warning about, and closes the panel on the
2438
+ * way. Without it the rows are a read-only list — fine for a reading like "battery 0%"
2439
+ * that has nowhere to go, wrong for an alert that names a record you want to open.
2440
+ */
2441
+ onItemClick?: (item: NotificationPanelItem) => void;
2436
2442
  }
2437
2443
 
2438
2444
  declare type OutputFormat = 'html' | 'markdown';
package/dist/version.js CHANGED
@@ -1,4 +1,4 @@
1
- var I = "3.3.0", B = 463, L = "1906cce", _ = "2026-10-02T16:48:12.321Z", r = "463";
1
+ var I = "3.4.0", B = 467, L = "e0f3c94", _ = "2026-10-02T17:16:46.471Z", r = "467";
2
2
  export {
3
3
  _ as LIB_BUILD_DATE,
4
4
  r as LIB_BUILD_ID,
package/dist/version.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "3.3.0",
3
- "buildNumber": 463,
4
- "commit": "1906cce",
5
- "buildDate": "2026-10-02T16:48:12.321Z"
2
+ "version": "3.4.0",
3
+ "buildNumber": 467,
4
+ "commit": "e0f3c94",
5
+ "buildDate": "2026-10-02T17:16:46.471Z"
6
6
  }
package/package.json CHANGED
@@ -1,121 +1,121 @@
1
- {
2
- "name": "@memobit/libs",
3
- "version": "3.3.0",
4
- "description": "React component library powering the Memobit apps — 100+ components, helpers and hooks. Icons ship as @memobit/icons and themes as @memobit/themes. TypeScript-first, ESM-only, React 19.",
5
- "keywords": [
6
- "react",
7
- "react-components",
8
- "component-library",
9
- "ui",
10
- "ui-kit",
11
- "design-system",
12
- "typescript",
13
- "hooks",
14
- "memobit"
15
- ],
16
- "author": "Iulian Cristea <iulianx@gmail.com>",
17
- "license": "Apache-2.0",
18
- "homepage": "https://react.memobit.ro/",
19
- "repository": {
20
- "type": "git",
21
- "url": "git+https://github.com/CristeaIulian/memobit-react-library.git"
22
- },
23
- "bugs": {
24
- "url": "https://github.com/CristeaIulian/memobit-react-library/issues"
25
- },
26
- "publishConfig": {
27
- "access": "public"
28
- },
29
- "sideEffects": [
30
- "**/*.css",
31
- "**/*.scss"
32
- ],
33
- "type": "module",
34
- "main": "dist/index.js",
35
- "module": "dist/index.js",
36
- "types": "dist/index.d.ts",
37
- "exports": {
38
- ".": {
39
- "types": "./dist/index.d.ts",
40
- "import": "./dist/index.js"
41
- },
42
- "./dist/index.css": "./dist/index.css",
43
- "./mfa": {
44
- "types": "./dist/mfa.d.ts",
45
- "import": "./dist/mfa.js"
46
- },
47
- "./dist/styles/variables.scss": "./dist/styles/variables.scss",
48
- "./dist/styles/base.scss": "./dist/styles/base.scss",
49
- "./dist/styles/effects.scss": "./dist/styles/effects.scss",
50
- "./dist/styles/highlight.scss": "./dist/styles/highlight.scss",
51
- "./dist/styles/scrollbars.scss": "./dist/styles/scrollbars.scss",
52
- "./dist/styles/utilities.scss": "./dist/styles/utilities.scss",
53
- "./dist/styles/utility-classes.scss": "./dist/styles/utility-classes.scss",
54
- "./dist/components/*": "./dist/components/*"
55
- },
56
- "files": [
57
- "dist"
58
- ],
59
- "scripts": {
60
- "build": "vite build && npm pack",
61
- "release": "npm run build && npm publish",
62
- "check:npm-auth": "node scripts/check-npm-auth.mjs",
63
- "ship": "npm run check:npm-auth && npm version patch && npm run release && git push --follow-tags",
64
- "ship:minor": "npm run check:npm-auth && npm version minor && npm run release && git push --follow-tags",
65
- "ship:major": "npm run check:npm-auth && npm version major && npm run release && git push --follow-tags",
66
- "prepublishOnly": "vite build",
67
- "dev": "vite build --watch",
68
- "playground": "vite serve playground --config playground/vite.config.ts",
69
- "lint": "eslint src --ext .ts,.tsx",
70
- "lint:fix": "eslint src --ext .ts,.tsx --fix",
71
- "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,css}\"",
72
- "format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json,css}\""
73
- },
74
- "peerDependencies": {
75
- "@memobit/icons": "^1.0.0",
76
- "@memobit/themes": "^1.0.0",
77
- "react": "19.2.7",
78
- "react-dom": "19.2.7"
79
- },
80
- "devDependencies": {
81
- "@eslint/js": "9.39.4",
82
- "@memobit/icons": "file:../memobit-react-icons",
83
- "@memobit/themes": "file:../memobit-react-themes",
84
- "@microsoft/api-extractor": "7.58.8",
85
- "@types/react": "19.2.14",
86
- "@types/react-dom": "19.2.3",
87
- "@vitejs/plugin-react": "6.0.4",
88
- "esbuild": "0.28.1",
89
- "eslint": "9.39.4",
90
- "eslint-config-prettier": "10.1.8",
91
- "eslint-plugin-import-x": "4.17.1",
92
- "eslint-plugin-prettier": "5.5.5",
93
- "eslint-plugin-react": "7.37.5",
94
- "eslint-plugin-simple-import-sort": "13.0.0",
95
- "globals": "17.6.0",
96
- "prettier": "3.8.3",
97
- "qrcode.react": "4.2.0",
98
- "react": "19.2.7",
99
- "react-dom": "19.2.7",
100
- "react-router": "8.3.0",
101
- "sass": "1.99.0",
102
- "terser": "5.47.1",
103
- "typescript": "6.0.3",
104
- "typescript-eslint": "8.59.3",
105
- "vite": "8.1.5",
106
- "vite-plugin-dts": "5.0.0",
107
- "vite-plugin-static-copy": "3.4.0"
108
- },
109
- "overrides": {
110
- "brace-expansion@1": "1.1.18",
111
- "brace-expansion@5": "5.0.9",
112
- "fast-uri@3": "3.1.8",
113
- "immutable": "5.1.9",
114
- "js-yaml": "4.3.2",
115
- "minimatch@10": "10.2.6",
116
- "nanoid@3": "3.3.18",
117
- "picomatch@2": "2.3.2",
118
- "postcss": "8.5.26",
119
- "esbuild": "0.28.1"
120
- }
121
- }
1
+ {
2
+ "name": "@memobit/libs",
3
+ "version": "3.4.0",
4
+ "description": "React component library powering the Memobit apps — 100+ components, helpers and hooks. Icons ship as @memobit/icons and themes as @memobit/themes. TypeScript-first, ESM-only, React 19.",
5
+ "keywords": [
6
+ "react",
7
+ "react-components",
8
+ "component-library",
9
+ "ui",
10
+ "ui-kit",
11
+ "design-system",
12
+ "typescript",
13
+ "hooks",
14
+ "memobit"
15
+ ],
16
+ "author": "Iulian Cristea <iulianx@gmail.com>",
17
+ "license": "Apache-2.0",
18
+ "homepage": "https://react.memobit.ro/",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/CristeaIulian/memobit-react-library.git"
22
+ },
23
+ "bugs": {
24
+ "url": "https://github.com/CristeaIulian/memobit-react-library/issues"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "sideEffects": [
30
+ "**/*.css",
31
+ "**/*.scss"
32
+ ],
33
+ "type": "module",
34
+ "main": "dist/index.js",
35
+ "module": "dist/index.js",
36
+ "types": "dist/index.d.ts",
37
+ "exports": {
38
+ ".": {
39
+ "types": "./dist/index.d.ts",
40
+ "import": "./dist/index.js"
41
+ },
42
+ "./dist/index.css": "./dist/index.css",
43
+ "./mfa": {
44
+ "types": "./dist/mfa.d.ts",
45
+ "import": "./dist/mfa.js"
46
+ },
47
+ "./dist/styles/variables.scss": "./dist/styles/variables.scss",
48
+ "./dist/styles/base.scss": "./dist/styles/base.scss",
49
+ "./dist/styles/effects.scss": "./dist/styles/effects.scss",
50
+ "./dist/styles/highlight.scss": "./dist/styles/highlight.scss",
51
+ "./dist/styles/scrollbars.scss": "./dist/styles/scrollbars.scss",
52
+ "./dist/styles/utilities.scss": "./dist/styles/utilities.scss",
53
+ "./dist/styles/utility-classes.scss": "./dist/styles/utility-classes.scss",
54
+ "./dist/components/*": "./dist/components/*"
55
+ },
56
+ "files": [
57
+ "dist"
58
+ ],
59
+ "scripts": {
60
+ "build": "vite build && npm pack",
61
+ "release": "npm run build && npm publish",
62
+ "check:npm-auth": "node scripts/check-npm-auth.mjs",
63
+ "ship": "npm run check:npm-auth && npm version patch && npm run release && git push --follow-tags",
64
+ "ship:minor": "npm run check:npm-auth && npm version minor && npm run release && git push --follow-tags",
65
+ "ship:major": "npm run check:npm-auth && npm version major && npm run release && git push --follow-tags",
66
+ "prepublishOnly": "vite build",
67
+ "dev": "vite build --watch",
68
+ "playground": "vite serve playground --config playground/vite.config.ts",
69
+ "lint": "eslint src --ext .ts,.tsx",
70
+ "lint:fix": "eslint src --ext .ts,.tsx --fix",
71
+ "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,css}\"",
72
+ "format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json,css}\""
73
+ },
74
+ "peerDependencies": {
75
+ "@memobit/icons": "^1.0.0",
76
+ "@memobit/themes": "^1.0.0",
77
+ "react": "19.2.7",
78
+ "react-dom": "19.2.7"
79
+ },
80
+ "devDependencies": {
81
+ "@eslint/js": "9.39.4",
82
+ "@memobit/icons": "file:../memobit-react-icons",
83
+ "@memobit/themes": "file:../memobit-react-themes",
84
+ "@microsoft/api-extractor": "7.58.8",
85
+ "@types/react": "19.2.14",
86
+ "@types/react-dom": "19.2.3",
87
+ "@vitejs/plugin-react": "6.0.4",
88
+ "esbuild": "0.28.1",
89
+ "eslint": "9.39.4",
90
+ "eslint-config-prettier": "10.1.8",
91
+ "eslint-plugin-import-x": "4.17.1",
92
+ "eslint-plugin-prettier": "5.5.5",
93
+ "eslint-plugin-react": "7.37.5",
94
+ "eslint-plugin-simple-import-sort": "13.0.0",
95
+ "globals": "17.6.0",
96
+ "prettier": "3.8.3",
97
+ "qrcode.react": "4.2.0",
98
+ "react": "19.2.7",
99
+ "react-dom": "19.2.7",
100
+ "react-router": "8.3.0",
101
+ "sass": "1.99.0",
102
+ "terser": "5.47.1",
103
+ "typescript": "6.0.3",
104
+ "typescript-eslint": "8.59.3",
105
+ "vite": "8.1.5",
106
+ "vite-plugin-dts": "5.0.0",
107
+ "vite-plugin-static-copy": "3.4.0"
108
+ },
109
+ "overrides": {
110
+ "brace-expansion@1": "1.1.21",
111
+ "brace-expansion@5": "5.0.12",
112
+ "fast-uri@3": "3.1.8",
113
+ "immutable": "5.1.9",
114
+ "js-yaml": "4.3.2",
115
+ "minimatch@10": "10.2.6",
116
+ "nanoid@3": "3.3.18",
117
+ "picomatch@2": "2.3.2",
118
+ "postcss": "8.5.26",
119
+ "esbuild": "0.28.1"
120
+ }
121
+ }