viur-ui 0.0.1

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 (114) hide show
  1. package/README.md +79 -0
  2. package/index.d.ts +351 -0
  3. package/index.js +46 -0
  4. package/package.json +84 -0
  5. package/src/components/Browser/Browser.vue +496 -0
  6. package/src/components/Browser/TreeNav.vue +408 -0
  7. package/src/components/Browser/ViurBrowser.d.vue.ts +64 -0
  8. package/src/components/Browser/ViurBrowser.vue +271 -0
  9. package/src/components/Browser/dragSession.ts +134 -0
  10. package/src/components/Browser/index.ts +14 -0
  11. package/src/components/Browser/types.ts +30 -0
  12. package/src/components/DataTable/ColumnFilterPanel.vue +225 -0
  13. package/src/components/DataTable/DataTable.vue +3155 -0
  14. package/src/components/DataTable/ViurDataTable.d.vue.ts +72 -0
  15. package/src/components/DataTable/ViurDataTable.vue +331 -0
  16. package/src/components/DataTable/columns.ts +400 -0
  17. package/src/components/DataTable/index.ts +60 -0
  18. package/src/components/DataTable/rows.ts +446 -0
  19. package/src/components/DataTable/types.ts +267 -0
  20. package/src/components/DataTable/useColumnLayout.ts +294 -0
  21. package/src/components/DataTable/useGridNavigation.ts +193 -0
  22. package/src/components/DataTable/useVirtualRows.ts +126 -0
  23. package/src/components/DataTable/viurColumns.ts +330 -0
  24. package/src/forms/ViForm.d.vue.ts +106 -0
  25. package/src/forms/ViForm.vue +592 -0
  26. package/src/forms/ViFormCategory.vue +57 -0
  27. package/src/forms/bones/Bone.vue +1023 -0
  28. package/src/forms/bones/BoneActions.vue +127 -0
  29. package/src/forms/bones/BoneLabel.vue +122 -0
  30. package/src/forms/bones/BoneMultipleList.vue +91 -0
  31. package/src/forms/bones/BoneMultipleWrapper.vue +105 -0
  32. package/src/forms/bones/BoneNestedWrapper.vue +155 -0
  33. package/src/forms/bones/BoneSingleEntry.vue +51 -0
  34. package/src/forms/bones/FilterBone.vue +694 -0
  35. package/src/forms/bones/actionbar/defaultBar.vue +98 -0
  36. package/src/forms/bones/actionbar/fileBar.vue +165 -0
  37. package/src/forms/bones/actionbar/relationalBar.vue +125 -0
  38. package/src/forms/bones/actions/ActionDialog.vue +70 -0
  39. package/src/forms/bones/actions/Debug.vue +106 -0
  40. package/src/forms/bones/actions/Delete.vue +13 -0
  41. package/src/forms/bones/actions/DescribeImage.vue +201 -0
  42. package/src/forms/bones/actions/Download.vue +27 -0
  43. package/src/forms/bones/actions/Placeholder.vue +14 -0
  44. package/src/forms/bones/actions/Translation.vue +238 -0
  45. package/src/forms/bones/actions/index.js +280 -0
  46. package/src/forms/bones/bone.d.ts +45 -0
  47. package/src/forms/bones/country_information.json +779 -0
  48. package/src/forms/bones/index.js +225 -0
  49. package/src/forms/bones/uploadAdapter.js +46 -0
  50. package/src/forms/bones/utils.js +284 -0
  51. package/src/forms/bones/view/base_item.vue +35 -0
  52. package/src/forms/bones/view/boneLogic.js +202 -0
  53. package/src/forms/bones/view/index.js +5 -0
  54. package/src/forms/bones/widgets/booleanBone.vue +83 -0
  55. package/src/forms/bones/widgets/booleanBoneChoose.vue +57 -0
  56. package/src/forms/bones/widgets/booleanBoneSelect.vue +58 -0
  57. package/src/forms/bones/widgets/codeBone.vue +214 -0
  58. package/src/forms/bones/widgets/colorBone.vue +75 -0
  59. package/src/forms/bones/widgets/dateBone.vue +114 -0
  60. package/src/forms/bones/widgets/emailBone.vue +100 -0
  61. package/src/forms/bones/widgets/fileBone.vue +273 -0
  62. package/src/forms/bones/widgets/jsonBone.vue +63 -0
  63. package/src/forms/bones/widgets/keyBone.vue +71 -0
  64. package/src/forms/bones/widgets/numericBone.vue +125 -0
  65. package/src/forms/bones/widgets/passwordBone.vue +215 -0
  66. package/src/forms/bones/widgets/phoneBone.vue +173 -0
  67. package/src/forms/bones/widgets/rawBone.vue +94 -0
  68. package/src/forms/bones/widgets/recordBone.vue +64 -0
  69. package/src/forms/bones/widgets/relationalBone.vue +164 -0
  70. package/src/forms/bones/widgets/relationalBoneSelect.vue +120 -0
  71. package/src/forms/bones/widgets/selectBone.vue +122 -0
  72. package/src/forms/bones/widgets/selectBoneChoose.vue +104 -0
  73. package/src/forms/bones/widgets/spatialBone.vue +111 -0
  74. package/src/forms/bones/widgets/stringBone.vue +139 -0
  75. package/src/forms/bones/widgets/textBone.vue +641 -0
  76. package/src/forms/install.d.ts +4 -0
  77. package/src/forms/install.js +43 -0
  78. package/src/forms/layouts/LayloutList2Columns.vue +57 -0
  79. package/src/forms/layouts/LayoutCategory.vue +38 -0
  80. package/src/forms/layouts/LayoutList.vue +31 -0
  81. package/src/forms/utils.js +601 -0
  82. package/src/public/assets/icons/fontawesome-manifest.json +8 -0
  83. package/src/public/assets/icons/regular/file.svg +1 -0
  84. package/src/public/assets/icons/solid/arrows-left-right.svg +1 -0
  85. package/src/public/assets/icons/solid/bug.svg +1 -0
  86. package/src/public/assets/icons/solid/check.svg +1 -0
  87. package/src/public/assets/icons/solid/circle-info.svg +1 -0
  88. package/src/public/assets/icons/solid/compress.svg +1 -0
  89. package/src/public/assets/icons/solid/download.svg +1 -0
  90. package/src/public/assets/icons/solid/expand.svg +1 -0
  91. package/src/public/assets/icons/solid/grip-vertical.svg +1 -0
  92. package/src/public/assets/icons/solid/plus.svg +1 -0
  93. package/src/public/assets/icons/solid/question.svg +1 -0
  94. package/src/public/assets/icons/solid/triangle-exclamation.svg +1 -0
  95. package/src/public/assets/icons/solid/upload.svg +1 -0
  96. package/src/public/assets/icons/solid/xmark.svg +1 -0
  97. package/src/request/cache.js +183 -0
  98. package/src/request/configStore.js +516 -0
  99. package/src/request/envelope.js +211 -0
  100. package/src/request/index.js +35 -0
  101. package/src/request/messageStore.js +201 -0
  102. package/src/request/request.js +752 -0
  103. package/src/request/skel.js +90 -0
  104. package/src/theme/colorStore.js +168 -0
  105. package/src/translations/de.js +178 -0
  106. package/src/translations/en.js +177 -0
  107. package/src/user/LoginScreen.d.vue.ts +54 -0
  108. package/src/user/LoginScreen.vue +627 -0
  109. package/src/user/google.js +75 -0
  110. package/src/user/index.js +3 -0
  111. package/src/user/store.d.ts +59 -0
  112. package/src/user/store.js +183 -0
  113. package/src/webawesomeCompat.css +72 -0
  114. package/src/webawesomeConfig.js +61 -0
@@ -0,0 +1,694 @@
1
+ <template>
2
+ <div
3
+ class="bone"
4
+ :class="{
5
+ 'has-subbones': state.bonestructure['using'],
6
+ 'is-label-top': label === 'top',
7
+ 'is-label-hide': ['hide', 'placeholder'].includes(label),
8
+ [`bone-type-${state.bonestructure['type'].split('.')[0]}`]: true,
9
+ [`bone-name-${name}`]: true,
10
+ }"
11
+ >
12
+ <bone-label
13
+ v-if="!['hide', 'placeholder'].includes(label)"
14
+ :name="name"
15
+ >
16
+ <span :class="{ 'bone-label-required': state.required }">{{ state.bonestructure["descr"] }}</span>
17
+ <span
18
+ v-if="state.required"
19
+ class="bone-label-required"
20
+ >
21
+ *
22
+ </span>
23
+ <wa-tooltip
24
+ v-if="state.hasTooltip && !showLabelInfo"
25
+ :for="state.labelTooltipTargetId"
26
+ :content="state.bonestructure.params['tooltip']"
27
+ placement="top-center"
28
+ ></wa-tooltip>
29
+ <div
30
+ v-if="state.hasTooltip && !showLabelInfo"
31
+ :id="state.labelTooltipTargetId"
32
+ class="bone-label-tooltip"
33
+ >
34
+ <wa-icon name="question"></wa-icon>
35
+ </div>
36
+ </bone-label>
37
+
38
+ <wa-alert
39
+ v-if="showLabelInfo && state.hasTooltip"
40
+ variant="brand"
41
+ open
42
+ class="bone-label-info"
43
+ >
44
+ <wa-icon
45
+ slot="icon"
46
+ name="circle-info"
47
+ ></wa-icon>
48
+ {{ state.bonestructure.params["tooltip"] }}
49
+ </wa-alert>
50
+ <wa-tooltip
51
+ class="bone-tooltip"
52
+ :for="state.boneTooltipTargetId"
53
+ :disabled="!state.showtooltip"
54
+ :content="state.bonestructure?.['descr']"
55
+ style="--show-delay: 1000"
56
+ ></wa-tooltip>
57
+ <div
58
+ :id="state.boneTooltipTargetId"
59
+ class="bone-inner"
60
+ :class="[`bone-widget-${name}`]"
61
+ >
62
+ <div class="bone-row">
63
+ <wa-select
64
+ v-if="state.multilanguage"
65
+ style="width: 100px"
66
+ :value="state.currentLanguage"
67
+ @change="updateLanguage"
68
+ >
69
+ <wa-option
70
+ v-for="lang in state.languages"
71
+ :value="lang"
72
+ >
73
+ {{ $t(lang) }}
74
+ </wa-option>
75
+ </wa-select>
76
+ <div class="bone-row">
77
+ <div class="bone-block">
78
+ <component
79
+ :is="is"
80
+ :value="state.bonevalue"
81
+ :name="name"
82
+ :index="null"
83
+ :bone="state.bonestructure"
84
+ :autofocus="autofocus"
85
+ @change="updateValue"
86
+ @keypress.enter="updateValue"
87
+ ></component>
88
+ </div>
89
+ <bone-actions
90
+ v-if="state.boneactions"
91
+ :value="state.bonevalue"
92
+ :name="name"
93
+ :index="null"
94
+ :bone="state.bonestructure"
95
+ @change="updateValue"
96
+ ></bone-actions>
97
+ </div>
98
+ </div>
99
+ <template v-if="errorStyle === 'default'">
100
+ <wa-alert
101
+ v-for="message in state.errorMessages"
102
+ open
103
+ summary="Errors"
104
+ variant="danger"
105
+ class="bone-error"
106
+ >
107
+ <wa-icon
108
+ slot="icon"
109
+ name="triangle-exclamation"
110
+ ></wa-icon>
111
+ <div class="bone-error">
112
+ {{ $t(`errors.${message}`) }}
113
+ </div>
114
+ </wa-alert>
115
+ </template>
116
+ <template v-else>
117
+ <div
118
+ v-for="message in state.errorMessages"
119
+ style="font-size: 0.8em; color: red"
120
+ >
121
+ {{ $t(`errors.${message}`) }}
122
+ </div>
123
+ </template>
124
+ </div>
125
+ </div>
126
+ </template>
127
+
128
+ <script setup>
129
+ import {
130
+ reactive,
131
+ defineComponent,
132
+ computed,
133
+ onBeforeMount,
134
+ provide,
135
+ getCurrentInstance,
136
+ onMounted,
137
+ watch,
138
+ ref,
139
+ inject,
140
+ unref,
141
+ } from "vue"
142
+ import wrapperMultiple from "./BoneMultipleWrapper.vue"
143
+ import BoneLabel from "./BoneLabel.vue"
144
+ import { BoneHasMultipleHandling, getBoneActionbar } from "./index"
145
+ import rawBone from "./rawBone.vue"
146
+ import Utils, { buildBoneDomId } from "./utils"
147
+ import { VueDraggable } from "vue-draggable-plus"
148
+ import BoneActions from "./BoneActions.vue"
149
+
150
+ const emit = defineEmits(["change", "change-internal", "handleClick"])
151
+
152
+ const props = defineProps({
153
+ is: {
154
+ type: Object,
155
+ default: rawBone,
156
+ },
157
+ name: {
158
+ type: String,
159
+ required: true,
160
+ },
161
+ languages: Array,
162
+ multiple: Boolean,
163
+ readonly: Boolean,
164
+ required: Boolean,
165
+ params: Object,
166
+ value: [Object, String, Number, Boolean, Array],
167
+ structure: {
168
+ type: Object,
169
+ required: true,
170
+ },
171
+ skel: {
172
+ type: null,
173
+ required: true,
174
+ },
175
+ errors: Object,
176
+ label: {
177
+ type: String,
178
+ default: "normal",
179
+ validator(value, props) {
180
+ return ["normal", "top", "hide", "placeholder"].includes(value)
181
+ },
182
+ },
183
+ boneactions: { type: Boolean, default: false },
184
+ showLabelInfo: { type: Boolean, required: false, default: false },
185
+ autofocus: { type: Boolean, required: false, default: false },
186
+ defaultLanguage: { type: String, default: "de" },
187
+ showBoneTooltip: { type: Boolean, required: false, default: false },
188
+ errorStyle: {
189
+ type: String,
190
+ default: "default",
191
+ validator(value, props) {
192
+ return ["default", "decent"].includes(value)
193
+ },
194
+ },
195
+ })
196
+ const parentBonePath = inject("bonePath", [])
197
+ const bonePath = computed(() => [...(unref(parentBonePath) ?? []), props.name])
198
+ provide("bonePath", bonePath)
199
+ const state = reactive({
200
+ boneactions: computed(() => props.boneactions),
201
+ bonestructure: computed(() => {
202
+ let struct = props.structure?.[props.name]
203
+ struct["multiple"] = false
204
+ return struct
205
+ }),
206
+ bonevalue: null,
207
+ multilanguage: computed(() => state.languages?.length && state.languages.length > 0),
208
+ languages: computed(() => {
209
+ if (props.languages) {
210
+ return props.languages
211
+ }
212
+ return state.bonestructure && Object.keys(state.bonestructure).includes("languages")
213
+ ? state.bonestructure["languages"]
214
+ : []
215
+ }),
216
+ readonly: computed(() => {
217
+ if (props.readonly) {
218
+ return props.readonly
219
+ }
220
+ return state.bonestructure && Object.keys(state.bonestructure).includes("readonly")
221
+ ? state.bonestructure["readonly"]
222
+ : false
223
+ }),
224
+ required: computed(() => {
225
+ if (props.required) {
226
+ return props.required
227
+ }
228
+ return state.bonestructure && Object.keys(state.bonestructure).includes("required")
229
+ ? state.bonestructure["required"]
230
+ : false
231
+ }),
232
+ hasTooltip: computed(() => {
233
+ return state.bonestructure && Object.keys(state.bonestructure["params"]).includes("tooltip") ? true : false
234
+ }),
235
+
236
+ multiple: computed(() => {
237
+ if (props.multiple) {
238
+ return props.multiple
239
+ }
240
+ return state.bonestructure && Object.keys(state.bonestructure).includes("multiple")
241
+ ? state.bonestructure["multiple"]
242
+ : false
243
+ }),
244
+ params: computed(() => {
245
+ if (props.params) {
246
+ return props.params
247
+ }
248
+ return state.bonestructure && Object.keys(state.bonestructure).includes("params")
249
+ ? state.bonestructure["params"]
250
+ : {}
251
+ }),
252
+ actionbar: computed(() => {
253
+ return getBoneActionbar(state.bonestructure?.["type"])
254
+ }),
255
+ isEmpty: computed(() => {
256
+ // Function to check if an object is empty
257
+ function isObjectEmpty(obj) {
258
+ for (const [key, value] of Object.entries(obj)) {
259
+ if (value !== null) {
260
+ if (Array.isArray(value) && value.length > 0) {
261
+ return false
262
+ } else if (!Array.isArray(value)) {
263
+ return false
264
+ }
265
+ }
266
+ }
267
+ return true
268
+ }
269
+
270
+ // Ignore the computation when the state is readonly
271
+ if (state.readonly) return false
272
+
273
+ // Check for null or undefined values
274
+ if (!state.bonevalue) return true
275
+
276
+ // Check if the value is an array with elements
277
+ if (Array.isArray(state.bonevalue) && state.bonevalue.length === 0) return true
278
+
279
+ // Check if the value is an object and not an array, then use helper function to check if it's empty
280
+ if (state.bonevalue === Object(state.bonevalue) && !Array.isArray(state.bonevalue))
281
+ return isObjectEmpty(state.bonevalue)
282
+
283
+ return false
284
+ }),
285
+
286
+ errors: [],
287
+ errorMessages: computed(() => {
288
+ let errors = []
289
+ for (let error of props.errors) {
290
+ if (
291
+ error["fieldPath"][0] === props.name &&
292
+ (error["fieldPath"].length === 1 ||
293
+ ((state.multilanguage || state.multiple) && error["fieldPath"].length === 2) ||
294
+ (state.multilanguage && state.multiple && error["fieldPath"].length === 3)) &&
295
+ (error["severity"] > 2 || (state.required && (error["severity"] === 2 || error["severity"] === 0)))
296
+ ) {
297
+ //severity level???
298
+ errors.push(error["errorMessage"])
299
+ }
300
+ }
301
+ return errors
302
+ }),
303
+ label: computed(() => props.label),
304
+ showtooltip: computed(() => {
305
+ if (props.showBoneTooltip) {
306
+ return true
307
+ }
308
+ if (["hide", "placeholder"].includes(props.label)) {
309
+ return true
310
+ }
311
+ return false
312
+ }),
313
+ defaultLanguage: computed(() => props.defaultLanguage),
314
+ currentLanguage: null,
315
+ labelTooltipTargetId: computed(() => buildBoneDomId(unref(bonePath) ?? [], "label-tooltip")),
316
+ boneTooltipTargetId: computed(() => buildBoneDomId(unref(bonePath) ?? [], "field-tooltip")),
317
+ })
318
+ provide("boneState", state)
319
+
320
+ function updateValue(name, val, lang = null, index = null, valid = true) {
321
+ if (val === undefined) return false
322
+ if (valid) {
323
+ if (lang) {
324
+ if (!state.bonevalue) {
325
+ state.bonevalue = {}
326
+ }
327
+ if (Object.keys(state.bonevalue).includes(lang) && index !== null) {
328
+ state.bonevalue[lang][index] = val
329
+ } else {
330
+ state.bonevalue[lang] = val
331
+ }
332
+ } else if (index !== null) {
333
+ state.bonevalue[index] = val
334
+ } else {
335
+ state.bonevalue = val
336
+ }
337
+ }
338
+
339
+ if (state.readonly) return false
340
+
341
+ let changeInternalObj = {
342
+ name: name,
343
+ value: val,
344
+ lang: state.multilanguage ? state.currentLanguage : null,
345
+ index: index,
346
+ valid: valid,
347
+ }
348
+
349
+ emit("change-internal", changeInternalObj)
350
+ }
351
+ provide("updateValue", updateValue)
352
+
353
+ function updateLanguage(e) {
354
+ state.currentLanguage = e.target.value
355
+ let changeInternalObj = {
356
+ name: props.name,
357
+ value: state.bonevalue,
358
+ lang: state.currentLanguage,
359
+ index: null,
360
+ valid: true,
361
+ }
362
+
363
+ emit("change-internal", changeInternalObj)
364
+ }
365
+
366
+ function addMultipleEntry(lang = null, data = "") {
367
+ if (lang) {
368
+ if (Object.keys(state.bonevalue).includes(lang)) {
369
+ state.bonevalue[lang].push(data)
370
+ } else {
371
+ state.bonevalue[lang] = [data]
372
+ }
373
+ } else {
374
+ if (state.bonevalue) {
375
+ state.bonevalue.push(data)
376
+ } else {
377
+ state.bonevalue = [data]
378
+ }
379
+ }
380
+ }
381
+ provide("addMultipleEntry", addMultipleEntry)
382
+
383
+ function removeMultipleEntry(index, lang = null) {
384
+ if (lang) {
385
+ state.bonevalue?.[lang].splice(index, 1)
386
+ } else {
387
+ state.bonevalue.splice(index, 1)
388
+ }
389
+
390
+ if (lang) {
391
+ updateValue(props.name, state.bonevalue[lang], lang)
392
+ } else {
393
+ updateValue(props.name, state.bonevalue)
394
+ }
395
+ }
396
+
397
+ function removeMultipleEntries(lang = null) {
398
+ if (lang) {
399
+ state.bonevalue?.[lang].splice(0)
400
+ } else {
401
+ state.bonevalue.splice(0)
402
+ }
403
+ if (lang) {
404
+ updateValue(props.name, state.bonevalue[lang], lang)
405
+ } else {
406
+ updateValue(props.name, state.bonevalue)
407
+ }
408
+ }
409
+
410
+ provide("removeMultipleEntries", removeMultipleEntries)
411
+
412
+ function formatString(formatstr, boneValue) {
413
+ return Utils.formatString(formatstr, boneValue)
414
+ }
415
+ provide("formatString", formatString)
416
+
417
+ onBeforeMount(() => {
418
+ if (props.value) {
419
+ state.bonevalue = props.value
420
+ } else {
421
+ state.bonevalue = props.skel?.[props.name]
422
+ }
423
+ state.currentLanguage = state.defaultLanguage
424
+ })
425
+
426
+ watch(
427
+ () => props.skel?.[props.name],
428
+ (newVal, oldVal) => {
429
+ state.bonevalue = props.skel?.[props.name]
430
+ }
431
+ )
432
+
433
+ watch(
434
+ () => props.errors?.[props.name],
435
+ (newVal, oldVal) => {
436
+ state.errors = props.errors
437
+ }
438
+ )
439
+ </script>
440
+
441
+ <style scoped>
442
+ @layer foundation.form {
443
+ .bone {
444
+ display: grid;
445
+ grid-template-columns: 235px 1fr;
446
+ grid-gap: var(--wa-space-s);
447
+ margin-bottom: 20px;
448
+
449
+ &.is-label-top,
450
+ &.has-subbones {
451
+ display: flex;
452
+ flex-direction: column;
453
+ grid-gap: 0;
454
+
455
+ & > :deep(.bone-label) {
456
+ border-bottom-left-radius: 0;
457
+ border-top-right-radius: var(--wa-border-radius-m);
458
+ min-width: 235px;
459
+ }
460
+
461
+ & > .bone-inner {
462
+ padding-top: var(--wa-space-s);
463
+ border-top: 2px solid var(--wa-color-neutral-80);
464
+ margin-bottom: 5px;
465
+ }
466
+ }
467
+
468
+ &.is-label-hide {
469
+ display: flex;
470
+ flex-direction: column;
471
+ grid-gap: 0;
472
+ }
473
+
474
+ @media (max-width: 900px) {
475
+ grid-template-columns: 1fr;
476
+ }
477
+ }
478
+
479
+ wa-tab-panel::part(base) {
480
+ padding: 0;
481
+ }
482
+
483
+ .bone-lang-tabs {
484
+ width: 100%;
485
+ --track-width: 0;
486
+ --indicator-color: var(--vi-background-color);
487
+ --track-color: var(--vi-border-color);
488
+
489
+ &::part(body) {
490
+ padding-bottom: var(--wa-space-xs);
491
+ overflow-x: hidden;
492
+ }
493
+
494
+ &::part(tabs) {
495
+ border-top: 1px solid var(--vi-border-color);
496
+ }
497
+
498
+ & wa-tab {
499
+ margin-top: -1px;
500
+
501
+ &[aria-selected="true"] {
502
+ z-index: 1;
503
+
504
+ &::part(base) {
505
+ background-color: var(--vi-background-color);
506
+ border: 1px solid var(--vi-border-color);
507
+ border-top: 1px solid var(--vi-background-color) !important;
508
+ border-bottom: 2px solid var(--wa-color-brand-50) !important;
509
+ }
510
+ }
511
+
512
+ &::part(base) {
513
+ background-color: var(--wa-color-neutral-90);
514
+ border: 1px solid var(--wa-color-neutral-70);
515
+ border-top: 1px solid var(--vi-border-color);
516
+ border-radius: 0;
517
+ padding: var(--wa-space-xs);
518
+ transition: all ease 0.3s;
519
+ }
520
+
521
+ &:hover {
522
+ &::part(base) {
523
+ background-color: var(--vi-background-color);
524
+ border: 1px solid var(--vi-border-color);
525
+ }
526
+ }
527
+
528
+ &:first-child {
529
+ &::part(base) {
530
+ border-bottom-left-radius: 5px;
531
+ }
532
+ }
533
+
534
+ &:nth-last-child(2) {
535
+ &::part(base) {
536
+ border-bottom-right-radius: 5px;
537
+ }
538
+ }
539
+
540
+ &:not(:first-child) {
541
+ &::part(base) {
542
+ margin-left: -1px;
543
+ }
544
+ }
545
+ }
546
+ }
547
+
548
+ .bone-multiple-placeholder {
549
+ &:not(.is-readonly) {
550
+ margin-bottom: var(--wa-space-xs);
551
+ }
552
+
553
+ & wa-input {
554
+ &::part(base) {
555
+ border-top-left-radius: 0;
556
+ border-bottom-left-radius: 0;
557
+ opacity: 0.7;
558
+ }
559
+ }
560
+
561
+ @media (max-width: 900px) {
562
+ & wa-input {
563
+ &::part(base) {
564
+ border-top-right-radius: 0;
565
+ border-bottom-left-radius: var(--wa-border-radius-m);
566
+ }
567
+ }
568
+ }
569
+ }
570
+
571
+ .bone-inner {
572
+ min-width: 1px;
573
+
574
+ & wa-alert {
575
+ margin-top: var(--wa-space-xs);
576
+ background-color: transparent;
577
+
578
+ &::part(message) {
579
+ padding: var(--wa-space-xs) var(--wa-space-s);
580
+ }
581
+
582
+ &::part(icon) {
583
+ padding-left: var(--wa-space-s);
584
+ }
585
+ }
586
+ }
587
+
588
+ .bone-label-info {
589
+ &::part(base) {
590
+ align-items: center;
591
+ margin-left: 0.5em;
592
+ background-color: var(--wa-color-info-95);
593
+ border: none;
594
+ overflow: visible;
595
+ }
596
+
597
+ &::part(message) {
598
+ padding: var(--wa-space-s);
599
+ }
600
+
601
+ &::part(icon) {
602
+ display: flex;
603
+ align-items: center;
604
+ justify-content: center;
605
+ border-radius: 50%;
606
+ background-color: var(--wa-color-surface-default);
607
+ width: 1em;
608
+ height: 1em;
609
+ margin-left: -0.5em;
610
+ padding-left: 0;
611
+ }
612
+ }
613
+
614
+ .bone-label-tooltip {
615
+ display: flex;
616
+ align-items: center;
617
+ justify-content: center;
618
+ margin-left: auto;
619
+ padding-left: 0.4em;
620
+
621
+ & wa-icon {
622
+ background-color: var(--wa-color-info-50);
623
+ color: #fff;
624
+ padding: 0.4em;
625
+ border-radius: 50%;
626
+ font-size: 0.55em;
627
+ }
628
+ }
629
+
630
+ wa-tooltip {
631
+ &::part(body) {
632
+ background-color: var(--wa-color-info-50);
633
+ }
634
+
635
+ &::part(base__arrow) {
636
+ background-color: var(--wa-color-info-50);
637
+ }
638
+ }
639
+
640
+ .bone-label-required {
641
+ color: var(--wa-color-brand-50);
642
+ font-weight: 700;
643
+ }
644
+
645
+ :deep(wa-combobox) {
646
+ &::part(input__base) {
647
+ border: 1px solid var(--vi-border-color);
648
+ box-shadow: none !important;
649
+ }
650
+
651
+ &::part(input__prefix) {
652
+ display: none !important;
653
+ }
654
+
655
+ &::part(input__suffix) {
656
+ display: none !important;
657
+ }
658
+ }
659
+
660
+ wa-tooltip.bone-tooltip {
661
+ &::part(body) {
662
+ background-color: var(--wa-color-brand-50);
663
+ }
664
+
665
+ &::part(base__arrow) {
666
+ background-color: var(--wa-color-brand-50);
667
+ }
668
+ }
669
+ }
670
+
671
+ .bone-error::part(base) {
672
+ background-color: #ffecec;
673
+ color: var(--wa-color-danger-30);
674
+ }
675
+
676
+ .bone-row {
677
+ display: flex;
678
+ flex-direction: row;
679
+ gap: var(--wa-space-xs);
680
+ }
681
+
682
+ .bone-block {
683
+ display: block;
684
+ width: 100%;
685
+ }
686
+ </style>
687
+
688
+ <style>
689
+ wa-input[data-user-invalid]::part(base),
690
+ wa-select[data-user-invalid]::part(combobox),
691
+ wa-checkbox[data-user-invalid]::part(control) {
692
+ border-color: var(--wa-color-danger-50);
693
+ }
694
+ </style>