@rokkit/ui 1.0.0-next.125 → 1.0.0-next.128

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 (154) hide show
  1. package/README.md +198 -101
  2. package/package.json +42 -34
  3. package/src/components/BreadCrumbs.svelte +90 -0
  4. package/src/components/Button.svelte +93 -0
  5. package/src/components/ButtonGroup.svelte +18 -0
  6. package/src/components/Card.svelte +61 -0
  7. package/src/components/Carousel.svelte +174 -0
  8. package/src/components/Code.svelte +189 -0
  9. package/src/components/Connector.svelte +46 -0
  10. package/src/components/FloatingAction.svelte +334 -0
  11. package/src/components/FloatingNavigation.svelte +235 -0
  12. package/src/components/Grid.svelte +128 -0
  13. package/src/components/ItemContent.svelte +25 -0
  14. package/src/components/LazyTree.svelte +165 -0
  15. package/src/components/List.svelte +188 -0
  16. package/src/components/Menu.svelte +270 -0
  17. package/src/components/MultiSelect.svelte +369 -0
  18. package/src/components/PaletteManager.svelte +364 -0
  19. package/src/components/Pill.svelte +83 -0
  20. package/src/components/ProgressBar.svelte +31 -0
  21. package/src/components/Range.svelte +330 -0
  22. package/src/components/Rating.svelte +101 -0
  23. package/src/components/Reveal.svelte +58 -0
  24. package/src/components/SearchFilter.svelte +88 -0
  25. package/src/components/Select.svelte +396 -0
  26. package/src/{Shine.svelte → components/Shine.svelte} +29 -21
  27. package/src/components/Stepper.svelte +172 -0
  28. package/src/components/Switch.svelte +75 -0
  29. package/src/components/Table.svelte +242 -0
  30. package/src/components/Tabs.svelte +192 -0
  31. package/src/components/Tilt.svelte +68 -0
  32. package/src/components/Timeline.svelte +61 -0
  33. package/src/components/Toggle.svelte +93 -0
  34. package/src/components/Toolbar.svelte +308 -0
  35. package/src/components/ToolbarGroup.svelte +17 -0
  36. package/src/components/Tree.svelte +144 -0
  37. package/src/components/UploadFileStatus.svelte +83 -0
  38. package/src/components/UploadProgress.svelte +131 -0
  39. package/src/components/UploadTarget.svelte +124 -0
  40. package/src/components/index.ts +38 -0
  41. package/src/index.ts +46 -0
  42. package/src/types/button.ts +86 -0
  43. package/src/types/code.ts +46 -0
  44. package/src/types/floating-action.ts +123 -0
  45. package/src/types/floating-navigation.ts +80 -0
  46. package/src/types/index.ts +55 -0
  47. package/src/types/list.ts +200 -0
  48. package/src/types/menu.ts +95 -0
  49. package/src/types/palette.ts +160 -0
  50. package/src/types/range.ts +51 -0
  51. package/src/types/search-filter.ts +67 -0
  52. package/src/types/select.ts +176 -0
  53. package/src/types/switch.ts +68 -0
  54. package/src/types/table.ts +210 -0
  55. package/src/types/tabs.ts +103 -0
  56. package/src/types/timeline.ts +53 -0
  57. package/src/types/toggle.ts +68 -0
  58. package/src/types/toolbar.ts +164 -0
  59. package/src/types/tree.ts +250 -0
  60. package/src/types/upload-file-status.ts +45 -0
  61. package/src/types/upload-progress.ts +111 -0
  62. package/src/types/upload-target.ts +68 -0
  63. package/src/utils/palette.ts +582 -0
  64. package/src/utils/shiki.ts +122 -0
  65. package/src/utils/upload.js +128 -0
  66. package/dist/constants.d.ts +0 -2
  67. package/dist/index.d.ts +0 -41
  68. package/dist/lib/fields.d.ts +0 -16
  69. package/dist/lib/form.d.ts +0 -95
  70. package/dist/lib/index.d.ts +0 -6
  71. package/dist/lib/layout.d.ts +0 -7
  72. package/dist/lib/nested.d.ts +0 -48
  73. package/dist/lib/schema.d.ts +0 -7
  74. package/dist/lib/select.d.ts +0 -8
  75. package/dist/lib/tree.d.ts +0 -9
  76. package/dist/tree/List.spec.svelte.d.ts +0 -1
  77. package/dist/tree/Node.spec.svelte.d.ts +0 -1
  78. package/dist/tree/Root.spec.svelte.d.ts +0 -1
  79. package/dist/types.d.ts +0 -5
  80. package/dist/wrappers/index.d.ts +0 -3
  81. package/src/Accordion.svelte +0 -118
  82. package/src/BreadCrumbs.svelte +0 -32
  83. package/src/Button.svelte +0 -57
  84. package/src/Calendar.svelte +0 -93
  85. package/src/Card.svelte +0 -45
  86. package/src/Carousel.svelte +0 -49
  87. package/src/CheckBox.svelte +0 -56
  88. package/src/Connector.svelte +0 -40
  89. package/src/DropDown.svelte +0 -68
  90. package/src/DropSearch.svelte +0 -37
  91. package/src/Fillable.svelte +0 -19
  92. package/src/GraphPaper.svelte +0 -43
  93. package/src/Icon.svelte +0 -81
  94. package/src/Item.svelte +0 -25
  95. package/src/Link.svelte +0 -21
  96. package/src/List.svelte +0 -89
  97. package/src/ListBody.svelte +0 -43
  98. package/src/Message.svelte +0 -11
  99. package/src/MultiSelect.svelte +0 -48
  100. package/src/NestedList.svelte +0 -78
  101. package/src/NestedPaginator.svelte +0 -63
  102. package/src/Node.svelte +0 -76
  103. package/src/Overlay.svelte +0 -21
  104. package/src/PageNavigator.svelte +0 -94
  105. package/src/PickOne.svelte +0 -60
  106. package/src/Pill.svelte +0 -41
  107. package/src/ProgressBar.svelte +0 -21
  108. package/src/ProgressDots.svelte +0 -53
  109. package/src/RadioGroup.svelte +0 -52
  110. package/src/Range.svelte +0 -45
  111. package/src/RangeMinMax.svelte +0 -124
  112. package/src/RangeSlider.svelte +0 -79
  113. package/src/RangeTick.svelte +0 -28
  114. package/src/Rating.svelte +0 -95
  115. package/src/ResponsiveGrid.svelte +0 -88
  116. package/src/Scrollable.svelte +0 -7
  117. package/src/Select.svelte +0 -114
  118. package/src/Separator.svelte +0 -1
  119. package/src/Slider.svelte +0 -14
  120. package/src/SlidingColumns.svelte +0 -50
  121. package/src/Stage.svelte +0 -41
  122. package/src/Stepper.svelte +0 -66
  123. package/src/Summary.svelte +0 -22
  124. package/src/Switch.svelte +0 -106
  125. package/src/TableCell.svelte +0 -51
  126. package/src/TableHeaderCell.svelte +0 -54
  127. package/src/Tabs.svelte +0 -176
  128. package/src/Tilt.svelte +0 -66
  129. package/src/Toggle.svelte +0 -58
  130. package/src/ToggleThemeMode.svelte +0 -23
  131. package/src/Tree.svelte +0 -80
  132. package/src/TreeTable.svelte +0 -171
  133. package/src/ValidationReport.svelte +0 -23
  134. package/src/constants.js +0 -4
  135. package/src/index.js +0 -48
  136. package/src/lib/fields.js +0 -118
  137. package/src/lib/form.js +0 -72
  138. package/src/lib/index.js +0 -13
  139. package/src/lib/layout.js +0 -63
  140. package/src/lib/nested.js +0 -192
  141. package/src/lib/schema.js +0 -32
  142. package/src/lib/select.js +0 -38
  143. package/src/lib/tree.js +0 -22
  144. package/src/tree/List.spec.svelte.js +0 -84
  145. package/src/tree/List.svelte +0 -78
  146. package/src/tree/Node.spec.svelte.js +0 -104
  147. package/src/tree/Node.svelte +0 -80
  148. package/src/tree/Root.spec.svelte.js +0 -63
  149. package/src/tree/Root.svelte +0 -81
  150. package/src/types.js +0 -9
  151. package/src/wrappers/Category.svelte +0 -27
  152. package/src/wrappers/Section.svelte +0 -16
  153. package/src/wrappers/Wrapper.svelte +0 -12
  154. package/src/wrappers/index.js +0 -3
@@ -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>
@@ -1,63 +0,0 @@
1
- <script>
2
- import { defaultFields, flattenNestedList } from '@rokkit/core'
3
- import Item from './Item.svelte'
4
- import BreadCrumbs from './BreadCrumbs.svelte'
5
- import Icon from './Icon.svelte'
6
- // import { flattenNestedList } from './lib/nested'
7
- import { createEventDispatcher } from 'svelte'
8
-
9
- const dispatch = createEventDispatcher()
10
- export let items
11
- export let value
12
- export let fields
13
- export let using
14
-
15
- let trail
16
- let flatList
17
-
18
- function handleNav(event) {
19
- let current = flatList.findIndex((item) => item === value)
20
- let index = current
21
- if (event === 'previous') {
22
- while (index > 0 && !flatList[index][fields.key]) {
23
- index = index - 1
24
- }
25
- } else {
26
- while (index < flatList.length - 1 && !flatList[index][fields.key]) {
27
- index = index + 1
28
- }
29
- }
30
- if (flatList[index][fields.key]) {
31
- value = flatList[index]
32
- trail = findTrail(flatList, value)
33
- dispatch('change', { item: value, trail })
34
- }
35
- }
36
- function findTrail(items, value) {
37
- let trail = []
38
- let index = items.findIndex((item) => item === value)
39
- if (index === -1) return trail
40
-
41
- let level = items[index][fields.level]
42
- while (level > 0) {
43
- trail.unshift(items[index])
44
- index = items.findIndex((item, i) => i < index && item[fields.level] === level - 1)
45
- level = items[index][fields.level]
46
- }
47
- return trail
48
- }
49
-
50
- $: flatList = flattenNestedList(items, fields)
51
- $: fields = { ...defaultFields, ...(fields ?? {}) }
52
- </script>
53
-
54
- <pages>
55
- <Icon
56
- name="arrow-left"
57
- class="cursor-pointer"
58
- label="Previous"
59
- onclick={() => handleNav('previous')}
60
- />
61
- <BreadCrumbs items={trail} {fields} {using} />
62
- <Icon name="arrow-right" class="cursor-pointer" onclick={() => handleNav('next')} label="Next" />
63
- </pages>
package/src/Node.svelte DELETED
@@ -1,76 +0,0 @@
1
- <script>
2
- import { defaultStateIcons, getKeyFromPath, getSnippet } from '@rokkit/core'
3
- import Icon from './Icon.svelte'
4
- import Connector from './Connector.svelte'
5
- import Item from './Item.svelte'
6
-
7
- /**
8
- * @typedef {Object} Props
9
- * @property {any} value
10
- * @property {import('./types').FieldMapping} fields
11
- * @property {any} [types]
12
- * @property {import('./types').NodeStateIcons} [stateIcons]
13
- * @property {number[]} [path=[]]
14
- * @property {boolean} [focused=false]
15
- * @property {boolean} [selected=false]
16
- * @property {boolean} [expanded=false]
17
- * @property {Function} [children]
18
- * @property {Function} [stub=null]
19
- * @property {Object<string, Function>} [snippets={}]
20
- */
21
-
22
- /** @type {Props} */
23
- let {
24
- value = $bindable(null),
25
- fields,
26
- types = [],
27
- stateIcons = defaultStateIcons.node,
28
- path = [],
29
- focused = false,
30
- selected = false,
31
- expanded = false,
32
- children,
33
- stub = null,
34
- snippets = {}
35
- } = $props()
36
-
37
- let stateName = $derived(expanded ? 'opened' : 'closed')
38
- let icons = $derived({ ...defaultStateIcons.node, ...stateIcons })
39
- let state = $derived(
40
- expanded ? { icon: icons.opened, label: 'collapse' } : { icon: icons.closed, label: 'expand' }
41
- )
42
-
43
- const template = getSnippet(value[fields.snippet], snippets, stub)
44
- </script>
45
-
46
- <rk-node
47
- aria-current={focused}
48
- aria-selected={selected}
49
- aria-expanded={expanded}
50
- role="treeitem"
51
- data-path={getKeyFromPath(path)}
52
- data-depth={path.length}
53
- >
54
- <div class="flex flex-row items-center">
55
- {#each types as type, index (index)}
56
- {#if type === 'icon'}
57
- <Icon name={state.icon} label={state.label} state={stateName} class="w-4" size="small" />
58
- {:else}
59
- <Connector {type} />
60
- {/if}
61
- {/each}
62
- <rk-item>
63
- <svelte:boundary>
64
- {#if template}
65
- {@render template(value)}
66
- {#snippet failed()}
67
- <Item {value} {fields} />
68
- {/snippet}
69
- {:else}
70
- <Item {value} {fields} />
71
- {/if}
72
- </svelte:boundary>
73
- </rk-item>
74
- </div>
75
- {@render children?.()}
76
- </rk-node>
@@ -1,21 +0,0 @@
1
- <script>
2
- import { dismissable } from '@rokkit/actions'
3
- let { children } = $props()
4
- let dismissed = $state(false)
5
- let ondismiss = () => {
6
- dismissed = true
7
- }
8
- </script>
9
-
10
- <rk-overlay
11
- class="absolute left-0 top-0 h-screen w-screen"
12
- role="presentation"
13
- class:z-1={!dismissed}
14
- class:display-none={dismissed}
15
- aria-hidden="true"
16
- onclick={ondismiss}
17
- use:dismissable
18
- {ondismiss}
19
- >
20
- {@render children?.()}
21
- </rk-overlay>
@@ -1,94 +0,0 @@
1
- <script>
2
- import { createEventDispatcher } from 'svelte'
3
- import { defaultFields, defaultStateIcons } from '@rokkit/core'
4
- import { Icon } from '@rokkit/atoms'
5
-
6
- const dispatch = createEventDispatcher()
7
-
8
- let className = ''
9
- export { className as class }
10
-
11
- export let items = []
12
- export let value = items[0]
13
- export let fields = {}
14
- export let numbers = false
15
-
16
- const navigate = defaultStateIcons.navigate
17
-
18
- let previous
19
- let next
20
-
21
- function updateOnChange(value, items) {
22
- let index = items.findIndex((x) => x === value)
23
- if (index === -1) value = items[0]
24
- // } else {
25
- previous = index > 0 ? items[index - 1] : null
26
- next = index < items.length - 1 ? items[index + 1] : null
27
- // }
28
- }
29
-
30
- function handleClick(item) {
31
- if (item) {
32
- value = item
33
- dispatch('select', value)
34
- }
35
- }
36
-
37
- $: fields = { ...defaultFields, ...fields }
38
- $: updateOnChange(value, items)
39
-
40
- // $: value = items.findIndex((x) => x === value) ? value : items[0]
41
- </script>
42
-
43
- <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
44
- <nav-pages class="grid select-none grid-cols-3 {className}" tabindex="0">
45
- <!-- svelte-ignore a11y-click-events-have-key-events -->
46
- <span
47
- class="flex cursor-pointer items-center"
48
- on:click={() => handleClick(previous)}
49
- tabIndex={previous ? 0 : -1}
50
- >
51
- {#if previous}
52
- <Icon name={navigate.left} />
53
- <p>
54
- {#if previous[fields.text]}
55
- {previous[fields.text]}
56
- {/if}
57
- </p>
58
- {/if}
59
- </span>
60
- <span class="flex items-center justify-center">
61
- <block class="flex items-center">
62
- {#each items as item, index (index)}
63
- <!-- svelte-ignore a11y-click-events-have-key-events -->
64
- <pg
65
- class:numbers
66
- class:dot={!numbers}
67
- class:is-selected={value === item}
68
- on:click={() => handleClick(item)}
69
- tabindex="0"
70
- class="cursor-pointer"
71
- >
72
- {#if numbers}
73
- {index + 1}
74
- {/if}
75
- </pg>
76
- {/each}
77
- </block>
78
- </span>
79
- <!-- svelte-ignore a11y-click-events-have-key-events -->
80
- <span
81
- class="flex cursor-pointer items-center justify-end"
82
- on:click={() => handleClick(next)}
83
- tabIndex={next ? 0 : -1}
84
- >
85
- {#if next}
86
- <p class="text-right">
87
- {#if next[fields.text]}
88
- {next[fields.text]}
89
- {/if}
90
- </p>
91
- <Icon name={navigate.right} />
92
- {/if}
93
- </span>
94
- </nav-pages>
@@ -1,60 +0,0 @@
1
- <script>
2
- // import { onMount } from 'svelte'
3
- // import { $state, $derived } from 'svelte'
4
-
5
- /**
6
- * @typedef {Object} Props
7
- * @property {any[]} options
8
- * @property {any} value
9
- */
10
-
11
- /** @type Props */
12
- let { options, value = $bindable() } = $props()
13
-
14
- // const optionRefs = new Map<number, HTMLLabelElement>()
15
-
16
- // const $indicatorStyle = $derived(() => {
17
- // const el = optionRefs.get(value)
18
- // if (!el) return ''
19
- // const { offsetLeft, offsetWidth } = el
20
- // return `transform: translateX(${offsetLeft}px); width: ${offsetWidth}px;`
21
- // })
22
-
23
- // onMount(() => {
24
- // setTimeout(() => {
25
- // optionRefs.get(value)?.offsetLeft
26
- // })
27
- // })
28
- </script>
29
-
30
- <div class="relative inline-flex rounded-md bg-gray-200 p-1" data-pickone-root role="radiogroup">
31
- <!-- Indicator -->
32
- <div
33
- class="absolute h-full rounded-md bg-white shadow transition-all duration-300"
34
- data-pickone-current
35
- aria-hidden="true"
36
- ></div>
37
-
38
- {#each options as option, index (index)}
39
- <div
40
- class="relative z-10 cursor-pointer text-sm font-medium text-gray-700"
41
- data-pickone-option
42
- aria-checked={option === value}
43
- role="radio"
44
- >
45
- <label class="bg-red flex size-full px-4 py-2">
46
- <input
47
- type="radio"
48
- name="pickone"
49
- value={option}
50
- class="peer hidden"
51
- checked={option === value}
52
- onchange={() => (value = option)}
53
- />
54
- <span class="transition peer-checked:font-semibold peer-checked:text-black">
55
- {option}
56
- </span>
57
- </label>
58
- </div>
59
- {/each}
60
- </div>
package/src/Pill.svelte DELETED
@@ -1,41 +0,0 @@
1
- <script>
2
- import { FieldMapper, noop } from '@rokkit/core'
3
- import Item from './Item.svelte'
4
- import Icon from './Icon.svelte'
5
- import { keyboard } from '@rokkit/actions'
6
-
7
- /**
8
- * @type {Object} Props
9
- * @property {string|Object} [value]
10
- * @property {FieldMapper} [mapping]
11
- * @property {boolean} [removable]
12
- * @property {boolean} [disabled]
13
- */
14
-
15
- /** @type {ListProps} */
16
- let {
17
- value,
18
- class: classes = '',
19
- mapping = new FieldMapper(),
20
- removable = false,
21
- disabled = false,
22
- onremove = noop
23
- } = $props()
24
-
25
- const keyMappings = {
26
- remove: ['Delete', 'Backspace']
27
- }
28
-
29
- function handle(event) {
30
- if (!disabled) onremove(value)
31
- }
32
- </script>
33
-
34
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
35
- <div data-pill-root use:keyboard={keyMappings} onremove={handle} tabindex="0" class={classes}>
36
- <Item {value} {mapping}></Item>
37
- {#if removable}
38
- <Icon name="action-close" role="button" aria-label="Remove" {disabled} onclick={handle} small
39
- ></Icon>
40
- {/if}
41
- </div>
@@ -1,21 +0,0 @@
1
- <script>
2
- import { isNil } from 'ramda'
3
- /**
4
- * @typedef {Object} Props
5
- * @property {string} [class]
6
- * @property {any} [value]
7
- * @property {any} [max]
8
- * @property {string} [height]
9
- * @property {number} [width]
10
- */
11
-
12
- /** @type {Props} */
13
- let { class: classes = '', value = null, max = 100, height = '1.5mm' } = $props()
14
-
15
- let indeterminate = $derived(isNil(value) || isNil(max))
16
- let percentage = $derived(indeterminate ? '100%' : `${(value * 100) / max}%`)
17
- </script>
18
-
19
- <rk-progress class:indeterminate class={classes} style:height>
20
- <value-bar class="h-full" style:width={percentage}></value-bar>
21
- </rk-progress>
@@ -1,53 +0,0 @@
1
- <script>
2
- import { createEventDispatcher } from 'svelte'
3
- const dispatch = createEventDispatcher()
4
-
5
- export let count
6
- export let value = -1
7
- export let current = -1
8
-
9
- $: inprogress = current === value + 1 ? current : inprogress
10
- // $: enabled = count > 0
11
-
12
- function handleClick(e) {
13
- const step = parseInt(e.target.dataset.step)
14
- if (e.target.dataset.clickable === 'true') {
15
- current = step
16
- dispatch('change', { count, value, current })
17
- }
18
- }
19
-
20
- $: steps = Array.from({ length: count }, (_, i) => i)
21
- </script>
22
-
23
- <span class="progress flex items-center gap-2" class:empty={count === 0}>
24
- {#each steps as step, index (index)}
25
- <!-- svelte-ignore a11y-click-events-have-key-events -->
26
- <dot
27
- class="step border-surface-100 bg-surface-300 flex h-3 w-3 rounded-full border-2"
28
- on:click={handleClick}
29
- data-step={step}
30
- data-active={step === current}
31
- data-completed={step <= value}
32
- data-clickable={step <= value || step <= inprogress}
33
- role="option"
34
- aria-selected={step === current}
35
- tabindex="0"
36
- ></dot>
37
- {/each}
38
- </span>
39
-
40
- <style lang="postcss">
41
- .empty {
42
- @apply border-primary-500 w-full border-b;
43
- }
44
- .step[data-clickable='true'] {
45
- @apply cursor-pointer;
46
- }
47
- .step[data-completed='true'] {
48
- @apply bg-primary-500;
49
- }
50
- .step[data-active='true'] {
51
- @apply border-primary-400 bg-primary-500;
52
- }
53
- </style>
@@ -1,52 +0,0 @@
1
- <script>
2
- import { equals } from 'ramda'
3
- import { defaultStateIcons } from '@rokkit/core'
4
- import { defaultMapping } from './constants'
5
-
6
- /**
7
- * @typedef {Object} Props
8
- * @property {string} [class]
9
- * @property {any} value
10
- * @property {any} name
11
- * @property {any} [id]
12
- * @property {import('@rokkit/core).FieldMapper} [mapping]
13
- * @property {any} [options]
14
- * @property {boolean} [readOnly]
15
- * @property {boolean} [textAfter]
16
- * @property {any} [stateIcons]
17
- */
18
-
19
- /** @type {Props} */
20
- let {
21
- class: className = '',
22
- value = $bindable(),
23
- name,
24
- id = null,
25
- mapping = $bindable(defaultMapping),
26
- options = [],
27
- readOnly = false,
28
- textAfter = true,
29
- stateIcons = defaultStateIcons.radio
30
- } = $props()
31
-
32
- let flexDirection = $derived(textAfter ? 'flex-row' : 'flex-row-reverse')
33
- </script>
34
-
35
- <rk-radio-group
36
- {id}
37
- class="flex cursor-pointer select-none flex-col {className}"
38
- class:disabled={readOnly}
39
- >
40
- {#each options as item, index (index)}
41
- {@const label = mapping.get('text', item)}
42
- {@const itemValue = mapping.get('value', item, label)}
43
-
44
- {@const state = equals(itemValue, value) ? 'on' : 'off'}
45
-
46
- <label class="flex {flexDirection} items-center gap-2">
47
- <input hidden type="radio" {name} bind:group={value} value={itemValue} {readOnly} />
48
- <icon class={stateIcons[state]}></icon>
49
- <p>{label}</p>
50
- </label>
51
- {/each}
52
- </rk-radio-group>