@devalok/shilp-sutra 0.59.0 → 0.60.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/MIGRATION.md +72 -0
- package/dist/composed/avatar-group.js +3 -3
- package/dist/composed/avatar-group.js.map +1 -1
- package/dist/composed/bulk-action-bar.d.ts +9 -35
- package/dist/composed/bulk-action-bar.d.ts.map +1 -1
- package/dist/composed/bulk-action-bar.js +2 -139
- package/dist/composed/index.js +6 -5
- package/dist/composed/master-detail.d.ts.map +1 -1
- package/dist/composed/master-detail.js +1 -1
- package/dist/composed/master-detail.js.map +1 -1
- package/dist/composed/multi-select-popover.d.ts.map +1 -1
- package/dist/composed/multi-select-popover.js +1 -1
- package/dist/composed/multi-select-popover.js.map +1 -1
- package/dist/tokens/semantic.css +85 -3
- package/dist/ui/avatar.d.ts.map +1 -1
- package/dist/ui/avatar.js +3 -3
- package/dist/ui/avatar.js.map +1 -1
- package/dist/ui/bulk-action-bar.d.ts +59 -0
- package/dist/ui/bulk-action-bar.d.ts.map +1 -0
- package/dist/ui/bulk-action-bar.js +145 -0
- package/dist/ui/bulk-action-bar.js.map +1 -0
- package/dist/ui/checkbox.d.ts.map +1 -1
- package/dist/ui/checkbox.js +1 -1
- package/dist/ui/checkbox.js.map +1 -1
- package/dist/ui/combobox.d.ts.map +1 -1
- package/dist/ui/combobox.js +10 -10
- package/dist/ui/combobox.js.map +1 -1
- package/dist/ui/data-table-body.d.ts.map +1 -1
- package/dist/ui/data-table-body.js +2 -1
- package/dist/ui/data-table-body.js.map +1 -1
- package/dist/ui/data-table-bulk-actions.d.ts +26 -1
- package/dist/ui/data-table-bulk-actions.d.ts.map +1 -1
- package/dist/ui/data-table-bulk-actions.js +21 -46
- package/dist/ui/data-table-bulk-actions.js.map +1 -1
- package/dist/ui/data-table-context.d.ts +36 -2
- package/dist/ui/data-table-context.d.ts.map +1 -1
- package/dist/ui/data-table-context.js +25 -21
- package/dist/ui/data-table-context.js.map +1 -1
- package/dist/ui/data-table-header.d.ts.map +1 -1
- package/dist/ui/data-table-header.js +2 -1
- package/dist/ui/data-table-header.js.map +1 -1
- package/dist/ui/index.d.ts +1 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +58 -57
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/input.d.ts.map +1 -1
- package/dist/ui/input.js +6 -6
- package/dist/ui/input.js.map +1 -1
- package/dist/ui/radio.d.ts.map +1 -1
- package/dist/ui/radio.js +4 -4
- package/dist/ui/radio.js.map +1 -1
- package/dist/ui/select.d.ts.map +1 -1
- package/dist/ui/select.js +6 -6
- package/dist/ui/select.js.map +1 -1
- package/dist/ui/switch.d.ts.map +1 -1
- package/dist/ui/switch.js +2 -2
- package/dist/ui/switch.js.map +1 -1
- package/dist/ui/table.d.ts.map +1 -1
- package/dist/ui/table.js +1 -1
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/textarea.d.ts.map +1 -1
- package/dist/ui/textarea.js +6 -6
- package/dist/ui/textarea.js.map +1 -1
- package/dist/ui/toast.d.ts.map +1 -1
- package/dist/ui/toast.js +1 -1
- package/dist/ui/toast.js.map +1 -1
- package/docs/components/composed/bulk-action-bar.md +14 -7
- package/docs/components/ui/bulk-action-bar.md +72 -0
- package/llms.txt +2 -2
- package/make-kit/foundations/color.md +3 -1
- package/mcp-manifest.json +178 -150
- package/package.json +6 -1
- package/skill/SKILL.md +1 -1
- package/skill/references/components.md +2 -2
- package/dist/composed/bulk-action-bar.js.map +0 -1
|
@@ -4,6 +4,13 @@
|
|
|
4
4
|
- Server-safe: No
|
|
5
5
|
- Category: composed
|
|
6
6
|
|
|
7
|
+
Floating selection toolbar for bulk actions — re-exported from `ui/bulk-action-bar`.
|
|
8
|
+
|
|
9
|
+
The implementation moved to `ui/bulk-action-bar` so `DataTable` could use it
|
|
10
|
+
(`ui/` may not import `composed/`). This path keeps working. **See
|
|
11
|
+
[ui/bulk-action-bar](../ui/bulk-action-bar.md) for the full reference**; it is
|
|
12
|
+
the canonical doc and this one only mirrors the surface.
|
|
13
|
+
|
|
7
14
|
## Props
|
|
8
15
|
show: boolean (controls visibility)
|
|
9
16
|
count: number (number of selected items — displayed in badge)
|
|
@@ -11,6 +18,7 @@
|
|
|
11
18
|
actions: BulkActionBarAction[]
|
|
12
19
|
totalCount: number (optional — total selectable items; enables "Select all")
|
|
13
20
|
onSelectAll: () => void (optional — called by the "Select all" control)
|
|
21
|
+
placement: "bottom" | "top" | "inline" (default: "bottom")
|
|
14
22
|
className: string
|
|
15
23
|
...div attributes (forwardRef to the toolbar div; HTMLAttributes spread)
|
|
16
24
|
|
|
@@ -25,7 +33,7 @@
|
|
|
25
33
|
confirmMessage: string (optional — default "Are you sure?")
|
|
26
34
|
|
|
27
35
|
## Defaults
|
|
28
|
-
|
|
36
|
+
placement: "bottom"
|
|
29
37
|
|
|
30
38
|
## Example
|
|
31
39
|
```jsx
|
|
@@ -42,11 +50,10 @@
|
|
|
42
50
|
|
|
43
51
|
## Composability
|
|
44
52
|
- **Standalone floating toolbar** — use with DataTable, TreeView, or any selection-capable UI.
|
|
45
|
-
- **DataTable auto-integration:** DataTable's `bulkActions` prop renders this internally
|
|
46
|
-
- **
|
|
47
|
-
- **Portal to body + fixed bottom-center z-50** — independent of parent layout. Check for other fixed elements that might overlap.
|
|
53
|
+
- **DataTable auto-integration:** DataTable's `bulkActions` prop renders this internally; `bulkActionsPosition` maps to `placement`.
|
|
54
|
+
- **Placement decides portalling** — `bottom` / `top` portal to the body, `inline` renders in flow.
|
|
48
55
|
|
|
49
56
|
## Gotchas
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
57
|
+
- Prefer importing from `@devalok/shilp-sutra/ui/bulk-action-bar`. This path is kept so existing imports do not break.
|
|
58
|
+
- Portalled placements do not render during SSR; `inline` does.
|
|
59
|
+
- Inside a Dialog or Sheet use `placement="inline"`, or the portal escapes the overlay's stacking context.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# BulkActionBar
|
|
2
|
+
|
|
3
|
+
- Import: @devalok/shilp-sutra/ui/bulk-action-bar
|
|
4
|
+
- Server-safe: No
|
|
5
|
+
- Category: ui
|
|
6
|
+
|
|
7
|
+
Also re-exported from `@devalok/shilp-sutra/composed/bulk-action-bar`, which is
|
|
8
|
+
where it used to live. Both paths work. The implementation sits in `ui/` because
|
|
9
|
+
`DataTable` uses it and `ui/` may not import `composed/`.
|
|
10
|
+
|
|
11
|
+
## Props
|
|
12
|
+
show: boolean (controls visibility)
|
|
13
|
+
count: number (number of selected items — displayed in badge)
|
|
14
|
+
onClearSelection: () => void
|
|
15
|
+
actions: BulkActionBarAction[]
|
|
16
|
+
totalCount: number (optional — total selectable items; enables "Select all")
|
|
17
|
+
onSelectAll: () => void (optional — called by the "Select all" control)
|
|
18
|
+
placement: "bottom" | "top" | "inline" (default: "bottom")
|
|
19
|
+
className: string
|
|
20
|
+
...div attributes (forwardRef to the toolbar div; HTMLAttributes spread)
|
|
21
|
+
|
|
22
|
+
### BulkActionBarAction
|
|
23
|
+
label: string
|
|
24
|
+
icon: IconInput (optional — any icon component or element)
|
|
25
|
+
onClick: () => void
|
|
26
|
+
color: "accent" | "error" | "success" | "warning" | "info" | "neutral" (default: "accent")
|
|
27
|
+
disabled: boolean (optional)
|
|
28
|
+
loading: boolean (optional — pending spinner on the action)
|
|
29
|
+
requiresConfirmation: boolean (optional — inline confirm before executing)
|
|
30
|
+
confirmMessage: string (optional — default "Are you sure?")
|
|
31
|
+
|
|
32
|
+
## Defaults
|
|
33
|
+
placement: "bottom"
|
|
34
|
+
|
|
35
|
+
## Example
|
|
36
|
+
```jsx
|
|
37
|
+
<BulkActionBar
|
|
38
|
+
show={selected.length > 0}
|
|
39
|
+
count={selected.length}
|
|
40
|
+
onClearSelection={() => setSelected([])}
|
|
41
|
+
actions={[
|
|
42
|
+
{ label: 'Archive', icon: IconArchive, onClick: archiveSelected },
|
|
43
|
+
{
|
|
44
|
+
label: 'Delete',
|
|
45
|
+
icon: IconTrash,
|
|
46
|
+
onClick: deleteSelected,
|
|
47
|
+
color: 'error',
|
|
48
|
+
requiresConfirmation: true,
|
|
49
|
+
},
|
|
50
|
+
]}
|
|
51
|
+
/>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Inside a Dialog or Sheet, use `placement="inline"` so the bar stays within the
|
|
55
|
+
overlay:
|
|
56
|
+
|
|
57
|
+
```jsx
|
|
58
|
+
<BulkActionBar placement="inline" show={n > 0} count={n} … />
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Composability
|
|
62
|
+
- **Standalone floating toolbar** — use with DataTable, TreeView, or any selection-capable UI.
|
|
63
|
+
- **DataTable auto-integration:** DataTable's `bulkActions` prop renders this internally, so you rarely render it directly alongside a DataTable. `bulkActionsPosition` maps to `placement`.
|
|
64
|
+
- **Data-driven actions:** `{ label, icon, onClick, color, disabled, loading, requiresConfirmation }[]`. Destructive confirmation is built in — set `requiresConfirmation` rather than reaching for ConfirmDialog.
|
|
65
|
+
- **Placement decides portalling.** `bottom` / `top` portal to `document.body` and pin to the viewport. `inline` renders in flow, in place.
|
|
66
|
+
|
|
67
|
+
## Gotchas
|
|
68
|
+
- `placement="bottom"` / `"top"` render via `createPortal` into `document.body`, so they do not appear during SSR — they mount client-side only. `placement="inline"` has no portal and renders server-side normally.
|
|
69
|
+
- **A portal escapes its ancestors' stacking context.** Inside a Dialog or Sheet, a portalled bar floats over the page instead of belonging to the overlay — use `placement="inline"` there. This is why placement and portalling are one prop rather than two.
|
|
70
|
+
- Pinned placements use `z-sticky`; ensure no other fixed element conflicts.
|
|
71
|
+
- Follows the ARIA toolbar model: one tab stop, roving focus on Arrow / Home / End (mirrored under `dir="rtl"`), Escape to clear or to cancel a pending confirmation. If you wrap the actions in anything that also handles arrow keys, the two will fight.
|
|
72
|
+
- Uses Framer Motion AnimatePresence; respects `prefers-reduced-motion`.
|
package/llms.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @devalok/shilp-sutra
|
|
2
2
|
|
|
3
|
-
> Radix UI + Tailwind 4 (CSS-first) + CVA design system for Devalok apps, v0.
|
|
3
|
+
> Radix UI + Tailwind 4 (CSS-first) + CVA design system for Devalok apps, v0.60.0.
|
|
4
4
|
> Built on the same primitives as shadcn/ui but with DIFFERENT prop APIs — never guess from shadcn knowledge; verify every prop.
|
|
5
5
|
> This file is a ROUTER: it tells you what exists and where to get details. Do not look for prop tables here — fetch them per component (MCP tool or per-component doc file below).
|
|
6
6
|
|
|
@@ -120,7 +120,7 @@ Format: `[name](doc path): summary`. Import paths follow `@devalok/shilp-sutra/<
|
|
|
120
120
|
### composed
|
|
121
121
|
- [activity-feed](docs/components/composed/activity-feed.md)
|
|
122
122
|
- [avatar-group](docs/components/composed/avatar-group.md)
|
|
123
|
-
- [bulk-action-bar](docs/components/composed/bulk-action-bar.md)
|
|
123
|
+
- [bulk-action-bar](docs/components/composed/bulk-action-bar.md): Floating selection toolbar for bulk actions — re-exported from `ui/bulk-action-bar`
|
|
124
124
|
- [command-palette](docs/components/composed/command-palette.md)
|
|
125
125
|
- [confirm-dialog](docs/components/composed/confirm-dialog.md)
|
|
126
126
|
- [content-card](docs/components/composed/content-card.md): **DEPRECATED (v0.44.0)** — will be removed in the next major
|
|
@@ -31,7 +31,7 @@ Border?
|
|
|
31
31
|
→ standard hairline → border-surface-border
|
|
32
32
|
→ emphasized → border-surface-border-strong
|
|
33
33
|
→ subtle divider → border-surface-border-subtle
|
|
34
|
-
→ state (form invalid) → border-error-
|
|
34
|
+
→ state (form invalid) → border-error-8 (or use Input state="error" instead)
|
|
35
35
|
|
|
36
36
|
Status?
|
|
37
37
|
→ error → bg-error-3 / text-error-11 / border-error-7
|
|
@@ -57,6 +57,8 @@ Brand emphasis?
|
|
|
57
57
|
| `surface-overlay` | Floating layers — dialogs, popovers, dropdowns, inputs, toasts. |
|
|
58
58
|
| `surface-inverted` | Tooltips, inverted badges. Pair with `surface-inverted-fg`. |
|
|
59
59
|
| `surface-disabled` | Disabled controls. Pair with `surface-fg-disabled`. |
|
|
60
|
+
| `field` | Ground for a form control — Input, Textarea, Select, Combobox. Not a surface tier: the control is defined by its border, so the fill sits flush with whatever it is on. |
|
|
61
|
+
| `field-hover` | Hover state on a form control. |
|
|
60
62
|
|
|
61
63
|
Available as: `bg-surface-*`, `text-surface-*`, `border-surface-*`.
|
|
62
64
|
|
package/mcp-manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "./mcp-manifest.schema.json",
|
|
3
3
|
"manifestVersion": "1.2.0",
|
|
4
4
|
"package": "@devalok/shilp-sutra",
|
|
5
|
-
"packageVersion": "0.
|
|
5
|
+
"packageVersion": "0.60.0",
|
|
6
6
|
"components": {
|
|
7
7
|
"accordion": {
|
|
8
8
|
"displayName": "Accordion",
|
|
@@ -1221,6 +1221,161 @@
|
|
|
1221
1221
|
}
|
|
1222
1222
|
]
|
|
1223
1223
|
},
|
|
1224
|
+
"bulk-action-bar": {
|
|
1225
|
+
"displayName": "BulkActionBar",
|
|
1226
|
+
"tier": "composed",
|
|
1227
|
+
"import": "@devalok/shilp-sutra/composed/bulk-action-bar",
|
|
1228
|
+
"serverSafe": false,
|
|
1229
|
+
"description": "Floating selection toolbar for bulk actions — re-exported from `ui/bulk-action-bar`. The implementation moved to `ui/bulk-action-bar` so `DataTable` could use it (`ui/` may not import `composed/`). This path keeps working. **See [ui/bulk-action-bar](../ui/bulk-action-bar.md) for the full reference**; it is the canonical doc and this one only mirrors the surface.",
|
|
1230
|
+
"props": {
|
|
1231
|
+
"show": {
|
|
1232
|
+
"type": {
|
|
1233
|
+
"name": "boolean"
|
|
1234
|
+
},
|
|
1235
|
+
"required": false,
|
|
1236
|
+
"description": "controls visibility"
|
|
1237
|
+
},
|
|
1238
|
+
"count": {
|
|
1239
|
+
"type": {
|
|
1240
|
+
"name": "number"
|
|
1241
|
+
},
|
|
1242
|
+
"required": false,
|
|
1243
|
+
"description": "number of selected items — displayed in badge"
|
|
1244
|
+
},
|
|
1245
|
+
"onClearSelection": {
|
|
1246
|
+
"type": {
|
|
1247
|
+
"name": "function",
|
|
1248
|
+
"raw": "() => void"
|
|
1249
|
+
},
|
|
1250
|
+
"required": false
|
|
1251
|
+
},
|
|
1252
|
+
"actions": {
|
|
1253
|
+
"type": {
|
|
1254
|
+
"name": "object",
|
|
1255
|
+
"raw": "BulkActionBarAction[]"
|
|
1256
|
+
},
|
|
1257
|
+
"required": false
|
|
1258
|
+
},
|
|
1259
|
+
"totalCount": {
|
|
1260
|
+
"type": {
|
|
1261
|
+
"name": "number"
|
|
1262
|
+
},
|
|
1263
|
+
"required": false,
|
|
1264
|
+
"description": "optional — total selectable items; enables \"Select all\""
|
|
1265
|
+
},
|
|
1266
|
+
"onSelectAll": {
|
|
1267
|
+
"type": {
|
|
1268
|
+
"name": "function",
|
|
1269
|
+
"raw": "() => void (optional — called by the \"Select all\" control)"
|
|
1270
|
+
},
|
|
1271
|
+
"required": false
|
|
1272
|
+
},
|
|
1273
|
+
"placement": {
|
|
1274
|
+
"type": {
|
|
1275
|
+
"name": "enum",
|
|
1276
|
+
"value": [
|
|
1277
|
+
"bottom",
|
|
1278
|
+
"top",
|
|
1279
|
+
"inline"
|
|
1280
|
+
]
|
|
1281
|
+
},
|
|
1282
|
+
"required": false,
|
|
1283
|
+
"defaultValue": "bottom"
|
|
1284
|
+
},
|
|
1285
|
+
"className": {
|
|
1286
|
+
"type": {
|
|
1287
|
+
"name": "string"
|
|
1288
|
+
},
|
|
1289
|
+
"required": false
|
|
1290
|
+
}
|
|
1291
|
+
},
|
|
1292
|
+
"composition": {
|
|
1293
|
+
"notes": [
|
|
1294
|
+
"**Standalone floating toolbar** — use with DataTable, TreeView, or any selection-capable UI.",
|
|
1295
|
+
"**DataTable auto-integration:** DataTable's `bulkActions` prop renders this internally; `bulkActionsPosition` maps to `placement`.",
|
|
1296
|
+
"**Placement decides portalling** — `bottom` / `top` portal to the body, `inline` renders in flow."
|
|
1297
|
+
]
|
|
1298
|
+
},
|
|
1299
|
+
"docPath": "docs/components/composed/bulk-action-bar.md",
|
|
1300
|
+
"subComponents": {
|
|
1301
|
+
"BulkActionBarAction": {
|
|
1302
|
+
"props": {
|
|
1303
|
+
"label": {
|
|
1304
|
+
"type": {
|
|
1305
|
+
"name": "string"
|
|
1306
|
+
},
|
|
1307
|
+
"required": false
|
|
1308
|
+
},
|
|
1309
|
+
"icon": {
|
|
1310
|
+
"type": {
|
|
1311
|
+
"name": "object",
|
|
1312
|
+
"raw": "IconInput"
|
|
1313
|
+
},
|
|
1314
|
+
"required": false,
|
|
1315
|
+
"description": "optional — any icon component or element"
|
|
1316
|
+
},
|
|
1317
|
+
"onClick": {
|
|
1318
|
+
"type": {
|
|
1319
|
+
"name": "function",
|
|
1320
|
+
"raw": "() => void"
|
|
1321
|
+
},
|
|
1322
|
+
"required": false
|
|
1323
|
+
},
|
|
1324
|
+
"color": {
|
|
1325
|
+
"type": {
|
|
1326
|
+
"name": "enum",
|
|
1327
|
+
"value": [
|
|
1328
|
+
"accent",
|
|
1329
|
+
"error",
|
|
1330
|
+
"success",
|
|
1331
|
+
"warning",
|
|
1332
|
+
"info",
|
|
1333
|
+
"neutral"
|
|
1334
|
+
]
|
|
1335
|
+
},
|
|
1336
|
+
"required": false,
|
|
1337
|
+
"defaultValue": "accent"
|
|
1338
|
+
},
|
|
1339
|
+
"disabled": {
|
|
1340
|
+
"type": {
|
|
1341
|
+
"name": "boolean"
|
|
1342
|
+
},
|
|
1343
|
+
"required": false,
|
|
1344
|
+
"description": "optional"
|
|
1345
|
+
},
|
|
1346
|
+
"loading": {
|
|
1347
|
+
"type": {
|
|
1348
|
+
"name": "boolean"
|
|
1349
|
+
},
|
|
1350
|
+
"required": false,
|
|
1351
|
+
"description": "optional — pending spinner on the action"
|
|
1352
|
+
},
|
|
1353
|
+
"requiresConfirmation": {
|
|
1354
|
+
"type": {
|
|
1355
|
+
"name": "boolean"
|
|
1356
|
+
},
|
|
1357
|
+
"required": false,
|
|
1358
|
+
"description": "optional — inline confirm before executing"
|
|
1359
|
+
},
|
|
1360
|
+
"confirmMessage": {
|
|
1361
|
+
"type": {
|
|
1362
|
+
"name": "string"
|
|
1363
|
+
},
|
|
1364
|
+
"required": false,
|
|
1365
|
+
"description": "optional — default \"Are you sure?\""
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1368
|
+
}
|
|
1369
|
+
},
|
|
1370
|
+
"examples": [
|
|
1371
|
+
"<BulkActionBar\n show={selected.length > 0}\n count={selected.length}\n onClearSelection={() => setSelected([])}\n actions={[\n { label: 'Archive', icon: IconArchive, onClick: archiveSelected },\n { label: 'Delete', icon: IconTrash, onClick: deleteSelected, color: 'error' },\n ]}\n/>"
|
|
1372
|
+
],
|
|
1373
|
+
"gotchas": [
|
|
1374
|
+
"Prefer importing from `@devalok/shilp-sutra/ui/bulk-action-bar`. This path is kept so existing imports do not break.",
|
|
1375
|
+
"Portalled placements do not render during SSR; `inline` does.",
|
|
1376
|
+
"Inside a Dialog or Sheet use `placement=\"inline\"`, or the portal escapes the overlay's stacking context."
|
|
1377
|
+
]
|
|
1378
|
+
},
|
|
1224
1379
|
"button": {
|
|
1225
1380
|
"displayName": "Button",
|
|
1226
1381
|
"tier": "ui",
|
|
@@ -8659,150 +8814,6 @@
|
|
|
8659
8814
|
}
|
|
8660
8815
|
]
|
|
8661
8816
|
},
|
|
8662
|
-
"bulk-action-bar": {
|
|
8663
|
-
"displayName": "BulkActionBar",
|
|
8664
|
-
"tier": "composed",
|
|
8665
|
-
"import": "@devalok/shilp-sutra/composed/bulk-action-bar",
|
|
8666
|
-
"serverSafe": false,
|
|
8667
|
-
"description": "",
|
|
8668
|
-
"props": {
|
|
8669
|
-
"show": {
|
|
8670
|
-
"type": {
|
|
8671
|
-
"name": "boolean"
|
|
8672
|
-
},
|
|
8673
|
-
"required": false,
|
|
8674
|
-
"description": "controls visibility"
|
|
8675
|
-
},
|
|
8676
|
-
"count": {
|
|
8677
|
-
"type": {
|
|
8678
|
-
"name": "number"
|
|
8679
|
-
},
|
|
8680
|
-
"required": false,
|
|
8681
|
-
"description": "number of selected items — displayed in badge"
|
|
8682
|
-
},
|
|
8683
|
-
"onClearSelection": {
|
|
8684
|
-
"type": {
|
|
8685
|
-
"name": "function",
|
|
8686
|
-
"raw": "() => void"
|
|
8687
|
-
},
|
|
8688
|
-
"required": false
|
|
8689
|
-
},
|
|
8690
|
-
"actions": {
|
|
8691
|
-
"type": {
|
|
8692
|
-
"name": "object",
|
|
8693
|
-
"raw": "BulkActionBarAction[]"
|
|
8694
|
-
},
|
|
8695
|
-
"required": false
|
|
8696
|
-
},
|
|
8697
|
-
"totalCount": {
|
|
8698
|
-
"type": {
|
|
8699
|
-
"name": "number"
|
|
8700
|
-
},
|
|
8701
|
-
"required": false,
|
|
8702
|
-
"description": "optional — total selectable items; enables \"Select all\""
|
|
8703
|
-
},
|
|
8704
|
-
"onSelectAll": {
|
|
8705
|
-
"type": {
|
|
8706
|
-
"name": "function",
|
|
8707
|
-
"raw": "() => void (optional — called by the \"Select all\" control)"
|
|
8708
|
-
},
|
|
8709
|
-
"required": false
|
|
8710
|
-
},
|
|
8711
|
-
"className": {
|
|
8712
|
-
"type": {
|
|
8713
|
-
"name": "string"
|
|
8714
|
-
},
|
|
8715
|
-
"required": false
|
|
8716
|
-
}
|
|
8717
|
-
},
|
|
8718
|
-
"composition": {
|
|
8719
|
-
"notes": [
|
|
8720
|
-
"**Standalone floating toolbar** — use with DataTable, TreeView, or any selection-capable UI.",
|
|
8721
|
-
"**DataTable auto-integration:** DataTable's `bulkActions` prop renders this internally — typically you don't render BulkActionBar directly when using DataTable.",
|
|
8722
|
-
"**Data-driven actions:** `{ label, icon, onClick, color, disabled }[]`. For destructive confirmation, call ConfirmDialog from the onClick handler.",
|
|
8723
|
-
"**Portal to body + fixed bottom-center z-50** — independent of parent layout. Check for other fixed elements that might overlap."
|
|
8724
|
-
]
|
|
8725
|
-
},
|
|
8726
|
-
"docPath": "docs/components/composed/bulk-action-bar.md",
|
|
8727
|
-
"subComponents": {
|
|
8728
|
-
"BulkActionBarAction": {
|
|
8729
|
-
"props": {
|
|
8730
|
-
"label": {
|
|
8731
|
-
"type": {
|
|
8732
|
-
"name": "string"
|
|
8733
|
-
},
|
|
8734
|
-
"required": false
|
|
8735
|
-
},
|
|
8736
|
-
"icon": {
|
|
8737
|
-
"type": {
|
|
8738
|
-
"name": "object",
|
|
8739
|
-
"raw": "IconInput"
|
|
8740
|
-
},
|
|
8741
|
-
"required": false,
|
|
8742
|
-
"description": "optional — any icon component or element"
|
|
8743
|
-
},
|
|
8744
|
-
"onClick": {
|
|
8745
|
-
"type": {
|
|
8746
|
-
"name": "function",
|
|
8747
|
-
"raw": "() => void"
|
|
8748
|
-
},
|
|
8749
|
-
"required": false
|
|
8750
|
-
},
|
|
8751
|
-
"color": {
|
|
8752
|
-
"type": {
|
|
8753
|
-
"name": "enum",
|
|
8754
|
-
"value": [
|
|
8755
|
-
"accent",
|
|
8756
|
-
"error",
|
|
8757
|
-
"success",
|
|
8758
|
-
"warning",
|
|
8759
|
-
"info",
|
|
8760
|
-
"neutral"
|
|
8761
|
-
]
|
|
8762
|
-
},
|
|
8763
|
-
"required": false,
|
|
8764
|
-
"defaultValue": "accent"
|
|
8765
|
-
},
|
|
8766
|
-
"disabled": {
|
|
8767
|
-
"type": {
|
|
8768
|
-
"name": "boolean"
|
|
8769
|
-
},
|
|
8770
|
-
"required": false,
|
|
8771
|
-
"description": "optional"
|
|
8772
|
-
},
|
|
8773
|
-
"loading": {
|
|
8774
|
-
"type": {
|
|
8775
|
-
"name": "boolean"
|
|
8776
|
-
},
|
|
8777
|
-
"required": false,
|
|
8778
|
-
"description": "optional — pending spinner on the action"
|
|
8779
|
-
},
|
|
8780
|
-
"requiresConfirmation": {
|
|
8781
|
-
"type": {
|
|
8782
|
-
"name": "boolean"
|
|
8783
|
-
},
|
|
8784
|
-
"required": false,
|
|
8785
|
-
"description": "optional — inline confirm before executing"
|
|
8786
|
-
},
|
|
8787
|
-
"confirmMessage": {
|
|
8788
|
-
"type": {
|
|
8789
|
-
"name": "string"
|
|
8790
|
-
},
|
|
8791
|
-
"required": false,
|
|
8792
|
-
"description": "optional — default \"Are you sure?\""
|
|
8793
|
-
}
|
|
8794
|
-
}
|
|
8795
|
-
}
|
|
8796
|
-
},
|
|
8797
|
-
"examples": [
|
|
8798
|
-
"<BulkActionBar\n show={selected.length > 0}\n count={selected.length}\n onClearSelection={() => setSelected([])}\n actions={[\n { label: 'Archive', icon: IconArchive, onClick: archiveSelected },\n { label: 'Delete', icon: IconTrash, onClick: deleteSelected, color: 'error' },\n ]}\n/>"
|
|
8799
|
-
],
|
|
8800
|
-
"gotchas": [
|
|
8801
|
-
"Renders via `createPortal` into `document.body` — will not appear during SSR (mounts only client-side)",
|
|
8802
|
-
"Positioned fixed at bottom-center with `z-50`; ensure no other fixed elements conflict",
|
|
8803
|
-
"Uses Framer Motion AnimatePresence for slide-in/out animation"
|
|
8804
|
-
]
|
|
8805
|
-
},
|
|
8806
8817
|
"command-palette": {
|
|
8807
8818
|
"displayName": "CommandPalette",
|
|
8808
8819
|
"tier": "composed",
|
|
@@ -14022,6 +14033,14 @@
|
|
|
14022
14033
|
"name": "--color-segment-thumb",
|
|
14023
14034
|
"value": "var(--neutral-5)"
|
|
14024
14035
|
},
|
|
14036
|
+
{
|
|
14037
|
+
"name": "--color-field",
|
|
14038
|
+
"value": "Canvas"
|
|
14039
|
+
},
|
|
14040
|
+
{
|
|
14041
|
+
"name": "--color-field-hover",
|
|
14042
|
+
"value": "Canvas"
|
|
14043
|
+
},
|
|
14025
14044
|
{
|
|
14026
14045
|
"name": "--color-overlay",
|
|
14027
14046
|
"value": "Canvas"
|
|
@@ -14054,6 +14073,10 @@
|
|
|
14054
14073
|
"name": "--color-error-7",
|
|
14055
14074
|
"value": "CanvasText"
|
|
14056
14075
|
},
|
|
14076
|
+
{
|
|
14077
|
+
"name": "--color-error-8",
|
|
14078
|
+
"value": "CanvasText"
|
|
14079
|
+
},
|
|
14057
14080
|
{
|
|
14058
14081
|
"name": "--color-error-9",
|
|
14059
14082
|
"value": "Mark"
|
|
@@ -14094,6 +14117,10 @@
|
|
|
14094
14117
|
"name": "--color-success-7",
|
|
14095
14118
|
"value": "CanvasText"
|
|
14096
14119
|
},
|
|
14120
|
+
{
|
|
14121
|
+
"name": "--color-success-8",
|
|
14122
|
+
"value": "CanvasText"
|
|
14123
|
+
},
|
|
14097
14124
|
{
|
|
14098
14125
|
"name": "--color-success-9",
|
|
14099
14126
|
"value": "Highlight"
|
|
@@ -14774,7 +14801,7 @@
|
|
|
14774
14801
|
},
|
|
14775
14802
|
{
|
|
14776
14803
|
"name": "--shadow-pressed",
|
|
14777
|
-
"value": "0 0 0 1px oklch(
|
|
14804
|
+
"value": "0 0 0 1px oklch(1 0 0 / 0.10)"
|
|
14778
14805
|
},
|
|
14779
14806
|
{
|
|
14780
14807
|
"name": "--shadow-success",
|
|
@@ -14797,6 +14824,11 @@
|
|
|
14797
14824
|
"value": "1",
|
|
14798
14825
|
"darkValue": "2.5"
|
|
14799
14826
|
},
|
|
14827
|
+
{
|
|
14828
|
+
"name": "--shadow-color",
|
|
14829
|
+
"value": "0.263 0.029 259",
|
|
14830
|
+
"darkValue": "0.05 0.012 260"
|
|
14831
|
+
},
|
|
14800
14832
|
{
|
|
14801
14833
|
"name": "--shadow-edge-ring",
|
|
14802
14834
|
"value": "0 0 0 1px oklch(var(--shadow-color) / calc(0.09 * var(--shadow-strength)))",
|
|
@@ -14807,10 +14839,6 @@
|
|
|
14807
14839
|
"value": "0 0 0 1px oklch(var(--shadow-color) / calc(0.035 * var(--shadow-strength)))",
|
|
14808
14840
|
"darkValue": "0 0 0 1px oklch(1 0 0 / 0.07)"
|
|
14809
14841
|
},
|
|
14810
|
-
{
|
|
14811
|
-
"name": "--shadow-color",
|
|
14812
|
-
"value": "0.15 0.015 260"
|
|
14813
|
-
},
|
|
14814
14842
|
{
|
|
14815
14843
|
"name": "--shadow-transition",
|
|
14816
14844
|
"value": "box-shadow var(--duration-fast-02) var(--ease-productive-standard)"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devalok/shilp-sutra",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.60.0",
|
|
4
4
|
"description": "Devalok Design System — accessible React components, OKLCH design tokens, and Tailwind 4 CSS-first setup. Ships with AI-agent setup recipes.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Devalok Design & Strategy Studios <shilp-sutra@devalok.in>",
|
|
@@ -133,6 +133,11 @@
|
|
|
133
133
|
"import": "./dist/ui/button.js",
|
|
134
134
|
"default": "./dist/ui/button.js"
|
|
135
135
|
},
|
|
136
|
+
"./ui/bulk-action-bar": {
|
|
137
|
+
"types": "./dist/ui/bulk-action-bar.d.ts",
|
|
138
|
+
"import": "./dist/ui/bulk-action-bar.js",
|
|
139
|
+
"default": "./dist/ui/bulk-action-bar.js"
|
|
140
|
+
},
|
|
136
141
|
"./ui/button-group": {
|
|
137
142
|
"types": "./dist/ui/button-group.d.ts",
|
|
138
143
|
"import": "./dist/ui/button-group.js",
|
package/skill/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: shilp-sutra
|
|
|
3
3
|
description: Add, configure, and use components from Devalok's shilp-sutra design system (@devalok/shilp-sutra) — a Tailwind 4 + React 19 + CVA library with 110+ accessible components, OKLCH design tokens, framer-motion animations, and per-component RSC-safe entry points. Use this skill whenever the user mentions shilp-sutra, Devalok, the @devalok npm scope, or asks to install/add/style/theme UI in any React project that already depends on the package — even if they don't name it explicitly. Use it instead of generic shadcn/ui, MUI, or Chakra knowledge when shilp-sutra is in the project. Covers Next.js (App + Pages), Vite, Astro, Remix, TanStack Start setup playbooks; component API and variant reference; brand token customization; Server Component import patterns; and a troubleshoot tree for the thirteen most common breakages.
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: "0.
|
|
6
|
+
version: "0.60.0"
|
|
7
7
|
author: Devalok Design & Strategy Studios
|
|
8
8
|
homepage: https://github.com/devalok-design/shilp-sutra
|
|
9
9
|
npm: https://www.npmjs.com/package/@devalok/shilp-sutra
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# @devalok/shilp-sutra
|
|
4
4
|
|
|
5
|
-
> Radix UI + Tailwind 4 (CSS-first) + CVA design system for Devalok apps, v0.
|
|
5
|
+
> Radix UI + Tailwind 4 (CSS-first) + CVA design system for Devalok apps, v0.60.0.
|
|
6
6
|
> Built on the same primitives as shadcn/ui but with DIFFERENT prop APIs — never guess from shadcn knowledge; verify every prop.
|
|
7
7
|
> This file is a ROUTER: it tells you what exists and where to get details. Do not look for prop tables here — fetch them per component (MCP tool or per-component doc file below).
|
|
8
8
|
|
|
@@ -122,7 +122,7 @@ Format: `[name](doc path): summary`. Import paths follow `@devalok/shilp-sutra/<
|
|
|
122
122
|
### composed
|
|
123
123
|
- [activity-feed](docs/components/composed/activity-feed.md)
|
|
124
124
|
- [avatar-group](docs/components/composed/avatar-group.md)
|
|
125
|
-
- [bulk-action-bar](docs/components/composed/bulk-action-bar.md)
|
|
125
|
+
- [bulk-action-bar](docs/components/composed/bulk-action-bar.md): Floating selection toolbar for bulk actions — re-exported from `ui/bulk-action-bar`
|
|
126
126
|
- [command-palette](docs/components/composed/command-palette.md)
|
|
127
127
|
- [confirm-dialog](docs/components/composed/confirm-dialog.md)
|
|
128
128
|
- [content-card](docs/components/composed/content-card.md): **DEPRECATED (v0.44.0)** — will be removed in the next major
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bulk-action-bar.js","names":[],"sources":["../../src/composed/bulk-action-bar.tsx"],"sourcesContent":["'use client'\n\nimport { IconX } from '@tabler/icons-react'\nimport { AnimatePresence, motion, useReducedMotion } from 'framer-motion'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { Badge } from '../ui/badge'\nimport { Button } from '../ui/button'\nimport { Icon } from '../ui/icon'\nimport type { IconInput } from '../ui/lib/icon-input'\nimport { springs } from '../ui/lib/motion'\nimport { cn } from '../ui/lib/utils'\n\ntype ButtonColor = React.ComponentProps<typeof Button>['color']\n\nexport interface BulkActionBarAction {\n label: string\n icon?: IconInput\n onClick: () => void\n /** Any Button color. @default 'accent' (or 'error' for destructive). */\n color?: ButtonColor\n disabled?: boolean\n /** Show a pending spinner on the action (e.g. slow bulk op in flight). */\n loading?: boolean\n /** Show inline confirmation before executing the action. */\n requiresConfirmation?: boolean\n /** Custom confirmation message. @default 'Are you sure?' */\n confirmMessage?: string\n}\n\nexport interface BulkActionBarProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n // Keys whose types collide with framer-motion's HTMLMotionProps.\n 'children' | 'color' | 'onDrag' | 'onDragStart' | 'onDragEnd' | 'onAnimationStart' | 'onAnimationEnd' | 'onAnimationIteration' | 'style'\n > {\n show: boolean\n count: number\n onClearSelection: () => void\n actions: BulkActionBarAction[]\n /** Total items available for selection (enables \"Select all\"). */\n totalCount?: number\n /** Called when the user clicks \"Select all\". */\n onSelectAll?: () => void\n}\n\n/**\n * BulkActionBar — floating selection toolbar. Follows the ARIA toolbar model:\n * a single tab stop with roving focus (Arrow keys / Home / End) across ALL\n * controls (Select-all, actions, Clear), focus landing on the real buttons so\n * Enter/Space activate them. Arrow direction mirrors under `dir=\"rtl\"`. Escape\n * clears the selection (or cancels a pending confirmation).\n */\nconst BulkActionBar = React.forwardRef<HTMLDivElement, BulkActionBarProps>(\n function BulkActionBar(\n { show, count, onClearSelection, actions, totalCount, onSelectAll, className, ...props },\n forwardedRef,\n ) {\n const reduced = useReducedMotion()\n const [mounted, setMounted] = React.useState(false)\n const [focusedIndex, setFocusedIndex] = React.useState(0)\n const [confirming, setConfirming] = React.useState<number | null>(null)\n const controlRefs = React.useRef<Array<HTMLButtonElement | null>>([])\n const confirmRef = React.useRef<HTMLButtonElement | null>(null)\n\n const hasSelectAll = totalCount != null && totalCount > count && !!onSelectAll\n const selectAllOffset = hasSelectAll ? 1 : 0\n const total = selectAllOffset + actions.length + 1 // + Clear\n\n React.useEffect(() => { setMounted(true) }, [])\n React.useEffect(() => { setFocusedIndex(0); setConfirming(null) }, [actions.length])\n // Move focus to Confirm when a confirmation opens.\n React.useEffect(() => {\n if (confirming != null) confirmRef.current?.focus()\n }, [confirming])\n\n const focusAt = (i: number) => {\n const clamped = (i + total) % total\n setFocusedIndex(clamped)\n controlRefs.current[clamped]?.focus()\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (e.key === 'Escape') {\n e.preventDefault()\n if (confirming != null) { setConfirming(null); focusAt(focusedIndex) }\n else onClearSelection()\n return\n }\n if (confirming != null) return // roving suspended during confirm\n const rtl = e.currentTarget.dir === 'rtl' || document.dir === 'rtl'\n const fwd = rtl ? 'ArrowLeft' : 'ArrowRight'\n const back = rtl ? 'ArrowRight' : 'ArrowLeft'\n if (e.key === fwd) { e.preventDefault(); focusAt(focusedIndex + 1) }\n else if (e.key === back) { e.preventDefault(); focusAt(focusedIndex - 1) }\n else if (e.key === 'Home') { e.preventDefault(); focusAt(0) }\n else if (e.key === 'End') { e.preventDefault(); focusAt(total - 1) }\n }\n\n if (!mounted) return null\n\n const slideTransition = reduced ? { duration: 0 } : springs.smooth\n\n return createPortal(\n <AnimatePresence>\n {show && (\n <motion.div\n ref={forwardedRef}\n initial={reduced ? { opacity: 0 } : { y: 100, opacity: 0 }}\n animate={reduced ? { opacity: 1 } : { y: 0, opacity: 1 }}\n exit={reduced ? { opacity: 0 } : { y: 100, opacity: 0 }}\n transition={slideTransition}\n className={cn(\n 'fixed bottom-ds-06 start-1/2 z-sticky -translate-x-1/2',\n 'flex items-center gap-ds-04 rounded-surface bg-surface-overlay px-ds-05 py-ds-03 shadow-floating',\n className,\n )}\n role=\"toolbar\"\n aria-label={`${count} items selected`}\n onKeyDown={handleKeyDown}\n {...props}\n >\n <Badge variant=\"solid\" size=\"sm\">{count} selected</Badge>\n\n {hasSelectAll && (\n <Button\n ref={(el) => { controlRefs.current[0] = el }}\n variant=\"link\"\n size=\"xs\"\n tabIndex={focusedIndex === 0 ? 0 : -1}\n onClick={onSelectAll}\n >\n Select all {totalCount}\n </Button>\n )}\n\n <div className=\"flex items-center gap-ds-02\">\n {actions.map((action, i) => {\n const controlIndex = selectAllOffset + i\n const isConfirming = confirming === i\n if (isConfirming) {\n return (\n <div\n key={action.label}\n role=\"group\"\n aria-live=\"assertive\"\n className=\"flex items-center gap-ds-02\"\n >\n <span className=\"whitespace-nowrap text-body-sm text-surface-fg-muted\">\n {action.confirmMessage ?? 'Are you sure?'}\n </span>\n <Button\n ref={confirmRef}\n variant=\"solid\"\n size=\"sm\"\n color={action.color === 'error' ? 'error' : (action.color ?? 'accent')}\n onClick={() => { setConfirming(null); action.onClick() }}\n >\n Confirm\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => { setConfirming(null); focusAt(controlIndex) }}\n >\n Cancel\n </Button>\n </div>\n )\n }\n return (\n <Button\n key={action.label}\n ref={(el) => { controlRefs.current[controlIndex] = el }}\n variant=\"ghost\"\n size=\"sm\"\n color={action.color ?? 'accent'}\n disabled={action.disabled}\n loading={action.loading}\n startIcon={action.icon ?? undefined}\n tabIndex={focusedIndex === controlIndex ? 0 : -1}\n onClick={action.requiresConfirmation ? () => setConfirming(i) : action.onClick}\n >\n {action.label}\n </Button>\n )\n })}\n </div>\n\n <Button\n ref={(el) => { controlRefs.current[total - 1] = el }}\n variant=\"ghost\"\n size=\"icon-sm\"\n tabIndex={focusedIndex === total - 1 ? 0 : -1}\n onClick={onClearSelection}\n aria-label=\"Clear selection\"\n >\n <Icon icon={IconX} size=\"sm\" />\n </Button>\n </motion.div>\n )}\n </AnimatePresence>,\n document.body,\n )\n },\n)\nBulkActionBar.displayName = 'BulkActionBar'\n\nexport { BulkActionBar }\n"],"mappings":"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"}
|