orio-ui 1.4.1 → 1.6.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.
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": "^3.0.0 || ^4.0.0"
6
6
  },
7
- "version": "1.4.1",
7
+ "version": "1.6.0",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "0.8.4",
10
10
  "unbuild": "2.0.0"
@@ -1 +1 @@
1
- :root{--color-bg:#fff;--color-surface:#f7f8fa;--color-text:#0e1116;--color-muted:#626a78;--color-border:#bfbfc2;--color-accent:#1f3a8a;--color-accent-ink:#fff;--color-accent-soft-base:color-mix(in srgb,var(--color-accent) 15%,#e3e3e3);--color-accent-soft:var(--color-accent-soft-base);--color-accent-soft-darker:color-mix(in srgb,var(--color-accent-soft),#000 70%);--color-accent-border:color-mix(in srgb,var(--color-accent) 40%,#c7d2fe);--color-accent-hover:color-mix(in srgb,var(--color-accent) 85%,#000 15%);--color-accent-active:color-mix(in srgb,var(--color-accent),#000 60%)}:root[data-mode=light]{--color-bg:#fff;--color-surface:#f7f8fa;--color-text:#0e1116;--color-muted:#626a78;--color-border:#bfbfc2}:root[data-mode=dark]{--color-bg:#0e1116;--color-surface:#1a1d23;--color-text:#fff;--color-muted:#a2a9b6;--color-border:#2e333d;--color-accent-ink:#fff;--color-accent-soft-base:color-mix(in srgb,var(--color-accent) 12%,#0e1116);--color-accent-soft:var(--color-accent-soft-base);--color-accent-border:color-mix(in srgb,var(--color-accent) 40%,#0e1116);--color-accent-hover:color-mix(in srgb,var(--color-accent) 30%,#fff 70%);--color-accent-active:color-mix(in srgb,var(--color-accent) 80%,#fff 25%)}:root[data-theme=normal]{--color-accent:#ced1d5;--color-accent-ink:#2a2a2b;--color-accent-hover:color-mix(in srgb,var(--color-accent-ink) 90%,#fff 10%)}:root[data-theme=navy]{--color-accent:#5c80c1;--color-accent-soft-darker:var(--color-accent-soft)}:root[data-theme=teal]{--color-accent:#27b9ab}:root[data-theme=forest]{--color-accent:#5db18b}:root[data-theme=wine]{--color-accent:#862737;--color-accent-soft:color-mix(in srgb,var(--color-accent) 5%,#fff);--color-accent-soft-darker:var(--color-accent-soft)}:root[data-theme=royal]{--color-accent:#293da3;--color-accent-soft:color-mix(in srgb,var(--color-accent) 5%,#fff);--color-accent-soft-darker:var(--color-accent-soft)}
1
+ :root{--color-bg:#fff;--color-surface:#f7f8fa;--color-text:#0e1116;--color-muted:#626a78;--color-border:#bfbfc2;--color-accent:#1f3a8a;--color-accent-ink:#fff;--color-accent-soft-base:color-mix(in srgb,var(--color-accent) 15%,#e3e3e3);--color-accent-soft:var(--color-accent-soft-base);--color-accent-soft-darker:color-mix(in srgb,var(--color-accent-soft),#000 70%);--color-accent-border:color-mix(in srgb,var(--color-accent) 40%,#c7d2fe);--color-accent-hover:color-mix(in srgb,var(--color-accent) 85%,#000 15%);--color-accent-active:color-mix(in srgb,var(--color-accent),#000 60%)}:root[data-mode=light]{--color-bg:#fff;--color-surface:#f7f8fa;--color-text:#0e1116;--color-muted:#626a78;--color-border:#bfbfc2}:root[data-mode=dark]{--color-bg:#0e1116;--color-surface:#1a1d23;--color-text:#fff;--color-muted:#a2a9b6;--color-border:#2e333d;--color-accent-ink:#fff;--color-accent-soft-base:color-mix(in srgb,var(--color-accent) 12%,#0e1116);--color-accent-soft:var(--color-accent-soft-base);--color-accent-border:color-mix(in srgb,var(--color-accent) 40%,#0e1116);--color-accent-hover:color-mix(in srgb,var(--color-accent) 30%,#fff 70%);--color-accent-active:color-mix(in srgb,var(--color-accent) 80%,#fff 25%)}:root[data-theme=normal]{--color-accent:#ced1d5;--color-accent-ink:#2a2a2b;--color-accent-hover:color-mix(in srgb,var(--color-accent-ink) 90%,#fff 10%)}:root[data-theme=inverse][data-mode=light]{--color-accent:#000;--color-accent-soft-darker:#fff}:root[data-theme=inverse][data-mode=dark]{--color-accent:#fff;--color-accent-ink:#000;--color-accent-hover:color-mix(in srgb,var(--color-accent),#000 80%)}:root[data-theme=navy]{--color-accent:#5c80c1;--color-accent-soft-darker:var(--color-accent-soft)}:root[data-theme=teal]{--color-accent:#27b9ab}:root[data-theme=forest]{--color-accent:#5db18b}:root[data-theme=wine]{--color-accent:#862737;--color-accent-soft:color-mix(in srgb,var(--color-accent) 5%,#fff);--color-accent-soft-darker:var(--color-accent-soft)}:root[data-theme=royal]{--color-accent:#293da3;--color-accent-soft:color-mix(in srgb,var(--color-accent) 5%,#fff);--color-accent-soft-darker:var(--color-accent-soft)}
@@ -3,11 +3,11 @@ export interface ControlProps {
3
3
  /**
4
4
  * Minimal will reset margin and remove border and box shadow from every element inside the slot
5
5
  */
6
- appearance?: 'normal' | 'minimal';
6
+ appearance?: "normal" | "minimal";
7
7
  }
8
8
 
9
9
  withDefaults(defineProps<ControlProps>(), {
10
- appearance: 'normal',
10
+ appearance: "normal",
11
11
  });
12
12
  </script>
13
13
 
@@ -1,24 +1,24 @@
1
1
  <script setup lang="ts">
2
- import { computed } from 'vue';
2
+ import { computed } from "vue";
3
3
 
4
4
  interface Props {
5
5
  icon?: string;
6
6
  text?: string;
7
- size?: 'small' | 'medium' | 'large';
7
+ size?: "small" | "medium" | "large";
8
8
  }
9
9
  const props = withDefaults(defineProps<Props>(), {
10
- size: 'medium',
10
+ size: "medium",
11
11
  });
12
- defineEmits(['click']);
12
+ defineEmits(["click"]);
13
13
 
14
14
  const iconSize = computed(() => {
15
15
  switch (props.size) {
16
- case 'small':
17
- return '2rem';
18
- case 'large':
19
- return '5rem';
16
+ case "small":
17
+ return "2rem";
18
+ case "large":
19
+ return "5rem";
20
20
  default:
21
- return '3rem';
21
+ return "3rem";
22
22
  }
23
23
  });
24
24
  </script>
@@ -1,13 +1,13 @@
1
1
  <script setup lang="ts">
2
- import { computed } from 'vue';
3
- import { nanoid } from 'nanoid';
2
+ import { computed } from "vue";
3
+ import { nanoid } from "nanoid";
4
4
 
5
5
  interface Props {
6
6
  month?: boolean;
7
7
  }
8
8
  defineProps<Props>();
9
9
 
10
- const date = defineModel<string | null | undefined>('date', {
10
+ const date = defineModel<string | null | undefined>("date", {
11
11
  required: true,
12
12
  });
13
13
 
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
- import { ref, watch, computed } from 'vue';
3
- import type { ResumeDate } from './view/Dates.vue';
2
+ import { ref, watch, computed } from "vue";
3
+ import type { ResumeDate } from "./view/Dates.vue";
4
4
 
5
5
  export interface DateRangePickerProps {
6
6
  month?: boolean;
@@ -8,15 +8,15 @@ export interface DateRangePickerProps {
8
8
 
9
9
  defineProps<DateRangePickerProps>();
10
10
 
11
- const dates = defineModel<ResumeDate>('dates', { required: true });
11
+ const dates = defineModel<ResumeDate>("dates", { required: true });
12
12
 
13
- const present = ref(dates.value.endDate !== '' && !dates.value.endDate);
13
+ const present = ref(dates.value.endDate !== "" && !dates.value.endDate);
14
14
 
15
15
  watch(present, (value) => {
16
16
  if (value) {
17
17
  dates.value.endDate = null; // Set end date to null when present is checked
18
18
  } else {
19
- dates.value.endDate = ''; // Reset end date when present is unchecked
19
+ dates.value.endDate = ""; // Reset end date when present is unchecked
20
20
  }
21
21
  });
22
22
 
@@ -3,11 +3,11 @@ interface Props {
3
3
  icon?: string;
4
4
  title: string;
5
5
  description?: string;
6
- size?: 'small' | 'medium' | 'large';
6
+ size?: "small" | "medium" | "large";
7
7
  }
8
8
 
9
9
  const props = withDefaults(defineProps<Props>(), {
10
- size: 'medium',
10
+ size: "medium",
11
11
  });
12
12
  </script>
13
13
 
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
- import { computed } from 'vue';
3
- import { iconRegistry, type IconName } from '../utils/icon-registry';
2
+ import { computed } from "vue";
3
+ import { iconRegistry, type IconName } from "../utils/icon-registry";
4
4
 
5
5
  export interface IconProps {
6
6
  name: IconName | string;
@@ -9,13 +9,13 @@ export interface IconProps {
9
9
  }
10
10
 
11
11
  const props = withDefaults(defineProps<IconProps>(), {
12
- size: '1em',
13
- color: 'currentColor',
12
+ size: "1em",
13
+ color: "currentColor",
14
14
  });
15
15
 
16
- const iconSvg = computed(() => iconRegistry[props.name] || '');
16
+ const iconSvg = computed(() => iconRegistry[props.name] || "");
17
17
  const sizeValue = computed(() =>
18
- typeof props.size === 'number' ? `${props.size}px` : props.size,
18
+ typeof props.size === "number" ? `${props.size}px` : props.size,
19
19
  );
20
20
  </script>
21
21
 
@@ -1,9 +1,9 @@
1
1
  <script setup lang="ts">
2
2
  defineEmits<{
3
- (e: 'input', value: string): void;
3
+ (e: "input", value: string): void;
4
4
  }>();
5
5
 
6
- const text = defineModel<string>({ default: '' });
6
+ const text = defineModel<string>({ default: "" });
7
7
  </script>
8
8
 
9
9
  <template>
@@ -1,12 +1,12 @@
1
1
  <script setup lang="ts">
2
- export type TagStyle = 'neutral' | 'accent';
2
+ export type TagStyle = "neutral" | "accent";
3
3
 
4
4
  interface Props {
5
5
  text: string;
6
6
  variant?: TagStyle;
7
7
  }
8
8
  withDefaults(defineProps<Props>(), {
9
- variant: 'neutral',
9
+ variant: "neutral",
10
10
  });
11
11
  </script>
12
12
 
@@ -1,12 +1,12 @@
1
1
  <script setup lang="ts">
2
- import { useAttrs } from 'vue';
2
+ import { useAttrs } from "vue";
3
3
 
4
4
  const attrs = useAttrs();
5
5
  defineEmits<{
6
- (e: 'input', value: string): void;
6
+ (e: "input", value: string): void;
7
7
  }>();
8
8
 
9
- const modelValue = defineModel<string>({ default: '' });
9
+ const modelValue = defineModel<string>({ default: "" });
10
10
  </script>
11
11
 
12
12
  <template>
@@ -0,0 +1,140 @@
1
+ <script setup lang="ts">
2
+ import { computed, onMounted, toRefs, useTemplateRef } from "vue";
3
+ import { useElementSize } from "@vueuse/core";
4
+
5
+ interface CarouselProps {
6
+ images?: string[];
7
+ size?: string;
8
+ fit?: "fill" | "cover" | "contain" | "scale-down";
9
+ }
10
+
11
+ const props = withDefaults(defineProps<CarouselProps>(), {
12
+ images: () => [],
13
+ size: "400:550",
14
+ fit: "contain",
15
+ });
16
+
17
+ const { images, size, fit } = toRefs(props);
18
+
19
+ const rawSizes = computed(() =>
20
+ size.value.split(":").map((value) => parseFloat(value)),
21
+ );
22
+
23
+ const carousel = useTemplateRef("carousel");
24
+ const { width: carouselWidth } = useElementSize(carousel);
25
+
26
+ const calculatedSize = computed(() => {
27
+ return {
28
+ width: `${rawSizes.value[0]}px`,
29
+ height: `${rawSizes.value[1]}px`,
30
+ };
31
+ });
32
+
33
+ const maxHeight = computed(() => {
34
+ const dimensions = rawSizes.value[0] / rawSizes.value[1];
35
+ if (!carouselWidth.value) return "100%";
36
+ return `${carouselWidth.value / dimensions}px`;
37
+ });
38
+
39
+ const activeImage = defineModel<string>("activeImage");
40
+
41
+ const activeImageIndex = computed(() =>
42
+ images.value.findIndex((image) => image === activeImage.value),
43
+ );
44
+
45
+ // Swipe handling with closure
46
+ let pointerStartX = 0;
47
+
48
+ function onPointerDown(event: PointerEvent) {
49
+ pointerStartX = event.clientX;
50
+ }
51
+
52
+ function onPointerUp(event: PointerEvent) {
53
+ const diffX = pointerStartX - event.clientX;
54
+ const threshold = 10;
55
+
56
+ if (Math.abs(diffX) > threshold) {
57
+ if (diffX > 0) {
58
+ nextImage();
59
+ } else {
60
+ previousImage();
61
+ }
62
+ }
63
+ }
64
+
65
+ function nextImage() {
66
+ if (activeImageIndex.value === images.value.length - 1) {
67
+ activeImage.value = images.value[0];
68
+ return;
69
+ }
70
+ activeImage.value = images.value[activeImageIndex.value + 1];
71
+ }
72
+
73
+ function previousImage() {
74
+ if (activeImageIndex.value === 0) {
75
+ activeImage.value = images.value[images.value.length - 1];
76
+ return;
77
+ }
78
+ activeImage.value = images.value[activeImageIndex.value - 1];
79
+ }
80
+
81
+ function getItemClasses(image: string) {
82
+ if (image === activeImage.value) return ["active-image"];
83
+ if (
84
+ images.value.findIndex((img) => image === img) ===
85
+ activeImageIndex.value + 1
86
+ )
87
+ return ["next-image"];
88
+ if (
89
+ images.value.findIndex((img) => image === img) ===
90
+ activeImageIndex.value - 1
91
+ )
92
+ return ["previous-image"];
93
+ }
94
+
95
+ onMounted(() => {
96
+ if (!activeImage.value) activeImage.value = images.value[0];
97
+ });
98
+ </script>
99
+
100
+ <template>
101
+ <div ref="carousel" class="carousel">
102
+ <div
103
+ class="carousel__track"
104
+ @pointerdown="onPointerDown"
105
+ @pointerup="onPointerUp"
106
+ >
107
+ <div
108
+ v-for="image of images"
109
+ :key="image"
110
+ class="carousel__item"
111
+ :class="getItemClasses(image)"
112
+ >
113
+ <img :src="image" :alt="image" draggable="false" />
114
+ </div>
115
+ <orio-button
116
+ variant="subdued"
117
+ icon="chevron-left"
118
+ class="switch-button previous-button"
119
+ @click="previousImage"
120
+ >
121
+ <template #icon>
122
+ <orio-icon name="chevron-left" size="40px" />
123
+ </template>
124
+ </orio-button>
125
+ <orio-button
126
+ variant="subdued"
127
+ class="switch-button next-button"
128
+ @click="nextImage"
129
+ >
130
+ <template #icon>
131
+ <orio-icon name="chevron-right" size="40px" />
132
+ </template>
133
+ </orio-button>
134
+ </div>
135
+ </div>
136
+ </template>
137
+
138
+ <style scoped>
139
+ .carousel{border:1px solid var(--color-border);border-radius:var(--border-radius-lg);height:v-bind("calculatedSize.height");margin:0 auto;max-height:v-bind(maxHeight);max-width:100%;overflow:hidden;width:v-bind("calculatedSize.width")}.carousel__track{align-items:center;cursor:grab;display:flex;gap:.75rem;height:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.carousel__track:active{cursor:grabbing}.carousel__item{background:var(--color-surface);border-radius:var(--border-radius-sm);color:var(--color-text);height:100%;inset:0;opacity:0;padding:.5rem .75rem;pointer-events:none;position:absolute;transition:opacity .5s ease-in-out,transform .5s ease-in-out;white-space:nowrap;width:100%}.carousel__item.previous-image{transform:translateX(-100%)}.carousel__item.next-image{transform:translateX(100%)}.carousel__item.active-image{opacity:1;pointer-events:auto;transform:translateX(0)}.carousel__item img{height:100%;-o-object-fit:v-bind(fit);object-fit:v-bind(fit);width:100%}.carousel__empty{color:var(--color-muted)}.switch-button{position:absolute;top:50%}.switch-button :deep(button){background:transparent!important;border:none!important;color:transparent!important}.switch-button :deep(button:hover){color:transparent!important}.switch-button :deep(.orio-icon){color:#fff!important;fill:#fff!important;filter:drop-shadow(0 0 2px rgba(0,0,0,.8)) drop-shadow(0 0 4px rgba(0,0,0,.6))}@supports (mix-blend-mode:difference) and (not (-webkit-hyphens:none)){.switch-button :deep(.orio-icon){color:#000!important;fill:#000!important;filter:grayscale(1) contrast(9) invert(1) drop-shadow(0 0 1px black) drop-shadow(0 0 2px black);mix-blend-mode:difference}}.switch-button.previous-button{left:0}.switch-button.next-button{right:0}
140
+ </style>
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { computed, toRefs } from 'vue';
2
+ import { computed, toRefs } from "vue";
3
3
 
4
4
  export interface ResumeDate {
5
5
  startDate: string;
@@ -9,28 +9,28 @@ export interface ResumeDate {
9
9
  interface Props {
10
10
  dates: ResumeDate;
11
11
  month?: boolean; // Optional prop to indicate if the date should be displayed as month/year
12
- size?: 'small' | 'medium' | 'large';
13
- type?: 'text' | 'title' | 'subtitle' | 'italics';
12
+ size?: "small" | "medium" | "large";
13
+ type?: "text" | "title" | "subtitle" | "italics";
14
14
  }
15
15
 
16
16
  const props = withDefaults(defineProps<Props>(), {
17
- size: 'small',
18
- type: 'italics',
17
+ size: "small",
18
+ type: "italics",
19
19
  });
20
20
 
21
21
  const { dates } = toRefs(props);
22
22
 
23
23
  function formatMonthYear(value: string) {
24
- if (!value) return '';
24
+ if (!value) return "";
25
25
  if (!props.month)
26
- return new Intl.DateTimeFormat('en-US', {
27
- day: 'numeric',
28
- month: 'short',
29
- year: 'numeric',
26
+ return new Intl.DateTimeFormat("en-US", {
27
+ day: "numeric",
28
+ month: "short",
29
+ year: "numeric",
30
30
  }).format(new Date(value));
31
- return new Intl.DateTimeFormat('en-US', {
32
- month: 'short',
33
- year: 'numeric',
31
+ return new Intl.DateTimeFormat("en-US", {
32
+ month: "short",
33
+ year: "numeric",
34
34
  }).format(new Date(value));
35
35
  }
36
36
 
@@ -40,7 +40,7 @@ const endDate = computed(() => {
40
40
  if (dates.value.endDate === undefined) return null;
41
41
  return dates.value.endDate !== null
42
42
  ? formatMonthYear(dates.value.endDate)
43
- : 'Present';
43
+ : "Present";
44
44
  });
45
45
  </script>
46
46
 
@@ -1,14 +1,14 @@
1
1
  <script setup lang="ts">
2
- import { computed } from 'vue';
2
+ import { computed } from "vue";
3
3
 
4
4
  interface Props {
5
- style?: 'dotted' | 'dashed' | 'solid' | 'double' | 'groove' | 'ridge';
5
+ style?: "dotted" | "dashed" | "solid" | "double" | "groove" | "ridge";
6
6
  size?: number | string;
7
7
  margin?: number | string;
8
8
  }
9
9
 
10
10
  const props = withDefaults(defineProps<Props>(), {
11
- style: 'solid',
11
+ style: "solid",
12
12
  size: 1,
13
13
  margin: 1,
14
14
  });
@@ -1,18 +1,18 @@
1
1
  <script setup lang="ts">
2
- import { computed, useAttrs } from 'vue';
2
+ import { computed, useAttrs } from "vue";
3
3
 
4
- export type TextTypes = 'text' | 'title' | 'subtitle' | 'italics';
4
+ export type TextTypes = "text" | "title" | "subtitle" | "italics";
5
5
 
6
6
  export interface TextProps {
7
7
  type?: TextTypes;
8
- size?: 'small' | 'medium' | 'large' | 'extra-large';
8
+ size?: "small" | "medium" | "large" | "extra-large";
9
9
  uppercase?: boolean;
10
10
  icon?: string | null;
11
11
  lineClamp?: number | string;
12
12
  }
13
13
  const props = withDefaults(defineProps<TextProps>(), {
14
- type: 'text',
15
- size: 'medium',
14
+ type: "text",
15
+ size: "medium",
16
16
  uppercase: false,
17
17
  icon: null,
18
18
  lineClamp: undefined,
@@ -1,4 +1,4 @@
1
- export { useApi, type ApiOptions, type RequestBody, type RequestMethod, } from './useApi.js';
2
- export { useFuzzySearch } from './useFuzzySearch.js';
3
- export { useModal, type ModalProps, type OriginRect } from './useModal.js';
4
- export { useTheme } from './useTheme.js';
1
+ export { useApi, type ApiOptions, type RequestBody, type RequestMethod, } from "./useApi.js";
2
+ export { useFuzzySearch } from "./useFuzzySearch.js";
3
+ export { useModal, type ModalProps, type OriginRect } from "./useModal.js";
4
+ export { useTheme } from "./useTheme.js";
@@ -1,5 +1,5 @@
1
1
  export type RequestBody = Record<string, unknown>;
2
- export type RequestMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
2
+ export type RequestMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
3
3
  export interface ApiOptions {
4
4
  method?: RequestMethod;
5
5
  body?: RequestBody;
@@ -1,5 +1,5 @@
1
- import { type MaybeRef } from 'vue';
2
- import { useFuse, type FuseOptions } from '@vueuse/integrations/useFuse';
1
+ import { type MaybeRef } from "vue";
2
+ import { useFuse, type FuseOptions } from "@vueuse/integrations/useFuse";
3
3
  /**
4
4
  * Search using Fuse.js fuzzy search
5
5
  * @param dataSource - Array of strings or objects to search
@@ -7,7 +7,7 @@ export interface OriginRect {
7
7
  export interface ModalProps {
8
8
  show: boolean;
9
9
  origin: OriginRect | null;
10
- 'onUpdate:show': (state: boolean) => void;
10
+ "onUpdate:show": (state: boolean) => void;
11
11
  }
12
12
  export declare function useModal(): {
13
13
  modalProps: import("vue").Ref<any, any>;
@@ -16,6 +16,8 @@ export { default as Tooltip } from "./components/Tooltip.vue.js";
16
16
  export { default as EmptyState } from "./components/EmptyState.vue.js";
17
17
  export { default as DashedContainer } from "./components/DashedContainer.vue.js";
18
18
  export { default as ControlElement } from "./components/ControlElement.vue.js";
19
+ export { default as Gallery } from "./components/gallery/index.vue.js";
20
+ export { default as GalleryCarousel } from "./components/gallery/Carousel.vue.js";
19
21
  export { default as ViewText } from "./components/view/Text.vue.js";
20
22
  export { default as ViewDates } from "./components/view/Dates.vue.js";
21
23
  export { default as ViewSeparator } from "./components/view/Separator.vue.js";
@@ -16,6 +16,8 @@ export { default as Tooltip } from "./components/Tooltip.vue";
16
16
  export { default as EmptyState } from "./components/EmptyState.vue";
17
17
  export { default as DashedContainer } from "./components/DashedContainer.vue";
18
18
  export { default as ControlElement } from "./components/ControlElement.vue";
19
+ export { default as Gallery } from "./components/gallery/index.vue";
20
+ export { default as GalleryCarousel } from "./components/gallery/Carousel.vue";
19
21
  export { default as ViewText } from "./components/view/Text.vue";
20
22
  export { default as ViewDates } from "./components/view/Dates.vue";
21
23
  export { default as ViewSeparator } from "./components/view/Separator.vue";
@@ -1,10 +1,31 @@
1
1
  export const iconRegistry = {
2
2
  // Loading spinner (line-md:loading-loop)
3
3
  "loading-loop": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><circle cx="12" cy="2" r="0"><animate attributeName="r" begin="0" calcMode="spline" dur="1s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle><circle cx="12" cy="2" r="0" transform="rotate(45 12 12)"><animate attributeName="r" begin="0.125s" calcMode="spline" dur="1s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle><circle cx="12" cy="2" r="0" transform="rotate(90 12 12)"><animate attributeName="r" begin="0.25s" calcMode="spline" dur="1s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle><circle cx="12" cy="2" r="0" transform="rotate(135 12 12)"><animate attributeName="r" begin="0.375s" calcMode="spline" dur="1s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle><circle cx="12" cy="2" r="0" transform="rotate(180 12 12)"><animate attributeName="r" begin="0.5s" calcMode="spline" dur="1s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle><circle cx="12" cy="2" r="0" transform="rotate(225 12 12)"><animate attributeName="r" begin="0.625s" calcMode="spline" dur="1s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle><circle cx="12" cy="2" r="0" transform="rotate(270 12 12)"><animate attributeName="r" begin="0.75s" calcMode="spline" dur="1s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle><circle cx="12" cy="2" r="0" transform="rotate(315 12 12)"><animate attributeName="r" begin="0.875s" calcMode="spline" dur="1s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle></svg>`,
4
- // Chevron down (mdi-light:chevron-down)
4
+ // ARROWS & NAVIGATION ICONS
5
+ // Chevrons (angled arrows)
5
6
  "chevron-down": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6l-6-6z"/></svg>`,
6
- // Chevron up
7
7
  "chevron-up": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z"/></svg>`,
8
+ "chevron-left": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M15.41 7.41L14 6l-6 6l6 6l1.41-1.41L10.83 12z"/></svg>`,
9
+ "chevron-right": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M10 6L8.59 7.41L13.17 12l-4.58 4.59L10 18l6-6z"/></svg>`,
10
+ // Straight arrows
11
+ "arrow-up": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M7 14l5-5l5 5z"/></svg>`,
12
+ "arrow-down": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M7 10l5 5l5-5z"/></svg>`,
13
+ "arrow-left": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M14 7l-5 5l5 5z"/></svg>`,
14
+ "arrow-right": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M10 17l5-5l-5-5z"/></svg>`,
15
+ // Long arrows (with tails)
16
+ "arrow-back": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M20 11H7.83l5.59-5.59L12 4l-8 8l8 8l1.41-1.41L7.83 13H20z"/></svg>`,
17
+ "arrow-forward": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"/></svg>`,
18
+ "arrow-upward": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8z"/></svg>`,
19
+ "arrow-downward": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8z"/></svg>`,
20
+ // Expand/Collapse
21
+ "expand-more": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M16.59 8.59L12 13.17L7.41 8.59L6 10l6 6l6-6z"/></svg>`,
22
+ "expand-less": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12 8l-6 6l1.41 1.41L12 10.83l4.59 4.58L18 14z"/></svg>`,
23
+ // Double arrows
24
+ "double-arrow-left": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M18.41 7.41L17 6l-6 6l6 6l1.41-1.41L13.83 12zm-6 0L11 6l-6 6l6 6l1.41-1.41L7.83 12z"/></svg>`,
25
+ "double-arrow-right": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5.59 7.41L7 6l6 6l-6 6l-1.41-1.41L10.17 12zM11.59 7.41L13 6l6 6l-6 6l-1.41-1.41L16.17 12z"/></svg>`,
26
+ // External & Links
27
+ "external-link": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 19H5V5h7V3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2v-7h-2zM14 3v2h3.59l-9.83 9.83l1.41 1.41L19 6.41V10h2V3z"/></svg>`,
28
+ link: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5"/></svg>`,
8
29
  // Edit (material-symbols:edit-sharp)
9
30
  edit: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M3 21v-4.25L16.2 3.575q.3-.275.663-.425t.762-.15t.775.15t.65.45L20.425 5q.3.275.438.65T21 6.4q0 .4-.137.763t-.438.662L7.25 21zM17.6 7.8L19 6.4L17.6 5l-1.4 1.4z"/></svg>`,
10
31
  // Check / Checkmark
@@ -23,6 +44,47 @@ export const iconRegistry = {
23
44
  download: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 9h-4V3H9v6H5l7 7zM5 18v2h14v-2z"/></svg>`,
24
45
  // Delete / Trash
25
46
  delete: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12l1.41 1.41L13.41 14l2.12 2.12l-1.41 1.41L12 15.41l-2.12 2.12l-1.41-1.41L10.59 14zM15.5 4l-1-1h-5l-1 1H5v2h14V4z"/></svg>`,
47
+ // Copy
48
+ copy: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2m0 16H8V7h11z"/></svg>`,
49
+ // COMMUNICATION ICONS
50
+ // Mail & Message
51
+ mail: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2m0 4l-8 5l-8-5V6l8 5l8-5z"/></svg>`,
52
+ message: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2M6 9h12v2H6zm8 5H6v-2h8zm4-6H6V6h12z"/></svg>`,
53
+ chat: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2m-2 12H6v-2h12zm0-3H6V9h12zm0-3H6V6h12z"/></svg>`,
54
+ phone: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24c1.12.37 2.33.57 3.57.57c.55 0 1 .45 1 1V20c0 .55-.45 1-1 1c-9.39 0-17-7.61-17-17c0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1c0 1.25.2 2.45.57 3.57c.11.35.03.74-.25 1.02z"/></svg>`,
55
+ // MEDIA ICONS
56
+ // Playback
57
+ play: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M8 5v14l11-7z"/></svg>`,
58
+ pause: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M6 19h4V5H6zm8-14v14h4V5z"/></svg>`,
59
+ stop: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M6 6h12v12H6z"/></svg>`,
60
+ "skip-next": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M6 18l8.5-6L6 6zm10-12v12h2V6z"/></svg>`,
61
+ "skip-previous": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M6 6h2v12H6zm3.5 6l8.5 6V6z"/></svg>`,
62
+ // Media content
63
+ image: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2M8.5 13.5l2.5 3.01L14.5 12l4.5 6H5z"/></svg>`,
64
+ video: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11z"/></svg>`,
65
+ camera: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5s5 2.24 5 5s-2.24 5-5 5"/></svg>`,
66
+ mic: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3m5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72z"/></svg>`,
67
+ "mic-off": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 11h-1.7c0 .74-.16 1.43-.43 2.05l1.23 1.23c.56-.98.9-2.09.9-3.28m-4.02.17c0-.06.02-.11.02-.17V5c0-1.66-1.34-3-3-3S9 3.34 9 5v.18zM4.27 3L3 4.27l6.01 6.01V11c0 1.66 1.33 3 2.99 3c.22 0 .44-.03.65-.08l1.66 1.66c-.71.33-1.5.52-2.31.52c-2.76 0-5.3-2.1-5.3-5.1H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c.91-.13 1.77-.45 2.54-.9L19.73 21L21 19.73z"/></svg>`,
68
+ volume: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M3 9v6h4l5 5V4L7 9zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02M14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77"/></svg>`,
69
+ "volume-off": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63m2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51A8.9 8.9 0 0 0 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71M4.27 3L3 4.27L7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06a9 9 0 0 0 3.69-1.81L19.73 21L21 19.73l-9-9zM12 4L9.91 6.09L12 8.18z"/></svg>`,
70
+ // DOCUMENT ICONS
71
+ file: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M6 2c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm7 7V3.5L18.5 9z"/></svg>`,
72
+ folder: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8z"/></svg>`,
73
+ "folder-open": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2m0 12H4V8h16z"/></svg>`,
74
+ document: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8zm2 16H8v-2h8zm0-4H8v-2h8zm-3-5V3.5L18.5 9z"/></svg>`,
75
+ pdf: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2m-8.5 7.5c0 .83-.67 1.5-1.5 1.5H9v2H7.5V7H10c.83 0 1.5.67 1.5 1.5zm5 2c0 .83-.67 1.5-1.5 1.5h-2.5V7H15c.83 0 1.5.67 1.5 1.5zm4-3H19v1h1.5V11H19v2h-1.5V7h3zM9 9.5h1v-1H9zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4zm10 5.5h1v-4h-1z"/></svg>`,
76
+ // UI CONTROLS
77
+ eye: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5s5 2.24 5 5s-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3s3-1.34 3-3s-1.34-3-3-3"/></svg>`,
78
+ "eye-off": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12 7c2.76 0 5 2.24 5 5c0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75c-1.73-4.39-6-7.5-11-7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7M2 4.27l2.28 2.28l.46.46A11.8 11.8 0 0 0 1 12c1.73 4.39 6 7.5 11 7.5c1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22L21 20.73L3.27 3zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65c0 1.66 1.34 3 3 3c.22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53c-2.76 0-5-2.24-5-5c0-.79.2-1.53.53-2.2m4.31-.78l3.15 3.15l.02-.16c0-1.66-1.34-3-3-3z"/></svg>`,
79
+ lock: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2m-6 9c-1.1 0-2-.9-2-2s.9-2 2-2s2 .9 2 2s-.9 2-2 2m3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1z"/></svg>`,
80
+ unlock: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12 17c1.1 0 2-.9 2-2s-.9-2-2-2s-2 .9-2 2s.9 2 2 2m6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2m0 12H6V10h12z"/></svg>`,
81
+ // SOCIAL MEDIA
82
+ github: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5c.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34c-.46-1.16-1.11-1.47-1.11-1.47c-.91-.62.07-.6.07-.6c1 .07 1.53 1.03 1.53 1.03c.87 1.52 2.34 1.07 2.91.83c.09-.65.35-1.09.63-1.34c-2.22-.25-4.55-1.11-4.55-4.92c0-1.11.38-2 1.03-2.71c-.1-.25-.45-1.29.1-2.64c0 0 .84-.27 2.75 1.02c.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02c.55 1.35.2 2.39.1 2.64c.65.71 1.03 1.6 1.03 2.71c0 3.82-2.34 4.66-4.57 4.91c.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg>`,
83
+ twitter: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M22.46 6c-.77.35-1.6.58-2.46.69c.88-.53 1.56-1.37 1.88-2.38c-.83.5-1.75.85-2.72 1.05C18.37 4.5 17.26 4 16 4c-2.35 0-4.27 1.92-4.27 4.29c0 .34.04.67.11.98C8.28 9.09 5.11 7.38 3 4.79c-.37.63-.58 1.37-.58 2.15c0 1.49.75 2.81 1.91 3.56c-.71 0-1.37-.2-1.95-.5v.03c0 2.08 1.48 3.82 3.44 4.21a4.2 4.2 0 0 1-1.93.07a4.28 4.28 0 0 0 4 2.98a8.52 8.52 0 0 1-5.33 1.84q-.51 0-1.02-.06C3.44 20.29 5.7 21 8.12 21C16 21 20.33 14.46 20.33 8.79c0-.19 0-.37-.01-.56c.84-.6 1.56-1.36 2.14-2.23"/></svg>`,
84
+ facebook: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M14 13.5h2.5l1-4H14v-2c0-1.03 0-2 2-2h1.5V2.14c-.326-.043-1.557-.14-2.857-.14C11.928 2 10 3.657 10 6.7v2.8H7v4h3V22h4z"/></svg>`,
85
+ instagram: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M7.8 2h8.4C19.4 2 22 4.6 22 7.8v8.4a5.8 5.8 0 0 1-5.8 5.8H7.8C4.6 22 2 19.4 2 16.2V7.8A5.8 5.8 0 0 1 7.8 2m-.2 2A3.6 3.6 0 0 0 4 7.6v8.8C4 18.39 5.61 20 7.6 20h8.8a3.6 3.6 0 0 0 3.6-3.6V7.6C20 5.61 18.39 4 16.4 4zm9.65 1.5a1.25 1.25 0 0 1 1.25 1.25A1.25 1.25 0 0 1 17.25 8A1.25 1.25 0 0 1 16 6.75a1.25 1.25 0 0 1 1.25-1.25M12 7a5 5 0 0 1 5 5a5 5 0 0 1-5 5a5 5 0 0 1-5-5a5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3a3 3 0 0 0 3 3a3 3 0 0 0 3-3a3 3 0 0 0-3-3"/></svg>`,
86
+ youtube: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="m10 15l5.19-3L10 9zm11.56-7.83c.13.47.22 1.1.28 1.9c.07.8.1 1.49.1 2.09L22 12c0 2.19-.16 3.8-.44 4.83c-.25.9-.83 1.48-1.73 1.73c-.47.13-1.33.22-2.65.28c-1.3.07-2.49.1-3.59.1L12 19c-4.19 0-6.8-.16-7.83-.44c-.9-.25-1.48-.83-1.73-1.73c-.13-.47-.22-1.1-.28-1.9c-.07-.8-.1-1.49-.1-2.09L2 12c0-2.19.16-3.8.44-4.83c.25-.9.83-1.48 1.73-1.73c.47-.13 1.33-.22 2.65-.28c1.3-.07 2.49-.1 3.59-.1L12 5c4.19 0 6.8.16 7.83.44c.9.25 1.48.83 1.73 1.73"/></svg>`,
87
+ linkedin: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 3a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zm-.5 15.5v-5.3a3.26 3.26 0 0 0-3.26-3.26c-.85 0-1.84.52-2.32 1.3v-1.11h-2.79v8.37h2.79v-4.93c0-.77.62-1.4 1.39-1.4a1.4 1.4 0 0 1 1.4 1.4v4.93zM6.88 8.56a1.68 1.68 0 0 0 1.68-1.68c0-.93-.75-1.69-1.68-1.69a1.69 1.69 0 0 0-1.69 1.69c0 .93.76 1.68 1.69 1.68m1.39 9.94v-8.37H5.5v8.37z"/></svg>`,
26
88
  // E-COMMERCE ICONS
27
89
  // Shopping & Cart
28
90
  "shopping-cart": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2s-.9-2-2-2M1 2v2h2l3.6 7.59l-1.35 2.45c-.16.28-.25.61-.25.96c0 1.1.9 2 2 2h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12l.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49A1.003 1.003 0 0 0 20 4H5.21l-.94-2zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2s2-.9 2-2s-.9-2-2-2"/></svg>`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orio-ui",
3
- "version": "1.4.1",
3
+ "version": "1.6.0",
4
4
  "description": "Modern Nuxt component library with theme support",
5
5
  "type": "module",
6
6
  "main": "./dist/module.mjs",
@@ -24,7 +24,7 @@
24
24
  "test": "vitest",
25
25
  "test:unit": "vitest run",
26
26
  "test:watch": "vitest watch",
27
- "docs:dev": "vitepress dev docs",
27
+ "docs:dev": "vitepress dev docs --host",
28
28
  "docs:build": "vitepress build docs",
29
29
  "docs:preview": "vitepress preview docs",
30
30
  "lint": "eslint .",
@@ -57,6 +57,7 @@
57
57
  "nuxt": "^4.2.2",
58
58
  "prettier": "^3.7.4",
59
59
  "sass": "^1.70.0",
60
+ "sass-embedded": "^1.92.1",
60
61
  "typescript": "^5.9.3",
61
62
  "typescript-eslint": "^8.52.0",
62
63
  "vitepress": "^1.6.4",