tembro 3.1.13 → 3.1.15
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/CHANGELOG.md +11 -0
- package/dist/showcase/package-meta.d.ts +2 -2
- package/dist/src/components/display/kanban.cjs +1 -1
- package/dist/src/components/display/kanban.js +135 -59
- package/dist/src/components/notifications/notification-center.cjs +1 -1
- package/dist/src/components/notifications/notification-center.js +10 -10
- package/dist/src/showcase/package-meta.cjs +1 -1
- package/dist/src/showcase/package-meta.js +1 -1
- package/dist/src/showcase/site-data.cjs +1 -1
- package/dist/src/showcase/site-data.js +1 -1
- package/dist/src/showcase/tembro-registry.json.cjs +1 -1
- package/dist/src/showcase/tembro-registry.json.js +1 -1
- package/package.json +1 -1
- package/packages/cli/dist/index.cjs +1 -1
- package/packages/cli/vendor/src/components/display/kanban.tsx +175 -57
- package/packages/cli/vendor/src/components/notifications/notification-center.tsx +11 -11
- package/packages/cli/vendor/src/showcase/package-meta.ts +1 -1
- package/packages/cli/vendor/src/showcase/tembro-registry.json +1 -1
- package/packages/cli/vendor/templates/showcase/src/showcase/layout/HeroSection.tsx +2 -2
- package/packages/cli/vendor/templates/showcase/src/showcase/layout/WorkbenchSidebar.tsx +1 -1
- package/registry.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## 3.1.15 - 2026-07-16
|
|
6
|
+
|
|
7
|
+
- Fixed `NotificationCenter` to use solid, fallback-safe popover surfaces when host apps do not define optional `--aui-*` theme tokens.
|
|
8
|
+
- Synced the notification fix into the vendored CLI source used by generated projects.
|
|
9
|
+
|
|
10
|
+
## 3.1.14 - 2026-07-16
|
|
11
|
+
|
|
12
|
+
- Fixed Kanban drag-and-drop by adding a native drag/drop fallback while preserving the existing `@dnd-kit` integration.
|
|
13
|
+
- Kept Kanban controlled and uncontrolled column updates in sync for drag, drop, and card move callbacks.
|
|
14
|
+
- Refreshed registry/showcase package metadata for the 3.1.14 release.
|
|
15
|
+
|
|
5
16
|
## 3.1.13 - 2026-07-16
|
|
6
17
|
|
|
7
18
|
- Fixed `LineChart` responsive SVG height so wide dashboard cards no longer stretch line charts into oversized panels.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const PACKAGE_LATEST_VERSION = "3.1.
|
|
1
|
+
export declare const PACKAGE_LATEST_VERSION = "3.1.15";
|
|
2
2
|
export declare const PACKAGE_LATEST_RELEASE_DATE = "July 15, 2026";
|
|
3
|
-
export declare const PACKAGE_DEPENDENCY_RANGE = "3.1.
|
|
3
|
+
export declare const PACKAGE_DEPENDENCY_RANGE = "3.1.15";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/utils.cjs"),n=require("../ui/card/index.cjs"),r=require("../../../node_modules/@dnd-kit/helpers/dist/index.cjs"),i=require("../../../node_modules/@dnd-kit/react/index.cjs"),a=require("../../../node_modules/@dnd-kit/dom/sortable.cjs"),o=require("../../../node_modules/@dnd-kit/react/sortable.cjs");let s=require("react");s=e.__toESM(s,1);let c=require("lucide-react"),l=require("react/jsx-runtime");var u=`tembro-kanban-card:`,d=`tembro-kanban-column:`;function f(e){return`${u}${e}`}function p(e){return`${d}${e}`}function m(e){return e.startsWith(u)?e.slice(19):e}function h(e){let t=e===void 0?``:String(e);return t.startsWith(d)?t.slice(21):t}function g(e){return new Map(e.flatMap(e=>e.cards.map(e=>[f(e.key),e])))}function _(e,t){let n=g(e),i=r.move(Object.fromEntries(e.map(e=>[p(e.key),e.cards.map(e=>f(e.key))])),t);return e.map(e=>({...e,cards:(i[p(e.key)]??[]).map(e=>n.get(String(e))).filter(e=>!!e)}))}
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/utils.cjs"),n=require("../ui/card/index.cjs"),r=require("../../../node_modules/@dnd-kit/helpers/dist/index.cjs"),i=require("../../../node_modules/@dnd-kit/react/index.cjs"),a=require("../../../node_modules/@dnd-kit/dom/sortable.cjs"),o=require("../../../node_modules/@dnd-kit/react/sortable.cjs");let s=require("react");s=e.__toESM(s,1);let c=require("lucide-react"),l=require("react/jsx-runtime");var u=`tembro-kanban-card:`,d=`tembro-kanban-column:`;function f(e){return`${u}${e}`}function p(e){return`${d}${e}`}function m(e){return e.startsWith(u)?e.slice(19):e}function h(e){let t=e===void 0?``:String(e);return t.startsWith(d)?t.slice(21):t}function g(e){return new Map(e.flatMap(e=>e.cards.map(e=>[f(e.key),e])))}function _(e,t){let n=g(e),i=r.move(Object.fromEntries(e.map(e=>[p(e.key),e.cards.map(e=>f(e.key))])),t);return e.map(e=>({...e,cards:(i[p(e.key)]??[]).map(e=>n.get(String(e))).filter(e=>!!e)}))}function v(e,t,n){let r=e.find(e=>e.key===t.columnKey),i=e.find(e=>e.key===n.columnKey);if(!r||!i)return null;let a=r.cards.find(e=>e.key===t.cardKey);if(!a)return null;let o=r.cards.findIndex(e=>e.key===t.cardKey);if(o<0)return null;let s=i.cards,c=n.index??s.length;if(r.key===i.key&&c>o&&--c,c=Math.max(0,Math.min(c,s.length)),r.key===i.key&&o===c)return null;let l=e.map(e=>e.key===r.key?{...e,cards:e.cards.filter(e=>e.key!==t.cardKey)}:e).map(e=>{if(e.key!==i.key)return e;let t=[...e.cards];return t.splice(c,0,a),{...e,cards:t}});return{columns:l,change:{card:a,fromColumn:r,toColumn:l.find(e=>e.key===i.key)??i,fromIndex:o,toIndex:c}}}var y=s.forwardRef(function({label:e,disabled:t},n){return(0,l.jsx)(`button`,{ref:n,type:`button`,className:`inline-flex size-8 shrink-0 touch-none items-center justify-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-45`,"aria-label":e,disabled:t,onClick:e=>e.stopPropagation(),children:(0,l.jsx)(c.GripVerticalIcon,{className:`size-4`,"aria-hidden":`true`})})});function b({card:e,handle:t}){return(0,l.jsxs)(n.Card,{className:`transition-colors hover:bg-muted/40`,children:[(0,l.jsx)(n.CardHeader,{className:`p-3 pb-1`,children:(0,l.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,l.jsx)(n.CardTitle,{className:`text-sm`,children:e.title}),(0,l.jsxs)(`div`,{className:`flex items-center gap-1`,children:[e.extra,t]})]})}),e.description||e.meta?(0,l.jsxs)(n.CardContent,{className:`grid gap-2 p-3 pt-0 text-xs text-muted-foreground`,children:[e.description,e.meta?(0,l.jsx)(`div`,{children:e.meta}):null]}):null]})}function x({card:e,column:n,index:r,boardDisabled:i,renderCard:a,onCardClick:s,dragHandleLabel:c,cardClassName:u,onNativeDragStart:d,onNativeDragEnd:m,onNativeDrop:h}){let g=i||n.disabled===!0||e.disabled===!0,{ref:_,handleRef:v,isDragging:x,isDropTarget:S}=o.useSortable({id:f(e.key),index:r,group:p(n.key),type:`tembro-kanban-card`,accept:`tembro-kanban-card`,disabled:g,data:{cardKey:e.key,columnKey:n.key},transition:{duration:180,easing:`cubic-bezier(0.2, 0, 0, 1)`,idle:!0}}),C=(0,l.jsx)(y,{ref:v,label:c?.(e,n)??`Move ${String(e.title)}`,disabled:g}),w={index:r,isDragging:x,isDropTarget:S,handle:C};return(0,l.jsx)(`article`,{ref:_,"data-slot":`kanban-card`,"data-dragging":x||void 0,"data-drop-target":S||void 0,"data-disabled":g||void 0,role:s&&!g?`button`:void 0,tabIndex:s&&!g?0:void 0,"aria-label":typeof e.title==`string`?e.title:void 0,draggable:!g,className:t.cn(`rounded-lg outline-none transition-[opacity,box-shadow]`,s&&!g&&`cursor-pointer focus-visible:ring-2 focus-visible:ring-ring`,S&&`ring-2 ring-primary/30`,x&&`opacity-30`,g&&`opacity-55`,u),onClick:()=>{g||s?.(e,n)},onDragStart:t=>{if(g)return;let i={cardKey:e.key,columnKey:n.key,index:r};t.dataTransfer.effectAllowed=`move`,t.dataTransfer.setData(`text/plain`,JSON.stringify(i)),d?.(i)},onDragEnd:m,onDragOver:e=>{g||e.preventDefault()},onDrop:e=>{g||(e.preventDefault(),e.stopPropagation(),h?.({columnKey:n.key,index:r}))},onKeyDown:t=>{t.target!==t.currentTarget||g||!s||(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),s(e,n))},children:a?.(e,n,w)??(0,l.jsx)(b,{card:e,handle:C})})}function S({column:e,boardDisabled:n,renderCard:r,onCardClick:a,dragHandleLabel:o,emptyColumn:s,columnClassName:c,cardClassName:u,onNativeDragStart:d,onNativeDragEnd:f,onNativeDrop:m}){let{ref:h,isDropTarget:g}=i.useDroppable({id:p(e.key),type:`tembro-kanban-column`,accept:`tembro-kanban-card`,disabled:n||e.disabled===!0,collisionPriority:1,data:{columnKey:e.key}});return(0,l.jsxs)(`section`,{ref:h,"data-slot":`kanban-column`,"data-drop-target":g||void 0,"data-disabled":e.disabled||void 0,"aria-label":typeof e.title==`string`?e.title:void 0,className:t.cn(`grid min-h-40 content-start gap-3 rounded-lg border bg-muted/35 p-3 transition-[border-color,background-color,box-shadow]`,g&&`border-primary/60 bg-primary/5 ring-2 ring-primary/15`,e.disabled&&`opacity-60`,c),onDragOver:t=>{n||e.disabled===!0||t.preventDefault()},onDrop:t=>{n||e.disabled===!0||(t.preventDefault(),m?.({columnKey:e.key,index:e.cards.length}))},children:[(0,l.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,l.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,l.jsx)(`h3`,{className:`text-sm font-semibold text-foreground`,children:e.title}),e.description?(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description}):null]}),(0,l.jsx)(`div`,{className:`rounded-full bg-background px-2 py-0.5 text-xs text-muted-foreground`,children:e.count??e.cards.length})]}),(0,l.jsx)(`div`,{className:`grid min-h-16 content-start gap-2`,children:e.cards.length===0?(0,l.jsxs)(`div`,{className:`grid min-h-20 place-items-center rounded-lg border border-dashed p-3 text-center text-xs text-muted-foreground`,children:[(0,l.jsx)(`span`,{children:s}),(0,l.jsx)(`span`,{className:`sr-only`,children:`No cards yet.`})]}):e.cards.map((t,i)=>(0,l.jsx)(x,{card:t,column:e,index:i,boardDisabled:n,renderCard:r,onCardClick:a,dragHandleLabel:o,cardClassName:u,onNativeDragStart:d,onNativeDragEnd:f,onNativeDrop:m},t.key))})]})}function C({columns:e,defaultColumns:n=[],onColumnsChange:r,onCardMove:o,renderCard:c,onCardClick:u,disabled:d=!1,emptyColumn:p=`Drop cards here.`,dragHandleLabel:g,columnClassName:y,cardClassName:x,overlayClassName:C,className:w,"aria-label":T=`Kanban board`,...E}){let[D,O]=s.useState(()=>n),[k,A]=s.useState(null),[j,M]=s.useState(null),N=s.useRef(null),P=s.useRef(null),F=e??D,I=k??F,L=e!==void 0;function R(e){let t=e.operation.source;if(!t)return;let n=String(t.id);N.current=F,A(F),M(n)}function z(e){let t=e.operation.source;if(!t||!a.isSortable(t))return;let n=_(N.current??F,e);N.current=n,A(n)}function B(e){let t=e.operation.source;if(M(null),e.canceled||!t||!a.isSortable(t)){N.current=null,A(null);return}let n=N.current??_(F,e),i=m(String(t.id)),s=h(t.initialGroup),c=h(t.group),l=F.find(e=>e.key===s),u=n.find(e=>e.key===c),d=l?.cards.find(e=>e.key===i);if(N.current=null,A(null),!d||!l||!u)return;let f={card:d,fromColumn:l,toColumn:u,fromIndex:t.initialIndex,toIndex:t.index};L||O(n),r?.(n,f),o?.(f)}function V(e){let t=P.current;if(P.current=null,!t)return;let n=v(F,t,e);n&&(L||O(n.columns),r?.(n.columns,n.change),o?.(n.change))}let H=j?I.flatMap(e=>e.cards.map(t=>({card:t,column:e}))).find(({card:e})=>f(e.key)===j):void 0;return(0,l.jsxs)(i.DragDropProvider,{onDragStart:R,onDragOver:z,onDragEnd:B,children:[(0,l.jsx)(`div`,{...E,role:`group`,"aria-label":T,"data-slot":`kanban-board`,className:t.cn(`grid gap-4 sm:auto-cols-[minmax(280px,1fr)] sm:grid-flow-col sm:overflow-x-auto sm:pb-2`,w),children:I.map(e=>(0,l.jsx)(S,{column:e,boardDisabled:d,renderCard:c,onCardClick:u,dragHandleLabel:g,emptyColumn:p,columnClassName:y,cardClassName:x,onNativeDragStart:e=>{P.current=e},onNativeDragEnd:()=>{P.current=null},onNativeDrop:V},e.key))}),(0,l.jsx)(i.DragOverlay,{children:H?(0,l.jsx)(`div`,{className:t.cn(`min-w-64 rotate-1 opacity-95 shadow-2xl`,C),children:c?.(H.card,H.column,{index:H.column.cards.findIndex(e=>e.key===H.card.key),isDragging:!0,isDropTarget:!1,handle:null})??(0,l.jsx)(b,{card:H.card,handle:null})}):null})]})}exports.KanbanBoard=C;
|
|
@@ -33,7 +33,38 @@ function S(e, t) {
|
|
|
33
33
|
cards: (r[v(e.key)] ?? []).map((e) => n.get(String(e))).filter((e) => !!e)
|
|
34
34
|
}));
|
|
35
35
|
}
|
|
36
|
-
|
|
36
|
+
function C(e, t, n) {
|
|
37
|
+
let r = e.find((e) => e.key === t.columnKey), i = e.find((e) => e.key === n.columnKey);
|
|
38
|
+
if (!r || !i) return null;
|
|
39
|
+
let a = r.cards.find((e) => e.key === t.cardKey);
|
|
40
|
+
if (!a) return null;
|
|
41
|
+
let o = r.cards.findIndex((e) => e.key === t.cardKey);
|
|
42
|
+
if (o < 0) return null;
|
|
43
|
+
let s = i.cards, c = n.index ?? s.length;
|
|
44
|
+
if (r.key === i.key && c > o && --c, c = Math.max(0, Math.min(c, s.length)), r.key === i.key && o === c) return null;
|
|
45
|
+
let l = e.map((e) => e.key === r.key ? {
|
|
46
|
+
...e,
|
|
47
|
+
cards: e.cards.filter((e) => e.key !== t.cardKey)
|
|
48
|
+
} : e).map((e) => {
|
|
49
|
+
if (e.key !== i.key) return e;
|
|
50
|
+
let t = [...e.cards];
|
|
51
|
+
return t.splice(c, 0, a), {
|
|
52
|
+
...e,
|
|
53
|
+
cards: t
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
columns: l,
|
|
58
|
+
change: {
|
|
59
|
+
card: a,
|
|
60
|
+
fromColumn: r,
|
|
61
|
+
toColumn: l.find((e) => e.key === i.key) ?? i,
|
|
62
|
+
fromIndex: o,
|
|
63
|
+
toIndex: c
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
var w = d.forwardRef(function({ label: e, disabled: t }, n) {
|
|
37
68
|
return /* @__PURE__ */ p("button", {
|
|
38
69
|
ref: n,
|
|
39
70
|
type: "button",
|
|
@@ -47,7 +78,7 @@ var C = d.forwardRef(function({ label: e, disabled: t }, n) {
|
|
|
47
78
|
})
|
|
48
79
|
});
|
|
49
80
|
});
|
|
50
|
-
function
|
|
81
|
+
function T({ card: e, handle: a }) {
|
|
51
82
|
return /* @__PURE__ */ m(t, {
|
|
52
83
|
className: "transition-colors hover:bg-muted/40",
|
|
53
84
|
children: [/* @__PURE__ */ p(r, {
|
|
@@ -68,14 +99,14 @@ function w({ card: e, handle: a }) {
|
|
|
68
99
|
}) : null]
|
|
69
100
|
});
|
|
70
101
|
}
|
|
71
|
-
function
|
|
72
|
-
let
|
|
102
|
+
function E({ card: t, column: n, index: r, boardDisabled: i, renderCard: a, onCardClick: o, dragHandleLabel: s, cardClassName: c, onNativeDragStart: l, onNativeDragEnd: d, onNativeDrop: f }) {
|
|
103
|
+
let m = i || n.disabled === !0 || t.disabled === !0, { ref: h, handleRef: g, isDragging: y, isDropTarget: b } = u({
|
|
73
104
|
id: _(t.key),
|
|
74
105
|
index: r,
|
|
75
106
|
group: v(n.key),
|
|
76
107
|
type: "tembro-kanban-card",
|
|
77
108
|
accept: "tembro-kanban-card",
|
|
78
|
-
disabled:
|
|
109
|
+
disabled: m,
|
|
79
110
|
data: {
|
|
80
111
|
cardKey: t.key,
|
|
81
112
|
columnKey: n.key
|
|
@@ -85,40 +116,60 @@ function T({ card: t, column: n, index: r, boardDisabled: i, renderCard: a, onCa
|
|
|
85
116
|
easing: "cubic-bezier(0.2, 0, 0, 1)",
|
|
86
117
|
idle: !0
|
|
87
118
|
}
|
|
88
|
-
}),
|
|
89
|
-
ref:
|
|
119
|
+
}), x = /* @__PURE__ */ p(w, {
|
|
120
|
+
ref: g,
|
|
90
121
|
label: s?.(t, n) ?? `Move ${String(t.title)}`,
|
|
91
|
-
disabled:
|
|
92
|
-
}),
|
|
122
|
+
disabled: m
|
|
123
|
+
}), S = {
|
|
93
124
|
index: r,
|
|
94
|
-
isDragging:
|
|
95
|
-
isDropTarget:
|
|
96
|
-
handle:
|
|
125
|
+
isDragging: y,
|
|
126
|
+
isDropTarget: b,
|
|
127
|
+
handle: x
|
|
97
128
|
};
|
|
98
129
|
return /* @__PURE__ */ p("article", {
|
|
99
|
-
ref:
|
|
130
|
+
ref: h,
|
|
100
131
|
"data-slot": "kanban-card",
|
|
101
|
-
"data-dragging":
|
|
102
|
-
"data-drop-target":
|
|
103
|
-
"data-disabled":
|
|
104
|
-
role: o && !
|
|
105
|
-
tabIndex: o && !
|
|
132
|
+
"data-dragging": y || void 0,
|
|
133
|
+
"data-drop-target": b || void 0,
|
|
134
|
+
"data-disabled": m || void 0,
|
|
135
|
+
role: o && !m ? "button" : void 0,
|
|
136
|
+
tabIndex: o && !m ? 0 : void 0,
|
|
106
137
|
"aria-label": typeof t.title == "string" ? t.title : void 0,
|
|
107
|
-
|
|
138
|
+
draggable: !m,
|
|
139
|
+
className: e("rounded-lg outline-none transition-[opacity,box-shadow]", o && !m && "cursor-pointer focus-visible:ring-2 focus-visible:ring-ring", b && "ring-2 ring-primary/30", y && "opacity-30", m && "opacity-55", c),
|
|
108
140
|
onClick: () => {
|
|
109
|
-
|
|
141
|
+
m || o?.(t, n);
|
|
142
|
+
},
|
|
143
|
+
onDragStart: (e) => {
|
|
144
|
+
if (m) return;
|
|
145
|
+
let i = {
|
|
146
|
+
cardKey: t.key,
|
|
147
|
+
columnKey: n.key,
|
|
148
|
+
index: r
|
|
149
|
+
};
|
|
150
|
+
e.dataTransfer.effectAllowed = "move", e.dataTransfer.setData("text/plain", JSON.stringify(i)), l?.(i);
|
|
151
|
+
},
|
|
152
|
+
onDragEnd: d,
|
|
153
|
+
onDragOver: (e) => {
|
|
154
|
+
m || e.preventDefault();
|
|
155
|
+
},
|
|
156
|
+
onDrop: (e) => {
|
|
157
|
+
m || (e.preventDefault(), e.stopPropagation(), f?.({
|
|
158
|
+
columnKey: n.key,
|
|
159
|
+
index: r
|
|
160
|
+
}));
|
|
110
161
|
},
|
|
111
162
|
onKeyDown: (e) => {
|
|
112
|
-
e.target !== e.currentTarget ||
|
|
163
|
+
e.target !== e.currentTarget || m || !o || (e.key === "Enter" || e.key === " ") && (e.preventDefault(), o(t, n));
|
|
113
164
|
},
|
|
114
|
-
children: a?.(t, n,
|
|
165
|
+
children: a?.(t, n, S) ?? /* @__PURE__ */ p(T, {
|
|
115
166
|
card: t,
|
|
116
|
-
handle:
|
|
167
|
+
handle: x
|
|
117
168
|
})
|
|
118
169
|
});
|
|
119
170
|
}
|
|
120
|
-
function
|
|
121
|
-
let { ref:
|
|
171
|
+
function D({ column: t, boardDisabled: n, renderCard: r, onCardClick: i, dragHandleLabel: a, emptyColumn: o, columnClassName: s, cardClassName: l, onNativeDragStart: u, onNativeDragEnd: d, onNativeDrop: f }) {
|
|
172
|
+
let { ref: h, isDropTarget: g } = c({
|
|
122
173
|
id: v(t.key),
|
|
123
174
|
type: "tembro-kanban-column",
|
|
124
175
|
accept: "tembro-kanban-card",
|
|
@@ -127,12 +178,21 @@ function E({ column: t, boardDisabled: n, renderCard: r, onCardClick: i, dragHan
|
|
|
127
178
|
data: { columnKey: t.key }
|
|
128
179
|
});
|
|
129
180
|
return /* @__PURE__ */ m("section", {
|
|
130
|
-
ref:
|
|
181
|
+
ref: h,
|
|
131
182
|
"data-slot": "kanban-column",
|
|
132
|
-
"data-drop-target":
|
|
183
|
+
"data-drop-target": g || void 0,
|
|
133
184
|
"data-disabled": t.disabled || void 0,
|
|
134
185
|
"aria-label": typeof t.title == "string" ? t.title : void 0,
|
|
135
|
-
className: e("grid min-h-40 content-start gap-3 rounded-lg border bg-muted/35 p-3 transition-[border-color,background-color,box-shadow]",
|
|
186
|
+
className: e("grid min-h-40 content-start gap-3 rounded-lg border bg-muted/35 p-3 transition-[border-color,background-color,box-shadow]", g && "border-primary/60 bg-primary/5 ring-2 ring-primary/15", t.disabled && "opacity-60", s),
|
|
187
|
+
onDragOver: (e) => {
|
|
188
|
+
n || t.disabled === !0 || e.preventDefault();
|
|
189
|
+
},
|
|
190
|
+
onDrop: (e) => {
|
|
191
|
+
n || t.disabled === !0 || (e.preventDefault(), f?.({
|
|
192
|
+
columnKey: t.key,
|
|
193
|
+
index: t.cards.length
|
|
194
|
+
}));
|
|
195
|
+
},
|
|
136
196
|
children: [/* @__PURE__ */ m("div", {
|
|
137
197
|
className: "flex items-start justify-between gap-3",
|
|
138
198
|
children: [/* @__PURE__ */ m("div", {
|
|
@@ -156,7 +216,7 @@ function E({ column: t, boardDisabled: n, renderCard: r, onCardClick: i, dragHan
|
|
|
156
216
|
className: "sr-only",
|
|
157
217
|
children: "No cards yet."
|
|
158
218
|
})]
|
|
159
|
-
}) : t.cards.map((e, o) => /* @__PURE__ */ p(
|
|
219
|
+
}) : t.cards.map((e, o) => /* @__PURE__ */ p(E, {
|
|
160
220
|
card: e,
|
|
161
221
|
column: t,
|
|
162
222
|
index: o,
|
|
@@ -164,33 +224,36 @@ function E({ column: t, boardDisabled: n, renderCard: r, onCardClick: i, dragHan
|
|
|
164
224
|
renderCard: r,
|
|
165
225
|
onCardClick: i,
|
|
166
226
|
dragHandleLabel: a,
|
|
167
|
-
cardClassName: l
|
|
227
|
+
cardClassName: l,
|
|
228
|
+
onNativeDragStart: u,
|
|
229
|
+
onNativeDragEnd: d,
|
|
230
|
+
onNativeDrop: f
|
|
168
231
|
}, e.key))
|
|
169
232
|
})]
|
|
170
233
|
});
|
|
171
234
|
}
|
|
172
|
-
function
|
|
173
|
-
let [
|
|
174
|
-
function
|
|
235
|
+
function O({ columns: t, defaultColumns: n = [], onColumnsChange: r, onCardMove: i, renderCard: a, onCardClick: c, disabled: u = !1, emptyColumn: f = "Drop cards here.", dragHandleLabel: h, columnClassName: g, cardClassName: v, overlayClassName: x, className: w, "aria-label": E = "Kanban board", ...O }) {
|
|
236
|
+
let [k, A] = d.useState(() => n), [j, M] = d.useState(null), [N, P] = d.useState(null), F = d.useRef(null), I = d.useRef(null), L = t ?? k, R = j ?? L, z = t !== void 0;
|
|
237
|
+
function B(e) {
|
|
175
238
|
let t = e.operation.source;
|
|
176
239
|
if (!t) return;
|
|
177
240
|
let n = String(t.id);
|
|
178
|
-
|
|
241
|
+
F.current = L, M(L), P(n);
|
|
179
242
|
}
|
|
180
|
-
function
|
|
243
|
+
function V(e) {
|
|
181
244
|
let t = e.operation.source;
|
|
182
245
|
if (!t || !l(t)) return;
|
|
183
|
-
let n = S(
|
|
184
|
-
|
|
246
|
+
let n = S(F.current ?? L, e);
|
|
247
|
+
F.current = n, M(n);
|
|
185
248
|
}
|
|
186
|
-
function
|
|
249
|
+
function H(e) {
|
|
187
250
|
let t = e.operation.source;
|
|
188
|
-
if (
|
|
189
|
-
|
|
251
|
+
if (P(null), e.canceled || !t || !l(t)) {
|
|
252
|
+
F.current = null, M(null);
|
|
190
253
|
return;
|
|
191
254
|
}
|
|
192
|
-
let n =
|
|
193
|
-
if (
|
|
255
|
+
let n = F.current ?? S(L, e), a = y(String(t.id)), o = b(t.initialGroup), s = b(t.group), c = L.find((e) => e.key === o), u = n.find((e) => e.key === s), d = c?.cards.find((e) => e.key === a);
|
|
256
|
+
if (F.current = null, M(null), !d || !c || !u) return;
|
|
194
257
|
let f = {
|
|
195
258
|
card: d,
|
|
196
259
|
fromColumn: c,
|
|
@@ -198,23 +261,29 @@ function D({ columns: t, defaultColumns: n = [], onColumnsChange: r, onCardMove:
|
|
|
198
261
|
fromIndex: t.initialIndex,
|
|
199
262
|
toIndex: t.index
|
|
200
263
|
};
|
|
201
|
-
|
|
264
|
+
z || A(n), r?.(n, f), i?.(f);
|
|
265
|
+
}
|
|
266
|
+
function U(e) {
|
|
267
|
+
let t = I.current;
|
|
268
|
+
if (I.current = null, !t) return;
|
|
269
|
+
let n = C(L, t, e);
|
|
270
|
+
n && (z || A(n.columns), r?.(n.columns, n.change), i?.(n.change));
|
|
202
271
|
}
|
|
203
|
-
let
|
|
272
|
+
let W = N ? R.flatMap((e) => e.cards.map((t) => ({
|
|
204
273
|
card: t,
|
|
205
274
|
column: e
|
|
206
|
-
}))).find(({ card: e }) => _(e.key) ===
|
|
275
|
+
}))).find(({ card: e }) => _(e.key) === N) : void 0;
|
|
207
276
|
return /* @__PURE__ */ m(o, {
|
|
208
|
-
onDragStart:
|
|
209
|
-
onDragOver:
|
|
210
|
-
onDragEnd:
|
|
277
|
+
onDragStart: B,
|
|
278
|
+
onDragOver: V,
|
|
279
|
+
onDragEnd: H,
|
|
211
280
|
children: [/* @__PURE__ */ p("div", {
|
|
212
|
-
...
|
|
281
|
+
...O,
|
|
213
282
|
role: "group",
|
|
214
|
-
"aria-label":
|
|
283
|
+
"aria-label": E,
|
|
215
284
|
"data-slot": "kanban-board",
|
|
216
|
-
className: e("grid gap-4 sm:auto-cols-[minmax(280px,1fr)] sm:grid-flow-col sm:overflow-x-auto sm:pb-2",
|
|
217
|
-
children:
|
|
285
|
+
className: e("grid gap-4 sm:auto-cols-[minmax(280px,1fr)] sm:grid-flow-col sm:overflow-x-auto sm:pb-2", w),
|
|
286
|
+
children: R.map((e) => /* @__PURE__ */ p(D, {
|
|
218
287
|
column: e,
|
|
219
288
|
boardDisabled: u,
|
|
220
289
|
renderCard: a,
|
|
@@ -222,21 +291,28 @@ function D({ columns: t, defaultColumns: n = [], onColumnsChange: r, onCardMove:
|
|
|
222
291
|
dragHandleLabel: h,
|
|
223
292
|
emptyColumn: f,
|
|
224
293
|
columnClassName: g,
|
|
225
|
-
cardClassName: v
|
|
294
|
+
cardClassName: v,
|
|
295
|
+
onNativeDragStart: (e) => {
|
|
296
|
+
I.current = e;
|
|
297
|
+
},
|
|
298
|
+
onNativeDragEnd: () => {
|
|
299
|
+
I.current = null;
|
|
300
|
+
},
|
|
301
|
+
onNativeDrop: U
|
|
226
302
|
}, e.key))
|
|
227
|
-
}), /* @__PURE__ */ p(s, { children:
|
|
303
|
+
}), /* @__PURE__ */ p(s, { children: W ? /* @__PURE__ */ p("div", {
|
|
228
304
|
className: e("min-w-64 rotate-1 opacity-95 shadow-2xl", x),
|
|
229
|
-
children: a?.(
|
|
230
|
-
index:
|
|
305
|
+
children: a?.(W.card, W.column, {
|
|
306
|
+
index: W.column.cards.findIndex((e) => e.key === W.card.key),
|
|
231
307
|
isDragging: !0,
|
|
232
308
|
isDropTarget: !1,
|
|
233
309
|
handle: null
|
|
234
|
-
}) ?? /* @__PURE__ */ p(
|
|
235
|
-
card:
|
|
310
|
+
}) ?? /* @__PURE__ */ p(T, {
|
|
311
|
+
card: W.card,
|
|
236
312
|
handle: null
|
|
237
313
|
})
|
|
238
314
|
}) : null })]
|
|
239
315
|
});
|
|
240
316
|
}
|
|
241
317
|
//#endregion
|
|
242
|
-
export {
|
|
318
|
+
export { O as KanbanBoard };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/utils.cjs"),n=require("../ui/button/index.cjs"),r=require("../ui/popover/index.cjs");let i=require("react");i=e.__toESM(i,1);let a=require("lucide-react"),o=require("react/jsx-runtime");function s({notifications:e,onMarkAllRead:i,onClearAll:s,onNotificationClick:c,emptyLabel:l=`No new notifications`,title:u=`Notifications`,className:d,...f}){let p=e.filter(e=>!e.read).length,m=e.reduce((e,t)=>{let n=String(t.group??`Recent`);return e[n]=[...e[n]??[],t],e},{});return(0,o.jsx)(`div`,{"data-slot":`notification-center`,className:d,...f,children:(0,o.jsxs)(r.Popover,{children:[(0,o.jsxs)(n.Button,{render:(0,o.jsx)(r.PopoverTrigger,{}),variant:`ghost`,size:`icon`,className:`relative rounded-full border
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/utils.cjs"),n=require("../ui/button/index.cjs"),r=require("../ui/popover/index.cjs");let i=require("react");i=e.__toESM(i,1);let a=require("lucide-react"),o=require("react/jsx-runtime");function s({notifications:e,onMarkAllRead:i,onClearAll:s,onNotificationClick:c,emptyLabel:l=`No new notifications`,title:u=`Notifications`,className:d,...f}){let p=e.filter(e=>!e.read).length,m=e.reduce((e,t)=>{let n=String(t.group??`Recent`);return e[n]=[...e[n]??[],t],e},{});return(0,o.jsx)(`div`,{"data-slot":`notification-center`,className:d,...f,children:(0,o.jsxs)(r.Popover,{children:[(0,o.jsxs)(n.Button,{render:(0,o.jsx)(r.PopoverTrigger,{}),variant:`ghost`,size:`icon`,className:`relative rounded-full border bg-white text-foreground shadow-sm hover:bg-muted dark:bg-neutral-950`,children:[(0,o.jsx)(a.BellIcon,{className:`size-5`}),p>0&&(0,o.jsxs)(`span`,{className:`absolute -right-1 -top-1 inline-flex min-w-5 items-center justify-center rounded-full bg-primary px-1.5 py-0.5 text-[10px] font-bold leading-none text-primary-foreground shadow-[0_8px_20px_rgba(16,185,129,0.24)]`,children:[p,(0,o.jsxs)(`span`,{className:`sr-only`,children:[p,` unread notifications`]})]})]}),(0,o.jsxs)(r.PopoverContent,{className:`isolate w-[24rem] overflow-hidden rounded-3xl border bg-white p-0 text-popover-foreground opacity-100 shadow-[0_24px_60px_rgba(15,23,42,0.18)] dark:bg-neutral-950`,align:`end`,children:[(0,o.jsxs)(`div`,{className:`flex items-center justify-between border-b bg-white px-5 py-4 dark:bg-neutral-950`,children:[(0,o.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,o.jsx)(`h4`,{className:`font-semibold tracking-tight text-foreground`,children:u}),(0,o.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:p>0?`${p} unread update${p>1?`s`:``}`:`You're all caught up`})]}),(0,o.jsxs)(`div`,{className:`flex items-center gap-2`,children:[p>0&&i?(0,o.jsx)(n.Button,{variant:`ghost`,size:`sm`,className:`h-8 rounded-full border px-3 text-xs font-semibold text-muted-foreground hover:bg-background hover:text-foreground`,onClick:i,children:`Mark all read`}):null,e.length>0&&s?(0,o.jsx)(n.Button,{variant:`ghost`,size:`sm`,className:`h-8 rounded-full border px-3 text-xs font-semibold text-muted-foreground hover:bg-background hover:text-foreground`,onClick:s,children:`Clear all`}):null]})]}),(0,o.jsx)(`div`,{className:`max-h-[400px] overflow-y-auto bg-white p-2 dark:bg-neutral-950`,children:e.length===0?(0,o.jsx)(`div`,{className:`rounded-2xl border border-dashed px-6 py-10 text-center text-sm text-muted-foreground`,children:l}):(0,o.jsx)(`div`,{className:`flex flex-col gap-3`,children:Object.entries(m).map(([e,n])=>(0,o.jsxs)(`div`,{className:`grid gap-2`,children:[(0,o.jsx)(`div`,{className:`px-2 pt-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:e}),n.map(e=>(0,o.jsxs)(`button`,{className:t.cn(`flex flex-col gap-1 rounded-2xl border border-transparent bg-white px-4 py-3 text-left transition hover:border-border hover:bg-muted dark:bg-neutral-950 dark:hover:bg-neutral-900`,!e.read&&`border-primary/20 bg-slate-50 dark:bg-neutral-900`),onClick:()=>c?.(e),children:[(0,o.jsxs)(`div`,{className:`flex w-full items-start justify-between gap-2`,children:[(0,o.jsx)(`span`,{className:`text-sm font-semibold leading-tight text-foreground`,children:e.title}),!e.read&&(0,o.jsx)(`span`,{className:`mt-1 flex size-2 shrink-0 rounded-full bg-primary shadow-[0_0_0_4px_color-mix(in_srgb,var(--primary)_14%,transparent)]`})]}),e.description&&(0,o.jsx)(`span`,{className:`line-clamp-2 text-xs leading-5 text-muted-foreground`,children:e.description}),e.time&&(0,o.jsx)(`span`,{className:`mt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/80`,children:e.time})]},e.id))]},e))})})]})]})})}exports.NotificationCenter=s;
|
|
@@ -18,19 +18,19 @@ function c({ notifications: c, onMarkAllRead: l, onClearAll: u, onNotificationCl
|
|
|
18
18
|
render: /* @__PURE__ */ o(i, {}),
|
|
19
19
|
variant: "ghost",
|
|
20
20
|
size: "icon",
|
|
21
|
-
className: "relative rounded-full border
|
|
21
|
+
className: "relative rounded-full border bg-white text-foreground shadow-sm hover:bg-muted dark:bg-neutral-950",
|
|
22
22
|
children: [/* @__PURE__ */ o(a, { className: "size-5" }), g > 0 && /* @__PURE__ */ s("span", {
|
|
23
|
-
className: "absolute -right-1 -top-1 inline-flex min-w-5 items-center justify-center rounded-full bg-
|
|
23
|
+
className: "absolute -right-1 -top-1 inline-flex min-w-5 items-center justify-center rounded-full bg-primary px-1.5 py-0.5 text-[10px] font-bold leading-none text-primary-foreground shadow-[0_8px_20px_rgba(16,185,129,0.24)]",
|
|
24
24
|
children: [g, /* @__PURE__ */ s("span", {
|
|
25
25
|
className: "sr-only",
|
|
26
26
|
children: [g, " unread notifications"]
|
|
27
27
|
})]
|
|
28
28
|
})]
|
|
29
29
|
}), /* @__PURE__ */ s(r, {
|
|
30
|
-
className: "w-[24rem] overflow-hidden rounded-3xl border
|
|
30
|
+
className: "isolate w-[24rem] overflow-hidden rounded-3xl border bg-white p-0 text-popover-foreground opacity-100 shadow-[0_24px_60px_rgba(15,23,42,0.18)] dark:bg-neutral-950",
|
|
31
31
|
align: "end",
|
|
32
32
|
children: [/* @__PURE__ */ s("div", {
|
|
33
|
-
className: "flex items-center justify-between border-b
|
|
33
|
+
className: "flex items-center justify-between border-b bg-white px-5 py-4 dark:bg-neutral-950",
|
|
34
34
|
children: [/* @__PURE__ */ s("div", {
|
|
35
35
|
className: "grid gap-0.5",
|
|
36
36
|
children: [/* @__PURE__ */ o("h4", {
|
|
@@ -45,21 +45,21 @@ function c({ notifications: c, onMarkAllRead: l, onClearAll: u, onNotificationCl
|
|
|
45
45
|
children: [g > 0 && l ? /* @__PURE__ */ o(t, {
|
|
46
46
|
variant: "ghost",
|
|
47
47
|
size: "sm",
|
|
48
|
-
className: "h-8 rounded-full border
|
|
48
|
+
className: "h-8 rounded-full border px-3 text-xs font-semibold text-muted-foreground hover:bg-background hover:text-foreground",
|
|
49
49
|
onClick: l,
|
|
50
50
|
children: "Mark all read"
|
|
51
51
|
}) : null, c.length > 0 && u ? /* @__PURE__ */ o(t, {
|
|
52
52
|
variant: "ghost",
|
|
53
53
|
size: "sm",
|
|
54
|
-
className: "h-8 rounded-full border
|
|
54
|
+
className: "h-8 rounded-full border px-3 text-xs font-semibold text-muted-foreground hover:bg-background hover:text-foreground",
|
|
55
55
|
onClick: u,
|
|
56
56
|
children: "Clear all"
|
|
57
57
|
}) : null]
|
|
58
58
|
})]
|
|
59
59
|
}), /* @__PURE__ */ o("div", {
|
|
60
|
-
className: "max-h-[400px] overflow-y-auto bg-
|
|
60
|
+
className: "max-h-[400px] overflow-y-auto bg-white p-2 dark:bg-neutral-950",
|
|
61
61
|
children: c.length === 0 ? /* @__PURE__ */ o("div", {
|
|
62
|
-
className: "rounded-2xl border border-dashed
|
|
62
|
+
className: "rounded-2xl border border-dashed px-6 py-10 text-center text-sm text-muted-foreground",
|
|
63
63
|
children: f
|
|
64
64
|
}) : /* @__PURE__ */ o("div", {
|
|
65
65
|
className: "flex flex-col gap-3",
|
|
@@ -69,7 +69,7 @@ function c({ notifications: c, onMarkAllRead: l, onClearAll: u, onNotificationCl
|
|
|
69
69
|
className: "px-2 pt-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-muted-foreground",
|
|
70
70
|
children: t
|
|
71
71
|
}), n.map((t) => /* @__PURE__ */ s("button", {
|
|
72
|
-
className: e("flex flex-col gap-1 rounded-2xl border border-transparent px-4 py-3 text-left transition hover:border-
|
|
72
|
+
className: e("flex flex-col gap-1 rounded-2xl border border-transparent bg-white px-4 py-3 text-left transition hover:border-border hover:bg-muted dark:bg-neutral-950 dark:hover:bg-neutral-900", !t.read && "border-primary/20 bg-slate-50 dark:bg-neutral-900"),
|
|
73
73
|
onClick: () => d?.(t),
|
|
74
74
|
children: [
|
|
75
75
|
/* @__PURE__ */ s("div", {
|
|
@@ -77,7 +77,7 @@ function c({ notifications: c, onMarkAllRead: l, onClearAll: u, onNotificationCl
|
|
|
77
77
|
children: [/* @__PURE__ */ o("span", {
|
|
78
78
|
className: "text-sm font-semibold leading-tight text-foreground",
|
|
79
79
|
children: t.title
|
|
80
|
-
}), !t.read && /* @__PURE__ */ o("span", { className: "mt-1 flex size-2 shrink-0 rounded-full bg-
|
|
80
|
+
}), !t.read && /* @__PURE__ */ o("span", { className: "mt-1 flex size-2 shrink-0 rounded-full bg-primary shadow-[0_0_0_4px_color-mix(in_srgb,var(--primary)_14%,transparent)]" })]
|
|
81
81
|
}),
|
|
82
82
|
t.description && /* @__PURE__ */ o("span", {
|
|
83
83
|
className: "line-clamp-2 text-xs leading-5 text-muted-foreground",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=`3.1.
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=`3.1.15`,t=`July 15, 2026`,n=e;exports.PACKAGE_DEPENDENCY_RANGE=n,exports.PACKAGE_LATEST_RELEASE_DATE=t,exports.PACKAGE_LATEST_VERSION=e;
|