@timus-networks/theme 2.4.56 → 2.4.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/module.mjs +1 -1
  3. package/dist/runtime/components/development/example.alert.vue +1 -0
  4. package/dist/runtime/components/development/example.avatar.vue +2 -0
  5. package/dist/runtime/components/development/example.badge.vue +1 -0
  6. package/dist/runtime/components/development/example.breadcrumb.vue +1 -0
  7. package/dist/runtime/components/development/example.button.vue +3 -0
  8. package/dist/runtime/components/development/example.datepicker.vue +3 -0
  9. package/dist/runtime/components/development/example.description.vue +1 -0
  10. package/dist/runtime/components/development/example.dialog.vue +2 -0
  11. package/dist/runtime/components/development/example.dropdown.vue +2 -0
  12. package/dist/runtime/components/development/example.form.vue +9 -0
  13. package/dist/runtime/components/development/example.input.vue +2 -0
  14. package/dist/runtime/components/development/example.link.vue +1 -0
  15. package/dist/runtime/components/development/example.message.vue +4 -0
  16. package/dist/runtime/components/development/example.notification.vue +2 -0
  17. package/dist/runtime/components/development/example.number.vue +2 -0
  18. package/dist/runtime/components/development/example.pagination.vue +2 -0
  19. package/dist/runtime/components/development/example.popover.vue +3 -0
  20. package/dist/runtime/components/development/example.sidebar.vue +4 -0
  21. package/dist/runtime/components/development/example.switch.vue +1 -0
  22. package/dist/runtime/components/development/example.table.vue +2 -0
  23. package/dist/runtime/components/development/example.tag.vue +13 -0
  24. package/dist/runtime/components/development/example.timepicker.vue +6 -0
  25. package/dist/runtime/components/development/example.upload.vue +5 -0
  26. package/dist/runtime/components/production/html-encode.vue +3 -0
  27. package/dist/runtime/pages/theme.vue +1 -0
  28. package/dist/runtime/plugins/sample-plugin.js +2 -1
  29. package/dist/runtime/plugins/sample-plugin.mjs +2 -1
  30. package/dist/runtime/public/scss/element-plus/index.css +1 -1
  31. package/dist/runtime/public/scss/element-plus/message.css +1 -0
  32. package/dist/runtime/public/scss/element-plus/message.scss +1 -0
  33. package/dist/runtime/public/scss/element-plus/overlay.css +0 -1
  34. package/dist/runtime/public/scss/element-plus/overlay.scss +1 -1
  35. package/package.json +1 -1
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@timus-networks/theme",
3
3
  "configKey": "themeOptions",
4
- "version": "2.4.56",
4
+ "version": "2.4.58",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "0.8.4",
7
7
  "unbuild": "2.0.0"
package/dist/module.mjs CHANGED
@@ -11,7 +11,7 @@ const __filename = __cjs_url__.fileURLToPath(import.meta.url);
11
11
  const __dirname = __cjs_path__.dirname(__filename);
12
12
  const require = __cjs_mod__.createRequire(import.meta.url);
13
13
  const name = "@timus-networks/theme";
14
- const version = "2.4.56";
14
+ const version = "2.4.58";
15
15
  const description = "A comprehensive Nuxt.js module providing a tailored theme experience with integrated TailwindCSS support for applications.";
16
16
  const type = "module";
17
17
  const exports = {
@@ -25,6 +25,7 @@
25
25
  import { ref } from 'vue';
26
26
 
27
27
  const colors = ref(['success', 'warning', 'info', 'error', 'danger']);
28
+
28
29
  const snippets = ref({
29
30
  basic: `<el-alert title="Title Text Goes Here" type="danger" description="This is a description." show-icon :closable="false" />`,
30
31
  });
@@ -76,7 +76,9 @@
76
76
  sizes: [50, 'default', 'large', 'medium', 'small', 'mini'] as const,
77
77
  infos: [50, '32', '56', '44', '32', '16'] as const,
78
78
  });
79
+
79
80
  const { sizes, infos } = toRefs(state);
81
+
80
82
  const snippets = ref({
81
83
  isax: `<el-avatar class="isax-notification" />`,
82
84
  icon: `<el-avatar :icon="ElIconEdit" />`,
@@ -73,6 +73,7 @@
73
73
  import { ref } from 'vue';
74
74
 
75
75
  const colors = ref(['default', 'primary', 'secondary', 'neutral', 'success', 'warning', 'info', 'danger']);
76
+
76
77
  const snippets = ref({
77
78
  basic: `
78
79
  <el-badge :value="12" type="primary">
@@ -34,6 +34,7 @@
34
34
  { regex: /^\/about$/, label: 'header.about-label.text' },
35
35
  { regex: /^\/theme\/([A-Za-z0-9\-_]+)$/, label: 'header.number.text' },
36
36
  ]);
37
+
37
38
  const snippets = ref({
38
39
  basic: `<timus-breadcrumb :paths="[ { regex: /^\/about$/, label: 'header.about.text' } ]" />`,
39
40
  composable: `
@@ -219,6 +219,7 @@
219
219
 
220
220
  const sizes = ['default', 'large', 'medium', 'small', 'mini'];
221
221
  const colors = ['default', 'primary', 'secondary', 'neutral', 'success', 'warning', 'info', 'danger'];
222
+
222
223
  const snippets = {
223
224
  group: `
224
225
  <el-button-group>
@@ -228,7 +229,9 @@
228
229
  </el-button>
229
230
  </el-button-group>`,
230
231
  };
232
+
231
233
  const active_color = ref('default');
234
+
232
235
  const capitalize = (value: string): string => {
233
236
  const text = String(value);
234
237
 
@@ -157,6 +157,7 @@
157
157
  const range_value = ref([]);
158
158
  const value = ref('');
159
159
  const sizes = ref<Array<'default' | 'large' | 'medium' | 'small' | 'mini'>>(['default', 'large', 'medium', 'small', 'mini']);
160
+
160
161
  const shortcuts = [
161
162
  {
162
163
  text: 'Today',
@@ -183,7 +184,9 @@
183
184
  },
184
185
  },
185
186
  ];
187
+
186
188
  const disabledDate = (time: Date) => time.getTime() > Date.now();
189
+
187
190
  const snippets = ref({
188
191
  basic: `<el-date-picker v-model="value" type="date" placeholder="Pick a day" size="large" />`,
189
192
  types: `<el-date-picker v-model="value" type="month" placeholder="Pick a month" />`,
@@ -79,6 +79,7 @@
79
79
 
80
80
  const size = ref('default');
81
81
  const column_count = ref(3);
82
+
82
83
  const snippets = ref({
83
84
  basic: `
84
85
  <el-tooltip class="box-item" effect="dark" content="Left Bottom prompts info" placement="left-end">
@@ -39,6 +39,7 @@
39
39
  // useZIndex(c);
40
40
 
41
41
  const dialogVisible = ref(false);
42
+
42
43
  const handleClose = (done: () => void) => {
43
44
  ElMessageBox.confirm('Are you sure to close this dialog?')
44
45
  .then(() => {
@@ -48,6 +49,7 @@
48
49
  // catch error
49
50
  });
50
51
  };
52
+
51
53
  const snippets = ref({
52
54
  basic: `
53
55
  <el-button plain @click="dialogVisible = true"> Click to open the Dialog </el-button>
@@ -167,6 +167,7 @@
167
167
  const trigger_selected = ref('click');
168
168
  const size_list = ref(['default', 'large', 'medium', 'small', 'mini']);
169
169
  const size_selected = ref('default');
170
+
170
171
  const snippets = ref({
171
172
  basic: `
172
173
  <el-dropdown>
@@ -186,6 +187,7 @@
186
187
  underline: `<el-link :underline="false">Without Underline</el-link>`,
187
188
  icon: `<el-link class="isax-add icon-right">Check</el-link>`,
188
189
  });
190
+
189
191
  const handleClick = () => {
190
192
  alert('button click');
191
193
  };
@@ -321,10 +321,13 @@
321
321
  resource: '',
322
322
  desc: '',
323
323
  });
324
+
324
325
  const onSubmit = () => {
325
326
  console.log('submit!');
326
327
  };
328
+
327
329
  const labelPosition = ref<FormProps['labelPosition']>('top');
330
+
328
331
  const snippets = ref({
329
332
  basic: `
330
333
  <el-form :model="form" label-width="auto" :label-position="top" require-asterisk-position="right">
@@ -399,6 +402,7 @@
399
402
 
400
403
  const formSize = ref<ComponentSize>('default');
401
404
  const ruleFormRef = ref<FormInstance>();
405
+
402
406
  const ruleForm = reactive<RuleForm>({
403
407
  name: 'Hello',
404
408
  region: '',
@@ -411,7 +415,9 @@
411
415
  resource: '',
412
416
  desc: '',
413
417
  });
418
+
414
419
  const locationOptions = ['Home', 'Company', 'School'];
420
+
415
421
  const rules = reactive<FormRules<RuleForm>>({
416
422
  name: [
417
423
  { required: true, message: 'Please input Activity name', trigger: 'blur' },
@@ -471,6 +477,7 @@
471
477
  ],
472
478
  desc: [{ required: true, message: 'Please input activity form', trigger: 'blur' }],
473
479
  });
480
+
474
481
  const submitForm = async (formEl: FormInstance | undefined) => {
475
482
  if (!formEl) return;
476
483
  await formEl.validate((valid: boolean, fields) => {
@@ -481,10 +488,12 @@
481
488
  }
482
489
  });
483
490
  };
491
+
484
492
  const resetForm = (formEl: FormInstance | undefined) => {
485
493
  if (!formEl) return;
486
494
  formEl.resetFields();
487
495
  };
496
+
488
497
  const options = Array.from({ length: 10000 }).map((_, idx) => ({
489
498
  value: `${idx + 1}`,
490
499
  label: `${idx + 1}`,
@@ -224,6 +224,7 @@
224
224
  const input = ref('');
225
225
  const textarea = ref('');
226
226
  const select = ref('1');
227
+
227
228
  const snippets = {
228
229
  formatter: `<el-input
229
230
  v-model="input"
@@ -253,6 +254,7 @@
253
254
  </el-input>
254
255
  `,
255
256
  };
257
+
256
258
  const capitalize = (value: string): string => {
257
259
  const text = String(value);
258
260
 
@@ -62,6 +62,7 @@
62
62
  import { ref } from 'vue';
63
63
 
64
64
  const colors = ref<string[]>(['default', 'primary', 'secondary', 'neutral', 'success', 'warning', 'info', 'danger']);
65
+
65
66
  const snippets = ref({
66
67
  basic: `<el-link href="https://element-plus.org" target="_blank" type="secondary">default</el-link>`,
67
68
  disabled: `<el-link type="secondary" disabled>default</el-link>`,
@@ -32,6 +32,7 @@
32
32
  import { ref } from 'vue';
33
33
 
34
34
  const colors = ref(['success', 'warning', 'info', 'error' /* , 'danger' */]);
35
+
35
36
  const snippets = ref({
36
37
  basic: `
37
38
  import { ElMessage, type MessageOptions } from 'element-plus';
@@ -46,10 +47,13 @@
46
47
  } as MessageOptions)
47
48
  `,
48
49
  });
50
+
49
51
  const basicOpener = () => {
50
52
  ElMessage({ message: 'This is a message.', showClose: true, duration: 0 });
51
53
  };
54
+
52
55
  const isPlain = ref(false);
56
+
53
57
  const open = function (type: string, plain: boolean = true) {
54
58
  ElMessage({
55
59
  showClose: true,
@@ -49,6 +49,7 @@
49
49
  type: type ?? 'default',
50
50
  });
51
51
  };
52
+
52
53
  const snippets = ref({
53
54
  basic: `
54
55
  ElNotification({
@@ -65,6 +66,7 @@
65
66
  });
66
67
  `,
67
68
  });
69
+
68
70
  const capitalize = (value: string): string => {
69
71
  if (!value) return null;
70
72
 
@@ -58,9 +58,11 @@
58
58
 
59
59
  const sizes = ref(['default', 'large', 'medium', 'small', 'mini']);
60
60
  const num = ref(1);
61
+
61
62
  const handleChange = (value: number) => {
62
63
  console.log(value);
63
64
  };
65
+
64
66
  const snippets = ref({
65
67
  basic: `
66
68
  <el-input-number v-model="num" :min="1" :max="10" @change="handleChange" />
@@ -78,7 +78,9 @@
78
78
  console.log(page);
79
79
  },
80
80
  });
81
+
81
82
  const { current_page, size, page_size, disabled, background, handleSizeChange, handleCurrentChange } = toRefs(paginationState);
83
+
82
84
  const snippets = ref({
83
85
  basic: `
84
86
  <el-pagination
@@ -101,11 +101,14 @@
101
101
  const buttonRef = ref();
102
102
  const popoverRef = ref();
103
103
  const visible = ref(false);
104
+
104
105
  const onClickOutside = () => {
105
106
  unref(popoverRef).popperRef?.delayHide?.();
106
107
  };
108
+
107
109
  const sizes = ['default', 'large', 'medium', 'small', 'mini'];
108
110
  const model = ref('');
111
+
109
112
  const snippets = {
110
113
  basic: `
111
114
  <el-popover placement="top-start" title="Title" :width="200" trigger="hover" content="this is content, this is content, this is content">
@@ -70,6 +70,7 @@
70
70
  import { ref } from 'vue';
71
71
 
72
72
  const route = useRoute();
73
+
73
74
  const currentRoute = computed(() => ({
74
75
  path: route.path,
75
76
  fullPath: route.fullPath,
@@ -77,12 +78,15 @@
77
78
  params: route.params,
78
79
  query: route.query,
79
80
  }));
81
+
80
82
  const handleOpen = (key: string, keyPath: string[]) => {
81
83
  console.log(key, keyPath);
82
84
  };
85
+
83
86
  const handleClose = (key: string, keyPath: string[]) => {
84
87
  console.log(key, keyPath);
85
88
  };
89
+
86
90
  const snippets = ref({
87
91
  sizes: `
88
92
  <el-menu :default-active="currentRoute.path" class="w-[270px]" :router="true" @open="handleOpen" @close="handleClose">
@@ -83,6 +83,7 @@
83
83
  const value = ref(true);
84
84
  const custom = ref(100);
85
85
  const sizes = ref(['default', 'large', 'medium', 'small', 'mini']);
86
+
86
87
  const snippets = ref({
87
88
  basic: `<el-switch v-model="value2" class="ml-2" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949" />`,
88
89
  sizes: `<el-switch v-model="value" size="large" />`,
@@ -90,6 +90,7 @@
90
90
  zip: string;
91
91
  address: string;
92
92
  }
93
+
93
94
  const tableData: User[] = [
94
95
  {
95
96
  date: '2016-05-03',
@@ -148,6 +149,7 @@
148
149
  zip: 'CA 90036',
149
150
  },
150
151
  ];
152
+
151
153
  const snippets = ref({
152
154
  basic: `
153
155
  <el-table :data="tableData" style="width: 100%">
@@ -161,24 +161,31 @@
161
161
  const checked3 = ref(true);
162
162
  const checked4 = ref(true);
163
163
  const checked5 = ref(true);
164
+
164
165
  const onChange = (status: boolean) => {
165
166
  checked.value = status;
166
167
  };
168
+
167
169
  const onChange1 = (status: boolean) => {
168
170
  checked1.value = status;
169
171
  };
172
+
170
173
  const onChange2 = (status: boolean) => {
171
174
  checked2.value = status;
172
175
  };
176
+
173
177
  const onChange3 = (status: boolean) => {
174
178
  checked3.value = status;
175
179
  };
180
+
176
181
  const onChange4 = (status: boolean) => {
177
182
  checked4.value = status;
178
183
  };
184
+
179
185
  const onChange5 = (status: boolean) => {
180
186
  checked5.value = status;
181
187
  };
188
+
182
189
  const items = ref<Array<Item>>([
183
190
  { type: 'primary', label: 'Tag 1' },
184
191
  { type: 'secondary', label: 'Tag 2' },
@@ -188,6 +195,7 @@
188
195
  { type: 'warning', label: 'Tag 4' },
189
196
  { type: 'danger', label: 'Tag 5' },
190
197
  ]);
198
+
191
199
  const tags = ref<TagsItem[]>([
192
200
  { name: 'Tag 1', type: 'primary' },
193
201
  { name: 'Tag 1', type: 'secondary' },
@@ -197,23 +205,28 @@
197
205
  { name: 'Tag 4', type: 'warning' },
198
206
  { name: 'Tag 5', type: 'danger' },
199
207
  ]);
208
+
200
209
  const inputValue = ref('');
201
210
  const dynamicTags = ref(['Tag 1', 'Tag 2', 'Tag 3']);
202
211
  const inputVisible = ref(false);
203
212
  const InputRef = ref<InputInstance>();
213
+
204
214
  const handleClose = (tag: string) => {
205
215
  dynamicTags.value.splice(dynamicTags.value.indexOf(tag), 1);
206
216
  };
217
+
207
218
  const showInput = () => {
208
219
  inputVisible.value = true;
209
220
  nextTick(() => {
210
221
  InputRef.value!.input!.focus();
211
222
  });
212
223
  };
224
+
213
225
  const handleInputConfirm = () => {
214
226
  if (inputValue.value) {
215
227
  dynamicTags.value.push(inputValue.value);
216
228
  }
229
+
217
230
  inputVisible.value = false;
218
231
  inputValue.value = '';
219
232
  };
@@ -56,6 +56,7 @@
56
56
  const value = ref('');
57
57
  const range = ref<[Date, Date]>([new Date(2016, 9, 10, 8, 40), new Date(2016, 9, 10, 9, 40)]);
58
58
  const limited = ref(new Date(2016, 9, 10, 18, 30));
59
+
59
60
  const makeRange = (start: number, end: number) => {
60
61
  const result: number[] = [];
61
62
 
@@ -65,22 +66,27 @@
65
66
 
66
67
  return result;
67
68
  };
69
+
68
70
  const disabledHours = () => makeRange(0, 16).concat(makeRange(19, 23));
71
+
69
72
  const disabledMinutes: GetDisabledMinutes = (hour: number) => {
70
73
  if (hour === 17) {
71
74
  return makeRange(0, 29) as number[];
72
75
  }
76
+
73
77
  if (hour === 18) {
74
78
  return makeRange(31, 59) as number[];
75
79
  }
76
80
 
77
81
  return [];
78
82
  };
83
+
79
84
  const disabledSeconds = (hour: number, minute: number) => {
80
85
  if (hour === 18 && minute === 30) {
81
86
  return makeRange(1, 59);
82
87
  }
83
88
  };
89
+
84
90
  const snippets = ref({
85
91
  basic: `<el-time-picker v-model="value" arrow-control placeholder="Arbitrary time" />`,
86
92
  limit: `<el-time-picker v-model="limited" :disabled-hours="disabledHours" :disabled-minutes="disabledMinutes" :disabled-seconds="disabledSeconds" placeholder="Arbitrary time" />`,
@@ -49,20 +49,25 @@
49
49
  url: 'https://element-plus.org/images/element-plus-logo.svg',
50
50
  },
51
51
  ]);
52
+
52
53
  const handleRemove: UploadProps['onRemove'] = (file, uploadFiles) => {
53
54
  console.log(file, uploadFiles);
54
55
  };
56
+
55
57
  const handlePreview: UploadProps['onPreview'] = (uploadFile) => {
56
58
  console.log(uploadFile);
57
59
  };
60
+
58
61
  const handleExceed: UploadProps['onExceed'] = (files, uploadFiles) => {
59
62
  ElMessage.warning(`The limit is 3, you selected ${files.length} files this time, add up to ${files.length + uploadFiles.length} totally`);
60
63
  };
64
+
61
65
  const beforeRemove: UploadProps['beforeRemove'] = (uploadFile, uploadFiles) =>
62
66
  ElMessageBox.confirm(`Cancel the transfer of ${uploadFile.name} ?`).then(
63
67
  () => true,
64
68
  () => false,
65
69
  );
70
+
66
71
  const snippets = ref({
67
72
  basic: `<el-upload
68
73
  v-model:file-list="fileList"
@@ -15,6 +15,7 @@
15
15
  import { computed } from 'vue';
16
16
 
17
17
  const props = defineProps<{ tag: string }>();
18
+
18
19
  const htmlEncode = (str: string): string => {
19
20
  const entityMap: { [key: string]: string } = {
20
21
  '&': '&amp;',
@@ -26,8 +27,10 @@
26
27
 
27
28
  return str.replace(/[&<>"']/g, (m: string) => entityMap[m]);
28
29
  };
30
+
29
31
  const formattedLines = computed(() => {
30
32
  const lines = props.tag.split('\n');
33
+
31
34
  const baseIndent = lines.reduce((min, line) => {
32
35
  const match = line.match(/^\s*/);
33
36
  const indent = match ? match[0].length : 0;
@@ -43,6 +43,7 @@
43
43
  });
44
44
 
45
45
  const activeName = ref('alert');
46
+
46
47
  const handleClick = (_tab: TabsPaneContext, _event: Event) => {
47
48
  // console.log(tab, event);
48
49
  };
@@ -1,5 +1,6 @@
1
1
  import { defineNuxtPlugin } from "#app";
2
2
  import PackageJson from "../../../package.json";
3
3
  export default defineNuxtPlugin((nuxtApp) => {
4
- nuxtApp.provide("module.theme", { version: PackageJson.version, name: PackageJson.name, description: PackageJson.description });
4
+ const modules = nuxtApp.$modules ?? {};
5
+ nuxtApp.provide("modules", { ...modules, utils: { version: PackageJson.version, name: PackageJson.name, description: PackageJson.description } });
5
6
  });
@@ -1,5 +1,6 @@
1
1
  import { defineNuxtPlugin } from "#app";
2
2
  import PackageJson from "../../../package.json";
3
3
  export default defineNuxtPlugin((nuxtApp) => {
4
- nuxtApp.provide("module.theme", { version: PackageJson.version, name: PackageJson.name, description: PackageJson.description });
4
+ const modules = nuxtApp.$modules ?? {};
5
+ nuxtApp.provide("modules", { ...modules, utils: { version: PackageJson.version, name: PackageJson.name, description: PackageJson.description } });
5
6
  });
@@ -10608,6 +10608,7 @@ heights > $common-component-size
10608
10608
  gap: 4px;
10609
10609
  color: var(--el-message-text-color);
10610
10610
  box-shadow: var(--el-box-shadow-light);
10611
+ z-index: 99999;
10611
10612
  }
10612
10613
  .el-message.is-center {
10613
10614
  justify-content: center;
@@ -10922,7 +10923,6 @@ heights > $common-component-size
10922
10923
  right: 0;
10923
10924
  bottom: 0;
10924
10925
  left: 0;
10925
- z-index: 2000 !important;
10926
10926
  height: 100%;
10927
10927
  background-color: #343337cc;
10928
10928
  overflow: auto;
@@ -331,6 +331,7 @@ Bununla selectorun içerisine variable ekleyebiliyorsun
331
331
  gap: 4px;
332
332
  color: var(--el-message-text-color);
333
333
  box-shadow: var(--el-box-shadow-light);
334
+ z-index: 99999;
334
335
  }
335
336
  .el-message.is-center {
336
337
  justify-content: center;
@@ -29,6 +29,7 @@
29
29
  gap: 4px;
30
30
  color: getCssVar('message', 'text-color');
31
31
  box-shadow: getCssVar('box-shadow-light');
32
+ z-index: 99999;
32
33
 
33
34
  @include when(center) {
34
35
  justify-content: center;
@@ -306,7 +306,6 @@ Bununla selectorun içerisine variable ekleyebiliyorsun
306
306
  right: 0;
307
307
  bottom: 0;
308
308
  left: 0;
309
- z-index: 2000 !important;
310
309
  height: 100%;
311
310
  background-color: #343337cc;
312
311
  overflow: auto;
@@ -8,7 +8,7 @@
8
8
  right: 0;
9
9
  bottom: 0;
10
10
  left: 0;
11
- z-index: 2000 !important;
11
+ // z-index: 2000 !important;
12
12
  height: 100%;
13
13
  background-color: #{map.get($colors, 'neutral', 'light-9')}cc;
14
14
  overflow: auto;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timus-networks/theme",
3
- "version": "2.4.56",
3
+ "version": "2.4.58",
4
4
  "description": "A comprehensive Nuxt.js module providing a tailored theme experience with integrated TailwindCSS support for applications.",
5
5
  "type": "module",
6
6
  "exports": {