feat(fresh-ui): Dropzone drag + clipboard-paste + multi-file ingest (#214)#229
Conversation
…ultifile-ingest # Conflicts: # packages/fresh-ui/registry.generated.ts
🤖 Augment PR SummarySummary: Extends the Changes:
Technical Notes: Filtering supports extensions (e.g. 🤖 Was this summary useful? React with 👍 or 👎 |
| @@ -22,11 +49,114 @@ interface DropzoneProps extends Omit<JSX.HTMLAttributes<HTMLLabelElement>, 'clas | |||
| active?: boolean; | |||
| /** Typically a visually-hidden <input type="file">. */ | |||
There was a problem hiding this comment.
The props doc says children is “typically a visually-hidden ”, but Dropzone now always renders its own internal file input as well; existing consumers that already pass an input child may end up with two inputs and changed click/focus behavior.
Severity: medium
🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.
| data-active={active ? '' : undefined} | ||
| onDragOver={handleDragOver} | ||
| onDrop={handleDrop} | ||
| onPaste={handlePaste} |
There was a problem hiding this comment.
Clipboard ingest is wired via onPaste on the <label>, but a plain label isn’t focusable by default and paste events are usually dispatched only to the focused element—please double-check that keyboard paste into the dropzone reliably fires in real browsers (otherwise paste ingest may be effectively unreachable).
Severity: medium
🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.
…eature sweep (#233) Storefront tutorial D-01…D-05 conformance to the shipped #206–#231 surface, plus accuracy reconciliation on the fresh-ui/web-layer pages the sweep touched. D-01 (01-scaffold): Aspire dashboard URL is https; fileTree includes database/ and tests/. D-02 (02-catalog-service): real #208 CRUD surface — createCrudContract + @database/zod + context.db; errors thrown via the contract's typed errors.NOT_FOUND (no hand-rolled notFound import); router nests health under products (no invented health-router import). D-03 (03-cart-contracts): register in mod.ts, PascalCase CartContractV1, import from @my-shop/contracts and the ./versions/v1 subpath. Reconciled 02's products.contract.ts exports to the same PascalCase convention (ProductsContract/ProductsContractV1) so ch2↔ch3 imports agree. D-04 (04/05): public `netscript plugin install saga|trigger --name … --samples`. Feature recon to the sweep: DataTable→DataGrid (#209/#225), Icon primitive (#211/#224) and DataGrid in fresh-ui root exports, Dropzone/prompt-input mentions (#214/#229, #212/#226), managed <Form> class + <form> attrs (#213/#228), useIslandMutation onMutate/onSettled (#210/#227). Docs-only. build + check:links + check:caveats green. Refs #153. Claude-Session: https://claude.ai/code/session_012wKHquACkXnWPDgJYhhFjN Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Extends the
Dropzonefresh-ui component with richer ingest ergonomics:acceptfiltering so callers can constrain accepted MIME/extension types.Tokens-only styling, a11y preserved,
DataTable/registry conventions untouched. Rebased ontocurrent
main(barrel +registry.generated.tsreconciled against the merged Icon/DataGrid).Closes #214