cisse-vue-ui 0.1.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +162 -8
  2. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js +54 -0
  3. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js.map +1 -0
  4. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs +53 -0
  5. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs.map +1 -0
  6. package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs → CollapsibleCard.vue_vue_type_script_setup_true_lang-Cs6KGC-0.cjs} +398 -79
  7. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Cs6KGC-0.cjs.map +1 -0
  8. package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js → CollapsibleCard.vue_vue_type_script_setup_true_lang-DTGAuLCh.js} +406 -87
  9. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-DTGAuLCh.js.map +1 -0
  10. package/dist/{Checkbox.vue_vue_type_script_setup_true_lang-DVkcMcSN.js → Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js} +46 -95
  11. package/dist/Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js.map +1 -0
  12. package/dist/{Checkbox.vue_vue_type_script_setup_true_lang-DQD2I1Wk.cjs → Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs} +46 -95
  13. package/dist/Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs.map +1 -0
  14. package/dist/components/core/MobileList.vue.d.ts +80 -0
  15. package/dist/components/core/ResponsiveList.vue.d.ts +115 -0
  16. package/dist/components/core/TableComponent.vue.d.ts +26 -28
  17. package/dist/components/core/index.cjs +11 -9
  18. package/dist/components/core/index.cjs.map +1 -1
  19. package/dist/components/core/index.d.ts +4 -0
  20. package/dist/components/core/index.js +11 -9
  21. package/dist/components/form/index.cjs +10 -9
  22. package/dist/components/form/index.cjs.map +1 -1
  23. package/dist/components/form/index.js +3 -2
  24. package/dist/components/form/index.js.map +1 -1
  25. package/dist/components/index.cjs +21 -18
  26. package/dist/components/index.cjs.map +1 -1
  27. package/dist/components/index.js +18 -15
  28. package/dist/components/index.js.map +1 -1
  29. package/dist/index-Ck4eaNes.js +51 -0
  30. package/dist/index-Ck4eaNes.js.map +1 -0
  31. package/dist/{index-BW9nN-BL.cjs → index-c27X2k2e.cjs} +22 -19
  32. package/dist/index-c27X2k2e.cjs.map +1 -0
  33. package/dist/index.cjs +22 -19
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.js +19 -16
  36. package/dist/index.js.map +1 -1
  37. package/dist/style.css +1 -1
  38. package/dist/types/form.d.ts +2 -0
  39. package/package.json +1 -1
  40. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DQD2I1Wk.cjs.map +0 -1
  41. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DVkcMcSN.js.map +0 -1
  42. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs.map +0 -1
  43. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js.map +0 -1
  44. package/dist/index-BQb_cz3-.js +0 -48
  45. package/dist/index-BQb_cz3-.js.map +0 -1
  46. package/dist/index-BW9nN-BL.cjs.map +0 -1
package/README.md CHANGED
@@ -92,7 +92,9 @@ app.use(VueTailwindUI, { components: ['Button', 'CardComponent'] })
92
92
  |-----------|-------------|
93
93
  | `Button` | Button with variants (primary, secondary, outline, ghost, danger, success), sizes, icons, loading state |
94
94
  | `CardComponent` | Card container with header, content, and footer slots |
95
- | `TableComponent` | Data table with sorting, actions, and custom column rendering |
95
+ | `TableComponent` | Data table with sorting, selection, actions, and custom column rendering |
96
+ | `MobileList` | Mobile-optimized card-based list with selection support |
97
+ | `ResponsiveList` | Combines MobileList (mobile) and TableComponent (desktop) with automatic breakpoint switching |
96
98
  | `Tabs` | Tab navigation with variants (underline, pills, boxed) |
97
99
  | `TabPanel` | Tab content panel (use with Tabs) |
98
100
  | `Dropdown` | Dropdown menu with items, icons, and dividers |
@@ -339,27 +341,41 @@ const steps = [
339
341
 
340
342
  ```vue
341
343
  <script setup>
344
+ import { ref } from 'vue'
342
345
  import { TableComponent } from 'cisse-vue-ui'
343
346
 
344
347
  const properties = [
345
- { key: 'name', label: 'Name', sortable: true },
346
- { key: 'email', label: 'Email' },
347
- { key: 'role', label: 'Role', type: 'badge' }
348
+ { name: 'name', label: 'Name', main: true },
349
+ { name: 'email', label: 'Email' },
350
+ { name: 'role', label: 'Role', type: 'badge' }
348
351
  ]
349
352
 
350
- const data = [
353
+ const items = [
351
354
  { id: 1, name: 'John Doe', email: 'john@example.com', role: 'Admin' },
352
355
  { id: 2, name: 'Jane Smith', email: 'jane@example.com', role: 'User' }
353
356
  ]
357
+
358
+ // Selection support
359
+ const selectedItems = ref(new Set())
360
+ const toggleSelect = (id) => {
361
+ if (selectedItems.value.has(id)) {
362
+ selectedItems.value.delete(id)
363
+ } else {
364
+ selectedItems.value.add(id)
365
+ }
366
+ }
354
367
  </script>
355
368
 
356
369
  <template>
357
370
  <TableComponent
358
371
  :properties="properties"
359
- :data="data"
360
- :loading="false"
372
+ :items="items"
373
+ selectable
374
+ :selected-items="selectedItems"
375
+ @select="toggleSelect"
376
+ @select-all="toggleSelectAll"
361
377
  >
362
- <template #actions="{ item }">
378
+ <template #action="{ item }">
363
379
  <TableAction icon="lucide:edit" @click="edit(item)" />
364
380
  <TableAction icon="lucide:trash" variant="danger" @click="delete(item)" />
365
381
  </template>
@@ -367,6 +383,144 @@ const data = [
367
383
  </template>
368
384
  ```
369
385
 
386
+ ### ResponsiveList
387
+
388
+ A component that automatically switches between a mobile card layout and a desktop table layout based on screen size.
389
+
390
+ ```vue
391
+ <script setup>
392
+ import { ref } from 'vue'
393
+ import { ResponsiveList } from 'cisse-vue-ui'
394
+
395
+ const columns = [
396
+ { key: 'name', label: 'Name' },
397
+ { key: 'email', label: 'Email' },
398
+ { key: 'status', label: 'Status' }
399
+ ]
400
+
401
+ const items = [
402
+ { id: 1, name: 'John Doe', email: 'john@example.com', status: 'active' },
403
+ { id: 2, name: 'Jane Smith', email: 'jane@example.com', status: 'inactive' }
404
+ ]
405
+
406
+ const selectedItems = ref(new Set())
407
+
408
+ const toggleSelect = (id) => {
409
+ if (selectedItems.value.has(id)) {
410
+ selectedItems.value.delete(id)
411
+ } else {
412
+ selectedItems.value.add(id)
413
+ }
414
+ }
415
+
416
+ const toggleSelectAll = () => {
417
+ if (selectedItems.value.size === items.length) {
418
+ selectedItems.value.clear()
419
+ } else {
420
+ items.forEach(item => selectedItems.value.add(String(item.id)))
421
+ }
422
+ }
423
+ </script>
424
+
425
+ <template>
426
+ <ResponsiveList
427
+ :items="items"
428
+ :columns="columns"
429
+ key-field="id"
430
+ selectable
431
+ :selected-items="selectedItems"
432
+ breakpoint="lg"
433
+ @select="toggleSelect"
434
+ @select-all="toggleSelectAll"
435
+ >
436
+ <!-- Mobile view: avatar -->
437
+ <template #avatar="{ item }">
438
+ <div class="w-10 h-10 rounded-full bg-primary-500 flex items-center justify-center text-white">
439
+ {{ item.name[0] }}
440
+ </div>
441
+ </template>
442
+
443
+ <!-- Mobile view: content -->
444
+ <template #mobileContent="{ item }">
445
+ <h3 class="font-semibold">{{ item.name }}</h3>
446
+ <p class="text-sm text-gray-500">{{ item.email }}</p>
447
+ </template>
448
+
449
+ <!-- Mobile view: actions -->
450
+ <template #mobileActions="{ item }">
451
+ <button @click="viewItem(item)">View</button>
452
+ </template>
453
+
454
+ <!-- Desktop table: custom cell rendering -->
455
+ <template #cell-name="{ item }">
456
+ <span class="font-medium">{{ item.name }}</span>
457
+ </template>
458
+
459
+ <template #cell-status="{ item }">
460
+ <span :class="item.status === 'active' ? 'text-green-600' : 'text-red-600'">
461
+ {{ item.status }}
462
+ </span>
463
+ </template>
464
+
465
+ <!-- Desktop table: actions column -->
466
+ <template #actions="{ item }">
467
+ <Button size="sm" variant="ghost" @click="edit(item)">Edit</Button>
468
+ </template>
469
+
470
+ <!-- Empty state -->
471
+ <template #empty>
472
+ <EmptyState title="No items" message="No items to display" />
473
+ </template>
474
+ </ResponsiveList>
475
+ </template>
476
+ ```
477
+
478
+ #### ResponsiveList Props
479
+
480
+ | Prop | Type | Default | Description |
481
+ |------|------|---------|-------------|
482
+ | `items` | `Array` | required | Array of items to display |
483
+ | `columns` | `Array` | required | Column definitions with `key` or `name`, `label`, and optional `type` |
484
+ | `keyField` | `string` | `'id'` | Field to use as unique key for items |
485
+ | `selectable` | `boolean` | `false` | Enable selection mode |
486
+ | `selectedItems` | `Set<string>` | - | Set of selected item keys |
487
+ | `selectableFilter` | `Function` | - | Filter function to determine if an item is selectable |
488
+ | `breakpoint` | `string` | `'lg'` | Breakpoint for switching views: `'sm'`, `'md'`, `'lg'`, `'xl'`, `'2xl'` |
489
+
490
+ ### MobileList
491
+
492
+ A mobile-optimized card-based list component with selection support.
493
+
494
+ ```vue
495
+ <script setup>
496
+ import { MobileList } from 'cisse-vue-ui'
497
+ </script>
498
+
499
+ <template>
500
+ <MobileList
501
+ :items="items"
502
+ key-field="id"
503
+ selectable
504
+ :selected-items="selectedItems"
505
+ @select="toggleSelect"
506
+ @select-all="toggleSelectAll"
507
+ >
508
+ <template #avatar="{ item }">
509
+ <div class="w-12 h-12 rounded-full bg-blue-500" />
510
+ </template>
511
+
512
+ <template #content="{ item }">
513
+ <h3>{{ item.name }}</h3>
514
+ <p>{{ item.description }}</p>
515
+ </template>
516
+
517
+ <template #actions="{ item }">
518
+ <button>View</button>
519
+ </template>
520
+ </MobileList>
521
+ </template>
522
+ ```
523
+
370
524
  ### MenuItem
371
525
 
372
526
  ```vue
@@ -0,0 +1,54 @@
1
+ import { defineComponent, createElementBlock, openBlock, normalizeClass, createElementVNode, createCommentVNode, toDisplayString } from "vue";
2
+ const _hoisted_1 = ["checked", "disabled", "indeterminate"];
3
+ const _hoisted_2 = {
4
+ key: 0,
5
+ class: "flex flex-col"
6
+ };
7
+ const _hoisted_3 = {
8
+ key: 0,
9
+ class: "text-sm font-medium text-gray-900 dark:text-white"
10
+ };
11
+ const _hoisted_4 = {
12
+ key: 1,
13
+ class: "text-sm text-gray-500 dark:text-gray-400"
14
+ };
15
+ const _sfc_main = /* @__PURE__ */ defineComponent({
16
+ __name: "Checkbox",
17
+ props: {
18
+ modelValue: { type: Boolean, default: false },
19
+ label: {},
20
+ description: {},
21
+ disabled: { type: Boolean },
22
+ indeterminate: { type: Boolean }
23
+ },
24
+ emits: ["update:modelValue"],
25
+ setup(__props, { emit: __emit }) {
26
+ const emit = __emit;
27
+ const toggle = (event) => {
28
+ const target = event.target;
29
+ emit("update:modelValue", target.checked);
30
+ };
31
+ return (_ctx, _cache) => {
32
+ return openBlock(), createElementBlock("label", {
33
+ class: normalizeClass(["inline-flex items-start gap-3", __props.disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"])
34
+ }, [
35
+ createElementVNode("input", {
36
+ type: "checkbox",
37
+ checked: __props.modelValue,
38
+ disabled: __props.disabled,
39
+ indeterminate: __props.indeterminate,
40
+ class: "mt-0.5 size-4 rounded border-gray-300 text-primary/90 focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:cursor-not-allowed dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-offset-gray-900",
41
+ onChange: toggle
42
+ }, null, 40, _hoisted_1),
43
+ __props.label || __props.description ? (openBlock(), createElementBlock("div", _hoisted_2, [
44
+ __props.label ? (openBlock(), createElementBlock("span", _hoisted_3, toDisplayString(__props.label), 1)) : createCommentVNode("", true),
45
+ __props.description ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(__props.description), 1)) : createCommentVNode("", true)
46
+ ])) : createCommentVNode("", true)
47
+ ], 2);
48
+ };
49
+ }
50
+ });
51
+ export {
52
+ _sfc_main as _
53
+ };
54
+ //# sourceMappingURL=Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js","sources":["../src/components/form/Checkbox.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nwithDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Indeterminate state */\n indeterminate?: boolean\n }>(),\n {\n modelValue: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.checked)\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <input\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n :indeterminate=\"indeterminate\"\n class=\"mt-0.5 size-4 rounded border-gray-300 text-primary/90 focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:cursor-not-allowed dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-offset-gray-900\"\n @change=\"toggle\"\n />\n <div v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_openBlock","_toDisplayString"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,UAAM,OAAO;AAIb,UAAM,SAAS,CAAC,UAAiB;AAC/B,YAAM,SAAS,MAAM;AACrB,WAAK,qBAAqB,OAAO,OAAO;AAAA,IAC1C;;0BAIEA,mBAoBQ,SAAA;AAAA,QAnBN,OAAKC,eAAA,CAAC,iCACE,QAAA,WAAQ,kCAAA,gBAAA,CAAA;AAAA,MAAA;QAEhBC,mBAOE,SAAA;AAAA,UANA,MAAK;AAAA,UACJ,SAAS,QAAA;AAAA,UACT,UAAU,QAAA;AAAA,UACV,eAAe,QAAA;AAAA,UAChB,OAAM;AAAA,UACL,UAAQ;AAAA,QAAA;QAEA,QAAA,SAAS,QAAA,eAApBC,aAAAH,mBAOM,OAPN,YAOM;AAAA,UANQ,QAAA,sBAAZA,mBAEO,QAFP,YAEOI,gBADF,QAAA,KAAK,GAAA,CAAA;UAEE,QAAA,4BAAZJ,mBAEO,QAFP,YAEOI,gBADF,QAAA,WAAW,GAAA,CAAA;;;;;;"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ const vue = require("vue");
3
+ const _hoisted_1 = ["checked", "disabled", "indeterminate"];
4
+ const _hoisted_2 = {
5
+ key: 0,
6
+ class: "flex flex-col"
7
+ };
8
+ const _hoisted_3 = {
9
+ key: 0,
10
+ class: "text-sm font-medium text-gray-900 dark:text-white"
11
+ };
12
+ const _hoisted_4 = {
13
+ key: 1,
14
+ class: "text-sm text-gray-500 dark:text-gray-400"
15
+ };
16
+ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
17
+ __name: "Checkbox",
18
+ props: {
19
+ modelValue: { type: Boolean, default: false },
20
+ label: {},
21
+ description: {},
22
+ disabled: { type: Boolean },
23
+ indeterminate: { type: Boolean }
24
+ },
25
+ emits: ["update:modelValue"],
26
+ setup(__props, { emit: __emit }) {
27
+ const emit = __emit;
28
+ const toggle = (event) => {
29
+ const target = event.target;
30
+ emit("update:modelValue", target.checked);
31
+ };
32
+ return (_ctx, _cache) => {
33
+ return vue.openBlock(), vue.createElementBlock("label", {
34
+ class: vue.normalizeClass(["inline-flex items-start gap-3", __props.disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"])
35
+ }, [
36
+ vue.createElementVNode("input", {
37
+ type: "checkbox",
38
+ checked: __props.modelValue,
39
+ disabled: __props.disabled,
40
+ indeterminate: __props.indeterminate,
41
+ class: "mt-0.5 size-4 rounded border-gray-300 text-primary/90 focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:cursor-not-allowed dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-offset-gray-900",
42
+ onChange: toggle
43
+ }, null, 40, _hoisted_1),
44
+ __props.label || __props.description ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
45
+ __props.label ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3, vue.toDisplayString(__props.label), 1)) : vue.createCommentVNode("", true),
46
+ __props.description ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_4, vue.toDisplayString(__props.description), 1)) : vue.createCommentVNode("", true)
47
+ ])) : vue.createCommentVNode("", true)
48
+ ], 2);
49
+ };
50
+ }
51
+ });
52
+ exports._sfc_main = _sfc_main;
53
+ //# sourceMappingURL=Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs","sources":["../src/components/form/Checkbox.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nwithDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Indeterminate state */\n indeterminate?: boolean\n }>(),\n {\n modelValue: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.checked)\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <input\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n :indeterminate=\"indeterminate\"\n class=\"mt-0.5 size-4 rounded border-gray-300 text-primary/90 focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:cursor-not-allowed dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-offset-gray-900\"\n @change=\"toggle\"\n />\n <div v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_openBlock","_toDisplayString"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,UAAM,OAAO;AAIb,UAAM,SAAS,CAAC,UAAiB;AAC/B,YAAM,SAAS,MAAM;AACrB,WAAK,qBAAqB,OAAO,OAAO;AAAA,IAC1C;;8BAIEA,IAAAA,mBAoBQ,SAAA;AAAA,QAnBN,OAAKC,IAAAA,eAAA,CAAC,iCACE,QAAA,WAAQ,kCAAA,gBAAA,CAAA;AAAA,MAAA;QAEhBC,IAAAA,mBAOE,SAAA;AAAA,UANA,MAAK;AAAA,UACJ,SAAS,QAAA;AAAA,UACT,UAAU,QAAA;AAAA,UACV,eAAe,QAAA;AAAA,UAChB,OAAM;AAAA,UACL,UAAQ;AAAA,QAAA;QAEA,QAAA,SAAS,QAAA,eAApBC,IAAAA,aAAAH,IAAAA,mBAOM,OAPN,YAOM;AAAA,UANQ,QAAA,0BAAZA,IAAAA,mBAEO,QAFP,YAEOI,IAAAA,gBADF,QAAA,KAAK,GAAA,CAAA;UAEE,QAAA,gCAAZJ,IAAAA,mBAEO,QAFP,YAEOI,IAAAA,gBADF,QAAA,WAAW,GAAA,CAAA;;;;;;;"}