@tomny-dev/uzi 0.6.3 → 0.7.0-pr.78.214.1.87d1ede

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 (118) hide show
  1. package/dist/components/conversation/Conversation.d.ts +18 -0
  2. package/dist/components/conversation/Conversation.d.ts.map +1 -0
  3. package/dist/components/conversation/Conversation.test.d.ts +2 -0
  4. package/dist/components/conversation/Conversation.test.d.ts.map +1 -0
  5. package/dist/components/multi-select/MultiSelect.d.ts +9 -0
  6. package/dist/components/multi-select/MultiSelect.d.ts.map +1 -1
  7. package/dist/components/multi-select/MultiSelect.test.d.ts +2 -0
  8. package/dist/components/multi-select/MultiSelect.test.d.ts.map +1 -0
  9. package/dist/index.cjs +19 -11
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +13 -12
  13. package/dist/index26.js +10 -2
  14. package/dist/index26.js.map +1 -1
  15. package/dist/index27.cjs +13 -1
  16. package/dist/index27.cjs.map +1 -1
  17. package/dist/index27.js +74 -37
  18. package/dist/index27.js.map +1 -1
  19. package/dist/index28.cjs +74 -37
  20. package/dist/index28.cjs.map +1 -1
  21. package/dist/index53.js +26 -16
  22. package/dist/index53.js.map +1 -1
  23. package/dist/index54.cjs +37 -20
  24. package/dist/index54.cjs.map +1 -1
  25. package/dist/index54.js +57 -23
  26. package/dist/index54.js.map +1 -1
  27. package/dist/index55.cjs +63 -24
  28. package/dist/index55.cjs.map +1 -1
  29. package/dist/index55.js +16 -16
  30. package/dist/index55.js.map +1 -1
  31. package/dist/index56.cjs +19 -20
  32. package/dist/index56.cjs.map +1 -1
  33. package/dist/index56.js +24 -21
  34. package/dist/index56.js.map +1 -1
  35. package/dist/index57.cjs +25 -22
  36. package/dist/index57.cjs.map +1 -1
  37. package/dist/index57.js +17 -10
  38. package/dist/index57.js.map +1 -1
  39. package/dist/index58.cjs +23 -11
  40. package/dist/index58.cjs.map +1 -1
  41. package/dist/index58.js +25 -14
  42. package/dist/index58.js.map +1 -1
  43. package/dist/index59.cjs +25 -13
  44. package/dist/index59.cjs.map +1 -1
  45. package/dist/index59.js +10 -11
  46. package/dist/index59.js.map +1 -1
  47. package/dist/index60.cjs +11 -13
  48. package/dist/index60.cjs.map +1 -1
  49. package/dist/index60.js +13 -16
  50. package/dist/index60.js.map +1 -1
  51. package/dist/index61.cjs +13 -16
  52. package/dist/index61.cjs.map +1 -1
  53. package/dist/index61.js +10 -8
  54. package/dist/index61.js.map +1 -1
  55. package/dist/index62.cjs +11 -10
  56. package/dist/index62.cjs.map +1 -1
  57. package/dist/index62.js +15 -87
  58. package/dist/index62.js.map +1 -1
  59. package/dist/index63.cjs +15 -89
  60. package/dist/index63.cjs.map +1 -1
  61. package/dist/index63.js +9 -21
  62. package/dist/index63.js.map +1 -1
  63. package/dist/index64.cjs +12 -30
  64. package/dist/index64.cjs.map +1 -1
  65. package/dist/index64.js +89 -43
  66. package/dist/index64.js.map +1 -1
  67. package/dist/index65.cjs +88 -42
  68. package/dist/index65.cjs.map +1 -1
  69. package/dist/index65.js +14 -50
  70. package/dist/index65.js.map +1 -1
  71. package/dist/index66.cjs +15 -69
  72. package/dist/index66.cjs.map +1 -1
  73. package/dist/index66.js +25 -414
  74. package/dist/index66.js.map +1 -1
  75. package/dist/index67.cjs +25 -416
  76. package/dist/index67.cjs.map +1 -1
  77. package/dist/index67.js +56 -58
  78. package/dist/index67.js.map +1 -1
  79. package/dist/index68.cjs +82 -85
  80. package/dist/index68.cjs.map +1 -1
  81. package/dist/index68.js +419 -226
  82. package/dist/index68.js.map +1 -1
  83. package/dist/index69.cjs +420 -225
  84. package/dist/index69.cjs.map +1 -1
  85. package/dist/index69.js +58 -42
  86. package/dist/index69.js.map +1 -1
  87. package/dist/index70.cjs +85 -61
  88. package/dist/index70.cjs.map +1 -1
  89. package/dist/index70.js +236 -76
  90. package/dist/index70.js.map +1 -1
  91. package/dist/index71.cjs +235 -75
  92. package/dist/index71.cjs.map +1 -1
  93. package/dist/index71.js +42 -20
  94. package/dist/index71.js.map +1 -1
  95. package/dist/index72.cjs +60 -27
  96. package/dist/index72.cjs.map +1 -1
  97. package/dist/index72.js +73 -88
  98. package/dist/index72.js.map +1 -1
  99. package/dist/index73.cjs +73 -90
  100. package/dist/index73.cjs.map +1 -1
  101. package/dist/index73.js +17 -15
  102. package/dist/index73.js.map +1 -1
  103. package/dist/index74.cjs +22 -19
  104. package/dist/index74.cjs.map +1 -1
  105. package/dist/index74.js +85 -143
  106. package/dist/index74.js.map +1 -1
  107. package/dist/index75.cjs +87 -143
  108. package/dist/index75.cjs.map +1 -1
  109. package/dist/index75.js +23 -0
  110. package/dist/index75.js.map +1 -0
  111. package/dist/index76.cjs +31 -0
  112. package/dist/index76.cjs.map +1 -0
  113. package/dist/index76.js +159 -0
  114. package/dist/index76.js.map +1 -0
  115. package/dist/index77.cjs +161 -0
  116. package/dist/index77.cjs.map +1 -0
  117. package/dist/style.css +150 -0
  118. package/package.json +1 -1
package/dist/index71.cjs CHANGED
@@ -1,88 +1,248 @@
1
+ "use client";
1
2
  const require_runtime = require("./index2.cjs");
2
3
  const require_cx = require("./index4.cjs");
3
- const require_settings_page_module = require("./index70.cjs");
4
+ const require_data_table_module = require("./index70.cjs");
4
5
  let react = require("react");
5
6
  react = require_runtime.__toESM(react, 1);
6
7
  let react_jsx_runtime = require("react/jsx-runtime");
7
- //#region src/components/settings-page/SettingsPage.tsx
8
- /**
9
- * SettingsPage — a settings layout with sections, a danger zone, and a sticky save footer.
10
- *
11
- * Layout:
12
- * Header (title + description)
13
- * Scrollable content:
14
- * Section group with headings and descriptions
15
- * Danger zone with red visual distinction
16
- * Sticky footer: save/cancel buttons
17
- */
18
- function SettingsPage({ title, description, sections, dangerZone, dangerZoneTitle, dangerZoneDescription, footer, saving = false, className }) {
8
+ //#region src/components/data-table/DataTable.tsx
9
+ function DataTable({ data, columns, onRowAction, onSelectionChange, loading = false, emptyMessage = "No data found", pageSize = 10, selectable = false, rowKey = (row) => String(row.id ?? ""), className }) {
10
+ const [sortKey, setSortKey] = react.useState(null);
11
+ const [sortDir, setSortDir] = react.useState("asc");
12
+ const [page, setPage] = react.useState(1);
13
+ const [selected, setSelected] = react.useState(/* @__PURE__ */ new Set());
14
+ const handleSort = (key) => {
15
+ if (key === sortKey) setSortDir((d) => d === "asc" ? "desc" : "asc");
16
+ else {
17
+ setSortKey(key);
18
+ setSortDir("asc");
19
+ }
20
+ };
21
+ const toggleRow = (id) => {
22
+ const next = new Set(selected);
23
+ if (next.has(id)) next.delete(id);
24
+ else next.add(id);
25
+ setSelected(next);
26
+ onSelectionChange?.(Array.from(next));
27
+ };
28
+ const toggleAll = () => {
29
+ const allKeys = displayedData.map((r) => rowKey(r));
30
+ const allSelected = allKeys.every((k) => selected.has(k));
31
+ const next = new Set(selected);
32
+ if (allSelected) allKeys.forEach((k) => next.delete(k));
33
+ else allKeys.forEach((k) => next.add(k));
34
+ setSelected(next);
35
+ onSelectionChange?.(Array.from(next));
36
+ };
37
+ const totalPages = Math.max(1, Math.ceil(data.length / pageSize));
38
+ const safePage = Math.min(page, totalPages);
39
+ const columnSpan = columns.length + (selectable ? 1 : 0) + (onRowAction && onRowAction.length > 0 ? 1 : 0);
40
+ react.useEffect(() => {
41
+ if (page > totalPages) setPage(totalPages);
42
+ }, [
43
+ data.length,
44
+ page,
45
+ totalPages
46
+ ]);
47
+ const sortedData = react.useMemo(() => {
48
+ if (!sortKey) return data;
49
+ const sortColumn = columns.find((column) => column.key === sortKey);
50
+ const getSortValue = (row) => {
51
+ if (sortColumn?.accessor) {
52
+ const accessed = sortColumn.accessor(row);
53
+ if (typeof accessed === "string" || typeof accessed === "number") return accessed;
54
+ }
55
+ return row[sortKey];
56
+ };
57
+ return [...data].sort((a, b) => {
58
+ const aVal = getSortValue(a);
59
+ const bVal = getSortValue(b);
60
+ if (aVal == null) return 1;
61
+ if (bVal == null) return -1;
62
+ let cmp = 0;
63
+ if (typeof aVal === "number" && typeof bVal === "number") cmp = aVal - bVal;
64
+ else cmp = String(aVal).localeCompare(String(bVal));
65
+ return sortDir === "asc" ? cmp : -cmp;
66
+ });
67
+ }, [
68
+ columns,
69
+ data,
70
+ sortKey,
71
+ sortDir
72
+ ]);
73
+ const displayedData = react.useMemo(() => {
74
+ const start = (safePage - 1) * pageSize;
75
+ return sortedData.slice(start, start + pageSize);
76
+ }, [
77
+ sortedData,
78
+ safePage,
79
+ pageSize
80
+ ]);
81
+ const displayedKeys = react.useMemo(() => displayedData.map(rowKey), [displayedData, rowKey]);
82
+ const allPageSelected = displayedKeys.length > 0 && displayedKeys.every((k) => selected.has(k));
83
+ const somePageSelected = displayedKeys.length > 0 && displayedKeys.some((k) => selected.has(k));
19
84
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
20
- className: require_cx.cx(require_settings_page_module.default.wrapper, className),
21
- children: [
22
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("header", {
23
- className: require_settings_page_module.default.header,
24
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
25
- className: require_settings_page_module.default.headerContent,
26
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", {
27
- className: require_settings_page_module.default.title,
28
- children: title
29
- }), description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
30
- className: require_settings_page_module.default.description,
31
- children: description
32
- })]
33
- })
34
- }),
35
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36
- className: require_settings_page_module.default.content,
37
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38
- className: require_settings_page_module.default.sections,
39
- children: sections.map((section, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
40
- className: require_settings_page_module.default.section,
41
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42
- className: require_settings_page_module.default.sectionHeader,
43
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
44
- className: require_settings_page_module.default.sectionTitle,
45
- children: section.title
46
- }), section.description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
47
- className: require_settings_page_module.default.sectionDescription,
48
- children: section.description
49
- })]
50
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
51
- className: require_settings_page_module.default.sectionBody,
52
- children: section.children
53
- })]
54
- }, index))
55
- }), dangerZone && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56
- className: require_settings_page_module.default.dangerZone,
57
- children: [(dangerZoneTitle || dangerZoneDescription) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58
- className: require_settings_page_module.default.dangerZoneHeader,
59
- children: [dangerZoneTitle && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
60
- className: require_settings_page_module.default.dangerZoneTitle,
61
- children: dangerZoneTitle
62
- }), dangerZoneDescription && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
63
- className: require_settings_page_module.default.dangerZoneDescription,
64
- children: dangerZoneDescription
65
- })]
66
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
67
- className: require_settings_page_module.default.dangerZoneBody,
68
- children: dangerZone
69
- })]
85
+ className: require_cx.cx(require_data_table_module.default.wrapper, className),
86
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
87
+ className: require_data_table_module.default.tableContainer,
88
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("table", {
89
+ className: require_data_table_module.default.table,
90
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", {
91
+ className: require_data_table_module.default.thead,
92
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
93
+ selectable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
94
+ className: require_data_table_module.default.headerCell,
95
+ "aria-label": "Select all",
96
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
97
+ type: "checkbox",
98
+ checked: allPageSelected,
99
+ ref: (el) => {
100
+ if (el) el.indeterminate = somePageSelected && !allPageSelected;
101
+ },
102
+ onChange: toggleAll,
103
+ className: require_data_table_module.default.checkbox,
104
+ "aria-label": "Select all rows on this page"
105
+ })
106
+ }),
107
+ columns.map((col) => {
108
+ const ariaSort = col.sortable ? sortKey === col.key ? sortDir === "asc" ? "ascending" : "descending" : "none" : void 0;
109
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
110
+ className: require_cx.cx(require_data_table_module.default.headerCell, col.width && require_data_table_module.default.headerCellFixed, col.align && require_data_table_module.default[`align${col.align.charAt(0).toUpperCase() + col.align.slice(1)}`]),
111
+ style: col.width ? { width: col.width } : void 0,
112
+ "aria-sort": ariaSort,
113
+ children: col.sortable ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
114
+ type: "button",
115
+ className: require_cx.cx(require_data_table_module.default.sortableHeader, require_data_table_module.default.clickableHeader),
116
+ onClick: () => handleSort(col.key),
117
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
118
+ className: require_data_table_module.default.headerLabel,
119
+ children: col.label
120
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
121
+ className: require_data_table_module.default.sortIcon,
122
+ "aria-hidden": "true",
123
+ children: sortKey === col.key ? sortDir === "asc" ? "▲" : "▼" : "▲▼"
124
+ })]
125
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
126
+ className: require_data_table_module.default.headerLabel,
127
+ children: col.label
128
+ })
129
+ }, col.key);
130
+ }),
131
+ onRowAction && onRowAction.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
132
+ className: require_data_table_module.default.headerCell,
133
+ style: { width: "5rem" },
134
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
135
+ className: require_data_table_module.default.headerLabel,
136
+ children: "Actions"
137
+ })
138
+ })
139
+ ] })
140
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", {
141
+ className: require_data_table_module.default.tbody,
142
+ children: loading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tr", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", {
143
+ colSpan: columnSpan,
144
+ className: require_data_table_module.default.loadingCell,
145
+ children: [
146
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
147
+ className: require_data_table_module.default.loadingRow,
148
+ "aria-busy": "true",
149
+ children: [
150
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_data_table_module.default.skeletonBar }),
151
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_data_table_module.default.skeletonBar }),
152
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_data_table_module.default.skeletonBar })
153
+ ]
154
+ }),
155
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
156
+ className: require_data_table_module.default.loadingRow,
157
+ "aria-busy": "true",
158
+ children: [
159
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_data_table_module.default.skeletonBar }),
160
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_data_table_module.default.skeletonBar }),
161
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_data_table_module.default.skeletonBar })
162
+ ]
163
+ }),
164
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
165
+ className: require_data_table_module.default.loadingRow,
166
+ "aria-busy": "true",
167
+ children: [
168
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_data_table_module.default.skeletonBar }),
169
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_data_table_module.default.skeletonBar }),
170
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_data_table_module.default.skeletonBar })
171
+ ]
172
+ })
173
+ ]
174
+ }) }) : data.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tr", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
175
+ colSpan: columnSpan,
176
+ className: require_data_table_module.default.emptyCell,
177
+ children: emptyMessage
178
+ }) }) : displayedData.map((row) => {
179
+ const id = rowKey(row);
180
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", {
181
+ className: require_cx.cx(require_data_table_module.default.row, selected.has(id) && require_data_table_module.default.rowSelected),
182
+ children: [
183
+ selectable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
184
+ className: require_data_table_module.default.cell,
185
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
186
+ type: "checkbox",
187
+ checked: selected.has(id),
188
+ onChange: () => toggleRow(id),
189
+ className: require_data_table_module.default.checkbox,
190
+ "aria-label": `Select row ${id}`
191
+ })
192
+ }),
193
+ columns.map((col) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
194
+ className: require_cx.cx(require_data_table_module.default.cell, col.align && require_data_table_module.default[`align${col.align.charAt(0).toUpperCase() + col.align.slice(1)}`]),
195
+ children: col.accessor ? col.accessor(row) : String(row[col.key] ?? "")
196
+ }, `${id}-${col.key}`)),
197
+ onRowAction && onRowAction.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
198
+ className: require_data_table_module.default.cell,
199
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
200
+ className: require_data_table_module.default.rowActions,
201
+ children: onRowAction.map((action) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
202
+ type: "button",
203
+ className: require_data_table_module.default.actionBtn,
204
+ onClick: () => action.onClick(row),
205
+ children: action.label
206
+ }, action.label))
207
+ })
208
+ })
209
+ ]
210
+ }, id);
211
+ })
70
212
  })]
71
- }),
72
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("footer", {
73
- className: require_settings_page_module.default.footer,
74
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
75
- className: require_settings_page_module.default.footerContent,
76
- children: [footer, saving && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
77
- className: require_settings_page_module.default.savingIndicator,
78
- children: "Saving..."
79
- })]
80
- })
81
213
  })
82
- ]
214
+ }), data.length > pageSize && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
215
+ className: require_data_table_module.default.pagination,
216
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
217
+ className: require_data_table_module.default.paginationInfo,
218
+ children: [
219
+ "Page ",
220
+ safePage,
221
+ " of ",
222
+ totalPages
223
+ ]
224
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
225
+ className: require_data_table_module.default.paginationButtons,
226
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
227
+ type: "button",
228
+ className: require_data_table_module.default.pageBtn,
229
+ disabled: safePage <= 1,
230
+ onClick: () => setPage((p) => Math.max(1, p - 1)),
231
+ "aria-label": "Previous page",
232
+ children: "←"
233
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
234
+ type: "button",
235
+ className: require_data_table_module.default.pageBtn,
236
+ disabled: safePage >= totalPages,
237
+ onClick: () => setPage((p) => Math.min(totalPages, p + 1)),
238
+ "aria-label": "Next page",
239
+ children: "→"
240
+ })]
241
+ })]
242
+ })]
83
243
  });
84
244
  }
85
245
  //#endregion
86
- exports.SettingsPage = SettingsPage;
246
+ exports.DataTable = DataTable;
87
247
 
88
248
  //# sourceMappingURL=index71.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index71.cjs","names":[],"sources":["../src/components/settings-page/SettingsPage.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./settings-page.module.css\";\n\nexport interface SettingsSection {\n title: React.ReactNode;\n description?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport interface SettingsPageProps {\n /** Page title */\n title: React.ReactNode;\n /** Page subtitle / description */\n description?: React.ReactNode;\n /** Form sections rendered in the main content area */\n sections: SettingsSection[];\n /** Content rendered in the danger zone (red visual distinction) */\n dangerZone?: React.ReactNode;\n /** Danger zone title */\n dangerZoneTitle?: React.ReactNode;\n /** Danger zone description */\n dangerZoneDescription?: React.ReactNode;\n /** Sticky footer content (e.g., Save / Cancel buttons) */\n footer: React.ReactNode;\n /** Whether the page is saving */\n saving?: boolean;\n /** Additional class name for the outer wrapper */\n className?: string;\n}\n\n/**\n * SettingsPage — a settings layout with sections, a danger zone, and a sticky save footer.\n *\n * Layout:\n * Header (title + description)\n * Scrollable content:\n * Section group with headings and descriptions\n * Danger zone with red visual distinction\n * Sticky footer: save/cancel buttons\n */\nexport function SettingsPage({\n title,\n description,\n sections,\n dangerZone,\n dangerZoneTitle,\n dangerZoneDescription,\n footer,\n saving = false,\n className,\n}: SettingsPageProps) {\n return (\n <div className={cx(styles.wrapper, className)}>\n <header className={styles.header}>\n <div className={styles.headerContent}>\n <h1 className={styles.title}>{title}</h1>\n {description && <p className={styles.description}>{description}</p>}\n </div>\n </header>\n\n <div className={styles.content}>\n <div className={styles.sections}>\n {sections.map((section, index) => (\n <section key={index} className={styles.section}>\n <div className={styles.sectionHeader}>\n <h2 className={styles.sectionTitle}>{section.title}</h2>\n {section.description && (\n <p className={styles.sectionDescription}>{section.description}</p>\n )}\n </div>\n <div className={styles.sectionBody}>{section.children}</div>\n </section>\n ))}\n </div>\n\n {dangerZone && (\n <div className={styles.dangerZone}>\n {(dangerZoneTitle || dangerZoneDescription) && (\n <div className={styles.dangerZoneHeader}>\n {dangerZoneTitle && <h2 className={styles.dangerZoneTitle}>{dangerZoneTitle}</h2>}\n {dangerZoneDescription && (\n <p className={styles.dangerZoneDescription}>{dangerZoneDescription}</p>\n )}\n </div>\n )}\n <div className={styles.dangerZoneBody}>{dangerZone}</div>\n </div>\n )}\n </div>\n\n <footer className={styles.footer}>\n <div className={styles.footerContent}>\n {footer}\n {saving && <span className={styles.savingIndicator}>Saving...</span>}\n </div>\n </footer>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyCA,SAAgB,aAAa,EAC3B,OACA,aACA,UACA,YACA,iBACA,uBACA,QACA,SAAS,OACT,aACoB;CACpB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAW,WAAA,GAAG,6BAAA,QAAO,SAAS,SAAS;YAA5C;GACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IAAQ,WAAW,6BAAA,QAAO;cACxB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,6BAAA,QAAO;eAAvB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,WAAW,6BAAA,QAAO;gBAAQ;KAAU,CAAA,GACvC,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAW,6BAAA,QAAO;gBAAc;KAAe,CAAA,CAC/D;;GACC,CAAA;GAER,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAW,6BAAA,QAAO;cAAvB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAW,6BAAA,QAAO;eACpB,SAAS,KAAK,SAAS,UACtB,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAqB,WAAW,6BAAA,QAAO;gBAAvC,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAW,6BAAA,QAAO;iBAAvB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,WAAW,6BAAA,QAAO;kBAAe,QAAQ;OAAU,CAAA,GACtD,QAAQ,eACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAW,6BAAA,QAAO;kBAAqB,QAAQ;OAAe,CAAA,CAEhE;UACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAW,6BAAA,QAAO;iBAAc,QAAQ;MAAc,CAAA,CACpD;QARK,KAQL,CACV;IACE,CAAA,GAEJ,cACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,6BAAA,QAAO;eAAvB,EACI,mBAAmB,0BACnB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAW,6BAAA,QAAO;gBAAvB,CACG,mBAAmB,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAW,6BAAA,QAAO;iBAAkB;MAAoB,CAAA,GAC/E,yBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAW,6BAAA,QAAO;iBAAwB;MAAyB,CAAA,CAErE;SAEP,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAW,6BAAA,QAAO;gBAAiB;KAAgB,CAAA,CACrD;MAEJ;;GAEL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IAAQ,WAAW,6BAAA,QAAO;cACxB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,6BAAA,QAAO;eAAvB,CACG,QACA,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAW,6BAAA,QAAO;gBAAiB;KAAe,CAAA,CAChE;;GACC,CAAA;EACL;;AAET"}
1
+ {"version":3,"file":"index71.cjs","names":[],"sources":["../src/components/data-table/DataTable.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./data-table.module.css\";\n\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport interface Column<T = Record<string, unknown>> {\n key: string;\n label: React.ReactNode;\n accessor?: (row: T) => React.ReactNode;\n sortable?: boolean;\n width?: string;\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport type DataTableRowAction = {\n label: string;\n onClick: (row: Record<string, unknown>) => void;\n};\n\nexport interface DataTableProps<T = Record<string, unknown>> {\n data: T[];\n columns: readonly Column<T>[];\n /** Array of action buttons to render per row */\n onRowAction?: DataTableRowAction[];\n /** Called when rows are selected; receives selected row IDs */\n onSelectionChange?: (selectedIds: string[]) => void;\n /** Whether the table is in a loading state */\n loading?: boolean;\n /** Message displayed when data is empty */\n emptyMessage?: string;\n /** Number of rows per page */\n pageSize?: number;\n /** Whether rows are selectable via checkbox */\n selectable?: boolean;\n /** Custom row key extractor (defaults to row.id) */\n rowKey?: (row: T) => string;\n /** Additional class name for the table wrapper */\n className?: string;\n}\n\nexport function DataTable<T extends Record<string, unknown> = Record<string, unknown>>({\n data,\n columns,\n onRowAction,\n onSelectionChange,\n loading = false,\n emptyMessage = \"No data found\",\n pageSize = 10,\n selectable = false,\n rowKey = (row: T) => String(row.id ?? \"\"),\n className,\n}: DataTableProps<T>) {\n const [sortKey, setSortKey] = React.useState<string | null>(null);\n const [sortDir, setSortDir] = React.useState<SortDirection>(\"asc\");\n const [page, setPage] = React.useState(1);\n const [selected, setSelected] = React.useState<Set<string>>(new Set());\n\n const handleSort = (key: string) => {\n if (key === sortKey) {\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\n } else {\n setSortKey(key);\n setSortDir(\"asc\");\n }\n };\n\n const toggleRow = (id: string) => {\n const next = new Set(selected);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n setSelected(next);\n onSelectionChange?.(Array.from(next));\n };\n\n const toggleAll = () => {\n const allKeys = displayedData.map((r) => rowKey(r));\n const allSelected = allKeys.every((k) => selected.has(k));\n const next = new Set(selected);\n if (allSelected) {\n allKeys.forEach((k) => next.delete(k));\n } else {\n allKeys.forEach((k) => next.add(k));\n }\n setSelected(next);\n onSelectionChange?.(Array.from(next));\n };\n\n const totalPages = Math.max(1, Math.ceil(data.length / pageSize));\n const safePage = Math.min(page, totalPages);\n const columnSpan =\n columns.length + (selectable ? 1 : 0) + (onRowAction && onRowAction.length > 0 ? 1 : 0);\n\n React.useEffect(() => {\n if (page > totalPages) {\n setPage(totalPages);\n }\n }, [data.length, page, totalPages]);\n\n const sortedData = React.useMemo(() => {\n if (!sortKey) return data;\n\n const sortColumn = columns.find((column) => column.key === sortKey);\n const getSortValue = (row: T): unknown => {\n if (sortColumn?.accessor) {\n const accessed = sortColumn.accessor(row);\n if (typeof accessed === \"string\" || typeof accessed === \"number\") {\n return accessed;\n }\n }\n return row[sortKey as keyof T];\n };\n\n return [...data].sort((a, b) => {\n const aVal = getSortValue(a);\n const bVal = getSortValue(b);\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n let cmp = 0;\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n cmp = aVal - bVal;\n } else {\n cmp = String(aVal).localeCompare(String(bVal));\n }\n return sortDir === \"asc\" ? cmp : -cmp;\n });\n }, [columns, data, sortKey, sortDir]);\n\n const displayedData = React.useMemo(() => {\n const start = (safePage - 1) * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [sortedData, safePage, pageSize]);\n\n const displayedKeys = React.useMemo(() => displayedData.map(rowKey), [displayedData, rowKey]);\n const allPageSelected =\n displayedKeys.length > 0 && displayedKeys.every((k) => selected.has(k));\n const somePageSelected =\n displayedKeys.length > 0 && displayedKeys.some((k) => selected.has(k));\n\n return (\n <div className={cx(styles.wrapper, className)}>\n <div className={styles.tableContainer}>\n <table className={styles.table}>\n <thead className={styles.thead}>\n <tr>\n {selectable && (\n <th className={styles.headerCell} aria-label=\"Select all\">\n <input\n type=\"checkbox\"\n checked={allPageSelected}\n ref={(el) => {\n if (el) el.indeterminate = somePageSelected && !allPageSelected;\n }}\n onChange={toggleAll}\n className={styles.checkbox}\n aria-label=\"Select all rows on this page\"\n />\n </th>\n )}\n {columns.map((col) => {\n const ariaSort = col.sortable\n ? sortKey === col.key\n ? sortDir === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : \"none\"\n : undefined;\n\n return (\n <th\n key={col.key}\n className={cx(\n styles.headerCell,\n col.width && styles.headerCellFixed,\n col.align && styles[`align${col.align.charAt(0).toUpperCase() + col.align.slice(1)}`],\n )}\n style={col.width ? { width: col.width } : undefined}\n aria-sort={ariaSort}\n >\n {col.sortable ? (\n <button\n type=\"button\"\n className={cx(styles.sortableHeader, styles.clickableHeader)}\n onClick={() => handleSort(col.key)}\n >\n <span className={styles.headerLabel}>{col.label}</span>\n <span className={styles.sortIcon} aria-hidden=\"true\">\n {sortKey === col.key ? (\n sortDir === \"asc\" ? (\n \"\\u25B2\"\n ) : (\n \"\\u25BC\"\n )\n ) : (\n \"\\u25B2\\u25BC\"\n )}\n </span>\n </button>\n ) : (\n <span className={styles.headerLabel}>{col.label}</span>\n )}\n </th>\n );\n })}\n {onRowAction && onRowAction.length > 0 && (\n <th className={styles.headerCell} style={{ width: \"5rem\" }}>\n <span className={styles.headerLabel}>Actions</span>\n </th>\n )}\n </tr>\n </thead>\n <tbody className={styles.tbody}>\n {loading ? (\n <tr>\n <td colSpan={columnSpan} className={styles.loadingCell}>\n <div className={styles.loadingRow} aria-busy=\"true\">\n <div className={styles.skeletonBar} />\n <div className={styles.skeletonBar} />\n <div className={styles.skeletonBar} />\n </div>\n <div className={styles.loadingRow} aria-busy=\"true\">\n <div className={styles.skeletonBar} />\n <div className={styles.skeletonBar} />\n <div className={styles.skeletonBar} />\n </div>\n <div className={styles.loadingRow} aria-busy=\"true\">\n <div className={styles.skeletonBar} />\n <div className={styles.skeletonBar} />\n <div className={styles.skeletonBar} />\n </div>\n </td>\n </tr>\n ) : data.length === 0 ? (\n <tr>\n <td colSpan={columnSpan} className={styles.emptyCell}>\n {emptyMessage}\n </td>\n </tr>\n ) : (\n displayedData.map((row) => {\n const id = rowKey(row);\n return (\n <tr key={id} className={cx(styles.row, selected.has(id) && styles.rowSelected)}>\n {selectable && (\n <td className={styles.cell}>\n <input\n type=\"checkbox\"\n checked={selected.has(id)}\n onChange={() => toggleRow(id)}\n className={styles.checkbox}\n aria-label={`Select row ${id}`}\n />\n </td>\n )}\n {columns.map((col) => (\n <td\n key={`${id}-${col.key}`}\n className={cx(\n styles.cell,\n col.align && styles[`align${col.align.charAt(0).toUpperCase() + col.align.slice(1)}`],\n )}\n >\n {col.accessor ? col.accessor(row) : String(row[col.key as keyof T] ?? \"\")}\n </td>\n ))}\n {onRowAction && onRowAction.length > 0 && (\n <td className={styles.cell}>\n <div className={styles.rowActions}>\n {onRowAction.map((action) => (\n <button\n key={action.label}\n type=\"button\"\n className={styles.actionBtn}\n onClick={() => action.onClick(row)}\n >\n {action.label}\n </button>\n ))}\n </div>\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n {data.length > pageSize && (\n <div className={styles.pagination}>\n <span className={styles.paginationInfo}>\n Page {safePage} of {totalPages}\n </span>\n <div className={styles.paginationButtons}>\n <button\n type=\"button\"\n className={styles.pageBtn}\n disabled={safePage <= 1}\n onClick={() => setPage((p) => Math.max(1, p - 1))}\n aria-label=\"Previous page\"\n >\n &larr;\n </button>\n <button\n type=\"button\"\n className={styles.pageBtn}\n disabled={safePage >= totalPages}\n onClick={() => setPage((p) => Math.min(totalPages, p + 1))}\n aria-label=\"Next page\"\n >\n &rarr;\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
package/dist/index71.js CHANGED
@@ -1,25 +1,47 @@
1
- //#region src/components/error-page/error-page.module.css
2
- var layout = "uzi-error-page-module__layout__OVDE8";
3
- var card = "uzi-error-page-module__card__2veSo";
4
- var icon = "uzi-error-page-module__icon__vJy8E";
5
- var iconSvg = "uzi-error-page-module__iconSvg__h4u4V";
6
- var statusCode = "uzi-error-page-module__statusCode__Ub40l";
7
- var content = "uzi-error-page-module__content__b2dAY";
8
- var title = "uzi-error-page-module__title__8iioy";
9
- var subtitle = "uzi-error-page-module__subtitle__NVk-v";
10
- var action = "uzi-error-page-module__action__iX5fQ";
11
- var error_page_module_default = {
12
- layout,
13
- card,
14
- icon,
15
- iconSvg,
16
- statusCode,
17
- content,
1
+ //#region src/components/settings-page/settings-page.module.css
2
+ var wrapper = "uzi-settings-page-module__wrapper__G7OOt";
3
+ var header = "uzi-settings-page-module__header__ao-nv";
4
+ var headerContent = "uzi-settings-page-module__headerContent__xwP9V";
5
+ var title = "uzi-settings-page-module__title__anF9l";
6
+ var description = "uzi-settings-page-module__description__Qw6EQ";
7
+ var content = "uzi-settings-page-module__content__MBz6q";
8
+ var sections = "uzi-settings-page-module__sections__HV2n4";
9
+ var section = "uzi-settings-page-module__section__Vjoe3";
10
+ var sectionHeader = "uzi-settings-page-module__sectionHeader__XiOWN";
11
+ var sectionTitle = "uzi-settings-page-module__sectionTitle__bN5lO";
12
+ var sectionDescription = "uzi-settings-page-module__sectionDescription__3wjhy";
13
+ var sectionBody = "uzi-settings-page-module__sectionBody__zraHK";
14
+ var dangerZone = "uzi-settings-page-module__dangerZone__GD8XX";
15
+ var dangerZoneHeader = "uzi-settings-page-module__dangerZoneHeader__2d3R1";
16
+ var dangerZoneTitle = "uzi-settings-page-module__dangerZoneTitle__ljU2k";
17
+ var dangerZoneDescription = "uzi-settings-page-module__dangerZoneDescription__Z3Ohe";
18
+ var dangerZoneBody = "uzi-settings-page-module__dangerZoneBody__zAQbu";
19
+ var footer = "uzi-settings-page-module__footer__dO4Xo";
20
+ var footerContent = "uzi-settings-page-module__footerContent__pPOdb";
21
+ var savingIndicator = "uzi-settings-page-module__savingIndicator__ujaC5";
22
+ var settings_page_module_default = {
23
+ wrapper,
24
+ header,
25
+ headerContent,
18
26
  title,
19
- subtitle,
20
- action
27
+ description,
28
+ content,
29
+ sections,
30
+ section,
31
+ sectionHeader,
32
+ sectionTitle,
33
+ sectionDescription,
34
+ sectionBody,
35
+ dangerZone,
36
+ dangerZoneHeader,
37
+ dangerZoneTitle,
38
+ dangerZoneDescription,
39
+ dangerZoneBody,
40
+ footer,
41
+ footerContent,
42
+ savingIndicator
21
43
  };
22
44
  //#endregion
23
- export { action, card, content, error_page_module_default as default, icon, iconSvg, layout, statusCode, subtitle, title };
45
+ export { content, dangerZone, dangerZoneBody, dangerZoneDescription, dangerZoneHeader, dangerZoneTitle, settings_page_module_default as default, description, footer, footerContent, header, headerContent, savingIndicator, section, sectionBody, sectionDescription, sectionHeader, sectionTitle, sections, title, wrapper };
24
46
 
25
47
  //# sourceMappingURL=index71.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index71.js","names":[],"sources":["../src/components/error-page/error-page.module.css"],"sourcesContent":[".layout {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n min-height: 100dvh;\n padding: 24px;\n background: var(--background);\n}\n\n.card {\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1.5rem;\n max-width: 40rem;\n padding: 3rem 2rem;\n}\n\n.icon {\n color: var(--muted-foreground);\n}\n\n.iconSvg {\n width: 4rem;\n height: 4rem;\n stroke-width: 1.5;\n}\n\n.statusCode {\n font-size: 6rem;\n font-weight: 700;\n line-height: 1;\n color: var(--muted-foreground);\n letter-spacing: -0.04em;\n}\n\n.content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1rem;\n}\n\n.title {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n color: var(--foreground);\n line-height: 1.3;\n}\n\n.subtitle {\n margin: 0;\n font-size: 1rem;\n color: var(--muted-foreground);\n line-height: 1.6;\n max-width: 32rem;\n}\n\n.action {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.75rem;\n margin-top: 0.5rem;\n}\n\n@media (max-width: 48rem) {\n .statusCode {\n font-size: 4rem;\n }\n\n .title {\n font-size: 1.25rem;\n }\n\n .card {\n padding: 2rem 1.5rem;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"index71.js","names":[],"sources":["../src/components/settings-page/settings-page.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n background: var(--background);\n color: var(--foreground);\n}\n\n.header {\n padding: 2rem 2rem 0;\n flex-shrink: 0;\n}\n\n.headerContent {\n max-width: 64rem;\n margin: 0 auto;\n}\n\n.title {\n margin: 0 0 0.25rem;\n font-size: 1.5rem;\n font-weight: 600;\n color: var(--foreground);\n line-height: 1.3;\n}\n\n.description {\n margin: 0;\n font-size: 0.9rem;\n color: var(--muted-foreground);\n line-height: 1.5;\n}\n\n.content {\n flex: 1;\n padding: 1.5rem 2rem 6rem;\n max-width: 64rem;\n margin: 0 auto;\n width: 100%;\n overflow-y: auto;\n}\n\n.sections {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n}\n\n.section {\n border-bottom: 1px solid var(--border);\n padding-bottom: 1.5rem;\n}\n\n.section:last-of-type {\n border-bottom: none;\n}\n\n.sectionHeader {\n margin-bottom: 1.25rem;\n}\n\n.sectionTitle {\n margin: 0 0 0.25rem;\n font-size: 1.125rem;\n font-weight: 600;\n color: var(--foreground);\n}\n\n.sectionDescription {\n margin: 0;\n font-size: 0.85rem;\n color: var(--muted-foreground);\n line-height: 1.5;\n}\n\n.sectionBody {\n display: flex;\n flex-direction: column;\n gap: 1.25rem;\n}\n\n.dangerZone {\n margin-top: 2rem;\n border: 1px solid var(--ts-danger-border, var(--destructive));\n border-radius: 8px;\n background: var(--ts-danger-bg, color-mix(in srgb, var(--destructive) 8%, transparent));\n padding: 1.5rem;\n}\n\n.dangerZoneHeader {\n margin-bottom: 1rem;\n}\n\n.dangerZoneTitle {\n margin: 0 0 0.25rem;\n font-size: 1rem;\n font-weight: 600;\n color: var(--ts-danger-text, var(--destructive));\n}\n\n.dangerZoneDescription {\n margin: 0;\n font-size: 0.85rem;\n color: var(--muted-foreground);\n line-height: 1.5;\n}\n\n.dangerZoneBody {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.footer {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n border-top: 1px solid var(--border);\n background: var(--background);\n z-index: 10;\n padding: 0.75rem 2rem;\n}\n\n.footerContent {\n max-width: 64rem;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n}\n\n.savingIndicator {\n font-size: 0.85rem;\n color: var(--muted-foreground);\n}\n\n@media (max-width: 48rem) {\n .header {\n padding: 1.5rem 1rem 0;\n }\n\n .content {\n padding: 1rem 1rem 6rem;\n }\n\n .footer {\n padding: 0.75rem 1rem;\n }\n\n .footerContent {\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n }\n}\n"],"mappings":""}
package/dist/index72.cjs CHANGED
@@ -1,34 +1,67 @@
1
- //#region src/components/error-page/error-page.module.css
2
- var layout = "uzi-error-page-module__layout__OVDE8";
3
- var card = "uzi-error-page-module__card__2veSo";
4
- var icon = "uzi-error-page-module__icon__vJy8E";
5
- var iconSvg = "uzi-error-page-module__iconSvg__h4u4V";
6
- var statusCode = "uzi-error-page-module__statusCode__Ub40l";
7
- var content = "uzi-error-page-module__content__b2dAY";
8
- var title = "uzi-error-page-module__title__8iioy";
9
- var subtitle = "uzi-error-page-module__subtitle__NVk-v";
10
- var action = "uzi-error-page-module__action__iX5fQ";
11
- var error_page_module_default = {
12
- layout,
13
- card,
14
- icon,
15
- iconSvg,
16
- statusCode,
17
- content,
1
+ //#region src/components/settings-page/settings-page.module.css
2
+ var wrapper = "uzi-settings-page-module__wrapper__G7OOt";
3
+ var header = "uzi-settings-page-module__header__ao-nv";
4
+ var headerContent = "uzi-settings-page-module__headerContent__xwP9V";
5
+ var title = "uzi-settings-page-module__title__anF9l";
6
+ var description = "uzi-settings-page-module__description__Qw6EQ";
7
+ var content = "uzi-settings-page-module__content__MBz6q";
8
+ var sections = "uzi-settings-page-module__sections__HV2n4";
9
+ var section = "uzi-settings-page-module__section__Vjoe3";
10
+ var sectionHeader = "uzi-settings-page-module__sectionHeader__XiOWN";
11
+ var sectionTitle = "uzi-settings-page-module__sectionTitle__bN5lO";
12
+ var sectionDescription = "uzi-settings-page-module__sectionDescription__3wjhy";
13
+ var sectionBody = "uzi-settings-page-module__sectionBody__zraHK";
14
+ var dangerZone = "uzi-settings-page-module__dangerZone__GD8XX";
15
+ var dangerZoneHeader = "uzi-settings-page-module__dangerZoneHeader__2d3R1";
16
+ var dangerZoneTitle = "uzi-settings-page-module__dangerZoneTitle__ljU2k";
17
+ var dangerZoneDescription = "uzi-settings-page-module__dangerZoneDescription__Z3Ohe";
18
+ var dangerZoneBody = "uzi-settings-page-module__dangerZoneBody__zAQbu";
19
+ var footer = "uzi-settings-page-module__footer__dO4Xo";
20
+ var footerContent = "uzi-settings-page-module__footerContent__pPOdb";
21
+ var savingIndicator = "uzi-settings-page-module__savingIndicator__ujaC5";
22
+ var settings_page_module_default = {
23
+ wrapper,
24
+ header,
25
+ headerContent,
18
26
  title,
19
- subtitle,
20
- action
27
+ description,
28
+ content,
29
+ sections,
30
+ section,
31
+ sectionHeader,
32
+ sectionTitle,
33
+ sectionDescription,
34
+ sectionBody,
35
+ dangerZone,
36
+ dangerZoneHeader,
37
+ dangerZoneTitle,
38
+ dangerZoneDescription,
39
+ dangerZoneBody,
40
+ footer,
41
+ footerContent,
42
+ savingIndicator
21
43
  };
22
44
  //#endregion
23
- exports.action = action;
24
- exports.card = card;
25
45
  exports.content = content;
26
- exports.default = error_page_module_default;
27
- exports.icon = icon;
28
- exports.iconSvg = iconSvg;
29
- exports.layout = layout;
30
- exports.statusCode = statusCode;
31
- exports.subtitle = subtitle;
46
+ exports.dangerZone = dangerZone;
47
+ exports.dangerZoneBody = dangerZoneBody;
48
+ exports.dangerZoneDescription = dangerZoneDescription;
49
+ exports.dangerZoneHeader = dangerZoneHeader;
50
+ exports.dangerZoneTitle = dangerZoneTitle;
51
+ exports.default = settings_page_module_default;
52
+ exports.description = description;
53
+ exports.footer = footer;
54
+ exports.footerContent = footerContent;
55
+ exports.header = header;
56
+ exports.headerContent = headerContent;
57
+ exports.savingIndicator = savingIndicator;
58
+ exports.section = section;
59
+ exports.sectionBody = sectionBody;
60
+ exports.sectionDescription = sectionDescription;
61
+ exports.sectionHeader = sectionHeader;
62
+ exports.sectionTitle = sectionTitle;
63
+ exports.sections = sections;
32
64
  exports.title = title;
65
+ exports.wrapper = wrapper;
33
66
 
34
67
  //# sourceMappingURL=index72.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index72.cjs","names":[],"sources":["../src/components/error-page/error-page.module.css"],"sourcesContent":[".layout {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n min-height: 100dvh;\n padding: 24px;\n background: var(--background);\n}\n\n.card {\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1.5rem;\n max-width: 40rem;\n padding: 3rem 2rem;\n}\n\n.icon {\n color: var(--muted-foreground);\n}\n\n.iconSvg {\n width: 4rem;\n height: 4rem;\n stroke-width: 1.5;\n}\n\n.statusCode {\n font-size: 6rem;\n font-weight: 700;\n line-height: 1;\n color: var(--muted-foreground);\n letter-spacing: -0.04em;\n}\n\n.content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1rem;\n}\n\n.title {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n color: var(--foreground);\n line-height: 1.3;\n}\n\n.subtitle {\n margin: 0;\n font-size: 1rem;\n color: var(--muted-foreground);\n line-height: 1.6;\n max-width: 32rem;\n}\n\n.action {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.75rem;\n margin-top: 0.5rem;\n}\n\n@media (max-width: 48rem) {\n .statusCode {\n font-size: 4rem;\n }\n\n .title {\n font-size: 1.25rem;\n }\n\n .card {\n padding: 2rem 1.5rem;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"index72.cjs","names":[],"sources":["../src/components/settings-page/settings-page.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n background: var(--background);\n color: var(--foreground);\n}\n\n.header {\n padding: 2rem 2rem 0;\n flex-shrink: 0;\n}\n\n.headerContent {\n max-width: 64rem;\n margin: 0 auto;\n}\n\n.title {\n margin: 0 0 0.25rem;\n font-size: 1.5rem;\n font-weight: 600;\n color: var(--foreground);\n line-height: 1.3;\n}\n\n.description {\n margin: 0;\n font-size: 0.9rem;\n color: var(--muted-foreground);\n line-height: 1.5;\n}\n\n.content {\n flex: 1;\n padding: 1.5rem 2rem 6rem;\n max-width: 64rem;\n margin: 0 auto;\n width: 100%;\n overflow-y: auto;\n}\n\n.sections {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n}\n\n.section {\n border-bottom: 1px solid var(--border);\n padding-bottom: 1.5rem;\n}\n\n.section:last-of-type {\n border-bottom: none;\n}\n\n.sectionHeader {\n margin-bottom: 1.25rem;\n}\n\n.sectionTitle {\n margin: 0 0 0.25rem;\n font-size: 1.125rem;\n font-weight: 600;\n color: var(--foreground);\n}\n\n.sectionDescription {\n margin: 0;\n font-size: 0.85rem;\n color: var(--muted-foreground);\n line-height: 1.5;\n}\n\n.sectionBody {\n display: flex;\n flex-direction: column;\n gap: 1.25rem;\n}\n\n.dangerZone {\n margin-top: 2rem;\n border: 1px solid var(--ts-danger-border, var(--destructive));\n border-radius: 8px;\n background: var(--ts-danger-bg, color-mix(in srgb, var(--destructive) 8%, transparent));\n padding: 1.5rem;\n}\n\n.dangerZoneHeader {\n margin-bottom: 1rem;\n}\n\n.dangerZoneTitle {\n margin: 0 0 0.25rem;\n font-size: 1rem;\n font-weight: 600;\n color: var(--ts-danger-text, var(--destructive));\n}\n\n.dangerZoneDescription {\n margin: 0;\n font-size: 0.85rem;\n color: var(--muted-foreground);\n line-height: 1.5;\n}\n\n.dangerZoneBody {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.footer {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n border-top: 1px solid var(--border);\n background: var(--background);\n z-index: 10;\n padding: 0.75rem 2rem;\n}\n\n.footerContent {\n max-width: 64rem;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n}\n\n.savingIndicator {\n font-size: 0.85rem;\n color: var(--muted-foreground);\n}\n\n@media (max-width: 48rem) {\n .header {\n padding: 1.5rem 1rem 0;\n }\n\n .content {\n padding: 1rem 1rem 6rem;\n }\n\n .footer {\n padding: 0.75rem 1rem;\n }\n\n .footerContent {\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n }\n}\n"],"mappings":""}