@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.
- package/README.md +198 -101
- package/package.json +42 -34
- package/src/components/BreadCrumbs.svelte +90 -0
- package/src/components/Button.svelte +93 -0
- package/src/components/ButtonGroup.svelte +18 -0
- package/src/components/Card.svelte +61 -0
- package/src/components/Carousel.svelte +174 -0
- package/src/components/Code.svelte +189 -0
- package/src/components/Connector.svelte +46 -0
- package/src/components/FloatingAction.svelte +334 -0
- package/src/components/FloatingNavigation.svelte +235 -0
- package/src/components/Grid.svelte +128 -0
- package/src/components/ItemContent.svelte +25 -0
- package/src/components/LazyTree.svelte +165 -0
- package/src/components/List.svelte +188 -0
- package/src/components/Menu.svelte +270 -0
- package/src/components/MultiSelect.svelte +369 -0
- package/src/components/PaletteManager.svelte +364 -0
- package/src/components/Pill.svelte +83 -0
- package/src/components/ProgressBar.svelte +31 -0
- package/src/components/Range.svelte +330 -0
- package/src/components/Rating.svelte +101 -0
- package/src/components/Reveal.svelte +58 -0
- package/src/components/SearchFilter.svelte +88 -0
- package/src/components/Select.svelte +396 -0
- package/src/{Shine.svelte → components/Shine.svelte} +29 -21
- package/src/components/Stepper.svelte +172 -0
- package/src/components/Switch.svelte +75 -0
- package/src/components/Table.svelte +242 -0
- package/src/components/Tabs.svelte +192 -0
- package/src/components/Tilt.svelte +68 -0
- package/src/components/Timeline.svelte +61 -0
- package/src/components/Toggle.svelte +93 -0
- package/src/components/Toolbar.svelte +308 -0
- package/src/components/ToolbarGroup.svelte +17 -0
- package/src/components/Tree.svelte +144 -0
- package/src/components/UploadFileStatus.svelte +83 -0
- package/src/components/UploadProgress.svelte +131 -0
- package/src/components/UploadTarget.svelte +124 -0
- package/src/components/index.ts +38 -0
- package/src/index.ts +46 -0
- package/src/types/button.ts +86 -0
- package/src/types/code.ts +46 -0
- package/src/types/floating-action.ts +123 -0
- package/src/types/floating-navigation.ts +80 -0
- package/src/types/index.ts +55 -0
- package/src/types/list.ts +200 -0
- package/src/types/menu.ts +95 -0
- package/src/types/palette.ts +160 -0
- package/src/types/range.ts +51 -0
- package/src/types/search-filter.ts +67 -0
- package/src/types/select.ts +176 -0
- package/src/types/switch.ts +68 -0
- package/src/types/table.ts +210 -0
- package/src/types/tabs.ts +103 -0
- package/src/types/timeline.ts +53 -0
- package/src/types/toggle.ts +68 -0
- package/src/types/toolbar.ts +164 -0
- package/src/types/tree.ts +250 -0
- package/src/types/upload-file-status.ts +45 -0
- package/src/types/upload-progress.ts +111 -0
- package/src/types/upload-target.ts +68 -0
- package/src/utils/palette.ts +582 -0
- package/src/utils/shiki.ts +122 -0
- package/src/utils/upload.js +128 -0
- package/dist/constants.d.ts +0 -2
- package/dist/index.d.ts +0 -41
- package/dist/lib/fields.d.ts +0 -16
- package/dist/lib/form.d.ts +0 -95
- package/dist/lib/index.d.ts +0 -6
- package/dist/lib/layout.d.ts +0 -7
- package/dist/lib/nested.d.ts +0 -48
- package/dist/lib/schema.d.ts +0 -7
- package/dist/lib/select.d.ts +0 -8
- package/dist/lib/tree.d.ts +0 -9
- package/dist/tree/List.spec.svelte.d.ts +0 -1
- package/dist/tree/Node.spec.svelte.d.ts +0 -1
- package/dist/tree/Root.spec.svelte.d.ts +0 -1
- package/dist/types.d.ts +0 -5
- package/dist/wrappers/index.d.ts +0 -3
- package/src/Accordion.svelte +0 -118
- package/src/BreadCrumbs.svelte +0 -32
- package/src/Button.svelte +0 -57
- package/src/Calendar.svelte +0 -93
- package/src/Card.svelte +0 -45
- package/src/Carousel.svelte +0 -49
- package/src/CheckBox.svelte +0 -56
- package/src/Connector.svelte +0 -40
- package/src/DropDown.svelte +0 -68
- package/src/DropSearch.svelte +0 -37
- package/src/Fillable.svelte +0 -19
- package/src/GraphPaper.svelte +0 -43
- package/src/Icon.svelte +0 -81
- package/src/Item.svelte +0 -25
- package/src/Link.svelte +0 -21
- package/src/List.svelte +0 -89
- package/src/ListBody.svelte +0 -43
- package/src/Message.svelte +0 -11
- package/src/MultiSelect.svelte +0 -48
- package/src/NestedList.svelte +0 -78
- package/src/NestedPaginator.svelte +0 -63
- package/src/Node.svelte +0 -76
- package/src/Overlay.svelte +0 -21
- package/src/PageNavigator.svelte +0 -94
- package/src/PickOne.svelte +0 -60
- package/src/Pill.svelte +0 -41
- package/src/ProgressBar.svelte +0 -21
- package/src/ProgressDots.svelte +0 -53
- package/src/RadioGroup.svelte +0 -52
- package/src/Range.svelte +0 -45
- package/src/RangeMinMax.svelte +0 -124
- package/src/RangeSlider.svelte +0 -79
- package/src/RangeTick.svelte +0 -28
- package/src/Rating.svelte +0 -95
- package/src/ResponsiveGrid.svelte +0 -88
- package/src/Scrollable.svelte +0 -7
- package/src/Select.svelte +0 -114
- package/src/Separator.svelte +0 -1
- package/src/Slider.svelte +0 -14
- package/src/SlidingColumns.svelte +0 -50
- package/src/Stage.svelte +0 -41
- package/src/Stepper.svelte +0 -66
- package/src/Summary.svelte +0 -22
- package/src/Switch.svelte +0 -106
- package/src/TableCell.svelte +0 -51
- package/src/TableHeaderCell.svelte +0 -54
- package/src/Tabs.svelte +0 -176
- package/src/Tilt.svelte +0 -66
- package/src/Toggle.svelte +0 -58
- package/src/ToggleThemeMode.svelte +0 -23
- package/src/Tree.svelte +0 -80
- package/src/TreeTable.svelte +0 -171
- package/src/ValidationReport.svelte +0 -23
- package/src/constants.js +0 -4
- package/src/index.js +0 -48
- package/src/lib/fields.js +0 -118
- package/src/lib/form.js +0 -72
- package/src/lib/index.js +0 -13
- package/src/lib/layout.js +0 -63
- package/src/lib/nested.js +0 -192
- package/src/lib/schema.js +0 -32
- package/src/lib/select.js +0 -38
- package/src/lib/tree.js +0 -22
- package/src/tree/List.spec.svelte.js +0 -84
- package/src/tree/List.svelte +0 -78
- package/src/tree/Node.spec.svelte.js +0 -104
- package/src/tree/Node.svelte +0 -80
- package/src/tree/Root.spec.svelte.js +0 -63
- package/src/tree/Root.svelte +0 -81
- package/src/types.js +0 -9
- package/src/wrappers/Category.svelte +0 -27
- package/src/wrappers/Section.svelte +0 -16
- package/src/wrappers/Wrapper.svelte +0 -12
- package/src/wrappers/index.js +0 -3
package/src/ListBody.svelte
DELETED
|
@@ -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}
|
package/src/Message.svelte
DELETED
package/src/MultiSelect.svelte
DELETED
|
@@ -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>
|
package/src/NestedList.svelte
DELETED
|
@@ -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>
|
package/src/Overlay.svelte
DELETED
|
@@ -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>
|
package/src/PageNavigator.svelte
DELETED
|
@@ -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>
|
package/src/PickOne.svelte
DELETED
|
@@ -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>
|
package/src/ProgressBar.svelte
DELETED
|
@@ -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>
|
package/src/ProgressDots.svelte
DELETED
|
@@ -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>
|
package/src/RadioGroup.svelte
DELETED
|
@@ -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>
|