@rokkit/ui 1.0.0-next.124 → 1.0.0-next.127

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 (146) hide show
  1. package/README.md +198 -101
  2. package/package.json +52 -34
  3. package/src/components/BreadCrumbs.svelte +82 -0
  4. package/src/components/Button.svelte +87 -0
  5. package/src/components/ButtonGroup.svelte +18 -0
  6. package/src/components/Card.svelte +61 -0
  7. package/src/components/Carousel.svelte +169 -0
  8. package/src/components/Code.svelte +185 -0
  9. package/src/components/Connector.svelte +46 -0
  10. package/src/components/FloatingAction.svelte +331 -0
  11. package/src/components/FloatingNavigation.svelte +228 -0
  12. package/src/components/ItemContent.svelte +24 -0
  13. package/src/components/List.svelte +476 -0
  14. package/src/components/Menu.svelte +421 -0
  15. package/src/components/MultiSelect.svelte +521 -0
  16. package/src/components/PaletteManager.svelte +354 -0
  17. package/src/components/Pill.svelte +78 -0
  18. package/src/components/ProgressBar.svelte +31 -0
  19. package/src/components/Range.svelte +325 -0
  20. package/src/components/Rating.svelte +91 -0
  21. package/src/components/Reveal.svelte +58 -0
  22. package/src/components/SearchFilter.svelte +80 -0
  23. package/src/components/Select.svelte +585 -0
  24. package/src/{Shine.svelte → components/Shine.svelte} +29 -21
  25. package/src/components/Stepper.svelte +169 -0
  26. package/src/components/Switch.svelte +75 -0
  27. package/src/components/Table.svelte +243 -0
  28. package/src/components/Tabs.svelte +268 -0
  29. package/src/components/Tilt.svelte +68 -0
  30. package/src/components/Timeline.svelte +61 -0
  31. package/src/components/Toggle.svelte +157 -0
  32. package/src/components/Toolbar.svelte +307 -0
  33. package/src/components/ToolbarGroup.svelte +17 -0
  34. package/src/components/Tree.svelte +613 -0
  35. package/src/components/index.ts +33 -0
  36. package/src/index.ts +41 -0
  37. package/src/types/button.ts +83 -0
  38. package/src/types/code.ts +46 -0
  39. package/src/types/floating-action.ts +118 -0
  40. package/src/types/floating-navigation.ts +68 -0
  41. package/src/types/index.ts +53 -0
  42. package/src/types/item-proxy.ts +358 -0
  43. package/src/types/list.ts +196 -0
  44. package/src/types/menu.ts +195 -0
  45. package/src/types/palette.ts +143 -0
  46. package/src/types/range.ts +51 -0
  47. package/src/types/search-filter.ts +67 -0
  48. package/src/types/select.ts +206 -0
  49. package/src/types/switch.ts +64 -0
  50. package/src/types/table.ts +210 -0
  51. package/src/types/tabs.ts +124 -0
  52. package/src/types/timeline.ts +51 -0
  53. package/src/types/toggle.ts +109 -0
  54. package/src/types/toolbar.ts +164 -0
  55. package/src/types/tree.ts +259 -0
  56. package/src/utils/palette.ts +582 -0
  57. package/src/utils/shiki.ts +122 -0
  58. package/dist/constants.d.ts +0 -2
  59. package/dist/index.d.ts +0 -41
  60. package/dist/lib/fields.d.ts +0 -16
  61. package/dist/lib/form.d.ts +0 -95
  62. package/dist/lib/index.d.ts +0 -6
  63. package/dist/lib/layout.d.ts +0 -7
  64. package/dist/lib/nested.d.ts +0 -48
  65. package/dist/lib/schema.d.ts +0 -7
  66. package/dist/lib/select.d.ts +0 -8
  67. package/dist/lib/tree.d.ts +0 -9
  68. package/dist/tree/List.spec.svelte.d.ts +0 -1
  69. package/dist/tree/Node.spec.svelte.d.ts +0 -1
  70. package/dist/tree/Root.spec.svelte.d.ts +0 -1
  71. package/dist/types.d.ts +0 -5
  72. package/dist/wrappers/index.d.ts +0 -3
  73. package/src/Accordion.svelte +0 -118
  74. package/src/BreadCrumbs.svelte +0 -32
  75. package/src/Button.svelte +0 -57
  76. package/src/Calendar.svelte +0 -93
  77. package/src/Card.svelte +0 -45
  78. package/src/Carousel.svelte +0 -49
  79. package/src/CheckBox.svelte +0 -56
  80. package/src/Connector.svelte +0 -40
  81. package/src/DropDown.svelte +0 -68
  82. package/src/DropSearch.svelte +0 -37
  83. package/src/Fillable.svelte +0 -19
  84. package/src/GraphPaper.svelte +0 -43
  85. package/src/Icon.svelte +0 -81
  86. package/src/Item.svelte +0 -25
  87. package/src/Link.svelte +0 -21
  88. package/src/List.svelte +0 -89
  89. package/src/ListBody.svelte +0 -43
  90. package/src/Message.svelte +0 -11
  91. package/src/MultiSelect.svelte +0 -48
  92. package/src/NestedList.svelte +0 -78
  93. package/src/NestedPaginator.svelte +0 -63
  94. package/src/Node.svelte +0 -76
  95. package/src/Overlay.svelte +0 -21
  96. package/src/PageNavigator.svelte +0 -94
  97. package/src/PickOne.svelte +0 -60
  98. package/src/Pill.svelte +0 -41
  99. package/src/ProgressBar.svelte +0 -21
  100. package/src/ProgressDots.svelte +0 -53
  101. package/src/RadioGroup.svelte +0 -52
  102. package/src/Range.svelte +0 -45
  103. package/src/RangeMinMax.svelte +0 -124
  104. package/src/RangeSlider.svelte +0 -79
  105. package/src/RangeTick.svelte +0 -28
  106. package/src/Rating.svelte +0 -95
  107. package/src/ResponsiveGrid.svelte +0 -88
  108. package/src/Scrollable.svelte +0 -7
  109. package/src/Select.svelte +0 -114
  110. package/src/Separator.svelte +0 -1
  111. package/src/Slider.svelte +0 -14
  112. package/src/SlidingColumns.svelte +0 -50
  113. package/src/Stage.svelte +0 -41
  114. package/src/Stepper.svelte +0 -66
  115. package/src/Summary.svelte +0 -22
  116. package/src/Switch.svelte +0 -106
  117. package/src/TableCell.svelte +0 -51
  118. package/src/TableHeaderCell.svelte +0 -54
  119. package/src/Tabs.svelte +0 -176
  120. package/src/Tilt.svelte +0 -66
  121. package/src/Toggle.svelte +0 -58
  122. package/src/ToggleThemeMode.svelte +0 -23
  123. package/src/Tree.svelte +0 -80
  124. package/src/TreeTable.svelte +0 -171
  125. package/src/ValidationReport.svelte +0 -23
  126. package/src/constants.js +0 -4
  127. package/src/index.js +0 -48
  128. package/src/lib/fields.js +0 -118
  129. package/src/lib/form.js +0 -72
  130. package/src/lib/index.js +0 -13
  131. package/src/lib/layout.js +0 -63
  132. package/src/lib/nested.js +0 -192
  133. package/src/lib/schema.js +0 -32
  134. package/src/lib/select.js +0 -38
  135. package/src/lib/tree.js +0 -22
  136. package/src/tree/List.spec.svelte.js +0 -84
  137. package/src/tree/List.svelte +0 -78
  138. package/src/tree/Node.spec.svelte.js +0 -104
  139. package/src/tree/Node.svelte +0 -80
  140. package/src/tree/Root.spec.svelte.js +0 -63
  141. package/src/tree/Root.svelte +0 -81
  142. package/src/types.js +0 -9
  143. package/src/wrappers/Category.svelte +0 -27
  144. package/src/wrappers/Section.svelte +0 -16
  145. package/src/wrappers/Wrapper.svelte +0 -12
  146. package/src/wrappers/index.js +0 -3
@@ -1,56 +0,0 @@
1
- <script>
2
- import { defaultStateIcons } from '@rokkit/core'
3
-
4
- /**
5
- * @typedef {Object} Props
6
- * @property {string} [class]
7
- * @property {any} [id]
8
- * @property {any} name
9
- * @property {boolean} [value]
10
- * @property {boolean} [readOnly]
11
- * @property {any} [stateIcons]
12
- * @property {number} [tabindex]
13
- */
14
-
15
- /** @type {Props} */
16
- let {
17
- class: classes = '',
18
- id = null,
19
- name,
20
- value = $bindable(false),
21
- readOnly = false,
22
- stateIcons = defaultStateIcons.checkbox,
23
- tabindex = 0
24
- } = $props()
25
-
26
- let state = $derived(value === null ? 'unknown' : value ? 'checked' : 'unchecked')
27
-
28
- function toggle(event) {
29
- event.preventDefault()
30
- event.stopPropagation()
31
- value = !value
32
- }
33
- function handleClick(event) {
34
- if (!readOnly) toggle(event)
35
- }
36
- function handleKeydown(event) {
37
- if (readOnly) return
38
- if (event.key === 'Enter' || event.key === ' ') toggle(event)
39
- }
40
- </script>
41
-
42
- <rk-checkbox
43
- {id}
44
- class={classes}
45
- class:disabled={readOnly}
46
- role="checkbox"
47
- aria-checked={state}
48
- aria-disabled={readOnly}
49
- onclick={handleClick}
50
- onkeydown={handleKeydown}
51
- {tabindex}
52
- >
53
- <input hidden type="checkbox" {name} {readOnly} bind:checked={value} />
54
-
55
- <icon class={stateIcons[state]}></icon>
56
- </rk-checkbox>
@@ -1,40 +0,0 @@
1
- <script>
2
- /**
3
- * @typedef {Object} Props
4
- * @property {import('./types.js').ConnectionType} [type]
5
- * @property {boolean} [rtl=false]
6
- */
7
-
8
- /** @type {Props} */
9
- let { type = $bindable('empty'), rtl = false } = $props()
10
- let validatedType = $derived(['last', 'child', 'sibling'].includes(type) ? type : 'empty')
11
- </script>
12
-
13
- <span
14
- class="grid h-full w-4 min-w-4 grid-cols-2 grid-rows-2"
15
- data-tag-tree-line
16
- data-tag-line-empty={validatedType === 'empty' ? '' : undefined}
17
- data-tag-line-child={validatedType === 'child' ? '' : undefined}
18
- data-tag-line-sibling={validatedType === 'sibling' ? '' : undefined}
19
- data-tag-line-last={validatedType === 'last' ? '' : undefined}
20
- >
21
- {#if validatedType === 'last'}
22
- {#if rtl}
23
- <i class="border-b border-r"></i>
24
- {:else}
25
- <i class="border-r"></i>
26
- <i class="border-b"></i>
27
- {/if}
28
- {:else if validatedType === 'child'}
29
- {#if rtl}
30
- <i class="row-span-2 grid grid-rows-2 border-r">
31
- <i class="border-b"></i>
32
- </i>
33
- {:else}
34
- <i class="col-span-1 row-span-2 border-r"></i>
35
- <i class="border-b"></i>
36
- {/if}
37
- {:else if validatedType === 'sibling'}
38
- <i class="row-span-2 border-r"></i>
39
- {/if}
40
- </span>
@@ -1,68 +0,0 @@
1
- <script>
2
- import { defaultFields, defaultStateIcons } from '@rokkit/core'
3
- import { dismissable } from '@rokkit/actions'
4
- import Icon from './Icon.svelte'
5
- import Slider from './Slider.svelte'
6
- import Item from './Item.svelte'
7
- import List from './List.svelte'
8
-
9
- let {
10
- class: className,
11
- options = [],
12
- fields = defaultFields,
13
- using = { default: Item },
14
- value = null,
15
- title = null,
16
- icon = null,
17
- small = false,
18
- disabled = false
19
- } = $props()
20
-
21
- using = { default: Item, ...using }
22
- fields = { ...defaultFields, ...fields }
23
-
24
- let offsetTop = $state(0)
25
- let open = $state(false)
26
- let icons = defaultStateIcons.selector
27
-
28
- function handleSelect(event) {
29
- open = false
30
- // dispatch('change', event.detail)
31
- }
32
- </script>
33
-
34
- <drop-down
35
- class="dropdown relative flex cursor-pointer select-none {className}"
36
- class:open
37
- aria-haspopup="true"
38
- aria-controls="menu"
39
- >
40
- <button
41
- class="flex items-center"
42
- bind:clientHeight={offsetTop}
43
- tabindex="0"
44
- use:dismissable
45
- ondismiss={() => (open = false)}
46
- onfocus={() => (open = true)}
47
- onblur={() => (open = false)}
48
- >
49
- <span class="flex items-center">
50
- {#if icon !== null}
51
- <Icon name={icon} />
52
- {/if}
53
- {#if !small && title}
54
- <p class="flex w-full">{title}</p>
55
- {/if}
56
- {#if open}
57
- <Icon name={icons.opened} />
58
- {:else}
59
- <Icon name={icons.closed} />
60
- {/if}
61
- </span>
62
- </button>
63
- {#if open}
64
- <Slider top={offsetTop + 4}>
65
- <List items={options} {fields} {using} bind:value onselect={handleSelect} tabindex="-1" />
66
- </Slider>
67
- {/if}
68
- </drop-down>
@@ -1,37 +0,0 @@
1
- <script>
2
- import { defaultFields, getText } from '@rokkit/core'
3
- import Select from './Select.svelte'
4
-
5
- let { options, name, value, fields = defaultFields, ...restProps } = $props()
6
-
7
- let searchText = $state('')
8
- let searchBox
9
- let filtered = $state(options)
10
-
11
- fields = { ...defaultFields, ...fields }
12
-
13
- function applySearch(event) {
14
- searchText = event.target.value
15
- if (searchText) {
16
- filtered = options.filter((option) =>
17
- getText(option, fields).toLowerCase().includes(searchText.toLowerCase())
18
- )
19
- } else filtered = options
20
- }
21
- function handleSelect(event) {
22
- value = event.detail
23
- searchText = getText(event.detail, fields)
24
- }
25
- </script>
26
-
27
- <Select {name} bind:value bind:options={filtered} {...restProps} {fields} onselect={handleSelect}>
28
- <span class="flex flex-grow">
29
- <input
30
- type="text"
31
- class="w-full border-none bg-transparent p-0"
32
- bind:value={searchText}
33
- bind:this={searchBox}
34
- onchange={applySearch}
35
- />
36
- </span>
37
- </Select>
@@ -1,19 +0,0 @@
1
- <script>
2
- import { marked } from 'marked'
3
- import { mangle } from 'marked-mangle'
4
- import { gfmHeadingId } from 'marked-gfm-heading-id'
5
- import { fillable } from '@rokkit/actions'
6
-
7
- export let text = ''
8
- export let options = []
9
- export let current = 0
10
- export let check = false
11
-
12
- marked.use(mangle())
13
- marked.use(gfmHeadingId())
14
- </script>
15
-
16
- <!-- eslint-disable svelte/no-at-html-tags -->
17
- <div use:fillable={{ options, current, check }} on:remove class="flex-grow">
18
- {@html marked(text)}
19
- </div>
@@ -1,43 +0,0 @@
1
- <script>
2
- let {
3
- class: className = '',
4
- unit = '.5rem',
5
- majorGridSize = 5,
6
- minorGridThickness = 0.5,
7
- majorGridThickness = 0.5,
8
- children
9
- } = $props()
10
- </script>
11
-
12
- <div
13
- data-graph-paper
14
- class="flex flex-col {className}"
15
- style:--unit={unit}
16
- style:--size="calc( {majorGridSize} * {unit})"
17
- style:--minor-grid="{minorGridThickness}px"
18
- style:--major-grid="{majorGridThickness}px"
19
- >
20
- <content class="flex flex-col">
21
- {@render children?.()}
22
- </content>
23
- </div>
24
-
25
- <style>
26
- [data-graph-paper] {
27
- background-image:
28
- linear-gradient(currentColor var(--major-grid), transparent var(--major-grid)),
29
- linear-gradient(90deg, currentColor var(--major-grid), transparent var(--major-grid)),
30
- linear-gradient(currentColor var(--minor-grid), transparent var(--minor-grid)),
31
- linear-gradient(90deg, currentColor var(--minor-grid), transparent var(--minor-grid));
32
- background-size:
33
- var(--size) var(--size),
34
- var(--size) var(--size),
35
- var(--unit) var(--unit),
36
- var(--unit) var(--unit);
37
- background-position:
38
- calc(-1 * var(--minor-grid)) calc(-1 * var(--minor-grid)),
39
- calc(-1 * var(--minor-grid)) calc(-1 * var(--minor-grid)),
40
- calc(-1 * var(--minor-grid)) calc(-1 * var(--minor-grid)),
41
- calc(-1 * var(--minor-grid)) calc(-1 * var(--minor-grid));
42
- }
43
- </style>
package/src/Icon.svelte DELETED
@@ -1,81 +0,0 @@
1
- <script>
2
- /**
3
- * @typedef {Object} Props
4
- * @property {string} [class]
5
- * @property {any} name
6
- * @property {any} [state]
7
- * @property {string} [size]
8
- * @property {'img'|'button'|'checkbox'|'option'} [role]
9
- * @property {any} [label]
10
- * @property {boolean} [disabled]
11
- * @property {number} [tabindex]
12
- * @property {any} [checked]
13
- * @event {MouseEvent} [onclick]
14
- * @event {CustomEvent} [onchange]
15
- * @event {MouseEvent} [onmouseenter]
16
- * @event {MouseEvent} [onmouseleave]
17
- */
18
-
19
- /** @type {Props} */
20
- let {
21
- ref = $bindable(),
22
- class: classes = '',
23
- name = '?',
24
- state = null,
25
- size = 'base',
26
- role = 'img',
27
- label = null,
28
- disabled = false,
29
- tabindex = $bindable(0),
30
- checked = $bindable(),
31
- onclick,
32
- onchange,
33
- onmouseenter,
34
- onmouseleave,
35
- ...restProps
36
- } = $props()
37
-
38
- function handleClick(e) {
39
- if (role === 'img') return
40
- e.preventDefault()
41
-
42
- if (!disabled) {
43
- if (isCheckbox) {
44
- checked = !Boolean(checked)
45
- onchange?.(checked)
46
- }
47
- onclick?.()
48
- }
49
- }
50
-
51
- let isCheckbox = $derived(role === 'checkbox' || role === 'option')
52
- let validatedTabindex = $derived(role === 'img' || disabled ? -1 : tabindex)
53
- let ariaChecked = $derived(['checkbox', 'option'].includes(role) && checked)
54
- </script>
55
-
56
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
57
- <icon
58
- bind:this={ref}
59
- data-tag-icon
60
- data-state={state}
61
- data-tag-button={role === 'button' ? true : undefined}
62
- data-tag-checkbox={isCheckbox ? true : undefined}
63
- data-size={size}
64
- data-disabled={disabled}
65
- class={classes}
66
- {role}
67
- aria-label={label ?? name}
68
- aria-checked={ariaChecked}
69
- onclick={handleClick}
70
- onkeydown={(e) => e.key === 'Enter' && e.currentTarget.click()}
71
- tabindex={validatedTabindex}
72
- {onmouseenter}
73
- {onmouseleave}
74
- {...restProps}
75
- >
76
- {#if name.length <= 2}
77
- <span>{name}</span>
78
- {:else}
79
- <i class={name} aria-hidden="true"></i>
80
- {/if}
81
- </icon>
package/src/Item.svelte DELETED
@@ -1,25 +0,0 @@
1
- <script>
2
- import Icon from './Icon.svelte'
3
- import { Proxy } from '@rokkit/states'
4
- /**
5
- * @typedef {Object} Props
6
- * @property {import('@rokkit/states').NodeProxy} [value]
7
- */
8
-
9
- /** @type {Props} */
10
- let { value, fields, proxy = null } = $props()
11
- let proxyItem = $derived(proxy ?? new Proxy(value, fields))
12
- let content = $derived(proxyItem.get('text'))
13
- let ariaLabel = $derived(proxyItem.get('label') ?? content)
14
- let icon = $derived(proxyItem.get('icon'))
15
- let image = $derived(proxyItem.get('image'))
16
- </script>
17
-
18
- {#if icon}
19
- <Icon name={icon} label={ariaLabel} />
20
- {:else if image}
21
- <img src={image} alt={ariaLabel} />
22
- {/if}
23
- {#if content}
24
- <p>{content}</p>
25
- {/if}
package/src/Link.svelte DELETED
@@ -1,21 +0,0 @@
1
- <script>
2
- import { FieldMapper } from '@rokkit/core'
3
- import Item from './Item.svelte'
4
- /**
5
- * @typedef {Object} Props
6
- * @property {string} [class]
7
- * @property {string|Object} [value]
8
- * @property {FieldMapper} [mapping]
9
- * @property {string} [href]
10
- * @property {Object} [rest]
11
- */
12
-
13
- /** @type {Props} */
14
- let { class: classes = '', value, mapping = new FieldMapper(), href = '#', ...rest } = $props()
15
- let url = $derived(mapping.get('href', value, href))
16
- let props = $derived({ ...mapping.get('props', value, {}), ...rest })
17
- </script>
18
-
19
- <a href={url} class={classes} {...props}>
20
- <Item {value} {mapping} />
21
- </a>
package/src/List.svelte DELETED
@@ -1,89 +0,0 @@
1
- <script>
2
- import { createEmitter } from '@rokkit/core'
3
- import { navigator } from '@rokkit/actions'
4
- import ListBody from './ListBody.svelte'
5
- import { ListController } from '@rokkit/states'
6
- import { omit, has } from 'ramda'
7
-
8
- /**
9
- * @typedef {Object} Props
10
- * @property {string} [class]
11
- * @property {string} [name]
12
- * @property {any} [items]
13
- * @property {import('@rokkit/core').FieldMapping} [fields]
14
- * @property {any} [value]
15
- * @property {number} [tabindex]
16
- * @property {any} [hierarchy]
17
- * @property {import('svelte').Snippet} [children]
18
- */
19
-
20
- /** @type {Props} */
21
- let {
22
- class: classes = '',
23
- name = 'list',
24
- items = $bindable([]),
25
- value = $bindable(null),
26
- fields,
27
- tabindex = 0,
28
- hierarchy = [],
29
- multiSelect = false,
30
- header,
31
- footer,
32
- empty,
33
- onselect,
34
- onchange,
35
- onmove,
36
- ...snippets
37
- } = $props()
38
-
39
- let selected = $state([])
40
-
41
- function handleAction(event) {
42
- const { name, data } = event.detail
43
-
44
- if (has(name, emitter)) {
45
- value = data.value
46
- selected = data.selected
47
- emitter[name](data)
48
- }
49
- }
50
-
51
- let emitter = createEmitter({ onchange, onmove, onselect }, ['select', 'change', 'move'])
52
- let wrapper = new ListController(items, value, fields, { multiSelect })
53
- </script>
54
-
55
- <div
56
- data-list
57
- class={classes}
58
- role="listbox"
59
- aria-label={name}
60
- use:navigator={{ wrapper }}
61
- {tabindex}
62
- onaction={handleAction}
63
- >
64
- {#if header}
65
- <div data-list-header>{@render header()}</div>
66
- {/if}
67
- <div data-list-body>
68
- {#if items.length === 0}
69
- {#if empty}
70
- {@render empty()}
71
- {:else}
72
- <p>No items found.</p>
73
- {/if}
74
- {:else}
75
- <ListBody
76
- bind:items
77
- bind:value
78
- {fields}
79
- selectedKeys={wrapper.selectedKeys}
80
- focusedKey={wrapper.focusedKey}
81
- onchange={emitter.change}
82
- {snippets}
83
- />
84
- {/if}
85
- </div>
86
- {#if footer}
87
- <div data-list-footer>{@render footer()}</div>
88
- {/if}
89
- </div>
@@ -1,43 +0,0 @@
1
- <script>
2
- import { getKeyFromPath, FieldMapper, getSnippet } from '@rokkit/core'
3
- import Item from './Item.svelte'
4
- import { equals } from 'ramda'
5
-
6
- let {
7
- items = $bindable([]),
8
- value = null,
9
- fields,
10
- path = [],
11
- onchange = () => {},
12
- selectedKeys = new SvelteSet(),
13
- focusedKey = null,
14
- snippets = {}
15
- } = $props()
16
- let fm = $derived.by(() => {
17
- return new FieldMapper(fields)
18
- })
19
- </script>
20
-
21
- {#each items as item, index (index)}
22
- {@const template = getSnippet(snippets, fm.get('snippet', item, 'stub'))}
23
- {@const pathKey = getKeyFromPath([...path, index])}
24
- {@const props = fm.get('props', item) || {}}
25
- <div
26
- data-list-item
27
- role="option"
28
- data-path={pathKey}
29
- aria-selected={selectedKeys.has(pathKey)}
30
- aria-current={focusedKey === pathKey}
31
- >
32
- <svelte:boundary>
33
- {#if template}
34
- {@render template(item, props, onchange)}
35
- {#snippet failed()}
36
- <Item value={item} {fields} />
37
- {/snippet}
38
- {:else}
39
- <Item value={item} {fields} />
40
- {/if}
41
- </svelte:boundary>
42
- </div>
43
- {/each}
@@ -1,11 +0,0 @@
1
- <script>
2
- let { text = null, type = 'error', children } = $props()
3
- </script>
4
-
5
- <rk-message class={type}>
6
- {#if children}
7
- {@render children()}
8
- {:else}
9
- {text}
10
- {/if}
11
- </rk-message>
@@ -1,48 +0,0 @@
1
- <script>
2
- import Select from './Select.svelte'
3
- import Item from './Item.svelte'
4
- import { defaultFields } from '@rokkit/core'
5
-
6
- let className = ''
7
- export { className as class }
8
- export let name
9
- export let value = []
10
- export let options = []
11
- /** @type {import('@rokkit/core').FieldMapping} */
12
- export let fields = {}
13
- export let using = {}
14
- export let placeholder = ''
15
-
16
- $: available = options.filter((item) => !value.includes(item))
17
-
18
- function handleRemove(event) {
19
- value = [...value.filter((item) => item !== event.detail)]
20
- }
21
- function handleSelect(event) {
22
- if (!value.includes(event.detail)) value = [...value, event.detail]
23
- }
24
- $: using = { default: Item, ...using }
25
- $: fields = { ...defaultFields, ...fields }
26
- </script>
27
-
28
- <Select
29
- {name}
30
- options={available}
31
- {fields}
32
- {using}
33
- on:select={handleSelect}
34
- class={className}
35
- {placeholder}
36
- >
37
- {#if value.length > 0}
38
- <items class="flex flex-wrap">
39
- {#each value as item, index (index)}
40
- <Item value={item} {fields} {using} removable on:remove={handleRemove} class="pill" />
41
- {/each}
42
- </items>
43
- {:else}
44
- <item class="flex w-full">
45
- <svelte:component this={using.default} value={placeholder} />
46
- </item>
47
- {/if}
48
- </Select>
@@ -1,78 +0,0 @@
1
- <script>
2
- import { SvelteSet } from 'svelte/reactivity'
3
- import {
4
- defaultStateIcons,
5
- getLineTypes,
6
- getKeyFromPath,
7
- getNestedFields,
8
- hasChildren
9
- } from '@rokkit/core'
10
- import Node from './Node.svelte'
11
- import NestedList from './NestedList.svelte'
12
-
13
- /**
14
- * @typedef {Object} Props
15
- * @property {Array<NodeProxy>} [items=[]]
16
- * @property {any} [value=null]
17
- * @property {import('./types').FieldMapping} fields
18
- * @property {number[]} [path=[]]
19
- * @property {import('./types').NodeStateIcons} icons
20
- * @property {import('./types').ConnectionType[]} [types=[]]
21
- * @property {string} [focusedKey]
22
- * @property {SvelteSet} [selectedKeys]
23
- */
24
-
25
- /** @type {Props} */
26
- let {
27
- items = $bindable([]),
28
- value = $bindable(null),
29
- fields,
30
- path = [],
31
- icons = {},
32
- types = [],
33
- focusedKey,
34
- selectedKeys = new SvelteSet(),
35
- stub,
36
- snippets
37
- } = $props()
38
-
39
- const stateIcons = $derived({ ...defaultStateIcons.node, ...icons })
40
- const childFields = $derived(getNestedFields(fields))
41
- // $inspect(childFields, items[0], expandedKeys)
42
- </script>
43
-
44
- <rk-nested-list role="tree">
45
- {#each items as item, index (index)}
46
- {@const nodePath = [...path, index]}
47
- {@const key = getKeyFromPath(nodePath)}
48
- {@const expanded = item[fields.expanded]}
49
- {@const nodeType = index === items.length - 1 ? 'last' : 'child'}
50
- {@const connectors = getLineTypes(hasChildren(item, fields), types, nodeType)}
51
-
52
- <Node
53
- value={item}
54
- {fields}
55
- {stateIcons}
56
- types={connectors}
57
- focused={focusedKey === key}
58
- selected={selectedKeys.has(key)}
59
- {expanded}
60
- path={nodePath}
61
- {stub}
62
- {snippets}
63
- >
64
- {#if hasChildren(item, fields) && expanded}
65
- <NestedList
66
- items={item[fields.children]}
67
- {value}
68
- fields={childFields}
69
- path={nodePath}
70
- icons={stateIcons}
71
- types={connectors}
72
- {focusedKey}
73
- {selectedKeys}
74
- />
75
- {/if}
76
- </Node>
77
- {/each}
78
- </rk-nested-list>