makersclaw 0.3.0 → 0.3.1
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/package.json +1 -1
- package/r/annotate.json +3 -3
- package/r/approval-request.json +2 -2
- package/r/audio-player.json +2 -2
- package/r/auth-form.json +2 -2
- package/r/board.json +2 -2
- package/r/calendar-view.json +3 -3
- package/r/cart.json +2 -2
- package/r/chart.json +2 -2
- package/r/chat.json +2 -2
- package/r/code-editor.json +2 -2
- package/r/comment-box.json +3 -3
- package/r/contact-section.json +2 -2
- package/r/csv-import.json +3 -3
- package/r/data-table.json +2 -2
- package/r/diagram.json +2 -2
- package/r/doc-editor.json +2 -2
- package/r/doc-page.json +3 -3
- package/r/email-render.json +2 -2
- package/r/faq.json +2 -2
- package/r/file-upload.json +2 -2
- package/r/flow-canvas.json +2 -2
- package/r/footer.json +2 -2
- package/r/gantt.json +3 -3
- package/r/job-panel.json +2 -2
- package/r/json-editor.json +3 -3
- package/r/map.json +2 -2
- package/r/menubar.json +2 -2
- package/r/mind-map.json +3 -3
- package/r/navigation-menu.json +2 -2
- package/r/order-detail.json +2 -2
- package/r/org-chart.json +3 -3
- package/r/page-builder.json +2 -2
- package/r/payment-methods.json +2 -2
- package/r/pdf-document.json +2 -2
- package/r/pdf-viewer.json +2 -2
- package/r/product-detail.json +2 -2
- package/r/product-grid.json +3 -3
- package/r/record-form.json +2 -2
- package/r/record-notes.json +4 -4
- package/r/registry.json +121 -121
- package/r/search-dialog.json +2 -2
- package/r/settings-list.json +2 -2
- package/r/setup-checklist.json +2 -2
- package/r/share-dialog.json +2 -2
- package/r/sidebar.json +2 -2
- package/r/signature-pad.json +2 -2
- package/r/sketch-canvas.json +2 -2
- package/r/spreadsheet.json +2 -2
- package/r/stat-cards.json +3 -3
- package/r/task-list.json +3 -3
- package/r/task-model.json +2 -2
- package/r/testimonials.json +2 -2
- package/r/transaction-list.json +2 -2
- package/r/whiteboard.json +3 -3
- package/src/cli.mjs +19 -6
- package/src/registry.mjs +38 -4
- package/src/shadcn.mjs +6 -1
package/r/search-dialog.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "SearchDialog",
|
|
6
6
|
"description": "One ⌘K search over every kind of record — chats, documents, images, projects, people. Before typing it shows your sections (Last opened, Recent); while typing, ranked matches with the typed text marked, a date, image thumbnails, and kind chips (All, Chats, Images…) to narrow them. Searches your list in the browser, or your server through an async onSearch. Built on the kit's Command; SearchPanel is the same box inline.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"docs": "Installed to components/makersclaw/blocks/search-dialog. Import: import { SearchDialog, SearchPanel } from \"@/components/makersclaw/blocks/search-dialog\". Props and an example: components/makersclaw/blocks/search-dialog/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
45
45
|
"meta": {
|
|
46
46
|
"makersclaw": {
|
|
47
|
-
"version": "0.3.
|
|
47
|
+
"version": "0.3.1",
|
|
48
48
|
"useWhen": "An app has more than one kind of record and wants one global search box or ⌘K palette to find any of them, or a search page with type filters."
|
|
49
49
|
}
|
|
50
50
|
}
|
package/r/settings-list.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "SettingsList",
|
|
6
6
|
"description": "A card of settings, one row each — icon, label, description, meta lines, a badge, and its control: a Switch, a Select, a Button, a remove button or a menu of actions, with optional details that open under the row. Every change saves on its own through an async callback; the row shows the new value at once, a spinner while it saves, and on failure the old value back with the reason and Try again. variant=\"matrix\" is the notification grid: events by group down the side, channels (email, push, SMS) across, a switch per cell, stacked on a phone.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"docs": "Installed to components/makersclaw/blocks/settings-list. Import: import { SettingsList } from \"@/components/makersclaw/blocks/settings-list\". Props and an example: components/makersclaw/blocks/settings-list/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
60
60
|
"meta": {
|
|
61
61
|
"makersclaw": {
|
|
62
|
-
"version": "0.3.
|
|
62
|
+
"version": "0.3.1",
|
|
63
63
|
"useWhen": "An account or workspace settings screen where each setting applies the moment it is changed: preferences, two-step sign-in methods, signed-in devices, connected integrations, billing profiles, notification preferences per channel. Not for a form of fields saved together with one button (record-form)."
|
|
64
64
|
}
|
|
65
65
|
}
|
package/r/setup-checklist.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "SetupChecklist",
|
|
6
6
|
"description": "The steps to get set up: which are done, how far along the whole is (a ring, a bar, or \"Step 2 of 4\"), and the button for the next one, sent out through an async onAction that can fail on the step. Four shapes: folding rows in a card with a dismiss menu, numbered step cards, a plain step list with a help panel, and bordered accordion rows that can be locked until the step before is done.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"docs": "Installed to components/makersclaw/blocks/setup-checklist. Import: import { SetupChecklist } from \"@/components/makersclaw/blocks/setup-checklist\". Props and an example: components/makersclaw/blocks/setup-checklist/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
45
45
|
"meta": {
|
|
46
46
|
"makersclaw": {
|
|
47
|
-
"version": "0.3.
|
|
47
|
+
"version": "0.3.1",
|
|
48
48
|
"useWhen": "A new account, workspace or shop has a few things to do before it is useful (complete the profile, invite the team, connect a tool, launch) and the founder should see what is left. Not for a running job's stages (kit Steps or job-panel), and not for a multi-page form wizard."
|
|
49
49
|
}
|
|
50
50
|
}
|
package/r/share-dialog.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "ShareDialog",
|
|
6
6
|
"description": "Who can see a record and how to let more people in: invite by email (comma separated, with an access level), each person with their access in a menu (can view, can edit, remove), sharing switches, and a link with a copy button that turns to a check. A dialog, or the same body inline (SharePanel). Every change is an async callback; a failure shows and the old value comes back.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"docs": "Installed to components/makersclaw/blocks/share-dialog. Import: import { ShareDialog, SharePanel } from \"@/components/makersclaw/blocks/share-dialog\". Props and an example: components/makersclaw/blocks/share-dialog/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
46
46
|
"meta": {
|
|
47
47
|
"makersclaw": {
|
|
48
|
-
"version": "0.3.
|
|
48
|
+
"version": "0.3.1",
|
|
49
49
|
"useWhen": "A record, project, document or workspace can be shared: an \"Invite\" or \"Share\" button, a members list with roles, a public link to copy."
|
|
50
50
|
}
|
|
51
51
|
}
|
package/r/sidebar.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "Sidebar",
|
|
6
6
|
"description": "An app's navigation down the left edge: app name or workspace switcher, groups of items with icons, counts and nested items, the signed-in person with their menu; collapses to icons (remembered) and becomes a Sheet behind a trigger on a phone. Optional: inset or floating look, a ⌘K search over every item, folding groups with colour dots, a second column (a mail list, or a parent's children to drill into), a \"New\" button and a \"…\" menu per item (a chat history).",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"docs": "Installed to components/makersclaw/blocks/sidebar. Import: import { Sidebar, SidebarLayout, SidebarTrigger, useSidebar } from \"@/components/makersclaw/blocks/sidebar\". Props and an example: components/makersclaw/blocks/sidebar/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
63
63
|
"meta": {
|
|
64
64
|
"makersclaw": {
|
|
65
|
-
"version": "0.3.
|
|
65
|
+
"version": "0.3.1",
|
|
66
66
|
"useWhen": "An app with more than a handful of places to go (inbox, deals, contacts, reports, settings, projects) that wants a real app shell: compose it in app/shell.jsx around the surfaces. Not for in-page tabs (Tabs) or a short strip of links."
|
|
67
67
|
}
|
|
68
68
|
}
|
package/r/signature-pad.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "SignaturePad",
|
|
6
6
|
"description": "A signature field (signature_pad) in the workspace theme: a full-name field, then draw on a paper box (smooth pen strokes, undo the last stroke, clear with Undo) or type the name set as a signature. Sign returns a record: a cropped transparent PNG in dark ink, the typed name, the mode and the time; the signed view shows it with Sign again. Works as a form field too, through a handle (toPNG, getSignature).",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [
|
|
11
11
|
"signature_pad@5.1.4"
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"docs": "Installed to components/makersclaw/blocks/signature-pad. Import: import { SignaturePad, useSignaturePad, signatureRecord, formatSignedAt } from \"@/components/makersclaw/blocks/signature-pad\". Props and an example: components/makersclaw/blocks/signature-pad/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
66
66
|
"meta": {
|
|
67
67
|
"makersclaw": {
|
|
68
|
-
"version": "0.3.
|
|
68
|
+
"version": "0.3.1",
|
|
69
69
|
"useWhen": "A screen needs someone to sign: accepting a proposal or a quote, a delivery or work-done sign-off, a waiver, a consent form, an approval on a record. The proposal-accept block is built on it. It records an acceptance with a picture of the signature — it is not a certified legal e-signature (no identity check, no audit trail beyond what you store)."
|
|
70
70
|
}
|
|
71
71
|
}
|
package/r/sketch-canvas.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "SketchCanvas",
|
|
6
6
|
"description": "A freeform drawing canvas (Excalidraw) in the workspace theme: a Miro-style tool rail (select, pan, draw, shapes, arrows, text, image, eraser, frames), a floating toolbar over the selection with colours from the theme's tokens, zoom and undo controls, a friendly empty state, and stamp tools that place ready-made drawings (UI wireframe pieces built in). Optional locked background image for annotating a screenshot. The sketch is plain JSON; helpers read its words for an agent, and the handle exports a PNG.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [
|
|
11
11
|
"@excalidraw/excalidraw@0.18.1"
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"docs": "Installed to components/makersclaw/blocks/sketch-canvas. Import: import { SketchCanvas, useSketchCanvas, SKETCH_TOOLS, WIREFRAME_STAMPS, STROKES, FILLS, emptySketch, isSketchEmpty, sketchToText, sketchItems, toSketch } from \"@/components/makersclaw/blocks/sketch-canvas\". Props and an example: components/makersclaw/blocks/sketch-canvas/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
93
93
|
"meta": {
|
|
94
94
|
"makersclaw": {
|
|
95
|
-
"version": "0.3.
|
|
95
|
+
"version": "0.3.1",
|
|
96
96
|
"useWhen": "A screen needs freehand drawing: a whiteboard, marking up a screenshot, sketching a UI wireframe, a diagram drawn by hand. The whiteboard, annotate and sketch-to-app blocks are built on it. Not for structured boards of cards and connectors (flow-canvas), charts (chart) or a kanban (board)."
|
|
97
97
|
}
|
|
98
98
|
}
|
package/r/spreadsheet.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "Spreadsheet",
|
|
6
6
|
"description": "A table you edit like Google Sheets or Airtable, virtualised for 10,000+ rows: typed columns (text, number, currency, date, single and multiple select, person, checkbox, link, rating) each with its own in-cell editor, a cell cursor and range selection with the mouse and arrow keys, typing to edit, copy and paste ranges as TSV (to and from Sheets and Excel), drag-to-fill and ⌘D fill down, undo/redo, column resize, drag to reorder, hide, freeze, rename, change type and add fields, row insert and delete with Undo, sort and filter panels, search, a sum/average of the selection, validation marks, and a phone layout. Edits go out as async callbacks answering { ok }, applied at once and rolled back on failure. A column-type registry and an imperative handle for blocks built on it.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [
|
|
11
11
|
"@tanstack/react-virtual@3.14.13"
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"docs": "Installed to components/makersclaw/blocks/spreadsheet. Import: import { Spreadsheet, CellValue, CellPanel, OptionBadge, editorFor, TYPE_ORDER, sortWords, COLUMN_TYPES, typeOf, parseCell, convertValue, guessType, parseNumberText, parseDateText, optionValue, isBlank, emptyView, normalizeView, orderedColumns, visibleColumns, processRows, passesFilters, parseTSV, toTSV, pasteChanges, fillChanges, clearChanges, applyChanges, invertChanges } from \"@/components/makersclaw/blocks/spreadsheet\". Props and an example: components/makersclaw/blocks/spreadsheet/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
84
84
|
"meta": {
|
|
85
85
|
"makersclaw": {
|
|
86
|
-
"version": "0.3.
|
|
86
|
+
"version": "0.3.1",
|
|
87
87
|
"useWhen": "People need to enter or clean up many records in a grid, fast, with the keyboard: a lead list, an inventory, a budget, a content calendar, a table view over any collection, the grid under an Airtable-like base. Not for a read-mostly list to scan and act on row by row (data-table), records moving through stages (board), or a single record (record-form)."
|
|
88
88
|
}
|
|
89
89
|
}
|
package/r/stat-cards.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "Stat cards",
|
|
6
6
|
"description": "A row of key numbers, each with its name and its change: one bordered strip, or a card each with a change in the corner or after the value, a \"from\" value, a status dot and a goal meter, a sparkline, a \"View more\" footer; or a usage tile per amount against its limit (a bar or a ring, a split by kind with what is free, a warning line near the cap, an action and a limit the founder can change); or a plain list of values with their change. Loading, empty and error states.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/chart.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"docs": "Installed to components/makersclaw/blocks/stat-cards. Import: import { StatCards } from \"@/components/makersclaw/blocks/stat-cards\". Props and an example: components/makersclaw/blocks/stat-cards/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
60
60
|
"meta": {
|
|
61
61
|
"makersclaw": {
|
|
62
|
-
"version": "0.3.
|
|
62
|
+
"version": "0.3.1",
|
|
63
63
|
"useWhen": "The few numbers at the top of a dashboard or a report: revenue, users, conversion, spend against budget, seats and storage against a plan. Not for a trend worth reading on its own (a chart), many rows of records (a table), or one subject scored against thresholds (a scorecard)."
|
|
64
64
|
}
|
|
65
65
|
}
|
package/r/task-list.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "Task list",
|
|
6
6
|
"description": "The List view of work, like ClickUp's or Linear's: tasks under headings that fold (group by status, assignee, priority, project, due date or any field), a round check to complete each, the title edited in place, subtasks indented under their parent with their own fold, the fields you choose (assignees, due date, priority, tags, project, estimate) as inline pickers, a quick-add row at the end of every group, drag to reorder and to move between groups (saving the new status, assignee or due date), multi-select with a bulk bar (status, assign, due, priority, delete with undo), a toolbar with search, filter chips, group by, sort and fields, and friendly empty states with starter templates. One async onChange saves every change; failures roll back with a notice.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/task-model.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"docs": "Installed to components/makersclaw/blocks/task-list. Import: import { TaskList } from \"@/components/makersclaw/blocks/task-list\". Props and an example: components/makersclaw/blocks/task-list/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
57
57
|
"meta": {
|
|
58
58
|
"makersclaw": {
|
|
59
|
-
"version": "0.3.
|
|
59
|
+
"version": "0.3.1",
|
|
60
60
|
"useWhen": "A screen that lists work to get done and moves it along: a team's tasks, a launch checklist, a sprint, a personal to-do list, onboarding steps, content to publish. Not for records that are not work (data-table), for stage columns side by side (board), or for dates on a grid (calendar)."
|
|
61
61
|
}
|
|
62
62
|
}
|
package/r/task-model.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "Task model",
|
|
6
6
|
"description": "The shared work-item model every task view reads: one task shape (status, assignees, start/due, estimate, progress, priority, parent, dependencies, location, tags, project, extra fields) with statuses, people and projects; pure helpers to search, filter, group by any field, sort, nest subtasks, do date math (week and month grids, working days, overlaps, time scales), sum capacity per person, follow dependencies and the critical path, and apply, undo and persist changes; the shared parts (StatusPill, AssigneeStack, DueLabel, PriorityFlag, TaskChip, CompleteToggle), the ViewToolbar (search, filter chips, group by, sort, show fields), drag primitives on @dnd-kit, a hook for optimistic saves with rollback and undo, and adapters that drive the Board and DataTable blocks from tasks.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [
|
|
11
11
|
"@dnd-kit/core@6.3.1",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"docs": "Installed to components/makersclaw/blocks/task-model. Import: import { NONE, PRIORITIES, DEFAULT_STATUSES, TASK_FIELDS, DEFAULT_VIEW, normalizeTask, normalizeTasks, createTaskContext, fieldOf, isDone, doneStatusId, openStatusId, toggleDoneChange, newTaskId, draftTask, valuesOf, optionsOf, labelOf, searchText, searchTasks, filterTasks, orderOf, sortTasks, sortOptions, groupTasks, groupOptions, movePatch, applyView, activeFilterCount, rankBetween, placeChange, childrenMap, buildTree, flattenTree, descendantIds, ancestorIds, subtaskCounts, rollup, progressOf, dependencyEdges, blockersOf, wouldCycle, dateConflicts, criticalPath, hoursPerDay, workload, sumOf, applyChange, invertChange, changeWrites, changedIds, deleteChange, toBoard, toTableRows, taskFacets, StatusPill, CompleteToggle, AssigneeStack, PersonLabel, DueLabel, PriorityFlag, TagList, SubtaskCount, ProgressLine, TaskChip, GroupLabel, taskColumns, TONE_TEXT, HUE_EDGE, HUE_BG, TaskDragProvider, SortableGroup, useSortableTask, useDraggableTask, useDropTarget, DragHandle, DropLine, LIFTED, useReducedMotion, arrayMove, isDay, dayNumber, fromDayNumber, dayOf, minutesOf, withTime, todayDay, addDays, diffDays, weekdayOf, startOfWeek, endOfWeek, weekDays, startOfMonth, endOfMonth, addMonths, daysBetween, monthGrid, WEEKEND, isWeekend, isWorkingDay, workingDaysBetween, addWorkingDays, spanOf, spansOverlap, tasksInRange, tasksOnDay, shiftDates, spanPatch, dueBucket, DUE_BUCKETS, dayForBucket, formatDay, formatTime, formatDate, timeScale, rangeOfTasks, isNewId } from \"@/components/makersclaw/blocks/task-model\". Props and an example: components/makersclaw/blocks/task-model/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
92
92
|
"meta": {
|
|
93
93
|
"makersclaw": {
|
|
94
|
-
"version": "0.3.
|
|
94
|
+
"version": "0.3.1",
|
|
95
95
|
"useWhen": "You are building a view of work items — a list, calendar, gantt, workload, roadmap or a switcher between them — or driving Board / DataTable from tasks. Views import it; a surface rarely renders it alone. Not for records that are not work (use data-table or board directly)."
|
|
96
96
|
}
|
|
97
97
|
}
|
package/r/testimonials.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "Testimonials",
|
|
6
6
|
"description": "A marketing section of customer quotes: name, role, company, face or logo, the quote, an optional star rating, a verified mark and a \"view on X\" source, and optional headline numbers (stats). Layouts: a grid of cards (plain, card or raised; hover can light one and dim the rest; a \"write a review\" tile), one large quote, a switcher of faces, and a carousel, optionally over a picture.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"docs": "Installed to components/makersclaw/blocks/testimonials. Import: import { Testimonials } from \"@/components/makersclaw/blocks/testimonials\". Props and an example: components/makersclaw/blocks/testimonials/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
46
46
|
"meta": {
|
|
47
47
|
"makersclaw": {
|
|
48
|
-
"version": "0.3.
|
|
48
|
+
"version": "0.3.1",
|
|
49
49
|
"useWhen": "Social proof on a public page: a landing page, a pricing page, a product page, a case-study teaser. Not for reviews a signed-in user writes and manages (a record list or form), or an app's own activity feed."
|
|
50
50
|
}
|
|
51
51
|
}
|
package/r/transaction-list.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "TransactionList",
|
|
6
6
|
"description": "Money records as a plain list, in two variants: history (payments in and out, grouped by month, a received / paid / pending / failed mark and a signed amount) and invoices (number, date, a Paid / Due in N days / N days overdue badge, amount, download). Optional date-range filter, Export and per-row download. Empty, loading and error states built in.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"docs": "Installed to components/makersclaw/blocks/transaction-list. Import: import { TransactionList } from \"@/components/makersclaw/blocks/transaction-list\". Props and an example: components/makersclaw/blocks/transaction-list/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
47
47
|
"meta": {
|
|
48
48
|
"makersclaw": {
|
|
49
|
-
"version": "0.3.
|
|
49
|
+
"version": "0.3.1",
|
|
50
50
|
"useWhen": "A billing page's invoices, an account's payment history, a wallet's recent activity: records read top to bottom, newest first. Not for records the founder sorts, filters by column or totals (data-table), or for one order (order-detail)."
|
|
51
51
|
}
|
|
52
52
|
}
|
package/r/whiteboard.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "Whiteboard",
|
|
6
6
|
"description": "A full-page freeform whiteboard on sketch-canvas: a top bar with the board's title (click to rename), the save state (Saving…, Saved, or the error with Retry), a Board / Text view switch, Export PNG and an optional Share button; under it the Miro-style canvas (tool rail, floating toolbar, zoom, undo). An empty board offers starter templates — blank, a grid of titled areas, a 2×2 matrix — and the Text view lists every word on the board for a screen reader or an agent. With onCreateTask, a selected note or text becomes a task from the top bar (\"Create task\", editable title; several notes make one task each), and a small badge marks it on the board from then on. The sketch is plain JSON; saves are async callbacks answering { ok }.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.3.1/r/sketch-canvas.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"docs": "Installed to components/makersclaw/blocks/whiteboard. Import: import { Whiteboard, WHITEBOARD_TEMPLATES, gridSketch, matrixSketch } from \"@/components/makersclaw/blocks/whiteboard\". Props and an example: components/makersclaw/blocks/whiteboard/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
60
60
|
"meta": {
|
|
61
61
|
"makersclaw": {
|
|
62
|
-
"version": "0.3.
|
|
62
|
+
"version": "0.3.1",
|
|
63
63
|
"useWhen": "A screen is one board to think on: a team whiteboard, a planning or prioritisation board, a place to sketch an idea and keep it with a record. Not for marking up a screenshot (annotate), sketching a UI to build (sketch-to-app), a structured board of cards and connectors (flow-canvas), or a kanban (board)."
|
|
64
64
|
}
|
|
65
65
|
}
|
package/src/cli.mjs
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
// agent reading a terminal: short lines, what changed, what to run next.
|
|
4
4
|
// --json is the same result as one object, for the platform.
|
|
5
5
|
|
|
6
|
-
import { resolve } from "node:path";
|
|
6
|
+
import { delimiter, resolve } from "node:path";
|
|
7
7
|
import { CliError, add, diff, init, remove, update } from "./install.mjs";
|
|
8
|
-
import { loadItems, loadTemplate, packageInfo, readmeOf, searchItems, suggest, templateNames } from "./registry.mjs";
|
|
8
|
+
import { loadItems, loadTemplate, packageInfo, readmeOf, searchItems, suggest, templateNames, useExtraBlockRoots } from "./registry.mjs";
|
|
9
9
|
|
|
10
10
|
const COMMANDS = {
|
|
11
11
|
init: "init",
|
|
@@ -139,8 +139,10 @@ function addText(r) {
|
|
|
139
139
|
return lines.join("\n");
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
+
const kind = (item) => (item.tier === "premium" ? "premium" : item.type);
|
|
143
|
+
|
|
142
144
|
function itemLine(item) {
|
|
143
|
-
return ` ${item.name.padEnd(18)} ${item.
|
|
145
|
+
return ` ${item.name.padEnd(18)} ${kind(item).padEnd(10)} ${clip(item.description, 72)}`;
|
|
144
146
|
}
|
|
145
147
|
|
|
146
148
|
function searchText(query, matches) {
|
|
@@ -155,7 +157,7 @@ function searchText(query, matches) {
|
|
|
155
157
|
|
|
156
158
|
function viewText(item, readme) {
|
|
157
159
|
const { version } = packageInfo();
|
|
158
|
-
const head = `${item.name} · ${item.type} · makersclaw ${version}`;
|
|
160
|
+
const head = `${item.name} · ${item.type}${item.tier === "premium" ? " · premium" : ""} · makersclaw ${version}`;
|
|
159
161
|
if (readme) return `${head}\n\n${readme.trimEnd()}`;
|
|
160
162
|
const folder = item.type === "part" ? "parts" : "ui";
|
|
161
163
|
return [
|
|
@@ -179,7 +181,7 @@ function listText(items) {
|
|
|
179
181
|
const of = items.filter((i) => i.type === type);
|
|
180
182
|
if (!of.length) continue;
|
|
181
183
|
lines.push("", label);
|
|
182
|
-
for (const i of of) lines.push(` ${i.name.padEnd(18)} ${clip(i.description, 80)}`);
|
|
184
|
+
for (const i of of) lines.push(` ${i.name.padEnd(18)} ${i.tier === "premium" ? "premium · " : ""}${clip(i.description, 80)}`);
|
|
183
185
|
}
|
|
184
186
|
return lines.join("\n");
|
|
185
187
|
}
|
|
@@ -271,6 +273,7 @@ function summary(item) {
|
|
|
271
273
|
return {
|
|
272
274
|
name: item.name,
|
|
273
275
|
type: item.type,
|
|
276
|
+
tier: item.tier,
|
|
274
277
|
title: item.title,
|
|
275
278
|
description: item.description,
|
|
276
279
|
useWhen: item.useWhen || undefined,
|
|
@@ -281,7 +284,17 @@ function summary(item) {
|
|
|
281
284
|
};
|
|
282
285
|
}
|
|
283
286
|
|
|
284
|
-
|
|
287
|
+
/** The block roots the platform names beside the package's own
|
|
288
|
+
* (MAKERSCLAW_BLOCKS_DIR, folders joined like PATH). */
|
|
289
|
+
export function blockRootsFromEnv(env = process.env) {
|
|
290
|
+
return String(env.MAKERSCLAW_BLOCKS_DIR ?? "")
|
|
291
|
+
.split(delimiter)
|
|
292
|
+
.map((d) => d.trim())
|
|
293
|
+
.filter(Boolean);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export function main(argv, { stdout = process.stdout, stderr = process.stderr, env = process.env } = {}) {
|
|
297
|
+
useExtraBlockRoots(blockRootsFromEnv(env));
|
|
285
298
|
let opts = { json: argv.includes("--json") };
|
|
286
299
|
try {
|
|
287
300
|
opts = parseArgs(argv);
|
package/src/registry.mjs
CHANGED
|
@@ -7,6 +7,12 @@
|
|
|
7
7
|
// app has one until `add` puts it there, so the agent searches for what
|
|
8
8
|
// it needs and installs just that. Everything here ships inside this
|
|
9
9
|
// package, so the version you run is the version you get.
|
|
10
|
+
//
|
|
11
|
+
// One exception: extra block roots. The platform lays its premium blocks
|
|
12
|
+
// (never on npm) into the sandbox and names their folder; the CLI's entry
|
|
13
|
+
// point hands it to useExtraBlockRoots() from MAKERSCLAW_BLOCKS_DIR. Only
|
|
14
|
+
// that entry point does: the shadcn registry builder never calls it, so
|
|
15
|
+
// no environment variable can put a premium block into the npm package.
|
|
10
16
|
|
|
11
17
|
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
12
18
|
import { join } from "node:path";
|
|
@@ -79,13 +85,40 @@ export function loadTemplate(name) {
|
|
|
79
85
|
return { name, title: meta.title ?? name, description: meta.description ?? "", root, files, components };
|
|
80
86
|
}
|
|
81
87
|
|
|
88
|
+
let extraRoots = [];
|
|
89
|
+
|
|
90
|
+
/** Block folders outside this package (the platform's premium blocks),
|
|
91
|
+
* read after the package's own. Same shape as registry/blocks/. */
|
|
92
|
+
export function useExtraBlockRoots(dirs) {
|
|
93
|
+
extraRoots = (dirs ?? []).filter((d) => d && existsSync(d) && statSync(d).isDirectory());
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function extraBlockRoots() {
|
|
97
|
+
return [...extraRoots];
|
|
98
|
+
}
|
|
99
|
+
|
|
82
100
|
export function loadBlocks() {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
101
|
+
const blocks = [];
|
|
102
|
+
const seen = new Map();
|
|
103
|
+
for (const root of [BLOCKS, ...extraRoots]) {
|
|
104
|
+
for (const block of loadBlocksFrom(root, root === BLOCKS ? "free" : "premium")) {
|
|
105
|
+
if (seen.has(block.name)) {
|
|
106
|
+
throw new Error(`block ${block.name}: in both ${seen.get(block.name)} and ${root} — a block name is used once`);
|
|
107
|
+
}
|
|
108
|
+
seen.set(block.name, root);
|
|
109
|
+
blocks.push(block);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return blocks;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function loadBlocksFrom(root, defaultTier) {
|
|
116
|
+
if (!existsSync(root)) return [];
|
|
117
|
+
return readdirSync(root)
|
|
118
|
+
.filter((n) => statSync(join(root, n)).isDirectory())
|
|
86
119
|
.sort()
|
|
87
120
|
.map((folder) => {
|
|
88
|
-
const dir = join(
|
|
121
|
+
const dir = join(root, folder);
|
|
89
122
|
const meta = readJson(join(dir, "block.json"));
|
|
90
123
|
if (!meta) throw new Error(`block ${folder}: no block.json`);
|
|
91
124
|
if (meta.name !== folder || !NAME.test(folder)) throw new Error(`block ${folder}: name must be the folder's, lowercase and dashed`);
|
|
@@ -98,6 +131,7 @@ export function loadBlocks() {
|
|
|
98
131
|
return {
|
|
99
132
|
name: folder,
|
|
100
133
|
type: "block",
|
|
134
|
+
tier: meta.tier === "premium" || defaultTier === "premium" ? "premium" : "free",
|
|
101
135
|
title: meta.title ?? folder,
|
|
102
136
|
description: meta.description ?? "",
|
|
103
137
|
tags: meta.tags ?? [],
|
package/src/shadcn.mjs
CHANGED
|
@@ -150,7 +150,12 @@ function blockItem(block, base, version) {
|
|
|
150
150
|
/** Every item, with its files' content, and the index shadcn's `list` and
|
|
151
151
|
* `search` read (the same items, without content). */
|
|
152
152
|
export function buildRegistry({ base = defaultBase(), version = packageInfo().version } = {}) {
|
|
153
|
-
|
|
153
|
+
// Free blocks only. Extra roots are set by the CLI's entry point, never
|
|
154
|
+
// here — this refusal is the second lock on premium code reaching npm.
|
|
155
|
+
const blocks = loadBlocks();
|
|
156
|
+
const premium = blocks.filter((b) => b.tier === "premium").map((b) => b.name);
|
|
157
|
+
if (premium.length) throw new Error(`the public registry would carry premium blocks (${premium.join(", ")}) — build it without extra block roots`);
|
|
158
|
+
const items = [coreItem(), ...blocks.map((b) => blockItem(b, base, version))];
|
|
154
159
|
const index = {
|
|
155
160
|
$schema: INDEX_SCHEMA,
|
|
156
161
|
name: "makersclaw",
|