@sanity/table

3.1.163.1.17
dist/index.js.map
~dist/index.js.mapModified
+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["{width: '100%'}","rows.map((row, rowIndex) => (\n          <tr key={row._key}>\n            {row.cells.map((cell, cellIndex) => (\n              // Cells are plain strings; the cell position is the only stable identity\n              // eslint-disable-next-line react/no-array-index-key\n              <td key={`${row._key}-${cellIndex}`}>\n                <TextInput\n                  fontSize={1}\n                  padding={3}\n                  value={cell}\n                  onChange={(e) => updateCell(e, rowIndex, cellIndex)}\n                />\n              </td>\n            ))}\n            <td key={`${row._key}-remove`}>\n              <Box marginLeft={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeRow(rowIndex)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          </tr>\n        ))","(row, rowIndex) => (\n          <tr key={row._key}>\n            {row.cells.map((cell, cellIndex) => (\n              // Cells are plain strings; the cell position is the only stable identity\n              // eslint-disable-next-line react/no-array-index-key\n              <td key={`${row._key}-${cellIndex}`}>\n                <TextInput\n                  fontSize={1}\n                  padding={3}\n                  value={cell}\n                  onChange={(e) => updateCell(e, rowIndex, cellIndex)}\n                />\n              </td>\n            ))}\n            <td key={`${row._key}-remove`}>\n              <Box marginLeft={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeRow(rowIndex)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          </tr>\n        )","rows[0]?.cells || []","cells","(rows[0]?.cells || []).map((_, i) => (\n            // Cells are plain strings; the column position is the only stable identity\n            // eslint-disable-next-line react/no-array-index-key\n            <td key={i}>\n              <Box marginTop={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeColumn(i)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          ))","(_, i) => (\n            // Cells are plain strings; the column position is the only stable identity\n            // eslint-disable-next-line react/no-array-index-key\n            <td key={i}>\n              <Box marginTop={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeColumn(i)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          )","<tr>\n          {(rows[0]?.cells || []).map((_, i) => (\n            // Cells are plain strings; the column position is the only stable identity\n            // eslint-disable-next-line react/no-array-index-key\n            <td key={i}>\n              <Box marginTop={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeColumn(i)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          ))}\n        </tr>","<table style={{width: '100%'}}>\n      <tbody>\n        {rows.map((row, rowIndex) => (\n          <tr key={row._key}>\n            {row.cells.map((cell, cellIndex) => (\n              // Cells are plain strings; the cell position is the only stable identity\n              // eslint-disable-next-line react/no-array-index-key\n              <td key={`${row._key}-${cellIndex}`}>\n                <TextInput\n                  fontSize={1}\n                  padding={3}\n                  value={cell}\n                  onChange={(e) => updateCell(e, rowIndex, cellIndex)}\n                />\n              </td>\n            ))}\n            <td key={`${row._key}-remove`}>\n              <Box marginLeft={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeRow(rowIndex)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          </tr>\n        ))}\n        <tr>\n          {(rows[0]?.cells || []).map((_, i) => (\n            // Cells are plain strings; the column position is the only stable identity\n            // eslint-disable-next-line react/no-array-index-key\n            <td key={i}>\n              <Box marginTop={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeColumn(i)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          ))}\n        </tr>\n      </tbody>\n    </table>","(e) => {\n    setCount(e.currentTarget.value)\n  }","() => {\n    setDialog({type: 'rows', callback: (c) => props.addRows(c)})\n    setCount('') // ensure input starts controlled when dialog opens\n  }","() => {\n    setDialog({type: 'rows', callback: (index) => props.addRowAt(index)})\n    setCount('')\n  }","() => {\n    setDialog({\n      type: 'columns',\n      callback: (c) => props.addColumns(c),\n    })\n    setCount('')\n  }","c","() => {\n    setDialog({type: 'columns', callback: (index) => props.addColumnAt(index)})\n    setCount('')\n  }","index","Number.isInteger(parsedCount) && parsedCount >= 0 && parsedCount < 100","() => {\n    if (!isValidCount) {\n      return\n    }\n    setDialog(null)\n    dialog?.callback(parsedCount)\n    setCount('')\n  }","dialog?.callback","dialog && (\n        <Dialog\n          header={`Add ${dialog.type}`}\n          id={`${id}-dialog-add`}\n          onClose={() => {\n            setDialog(null)\n            setCount('')\n          }}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <TextInput\n              style={{textAlign: 'left'}}\n              fontSize={2}\n              padding={3}\n              type=\"number\"\n              value={count}\n              onChange={updateCount}\n              customValidity={\n                count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n              }\n            />\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button\n                  text=\"Cancel\"\n                  mode=\"ghost\"\n                  onClick={() => {\n                    setDialog(null)\n                    setCount('')\n                  }}\n                />\n                <Button\n                  text=\"Confirm\"\n                  tone=\"critical\"\n                  onClick={onConfirm}\n                  disabled={!isValidCount}\n                />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )","<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />","<MenuItem\n              icon={AddIcon}\n              fontSize={1}\n              text=\"Add Column At Index\"\n              onClick={addColumnsAt}\n            />","<MenuDivider />","<MenuItem\n              icon={WarningOutlineIcon}\n              fontSize={1}\n              text=\"Remove\"\n              tone=\"critical\"\n              onClick={handleRemove}\n            />","<Menu>\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />\n            <MenuItem\n              icon={AddIcon}\n              fontSize={1}\n              text=\"Add Column At Index\"\n              onClick={addColumnsAt}\n            />\n            <MenuDivider />\n            <MenuItem\n              icon={WarningOutlineIcon}\n              fontSize={1}\n              text=\"Remove\"\n              tone=\"critical\"\n              onClick={handleRemove}\n            />\n          </Menu>","{placement: props.placement}","placement","<MenuButton\n        button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n        id={`${id}-menu-button`}\n        menu={\n          <Menu>\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />\n            <MenuItem\n              icon={AddIcon}\n              fontSize={1}\n              text=\"Add Column At Index\"\n              onClick={addColumnsAt}\n            />\n            <MenuDivider />\n            <MenuItem\n              icon={WarningOutlineIcon}\n              fontSize={1}\n              text=\"Remove\"\n              tone=\"critical\"\n              onClick={handleRemove}\n            />\n          </Menu>\n        }\n        popover={{placement: props.placement}}\n      />","`${id}-menu-button`","<>\n      {dialog && (\n        <Dialog\n          header={`Add ${dialog.type}`}\n          id={`${id}-dialog-add`}\n          onClose={() => {\n            setDialog(null)\n            setCount('')\n          }}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <TextInput\n              style={{textAlign: 'left'}}\n              fontSize={2}\n              padding={3}\n              type=\"number\"\n              value={count}\n              onChange={updateCount}\n              customValidity={\n                count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n              }\n            />\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button\n                  text=\"Cancel\"\n                  mode=\"ghost\"\n                  onClick={() => {\n                    setDialog(null)\n                    setCount('')\n                  }}\n                />\n                <Button\n                  text=\"Confirm\"\n                  tone=\"critical\"\n                  onClick={onConfirm}\n                  disabled={!isValidCount}\n                />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )}\n      <MenuButton\n        button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n        id={`${id}-menu-button`}\n        menu={\n          <Menu>\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />\n            <MenuItem\n              icon={AddIcon}\n              fontSize={1}\n              text=\"Add Column At Index\"\n              onClick={addColumnsAt}\n            />\n            <MenuDivider />\n            <MenuItem\n              icon={WarningOutlineIcon}\n              fontSize={1}\n              text=\"Remove\"\n              tone=\"critical\"\n              onClick={handleRemove}\n            />\n          </Menu>\n        }\n        popover={{placement: props.placement}}\n      />\n    </>","rowType = 'tableRow'","(v?: Omit<TableValue, '_type'>) => {\n    return onChange(set(v))\n  }","() => {\n    return onChange(unset())\n  }","() => {\n    const newValue: Omit<TableValue, '_type'> = {\n      rows: [\n        {\n          _type: rowType,\n          _key: uuid(),\n          cells: ['', ''],\n        },\n        {\n          _type: rowType,\n          _key: uuid(),\n          cells: ['', ''],\n        },\n      ],\n    }\n    return updateValue({...value, ...newValue})\n  }","(count = 1) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Calculate the column count from the first row\n    const columnCount = value.rows[0]?.cells.length ?? 0\n    for (let i = 0; i < count; i++) {\n      // Add as many cells as we have columns\n      newRows.push({\n        _type: rowType,\n        _key: uuid(),\n        cells: Array(columnCount).fill(''),\n      })\n    }\n    return updateValue({...value, rows: newRows})\n  }","value?.rows","count = 1","(index = 0) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Calculate the column count from the first row\n    const columnCount = value.rows[0]?.cells.length ?? 0\n\n    newRows.splice(index, 0, {\n      _type: rowType,\n      _key: uuid(),\n      cells: Array(columnCount).fill(''),\n    })\n\n    return updateValue({...value, rows: newRows})\n  }","index = 0","newRows","columnCount","(index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    newRows.splice(index, 1)\n    updateValue({...value, rows: newRows})\n    setDialog(null)\n  }","index","(index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    if (value.rows.length <= 1) return confirmRemoveTable()\n    return setDialog({type: 'row', callback: () => removeRow(index)})\n  }","(count: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Add a cell to each of the rows\n    newRows.forEach((row) => {\n      for (let j = 0; j < count; j++) {\n        row.cells.push('')\n      }\n    })\n    return updateValue({...value, rows: newRows})\n  }","count","(index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n\n    newRows.forEach((row) => {\n      row.cells.splice(index, 0, '')\n    })\n\n    return updateValue({...value, rows: newRows})\n  }","(e: ChangeEvent<HTMLInputElement>, rowIndex: number, cellIndex: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    const row = newRows[rowIndex]\n    if (!row) {\n      return\n    }\n    row.cells[cellIndex] = e.currentTarget.value\n    return updateValue({...value, rows: newRows})\n  }","row","dialog && (\n        <Dialog\n          header={`Remove ${dialog.type}`}\n          id={`${id}-dialog-remove`}\n          onClose={() => setDialog(null)}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <Text>Are you sure you want to remove this {dialog.type}?</Text>\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button text=\"Cancel\" mode=\"ghost\" onClick={() => setDialog(null)} />\n                <Button text=\"Confirm\" tone=\"critical\" onClick={() => dialog.callback()} />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )","value?.rows?.length ? (\n            <Inline gap={1}>\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add row\"\n                mode=\"ghost\"\n                onClick={() => addRows(1)}\n              />\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add column\"\n                mode=\"ghost\"\n                onClick={() => addColumns(1)}\n              />\n              <TableMenu\n                id={id}\n                addColumns={addColumns}\n                addColumnAt={addColumnAt}\n                addRows={addRows}\n                addRowAt={addRowAt}\n                remove={confirmRemoveTable}\n                placement=\"left\"\n              />\n            </Inline>\n          ) : null","length","<Box>\n        <Flex justify=\"flex-end\">\n          {value?.rows?.length ? (\n            <Inline gap={1}>\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add row\"\n                mode=\"ghost\"\n                onClick={() => addRows(1)}\n              />\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add column\"\n                mode=\"ghost\"\n                onClick={() => addColumns(1)}\n              />\n              <TableMenu\n                id={id}\n                addColumns={addColumns}\n                addColumnAt={addColumnAt}\n                addRows={addRows}\n                addRowAt={addRowAt}\n                remove={confirmRemoveTable}\n                placement=\"left\"\n              />\n            </Inline>\n          ) : null}\n        </Flex>\n      </Box>","value?.rows?.length ? (\n        <TableInput\n          rows={value.rows}\n          removeRow={confirmRemoveRow}\n          removeColumn={confirmRemoveColumn}\n          updateCell={updateCell}\n        />\n      ) : null","value?.rows?.length","!value || !value?.rows?.length ? (\n        <Inline gap={1}>\n          <Button\n            fontSize={1}\n            padding={3}\n            icon={AddIcon}\n            text=\"Create Table\"\n            tone=\"primary\"\n            mode=\"ghost\"\n            onClick={createTable}\n          />\n        </Inline>\n      ) : null","<div>\n      {dialog && (\n        <Dialog\n          header={`Remove ${dialog.type}`}\n          id={`${id}-dialog-remove`}\n          onClose={() => setDialog(null)}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <Text>Are you sure you want to remove this {dialog.type}?</Text>\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button text=\"Cancel\" mode=\"ghost\" onClick={() => setDialog(null)} />\n                <Button text=\"Confirm\" tone=\"critical\" onClick={() => dialog.callback()} />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )}\n      <Box>\n        <Flex justify=\"flex-end\">\n          {value?.rows?.length ? (\n            <Inline gap={1}>\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add row\"\n                mode=\"ghost\"\n                onClick={() => addRows(1)}\n              />\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add column\"\n                mode=\"ghost\"\n                onClick={() => addColumns(1)}\n              />\n              <TableMenu\n                id={id}\n                addColumns={addColumns}\n                addColumnAt={addColumnAt}\n                addRows={addRows}\n                addRowAt={addRowAt}\n                remove={confirmRemoveTable}\n                placement=\"left\"\n              />\n            </Inline>\n          ) : null}\n        </Flex>\n      </Box>\n      {value?.rows?.length ? (\n        <TableInput\n          rows={value.rows}\n          removeRow={confirmRemoveRow}\n          removeColumn={confirmRemoveColumn}\n          updateCell={updateCell}\n        />\n      ) : null}\n      {!value || !value?.rows?.length ? (\n        <Inline gap={1}>\n          <Button\n            fontSize={1}\n            padding={3}\n            icon={AddIcon}\n            text=\"Create Table\"\n            tone=\"primary\"\n            mode=\"ghost\"\n            onClick={createTable}\n          />\n        </Inline>\n      ) : null}\n    </div>","<svg\n      width=\"1em\"\n      height=\"1em\"\n      viewBox=\"0 0 25 25\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.2\"\n    >\n      <path d=\"M3 3h18v18H3zM21 9H3M21 15H3M12 3v18\" />\n    </svg>","{rows}: {rows: TableRow[]}","rows.map((row) =>\n        row.cells.map((cell, i) => (\n          // Cells are plain strings; the cell position is the only stable identity\n          // eslint-disable-next-line react/no-array-index-key\n          <Card key={row._key + i} padding={2} style={{outline: '1px solid #DFE2E9'}}>\n            <Text textOverflow=\"ellipsis\">{cell}</Text>\n          </Card>\n        )),\n      )","(row) =>\n        row.cells.map((cell, i) => (\n          // Cells are plain strings; the cell position is the only stable identity\n          // eslint-disable-next-line react/no-array-index-key\n          <Card key={row._key + i} padding={2} style={{outline: '1px solid #DFE2E9'}}>\n            <Text textOverflow=\"ellipsis\">{cell}</Text>\n          </Card>\n        ))","<Grid gridTemplateColumns={numCols} padding={2}>\n      {rows.map((row) =>\n        row.cells.map((cell, i) => (\n          // Cells are plain strings; the cell position is the only stable identity\n          // eslint-disable-next-line react/no-array-index-key\n          <Card key={row._key + i} padding={2} style={{outline: '1px solid #DFE2E9'}}>\n            <Text textOverflow=\"ellipsis\">{cell}</Text>\n          </Card>\n        )),\n      )}\n    </Grid>","rows = []","<Card>\n            <Label size={4}>\n              <TableIcon />\n            </Label>\n          </Card>","<Box padding={3}>\n        <Inline gap={3}>\n          <Card>\n            <Label size={4}>\n              <TableIcon />\n            </Label>\n          </Card>\n          <Card>\n            <Text>{previewTitle}</Text>\n          </Card>\n        </Inline>\n      </Box>","<Box padding={2}>\n        {rows.length === 0 ? <Label muted>Empty Table</Label> : <Table rows={rows} />}\n      </Box>","rows.length","<>\n      <Box padding={3}>\n        <Inline gap={3}>\n          <Card>\n            <Label size={4}>\n              <TableIcon />\n            </Label>\n          </Card>\n          <Card>\n            <Text>{previewTitle}</Text>\n          </Card>\n        </Inline>\n      </Box>\n      <Box padding={2}>\n        {rows.length === 0 ? <Label muted>Empty Table</Label> : <Table rows={rows} />}\n      </Box>\n    </>"],"sources":["../src/components/TableInput.tsx","../src/components/TableMenu.tsx","../src/components/TableComponent.tsx","../src/components/TableIcon.tsx","../src/components/TablePreview.tsx","../src/index.ts"],"sourcesContent":["import {RemoveIcon} from '@sanity/icons/Remove'\nimport {Box, Button, TextInput} from '@sanity/ui'\nimport type {ChangeEvent} from 'react'\n\nimport type {TableRow} from './TableComponent'\n\ninterface TableInputProps {\n  rows: TableRow[]\n  updateCell: (e: ChangeEvent<HTMLInputElement>, rowIndex: number, cellIndex: number) => void\n  removeRow: (index: number) => void\n  removeColumn: (index: number) => void\n}\n\nexport const TableInput = (props: TableInputProps) => {\n  const {rows, updateCell, removeRow, removeColumn} = props\n\n  return (\n    <table style={{width: '100%'}}>\n      <tbody>\n        {rows.map((row, rowIndex) => (\n          <tr key={row._key}>\n            {row.cells.map((cell, cellIndex) => (\n              // Cells are plain strings; the cell position is the only stable identity\n              // eslint-disable-next-line react/no-array-index-key\n              <td key={`${row._key}-${cellIndex}`}>\n                <TextInput\n                  fontSize={1}\n                  padding={3}\n                  value={cell}\n                  onChange={(e) => updateCell(e, rowIndex, cellIndex)}\n                />\n              </td>\n            ))}\n            <td key={`${row._key}-remove`}>\n              <Box marginLeft={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeRow(rowIndex)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          </tr>\n        ))}\n        <tr>\n          {(rows[0]?.cells || []).map((_, i) => (\n            // Cells are plain strings; the column position is the only stable identity\n            // eslint-disable-next-line react/no-array-index-key\n            <td key={i}>\n              <Box marginTop={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeColumn(i)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          ))}\n        </tr>\n      </tbody>\n    </table>\n  )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {ControlsIcon} from '@sanity/icons/Controls'\nimport {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Box, Button, Card, Dialog, Inline, type Placement, TextInput} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEventHandler, useState} from 'react'\n\ninterface TableMenuProps {\n  id: string\n  addColumns: (count: number) => void\n  addColumnAt: (index: number) => void\n  addRows: (count: number) => void\n  addRowAt: (index: number) => void\n  remove: () => void\n  placement: Placement\n}\n\nexport const TableMenu = (props: TableMenuProps): React.JSX.Element => {\n  const {id, remove: handleRemove} = props\n  const [dialog, setDialog] = useState<{\n    type: string\n    callback: (count: number) => void\n  } | null>(null)\n\n  // Keep `count` always a string so the TextInput is controlled for the component lifetime.\n  const [count, setCount] = useState<string>('')\n\n  const updateCount: ChangeEventHandler<HTMLInputElement> = (e) => {\n    setCount(e.currentTarget.value)\n  }\n\n  const addRows = () => {\n    setDialog({type: 'rows', callback: (c) => props.addRows(c)})\n    setCount('') // ensure input starts controlled when dialog opens\n  }\n\n  const addRowAt = () => {\n    setDialog({type: 'rows', callback: (index) => props.addRowAt(index)})\n    setCount('')\n  }\n\n  const addColumns = () => {\n    setDialog({\n      type: 'columns',\n      callback: (c) => props.addColumns(c),\n    })\n    setCount('')\n  }\n\n  const addColumnsAt = () => {\n    setDialog({type: 'columns', callback: (index) => props.addColumnAt(index)})\n    setCount('')\n  }\n\n  // The dialog is reused for \"add N rows/columns\" (a count) and \"add at index\"\n  // (a position where 0 is valid), so allow 0 but reject NaN/negative/too-large.\n  const parsedCount = Number.parseInt(count, 10)\n  const isValidCount = Number.isInteger(parsedCount) && parsedCount >= 0 && parsedCount < 100\n\n  const onConfirm = () => {\n    if (!isValidCount) {\n      return\n    }\n    setDialog(null)\n    dialog?.callback(parsedCount)\n    setCount('')\n  }\n\n  return (\n    <>\n      {dialog && (\n        <Dialog\n          header={`Add ${dialog.type}`}\n          id={`${id}-dialog-add`}\n          onClose={() => {\n            setDialog(null)\n            setCount('')\n          }}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <TextInput\n              style={{textAlign: 'left'}}\n              fontSize={2}\n              padding={3}\n              type=\"number\"\n              value={count}\n              onChange={updateCount}\n              customValidity={\n                count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n              }\n            />\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button\n                  text=\"Cancel\"\n                  mode=\"ghost\"\n                  onClick={() => {\n                    setDialog(null)\n                    setCount('')\n                  }}\n                />\n                <Button\n                  text=\"Confirm\"\n                  tone=\"critical\"\n                  onClick={onConfirm}\n                  disabled={!isValidCount}\n                />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )}\n      <MenuButton\n        button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n        id={`${id}-menu-button`}\n        menu={\n          <Menu>\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />\n            <MenuItem\n              icon={AddIcon}\n              fontSize={1}\n              text=\"Add Column At Index\"\n              onClick={addColumnsAt}\n            />\n            <MenuDivider />\n            <MenuItem\n              icon={WarningOutlineIcon}\n              fontSize={1}\n              text=\"Remove\"\n              tone=\"critical\"\n              onClick={handleRemove}\n            />\n          </Menu>\n        }\n        popover={{placement: props.placement}}\n      />\n    </>\n  )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {Box, Button, Card, Dialog, Flex, Inline, Text} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {type ChangeEvent, useState} from 'react'\nimport {type ObjectInputProps, set, unset} from 'sanity'\n\nimport {TableInput} from './TableInput'\nimport {TableMenu} from './TableMenu'\n\nconst deepClone: <T>(data: T) => T =\n  globalThis.structuredClone ?? ((data) => JSON.parse(JSON.stringify(data)))\n\nexport interface TableValue {\n  _type?: 'table'\n  rows?: TableRow[]\n}\n\nexport type TableProps = ObjectInputProps<TableValue>\n\nexport type TableRow = {\n  _type: string\n  _key: string\n  cells: string[]\n}\n\n// TODO refactor deepClone stuff to use proper patches\n// TODO use callback all the things\n\nexport const TableComponent = (props: TableProps & {rowType?: string}) => {\n  const {id, rowType = 'tableRow', value, onChange} = props\n  const [dialog, setDialog] = useState<{\n    type: string\n    callback: () => void\n  } | null>(null)\n\n  const updateValue = (v?: Omit<TableValue, '_type'>) => {\n    return onChange(set(v))\n  }\n\n  const resetValue = () => {\n    return onChange(unset())\n  }\n\n  const createTable = () => {\n    const newValue: Omit<TableValue, '_type'> = {\n      rows: [\n        {\n          _type: rowType,\n          _key: uuid(),\n          cells: ['', ''],\n        },\n        {\n          _type: rowType,\n          _key: uuid(),\n          cells: ['', ''],\n        },\n      ],\n    }\n    return updateValue({...value, ...newValue})\n  }\n\n  const confirmRemoveTable = () => {\n    setDialog({type: 'table', callback: removeTable})\n  }\n\n  const removeTable = () => {\n    resetValue()\n    setDialog(null)\n  }\n\n  const addRows = (count = 1) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Calculate the column count from the first row\n    const columnCount = value.rows[0]?.cells.length ?? 0\n    for (let i = 0; i < count; i++) {\n      // Add as many cells as we have columns\n      newRows.push({\n        _type: rowType,\n        _key: uuid(),\n        cells: Array(columnCount).fill(''),\n      })\n    }\n    return updateValue({...value, rows: newRows})\n  }\n\n  const addRowAt = (index = 0) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Calculate the column count from the first row\n    const columnCount = value.rows[0]?.cells.length ?? 0\n\n    newRows.splice(index, 0, {\n      _type: rowType,\n      _key: uuid(),\n      cells: Array(columnCount).fill(''),\n    })\n\n    return updateValue({...value, rows: newRows})\n  }\n\n  const removeRow = (index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    newRows.splice(index, 1)\n    updateValue({...value, rows: newRows})\n    setDialog(null)\n  }\n\n  const confirmRemoveRow = (index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    if (value.rows.length <= 1) return confirmRemoveTable()\n    return setDialog({type: 'row', callback: () => removeRow(index)})\n  }\n\n  const confirmRemoveColumn = (index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    if ((value.rows[0]?.cells.length ?? 0) <= 1) return confirmRemoveTable()\n    return setDialog({type: 'column', callback: () => removeColumn(index)})\n  }\n\n  const addColumns = (count: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Add a cell to each of the rows\n    newRows.forEach((row) => {\n      for (let j = 0; j < count; j++) {\n        row.cells.push('')\n      }\n    })\n    return updateValue({...value, rows: newRows})\n  }\n\n  const addColumnAt = (index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n\n    newRows.forEach((row) => {\n      row.cells.splice(index, 0, '')\n    })\n\n    return updateValue({...value, rows: newRows})\n  }\n\n  const removeColumn = (index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    newRows.forEach((row) => {\n      row.cells.splice(index, 1)\n    })\n    updateValue({...value, rows: newRows})\n    setDialog(null)\n  }\n\n  const updateCell = (e: ChangeEvent<HTMLInputElement>, rowIndex: number, cellIndex: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    const row = newRows[rowIndex]\n    if (!row) {\n      return\n    }\n    row.cells[cellIndex] = e.currentTarget.value\n    return updateValue({...value, rows: newRows})\n  }\n\n  return (\n    <div>\n      {dialog && (\n        <Dialog\n          header={`Remove ${dialog.type}`}\n          id={`${id}-dialog-remove`}\n          onClose={() => setDialog(null)}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <Text>Are you sure you want to remove this {dialog.type}?</Text>\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button text=\"Cancel\" mode=\"ghost\" onClick={() => setDialog(null)} />\n                <Button text=\"Confirm\" tone=\"critical\" onClick={() => dialog.callback()} />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )}\n      <Box>\n        <Flex justify=\"flex-end\">\n          {value?.rows?.length ? (\n            <Inline gap={1}>\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add row\"\n                mode=\"ghost\"\n                onClick={() => addRows(1)}\n              />\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add column\"\n                mode=\"ghost\"\n                onClick={() => addColumns(1)}\n              />\n              <TableMenu\n                id={id}\n                addColumns={addColumns}\n                addColumnAt={addColumnAt}\n                addRows={addRows}\n                addRowAt={addRowAt}\n                remove={confirmRemoveTable}\n                placement=\"left\"\n              />\n            </Inline>\n          ) : null}\n        </Flex>\n      </Box>\n      {value?.rows?.length ? (\n        <TableInput\n          rows={value.rows}\n          removeRow={confirmRemoveRow}\n          removeColumn={confirmRemoveColumn}\n          updateCell={updateCell}\n        />\n      ) : null}\n      {!value || !value?.rows?.length ? (\n        <Inline gap={1}>\n          <Button\n            fontSize={1}\n            padding={3}\n            icon={AddIcon}\n            text=\"Create Table\"\n            tone=\"primary\"\n            mode=\"ghost\"\n            onClick={createTable}\n          />\n        </Inline>\n      ) : null}\n    </div>\n  )\n}\n\nexport function createTableComponent(rowType: string) {\n  return function Table(props: TableProps) {\n    return <TableComponent {...props} rowType={rowType} />\n  }\n}\n","export function TableIcon() {\n  return (\n    <svg\n      width=\"1em\"\n      height=\"1em\"\n      viewBox=\"0 0 25 25\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.2\"\n    >\n      <path d=\"M3 3h18v18H3zM21 9H3M21 15H3M12 3v18\" />\n    </svg>\n  )\n}\n","import {Box, Card, Grid, Inline, Label, Text} from '@sanity/ui'\nimport type {PreviewProps} from 'sanity'\n\nimport type {TableRow} from './TableComponent'\nimport {TableIcon} from './TableIcon'\n\ninterface TablePreviewProps extends PreviewProps {\n  rows?: TableRow[]\n}\n\nconst Table = ({rows}: {rows: TableRow[]}) => {\n  const numCols = rows[0]?.cells.length ?? 0\n\n  return (\n    <Grid gridTemplateColumns={numCols} padding={2}>\n      {rows.map((row) =>\n        row.cells.map((cell, i) => (\n          // Cells are plain strings; the cell position is the only stable identity\n          // eslint-disable-next-line react/no-array-index-key\n          <Card key={row._key + i} padding={2} style={{outline: '1px solid #DFE2E9'}}>\n            <Text textOverflow=\"ellipsis\">{cell}</Text>\n          </Card>\n        )),\n      )}\n    </Grid>\n  )\n}\n\nexport const TablePreview = (props: TablePreviewProps) => {\n  const {schemaType, rows = [], title} = props\n  const previewTitle = schemaType?.title ?? (typeof title === 'string' ? title : 'Title missing')\n\n  return (\n    <>\n      <Box padding={3}>\n        <Inline gap={3}>\n          <Card>\n            <Label size={4}>\n              <TableIcon />\n            </Label>\n          </Card>\n          <Card>\n            <Text>{previewTitle}</Text>\n          </Card>\n        </Inline>\n      </Box>\n      <Box padding={2}>\n        {rows.length === 0 ? <Label muted>Empty Table</Label> : <Table rows={rows} />}\n      </Box>\n    </>\n  )\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, defineType} from 'sanity'\n\nimport {createTableComponent, TableComponent} from './components/TableComponent'\nimport {TablePreview} from './components/TablePreview'\nexport type {TableProps, TableRow, TableValue} from './components/TableComponent'\n\nexport {TableComponent, TablePreview}\n\nexport interface TableConfig {\n  rowType?: string\n}\n\nexport const table = definePlugin<TableConfig | void>((config) => {\n  const tableRowSchema = defineType({\n    title: 'Table Row',\n    name: config?.rowType || 'tableRow',\n    type: 'object',\n    fields: [\n      {\n        name: 'cells',\n        type: 'array',\n        of: [{type: 'string'}],\n      },\n    ],\n  })\n\n  const tableSchema = defineType({\n    title: 'Table',\n    name: 'table',\n    type: 'object',\n    fields: [\n      {\n        name: 'rows',\n        type: 'array',\n        of: [\n          {\n            type: tableRowSchema.name,\n          },\n        ],\n      },\n    ],\n    components: {\n      input: createTableComponent(tableRowSchema.name),\n      preview: TablePreview,\n    },\n    preview: {\n      select: {\n        rows: 'rows',\n        title: 'title',\n      },\n      prepare: ({title, rows = []}) => ({\n        title,\n        rows,\n      }),\n    },\n  })\n\n  return {\n    name: 'table',\n    schema: {\n      types: [tableRowSchema, tableSchema],\n    },\n  }\n})\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{width: '100%'}","rows.map((row, rowIndex) => (\n          <tr key={row._key}>\n            {row.cells.map((cell, cellIndex) => (\n              // Cells are plain strings; the cell position is the only stable identity\n              // eslint-disable-next-line react/no-array-index-key\n              <td key={`${row._key}-${cellIndex}`}>\n                <TextInput\n                  fontSize={1}\n                  padding={3}\n                  value={cell}\n                  onChange={(e) => updateCell(e, rowIndex, cellIndex)}\n                />\n              </td>\n            ))}\n            <td key={`${row._key}-remove`}>\n              <Box marginLeft={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeRow(rowIndex)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          </tr>\n        ))","(row, rowIndex) => (\n          <tr key={row._key}>\n            {row.cells.map((cell, cellIndex) => (\n              // Cells are plain strings; the cell position is the only stable identity\n              // eslint-disable-next-line react/no-array-index-key\n              <td key={`${row._key}-${cellIndex}`}>\n                <TextInput\n                  fontSize={1}\n                  padding={3}\n                  value={cell}\n                  onChange={(e) => updateCell(e, rowIndex, cellIndex)}\n                />\n              </td>\n            ))}\n            <td key={`${row._key}-remove`}>\n              <Box marginLeft={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeRow(rowIndex)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          </tr>\n        )","rows[0]?.cells || []","cells","(rows[0]?.cells || []).map((_, i) => (\n            // Cells are plain strings; the column position is the only stable identity\n            // eslint-disable-next-line react/no-array-index-key\n            <td key={i}>\n              <Box marginTop={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeColumn(i)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          ))","(_, i) => (\n            // Cells are plain strings; the column position is the only stable identity\n            // eslint-disable-next-line react/no-array-index-key\n            <td key={i}>\n              <Box marginTop={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeColumn(i)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          )","<tr>\n          {(rows[0]?.cells || []).map((_, i) => (\n            // Cells are plain strings; the column position is the only stable identity\n            // eslint-disable-next-line react/no-array-index-key\n            <td key={i}>\n              <Box marginTop={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeColumn(i)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          ))}\n        </tr>","<table style={{width: '100%'}}>\n      <tbody>\n        {rows.map((row, rowIndex) => (\n          <tr key={row._key}>\n            {row.cells.map((cell, cellIndex) => (\n              // Cells are plain strings; the cell position is the only stable identity\n              // eslint-disable-next-line react/no-array-index-key\n              <td key={`${row._key}-${cellIndex}`}>\n                <TextInput\n                  fontSize={1}\n                  padding={3}\n                  value={cell}\n                  onChange={(e) => updateCell(e, rowIndex, cellIndex)}\n                />\n              </td>\n            ))}\n            <td key={`${row._key}-remove`}>\n              <Box marginLeft={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeRow(rowIndex)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          </tr>\n        ))}\n        <tr>\n          {(rows[0]?.cells || []).map((_, i) => (\n            // Cells are plain strings; the column position is the only stable identity\n            // eslint-disable-next-line react/no-array-index-key\n            <td key={i}>\n              <Box marginTop={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeColumn(i)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          ))}\n        </tr>\n      </tbody>\n    </table>","_c","(e) => {\n    setCount(e.currentTarget.value)\n  }","() => {\n    setDialog({type: 'rows', callback: (c) => props.addRows(c)})\n    setCount('') // ensure input starts controlled when dialog opens\n  }","() => {\n    setDialog({type: 'rows', callback: (index) => props.addRowAt(index)})\n    setCount('')\n  }","() => {\n    setDialog({\n      type: 'columns',\n      callback: (c) => props.addColumns(c),\n    })\n    setCount('')\n  }","c","() => {\n    setDialog({type: 'columns', callback: (index) => props.addColumnAt(index)})\n    setCount('')\n  }","index","Number.isInteger(parsedCount) && parsedCount >= 0 && parsedCount < 100","() => {\n    if (!isValidCount) {\n      return\n    }\n    setDialog(null)\n    dialog?.callback(parsedCount)\n    setCount('')\n  }","dialog?.callback","dialog && (\n        <Dialog\n          header={`Add ${dialog.type}`}\n          id={`${id}-dialog-add`}\n          onClose={() => {\n            setDialog(null)\n            setCount('')\n          }}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <TextInput\n              style={{textAlign: 'left'}}\n              fontSize={2}\n              padding={3}\n              type=\"number\"\n              value={count}\n              onChange={updateCount}\n              customValidity={\n                count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n              }\n            />\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button\n                  text=\"Cancel\"\n                  mode=\"ghost\"\n                  onClick={() => {\n                    setDialog(null)\n                    setCount('')\n                  }}\n                />\n                <Button\n                  text=\"Confirm\"\n                  tone=\"critical\"\n                  onClick={onConfirm}\n                  disabled={!isValidCount}\n                />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )","<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />","<MenuItem\n              icon={AddIcon}\n              fontSize={1}\n              text=\"Add Column At Index\"\n              onClick={addColumnsAt}\n            />","<MenuDivider />","<MenuItem\n              icon={WarningOutlineIcon}\n              fontSize={1}\n              text=\"Remove\"\n              tone=\"critical\"\n              onClick={handleRemove}\n            />","<Menu>\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />\n            <MenuItem\n              icon={AddIcon}\n              fontSize={1}\n              text=\"Add Column At Index\"\n              onClick={addColumnsAt}\n            />\n            <MenuDivider />\n            <MenuItem\n              icon={WarningOutlineIcon}\n              fontSize={1}\n              text=\"Remove\"\n              tone=\"critical\"\n              onClick={handleRemove}\n            />\n          </Menu>","{placement: props.placement}","placement","<MenuButton\n        button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n        id={`${id}-menu-button`}\n        menu={\n          <Menu>\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />\n            <MenuItem\n              icon={AddIcon}\n              fontSize={1}\n              text=\"Add Column At Index\"\n              onClick={addColumnsAt}\n            />\n            <MenuDivider />\n            <MenuItem\n              icon={WarningOutlineIcon}\n              fontSize={1}\n              text=\"Remove\"\n              tone=\"critical\"\n              onClick={handleRemove}\n            />\n          </Menu>\n        }\n        popover={{placement: props.placement}}\n      />","`${id}-menu-button`","<>\n      {dialog && (\n        <Dialog\n          header={`Add ${dialog.type}`}\n          id={`${id}-dialog-add`}\n          onClose={() => {\n            setDialog(null)\n            setCount('')\n          }}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <TextInput\n              style={{textAlign: 'left'}}\n              fontSize={2}\n              padding={3}\n              type=\"number\"\n              value={count}\n              onChange={updateCount}\n              customValidity={\n                count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n              }\n            />\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button\n                  text=\"Cancel\"\n                  mode=\"ghost\"\n                  onClick={() => {\n                    setDialog(null)\n                    setCount('')\n                  }}\n                />\n                <Button\n                  text=\"Confirm\"\n                  tone=\"critical\"\n                  onClick={onConfirm}\n                  disabled={!isValidCount}\n                />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )}\n      <MenuButton\n        button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n        id={`${id}-menu-button`}\n        menu={\n          <Menu>\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />\n            <MenuItem\n              icon={AddIcon}\n              fontSize={1}\n              text=\"Add Column At Index\"\n              onClick={addColumnsAt}\n            />\n            <MenuDivider />\n            <MenuItem\n              icon={WarningOutlineIcon}\n              fontSize={1}\n              text=\"Remove\"\n              tone=\"critical\"\n              onClick={handleRemove}\n            />\n          </Menu>\n        }\n        popover={{placement: props.placement}}\n      />\n    </>","_c","_Fragment","rowType = 'tableRow'","(v?: Omit<TableValue, '_type'>) => {\n    return onChange(set(v))\n  }","() => {\n    return onChange(unset())\n  }","() => {\n    const newValue: Omit<TableValue, '_type'> = {\n      rows: [\n        {\n          _type: rowType,\n          _key: uuid(),\n          cells: ['', ''],\n        },\n        {\n          _type: rowType,\n          _key: uuid(),\n          cells: ['', ''],\n        },\n      ],\n    }\n    return updateValue({...value, ...newValue})\n  }","(count = 1) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Calculate the column count from the first row\n    const columnCount = value.rows[0]?.cells.length ?? 0\n    for (let i = 0; i < count; i++) {\n      // Add as many cells as we have columns\n      newRows.push({\n        _type: rowType,\n        _key: uuid(),\n        cells: Array(columnCount).fill(''),\n      })\n    }\n    return updateValue({...value, rows: newRows})\n  }","value?.rows","count = 1","(index = 0) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Calculate the column count from the first row\n    const columnCount = value.rows[0]?.cells.length ?? 0\n\n    newRows.splice(index, 0, {\n      _type: rowType,\n      _key: uuid(),\n      cells: Array(columnCount).fill(''),\n    })\n\n    return updateValue({...value, rows: newRows})\n  }","index = 0","newRows","columnCount","(index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    newRows.splice(index, 1)\n    updateValue({...value, rows: newRows})\n    setDialog(null)\n  }","index","(index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    if (value.rows.length <= 1) return confirmRemoveTable()\n    return setDialog({type: 'row', callback: () => removeRow(index)})\n  }","(count: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Add a cell to each of the rows\n    newRows.forEach((row) => {\n      for (let j = 0; j < count; j++) {\n        row.cells.push('')\n      }\n    })\n    return updateValue({...value, rows: newRows})\n  }","count","(index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n\n    newRows.forEach((row) => {\n      row.cells.splice(index, 0, '')\n    })\n\n    return updateValue({...value, rows: newRows})\n  }","(e: ChangeEvent<HTMLInputElement>, rowIndex: number, cellIndex: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    const row = newRows[rowIndex]\n    if (!row) {\n      return\n    }\n    row.cells[cellIndex] = e.currentTarget.value\n    return updateValue({...value, rows: newRows})\n  }","row","dialog && (\n        <Dialog\n          header={`Remove ${dialog.type}`}\n          id={`${id}-dialog-remove`}\n          onClose={() => setDialog(null)}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <Text>Are you sure you want to remove this {dialog.type}?</Text>\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button text=\"Cancel\" mode=\"ghost\" onClick={() => setDialog(null)} />\n                <Button text=\"Confirm\" tone=\"critical\" onClick={() => dialog.callback()} />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )","value?.rows?.length ? (\n            <Inline gap={1}>\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add row\"\n                mode=\"ghost\"\n                onClick={() => addRows(1)}\n              />\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add column\"\n                mode=\"ghost\"\n                onClick={() => addColumns(1)}\n              />\n              <TableMenu\n                id={id}\n                addColumns={addColumns}\n                addColumnAt={addColumnAt}\n                addRows={addRows}\n                addRowAt={addRowAt}\n                remove={confirmRemoveTable}\n                placement=\"left\"\n              />\n            </Inline>\n          ) : null","length","<Box>\n        <Flex justify=\"flex-end\">\n          {value?.rows?.length ? (\n            <Inline gap={1}>\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add row\"\n                mode=\"ghost\"\n                onClick={() => addRows(1)}\n              />\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add column\"\n                mode=\"ghost\"\n                onClick={() => addColumns(1)}\n              />\n              <TableMenu\n                id={id}\n                addColumns={addColumns}\n                addColumnAt={addColumnAt}\n                addRows={addRows}\n                addRowAt={addRowAt}\n                remove={confirmRemoveTable}\n                placement=\"left\"\n              />\n            </Inline>\n          ) : null}\n        </Flex>\n      </Box>","value?.rows?.length ? (\n        <TableInput\n          rows={value.rows}\n          removeRow={confirmRemoveRow}\n          removeColumn={confirmRemoveColumn}\n          updateCell={updateCell}\n        />\n      ) : null","value?.rows?.length","!value || !value?.rows?.length ? (\n        <Inline gap={1}>\n          <Button\n            fontSize={1}\n            padding={3}\n            icon={AddIcon}\n            text=\"Create Table\"\n            tone=\"primary\"\n            mode=\"ghost\"\n            onClick={createTable}\n          />\n        </Inline>\n      ) : null","<div>\n      {dialog && (\n        <Dialog\n          header={`Remove ${dialog.type}`}\n          id={`${id}-dialog-remove`}\n          onClose={() => setDialog(null)}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <Text>Are you sure you want to remove this {dialog.type}?</Text>\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button text=\"Cancel\" mode=\"ghost\" onClick={() => setDialog(null)} />\n                <Button text=\"Confirm\" tone=\"critical\" onClick={() => dialog.callback()} />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )}\n      <Box>\n        <Flex justify=\"flex-end\">\n          {value?.rows?.length ? (\n            <Inline gap={1}>\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add row\"\n                mode=\"ghost\"\n                onClick={() => addRows(1)}\n              />\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add column\"\n                mode=\"ghost\"\n                onClick={() => addColumns(1)}\n              />\n              <TableMenu\n                id={id}\n                addColumns={addColumns}\n                addColumnAt={addColumnAt}\n                addRows={addRows}\n                addRowAt={addRowAt}\n                remove={confirmRemoveTable}\n                placement=\"left\"\n              />\n            </Inline>\n          ) : null}\n        </Flex>\n      </Box>\n      {value?.rows?.length ? (\n        <TableInput\n          rows={value.rows}\n          removeRow={confirmRemoveRow}\n          removeColumn={confirmRemoveColumn}\n          updateCell={updateCell}\n        />\n      ) : null}\n      {!value || !value?.rows?.length ? (\n        <Inline gap={1}>\n          <Button\n            fontSize={1}\n            padding={3}\n            icon={AddIcon}\n            text=\"Create Table\"\n            tone=\"primary\"\n            mode=\"ghost\"\n            onClick={createTable}\n          />\n        </Inline>\n      ) : null}\n    </div>","_c","<svg\n      width=\"1em\"\n      height=\"1em\"\n      viewBox=\"0 0 25 25\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.2\"\n    >\n      <path d=\"M3 3h18v18H3zM21 9H3M21 15H3M12 3v18\" />\n    </svg>","_c","{rows}: {rows: TableRow[]}","rows.map((row) =>\n        row.cells.map((cell, i) => (\n          // Cells are plain strings; the cell position is the only stable identity\n          // eslint-disable-next-line react/no-array-index-key\n          <Card key={row._key + i} padding={2} style={{outline: '1px solid #DFE2E9'}}>\n            <Text textOverflow=\"ellipsis\">{cell}</Text>\n          </Card>\n        )),\n      )","(row) =>\n        row.cells.map((cell, i) => (\n          // Cells are plain strings; the cell position is the only stable identity\n          // eslint-disable-next-line react/no-array-index-key\n          <Card key={row._key + i} padding={2} style={{outline: '1px solid #DFE2E9'}}>\n            <Text textOverflow=\"ellipsis\">{cell}</Text>\n          </Card>\n        ))","<Grid gridTemplateColumns={numCols} padding={2}>\n      {rows.map((row) =>\n        row.cells.map((cell, i) => (\n          // Cells are plain strings; the cell position is the only stable identity\n          // eslint-disable-next-line react/no-array-index-key\n          <Card key={row._key + i} padding={2} style={{outline: '1px solid #DFE2E9'}}>\n            <Text textOverflow=\"ellipsis\">{cell}</Text>\n          </Card>\n        )),\n      )}\n    </Grid>","rows = []","<Card>\n            <Label size={4}>\n              <TableIcon />\n            </Label>\n          </Card>","<Box padding={3}>\n        <Inline gap={3}>\n          <Card>\n            <Label size={4}>\n              <TableIcon />\n            </Label>\n          </Card>\n          <Card>\n            <Text>{previewTitle}</Text>\n          </Card>\n        </Inline>\n      </Box>","<Box padding={2}>\n        {rows.length === 0 ? <Label muted>Empty Table</Label> : <Table rows={rows} />}\n      </Box>","rows.length","<>\n      <Box padding={3}>\n        <Inline gap={3}>\n          <Card>\n            <Label size={4}>\n              <TableIcon />\n            </Label>\n          </Card>\n          <Card>\n            <Text>{previewTitle}</Text>\n          </Card>\n        </Inline>\n      </Box>\n      <Box padding={2}>\n        {rows.length === 0 ? <Label muted>Empty Table</Label> : <Table rows={rows} />}\n      </Box>\n    </>","_c","_Fragment"],"sources":["../src/components/TableInput.tsx","../src/components/TableMenu.tsx","../src/components/TableComponent.tsx","../src/components/TableIcon.tsx","../src/components/TablePreview.tsx","../src/index.ts"],"sourcesContent":["import {RemoveIcon} from '@sanity/icons/Remove'\nimport {Box, Button, TextInput} from '@sanity/ui'\nimport type {ChangeEvent} from 'react'\n\nimport type {TableRow} from './TableComponent'\n\ninterface TableInputProps {\n  rows: TableRow[]\n  updateCell: (e: ChangeEvent<HTMLInputElement>, rowIndex: number, cellIndex: number) => void\n  removeRow: (index: number) => void\n  removeColumn: (index: number) => void\n}\n\nexport const TableInput = (props: TableInputProps) => {\n  const {rows, updateCell, removeRow, removeColumn} = props\n\n  return (\n    <table style={{width: '100%'}}>\n      <tbody>\n        {rows.map((row, rowIndex) => (\n          <tr key={row._key}>\n            {row.cells.map((cell, cellIndex) => (\n              // Cells are plain strings; the cell position is the only stable identity\n              // eslint-disable-next-line react/no-array-index-key\n              <td key={`${row._key}-${cellIndex}`}>\n                <TextInput\n                  fontSize={1}\n                  padding={3}\n                  value={cell}\n                  onChange={(e) => updateCell(e, rowIndex, cellIndex)}\n                />\n              </td>\n            ))}\n            <td key={`${row._key}-remove`}>\n              <Box marginLeft={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeRow(rowIndex)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          </tr>\n        ))}\n        <tr>\n          {(rows[0]?.cells || []).map((_, i) => (\n            // Cells are plain strings; the column position is the only stable identity\n            // eslint-disable-next-line react/no-array-index-key\n            <td key={i}>\n              <Box marginTop={1} style={{textAlign: 'center'}}>\n                <Button\n                  icon={RemoveIcon}\n                  padding={2}\n                  onClick={() => removeColumn(i)}\n                  mode=\"bleed\"\n                />\n              </Box>\n            </td>\n          ))}\n        </tr>\n      </tbody>\n    </table>\n  )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {ControlsIcon} from '@sanity/icons/Controls'\nimport {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Box, Button, Card, Dialog, Inline, type Placement, TextInput} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEventHandler, useState} from 'react'\n\ninterface TableMenuProps {\n  id: string\n  addColumns: (count: number) => void\n  addColumnAt: (index: number) => void\n  addRows: (count: number) => void\n  addRowAt: (index: number) => void\n  remove: () => void\n  placement: Placement\n}\n\nexport const TableMenu = (props: TableMenuProps): React.JSX.Element => {\n  const {id, remove: handleRemove} = props\n  const [dialog, setDialog] = useState<{\n    type: string\n    callback: (count: number) => void\n  } | null>(null)\n\n  // Keep `count` always a string so the TextInput is controlled for the component lifetime.\n  const [count, setCount] = useState<string>('')\n\n  const updateCount: ChangeEventHandler<HTMLInputElement> = (e) => {\n    setCount(e.currentTarget.value)\n  }\n\n  const addRows = () => {\n    setDialog({type: 'rows', callback: (c) => props.addRows(c)})\n    setCount('') // ensure input starts controlled when dialog opens\n  }\n\n  const addRowAt = () => {\n    setDialog({type: 'rows', callback: (index) => props.addRowAt(index)})\n    setCount('')\n  }\n\n  const addColumns = () => {\n    setDialog({\n      type: 'columns',\n      callback: (c) => props.addColumns(c),\n    })\n    setCount('')\n  }\n\n  const addColumnsAt = () => {\n    setDialog({type: 'columns', callback: (index) => props.addColumnAt(index)})\n    setCount('')\n  }\n\n  // The dialog is reused for \"add N rows/columns\" (a count) and \"add at index\"\n  // (a position where 0 is valid), so allow 0 but reject NaN/negative/too-large.\n  const parsedCount = Number.parseInt(count, 10)\n  const isValidCount = Number.isInteger(parsedCount) && parsedCount >= 0 && parsedCount < 100\n\n  const onConfirm = () => {\n    if (!isValidCount) {\n      return\n    }\n    setDialog(null)\n    dialog?.callback(parsedCount)\n    setCount('')\n  }\n\n  return (\n    <>\n      {dialog && (\n        <Dialog\n          header={`Add ${dialog.type}`}\n          id={`${id}-dialog-add`}\n          onClose={() => {\n            setDialog(null)\n            setCount('')\n          }}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <TextInput\n              style={{textAlign: 'left'}}\n              fontSize={2}\n              padding={3}\n              type=\"number\"\n              value={count}\n              onChange={updateCount}\n              customValidity={\n                count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n              }\n            />\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button\n                  text=\"Cancel\"\n                  mode=\"ghost\"\n                  onClick={() => {\n                    setDialog(null)\n                    setCount('')\n                  }}\n                />\n                <Button\n                  text=\"Confirm\"\n                  tone=\"critical\"\n                  onClick={onConfirm}\n                  disabled={!isValidCount}\n                />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )}\n      <MenuButton\n        button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n        id={`${id}-menu-button`}\n        menu={\n          <Menu>\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />\n            <MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />\n            <MenuItem\n              icon={AddIcon}\n              fontSize={1}\n              text=\"Add Column At Index\"\n              onClick={addColumnsAt}\n            />\n            <MenuDivider />\n            <MenuItem\n              icon={WarningOutlineIcon}\n              fontSize={1}\n              text=\"Remove\"\n              tone=\"critical\"\n              onClick={handleRemove}\n            />\n          </Menu>\n        }\n        popover={{placement: props.placement}}\n      />\n    </>\n  )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {Box, Button, Card, Dialog, Flex, Inline, Text} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {type ChangeEvent, useState} from 'react'\nimport {type ObjectInputProps, set, unset} from 'sanity'\n\nimport {TableInput} from './TableInput'\nimport {TableMenu} from './TableMenu'\n\nconst deepClone: <T>(data: T) => T =\n  globalThis.structuredClone ?? ((data) => JSON.parse(JSON.stringify(data)))\n\nexport interface TableValue {\n  _type?: 'table'\n  rows?: TableRow[]\n}\n\nexport type TableProps = ObjectInputProps<TableValue>\n\nexport type TableRow = {\n  _type: string\n  _key: string\n  cells: string[]\n}\n\n// TODO refactor deepClone stuff to use proper patches\n// TODO use callback all the things\n\nexport const TableComponent = (props: TableProps & {rowType?: string}) => {\n  const {id, rowType = 'tableRow', value, onChange} = props\n  const [dialog, setDialog] = useState<{\n    type: string\n    callback: () => void\n  } | null>(null)\n\n  const updateValue = (v?: Omit<TableValue, '_type'>) => {\n    return onChange(set(v))\n  }\n\n  const resetValue = () => {\n    return onChange(unset())\n  }\n\n  const createTable = () => {\n    const newValue: Omit<TableValue, '_type'> = {\n      rows: [\n        {\n          _type: rowType,\n          _key: uuid(),\n          cells: ['', ''],\n        },\n        {\n          _type: rowType,\n          _key: uuid(),\n          cells: ['', ''],\n        },\n      ],\n    }\n    return updateValue({...value, ...newValue})\n  }\n\n  const confirmRemoveTable = () => {\n    setDialog({type: 'table', callback: removeTable})\n  }\n\n  const removeTable = () => {\n    resetValue()\n    setDialog(null)\n  }\n\n  const addRows = (count = 1) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Calculate the column count from the first row\n    const columnCount = value.rows[0]?.cells.length ?? 0\n    for (let i = 0; i < count; i++) {\n      // Add as many cells as we have columns\n      newRows.push({\n        _type: rowType,\n        _key: uuid(),\n        cells: Array(columnCount).fill(''),\n      })\n    }\n    return updateValue({...value, rows: newRows})\n  }\n\n  const addRowAt = (index = 0) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Calculate the column count from the first row\n    const columnCount = value.rows[0]?.cells.length ?? 0\n\n    newRows.splice(index, 0, {\n      _type: rowType,\n      _key: uuid(),\n      cells: Array(columnCount).fill(''),\n    })\n\n    return updateValue({...value, rows: newRows})\n  }\n\n  const removeRow = (index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    newRows.splice(index, 1)\n    updateValue({...value, rows: newRows})\n    setDialog(null)\n  }\n\n  const confirmRemoveRow = (index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    if (value.rows.length <= 1) return confirmRemoveTable()\n    return setDialog({type: 'row', callback: () => removeRow(index)})\n  }\n\n  const confirmRemoveColumn = (index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    if ((value.rows[0]?.cells.length ?? 0) <= 1) return confirmRemoveTable()\n    return setDialog({type: 'column', callback: () => removeColumn(index)})\n  }\n\n  const addColumns = (count: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    // Add a cell to each of the rows\n    newRows.forEach((row) => {\n      for (let j = 0; j < count; j++) {\n        row.cells.push('')\n      }\n    })\n    return updateValue({...value, rows: newRows})\n  }\n\n  const addColumnAt = (index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n\n    newRows.forEach((row) => {\n      row.cells.splice(index, 0, '')\n    })\n\n    return updateValue({...value, rows: newRows})\n  }\n\n  const removeColumn = (index: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    newRows.forEach((row) => {\n      row.cells.splice(index, 1)\n    })\n    updateValue({...value, rows: newRows})\n    setDialog(null)\n  }\n\n  const updateCell = (e: ChangeEvent<HTMLInputElement>, rowIndex: number, cellIndex: number) => {\n    if (!value?.rows) {\n      return\n    }\n    const newRows = deepClone(value.rows)\n    const row = newRows[rowIndex]\n    if (!row) {\n      return\n    }\n    row.cells[cellIndex] = e.currentTarget.value\n    return updateValue({...value, rows: newRows})\n  }\n\n  return (\n    <div>\n      {dialog && (\n        <Dialog\n          header={`Remove ${dialog.type}`}\n          id={`${id}-dialog-remove`}\n          onClose={() => setDialog(null)}\n          zOffset={1000}\n        >\n          <Card padding={4}>\n            <Text>Are you sure you want to remove this {dialog.type}?</Text>\n            <Box marginTop={4}>\n              <Inline gap={1} style={{textAlign: 'right'}}>\n                <Button text=\"Cancel\" mode=\"ghost\" onClick={() => setDialog(null)} />\n                <Button text=\"Confirm\" tone=\"critical\" onClick={() => dialog.callback()} />\n              </Inline>\n            </Box>\n          </Card>\n        </Dialog>\n      )}\n      <Box>\n        <Flex justify=\"flex-end\">\n          {value?.rows?.length ? (\n            <Inline gap={1}>\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add row\"\n                mode=\"ghost\"\n                onClick={() => addRows(1)}\n              />\n              <Button\n                fontSize={1}\n                padding={2}\n                icon={AddIcon}\n                text=\"Add column\"\n                mode=\"ghost\"\n                onClick={() => addColumns(1)}\n              />\n              <TableMenu\n                id={id}\n                addColumns={addColumns}\n                addColumnAt={addColumnAt}\n                addRows={addRows}\n                addRowAt={addRowAt}\n                remove={confirmRemoveTable}\n                placement=\"left\"\n              />\n            </Inline>\n          ) : null}\n        </Flex>\n      </Box>\n      {value?.rows?.length ? (\n        <TableInput\n          rows={value.rows}\n          removeRow={confirmRemoveRow}\n          removeColumn={confirmRemoveColumn}\n          updateCell={updateCell}\n        />\n      ) : null}\n      {!value || !value?.rows?.length ? (\n        <Inline gap={1}>\n          <Button\n            fontSize={1}\n            padding={3}\n            icon={AddIcon}\n            text=\"Create Table\"\n            tone=\"primary\"\n            mode=\"ghost\"\n            onClick={createTable}\n          />\n        </Inline>\n      ) : null}\n    </div>\n  )\n}\n\nexport function createTableComponent(rowType: string) {\n  return function Table(props: TableProps) {\n    return <TableComponent {...props} rowType={rowType} />\n  }\n}\n","export function TableIcon() {\n  return (\n    <svg\n      width=\"1em\"\n      height=\"1em\"\n      viewBox=\"0 0 25 25\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.2\"\n    >\n      <path d=\"M3 3h18v18H3zM21 9H3M21 15H3M12 3v18\" />\n    </svg>\n  )\n}\n","import {Box, Card, Grid, Inline, Label, Text} from '@sanity/ui'\nimport type {PreviewProps} from 'sanity'\n\nimport type {TableRow} from './TableComponent'\nimport {TableIcon} from './TableIcon'\n\ninterface TablePreviewProps extends PreviewProps {\n  rows?: TableRow[]\n}\n\nconst Table = ({rows}: {rows: TableRow[]}) => {\n  const numCols = rows[0]?.cells.length ?? 0\n\n  return (\n    <Grid gridTemplateColumns={numCols} padding={2}>\n      {rows.map((row) =>\n        row.cells.map((cell, i) => (\n          // Cells are plain strings; the cell position is the only stable identity\n          // eslint-disable-next-line react/no-array-index-key\n          <Card key={row._key + i} padding={2} style={{outline: '1px solid #DFE2E9'}}>\n            <Text textOverflow=\"ellipsis\">{cell}</Text>\n          </Card>\n        )),\n      )}\n    </Grid>\n  )\n}\n\nexport const TablePreview = (props: TablePreviewProps) => {\n  const {schemaType, rows = [], title} = props\n  const previewTitle = schemaType?.title ?? (typeof title === 'string' ? title : 'Title missing')\n\n  return (\n    <>\n      <Box padding={3}>\n        <Inline gap={3}>\n          <Card>\n            <Label size={4}>\n              <TableIcon />\n            </Label>\n          </Card>\n          <Card>\n            <Text>{previewTitle}</Text>\n          </Card>\n        </Inline>\n      </Box>\n      <Box padding={2}>\n        {rows.length === 0 ? <Label muted>Empty Table</Label> : <Table rows={rows} />}\n      </Box>\n    </>\n  )\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, defineType} from 'sanity'\n\nimport {createTableComponent, TableComponent} from './components/TableComponent'\nimport {TablePreview} from './components/TablePreview'\nexport type {TableProps, TableRow, TableValue} from './components/TableComponent'\n\nexport {TableComponent, TablePreview}\n\nexport interface TableConfig {\n  rowType?: string\n}\n\nexport const table = definePlugin<TableConfig | void>((config) => {\n  const tableRowSchema = defineType({\n    title: 'Table Row',\n    name: config?.rowType || 'tableRow',\n    type: 'object',\n    fields: [\n      {\n        name: 'cells',\n        type: 'array',\n        of: [{type: 'string'}],\n      },\n    ],\n  })\n\n  const tableSchema = defineType({\n    title: 'Table',\n    name: 'table',\n    type: 'object',\n    fields: [\n      {\n        name: 'rows',\n        type: 'array',\n        of: [\n          {\n            type: tableRowSchema.name,\n          },\n        ],\n      },\n    ],\n    components: {\n      input: createTableComponent(tableRowSchema.name),\n      preview: TablePreview,\n    },\n    preview: {\n      select: {\n        rows: 'rows',\n        title: 'title',\n      },\n      prepare: ({title, rows = []}) => ({\n        title,\n        rows,\n      }),\n    },\n  })\n\n  return {\n    name: 'table',\n    schema: {\n      types: [tableRowSchema, tableSchema],\n    },\n  }\n})\n"],"mappings":"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"}
\ No newline at end of file