origam 2.24.0 → 2.26.0

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 (35) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/src/assets/css/main.css +1 -1
  3. package/dist/src/assets/css/tokens/dark.css +2 -16
  4. package/dist/src/assets/css/tokens/light.css +1 -8
  5. package/dist/src/assets/scss/tokens/_dark.scss +2 -16
  6. package/dist/src/assets/scss/tokens/_light.scss +1 -8
  7. package/dist/src/components/Btn/OrigamBtn.vue +89 -124
  8. package/dist/src/components/Card/OrigamCard.vue +80 -13
  9. package/dist/src/components/DataTable/OrigamDataTable.vue +26 -1
  10. package/dist/src/components/DataTable/OrigamDataTableRows.vue +58 -12
  11. package/dist/src/components/ExpansionPanel/OrigamExpansionPanel.vue +4 -2
  12. package/dist/src/components/ExpansionPanel/OrigamExpansionPanelContent.vue +12 -3
  13. package/dist/src/components/Field/OrigamField.vue +120 -152
  14. package/dist/src/components/Skeleton/OrigamSkeleton.vue +2 -7
  15. package/dist/src/components/Switch/OrigamSwitch.vue +1 -69
  16. package/dist/src/enums/DataTable/data-table.enum.cjs +8 -2
  17. package/dist/src/enums/DataTable/data-table.enum.d.ts +16 -0
  18. package/dist/src/enums/DataTable/data-table.enum.js +6 -0
  19. package/dist/src/interfaces/Btn/btn.interface.d.ts +3 -3
  20. package/dist/src/interfaces/Commons/loader.interface.d.ts +13 -1
  21. package/dist/src/interfaces/Field/field.interface.d.ts +2 -2
  22. package/dist/src/interfaces/Skeleton/skeleton.interface.d.ts +13 -0
  23. package/dist/src/interfaces/Switch/switch.interface.d.ts +2 -2
  24. package/dist/src/types/Commons/loader.type.d.ts +24 -0
  25. package/dist/src/types/tokens.type.d.ts +1 -1
  26. package/dist/src/utils/DataTable/skeleton-cell.util.cjs +13 -0
  27. package/dist/src/utils/DataTable/skeleton-cell.util.d.ts +12 -0
  28. package/dist/src/utils/DataTable/skeleton-cell.util.js +7 -0
  29. package/dist/src/utils/Skeleton/skeleton.util.cjs +30 -0
  30. package/dist/src/utils/Skeleton/skeleton.util.d.ts +33 -0
  31. package/dist/src/utils/Skeleton/skeleton.util.js +23 -0
  32. package/dist/src/utils/index.cjs +22 -0
  33. package/dist/src/utils/index.d.ts +2 -0
  34. package/dist/src/utils/index.js +2 -0
  35. package/package.json +1 -1
@@ -331,8 +331,6 @@
331
331
  --origam-btn---overlay-opacity-hover: var(--origam-opacity---12);
332
332
  --origam-btn---overlay-opacity-active: 0.2;
333
333
  --origam-btn---overlay-opacity-active-hover: 0.28;
334
- --origam-btn--loader-skeleton---min-width: 96px;
335
- --origam-btn--loader-skeleton---min-height: 36px;
336
334
  --origam-btn__progress---linear-height: 3px;
337
335
  --origam-btn__progress---linear-position: 0px;
338
336
  --origam-btn__progress---linear-position-top: auto;
@@ -429,7 +427,7 @@
429
427
  --origam-card--loading---min-height: 120px;
430
428
  --origam-card__asset---aspect-ratio: 16 / 9;
431
429
  --origam-card__loader---min-height: 4px;
432
- --origam-card__loader---min-height-skeleton: 200px;
430
+ --origam-card__skeleton---padding: var(--origam-space---4);
433
431
  --origam-card__loader---z-index: 3;
434
432
  --origam-card__progress---linear-height: 4px;
435
433
  --origam-card__progress---circular-margin: 24px auto;
@@ -1818,7 +1816,6 @@
1818
1816
  --origam-data-table-rows--no-data---text-align: center;
1819
1817
  --origam-data-table-rows--no-data---color: var(--origam-color__text---secondary);
1820
1818
  --origam-data-table-rows--loading---color: var(--origam-color__text---secondary);
1821
- --origam-data-table-rows--skeleton---cell-padding: 4px 8px;
1822
1819
  --origam-data-table-header-cell--sortable---cursor: pointer;
1823
1820
  --origam-data-table__sortable---icon-color: var(--origam-color__text---primary);
1824
1821
  --origam-data-table__sortable---icon-color-active: var(--origam-color__text---primary);
@@ -2303,10 +2300,6 @@
2303
2300
  --origam-switch__thumb---border-color: rgba(0, 0, 0, 0.18);
2304
2301
  --origam-switch__thumb---color: currentColor;
2305
2302
  --origam-switch__selection-control---min-height: 56px;
2306
- --origam-switch__skeleton---width: 52px;
2307
- --origam-switch__skeleton---height: 32px;
2308
- --origam-switch__skeleton-track---background-color: color-mix(in srgb, currentColor 14%, transparent);
2309
- --origam-switch__skeleton-thumb---background-color: color-mix(in srgb, currentColor 28%, transparent);
2310
2303
  --origam-switch__track--inset---height: 32px;
2311
2304
  --origam-switch__track--inset---width: 52px;
2312
2305
  --origam-switch---opacity-disabled: var(--origam-opacity---32);
@@ -3351,8 +3344,6 @@
3351
3344
  --origam-btn---overlay-opacity-hover: var(--origam-opacity---12);
3352
3345
  --origam-btn---overlay-opacity-active: 0.2;
3353
3346
  --origam-btn---overlay-opacity-active-hover: 0.28;
3354
- --origam-btn--loader-skeleton---min-width: 96px;
3355
- --origam-btn--loader-skeleton---min-height: 36px;
3356
3347
  --origam-btn__progress---linear-height: 3px;
3357
3348
  --origam-btn__progress---linear-position: 0px;
3358
3349
  --origam-btn__progress---linear-position-top: auto;
@@ -3449,7 +3440,7 @@
3449
3440
  --origam-card--loading---min-height: 120px;
3450
3441
  --origam-card__asset---aspect-ratio: 16 / 9;
3451
3442
  --origam-card__loader---min-height: 4px;
3452
- --origam-card__loader---min-height-skeleton: 200px;
3443
+ --origam-card__skeleton---padding: var(--origam-space---4);
3453
3444
  --origam-card__loader---z-index: 3;
3454
3445
  --origam-card__progress---linear-height: 4px;
3455
3446
  --origam-card__progress---circular-margin: 24px auto;
@@ -4838,7 +4829,6 @@
4838
4829
  --origam-data-table-rows--no-data---text-align: center;
4839
4830
  --origam-data-table-rows--no-data---color: var(--origam-color__text---secondary);
4840
4831
  --origam-data-table-rows--loading---color: var(--origam-color__text---secondary);
4841
- --origam-data-table-rows--skeleton---cell-padding: 4px 8px;
4842
4832
  --origam-data-table-header-cell--sortable---cursor: pointer;
4843
4833
  --origam-data-table__sortable---icon-color: var(--origam-color__text---primary);
4844
4834
  --origam-data-table__sortable---icon-color-active: var(--origam-color__text---primary);
@@ -5322,10 +5312,6 @@
5322
5312
  --origam-switch__thumb---border-color: rgba(0, 0, 0, 0.18);
5323
5313
  --origam-switch__thumb---color: currentColor;
5324
5314
  --origam-switch__selection-control---min-height: 56px;
5325
- --origam-switch__skeleton---width: 52px;
5326
- --origam-switch__skeleton---height: 32px;
5327
- --origam-switch__skeleton-track---background-color: color-mix(in srgb, currentColor 14%, transparent);
5328
- --origam-switch__skeleton-thumb---background-color: color-mix(in srgb, currentColor 28%, transparent);
5329
5315
  --origam-switch__track--inset---height: 32px;
5330
5316
  --origam-switch__track--inset---width: 52px;
5331
5317
  --origam-switch---opacity-disabled: var(--origam-opacity---32);
@@ -231,8 +231,6 @@
231
231
  --origam-btn---overlay-opacity-hover: var(--origam-opacity---12);
232
232
  --origam-btn---overlay-opacity-active: 0.2;
233
233
  --origam-btn---overlay-opacity-active-hover: 0.28;
234
- --origam-btn--loader-skeleton---min-width: 96px;
235
- --origam-btn--loader-skeleton---min-height: 36px;
236
234
  --origam-btn__progress---linear-height: 3px;
237
235
  --origam-btn__progress---linear-position: 0px;
238
236
  --origam-btn__progress---linear-position-top: auto;
@@ -329,7 +327,7 @@
329
327
  --origam-card--loading---min-height: 120px;
330
328
  --origam-card__asset---aspect-ratio: 16 / 9;
331
329
  --origam-card__loader---min-height: 4px;
332
- --origam-card__loader---min-height-skeleton: 200px;
330
+ --origam-card__skeleton---padding: var(--origam-space---4);
333
331
  --origam-card__loader---z-index: 3;
334
332
  --origam-card__progress---linear-height: 4px;
335
333
  --origam-card__progress---circular-margin: 24px auto;
@@ -1720,7 +1718,6 @@
1720
1718
  --origam-data-table-rows--no-data---text-align: center;
1721
1719
  --origam-data-table-rows--no-data---color: var(--origam-color__text---secondary);
1722
1720
  --origam-data-table-rows--loading---color: var(--origam-color__text---secondary);
1723
- --origam-data-table-rows--skeleton---cell-padding: 4px 8px;
1724
1721
  --origam-data-table-header-cell--sortable---cursor: pointer;
1725
1722
  --origam-data-table__sortable---icon-color: var(--origam-color__text---primary);
1726
1723
  --origam-data-table__sortable---icon-color-active: var(--origam-color__text---primary);
@@ -2217,10 +2214,6 @@
2217
2214
  --origam-switch__thumb---border-color: rgba(0, 0, 0, 0.18);
2218
2215
  --origam-switch__thumb---color: currentColor;
2219
2216
  --origam-switch__selection-control---min-height: 56px;
2220
- --origam-switch__skeleton---width: 52px;
2221
- --origam-switch__skeleton---height: 32px;
2222
- --origam-switch__skeleton-track---background-color: color-mix(in srgb, currentColor 14%, transparent);
2223
- --origam-switch__skeleton-thumb---background-color: color-mix(in srgb, currentColor 28%, transparent);
2224
2217
  --origam-switch__track--inset---height: 32px;
2225
2218
  --origam-switch__track--inset---width: 52px;
2226
2219
  --origam-switch---opacity-disabled: var(--origam-opacity---32);
@@ -331,8 +331,6 @@
331
331
  --origam-btn---overlay-opacity-hover: var(--origam-opacity---12);
332
332
  --origam-btn---overlay-opacity-active: 0.2;
333
333
  --origam-btn---overlay-opacity-active-hover: 0.28;
334
- --origam-btn--loader-skeleton---min-width: 96px;
335
- --origam-btn--loader-skeleton---min-height: 36px;
336
334
  --origam-btn__progress---linear-height: 3px;
337
335
  --origam-btn__progress---linear-position: 0px;
338
336
  --origam-btn__progress---linear-position-top: auto;
@@ -429,7 +427,7 @@
429
427
  --origam-card--loading---min-height: 120px;
430
428
  --origam-card__asset---aspect-ratio: 16 / 9;
431
429
  --origam-card__loader---min-height: 4px;
432
- --origam-card__loader---min-height-skeleton: 200px;
430
+ --origam-card__skeleton---padding: var(--origam-space---4);
433
431
  --origam-card__loader---z-index: 3;
434
432
  --origam-card__progress---linear-height: 4px;
435
433
  --origam-card__progress---circular-margin: 24px auto;
@@ -1818,7 +1816,6 @@
1818
1816
  --origam-data-table-rows--no-data---text-align: center;
1819
1817
  --origam-data-table-rows--no-data---color: var(--origam-color__text---secondary);
1820
1818
  --origam-data-table-rows--loading---color: var(--origam-color__text---secondary);
1821
- --origam-data-table-rows--skeleton---cell-padding: 4px 8px;
1822
1819
  --origam-data-table-header-cell--sortable---cursor: pointer;
1823
1820
  --origam-data-table__sortable---icon-color: var(--origam-color__text---primary);
1824
1821
  --origam-data-table__sortable---icon-color-active: var(--origam-color__text---primary);
@@ -2303,10 +2300,6 @@
2303
2300
  --origam-switch__thumb---border-color: rgba(0, 0, 0, 0.18);
2304
2301
  --origam-switch__thumb---color: currentColor;
2305
2302
  --origam-switch__selection-control---min-height: 56px;
2306
- --origam-switch__skeleton---width: 52px;
2307
- --origam-switch__skeleton---height: 32px;
2308
- --origam-switch__skeleton-track---background-color: color-mix(in srgb, currentColor 14%, transparent);
2309
- --origam-switch__skeleton-thumb---background-color: color-mix(in srgb, currentColor 28%, transparent);
2310
2303
  --origam-switch__track--inset---height: 32px;
2311
2304
  --origam-switch__track--inset---width: 52px;
2312
2305
  --origam-switch---opacity-disabled: var(--origam-opacity---32);
@@ -3351,8 +3344,6 @@
3351
3344
  --origam-btn---overlay-opacity-hover: var(--origam-opacity---12);
3352
3345
  --origam-btn---overlay-opacity-active: 0.2;
3353
3346
  --origam-btn---overlay-opacity-active-hover: 0.28;
3354
- --origam-btn--loader-skeleton---min-width: 96px;
3355
- --origam-btn--loader-skeleton---min-height: 36px;
3356
3347
  --origam-btn__progress---linear-height: 3px;
3357
3348
  --origam-btn__progress---linear-position: 0px;
3358
3349
  --origam-btn__progress---linear-position-top: auto;
@@ -3449,7 +3440,7 @@
3449
3440
  --origam-card--loading---min-height: 120px;
3450
3441
  --origam-card__asset---aspect-ratio: 16 / 9;
3451
3442
  --origam-card__loader---min-height: 4px;
3452
- --origam-card__loader---min-height-skeleton: 200px;
3443
+ --origam-card__skeleton---padding: var(--origam-space---4);
3453
3444
  --origam-card__loader---z-index: 3;
3454
3445
  --origam-card__progress---linear-height: 4px;
3455
3446
  --origam-card__progress---circular-margin: 24px auto;
@@ -4838,7 +4829,6 @@
4838
4829
  --origam-data-table-rows--no-data---text-align: center;
4839
4830
  --origam-data-table-rows--no-data---color: var(--origam-color__text---secondary);
4840
4831
  --origam-data-table-rows--loading---color: var(--origam-color__text---secondary);
4841
- --origam-data-table-rows--skeleton---cell-padding: 4px 8px;
4842
4832
  --origam-data-table-header-cell--sortable---cursor: pointer;
4843
4833
  --origam-data-table__sortable---icon-color: var(--origam-color__text---primary);
4844
4834
  --origam-data-table__sortable---icon-color-active: var(--origam-color__text---primary);
@@ -5322,10 +5312,6 @@
5322
5312
  --origam-switch__thumb---border-color: rgba(0, 0, 0, 0.18);
5323
5313
  --origam-switch__thumb---color: currentColor;
5324
5314
  --origam-switch__selection-control---min-height: 56px;
5325
- --origam-switch__skeleton---width: 52px;
5326
- --origam-switch__skeleton---height: 32px;
5327
- --origam-switch__skeleton-track---background-color: color-mix(in srgb, currentColor 14%, transparent);
5328
- --origam-switch__skeleton-thumb---background-color: color-mix(in srgb, currentColor 28%, transparent);
5329
5315
  --origam-switch__track--inset---height: 32px;
5330
5316
  --origam-switch__track--inset---width: 52px;
5331
5317
  --origam-switch---opacity-disabled: var(--origam-opacity---32);
@@ -231,8 +231,6 @@
231
231
  --origam-btn---overlay-opacity-hover: var(--origam-opacity---12);
232
232
  --origam-btn---overlay-opacity-active: 0.2;
233
233
  --origam-btn---overlay-opacity-active-hover: 0.28;
234
- --origam-btn--loader-skeleton---min-width: 96px;
235
- --origam-btn--loader-skeleton---min-height: 36px;
236
234
  --origam-btn__progress---linear-height: 3px;
237
235
  --origam-btn__progress---linear-position: 0px;
238
236
  --origam-btn__progress---linear-position-top: auto;
@@ -329,7 +327,7 @@
329
327
  --origam-card--loading---min-height: 120px;
330
328
  --origam-card__asset---aspect-ratio: 16 / 9;
331
329
  --origam-card__loader---min-height: 4px;
332
- --origam-card__loader---min-height-skeleton: 200px;
330
+ --origam-card__skeleton---padding: var(--origam-space---4);
333
331
  --origam-card__loader---z-index: 3;
334
332
  --origam-card__progress---linear-height: 4px;
335
333
  --origam-card__progress---circular-margin: 24px auto;
@@ -1720,7 +1718,6 @@
1720
1718
  --origam-data-table-rows--no-data---text-align: center;
1721
1719
  --origam-data-table-rows--no-data---color: var(--origam-color__text---secondary);
1722
1720
  --origam-data-table-rows--loading---color: var(--origam-color__text---secondary);
1723
- --origam-data-table-rows--skeleton---cell-padding: 4px 8px;
1724
1721
  --origam-data-table-header-cell--sortable---cursor: pointer;
1725
1722
  --origam-data-table__sortable---icon-color: var(--origam-color__text---primary);
1726
1723
  --origam-data-table__sortable---icon-color-active: var(--origam-color__text---primary);
@@ -2217,10 +2214,6 @@
2217
2214
  --origam-switch__thumb---border-color: rgba(0, 0, 0, 0.18);
2218
2215
  --origam-switch__thumb---color: currentColor;
2219
2216
  --origam-switch__selection-control---min-height: 56px;
2220
- --origam-switch__skeleton---width: 52px;
2221
- --origam-switch__skeleton---height: 32px;
2222
- --origam-switch__skeleton-track---background-color: color-mix(in srgb, currentColor 14%, transparent);
2223
- --origam-switch__skeleton-thumb---background-color: color-mix(in srgb, currentColor 28%, transparent);
2224
2217
  --origam-switch__track--inset---height: 32px;
2225
2218
  --origam-switch__track--inset---width: 52px;
2226
2219
  --origam-switch---opacity-disabled: var(--origam-opacity---32);
@@ -12,6 +12,7 @@
12
12
  :href="hrefAttr"
13
13
  :type="typeAttr"
14
14
  :value="valueAttr"
15
+ @click.capture="handleClickCapture"
15
16
  @click="handleClick"
16
17
  @mouseenter="handleMouseenter"
17
18
  @mouseleave="handleMouseleave"
@@ -25,99 +26,84 @@
25
26
  class="origam-btn__underlay"
26
27
  />
27
28
 
28
- <origam-progress
29
+ <slot
29
30
  v-if="isOverlayLoading"
30
- ref="origamProgressRef"
31
- class="origam-btn__progress"
31
+ name="loader"
32
32
  v-bind="progressProps"
33
- :thickness="loaderConfig.kind === 'line' ? 3 : undefined"
34
- :color="color"
35
- :active="true"
36
- />
33
+ >
34
+ <origam-progress
35
+ ref="origamProgressRef"
36
+ class="origam-btn__progress"
37
+ v-bind="progressProps"
38
+ tag="span"
39
+ aria-hidden="true"
40
+ :thickness="loaderKind === 'line' ? 3 : undefined"
41
+ :color="color"
42
+ :active="true"
43
+ />
44
+ </slot>
37
45
 
38
46
  <slot name="wrapper">
39
- <origam-loader
40
- :loading="isSkeletonLoading"
41
- class="origam-btn__loader"
42
- >
43
- <template
44
- v-if="hasLoader && isSkeletonLoading"
45
- #loader
47
+ <span class="origam-btn__loader">
48
+ <span
49
+ v-if="hasPrepend"
50
+ key="prepend"
51
+ class="origam-btn__prepend"
52
+ >
53
+ <slot name="prepend">
54
+ <origam-avatar
55
+ v-if="prependAvatar"
56
+ key="prepend-avatar"
57
+ :density="density"
58
+ :image="prependAvatar"
59
+ />
60
+ <origam-icon
61
+ v-if="prependIcon"
62
+ key="prepend-icon"
63
+ :density="density"
64
+ :icon="prependIcon"
65
+ />
66
+ </slot>
67
+ </span>
68
+
69
+ <span
70
+ class="origam-btn__content"
71
+ data-no-activator=""
72
+ >
73
+ <slot name="default">
74
+ <template v-if="hasIcon">
75
+ <origam-icon
76
+ key="content-icon"
77
+ :icon="icon"
78
+ />
79
+ </template>
80
+ <template v-else>
81
+ {{ text }}
82
+ </template>
83
+ </slot>
84
+ </span>
85
+
86
+ <span
87
+ v-if="hasAppend"
88
+ key="append"
89
+ class="origam-btn__append"
46
90
  >
47
- <slot
48
- name="loader"
49
- v-bind="progressProps"
50
- >
51
- <origam-skeleton
52
- variant="rectangular"
53
- :width="'100%'"
54
- :height="'100%'"
55
- v-bind="loaderConfig.overrides"
91
+ <slot name="append">
92
+ <origam-avatar
93
+ v-if="appendAvatar"
94
+ key="append-avatar"
95
+ :density="density"
96
+ :image="appendAvatar"
97
+ />
98
+ <origam-icon
99
+ v-if="appendIcon"
100
+ key="append-icon"
101
+ :density="density"
102
+ :icon="appendIcon"
56
103
  />
57
104
  </slot>
58
- </template>
59
-
60
- <template #default>
61
- <span
62
- v-if="hasPrepend"
63
- key="prepend"
64
- class="origam-btn__prepend"
65
- >
66
- <slot name="prepend">
67
- <origam-avatar
68
- v-if="prependAvatar"
69
- key="prepend-avatar"
70
- :density="density"
71
- :image="prependAvatar"
72
- />
73
- <origam-icon
74
- v-if="prependIcon"
75
- key="prepend-icon"
76
- :density="density"
77
- :icon="prependIcon"
78
- />
79
- </slot>
80
- </span>
81
-
82
- <span
83
- class="origam-btn__content"
84
- data-no-activator=""
85
- >
86
- <slot name="default">
87
- <template v-if="hasIcon">
88
- <origam-icon
89
- key="content-icon"
90
- :icon="icon"
91
- />
92
- </template>
93
- <template v-else>
94
- {{ text }}
95
- </template>
96
- </slot>
97
- </span>
98
-
99
- <span
100
- v-if="hasAppend"
101
- key="append"
102
- class="origam-btn__append"
103
- >
104
- <slot name="append">
105
- <origam-avatar
106
- v-if="appendAvatar"
107
- key="append-avatar"
108
- :density="density"
109
- :image="appendAvatar"
110
- />
111
- <origam-icon
112
- v-if="appendIcon"
113
- key="append-icon"
114
- :density="density"
115
- :icon="appendIcon"
116
- />
117
- </slot>
118
- </span>
119
- </template>
120
- </origam-loader>
105
+ </span>
106
+ </span>
121
107
  </slot>
122
108
  </component>
123
109
  </template>
@@ -126,9 +112,7 @@
126
112
  import { computed, ref, StyleValue, toRef, useAttrs, useSlots, watchEffect } from "vue";
127
113
  import OrigamAvatar from "../Avatar/OrigamAvatar.vue";
128
114
  import OrigamIcon from "../Icon/OrigamIcon.vue";
129
- import OrigamLoader from "../Loader/OrigamLoader.vue";
130
115
  import OrigamProgress from "../Progress/OrigamProgress.vue";
131
- import OrigamSkeleton from "../Skeleton/OrigamSkeleton.vue";
132
116
  import { useAdjacent } from "../../composables/Commons/adjacent.composable";
133
117
  import { useDensity } from "../../composables/Commons/density.composable";
134
118
  import { useDimension } from "../../composables/Commons/dimension.composable";
@@ -290,7 +274,7 @@ const isActive = computed(() => {
290
274
  });
291
275
  const isDisabled = computed(() => group?.disabled.value || props.disabled);
292
276
  const isAnchor = computed(() => link.tag.value === "a");
293
- const ariaDisabled = computed(() => isAnchor.value && isDisabled.value ? "true" : void 0);
277
+ const ariaDisabled = computed(() => isAnchor.value && isDisabled.value || isLoading.value ? "true" : void 0);
294
278
  const hrefAttr = computed(() => isAnchor.value && isDisabled.value ? void 0 : link.href.value);
295
279
  const typeAttr = computed(() => isAnchor.value ? void 0 : "button");
296
280
  const valueAttr = computed(() => {
@@ -306,7 +290,7 @@ const isRipple = computed(() => {
306
290
  });
307
291
  const { densityClasses } = useDensity(props);
308
292
  const { dimensionStyles } = useDimension(props);
309
- const { loaderClasses, loaderConfig } = useLoader(props, LOADER_KIND.CIRCULAR);
293
+ const { loaderClasses, isLoading, loaderConfig } = useLoader(props, LOADER_KIND.CIRCULAR);
310
294
  const { locationStyles } = useLocation(props);
311
295
  const { positionClasses } = usePosition(props);
312
296
  const { sizeClasses, sizeStyles } = useSize(props);
@@ -331,6 +315,11 @@ const {
331
315
  hasAppend,
332
316
  hasPrepend
333
317
  } = useAdjacent(props, prependIcon, appendIcon);
318
+ const handleClickCapture = (e) => {
319
+ if (!isLoading.value) return;
320
+ e.preventDefault();
321
+ e.stopImmediatePropagation();
322
+ };
334
323
  const handleClick = (e) => {
335
324
  if (isDisabled.value || link.isLink.value && (e.metaKey || e.ctrlKey || e.shiftKey || e.button !== 0 || attrs.target === "_blank")) return;
336
325
  link.navigate?.(e);
@@ -339,9 +328,6 @@ const handleClick = (e) => {
339
328
  const hasIcon = computed(() => {
340
329
  return !!(icon.value && props.icon !== true);
341
330
  });
342
- const hasLoader = computed(() => {
343
- return slots.loader || loaderConfig.value.isActive;
344
- });
345
331
  const isUnnamedIconOnly = computed(() => {
346
332
  if (!hasIcon.value) return false;
347
333
  if (slots.default || props.text) return false;
@@ -357,13 +343,9 @@ if (import.meta.env?.DEV) {
357
343
  }
358
344
  });
359
345
  }
360
- const isSkeletonLoading = computed(() => {
361
- return loaderConfig.value.isActive && loaderConfig.value.kind === "skeleton";
362
- });
363
- const isOverlayLoading = computed(() => {
364
- return loaderConfig.value.isActive && (loaderConfig.value.kind === "line" || loaderConfig.value.kind === "circular");
365
- });
366
- const ariaBusy = computed(() => loaderConfig.value.isActive ? "true" : void 0);
346
+ const isOverlayLoading = computed(() => loaderConfig.value.isActive);
347
+ const loaderKind = computed(() => loaderConfig.value.kind === "line" ? "line" : "circular");
348
+ const ariaBusy = computed(() => isLoading.value ? "true" : void 0);
367
349
  const progressProps = computed(() => {
368
350
  const cfg = loaderConfig.value;
369
351
  return Object.assign(
@@ -371,7 +353,7 @@ const progressProps = computed(() => {
371
353
  size: "23",
372
354
  indeterminate: cfg.indeterminate,
373
355
  modelValue: cfg.modelValue,
374
- type: cfg.kind === "line" ? PROGRESS_TYPE.LINEAR : PROGRESS_TYPE.CIRCULAR
356
+ type: loaderKind.value === "line" ? PROGRESS_TYPE.LINEAR : PROGRESS_TYPE.CIRCULAR
375
357
  },
376
358
  origamProgressRef.value?.filterProps(props, ["class", "style", "id", "tag", "size", "type"]) ?? {},
377
359
  cfg.overrides
@@ -405,14 +387,14 @@ const btnClasses = computed(() => {
405
387
  // so consumers can pick either spelling.
406
388
  "origam-btn--flat": props.flat,
407
389
  "origam-btn--icon": !!props.icon,
408
- "origam-btn--loading": loaderConfig.value.isActive,
390
+ // `origam-btn--loading` comes from `loaderClasses` below: one
391
+ // source, emitted once.
409
392
  // Loader-kind discriminator so SCSS can branch per kind:
410
- // • `--loader-line` → linear progress strip overlay,
393
+ // - `--loader-line` -> linear progress strip overlay,
411
394
  // keeps the label visible (like OrigamCard's loader).
412
- // • `--loader-circular` → centred spinner; label hidden.
413
- // • `--loader-skeleton` → full-box shimmer; label hidden,
414
- // btn keeps a min-width so it doesn't collapse.
415
- [`origam-btn--loader-${loaderConfig.value.kind}`]: loaderConfig.value.isActive,
395
+ // - `--loader-circular` -> centred spinner over the label,
396
+ // which stays in the DOM (width and name preserved).
397
+ [`origam-btn--loader-${loaderKind.value}`]: isLoading.value,
416
398
  "origam-btn--slim": props.slim,
417
399
  "origam-btn--stacked": props.stacked
418
400
  },
@@ -995,23 +977,6 @@ defineExpose({
995
977
  }
996
978
  }
997
979
 
998
- // Skeleton — rectangular placeholder REPLACES the btn content
999
- // entirely (OrigamLoader's #loader branch). The btn collapses to
1000
- // the skeleton's natural size unless we give it a sensible
1001
- // min-width / min-height.
1002
- &--loader-skeleton {
1003
- min-width: var(--origam-btn--loader-skeleton---min-width, 96px);
1004
- min-height: var(--origam-btn--loader-skeleton---min-height, 36px);
1005
-
1006
- :deep(.origam-skeleton--rectangular) {
1007
- position: absolute;
1008
- inset: 0;
1009
- width: 100%;
1010
- height: 100%;
1011
- border-radius: inherit;
1012
- }
1013
- }
1014
-
1015
980
  &--stacked {
1016
981
  #{$this}__loader {
1017
982
  grid-template-areas: "prepend" "content" "append";
@@ -28,16 +28,55 @@
28
28
  <slot name="wrapper">
29
29
  <template v-if="hasLoading">
30
30
  <slot name="loader">
31
- <div class="origam-card__loader">
31
+ <origam-skeleton-group
32
+ v-if="isSkeleton"
33
+ class="origam-card__skeleton"
34
+ v-bind="skeletonOverrides.group"
35
+ >
32
36
  <origam-skeleton
33
- v-if="loaderConfig.kind === 'skeleton'"
34
- variant="card"
35
- :loading="true"
36
- :label="loadingText"
37
- v-bind="loaderConfig.overrides"
37
+ v-if="hasAsset"
38
+ variant="rectangular"
39
+ class="origam-card__skeleton-media"
40
+ v-bind="skeletonOverrides.block"
41
+ />
42
+ <origam-skeleton
43
+ variant="text"
44
+ class="origam-card__skeleton-title"
45
+ v-bind="skeletonOverrides.block"
46
+ />
47
+ <origam-skeleton
48
+ variant="text"
49
+ class="origam-card__skeleton-subtitle"
50
+ v-bind="skeletonOverrides.block"
38
51
  />
52
+ <origam-skeleton
53
+ variant="text"
54
+ class="origam-card__skeleton-line"
55
+ v-bind="skeletonOverrides.block"
56
+ />
57
+ <origam-skeleton
58
+ variant="text"
59
+ class="origam-card__skeleton-line origam-card__skeleton-line--last"
60
+ v-bind="skeletonOverrides.block"
61
+ />
62
+ <template v-if="hasFooter">
63
+ <origam-skeleton
64
+ variant="pill"
65
+ class="origam-card__skeleton-action"
66
+ v-bind="skeletonOverrides.block"
67
+ />
68
+ <origam-skeleton
69
+ variant="pill"
70
+ class="origam-card__skeleton-action"
71
+ v-bind="skeletonOverrides.block"
72
+ />
73
+ </template>
74
+ </origam-skeleton-group>
75
+ <div
76
+ v-else
77
+ class="origam-card__loader"
78
+ >
39
79
  <origam-progress
40
- v-else
41
80
  :active="true"
42
81
  :color="color"
43
82
  :indeterminate="loaderConfig.indeterminate"
@@ -154,6 +193,7 @@ import OrigamCardText from "./OrigamCardText.vue";
154
193
  import OrigamImg from "../Img/OrigamImg.vue";
155
194
  import OrigamProgress from "../Progress/OrigamProgress.vue";
156
195
  import OrigamSkeleton from "../Skeleton/OrigamSkeleton.vue";
196
+ import OrigamSkeletonGroup from "../Skeleton/OrigamSkeletonGroup.vue";
157
197
  import { useAdjacent } from "../../composables/Commons/adjacent.composable";
158
198
  import { useDensity } from "../../composables/Commons/density.composable";
159
199
  import { useDimension } from "../../composables/Commons/dimension.composable";
@@ -171,6 +211,7 @@ import { DENSITY } from "../../enums/Commons/density.enum";
171
211
  import { KEYBOARD_VALUES } from "../../enums/Commons/hotkey.enum";
172
212
  import { LOADER_KIND } from "../../enums/Commons/loader.enum";
173
213
  import { PROGRESS_TYPE } from "../../enums/Progress/progress.enum";
214
+ import { splitSkeletonOverrides } from "../../utils/Skeleton/skeleton.util";
174
215
  import { computed, ref, StyleValue, toRef, useAttrs, useSlots } from "vue";
175
216
  const props = defineProps({
176
217
  disabled: { type: Boolean, required: false },
@@ -338,6 +379,8 @@ const handleKeydown = (event) => {
338
379
  };
339
380
  const { loaderClasses, loaderConfig } = useLoader(props, LOADER_KIND.LINE);
340
381
  const slots = useSlots();
382
+ const isSkeleton = computed(() => loaderConfig.value.isActive && loaderConfig.value.kind === LOADER_KIND.SKELETON);
383
+ const skeletonOverrides = computed(() => splitSkeletonOverrides(loaderConfig.value.overrides, props.loadingText));
341
384
  const hasLoading = computed(() => {
342
385
  return slots.loader || loaderConfig.value.isActive;
343
386
  });
@@ -567,15 +610,39 @@ defineExpose({
567
610
  :deep(.origam-progress--circular) {
568
611
  margin: var(--origam-card__progress---circular-margin, 24px auto);
569
612
  }
613
+ }
570
614
 
571
- :deep(.origam-skeleton-wrapper--card),
572
- :deep(.origam-skeleton--rectangular),
573
- :deep(.origam-skeleton--text) {
574
- width: 100%;
615
+ // The silhouette is a grid of light primitives (no wrapper): two
616
+ // columns so the two actions sit side by side, every other part spans
617
+ // both. `>` keeps the selectors above the primitives' own scoped
618
+ // rules, whatever the order the sheets load in.
619
+ &__skeleton {
620
+ grid-template-columns: auto 1fr;
621
+ padding: var(--origam-card__skeleton---padding);
622
+
623
+ > * {
624
+ grid-column: 1 / -1;
625
+ }
626
+
627
+ > .origam-card__skeleton-media {
628
+ height: auto;
629
+ aspect-ratio: var(--origam-card__asset---aspect-ratio, 16 / 9);
630
+ }
631
+
632
+ > .origam-card__skeleton-title {
633
+ width: 62%;
634
+ }
635
+
636
+ > .origam-card__skeleton-subtitle {
637
+ width: 38%;
638
+ }
639
+
640
+ > .origam-card__skeleton-line--last {
641
+ width: 84%;
575
642
  }
576
643
 
577
- :deep(.origam-skeleton-wrapper--card) {
578
- min-height: var(--origam-card__loader---min-height-skeleton, 200px);
644
+ > .origam-card__skeleton-action {
645
+ grid-column: auto;
579
646
  }
580
647
  }
581
648