kumo-svelte 0.1.0 → 0.1.2

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.
Files changed (39) hide show
  1. package/ai/component-registry.json +1 -1
  2. package/dist/components/breadcrumbs/Breadcrumbs.svelte +6 -5
  3. package/dist/components/breadcrumbs/Breadcrumbs.svelte.d.ts +3 -2
  4. package/dist/components/input-group/InputGroup.svelte +1 -1
  5. package/dist/components/input-group/InputGroupButton.svelte +2 -2
  6. package/dist/components/input-group/InputGroupInput.svelte +1 -1
  7. package/dist/docs/DemoRenderer.svelte +194 -25
  8. package/dist/docs/PropsTable.svelte +592 -253
  9. package/dist/docs/svelteDemoSnippets.js +314 -0
  10. package/dist/styles.css +2 -1350
  11. package/dist/styles.css.d.ts +3 -0
  12. package/package.json +7 -3
  13. package/src/blocks/delete-resource/delete-resource.svelte +26 -37
  14. package/src/blocks/delete-resource/delete-resource.svelte.d.ts +23 -24
  15. package/src/blocks/delete-resource/index.d.ts +1 -0
  16. package/src/blocks/delete-resource/index.ts +4 -0
  17. package/src/blocks/page-header/index.d.ts +1 -0
  18. package/src/blocks/page-header/index.ts +5 -0
  19. package/src/blocks/page-header/page-header.svelte +74 -29
  20. package/src/blocks/page-header/page-header.svelte.d.ts +29 -3
  21. package/src/blocks/resource-list/index.d.ts +1 -0
  22. package/src/blocks/resource-list/resource-list.svelte +22 -22
  23. package/src/blocks/resource-list/resource-list.svelte.d.ts +13 -0
  24. package/src/lib/components/breadcrumbs/Breadcrumbs.svelte +6 -5
  25. package/src/lib/components/input-group/InputGroup.svelte +1 -1
  26. package/src/lib/components/input-group/InputGroupButton.svelte +2 -2
  27. package/src/lib/components/input-group/InputGroupInput.svelte +1 -1
  28. package/src/lib/docs/DemoRenderer.svelte +194 -25
  29. package/src/lib/docs/PropsTable.svelte +592 -253
  30. package/src/lib/docs/svelteDemoSnippets.ts +314 -0
  31. package/src/lib/styles.css +27 -0
  32. package/src/lib/styles.css.d.ts +3 -0
  33. package/src/routes/blocks/delete-resource/+page.md +51 -17
  34. package/src/routes/blocks/page-header/+page.md +58 -36
  35. package/src/routes/blocks/resource-list/+page.md +78 -71
  36. package/src/routes/components/dialog/+page.md +1 -41
  37. package/src/routes/components/pagination/+page.md +0 -16
  38. package/src/routes/components/popover/+page.md +9 -17
  39. package/src/routes/components/table/+page.md +0 -8
@@ -58,7 +58,7 @@
58
58
  "category": "Layout",
59
59
  "description": "Resource list page layout with optional sidebar content.",
60
60
  "files": ["resource-list/resource-list.svelte", "resource-list/index.ts"],
61
- "dependencies": ["LayerCard"]
61
+ "dependencies": []
62
62
  },
63
63
  "DeleteResource": {
64
64
  "name": "DeleteResource",
@@ -1,5 +1,5 @@
1
1
  <script module lang="ts">
2
- import type { Snippet } from 'svelte';
2
+ import type { Component, Snippet } from 'svelte';
3
3
  import { cn } from '../../utils/cn';
4
4
 
5
5
  export const KUMO_BREADCRUMBS_VARIANTS = {
@@ -28,6 +28,7 @@
28
28
  export interface BreadcrumbsItem {
29
29
  label: string;
30
30
  href?: string;
31
+ icon?: Component;
31
32
  }
32
33
 
33
34
  export function breadcrumbsVariants({
@@ -85,9 +86,9 @@
85
86
  <BreadcrumbsSeparator />
86
87
  {/if}
87
88
  {#if item.href && index < mobileItems.length - 1}
88
- <BreadcrumbsLink href={item.href}>{item.label}</BreadcrumbsLink>
89
+ <BreadcrumbsLink href={item.href} icon={item.icon}>{item.label}</BreadcrumbsLink>
89
90
  {:else}
90
- <BreadcrumbsCurrent>{item.label}</BreadcrumbsCurrent>
91
+ <BreadcrumbsCurrent icon={item.icon}>{item.label}</BreadcrumbsCurrent>
91
92
  {/if}
92
93
  {/each}
93
94
  </div>
@@ -97,9 +98,9 @@
97
98
  <BreadcrumbsSeparator />
98
99
  {/if}
99
100
  {#if item.href && index < items.length - 1}
100
- <BreadcrumbsLink href={item.href}>{item.label}</BreadcrumbsLink>
101
+ <BreadcrumbsLink href={item.href} icon={item.icon}>{item.label}</BreadcrumbsLink>
101
102
  {:else}
102
- <BreadcrumbsCurrent>{item.label}</BreadcrumbsCurrent>
103
+ <BreadcrumbsCurrent icon={item.icon}>{item.label}</BreadcrumbsCurrent>
103
104
  {/if}
104
105
  {/each}
105
106
  </div>
@@ -1,4 +1,4 @@
1
- import type { Snippet } from 'svelte';
1
+ import type { Component, Snippet } from 'svelte';
2
2
  export declare const KUMO_BREADCRUMBS_VARIANTS: {
3
3
  readonly size: {
4
4
  readonly sm: {
@@ -21,6 +21,7 @@ export interface KumoBreadcrumbsVariantsProps {
21
21
  export interface BreadcrumbsItem {
22
22
  label: string;
23
23
  href?: string;
24
+ icon?: Component;
24
25
  }
25
26
  export declare function breadcrumbsVariants({ size }?: KumoBreadcrumbsVariantsProps): string;
26
27
  interface Props extends KumoBreadcrumbsVariantsProps {
@@ -30,6 +31,6 @@ interface Props extends KumoBreadcrumbsVariantsProps {
30
31
  items?: BreadcrumbsItem[];
31
32
  [key: string]: unknown;
32
33
  }
33
- declare const Breadcrumbs: import("svelte").Component<Props, {}, "">;
34
+ declare const Breadcrumbs: Component<Props, {}, "">;
34
35
  type Breadcrumbs = ReturnType<typeof Breadcrumbs>;
35
36
  export default Breadcrumbs;
@@ -91,7 +91,7 @@
91
91
  'overflow-hidden bg-kumo-control ring ring-kumo-line',
92
92
  'focus-within:ring-kumo-focus'
93
93
  ]
94
- : 'isolate overflow-visible bg-transparent ring-0 shadow-none',
94
+ : 'isolate overflow-visible bg-kumo-control ring-0 shadow-none',
95
95
  'has-[input[aria-invalid=true]]:ring-kumo-danger',
96
96
  'px-0',
97
97
  'flex items-center gap-0',
@@ -61,8 +61,8 @@
61
61
  'first:rounded-l-[inherit] last:rounded-r-[inherit]',
62
62
  'not-first:border-l-0',
63
63
  'hover:z-[1]',
64
- 'focus:z-[2] focus:border-kumo-line focus:outline focus:-outline-offset-1',
65
- 'focus-visible:ring-2 focus-visible:ring-kumo-focus',
64
+ 'focus:z-[2] focus:border-kumo-line',
65
+ 'focus-visible:[outline:solid_1px_var(--color-kumo-focus)] focus-visible:[outline-offset:-1px]',
66
66
  'disabled:bg-kumo-overlay disabled:text-kumo-inactive!'
67
67
  ],
68
68
  className
@@ -55,7 +55,7 @@
55
55
  'first:rounded-l-[inherit] last:rounded-r-[inherit]',
56
56
  'not-first:border-l-0',
57
57
  'hover:z-[1] hover:border-kumo-line',
58
- 'focus:z-[2] focus:border-kumo-line focus:outline focus:-outline-offset-1'
58
+ 'focus:z-[2] focus:border-kumo-line focus:[outline:solid_1px_var(--color-kumo-focus)] focus:[outline-offset:-1px]'
59
59
  ]
60
60
  : 'relative z-[1] ring-0! shadow-none focus:ring-0! focus:outline-none',
61
61
  className
@@ -50,6 +50,7 @@
50
50
  import { PoweredByCloudflare } from '../components/cloudflare-logo';
51
51
  import { DeleteResource } from '../../blocks/delete-resource';
52
52
  import { PageHeader } from '../../blocks/page-header';
53
+ import { ResourceListPage } from '../../blocks/resource-list';
53
54
  import ChartDemos from './chart-demos/ChartDemos.svelte';
54
55
 
55
56
  interface Props {
@@ -62,6 +63,8 @@
62
63
  let switchCustomIdChecked = $state(false);
63
64
  let pageHeaderTab = $state('overview');
64
65
  let deleteResourceOpen = $state(false);
66
+ let deleteResourceDeleting = $state(false);
67
+ let deleteResourceErrorMessage = $state('');
65
68
  let menuBarActive = $state<string | undefined>('bold');
66
69
  let copiedCloudflareLogo = $state<string | undefined>();
67
70
  let autocompleteValue = $state('');
@@ -77,6 +80,37 @@
77
80
  let sensitiveInputValue = $state('my-secret-value');
78
81
  let tableOfContentsActive = $state('Introduction');
79
82
  let tableOfContentsClicked = $state<string | null>(null);
83
+ let paginationPages = $state<Record<string, number>>({});
84
+ let paginationPerPages = $state<Record<string, number>>({});
85
+ const paginationInitialPage = $derived(demo === 'PaginationMidPageDemo' ? 5 : 1);
86
+ const paginationInitialPerPage = $derived(demo === 'PaginationCustomPageSizeOptionsDemo' ? 10 : 25);
87
+ const paginationPage = $derived(paginationPages[demo] ?? paginationInitialPage);
88
+ const paginationPerPage = $derived(paginationPerPages[demo] ?? paginationInitialPerPage);
89
+
90
+ function setPaginationPage(nextPage: number) {
91
+ paginationPages[demo] = nextPage;
92
+ }
93
+
94
+ function setPaginationPerPage(nextPerPage: number) {
95
+ paginationPerPages[demo] = nextPerPage;
96
+ }
97
+
98
+ function openDeleteResource() {
99
+ deleteResourceErrorMessage = '';
100
+ deleteResourceOpen = true;
101
+ }
102
+
103
+ async function handleDeleteResource() {
104
+ deleteResourceErrorMessage = '';
105
+ deleteResourceDeleting = true;
106
+ await new Promise((resolve) => setTimeout(resolve, 2000));
107
+ deleteResourceDeleting = false;
108
+ if (demo === 'DeleteResourceErrorDemo') {
109
+ deleteResourceErrorMessage = 'Something went wrong';
110
+ return;
111
+ }
112
+ deleteResourceOpen = false;
113
+ }
80
114
 
81
115
  const selectOptions = [
82
116
  { label: 'Workers', value: 'workers' },
@@ -1417,31 +1451,115 @@ const route: WorkerRoute = {
1417
1451
  {/if}
1418
1452
  </div>
1419
1453
  {:else if looksLike('Pagination')}
1420
- <Pagination page={demo.includes('Mid') ? 6 : 1} pages={12} />
1454
+ {#if demo === 'PaginationSimpleDemo'}
1455
+ <Pagination page={paginationPage} setPage={setPaginationPage} perPage={10} totalCount={100} controls="simple" />
1456
+ {:else if demo === 'PaginationFullDemo'}
1457
+ <Pagination page={paginationPage} setPage={setPaginationPage} perPage={10} totalCount={100} controls="full" />
1458
+ {:else if demo === 'PaginationMidPageDemo'}
1459
+ <Pagination page={paginationPage} setPage={setPaginationPage} perPage={10} totalCount={100} />
1460
+ {:else if demo === 'PaginationLargeDatasetDemo'}
1461
+ <Pagination page={paginationPage} setPage={setPaginationPage} perPage={25} totalCount={1250} />
1462
+ {:else if demo === 'PaginationCustomTextDemo'}
1463
+ <Pagination
1464
+ page={paginationPage} setPage={setPaginationPage}
1465
+ perPage={25}
1466
+ totalCount={100}
1467
+ text={({ perPage }) => `Page ${paginationPage} - showing ${perPage} per page`}
1468
+ />
1469
+ {:else if demo === 'PaginationPageSizeSelectorDemo' || demo === 'PaginationDropdownSelectorDemo'}
1470
+ <Pagination page={paginationPage} setPage={setPaginationPage} perPage={paginationPerPage} totalCount={500}>
1471
+ <Pagination.Info />
1472
+ <Pagination.Separator />
1473
+ <Pagination.PageSize
1474
+ value={paginationPerPage}
1475
+ onChange={(size) => {
1476
+ setPaginationPerPage(size);
1477
+ setPaginationPage(1);
1478
+ }}
1479
+ />
1480
+ <Pagination.Controls pageSelector={demo === 'PaginationDropdownSelectorDemo' ? 'dropdown' : 'input'} />
1481
+ </Pagination>
1482
+ {:else if demo === 'PaginationCustomPageSizeOptionsDemo'}
1483
+ <Pagination page={paginationPage} setPage={setPaginationPage} perPage={paginationPerPage} totalCount={200}>
1484
+ <Pagination.Info />
1485
+ <Pagination.Separator />
1486
+ <Pagination.PageSize
1487
+ value={paginationPerPage}
1488
+ options={[10, 20, 50]}
1489
+ onChange={(size) => {
1490
+ setPaginationPerPage(size);
1491
+ setPaginationPage(1);
1492
+ }}
1493
+ />
1494
+ <Pagination.Controls />
1495
+ </Pagination>
1496
+ {:else if demo === 'PaginationPageSizeRightDemo'}
1497
+ <Pagination page={paginationPage} setPage={setPaginationPage} perPage={paginationPerPage} totalCount={500}>
1498
+ <Pagination.Info />
1499
+ <div class="flex items-center gap-2">
1500
+ <Pagination.Controls />
1501
+ <Pagination.Separator />
1502
+ <Pagination.PageSize
1503
+ value={paginationPerPage}
1504
+ onChange={(size) => {
1505
+ setPaginationPerPage(size);
1506
+ setPaginationPage(1);
1507
+ }}
1508
+ />
1509
+ </div>
1510
+ </Pagination>
1511
+ {:else}
1512
+ <Pagination page={paginationPage} setPage={setPaginationPage} perPage={10} totalCount={100} />
1513
+ {/if}
1421
1514
  {:else if looksLike('PageHeader')}
1422
1515
  <div class="w-full">
1516
+ {#snippet pageHeaderBreadcrumbs()}
1517
+ <Breadcrumbs>
1518
+ {#if demo === 'PageHeaderHeroDemo'}
1519
+ <Breadcrumbs.Link icon={House} href="#">Workers & Pages</Breadcrumbs.Link>
1520
+ <Breadcrumbs.Separator />
1521
+ <Breadcrumbs.Current>cloudflare-dev-platform</Breadcrumbs.Current>
1522
+ {:else if demo === 'PageHeaderBasicDemo'}
1523
+ <Breadcrumbs.Link href="#">Home</Breadcrumbs.Link>
1524
+ <Breadcrumbs.Separator />
1525
+ <Breadcrumbs.Current>Dashboard</Breadcrumbs.Current>
1526
+ {:else if demo === 'PageHeaderWithIconsDemo'}
1527
+ <Breadcrumbs.Link icon={House} href="#">Home</Breadcrumbs.Link>
1528
+ <Breadcrumbs.Separator />
1529
+ <Breadcrumbs.Current icon={Settings}>Settings</Breadcrumbs.Current>
1530
+ {:else if demo === 'PageHeaderWithTabsDemo'}
1531
+ <Breadcrumbs.Link href="#">Home</Breadcrumbs.Link>
1532
+ <Breadcrumbs.Separator />
1533
+ <Breadcrumbs.Current>Settings</Breadcrumbs.Current>
1534
+ {:else if demo === 'PageHeaderWithActionsDemo'}
1535
+ <Breadcrumbs.Link href="#">Home</Breadcrumbs.Link>
1536
+ <Breadcrumbs.Separator />
1537
+ <Breadcrumbs.Link href="#">Projects</Breadcrumbs.Link>
1538
+ <Breadcrumbs.Separator />
1539
+ <Breadcrumbs.Current>My Project</Breadcrumbs.Current>
1540
+ {:else}
1541
+ <Breadcrumbs.Link href="#">Home</Breadcrumbs.Link>
1542
+ <Breadcrumbs.Separator />
1543
+ <Breadcrumbs.Link href="#">Products</Breadcrumbs.Link>
1544
+ <Breadcrumbs.Separator />
1545
+ <Breadcrumbs.Current>Page title</Breadcrumbs.Current>
1546
+ {/if}
1547
+ </Breadcrumbs>
1548
+ {/snippet}
1423
1549
  {#snippet pageHeaderActions()}
1424
1550
  {#if demo === 'PageHeaderHeroDemo'}
1425
- <Button class="h-8"><Code2 class="size-4" />Edit code</Button>
1426
- <Button variant="primary" class="h-8"><Globe class="size-4" />Visit</Button>
1551
+ <Button icon={Code2} class="h-8">Edit code</Button>
1552
+ <Button icon={Globe} variant="primary" class="h-8">Visit</Button>
1427
1553
  {:else if demo === 'PageHeaderWithActionsDemo'}
1428
1554
  <Button variant="primary" size="base">Deploy</Button>
1429
1555
  {:else if demo === 'PageHeaderCompleteDemo'}
1430
1556
  <Button variant="outline" size="sm">Export</Button>
1431
- <Button variant="primary" size="sm"><Plus class="size-4" />New Item</Button>
1557
+ <Button variant="primary" size="sm" icon={Plus}>New Item</Button>
1432
1558
  {/if}
1433
1559
  {/snippet}
1434
1560
  <PageHeader
1435
1561
  class="w-full"
1436
- breadcrumbs={demo === 'PageHeaderHeroDemo'
1437
- ? [{ label: 'Workers & Pages', href: '#' }, { label: 'cloudflare-dev-platform' }]
1438
- : demo === 'PageHeaderBasicDemo'
1439
- ? [{ label: 'Home', href: '#' }, { label: 'Dashboard' }]
1440
- : demo === 'PageHeaderWithIconsDemo'
1441
- ? [{ label: 'Home', href: '#' }, { label: 'Settings' }]
1442
- : demo === 'PageHeaderWithActionsDemo'
1443
- ? [{ label: 'Home', href: '#' }, { label: 'Projects', href: '#' }, { label: 'My Project' }]
1444
- : [{ label: 'Home', href: '#' }, { label: 'Products', href: '#' }, { label: 'Page title' }]}
1562
+ breadcrumbContent={pageHeaderBreadcrumbs}
1445
1563
  title={demo === 'PageHeaderWithTitleDemo' || demo === 'PageHeaderWithTitleDescriptionDemo' || demo === 'PageHeaderCompleteDemo' ? 'Page title' : undefined}
1446
1564
  description={demo === 'PageHeaderWithTitleDescriptionDemo'
1447
1565
  ? 'Action-led, value-oriented description of what this page does. Optional second sentence with use cases or prerequisites.'
@@ -1476,6 +1594,7 @@ const route: WorkerRoute = {
1476
1594
  ]
1477
1595
  : []}
1478
1596
  bind:activeTab={pageHeaderTab}
1597
+ defaultTab={demo === 'PageHeaderWithTabsDemo' ? 'general' : 'overview'}
1479
1598
  actions={demo === 'PageHeaderHeroDemo' || demo === 'PageHeaderWithActionsDemo' || demo === 'PageHeaderCompleteDemo' ? pageHeaderActions : undefined}
1480
1599
  />
1481
1600
  </div>
@@ -1490,23 +1609,73 @@ const route: WorkerRoute = {
1490
1609
  {#if demo.includes('Error')}<p class="text-sm text-kumo-danger">Choose an environment to continue.</p>{/if}
1491
1610
  </div>
1492
1611
  {:else if looksLike('ResourceList')}
1493
- <div class="w-full max-w-xl divide-y divide-kumo-hairline rounded-lg border border-kumo-hairline bg-kumo-base">
1494
- {#each ['api-edge', 'checkout-worker', 'image-resizer'] as item}
1495
- <div class="flex items-center justify-between px-4 py-3">
1496
- <span class="font-mono text-sm">{item}</span>
1497
- <Badge variant="success">Active</Badge>
1498
- </div>
1499
- {/each}
1612
+ {#snippet resourceUsage()}
1613
+ <Surface class="p-4">
1614
+ <h3 class="mb-2 font-semibold">{demo === 'ResourceListWithUsageDemo' ? 'Quick Start' : 'Usage Example'}</h3>
1615
+ {#if demo === 'ResourceListWithUsageDemo'}
1616
+ <p class="mb-3 text-sm text-kumo-subtle">Generate an API key to authenticate your requests</p>
1617
+ <Code lang="bash" code={'curl -H "Authorization: Bearer YOUR_API_KEY" https://api.example.com'} />
1618
+ {:else}
1619
+ <Code
1620
+ lang="ts"
1621
+ code={`// Read from KV
1622
+ const value = await KV.get('key');
1623
+
1624
+ // Write to KV
1625
+ await KV.put('key', 'value');`}
1626
+ />
1627
+ {/if}
1628
+ </Surface>
1629
+ {/snippet}
1630
+ {#snippet resourceAdditionalContent()}
1631
+ <Surface class="p-4">
1632
+ <h3 class="mb-2 font-semibold">Learn More</h3>
1633
+ <p class="text-sm text-kumo-subtle">Check out our documentation to learn more about KV storage.</p>
1634
+ </Surface>
1635
+ {/snippet}
1636
+ <div class="w-full">
1637
+ <ResourceListPage
1638
+ class="min-h-[400px]"
1639
+ title={demo === 'ResourceListWithUsageDemo' ? 'API Keys' : demo === 'ResourceListCompleteDemo' ? 'KV Namespaces' : 'Databases'}
1640
+ description={demo === 'ResourceListWithUsageDemo'
1641
+ ? 'Create and manage API keys for your applications'
1642
+ : demo === 'ResourceListCompleteDemo'
1643
+ ? 'Store key-value data globally with low-latency access'
1644
+ : 'Manage your database instances and configurations'}
1645
+ icon={demo === 'ResourceListWithUsageDemo' ? undefined : Database}
1646
+ usage={demo === 'ResourceListWithUsageDemo' || demo === 'ResourceListCompleteDemo' ? resourceUsage : undefined}
1647
+ additionalContent={demo === 'ResourceListCompleteDemo' ? resourceAdditionalContent : undefined}
1648
+ >
1649
+ {#if demo === 'ResourceListCompleteDemo'}
1650
+ <div class="space-y-4">
1651
+ <Surface class="p-6">
1652
+ <h4 class="mb-2 font-semibold">production-kv</h4>
1653
+ <p class="text-sm text-kumo-subtle">Created 2 days ago</p>
1654
+ </Surface>
1655
+ <Surface class="p-6">
1656
+ <h4 class="mb-2 font-semibold">staging-kv</h4>
1657
+ <p class="text-sm text-kumo-subtle">Created 1 week ago</p>
1658
+ </Surface>
1659
+ </div>
1660
+ {:else}
1661
+ <Surface class="p-6">
1662
+ <p>{demo === 'ResourceListWithUsageDemo' ? 'API keys list would appear here' : 'Main content area - your resource list would go here'}</p>
1663
+ </Surface>
1664
+ {/if}
1665
+ </ResourceListPage>
1500
1666
  </div>
1501
1667
  {:else if looksLike('DeleteResource')}
1668
+ <Button variant="destructive" onclick={openDeleteResource}>
1669
+ {demo === 'DeleteResourceWorkerDemo' ? 'Delete Worker' : 'Delete Zone'}
1670
+ </Button>
1502
1671
  <DeleteResource
1503
1672
  bind:open={deleteResourceOpen}
1673
+ onOpenChange={(open) => (deleteResourceOpen = open)}
1504
1674
  resourceType={demo === 'DeleteResourceWorkerDemo' ? 'Worker' : 'Zone'}
1505
- resourceName={demo === 'DeleteResourceWorkerDemo' ? 'api-edge-worker' : 'example.com'}
1506
- errorMessage={demo === 'DeleteResourceErrorDemo' ? 'Unable to delete this resource because it still has active dependencies.' : undefined}
1507
- onDelete={() => {
1508
- deleteResourceOpen = false;
1509
- }}
1675
+ resourceName={demo === 'DeleteResourceWorkerDemo' ? 'api-gateway-worker' : 'example.com'}
1676
+ errorMessage={demo === 'DeleteResourceErrorDemo' ? deleteResourceErrorMessage : undefined}
1677
+ isDeleting={deleteResourceDeleting}
1678
+ onDelete={handleDeleteResource}
1510
1679
  />
1511
1680
  {:else if looksLike('Select')}
1512
1681
  <div class="w-full max-w-xs space-y-2">