@allsrvsonline/vue-component-library 0.2.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -233,10 +233,66 @@ MIT
233
233
 
234
234
  ## Publishing
235
235
 
236
- To publish to npm:
236
+ This project uses automated releases with conventional commits and GitHub Actions.
237
237
 
238
- 1. Update version in `package.json`
239
- 2. Build the library: `npm run build:lib`
240
- 3. Publish: `npm publish --access public`
238
+ ### Prerequisites
239
+
240
+ Before publishing, ensure these GitHub repository variables are configured:
241
+
242
+ 1. **NPM_TOKEN** - npm authentication token
243
+ - Go to npmjs.com → Account Settings → Access Tokens → Generate New Token (Automation)
244
+ - Add as repository variable: `NPM_TOKEN` (in Settings → Variables)
245
+
246
+ 2. **GITHUB_TOKEN** - Automatically provided by GitHub Actions (no setup needed)
247
+
248
+ 3. **GITHUB_TOKEN** - Automatically provided by GitHub Actions (no setup needed)
249
+
250
+ ### Release Process
251
+
252
+ Create releases using these npm scripts:
253
+
254
+ ```bash
255
+ # Patch release (0.3.1 → 0.3.2)
256
+ npm run release:patch
257
+
258
+ # Minor release (0.3.1 → 0.4.0)
259
+ npm run release:minor
260
+
261
+ # Major release (0.3.1 → 1.0.0)
262
+ npm run release:major
263
+
264
+ # Preview what would happen
265
+ npm run release:dry-run
266
+ ```
267
+
268
+ The release process automatically:
269
+
270
+ - ✅ Analyzes conventional commits
271
+ - ✅ Bumps version in package.json
272
+ - ✅ Updates CHANGELOG.md
273
+ - ✅ Creates git commit and tag
274
+ - ✅ Pushes to GitHub (triggers publish workflow)
275
+ - ✅ Publishes to npm
276
+ - ✅ Creates GitHub Release
277
+
278
+ ### Conventional Commits
279
+
280
+ Use these commit message formats:
281
+
282
+ ```bash
283
+ feat: add new component # → Minor version bump
284
+ fix: resolve button bug # → Patch version bump
285
+ docs: update README # → No version bump
286
+ BREAKING CHANGE: api change # → Major version bump
287
+ ```
288
+
289
+ ### Manual Publishing
290
+
291
+ If needed, you can still publish manually:
292
+
293
+ ```bash
294
+ npm run build:lib
295
+ npm publish --access public
296
+ ```
241
297
 
242
298
  Make sure to update `@your-org/vue-component-library` in package.json with your actual organization/package name.
package/dist/index.d.ts CHANGED
@@ -105,12 +105,12 @@ export declare const BaseButton: __VLS_WithTemplateSlots<typeof __VLS_component,
105
105
  /**
106
106
  * Events emitted by BaseButton
107
107
  */
108
- export declare interface BaseButtonEmits {
108
+ export declare type BaseButtonEmits = {
109
109
  /**
110
110
  * Emitted when button is clicked
111
111
  */
112
112
  (e: 'click', event: MouseEvent): void;
113
- }
113
+ };
114
114
 
115
115
  /**
116
116
  * Props for BaseButton component
@@ -193,7 +193,7 @@ required: boolean;
193
193
  /**
194
194
  * Events emitted by BaseInput
195
195
  */
196
- export declare interface BaseInputEmits {
196
+ export declare type BaseInputEmits = {
197
197
  /**
198
198
  * Emitted when value changes (v-model)
199
199
  */
@@ -206,7 +206,7 @@ export declare interface BaseInputEmits {
206
206
  * Emitted when input loses focus
207
207
  */
208
208
  (e: 'blur', event: FocusEvent): void;
209
- }
209
+ };
210
210
 
211
211
  /**
212
212
  * Props for BaseInput component
@@ -245,6 +245,87 @@ export declare interface BaseInputProps {
245
245
  error?: string;
246
246
  }
247
247
 
248
+ export declare const BaseSelect: DefineComponent<BaseSelectProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
249
+ "update:modelValue": (value: string) => any;
250
+ focus: (event: FocusEvent) => any;
251
+ blur: (event: FocusEvent) => any;
252
+ }, string, PublicProps, Readonly<BaseSelectProps> & Readonly<{
253
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
254
+ onFocus?: ((event: FocusEvent) => any) | undefined;
255
+ onBlur?: ((event: FocusEvent) => any) | undefined;
256
+ }>, {
257
+ disabled: boolean;
258
+ modelValue: string | number;
259
+ required: boolean;
260
+ options: SelectOption[];
261
+ labelField: string;
262
+ valueField: string;
263
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
264
+
265
+ /**
266
+ * Events emitted by BaseSelect
267
+ */
268
+ export declare type BaseSelectEmits = {
269
+ /**
270
+ * Emitted when value changes (v-model)
271
+ */
272
+ (e: 'update:modelValue', value: string): void;
273
+ /**
274
+ * Emitted when select is focused
275
+ */
276
+ (e: 'focus', event: FocusEvent): void;
277
+ /**
278
+ * Emitted when select loses focus
279
+ */
280
+ (e: 'blur', event: FocusEvent): void;
281
+ };
282
+
283
+ /**
284
+ * Props for BaseSelect component
285
+ */
286
+ export declare interface BaseSelectProps {
287
+ /**
288
+ * The select value (v-model)
289
+ */
290
+ modelValue?: string | number;
291
+ /**
292
+ * Array of options to display
293
+ */
294
+ options?: SelectOption[];
295
+ /**
296
+ * Placeholder text
297
+ */
298
+ placeholder?: string;
299
+ /**
300
+ * Whether the select is disabled
301
+ * @default false
302
+ */
303
+ disabled?: boolean;
304
+ /**
305
+ * Whether the select is required
306
+ * @default false
307
+ */
308
+ required?: boolean;
309
+ /**
310
+ * Select label
311
+ */
312
+ label?: string;
313
+ /**
314
+ * Error message to display
315
+ */
316
+ error?: string;
317
+ /**
318
+ * Field name to use as the label when options are objects
319
+ * @default 'label'
320
+ */
321
+ labelField?: string;
322
+ /**
323
+ * Field name to use as the value when options are objects
324
+ * @default 'value'
325
+ */
326
+ valueField?: string;
327
+ }
328
+
248
329
  /**
249
330
  * Button size types
250
331
  */
@@ -351,6 +432,14 @@ export declare function debounce<T extends (...args: unknown[]) => void>(fn: T,
351
432
  */
352
433
  export declare function generateId(prefix?: string): string;
353
434
 
435
+ /**
436
+ * Select option type - can be a simple value or an object with value and label
437
+ */
438
+ export declare type SelectOption = string | number | {
439
+ value: string | number;
440
+ label: string;
441
+ } | Record<string, unknown>;
442
+
354
443
  /**
355
444
  * Composable for detecting clicks outside an element
356
445
  *
@@ -1 +1 @@
1
- :root{--base-button-primary-bg: #3b82f6;--base-button-primary-bg-hover: #2563eb;--base-button-primary-text: white;--base-button-secondary-bg: #6b7280;--base-button-secondary-bg-hover: #4b5563;--base-button-secondary-text: white;--base-button-success-bg: #10b981;--base-button-success-bg-hover: #059669;--base-button-success-text: white;--base-button-danger-bg: #ef4444;--base-button-danger-bg-hover: #dc2626;--base-button-danger-text: white;--base-button-warning-bg: #f59e0b;--base-button-warning-bg-hover: #d97706;--base-button-warning-text: white;--base-button-disabled-opacity: .6;--base-button-loading-opacity: .7}.base-button[data-v-a4a5350a]{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border:none;border-radius:.375rem;font-weight:500;cursor:pointer;transition:all .2s ease-in-out;font-family:inherit;position:relative}.base-button[data-v-a4a5350a]:focus-visible{outline:2px solid currentColor;outline-offset:2px}.base-button--small[data-v-a4a5350a]{padding:.375rem .75rem;font-size:.875rem}.base-button--medium[data-v-a4a5350a]{padding:.5rem 1rem;font-size:1rem}.base-button--large[data-v-a4a5350a]{padding:.75rem 1.5rem;font-size:1.125rem}.base-button--primary[data-v-a4a5350a]{background-color:var(--base-button-primary-bg);color:var(--base-button-primary-text)}.base-button--primary[data-v-a4a5350a]:hover:not(:disabled){background-color:var(--base-button-primary-bg-hover)}.base-button--secondary[data-v-a4a5350a]{background-color:var(--base-button-secondary-bg);color:var(--base-button-secondary-text)}.base-button--secondary[data-v-a4a5350a]:hover:not(:disabled){background-color:var(--base-button-secondary-bg-hover)}.base-button--success[data-v-a4a5350a]{background-color:var(--base-button-success-bg);color:var(--base-button-success-text)}.base-button--success[data-v-a4a5350a]:hover:not(:disabled){background-color:var(--base-button-success-bg-hover)}.base-button--danger[data-v-a4a5350a]{background-color:var(--base-button-danger-bg);color:var(--base-button-danger-text)}.base-button--danger[data-v-a4a5350a]:hover:not(:disabled){background-color:var(--base-button-danger-bg-hover)}.base-button--warning[data-v-a4a5350a]{background-color:var(--base-button-warning-bg);color:var(--base-button-warning-text)}.base-button--warning[data-v-a4a5350a]:hover:not(:disabled){background-color:var(--base-button-warning-bg-hover)}.base-button--full-width[data-v-a4a5350a]{width:100%}.base-button--disabled[data-v-a4a5350a],.base-button[data-v-a4a5350a]:disabled{opacity:var(--base-button-disabled-opacity);cursor:not-allowed}.base-button--loading[data-v-a4a5350a]{cursor:wait}.base-button__spinner[data-v-a4a5350a]{width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin-a4a5350a .6s linear infinite}.base-button__content--loading[data-v-a4a5350a]{opacity:var(--base-button-loading-opacity)}@keyframes spin-a4a5350a{to{transform:rotate(360deg)}}:root{--base-input-label-color: #374151;--base-input-required-color: #ef4444;--base-input-border: #d1d5db;--base-input-border-focus: #3b82f6;--base-input-border-error: #ef4444;--base-input-bg-disabled: #f3f4f6;--base-input-placeholder-color: #9ca3af;--base-input-focus-shadow: 0 0 0 3px rgba(59, 130, 246, .1);--base-input-error-focus-shadow: 0 0 0 3px rgba(239, 68, 68, .1);--base-input-error-color: #ef4444;--base-input-disabled-opacity: .6}.base-input[data-v-52f8a6e5]{display:flex;flex-direction:column;gap:.375rem}.base-input__label[data-v-52f8a6e5]{font-size:.875rem;font-weight:500;color:var(--base-input-label-color)}.base-input__required[data-v-52f8a6e5]{color:var(--base-input-required-color)}.base-input__field[data-v-52f8a6e5]{padding:.5rem .75rem;font-size:1rem;border:1px solid var(--base-input-border);border-radius:.375rem;transition:all .2s ease-in-out;font-family:inherit}.base-input__field[data-v-52f8a6e5]:focus{outline:none;border-color:var(--base-input-border-focus);box-shadow:var(--base-input-focus-shadow)}.base-input__field[data-v-52f8a6e5]::placeholder{color:var(--base-input-placeholder-color)}.base-input__field--error[data-v-52f8a6e5]{border-color:var(--base-input-border-error)}.base-input__field--error[data-v-52f8a6e5]:focus{border-color:var(--base-input-border-error);box-shadow:var(--base-input-error-focus-shadow)}.base-input__field--disabled[data-v-52f8a6e5],.base-input__field[data-v-52f8a6e5]:disabled{background-color:var(--base-input-bg-disabled);cursor:not-allowed;opacity:var(--base-input-disabled-opacity)}.base-input__error[data-v-52f8a6e5]{font-size:.875rem;color:var(--base-input-error-color)}:root{--base-card-bg: white;--base-card-footer-bg: #f9fafb;--base-card-border: #e5e7eb;--base-card-title-color: #111827;--base-card-shadow: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06)}.base-card[data-v-80b8fdda]{background-color:var(--base-card-bg);border-radius:.5rem;border:1px solid var(--base-card-border);overflow:hidden}.base-card--elevated[data-v-80b8fdda]{box-shadow:var(--base-card-shadow);border:none}.base-card__header[data-v-80b8fdda]{padding:1rem 1.5rem;border-bottom:1px solid var(--base-card-border)}.base-card__title[data-v-80b8fdda]{margin:0;font-size:1.125rem;font-weight:600;color:var(--base-card-title-color)}.base-card__body[data-v-80b8fdda]{padding:1.5rem}.base-card--no-padding .base-card__body[data-v-80b8fdda]{padding:0}.base-card__footer[data-v-80b8fdda]{padding:1rem 1.5rem;border-top:1px solid var(--base-card-border);background-color:var(--base-card-footer-bg)}:root{--collapsible-card-bg: white;--collapsible-card-footer-bg: #f9fafb;--collapsible-card-header-hover-bg: #f9fafb;--collapsible-card-toggle-hover-bg: #e5e7eb;--collapsible-card-border: #e5e7eb;--collapsible-card-title-color: #111827;--collapsible-card-icon-color: #6b7280;--collapsible-card-focus-ring: #3b82f6;--collapsible-card-shadow: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06)}.collapsible-card[data-v-489edb19]{background-color:var(--collapsible-card-bg);border-radius:.5rem;border:1px solid var(--collapsible-card-border);overflow:hidden}.collapsible-card--elevated[data-v-489edb19]{box-shadow:var(--collapsible-card-shadow);border:none}.collapsible-card__header[data-v-489edb19]{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;border-bottom:1px solid var(--collapsible-card-border);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .2s ease}.collapsible-card__header[data-v-489edb19]:hover{background-color:var(--collapsible-card-header-hover-bg)}.collapsible-card__header-content[data-v-489edb19]{flex:1}.collapsible-card__title[data-v-489edb19]{margin:0;font-size:1.125rem;font-weight:600;color:var(--collapsible-card-title-color)}.collapsible-card__toggle[data-v-489edb19]{background:none;border:none;padding:.25rem;cursor:pointer;color:var(--collapsible-card-icon-color);display:flex;align-items:center;justify-content:center;border-radius:.25rem;transition:background-color .2s ease}.collapsible-card__toggle[data-v-489edb19]:hover{background-color:var(--collapsible-card-toggle-hover-bg)}.collapsible-card__toggle[data-v-489edb19]:focus{outline:2px solid var(--collapsible-card-focus-ring);outline-offset:2px}.collapsible-card__icon[data-v-489edb19]{transition:transform .2s ease}.collapsible-card__icon--collapsed[data-v-489edb19]{transform:rotate(-90deg)}.collapsible-card__body[data-v-489edb19]{padding:1.5rem}.collapsible-card--no-padding .collapsible-card__body[data-v-489edb19]{padding:0}.collapsible-card__footer[data-v-489edb19]{padding:1rem 1.5rem;border-top:1px solid var(--collapsible-card-border);background-color:var(--collapsible-card-footer-bg)}
1
+ :root{--base-button-primary-bg: #3b82f6;--base-button-primary-bg-hover: #2563eb;--base-button-primary-text: white;--base-button-secondary-bg: #6b7280;--base-button-secondary-bg-hover: #4b5563;--base-button-secondary-text: white;--base-button-success-bg: #10b981;--base-button-success-bg-hover: #059669;--base-button-success-text: white;--base-button-danger-bg: #ef4444;--base-button-danger-bg-hover: #dc2626;--base-button-danger-text: white;--base-button-warning-bg: #f59e0b;--base-button-warning-bg-hover: #d97706;--base-button-warning-text: white;--base-button-disabled-opacity: .6;--base-button-loading-opacity: .7}.base-button[data-v-a4a5350a]{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border:none;border-radius:.375rem;font-weight:500;cursor:pointer;transition:all .2s ease-in-out;font-family:inherit;position:relative}.base-button[data-v-a4a5350a]:focus-visible{outline:2px solid currentColor;outline-offset:2px}.base-button--small[data-v-a4a5350a]{padding:.375rem .75rem;font-size:.875rem}.base-button--medium[data-v-a4a5350a]{padding:.5rem 1rem;font-size:1rem}.base-button--large[data-v-a4a5350a]{padding:.75rem 1.5rem;font-size:1.125rem}.base-button--primary[data-v-a4a5350a]{background-color:var(--base-button-primary-bg);color:var(--base-button-primary-text)}.base-button--primary[data-v-a4a5350a]:hover:not(:disabled){background-color:var(--base-button-primary-bg-hover)}.base-button--secondary[data-v-a4a5350a]{background-color:var(--base-button-secondary-bg);color:var(--base-button-secondary-text)}.base-button--secondary[data-v-a4a5350a]:hover:not(:disabled){background-color:var(--base-button-secondary-bg-hover)}.base-button--success[data-v-a4a5350a]{background-color:var(--base-button-success-bg);color:var(--base-button-success-text)}.base-button--success[data-v-a4a5350a]:hover:not(:disabled){background-color:var(--base-button-success-bg-hover)}.base-button--danger[data-v-a4a5350a]{background-color:var(--base-button-danger-bg);color:var(--base-button-danger-text)}.base-button--danger[data-v-a4a5350a]:hover:not(:disabled){background-color:var(--base-button-danger-bg-hover)}.base-button--warning[data-v-a4a5350a]{background-color:var(--base-button-warning-bg);color:var(--base-button-warning-text)}.base-button--warning[data-v-a4a5350a]:hover:not(:disabled){background-color:var(--base-button-warning-bg-hover)}.base-button--full-width[data-v-a4a5350a]{width:100%}.base-button--disabled[data-v-a4a5350a],.base-button[data-v-a4a5350a]:disabled{opacity:var(--base-button-disabled-opacity);cursor:not-allowed}.base-button--loading[data-v-a4a5350a]{cursor:wait}.base-button__spinner[data-v-a4a5350a]{width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin-a4a5350a .6s linear infinite}.base-button__content--loading[data-v-a4a5350a]{opacity:var(--base-button-loading-opacity)}@keyframes spin-a4a5350a{to{transform:rotate(360deg)}}:root{--base-input-label-color: #374151;--base-input-required-color: #ef4444;--base-input-border: #d1d5db;--base-input-border-focus: #3b82f6;--base-input-border-error: #ef4444;--base-input-bg-disabled: #f3f4f6;--base-input-placeholder-color: #9ca3af;--base-input-focus-shadow: 0 0 0 3px rgba(59, 130, 246, .1);--base-input-error-focus-shadow: 0 0 0 3px rgba(239, 68, 68, .1);--base-input-error-color: #ef4444;--base-input-disabled-opacity: .6}.base-input[data-v-52f8a6e5]{display:flex;flex-direction:column;gap:.375rem}.base-input__label[data-v-52f8a6e5]{font-size:.875rem;font-weight:500;color:var(--base-input-label-color)}.base-input__required[data-v-52f8a6e5]{color:var(--base-input-required-color)}.base-input__field[data-v-52f8a6e5]{padding:.5rem .75rem;font-size:1rem;border:1px solid var(--base-input-border);border-radius:.375rem;transition:all .2s ease-in-out;font-family:inherit}.base-input__field[data-v-52f8a6e5]:focus{outline:none;border-color:var(--base-input-border-focus);box-shadow:var(--base-input-focus-shadow)}.base-input__field[data-v-52f8a6e5]::placeholder{color:var(--base-input-placeholder-color)}.base-input__field--error[data-v-52f8a6e5]{border-color:var(--base-input-border-error)}.base-input__field--error[data-v-52f8a6e5]:focus{border-color:var(--base-input-border-error);box-shadow:var(--base-input-error-focus-shadow)}.base-input__field--disabled[data-v-52f8a6e5],.base-input__field[data-v-52f8a6e5]:disabled{background-color:var(--base-input-bg-disabled);cursor:not-allowed;opacity:var(--base-input-disabled-opacity)}.base-input__error[data-v-52f8a6e5]{font-size:.875rem;color:var(--base-input-error-color)}:root{--base-select-label-color: #374151;--base-select-required-color: #ef4444;--base-select-border: #d1d5db;--base-select-border-focus: #3b82f6;--base-select-border-error: #ef4444;--base-select-bg: #ffffff;--base-select-bg-disabled: #f3f4f6;--base-select-arrow: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");--base-select-focus-shadow: 0 0 0 3px rgba(59, 130, 246, .1);--base-select-error-focus-shadow: 0 0 0 3px rgba(239, 68, 68, .1);--base-select-error-color: #ef4444;--base-select-disabled-opacity: .6}.base-select[data-v-4d5c982a]{display:flex;flex-direction:column;gap:.375rem}.base-select__label[data-v-4d5c982a]{font-size:.875rem;font-weight:500;color:var(--base-select-label-color)}.base-select__required[data-v-4d5c982a]{color:var(--base-select-required-color)}.base-select__field[data-v-4d5c982a]{padding:.5rem 2rem .5rem .75rem;font-size:1rem;border:1px solid var(--base-select-border);border-radius:.375rem;transition:all .2s ease-in-out;font-family:inherit;background-color:var(--base-select-bg);background-image:var(--base-select-arrow);background-position:right .5rem center;background-repeat:no-repeat;background-size:1.25rem;appearance:none;cursor:pointer}.base-select__field[data-v-4d5c982a]:focus{outline:none;border-color:var(--base-select-border-focus);box-shadow:var(--base-select-focus-shadow)}.base-select__field--error[data-v-4d5c982a]{border-color:var(--base-select-border-error)}.base-select__field--error[data-v-4d5c982a]:focus{border-color:var(--base-select-border-error);box-shadow:var(--base-select-error-focus-shadow)}.base-select__field--disabled[data-v-4d5c982a],.base-select__field[data-v-4d5c982a]:disabled{background-color:var(--base-select-bg-disabled);cursor:not-allowed;opacity:var(--base-select-disabled-opacity)}.base-select__error[data-v-4d5c982a]{font-size:.875rem;color:var(--base-select-error-color)}:root{--base-card-bg: white;--base-card-footer-bg: #f9fafb;--base-card-border: #e5e7eb;--base-card-title-color: #111827;--base-card-shadow: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06)}.base-card[data-v-80b8fdda]{background-color:var(--base-card-bg);border-radius:.5rem;border:1px solid var(--base-card-border);overflow:hidden}.base-card--elevated[data-v-80b8fdda]{box-shadow:var(--base-card-shadow);border:none}.base-card__header[data-v-80b8fdda]{padding:1rem 1.5rem;border-bottom:1px solid var(--base-card-border)}.base-card__title[data-v-80b8fdda]{margin:0;font-size:1.125rem;font-weight:600;color:var(--base-card-title-color)}.base-card__body[data-v-80b8fdda]{padding:1.5rem}.base-card--no-padding .base-card__body[data-v-80b8fdda]{padding:0}.base-card__footer[data-v-80b8fdda]{padding:1rem 1.5rem;border-top:1px solid var(--base-card-border);background-color:var(--base-card-footer-bg)}:root{--collapsible-card-bg: white;--collapsible-card-footer-bg: #f9fafb;--collapsible-card-header-hover-bg: #f9fafb;--collapsible-card-toggle-hover-bg: #e5e7eb;--collapsible-card-border: #e5e7eb;--collapsible-card-title-color: #111827;--collapsible-card-icon-color: #6b7280;--collapsible-card-focus-ring: #3b82f6;--collapsible-card-shadow: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06)}.collapsible-card[data-v-14982384]{background-color:var(--collapsible-card-bg);border-radius:.5rem;border:1px solid var(--collapsible-card-border);overflow:hidden}.collapsible-card--elevated[data-v-14982384]{box-shadow:var(--collapsible-card-shadow);border:none}.collapsible-card__header[data-v-14982384]{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;border-bottom:1px solid var(--collapsible-card-border);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .2s ease}.collapsible-card__header[data-v-14982384]:hover{background-color:var(--collapsible-card-header-hover-bg)}.collapsible-card__header-content[data-v-14982384]{flex:1}.collapsible-card__title[data-v-14982384]{margin:0;font-size:1.125rem;font-weight:600;color:var(--collapsible-card-title-color)}.collapsible-card__toggle[data-v-14982384]{background:none;border:none;padding:.25rem;cursor:pointer;color:var(--collapsible-card-icon-color);display:flex;align-items:center;justify-content:center;border-radius:.25rem;transition:background-color .2s ease}.collapsible-card__toggle[data-v-14982384]:hover{background-color:var(--collapsible-card-toggle-hover-bg)}.collapsible-card__toggle[data-v-14982384]:focus{outline:2px solid var(--collapsible-card-focus-ring);outline-offset:2px}.collapsible-card__icon[data-v-14982384]{transition:transform .2s ease}.collapsible-card__icon--collapsed[data-v-14982384]{transform:rotate(-90deg)}.collapsible-card__body[data-v-14982384]{padding:1.5rem}.collapsible-card--no-padding .collapsible-card__body[data-v-14982384]{padding:0}.collapsible-card__footer[data-v-14982384]{padding:1rem 1.5rem;border-top:1px solid var(--collapsible-card-border);background-color:var(--collapsible-card-footer-bg)}
@@ -1,20 +1,20 @@
1
- import { defineComponent as h, computed as v, createElementBlock as o, openBlock as d, normalizeClass as p, createCommentVNode as c, createElementVNode as i, renderSlot as r, unref as B, createTextVNode as k, toDisplayString as _, ref as $, withDirectives as I, vShow as V, onMounted as q, onUnmounted as w } from "vue";
2
- function m(...e) {
1
+ import { defineComponent as $, computed as y, createElementBlock as a, openBlock as s, normalizeClass as h, createCommentVNode as c, createElementVNode as r, renderSlot as p, unref as V, createTextVNode as F, toDisplayString as v, Fragment as L, renderList as j, ref as q, withDirectives as w, vShow as E, onMounted as x, onUnmounted as z } from "vue";
2
+ function B(...e) {
3
3
  return e.filter(Boolean).join(" ");
4
4
  }
5
- function Y(e, l) {
6
- let a;
5
+ function ue(e, o) {
6
+ let l;
7
7
  return function(...t) {
8
- clearTimeout(a), a = setTimeout(() => e.apply(this, t), l);
8
+ clearTimeout(l), l = setTimeout(() => e.apply(this, t), o);
9
9
  };
10
10
  }
11
- function E(e = "id") {
11
+ function S(e = "id") {
12
12
  return `${e}-${Math.random().toString(36).substr(2, 9)}`;
13
13
  }
14
- const z = ["disabled", "type"], S = {
14
+ const O = ["disabled", "type"], M = {
15
15
  key: 0,
16
16
  class: "base-button__spinner"
17
- }, x = /* @__PURE__ */ h({
17
+ }, N = /* @__PURE__ */ $({
18
18
  __name: "BaseButton",
19
19
  props: {
20
20
  variant: { default: "primary" },
@@ -25,45 +25,45 @@ const z = ["disabled", "type"], S = {
25
25
  type: { default: "button" }
26
26
  },
27
27
  emits: ["click"],
28
- setup(e, { emit: l }) {
29
- const a = e, t = l, s = v(
30
- () => m(
28
+ setup(e, { emit: o }) {
29
+ const l = e, t = o, d = y(
30
+ () => B(
31
31
  "base-button",
32
- `base-button--${a.variant}`,
33
- `base-button--${a.size}`,
34
- a.fullWidth && "base-button--full-width",
35
- a.loading && "base-button--loading",
36
- a.disabled && "base-button--disabled"
32
+ `base-button--${l.variant}`,
33
+ `base-button--${l.size}`,
34
+ l.fullWidth && "base-button--full-width",
35
+ l.loading && "base-button--loading",
36
+ l.disabled && "base-button--disabled"
37
37
  )
38
- ), u = (n) => {
39
- !a.disabled && !a.loading && t("click", n);
38
+ ), b = (n) => {
39
+ !l.disabled && !l.loading && t("click", n);
40
40
  };
41
- return (n, f) => (d(), o("button", {
42
- class: p(s.value),
41
+ return (n, _) => (s(), a("button", {
42
+ class: h(d.value),
43
43
  disabled: e.disabled || e.loading,
44
44
  type: e.type,
45
- onClick: u
45
+ onClick: b
46
46
  }, [
47
- e.loading ? (d(), o("span", S)) : c("", !0),
48
- i("span", {
49
- class: p({ "base-button__content--loading": e.loading })
47
+ e.loading ? (s(), a("span", M)) : c("", !0),
48
+ r("span", {
49
+ class: h({ "base-button__content--loading": e.loading })
50
50
  }, [
51
- r(n.$slots, "default", {}, void 0, !0)
51
+ p(n.$slots, "default", {}, void 0, !0)
52
52
  ], 2)
53
- ], 10, z));
53
+ ], 10, O));
54
54
  }
55
- }), y = (e, l) => {
56
- const a = e.__vccOpts || e;
57
- for (const [t, s] of l)
58
- a[t] = s;
59
- return a;
60
- }, Z = /* @__PURE__ */ y(x, [["__scopeId", "data-v-a4a5350a"]]), L = { class: "base-input" }, M = ["for"], N = {
55
+ }), C = (e, o) => {
56
+ const l = e.__vccOpts || e;
57
+ for (const [t, d] of o)
58
+ l[t] = d;
59
+ return l;
60
+ }, be = /* @__PURE__ */ C(N, [["__scopeId", "data-v-a4a5350a"]]), T = { class: "base-input" }, D = ["for"], W = {
61
61
  key: 0,
62
62
  class: "base-input__required"
63
- }, T = ["id", "value", "type", "placeholder", "disabled", "required"], D = {
63
+ }, U = ["id", "value", "type", "placeholder", "disabled", "required"], A = {
64
64
  key: 1,
65
65
  class: "base-input__error"
66
- }, F = /* @__PURE__ */ h({
66
+ }, G = /* @__PURE__ */ $({
67
67
  __name: "BaseInput",
68
68
  props: {
69
69
  modelValue: { default: "" },
@@ -75,52 +75,131 @@ const z = ["disabled", "type"], S = {
75
75
  error: {}
76
76
  },
77
77
  emits: ["update:modelValue", "focus", "blur"],
78
- setup(e, { emit: l }) {
79
- const a = e, t = l, s = E("base-input"), u = v(
80
- () => m(
78
+ setup(e, { emit: o }) {
79
+ const l = e, t = o, d = S("base-input"), b = y(
80
+ () => B(
81
81
  "base-input__field",
82
- a.error && "base-input__field--error",
83
- a.disabled && "base-input__field--disabled"
82
+ l.error && "base-input__field--error",
83
+ l.disabled && "base-input__field--disabled"
84
84
  )
85
- ), n = (b) => {
86
- const g = b.target;
87
- t("update:modelValue", g.value);
88
- }, f = (b) => {
89
- t("focus", b);
90
- }, C = (b) => {
91
- t("blur", b);
85
+ ), n = (f) => {
86
+ const k = f.target;
87
+ t("update:modelValue", k.value);
88
+ }, _ = (f) => {
89
+ t("focus", f);
90
+ }, I = (f) => {
91
+ t("blur", f);
92
92
  };
93
- return (b, g) => (d(), o("div", L, [
94
- e.label ? (d(), o("label", {
93
+ return (f, k) => (s(), a("div", T, [
94
+ e.label ? (s(), a("label", {
95
95
  key: 0,
96
- for: B(s),
96
+ for: V(d),
97
97
  class: "base-input__label"
98
98
  }, [
99
- k(_(e.label) + " ", 1),
100
- e.required ? (d(), o("span", N, "*")) : c("", !0)
101
- ], 8, M)) : c("", !0),
102
- i("input", {
103
- id: B(s),
99
+ F(v(e.label) + " ", 1),
100
+ e.required ? (s(), a("span", W, "*")) : c("", !0)
101
+ ], 8, D)) : c("", !0),
102
+ r("input", {
103
+ id: V(d),
104
104
  value: e.modelValue,
105
105
  type: e.type,
106
106
  placeholder: e.placeholder,
107
107
  disabled: e.disabled,
108
108
  required: e.required,
109
- class: p(u.value),
109
+ class: h(b.value),
110
110
  onInput: n,
111
+ onFocus: _,
112
+ onBlur: I
113
+ }, null, 42, U),
114
+ e.error ? (s(), a("span", A, v(e.error), 1)) : c("", !0)
115
+ ]));
116
+ }
117
+ }), fe = /* @__PURE__ */ C(G, [["__scopeId", "data-v-52f8a6e5"]]), H = { class: "base-select" }, J = ["for"], K = {
118
+ key: 0,
119
+ class: "base-select__required"
120
+ }, P = ["id", "value", "disabled", "required"], Q = {
121
+ key: 0,
122
+ value: "",
123
+ disabled: ""
124
+ }, X = ["value"], Y = {
125
+ key: 1,
126
+ class: "base-select__error"
127
+ }, Z = /* @__PURE__ */ $({
128
+ __name: "BaseSelect",
129
+ props: {
130
+ modelValue: { default: "" },
131
+ options: { default: () => [] },
132
+ placeholder: {},
133
+ disabled: { type: Boolean, default: !1 },
134
+ required: { type: Boolean, default: !1 },
135
+ label: {},
136
+ error: {},
137
+ labelField: { default: "label" },
138
+ valueField: { default: "value" }
139
+ },
140
+ emits: ["update:modelValue", "focus", "blur"],
141
+ setup(e, { emit: o }) {
142
+ const l = e, t = o, d = S("base-select"), b = y(
143
+ () => B(
144
+ "base-select__field",
145
+ l.error && "base-select__field--error",
146
+ l.disabled && "base-select__field--disabled"
147
+ )
148
+ ), n = (i) => {
149
+ if (typeof i == "object") {
150
+ const m = l.valueField || "value", u = i, g = u[m];
151
+ return g !== void 0 ? g : u.value ?? "";
152
+ }
153
+ return i;
154
+ }, _ = (i) => {
155
+ if (typeof i == "object") {
156
+ const m = l.labelField || "label", u = i, g = u[m];
157
+ return String(g !== void 0 ? g : u.label ?? "");
158
+ }
159
+ return String(i);
160
+ }, I = (i) => {
161
+ const m = i.target;
162
+ t("update:modelValue", m.value);
163
+ }, f = (i) => {
164
+ t("focus", i);
165
+ }, k = (i) => {
166
+ t("blur", i);
167
+ };
168
+ return (i, m) => (s(), a("div", H, [
169
+ e.label ? (s(), a("label", {
170
+ key: 0,
171
+ for: V(d),
172
+ class: "base-select__label"
173
+ }, [
174
+ F(v(e.label) + " ", 1),
175
+ e.required ? (s(), a("span", K, "*")) : c("", !0)
176
+ ], 8, J)) : c("", !0),
177
+ r("select", {
178
+ id: V(d),
179
+ value: e.modelValue,
180
+ disabled: e.disabled,
181
+ required: e.required,
182
+ class: h(b.value),
183
+ onChange: I,
111
184
  onFocus: f,
112
- onBlur: C
113
- }, null, 42, T),
114
- e.error ? (d(), o("span", D, _(e.error), 1)) : c("", !0)
185
+ onBlur: k
186
+ }, [
187
+ e.placeholder ? (s(), a("option", Q, v(e.placeholder), 1)) : c("", !0),
188
+ (s(!0), a(L, null, j(e.options, (u) => (s(), a("option", {
189
+ key: n(u),
190
+ value: n(u)
191
+ }, v(_(u)), 9, X))), 128))
192
+ ], 42, P),
193
+ e.error ? (s(), a("span", Y, v(e.error), 1)) : c("", !0)
115
194
  ]));
116
195
  }
117
- }), R = /* @__PURE__ */ y(F, [["__scopeId", "data-v-52f8a6e5"]]), O = {
196
+ }), ve = /* @__PURE__ */ C(Z, [["__scopeId", "data-v-4d5c982a"]]), R = {
118
197
  key: 0,
119
198
  class: "base-card__header"
120
- }, W = { class: "base-card__title" }, j = { class: "base-card__body" }, U = {
199
+ }, ee = { class: "base-card__title" }, te = { class: "base-card__body" }, le = {
121
200
  key: 1,
122
201
  class: "base-card__footer"
123
- }, A = /* @__PURE__ */ h({
202
+ }, ae = /* @__PURE__ */ $({
124
203
  __name: "BaseCard",
125
204
  props: {
126
205
  title: {},
@@ -128,29 +207,29 @@ const z = ["disabled", "type"], S = {
128
207
  padding: { type: Boolean, default: !0 }
129
208
  },
130
209
  setup(e) {
131
- const l = e, a = v(
132
- () => m(l.elevated && "base-card--elevated", !l.padding && "base-card--no-padding")
210
+ const o = e, l = y(
211
+ () => B(o.elevated && "base-card--elevated", !o.padding && "base-card--no-padding")
133
212
  );
134
- return (t, s) => (d(), o("div", {
135
- class: p(["base-card", a.value])
213
+ return (t, d) => (s(), a("div", {
214
+ class: h(["base-card", l.value])
136
215
  }, [
137
- t.$slots.header || e.title ? (d(), o("div", O, [
138
- r(t.$slots, "header", {}, () => [
139
- i("h3", W, _(e.title), 1)
216
+ t.$slots.header || e.title ? (s(), a("div", R, [
217
+ p(t.$slots, "header", {}, () => [
218
+ r("h3", ee, v(e.title), 1)
140
219
  ], !0)
141
220
  ])) : c("", !0),
142
- i("div", j, [
143
- r(t.$slots, "default", {}, void 0, !0)
221
+ r("div", te, [
222
+ p(t.$slots, "default", {}, void 0, !0)
144
223
  ]),
145
- t.$slots.footer ? (d(), o("div", U, [
146
- r(t.$slots, "footer", {}, void 0, !0)
224
+ t.$slots.footer ? (s(), a("div", le, [
225
+ p(t.$slots, "footer", {}, void 0, !0)
147
226
  ])) : c("", !0)
148
227
  ], 2));
149
228
  }
150
- }), ee = /* @__PURE__ */ y(A, [["__scopeId", "data-v-80b8fdda"]]), G = { class: "collapsible-card__header-content" }, H = { class: "collapsible-card__title" }, J = ["aria-label", "aria-expanded"], K = { class: "collapsible-card__body" }, P = {
229
+ }), _e = /* @__PURE__ */ C(ae, [["__scopeId", "data-v-80b8fdda"]]), se = { class: "collapsible-card__header-content" }, oe = { class: "collapsible-card__title" }, de = ["aria-label", "aria-expanded"], ne = { class: "collapsible-card__body" }, ie = {
151
230
  key: 0,
152
231
  class: "collapsible-card__footer"
153
- }, Q = /* @__PURE__ */ h({
232
+ }, re = /* @__PURE__ */ $({
154
233
  __name: "CollapsibleCard",
155
234
  props: {
156
235
  title: {},
@@ -158,92 +237,93 @@ const z = ["disabled", "type"], S = {
158
237
  padding: { type: Boolean, default: !0 },
159
238
  initiallyCollapsed: { type: Boolean, default: !0 }
160
239
  },
161
- setup(e, { expose: l }) {
162
- const a = e, t = $(a.initiallyCollapsed), s = () => {
240
+ setup(e, { expose: o }) {
241
+ const l = e, t = q(l.initiallyCollapsed), d = () => {
163
242
  t.value = !t.value;
164
- }, u = v(
165
- () => m(
166
- a.elevated && "collapsible-card--elevated",
167
- !a.padding && "collapsible-card--no-padding"
243
+ }, b = y(
244
+ () => B(
245
+ l.elevated && "collapsible-card--elevated",
246
+ !l.padding && "collapsible-card--no-padding"
168
247
  )
169
248
  );
170
- return l({
171
- toggle: s,
249
+ return o({
250
+ toggle: d,
172
251
  isCollapsed: t
173
- }), (n, f) => (d(), o("div", {
174
- class: p(["collapsible-card", u.value])
252
+ }), (n, _) => (s(), a("div", {
253
+ class: h(["collapsible-card", b.value])
175
254
  }, [
176
- i("div", {
255
+ r("div", {
177
256
  class: "collapsible-card__header",
178
- onClick: s
257
+ onClick: d
179
258
  }, [
180
- i("div", G, [
181
- r(n.$slots, "header", {}, () => [
182
- i("h3", H, _(e.title), 1)
259
+ r("div", se, [
260
+ p(n.$slots, "header", {}, () => [
261
+ r("h3", oe, v(e.title), 1)
183
262
  ], !0)
184
263
  ]),
185
- i("button", {
264
+ r("button", {
186
265
  type: "button",
187
266
  class: "collapsible-card__toggle",
188
267
  "aria-label": t.value ? "Expand" : "Collapse",
189
268
  "aria-expanded": !t.value
190
269
  }, [
191
- (d(), o("svg", {
192
- class: p(["collapsible-card__icon", { "collapsible-card__icon--collapsed": t.value }]),
270
+ (s(), a("svg", {
271
+ class: h(["collapsible-card__icon", { "collapsible-card__icon--collapsed": t.value }]),
193
272
  width: "20",
194
273
  height: "20",
195
274
  viewBox: "0 0 20 20",
196
275
  fill: "currentColor"
197
- }, [...f[0] || (f[0] = [
198
- i("path", {
276
+ }, [..._[0] || (_[0] = [
277
+ r("path", {
199
278
  "fill-rule": "evenodd",
200
279
  d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z",
201
280
  "clip-rule": "evenodd"
202
281
  }, null, -1)
203
282
  ])], 2))
204
- ], 8, J)
283
+ ], 8, de)
205
284
  ]),
206
- I(i("div", K, [
207
- r(n.$slots, "default", {}, void 0, !0)
285
+ w(r("div", ne, [
286
+ p(n.$slots, "default", {}, void 0, !0)
208
287
  ], 512), [
209
- [V, !t.value]
288
+ [E, !t.value]
210
289
  ]),
211
- n.$slots.footer && !t.value ? (d(), o("div", P, [
212
- r(n.$slots, "footer", {}, void 0, !0)
290
+ n.$slots.footer && !t.value ? (s(), a("div", ie, [
291
+ p(n.$slots, "footer", {}, void 0, !0)
213
292
  ])) : c("", !0)
214
293
  ], 2));
215
294
  }
216
- }), te = /* @__PURE__ */ y(Q, [["__scopeId", "data-v-489edb19"]]);
217
- function ae(e, l) {
218
- const a = $(e), t = $(null), s = v(() => t.value === null);
295
+ }), pe = /* @__PURE__ */ C(re, [["__scopeId", "data-v-14982384"]]);
296
+ function he(e, o) {
297
+ const l = q(e), t = q(null), d = y(() => t.value === null);
219
298
  return {
220
- value: a,
299
+ value: l,
221
300
  error: t,
222
- isValid: s,
223
- validate: () => (t.value = l(a.value), s.value),
301
+ isValid: d,
302
+ validate: () => (t.value = o(l.value), d.value),
224
303
  reset: () => {
225
- a.value = e, t.value = null;
304
+ l.value = e, t.value = null;
226
305
  }
227
306
  };
228
307
  }
229
- function le(e, l) {
230
- const a = (t) => {
231
- e.value && !e.value.contains(t.target) && l();
308
+ function me(e, o) {
309
+ const l = (t) => {
310
+ e.value && !e.value.contains(t.target) && o();
232
311
  };
233
- q(() => {
234
- document.addEventListener("click", a);
235
- }), w(() => {
236
- document.removeEventListener("click", a);
312
+ x(() => {
313
+ document.addEventListener("click", l);
314
+ }), z(() => {
315
+ document.removeEventListener("click", l);
237
316
  });
238
317
  }
239
318
  export {
240
- Z as BaseButton,
241
- ee as BaseCard,
242
- R as BaseInput,
243
- te as CollapsibleCard,
244
- m as cn,
245
- Y as debounce,
246
- E as generateId,
247
- le as useClickOutside,
248
- ae as useValidation
319
+ be as BaseButton,
320
+ _e as BaseCard,
321
+ fe as BaseInput,
322
+ ve as BaseSelect,
323
+ pe as CollapsibleCard,
324
+ B as cn,
325
+ ue as debounce,
326
+ S as generateId,
327
+ me as useClickOutside,
328
+ he as useValidation
249
329
  };
@@ -1 +1 @@
1
- (function(n,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(n=typeof globalThis<"u"?globalThis:n||self,e(n.VueComponentLibrary={},n.Vue))})(this,(function(n,e){"use strict";function r(...t){return t.filter(Boolean).join(" ")}function b(t,o){let a;return function(...l){clearTimeout(a),a=setTimeout(()=>t.apply(this,l),o)}}function m(t="id"){return`${t}-${Math.random().toString(36).substr(2,9)}`}const _=["disabled","type"],B={key:0,class:"base-button__spinner"},h=e.defineComponent({__name:"BaseButton",props:{variant:{default:"primary"},size:{default:"medium"},disabled:{type:Boolean,default:!1},fullWidth:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},type:{default:"button"}},emits:["click"],setup(t,{emit:o}){const a=t,l=o,s=e.computed(()=>r("base-button",`base-button--${a.variant}`,`base-button--${a.size}`,a.fullWidth&&"base-button--full-width",a.loading&&"base-button--loading",a.disabled&&"base-button--disabled")),c=d=>{!a.disabled&&!a.loading&&l("click",d)};return(d,u)=>(e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(s.value),disabled:t.disabled||t.loading,type:t.type,onClick:c},[t.loading?(e.openBlock(),e.createElementBlock("span",B)):e.createCommentVNode("",!0),e.createElementVNode("span",{class:e.normalizeClass({"base-button__content--loading":t.loading})},[e.renderSlot(d.$slots,"default",{},void 0,!0)],2)],10,_))}}),p=(t,o)=>{const a=t.__vccOpts||t;for(const[l,s]of o)a[l]=s;return a},k=p(h,[["__scopeId","data-v-a4a5350a"]]),y={class:"base-input"},C=["for"],g={key:0,class:"base-input__required"},$=["id","value","type","placeholder","disabled","required"],V={key:1,class:"base-input__error"},E=p(e.defineComponent({__name:"BaseInput",props:{modelValue:{default:""},type:{default:"text"},placeholder:{},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},label:{},error:{}},emits:["update:modelValue","focus","blur"],setup(t,{emit:o}){const a=t,l=o,s=m("base-input"),c=e.computed(()=>r("base-input__field",a.error&&"base-input__field--error",a.disabled&&"base-input__field--disabled")),d=i=>{const f=i.target;l("update:modelValue",f.value)},u=i=>{l("focus",i)},W=i=>{l("blur",i)};return(i,f)=>(e.openBlock(),e.createElementBlock("div",y,[t.label?(e.openBlock(),e.createElementBlock("label",{key:0,for:e.unref(s),class:"base-input__label"},[e.createTextVNode(e.toDisplayString(t.label)+" ",1),t.required?(e.openBlock(),e.createElementBlock("span",g,"*")):e.createCommentVNode("",!0)],8,C)):e.createCommentVNode("",!0),e.createElementVNode("input",{id:e.unref(s),value:t.modelValue,type:t.type,placeholder:t.placeholder,disabled:t.disabled,required:t.required,class:e.normalizeClass(c.value),onInput:d,onFocus:u,onBlur:W},null,42,$),t.error?(e.openBlock(),e.createElementBlock("span",V,e.toDisplayString(t.error),1)):e.createCommentVNode("",!0)]))}}),[["__scopeId","data-v-52f8a6e5"]]),N={key:0,class:"base-card__header"},S={class:"base-card__title"},I={class:"base-card__body"},z={key:1,class:"base-card__footer"},q=p(e.defineComponent({__name:"BaseCard",props:{title:{},elevated:{type:Boolean,default:!1},padding:{type:Boolean,default:!0}},setup(t){const o=t,a=e.computed(()=>r(o.elevated&&"base-card--elevated",!o.padding&&"base-card--no-padding"));return(l,s)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["base-card",a.value])},[l.$slots.header||t.title?(e.openBlock(),e.createElementBlock("div",N,[e.renderSlot(l.$slots,"header",{},()=>[e.createElementVNode("h3",S,e.toDisplayString(t.title),1)],!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",I,[e.renderSlot(l.$slots,"default",{},void 0,!0)]),l.$slots.footer?(e.openBlock(),e.createElementBlock("div",z,[e.renderSlot(l.$slots,"footer",{},void 0,!0)])):e.createCommentVNode("",!0)],2))}}),[["__scopeId","data-v-80b8fdda"]]),T={class:"collapsible-card__header-content"},w={class:"collapsible-card__title"},D=["aria-label","aria-expanded"],L={class:"collapsible-card__body"},M={key:0,class:"collapsible-card__footer"},O=p(e.defineComponent({__name:"CollapsibleCard",props:{title:{},elevated:{type:Boolean,default:!1},padding:{type:Boolean,default:!0},initiallyCollapsed:{type:Boolean,default:!0}},setup(t,{expose:o}){const a=t,l=e.ref(a.initiallyCollapsed),s=()=>{l.value=!l.value},c=e.computed(()=>r(a.elevated&&"collapsible-card--elevated",!a.padding&&"collapsible-card--no-padding"));return o({toggle:s,isCollapsed:l}),(d,u)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["collapsible-card",c.value])},[e.createElementVNode("div",{class:"collapsible-card__header",onClick:s},[e.createElementVNode("div",T,[e.renderSlot(d.$slots,"header",{},()=>[e.createElementVNode("h3",w,e.toDisplayString(t.title),1)],!0)]),e.createElementVNode("button",{type:"button",class:"collapsible-card__toggle","aria-label":l.value?"Expand":"Collapse","aria-expanded":!l.value},[(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["collapsible-card__icon",{"collapsible-card__icon--collapsed":l.value}]),width:"20",height:"20",viewBox:"0 0 20 20",fill:"currentColor"},[...u[0]||(u[0]=[e.createElementVNode("path",{"fill-rule":"evenodd",d:"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z","clip-rule":"evenodd"},null,-1)])],2))],8,D)]),e.withDirectives(e.createElementVNode("div",L,[e.renderSlot(d.$slots,"default",{},void 0,!0)],512),[[e.vShow,!l.value]]),d.$slots.footer&&!l.value?(e.openBlock(),e.createElementBlock("div",M,[e.renderSlot(d.$slots,"footer",{},void 0,!0)])):e.createCommentVNode("",!0)],2))}}),[["__scopeId","data-v-489edb19"]]);function j(t,o){const a=e.ref(t),l=e.ref(null),s=e.computed(()=>l.value===null);return{value:a,error:l,isValid:s,validate:()=>(l.value=o(a.value),s.value),reset:()=>{a.value=t,l.value=null}}}function F(t,o){const a=l=>{t.value&&!t.value.contains(l.target)&&o()};e.onMounted(()=>{document.addEventListener("click",a)}),e.onUnmounted(()=>{document.removeEventListener("click",a)})}n.BaseButton=k,n.BaseCard=q,n.BaseInput=E,n.CollapsibleCard=O,n.cn=r,n.debounce=b,n.generateId=m,n.useClickOutside=F,n.useValidation=j,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(n,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(n=typeof globalThis<"u"?globalThis:n||self,e(n.VueComponentLibrary={},n.Vue))})(this,(function(n,e){"use strict";function b(...t){return t.filter(Boolean).join(" ")}function y(t,o){let a;return function(...l){clearTimeout(a),a=setTimeout(()=>t.apply(this,l),o)}}function h(t="id"){return`${t}-${Math.random().toString(36).substr(2,9)}`}const C=["disabled","type"],g={key:0,class:"base-button__spinner"},V=e.defineComponent({__name:"BaseButton",props:{variant:{default:"primary"},size:{default:"medium"},disabled:{type:Boolean,default:!1},fullWidth:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},type:{default:"button"}},emits:["click"],setup(t,{emit:o}){const a=t,l=o,s=e.computed(()=>b("base-button",`base-button--${a.variant}`,`base-button--${a.size}`,a.fullWidth&&"base-button--full-width",a.loading&&"base-button--loading",a.disabled&&"base-button--disabled")),i=d=>{!a.disabled&&!a.loading&&l("click",d)};return(d,m)=>(e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(s.value),disabled:t.disabled||t.loading,type:t.type,onClick:i},[t.loading?(e.openBlock(),e.createElementBlock("span",g)):e.createCommentVNode("",!0),e.createElementVNode("span",{class:e.normalizeClass({"base-button__content--loading":t.loading})},[e.renderSlot(d.$slots,"default",{},void 0,!0)],2)],10,C))}}),p=(t,o)=>{const a=t.__vccOpts||t;for(const[l,s]of o)a[l]=s;return a},$=p(V,[["__scopeId","data-v-a4a5350a"]]),E={class:"base-input"},S=["for"],N={key:0,class:"base-input__required"},I=["id","value","type","placeholder","disabled","required"],q={key:1,class:"base-input__error"},F=p(e.defineComponent({__name:"BaseInput",props:{modelValue:{default:""},type:{default:"text"},placeholder:{},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},label:{},error:{}},emits:["update:modelValue","focus","blur"],setup(t,{emit:o}){const a=t,l=o,s=h("base-input"),i=e.computed(()=>b("base-input__field",a.error&&"base-input__field--error",a.disabled&&"base-input__field--disabled")),d=u=>{const B=u.target;l("update:modelValue",B.value)},m=u=>{l("focus",u)},k=u=>{l("blur",u)};return(u,B)=>(e.openBlock(),e.createElementBlock("div",E,[t.label?(e.openBlock(),e.createElementBlock("label",{key:0,for:e.unref(s),class:"base-input__label"},[e.createTextVNode(e.toDisplayString(t.label)+" ",1),t.required?(e.openBlock(),e.createElementBlock("span",N,"*")):e.createCommentVNode("",!0)],8,S)):e.createCommentVNode("",!0),e.createElementVNode("input",{id:e.unref(s),value:t.modelValue,type:t.type,placeholder:t.placeholder,disabled:t.disabled,required:t.required,class:e.normalizeClass(i.value),onInput:d,onFocus:m,onBlur:k},null,42,I),t.error?(e.openBlock(),e.createElementBlock("span",q,e.toDisplayString(t.error),1)):e.createCommentVNode("",!0)]))}}),[["__scopeId","data-v-52f8a6e5"]]),z={class:"base-select"},D=["for"],j={key:0,class:"base-select__required"},L=["id","value","disabled","required"],T={key:0,value:"",disabled:""},O=["value"],w={key:1,class:"base-select__error"},M=p(e.defineComponent({__name:"BaseSelect",props:{modelValue:{default:""},options:{default:()=>[]},placeholder:{},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},label:{},error:{},labelField:{default:"label"},valueField:{default:"value"}},emits:["update:modelValue","focus","blur"],setup(t,{emit:o}){const a=t,l=o,s=h("base-select"),i=e.computed(()=>b("base-select__field",a.error&&"base-select__field--error",a.disabled&&"base-select__field--disabled")),d=c=>{if(typeof c=="object"){const f=a.valueField||"value",r=c,_=r[f];return _!==void 0?_:r.value??""}return c},m=c=>{if(typeof c=="object"){const f=a.labelField||"label",r=c,_=r[f];return String(_!==void 0?_:r.label??"")}return String(c)},k=c=>{const f=c.target;l("update:modelValue",f.value)},u=c=>{l("focus",c)},B=c=>{l("blur",c)};return(c,f)=>(e.openBlock(),e.createElementBlock("div",z,[t.label?(e.openBlock(),e.createElementBlock("label",{key:0,for:e.unref(s),class:"base-select__label"},[e.createTextVNode(e.toDisplayString(t.label)+" ",1),t.required?(e.openBlock(),e.createElementBlock("span",j,"*")):e.createCommentVNode("",!0)],8,D)):e.createCommentVNode("",!0),e.createElementVNode("select",{id:e.unref(s),value:t.modelValue,disabled:t.disabled,required:t.required,class:e.normalizeClass(i.value),onChange:k,onFocus:u,onBlur:B},[t.placeholder?(e.openBlock(),e.createElementBlock("option",T,e.toDisplayString(t.placeholder),1)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.options,r=>(e.openBlock(),e.createElementBlock("option",{key:d(r),value:d(r)},e.toDisplayString(m(r)),9,O))),128))],42,L),t.error?(e.openBlock(),e.createElementBlock("span",w,e.toDisplayString(t.error),1)):e.createCommentVNode("",!0)]))}}),[["__scopeId","data-v-4d5c982a"]]),W={key:0,class:"base-card__header"},P={class:"base-card__title"},U={class:"base-card__body"},A={key:1,class:"base-card__footer"},G=p(e.defineComponent({__name:"BaseCard",props:{title:{},elevated:{type:Boolean,default:!1},padding:{type:Boolean,default:!0}},setup(t){const o=t,a=e.computed(()=>b(o.elevated&&"base-card--elevated",!o.padding&&"base-card--no-padding"));return(l,s)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["base-card",a.value])},[l.$slots.header||t.title?(e.openBlock(),e.createElementBlock("div",W,[e.renderSlot(l.$slots,"header",{},()=>[e.createElementVNode("h3",P,e.toDisplayString(t.title),1)],!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",U,[e.renderSlot(l.$slots,"default",{},void 0,!0)]),l.$slots.footer?(e.openBlock(),e.createElementBlock("div",A,[e.renderSlot(l.$slots,"footer",{},void 0,!0)])):e.createCommentVNode("",!0)],2))}}),[["__scopeId","data-v-80b8fdda"]]),H={class:"collapsible-card__header-content"},J={class:"collapsible-card__title"},K=["aria-label","aria-expanded"],Q={class:"collapsible-card__body"},X={key:0,class:"collapsible-card__footer"},Y=p(e.defineComponent({__name:"CollapsibleCard",props:{title:{},elevated:{type:Boolean,default:!1},padding:{type:Boolean,default:!0},initiallyCollapsed:{type:Boolean,default:!0}},setup(t,{expose:o}){const a=t,l=e.ref(a.initiallyCollapsed),s=()=>{l.value=!l.value},i=e.computed(()=>b(a.elevated&&"collapsible-card--elevated",!a.padding&&"collapsible-card--no-padding"));return o({toggle:s,isCollapsed:l}),(d,m)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["collapsible-card",i.value])},[e.createElementVNode("div",{class:"collapsible-card__header",onClick:s},[e.createElementVNode("div",H,[e.renderSlot(d.$slots,"header",{},()=>[e.createElementVNode("h3",J,e.toDisplayString(t.title),1)],!0)]),e.createElementVNode("button",{type:"button",class:"collapsible-card__toggle","aria-label":l.value?"Expand":"Collapse","aria-expanded":!l.value},[(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["collapsible-card__icon",{"collapsible-card__icon--collapsed":l.value}]),width:"20",height:"20",viewBox:"0 0 20 20",fill:"currentColor"},[...m[0]||(m[0]=[e.createElementVNode("path",{"fill-rule":"evenodd",d:"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z","clip-rule":"evenodd"},null,-1)])],2))],8,K)]),e.withDirectives(e.createElementVNode("div",Q,[e.renderSlot(d.$slots,"default",{},void 0,!0)],512),[[e.vShow,!l.value]]),d.$slots.footer&&!l.value?(e.openBlock(),e.createElementBlock("div",X,[e.renderSlot(d.$slots,"footer",{},void 0,!0)])):e.createCommentVNode("",!0)],2))}}),[["__scopeId","data-v-14982384"]]);function Z(t,o){const a=e.ref(t),l=e.ref(null),s=e.computed(()=>l.value===null);return{value:a,error:l,isValid:s,validate:()=>(l.value=o(a.value),s.value),reset:()=>{a.value=t,l.value=null}}}function R(t,o){const a=l=>{t.value&&!t.value.contains(l.target)&&o()};e.onMounted(()=>{document.addEventListener("click",a)}),e.onUnmounted(()=>{document.removeEventListener("click",a)})}n.BaseButton=$,n.BaseCard=G,n.BaseInput=F,n.BaseSelect=M,n.CollapsibleCard=Y,n.cn=b,n.debounce=y,n.generateId=h,n.useClickOutside=R,n.useValidation=Z,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allsrvsonline/vue-component-library",
3
- "version": "0.2.0",
3
+ "version": "0.3.2",
4
4
  "type": "module",
5
5
  "main": "./dist/vue-component-library.umd.js",
6
6
  "module": "./dist/vue-component-library.es.js",
@@ -30,12 +30,20 @@
30
30
  "format": "prettier --write \"src/**/*.{ts,tsx,vue,json}\"",
31
31
  "test": "vitest",
32
32
  "test:ui": "vitest --ui",
33
- "type-check": "vue-tsc --noEmit"
33
+ "type-check": "vue-tsc --noEmit",
34
+ "tag": "git tag v%npm_package_version% && git push origin v%npm_package_version%",
35
+ "release": "standard-version",
36
+ "release:patch": "standard-version --release-as patch",
37
+ "release:minor": "standard-version --release-as minor",
38
+ "release:major": "standard-version --release-as major",
39
+ "release:dry-run": "standard-version --dry-run"
34
40
  },
35
41
  "dependencies": {
36
42
  "vue": "^3.5.24"
37
43
  },
38
44
  "devDependencies": {
45
+ "@commitlint/cli": "^20.3.0",
46
+ "@commitlint/config-conventional": "^20.3.0",
39
47
  "@types/node": "^24.10.1",
40
48
  "@typescript-eslint/eslint-plugin": "^8.51.0",
41
49
  "@typescript-eslint/parser": "^8.51.0",
@@ -48,6 +56,7 @@
48
56
  "eslint-plugin-vue": "^10.6.2",
49
57
  "happy-dom": "^20.0.11",
50
58
  "prettier": "^3.7.4",
59
+ "standard-version": "^9.5.0",
51
60
  "typescript": "~5.9.3",
52
61
  "vite": "^7.2.4",
53
62
  "vite-plugin-dts": "^4.5.4",