@vadimcomanescu/nadicode-design-system 4.0.2 → 4.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/catalog/catalog.d.ts +18 -0
- package/dist/catalog/catalog.js +22 -0
- package/dist/catalog/components.d.ts +2 -0
- package/dist/catalog/components.js +11 -6
- package/dist/chunk-PTJPPKDR.js +115 -0
- package/dist/chunk-ZXVDDZZL.js +96 -0
- package/dist/components/blocks/IntegrationsBlock.js +2 -2
- package/dist/components/blocks/TimezonePickerBlock.d.ts +11 -0
- package/dist/components/blocks/TimezonePickerBlock.js +126 -0
- package/dist/components/logos/index.js +1 -1
- package/dist/lib/timezones.d.ts +14 -0
- package/dist/lib/timezones.js +1 -0
- package/eslint-rules/nadicode/config.js +0 -1
- package/eslint-rules/nadicode/index.js +0 -2
- package/package.json +6 -2
- package/scripts/ds-update.mjs +52 -14
- package/eslint-rules/nadicode/rules/no-deprecated-ds-import.js +0 -77
- package/dist/{chunk-6HGSU24S.js → chunk-BSCC7OQK.js} +1 -1
|
@@ -821,6 +821,24 @@ export declare const seedComponentDefinitions: {
|
|
|
821
821
|
events: string[];
|
|
822
822
|
description: string;
|
|
823
823
|
};
|
|
824
|
+
TimezonePickerBlock: {
|
|
825
|
+
props: z.ZodObject<{
|
|
826
|
+
value: z.ZodNullable<z.ZodString>;
|
|
827
|
+
groups: z.ZodNullable<z.ZodArray<z.ZodObject<{
|
|
828
|
+
region: z.ZodString;
|
|
829
|
+
timezones: z.ZodArray<z.ZodObject<{
|
|
830
|
+
value: z.ZodString;
|
|
831
|
+
label: z.ZodString;
|
|
832
|
+
region: z.ZodString;
|
|
833
|
+
offset: z.ZodString;
|
|
834
|
+
offsetMinutes: z.ZodNumber;
|
|
835
|
+
}, z.core.$strip>>;
|
|
836
|
+
}, z.core.$strip>>>;
|
|
837
|
+
name: z.ZodNullable<z.ZodString>;
|
|
838
|
+
}, z.core.$strip>;
|
|
839
|
+
events: string[];
|
|
840
|
+
description: string;
|
|
841
|
+
};
|
|
824
842
|
UsageDonutBlock: {
|
|
825
843
|
props: z.ZodObject<{
|
|
826
844
|
data: z.ZodNullable<z.ZodArray<z.ZodObject<{
|
package/dist/catalog/catalog.js
CHANGED
|
@@ -761,6 +761,28 @@ var seedComponentDefinitions = {
|
|
|
761
761
|
events: ["verify", "complete"],
|
|
762
762
|
description: "Two-factor setup wizard with QR code, secret key display, backup codes, and verification."
|
|
763
763
|
},
|
|
764
|
+
TimezonePickerBlock: {
|
|
765
|
+
props: z.object({
|
|
766
|
+
value: z.string().nullable(),
|
|
767
|
+
groups: z.array(
|
|
768
|
+
z.object({
|
|
769
|
+
region: z.string(),
|
|
770
|
+
timezones: z.array(
|
|
771
|
+
z.object({
|
|
772
|
+
value: z.string(),
|
|
773
|
+
label: z.string(),
|
|
774
|
+
region: z.string(),
|
|
775
|
+
offset: z.string(),
|
|
776
|
+
offsetMinutes: z.number()
|
|
777
|
+
})
|
|
778
|
+
)
|
|
779
|
+
})
|
|
780
|
+
).nullable(),
|
|
781
|
+
name: z.string().nullable()
|
|
782
|
+
}),
|
|
783
|
+
events: ["change"],
|
|
784
|
+
description: "Searchable timezone picker with grouped IANA timezones, offset display, and form integration."
|
|
785
|
+
},
|
|
764
786
|
UsageDonutBlock: {
|
|
765
787
|
props: z.object({
|
|
766
788
|
data: z.array(
|
|
@@ -51,6 +51,7 @@ import { TeamBlock } from '../components/blocks/TeamBlock';
|
|
|
51
51
|
import { TestimonialsBlock } from '../components/blocks/TestimonialsBlock';
|
|
52
52
|
import { TwoFactorChallengeBlock } from '../components/blocks/TwoFactorChallengeBlock';
|
|
53
53
|
import { TwoFactorSetupBlock } from '../components/blocks/TwoFactorSetupBlock';
|
|
54
|
+
import { TimezonePickerBlock } from '../components/blocks/TimezonePickerBlock';
|
|
54
55
|
import { UsageDonutBlock } from '../components/blocks/UsageDonutBlock';
|
|
55
56
|
import { AudioVisualizerBlock } from '../components/blocks/AudioVisualizerBlock';
|
|
56
57
|
import { AuthLayout } from '../components/blocks/AuthLayout';
|
|
@@ -141,6 +142,7 @@ export declare const seedComponents: {
|
|
|
141
142
|
readonly TestimonialsBlock: typeof TestimonialsBlock;
|
|
142
143
|
readonly TwoFactorChallengeBlock: typeof TwoFactorChallengeBlock;
|
|
143
144
|
readonly TwoFactorSetupBlock: typeof TwoFactorSetupBlock;
|
|
145
|
+
readonly TimezonePickerBlock: typeof TimezonePickerBlock;
|
|
144
146
|
readonly UsageDonutBlock: typeof UsageDonutBlock;
|
|
145
147
|
readonly AudioVisualizerBlock: typeof AudioVisualizerBlock;
|
|
146
148
|
readonly AuthLayout: typeof AuthLayout;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
|
+
import { SuccessPageKit } from '../chunk-3U56FXYC.js';
|
|
2
3
|
import { TeamSettingsPageKit } from '../chunk-DEZXWNYF.js';
|
|
3
4
|
import { TwoFactorPageKit } from '../chunk-S5OY2B63.js';
|
|
4
5
|
import { VerifyEmailPageKit } from '../chunk-SWRJWMGG.js';
|
|
5
6
|
import { VoiceAgentsPageKit } from '../chunk-32OLQ7FC.js';
|
|
7
|
+
import { OnboardingPageKit } from '../chunk-BYEHHZZN.js';
|
|
6
8
|
import { PricingPageKit } from '../chunk-RMGDDOCD.js';
|
|
7
9
|
import { ProfileSettingsPageKit } from '../chunk-MGSGCARB.js';
|
|
8
10
|
import { RecoveryPageKit } from '../chunk-BRCBJ3S4.js';
|
|
@@ -10,13 +12,13 @@ import { ResetPageKit } from '../chunk-LP6ZZYOQ.js';
|
|
|
10
12
|
import { ServiceSuitePageKit } from '../chunk-K4U67BVG.js';
|
|
11
13
|
import { SettingsPageKit } from '../chunk-RKQPU75I.js';
|
|
12
14
|
import { SignupPageKit } from '../chunk-BRICSLHJ.js';
|
|
13
|
-
import { SuccessPageKit } from '../chunk-3U56FXYC.js';
|
|
14
15
|
import { DashboardPageKit } from '../chunk-C33GUEDY.js';
|
|
15
16
|
import { ErrorPageKit } from '../chunk-HPTHS7SX.js';
|
|
16
17
|
import { KanbanBoardPageKit } from '../chunk-25BOZMXA.js';
|
|
18
|
+
import { CrudListDetailPageKit } from '../chunk-OJ7OO3QB.js';
|
|
17
19
|
import { LandingPageKit } from '../chunk-LK2L3C7D.js';
|
|
18
20
|
import { LoginPageKit } from '../chunk-Z2WION42.js';
|
|
19
|
-
import {
|
|
21
|
+
import { InviteUserModal } from '../chunk-YDYDGG5K.js';
|
|
20
22
|
import { AccountLockedPageKit } from '../chunk-DNJEVMDY.js';
|
|
21
23
|
import { AgentsChatPageKit } from '../chunk-UR43ANYS.js';
|
|
22
24
|
import { AnalyticsPageKit } from '../chunk-CUDMDYKE.js';
|
|
@@ -25,16 +27,16 @@ import { CheckoutPageKit } from '../chunk-LGW7FVG5.js';
|
|
|
25
27
|
import { CompanySuitePageKit } from '../chunk-QW5II6YK.js';
|
|
26
28
|
import { MarketingShellPageKit } from '../chunk-Z233ZQZE.js';
|
|
27
29
|
import { CrudFormPageKit } from '../chunk-KWILREVQ.js';
|
|
28
|
-
import { CrudListDetailPageKit } from '../chunk-OJ7OO3QB.js';
|
|
29
30
|
import { NavigationShellPageKit } from '../chunk-ZKLB5N3Q.js';
|
|
30
31
|
import { TeamBlock } from '../chunk-VBZQ4DBE.js';
|
|
31
32
|
import { TestimonialsBlock } from '../chunk-FV2G6SAF.js';
|
|
33
|
+
import { TimezonePickerBlock } from '../chunk-ZXVDDZZL.js';
|
|
34
|
+
import '../chunk-PTJPPKDR.js';
|
|
32
35
|
import { TwoFactorChallengeBlock } from '../chunk-W7FXDRQJ.js';
|
|
33
36
|
import { TwoFactorSetupBlock } from '../chunk-IXQGKJU4.js';
|
|
34
37
|
import { UsageDonutBlock } from '../chunk-VRGPG2YN.js';
|
|
35
38
|
import { VoiceAgentCard } from '../chunk-HWHJ6IRQ.js';
|
|
36
39
|
import { WizardBlock } from '../chunk-XKKFSFYO.js';
|
|
37
|
-
import { InviteUserModal } from '../chunk-YDYDGG5K.js';
|
|
38
40
|
import { ProcessFlowBlock } from '../chunk-HZERHGBT.js';
|
|
39
41
|
import { ResetPasswordBlock } from '../chunk-X6VXWEDO.js';
|
|
40
42
|
import { SettingsLayout } from '../chunk-4MWKE6F5.js';
|
|
@@ -56,14 +58,14 @@ import { HeroBlock } from '../chunk-GJ557DGH.js';
|
|
|
56
58
|
import { HeroSectionBlock } from '../chunk-ALA6OM7K.js';
|
|
57
59
|
import '../chunk-QQOWC53X.js';
|
|
58
60
|
import { HeaderBlock } from '../chunk-WOYBVPXK.js';
|
|
59
|
-
import { IntegrationsBlock } from '../chunk-
|
|
61
|
+
import { IntegrationsBlock } from '../chunk-BSCC7OQK.js';
|
|
60
62
|
import '../chunk-3ZDYYZDD.js';
|
|
63
|
+
import '../chunk-BZYMCJHW.js';
|
|
61
64
|
import '../chunk-H466RJCI.js';
|
|
62
65
|
import '../chunk-DT6DGTVW.js';
|
|
63
66
|
import '../chunk-J5DRK4RF.js';
|
|
64
67
|
import '../chunk-TSVN5A2F.js';
|
|
65
68
|
import '../chunk-PX2WVDDB.js';
|
|
66
|
-
import '../chunk-BZYMCJHW.js';
|
|
67
69
|
import { InteractiveAreaChartBlock } from '../chunk-TPJ6JJ2F.js';
|
|
68
70
|
import { KanbanDemoBlock } from '../chunk-CVTMWSNS.js';
|
|
69
71
|
import { ContactBlock } from '../chunk-U4GYSYGN.js';
|
|
@@ -159,6 +161,8 @@ import '../chunk-PDSQC6VE.js';
|
|
|
159
161
|
import '../chunk-PXDHNGTG.js';
|
|
160
162
|
import '../chunk-CQEUNASC.js';
|
|
161
163
|
import '../chunk-DFPXK2JO.js';
|
|
164
|
+
import '../chunk-UYT33NG6.js';
|
|
165
|
+
import '../chunk-2HDB6MDK.js';
|
|
162
166
|
import '../chunk-W73JAOHW.js';
|
|
163
167
|
import '../chunk-S2WSXZ7Y.js';
|
|
164
168
|
import '../chunk-756Q7AC5.js';
|
|
@@ -357,6 +361,7 @@ var seedComponents = {
|
|
|
357
361
|
TestimonialsBlock,
|
|
358
362
|
TwoFactorChallengeBlock,
|
|
359
363
|
TwoFactorSetupBlock,
|
|
364
|
+
TimezonePickerBlock,
|
|
360
365
|
UsageDonutBlock,
|
|
361
366
|
AudioVisualizerBlock,
|
|
362
367
|
AuthLayout,
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// src/lib/timezones.ts
|
|
2
|
+
var FALLBACK_TIMEZONES = [
|
|
3
|
+
"Etc/UTC",
|
|
4
|
+
"America/New_York",
|
|
5
|
+
"America/Chicago",
|
|
6
|
+
"America/Denver",
|
|
7
|
+
"America/Los_Angeles",
|
|
8
|
+
"Europe/London",
|
|
9
|
+
"Europe/Rome",
|
|
10
|
+
"Europe/Bucharest",
|
|
11
|
+
"Asia/Tokyo",
|
|
12
|
+
"Australia/Sydney"
|
|
13
|
+
];
|
|
14
|
+
function getTimezoneGroups(referenceDate = /* @__PURE__ */ new Date()) {
|
|
15
|
+
const allTimezones = getAllTimezones();
|
|
16
|
+
const entries = allTimezones.filter((timezone) => timezone.includes("/") || timezone === "UTC").map((timezone) => {
|
|
17
|
+
const normalizedTimezone = timezone === "UTC" ? "Etc/UTC" : timezone;
|
|
18
|
+
const [region, ...rest] = normalizedTimezone.split("/");
|
|
19
|
+
const labelSource = rest.length > 0 ? rest[rest.length - 1] : normalizedTimezone;
|
|
20
|
+
const offsetMinutes = getOffsetMinutes(normalizedTimezone, referenceDate);
|
|
21
|
+
return {
|
|
22
|
+
value: normalizedTimezone,
|
|
23
|
+
label: labelSource.replaceAll("_", " "),
|
|
24
|
+
region,
|
|
25
|
+
offset: formatOffset(offsetMinutes),
|
|
26
|
+
offsetMinutes
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
const groupedByRegion = /* @__PURE__ */ new Map();
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
const regionEntries = groupedByRegion.get(entry.region) ?? [];
|
|
32
|
+
regionEntries.push(entry);
|
|
33
|
+
groupedByRegion.set(entry.region, regionEntries);
|
|
34
|
+
}
|
|
35
|
+
const groups = Array.from(groupedByRegion.entries()).map(([region, timezones]) => ({
|
|
36
|
+
region,
|
|
37
|
+
timezones: timezones.slice().sort(
|
|
38
|
+
(left, right) => left.offsetMinutes - right.offsetMinutes || left.label.localeCompare(right.label)
|
|
39
|
+
)
|
|
40
|
+
}));
|
|
41
|
+
return groups.sort((left, right) => left.region.localeCompare(right.region));
|
|
42
|
+
}
|
|
43
|
+
function searchTimezones(query, groups) {
|
|
44
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
45
|
+
if (!normalizedQuery) {
|
|
46
|
+
return groups.flatMap((group) => group.timezones);
|
|
47
|
+
}
|
|
48
|
+
const matches = [];
|
|
49
|
+
for (const group of groups) {
|
|
50
|
+
for (const timezone of group.timezones) {
|
|
51
|
+
const candidate = `${timezone.value} ${timezone.label} ${timezone.region} ${timezone.offset}`;
|
|
52
|
+
if (candidate.toLowerCase().includes(normalizedQuery)) {
|
|
53
|
+
matches.push(timezone);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return matches;
|
|
58
|
+
}
|
|
59
|
+
function detectBrowserTimezone() {
|
|
60
|
+
try {
|
|
61
|
+
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
62
|
+
if (!timezone) {
|
|
63
|
+
return "Etc/UTC";
|
|
64
|
+
}
|
|
65
|
+
return timezone === "UTC" ? "Etc/UTC" : timezone;
|
|
66
|
+
} catch {
|
|
67
|
+
return "Etc/UTC";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function getAllTimezones() {
|
|
71
|
+
const supportedValuesOf = Intl.supportedValuesOf;
|
|
72
|
+
if (typeof supportedValuesOf !== "function") {
|
|
73
|
+
return FALLBACK_TIMEZONES;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const supported = supportedValuesOf("timeZone");
|
|
77
|
+
if (supported.length === 0) {
|
|
78
|
+
return FALLBACK_TIMEZONES;
|
|
79
|
+
}
|
|
80
|
+
return supported;
|
|
81
|
+
} catch {
|
|
82
|
+
return FALLBACK_TIMEZONES;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function getOffsetMinutes(timezone, referenceDate) {
|
|
86
|
+
try {
|
|
87
|
+
const formatter = new Intl.DateTimeFormat("en-US", {
|
|
88
|
+
timeZone: timezone,
|
|
89
|
+
timeZoneName: "shortOffset"
|
|
90
|
+
});
|
|
91
|
+
const timezoneName = formatter.formatToParts(referenceDate).find((part) => part.type === "timeZoneName")?.value ?? "GMT";
|
|
92
|
+
const match = timezoneName.match(/^GMT(?:(\+|-)(\d{1,2})(?::(\d{2}))?)?$/);
|
|
93
|
+
if (!match) {
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
if (!match[1] || !match[2]) {
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
const sign = match[1] === "-" ? -1 : 1;
|
|
100
|
+
const hours = Number.parseInt(match[2], 10);
|
|
101
|
+
const minutes = Number.parseInt(match[3] ?? "0", 10);
|
|
102
|
+
return sign * (hours * 60 + minutes);
|
|
103
|
+
} catch {
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function formatOffset(offsetMinutes) {
|
|
108
|
+
const sign = offsetMinutes >= 0 ? "+" : "-";
|
|
109
|
+
const absoluteMinutes = Math.abs(offsetMinutes);
|
|
110
|
+
const hours = String(Math.floor(absoluteMinutes / 60)).padStart(2, "0");
|
|
111
|
+
const minutes = String(absoluteMinutes % 60).padStart(2, "0");
|
|
112
|
+
return `UTC${sign}${hours}:${minutes}`;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export { detectBrowserTimezone, getTimezoneGroups, searchTimezones };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { getTimezoneGroups } from './chunk-PTJPPKDR.js';
|
|
2
|
+
import { Popover, PopoverTrigger, PopoverContent } from './chunk-UYT33NG6.js';
|
|
3
|
+
import { Command } from './chunk-2HDB6MDK.js';
|
|
4
|
+
import { Button } from './chunk-7KIDDF3I.js';
|
|
5
|
+
import { Badge } from './chunk-S4JAHKOP.js';
|
|
6
|
+
import { cn } from './chunk-QYZT24TS.js';
|
|
7
|
+
import { useState, useMemo } from 'react';
|
|
8
|
+
import { Command as Command$1 } from 'cmdk';
|
|
9
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
var DEFAULT_GROUPS = getTimezoneGroups();
|
|
12
|
+
function TimezonePickerBlock({
|
|
13
|
+
id,
|
|
14
|
+
value,
|
|
15
|
+
onChange,
|
|
16
|
+
name,
|
|
17
|
+
className,
|
|
18
|
+
groups = DEFAULT_GROUPS
|
|
19
|
+
}) {
|
|
20
|
+
const [open, setOpen] = useState(false);
|
|
21
|
+
const entries = useMemo(() => groups.flatMap((group) => group.timezones), [groups]);
|
|
22
|
+
const selectedTimezone = useMemo(
|
|
23
|
+
() => entries.find((timezone) => timezone.value === value) ?? null,
|
|
24
|
+
[entries, value]
|
|
25
|
+
);
|
|
26
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
27
|
+
name ? /* @__PURE__ */ jsx("input", { type: "hidden", name, value: value ?? "" }) : null,
|
|
28
|
+
/* @__PURE__ */ jsxs(Popover, { modal: false, open, onOpenChange: setOpen, children: [
|
|
29
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
30
|
+
Button,
|
|
31
|
+
{
|
|
32
|
+
id,
|
|
33
|
+
type: "button",
|
|
34
|
+
variant: "outline",
|
|
35
|
+
role: "combobox",
|
|
36
|
+
"aria-expanded": open,
|
|
37
|
+
"aria-label": "Select timezone",
|
|
38
|
+
className: cn("w-full justify-between text-left", className),
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: selectedTimezone ? `${selectedTimezone.value} (${selectedTimezone.offset})` : "Select timezone" }),
|
|
41
|
+
/* @__PURE__ */ jsx("span", { className: "ml-2 shrink-0 opacity-50", "aria-hidden": "true", children: /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 20 20", width: "14", height: "14", fill: "none", stroke: "currentColor", children: [
|
|
42
|
+
/* @__PURE__ */ jsx("path", { d: "M6 8l4-4 4 4", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
43
|
+
/* @__PURE__ */ jsx("path", { d: "M6 12l4 4 4-4", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
44
|
+
] }) })
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
) }),
|
|
48
|
+
/* @__PURE__ */ jsx(PopoverContent, { align: "start", className: "w-[min(90vw,32rem)] p-0", children: /* @__PURE__ */ jsxs(Command, { children: [
|
|
49
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center border-b px-4", children: /* @__PURE__ */ jsx(
|
|
50
|
+
Command$1.Input,
|
|
51
|
+
{
|
|
52
|
+
className: "h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-text-tertiary focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
53
|
+
placeholder: "Search timezone by city, region, or offset..."
|
|
54
|
+
}
|
|
55
|
+
) }),
|
|
56
|
+
/* @__PURE__ */ jsxs(Command$1.List, { className: "max-h-80 overflow-y-auto overflow-x-hidden", children: [
|
|
57
|
+
/* @__PURE__ */ jsx(Command$1.Empty, { className: "py-6 text-center text-sm", children: "No timezone found." }),
|
|
58
|
+
groups.map((group) => /* @__PURE__ */ jsx(
|
|
59
|
+
Command$1.Group,
|
|
60
|
+
{
|
|
61
|
+
heading: /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: group.region }),
|
|
62
|
+
className: "overflow-hidden p-1.5 text-text-primary [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5",
|
|
63
|
+
children: group.timezones.map((timezone) => /* @__PURE__ */ jsxs(
|
|
64
|
+
Command$1.Item,
|
|
65
|
+
{
|
|
66
|
+
value: `${timezone.value} ${timezone.label} ${timezone.region} ${timezone.offset}`,
|
|
67
|
+
onSelect: () => {
|
|
68
|
+
onChange?.(timezone.value);
|
|
69
|
+
setOpen(false);
|
|
70
|
+
},
|
|
71
|
+
className: "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-background data-[disabled=true]:pointer-events-none data-[selected='true']:bg-surface-active data-[selected=true]:text-text-primary data-[disabled=true]:opacity-50",
|
|
72
|
+
children: [
|
|
73
|
+
/* @__PURE__ */ jsx(
|
|
74
|
+
"span",
|
|
75
|
+
{
|
|
76
|
+
className: cn("mr-2 shrink-0 text-xs", value === timezone.value ? "opacity-100" : "opacity-0"),
|
|
77
|
+
"aria-hidden": "true",
|
|
78
|
+
children: "\u2713"
|
|
79
|
+
}
|
|
80
|
+
),
|
|
81
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: timezone.value }),
|
|
82
|
+
/* @__PURE__ */ jsx("span", { className: "ml-auto pl-2 text-xs text-text-tertiary", children: timezone.offset })
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
timezone.value
|
|
86
|
+
))
|
|
87
|
+
},
|
|
88
|
+
group.region
|
|
89
|
+
))
|
|
90
|
+
] })
|
|
91
|
+
] }) })
|
|
92
|
+
] })
|
|
93
|
+
] });
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { TimezonePickerBlock };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
export { IntegrationsBlock } from '../../chunk-
|
|
2
|
+
export { IntegrationsBlock } from '../../chunk-BSCC7OQK.js';
|
|
3
3
|
import '../../chunk-3ZDYYZDD.js';
|
|
4
|
+
import '../../chunk-BZYMCJHW.js';
|
|
4
5
|
import '../../chunk-H466RJCI.js';
|
|
5
6
|
import '../../chunk-DT6DGTVW.js';
|
|
6
7
|
import '../../chunk-J5DRK4RF.js';
|
|
7
8
|
import '../../chunk-TSVN5A2F.js';
|
|
8
9
|
import '../../chunk-PX2WVDDB.js';
|
|
9
|
-
import '../../chunk-BZYMCJHW.js';
|
|
10
10
|
import '../../chunk-DQPK2XRL.js';
|
|
11
11
|
import '../../chunk-WI547C47.js';
|
|
12
12
|
import '../../chunk-I23DDSU7.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TimezoneGroup } from '../../lib/timezones';
|
|
2
|
+
interface TimezonePickerBlockProps {
|
|
3
|
+
id?: string;
|
|
4
|
+
value?: string;
|
|
5
|
+
onChange?: (value: string) => void;
|
|
6
|
+
name?: string;
|
|
7
|
+
className?: string;
|
|
8
|
+
groups?: TimezoneGroup[];
|
|
9
|
+
}
|
|
10
|
+
export declare function TimezonePickerBlock({ id, value, onChange, name, className, groups, }: TimezonePickerBlockProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
export { TimezonePickerBlock } from '../../chunk-ZXVDDZZL.js';
|
|
3
|
+
import '../../chunk-PTJPPKDR.js';
|
|
4
|
+
import '../../chunk-UYT33NG6.js';
|
|
5
|
+
import '../../chunk-2HDB6MDK.js';
|
|
6
|
+
import '../../chunk-W73JAOHW.js';
|
|
7
|
+
import '../../chunk-KRBLVZII.js';
|
|
8
|
+
import '../../chunk-7KIDDF3I.js';
|
|
9
|
+
import '../../chunk-6FOHUNXR.js';
|
|
10
|
+
import '../../chunk-PD2YEH3H.js';
|
|
11
|
+
import '../../chunk-CRY67BIF.js';
|
|
12
|
+
import '../../chunk-HJC6U46F.js';
|
|
13
|
+
import '../../chunk-GO35FTNJ.js';
|
|
14
|
+
import '../../chunk-WUO7OONN.js';
|
|
15
|
+
import '../../chunk-FLF5AMNO.js';
|
|
16
|
+
import '../../chunk-3CLXYQKB.js';
|
|
17
|
+
import '../../chunk-S4GKGKON.js';
|
|
18
|
+
import '../../chunk-LCDDAE7J.js';
|
|
19
|
+
import '../../chunk-R674XI7C.js';
|
|
20
|
+
import '../../chunk-HNY45VUQ.js';
|
|
21
|
+
import '../../chunk-BPCCTJSK.js';
|
|
22
|
+
import '../../chunk-CGUCH322.js';
|
|
23
|
+
import '../../chunk-ELKIUARM.js';
|
|
24
|
+
import '../../chunk-KSHJQ2VT.js';
|
|
25
|
+
import '../../chunk-GAKU7DFY.js';
|
|
26
|
+
import '../../chunk-T6BRD7TS.js';
|
|
27
|
+
import '../../chunk-TXGANOAX.js';
|
|
28
|
+
import '../../chunk-OITJWGFV.js';
|
|
29
|
+
import '../../chunk-Z74D6D2W.js';
|
|
30
|
+
import '../../chunk-7WDT2PRI.js';
|
|
31
|
+
import '../../chunk-IJJI4RQU.js';
|
|
32
|
+
import '../../chunk-E7RBK6ML.js';
|
|
33
|
+
import '../../chunk-UBIGDGOP.js';
|
|
34
|
+
import '../../chunk-ALMGJVMT.js';
|
|
35
|
+
import '../../chunk-QPXTBZWN.js';
|
|
36
|
+
import '../../chunk-4NXZIMYZ.js';
|
|
37
|
+
import '../../chunk-R5XP45PD.js';
|
|
38
|
+
import '../../chunk-G5EO5FWC.js';
|
|
39
|
+
import '../../chunk-NCULQXJE.js';
|
|
40
|
+
import '../../chunk-VDYPDMYR.js';
|
|
41
|
+
import '../../chunk-WDGIQDQG.js';
|
|
42
|
+
import '../../chunk-RYOTIXZO.js';
|
|
43
|
+
import '../../chunk-JZ4G2SJH.js';
|
|
44
|
+
import '../../chunk-KYGKJ553.js';
|
|
45
|
+
import '../../chunk-M7YSMMAC.js';
|
|
46
|
+
import '../../chunk-XQ2UDMPO.js';
|
|
47
|
+
import '../../chunk-JMCSAGZ3.js';
|
|
48
|
+
import '../../chunk-QUKDUSHD.js';
|
|
49
|
+
import '../../chunk-O74AEVHW.js';
|
|
50
|
+
import '../../chunk-ZUHIWALK.js';
|
|
51
|
+
import '../../chunk-2IZC7HSV.js';
|
|
52
|
+
import '../../chunk-2SDZMTB2.js';
|
|
53
|
+
import '../../chunk-IQEBXXB5.js';
|
|
54
|
+
import '../../chunk-AZUJNRQU.js';
|
|
55
|
+
import '../../chunk-W3B3UOEG.js';
|
|
56
|
+
import '../../chunk-ACRVOD7W.js';
|
|
57
|
+
import '../../chunk-QSU23VYZ.js';
|
|
58
|
+
import '../../chunk-BJYCQ2NV.js';
|
|
59
|
+
import '../../chunk-VM462WZC.js';
|
|
60
|
+
import '../../chunk-5UZDOF6V.js';
|
|
61
|
+
import '../../chunk-PKVTEDKO.js';
|
|
62
|
+
import '../../chunk-I3TH7PIB.js';
|
|
63
|
+
import '../../chunk-WGPK3FQ7.js';
|
|
64
|
+
import '../../chunk-JL4MVVFH.js';
|
|
65
|
+
import '../../chunk-4FEAWXJD.js';
|
|
66
|
+
import '../../chunk-JHQTKMKG.js';
|
|
67
|
+
import '../../chunk-WA45EC4Y.js';
|
|
68
|
+
import '../../chunk-2MOEOEOI.js';
|
|
69
|
+
import '../../chunk-5LCXASRW.js';
|
|
70
|
+
import '../../chunk-2ZJVU7NV.js';
|
|
71
|
+
import '../../chunk-5ESF6N36.js';
|
|
72
|
+
import '../../chunk-RBPLOM3A.js';
|
|
73
|
+
import '../../chunk-6BAV4TZ5.js';
|
|
74
|
+
import '../../chunk-SW6QPJM4.js';
|
|
75
|
+
import '../../chunk-2NT57K4U.js';
|
|
76
|
+
import '../../chunk-JRJGSNI4.js';
|
|
77
|
+
import '../../chunk-RF6ECFS5.js';
|
|
78
|
+
import '../../chunk-KYZT3RNW.js';
|
|
79
|
+
import '../../chunk-UEG2LI7Z.js';
|
|
80
|
+
import '../../chunk-CI7GPGCJ.js';
|
|
81
|
+
import '../../chunk-226EBOTK.js';
|
|
82
|
+
import '../../chunk-74RKVIBV.js';
|
|
83
|
+
import '../../chunk-V6WNRZT3.js';
|
|
84
|
+
import '../../chunk-JBK2LA6U.js';
|
|
85
|
+
import '../../chunk-55U27XY4.js';
|
|
86
|
+
import '../../chunk-LSPO6OBI.js';
|
|
87
|
+
import '../../chunk-Y56WBNCY.js';
|
|
88
|
+
import '../../chunk-JJTQOH7J.js';
|
|
89
|
+
import '../../chunk-72X6SXOX.js';
|
|
90
|
+
import '../../chunk-SR5U52V3.js';
|
|
91
|
+
import '../../chunk-AWIJHDNK.js';
|
|
92
|
+
import '../../chunk-MAUTIHQG.js';
|
|
93
|
+
import '../../chunk-S733NAYS.js';
|
|
94
|
+
import '../../chunk-666N6OTL.js';
|
|
95
|
+
import '../../chunk-FMH55OKV.js';
|
|
96
|
+
import '../../chunk-WXVNTJIB.js';
|
|
97
|
+
import '../../chunk-T7H53CK2.js';
|
|
98
|
+
import '../../chunk-TBKJ34BB.js';
|
|
99
|
+
import '../../chunk-BRP6D56U.js';
|
|
100
|
+
import '../../chunk-6G3RRWJT.js';
|
|
101
|
+
import '../../chunk-ZU2GYVAP.js';
|
|
102
|
+
import '../../chunk-CRZ2JE24.js';
|
|
103
|
+
import '../../chunk-PSVQ7ZNX.js';
|
|
104
|
+
import '../../chunk-WKRIKCJC.js';
|
|
105
|
+
import '../../chunk-JHQ5NMLZ.js';
|
|
106
|
+
import '../../chunk-WFJQ43SM.js';
|
|
107
|
+
import '../../chunk-AP5Y5M3R.js';
|
|
108
|
+
import '../../chunk-Q7LVUGFL.js';
|
|
109
|
+
import '../../chunk-G5YLGJXR.js';
|
|
110
|
+
import '../../chunk-G24VV5NO.js';
|
|
111
|
+
import '../../chunk-R3AO6AZM.js';
|
|
112
|
+
import '../../chunk-GCUTJI7M.js';
|
|
113
|
+
import '../../chunk-CXACRCZ4.js';
|
|
114
|
+
import '../../chunk-P6IRHPFM.js';
|
|
115
|
+
import '../../chunk-SXHYB7JB.js';
|
|
116
|
+
import '../../chunk-BFLN54VR.js';
|
|
117
|
+
import '../../chunk-ONGJ7AC2.js';
|
|
118
|
+
import '../../chunk-UHXGBV5N.js';
|
|
119
|
+
import '../../chunk-UIUMTURU.js';
|
|
120
|
+
import '../../chunk-PRUXIDBD.js';
|
|
121
|
+
import '../../chunk-NURPUVUV.js';
|
|
122
|
+
import '../../chunk-S4JAHKOP.js';
|
|
123
|
+
import '../../chunk-TV4RSQH4.js';
|
|
124
|
+
import '../../chunk-HJBXUXTD.js';
|
|
125
|
+
import '../../chunk-ASKFAYYR.js';
|
|
126
|
+
import '../../chunk-QYZT24TS.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import '../../chunk-3ZDYYZDD.js';
|
|
2
|
+
export { MagicUI } from '../../chunk-BZYMCJHW.js';
|
|
2
3
|
export { MediaWiki } from '../../chunk-H466RJCI.js';
|
|
3
4
|
export { Replit } from '../../chunk-DT6DGTVW.js';
|
|
4
5
|
export { VSCodium } from '../../chunk-J5DRK4RF.js';
|
|
5
6
|
export { Gemini } from '../../chunk-TSVN5A2F.js';
|
|
6
7
|
export { GooglePaLM } from '../../chunk-PX2WVDDB.js';
|
|
7
|
-
export { MagicUI } from '../../chunk-BZYMCJHW.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface TimezoneEntry {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
region: string;
|
|
5
|
+
offset: string;
|
|
6
|
+
offsetMinutes: number;
|
|
7
|
+
}
|
|
8
|
+
export interface TimezoneGroup {
|
|
9
|
+
region: string;
|
|
10
|
+
timezones: TimezoneEntry[];
|
|
11
|
+
}
|
|
12
|
+
export declare function getTimezoneGroups(referenceDate?: Date): TimezoneGroup[];
|
|
13
|
+
export declare function searchTimezones(query: string, groups: TimezoneGroup[]): TimezoneEntry[];
|
|
14
|
+
export declare function detectBrowserTimezone(): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { detectBrowserTimezone, getTimezoneGroups, searchTimezones } from '../chunk-PTJPPKDR.js';
|
|
@@ -15,7 +15,6 @@ export const nadicodeRules = {
|
|
|
15
15
|
"nadicode/no-admin-manual-chart-bars": "error",
|
|
16
16
|
"nadicode/no-app-primitive-composition": "error",
|
|
17
17
|
"nadicode/no-barrel-imports": "error",
|
|
18
|
-
"nadicode/no-deprecated-ds-import": "warn",
|
|
19
18
|
"nadicode/no-derived-state-via-useeffect": "error",
|
|
20
19
|
"nadicode/no-direct-lucide-import": "error",
|
|
21
20
|
"nadicode/no-external-ui-library": "error",
|
|
@@ -3,7 +3,6 @@ import noAdminManualChartBars from "./rules/no-admin-manual-chart-bars.js";
|
|
|
3
3
|
import noAppPrimitiveComposition from "./rules/no-app-primitive-composition.js";
|
|
4
4
|
import noArbitraryChartColor from "./rules/no-arbitrary-chart-color.js";
|
|
5
5
|
import noBarrelImports from "./rules/no-barrel-imports.js";
|
|
6
|
-
import noDeprecatedDsImport from "./rules/no-deprecated-ds-import.js";
|
|
7
6
|
import noDeprecatedSegmentConfig from "./rules/no-deprecated-segment-config.js";
|
|
8
7
|
import noDerivedStateViaUseeffect from "./rules/no-derived-state-via-useeffect.js";
|
|
9
8
|
import noDirectLucideImport from "./rules/no-direct-lucide-import.js";
|
|
@@ -81,7 +80,6 @@ export const nadicodePlugin = {
|
|
|
81
80
|
"no-app-primitive-composition": noAppPrimitiveComposition,
|
|
82
81
|
"no-arbitrary-chart-color": noArbitraryChartColor,
|
|
83
82
|
"no-barrel-imports": noBarrelImports,
|
|
84
|
-
"no-deprecated-ds-import": noDeprecatedDsImport,
|
|
85
83
|
"no-deprecated-segment-config": noDeprecatedSegmentConfig,
|
|
86
84
|
"no-derived-state-via-useeffect": noDerivedStateViaUseeffect,
|
|
87
85
|
"no-direct-lucide-import": noDirectLucideImport,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vadimcomanescu/nadicode-design-system",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.4",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"release:patch": "npm version patch --no-git-tag-version && npm run publish:package",
|
|
58
58
|
"release:minor": "npm version minor --no-git-tag-version && npm run publish:package",
|
|
59
59
|
"release:major": "npm version major --no-git-tag-version && npm run publish:package",
|
|
60
|
-
"precommit": "npx lint-staged --config package.json
|
|
60
|
+
"precommit": "npx lint-staged --config package.json",
|
|
61
61
|
"gate:prepush": "npm run typecheck && npm run lint && npm run ds:check && npm run build:lib && npm run docs:check && npx vitest run --coverage && npm run build && npm run lighthouse",
|
|
62
62
|
"test:visual": "npx playwright test --config=playwright.visual.config.ts",
|
|
63
63
|
"test:visual:update": "npx playwright test --config=playwright.visual.config.ts --update-snapshots",
|
|
@@ -1525,6 +1525,10 @@
|
|
|
1525
1525
|
"import": "./dist/components/ui/Typography.js",
|
|
1526
1526
|
"types": "./dist/components/ui/Typography.d.ts"
|
|
1527
1527
|
},
|
|
1528
|
+
"./lib/timezones": {
|
|
1529
|
+
"import": "./dist/lib/timezones.js",
|
|
1530
|
+
"types": "./dist/lib/timezones.d.ts"
|
|
1531
|
+
},
|
|
1528
1532
|
"./utils": {
|
|
1529
1533
|
"import": "./dist/lib/utils.js",
|
|
1530
1534
|
"types": "./dist/lib/utils.d.ts"
|
package/scripts/ds-update.mjs
CHANGED
|
@@ -10,6 +10,10 @@ function run(command) {
|
|
|
10
10
|
execSync(command, { cwd: process.cwd(), stdio: "inherit" });
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
function runCapture(command) {
|
|
14
|
+
return execSync(command, { cwd: process.cwd(), encoding: "utf8" }).trim();
|
|
15
|
+
}
|
|
16
|
+
|
|
13
17
|
function readPackageJson() {
|
|
14
18
|
const packageJsonPath = join(process.cwd(), "package.json");
|
|
15
19
|
if (!existsSync(packageJsonPath)) {
|
|
@@ -23,28 +27,62 @@ function readSeedDependency() {
|
|
|
23
27
|
const packageJson = readPackageJson();
|
|
24
28
|
const dependency = packageJson.dependencies?.[PACKAGE_NAME];
|
|
25
29
|
if (dependency) {
|
|
26
|
-
return {
|
|
30
|
+
return { currentSpec: dependency, isDevDependency: false };
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
const devDependency = packageJson.devDependencies?.[PACKAGE_NAME];
|
|
30
34
|
if (devDependency) {
|
|
31
|
-
return {
|
|
35
|
+
return { currentSpec: devDependency, isDevDependency: true };
|
|
32
36
|
}
|
|
33
37
|
|
|
34
38
|
throw new Error("package.json must declare @vadimcomanescu/nadicode-design-system before ds:update can run.");
|
|
35
39
|
}
|
|
36
40
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
function fetchLatestVersion() {
|
|
42
|
+
try {
|
|
43
|
+
return runCapture(`npm view ${PACKAGE_NAME} version`);
|
|
44
|
+
} catch {
|
|
45
|
+
throw new Error(`Failed to fetch latest version of ${PACKAGE_NAME} from the registry.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function detectPackageManager() {
|
|
50
|
+
if (existsSync(join(process.cwd(), "pnpm-lock.yaml"))) return "pnpm";
|
|
51
|
+
if (existsSync(join(process.cwd(), "yarn.lock"))) return "yarn";
|
|
52
|
+
if (existsSync(join(process.cwd(), "bun.lock"))) return "bun";
|
|
53
|
+
return "npm";
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function buildInstallCommand(pm, target, isDevDependency) {
|
|
57
|
+
const devFlag = {
|
|
58
|
+
pnpm: isDevDependency ? "-D " : "",
|
|
59
|
+
yarn: isDevDependency ? "--dev " : "",
|
|
60
|
+
bun: isDevDependency ? "-d " : "",
|
|
61
|
+
npm: isDevDependency ? "-D " : "",
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const command = {
|
|
65
|
+
pnpm: "pnpm add --save-exact",
|
|
66
|
+
yarn: "yarn add --exact",
|
|
67
|
+
bun: "bun add --exact",
|
|
68
|
+
npm: "npm install --save-exact",
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
return `${command[pm]} ${devFlag[pm]}${JSON.stringify(target)}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const { currentSpec, isDevDependency } = readSeedDependency();
|
|
75
|
+
const latestVersion = fetchLatestVersion();
|
|
76
|
+
const installTarget = `${PACKAGE_NAME}@${latestVersion}`;
|
|
77
|
+
const pm = detectPackageManager();
|
|
78
|
+
|
|
79
|
+
if (currentSpec === latestVersion) {
|
|
80
|
+
console.log(`Already on latest version (${latestVersion}). Syncing skill docs.`);
|
|
81
|
+
} else {
|
|
82
|
+
console.log(`Updating ${PACKAGE_NAME}: ${currentSpec} -> ${latestVersion}`);
|
|
83
|
+
run(buildInstallCommand(pm, installTarget, isDevDependency));
|
|
84
|
+
}
|
|
46
85
|
|
|
47
|
-
run(
|
|
48
|
-
run(`node ${JSON.stringify(join(process.cwd(), "node_modules", "@vadimcomanescu/nadicode-design-system", "scripts", "sync-seed-skill.mjs"))} ${JSON.stringify(process.cwd())}`);
|
|
86
|
+
run(`node ${JSON.stringify(join(process.cwd(), "node_modules", PACKAGE_NAME, "scripts", "sync-seed-skill.mjs"))} ${JSON.stringify(process.cwd())}`);
|
|
49
87
|
|
|
50
|
-
console.log(
|
|
88
|
+
console.log(`Done (${latestVersion}). Run npm run ds:check to verify.`);
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { resolve, dirname } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
|
|
5
|
-
const RULES_DIR = dirname(fileURLToPath(import.meta.url));
|
|
6
|
-
const REGISTRY_PATH = resolve(RULES_DIR, "../../../contracts/public-surface-registry.json");
|
|
7
|
-
const DS_PACKAGE = "@vadimcomanescu/nadicode-design-system";
|
|
8
|
-
|
|
9
|
-
let deprecatedSubpaths = null;
|
|
10
|
-
|
|
11
|
-
function loadDeprecatedSubpaths() {
|
|
12
|
-
if (deprecatedSubpaths) {
|
|
13
|
-
return deprecatedSubpaths;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
deprecatedSubpaths = new Map();
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
const registry = JSON.parse(readFileSync(REGISTRY_PATH, "utf8"));
|
|
20
|
-
for (const entry of registry.entries ?? []) {
|
|
21
|
-
if (entry.stability === "deprecated" && entry.deprecation) {
|
|
22
|
-
deprecatedSubpaths.set(entry.subpath, {
|
|
23
|
-
replacement: entry.deprecation.replacement,
|
|
24
|
-
removalVersion: entry.deprecation.removalVersion,
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
} catch {
|
|
29
|
-
// Registry unavailable (e.g. consumer repo without local contracts).
|
|
30
|
-
// Rule becomes a no-op.
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return deprecatedSubpaths;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const rule = {
|
|
37
|
-
meta: {
|
|
38
|
-
type: "suggestion",
|
|
39
|
-
docs: {
|
|
40
|
-
description:
|
|
41
|
-
"Warn when importing a deprecated export from @vadimcomanescu/nadicode-design-system.",
|
|
42
|
-
},
|
|
43
|
-
schema: [],
|
|
44
|
-
},
|
|
45
|
-
create(context) {
|
|
46
|
-
return {
|
|
47
|
-
ImportDeclaration(node) {
|
|
48
|
-
const source = node.source.value;
|
|
49
|
-
if (typeof source !== "string" || !source.startsWith(DS_PACKAGE)) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const subpath = "./" + source.slice(DS_PACKAGE.length + 1);
|
|
54
|
-
if (subpath === "./") {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const deprecated = loadDeprecatedSubpaths();
|
|
59
|
-
const info = deprecated.get(subpath);
|
|
60
|
-
if (!info) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const parts = [
|
|
65
|
-
`"${source}" is deprecated and will be removed in v${info.removalVersion}.`,
|
|
66
|
-
];
|
|
67
|
-
if (info.replacement) {
|
|
68
|
-
parts.push(`Use "${DS_PACKAGE}/${info.replacement.slice(2)}" instead.`);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
context.report({ node, message: parts.join(" ") });
|
|
72
|
-
},
|
|
73
|
-
};
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export default rule;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { MagicUI } from './chunk-BZYMCJHW.js';
|
|
1
2
|
import { MediaWiki } from './chunk-H466RJCI.js';
|
|
2
3
|
import { Replit } from './chunk-DT6DGTVW.js';
|
|
3
4
|
import { VSCodium } from './chunk-J5DRK4RF.js';
|
|
4
5
|
import { Gemini } from './chunk-TSVN5A2F.js';
|
|
5
6
|
import { GooglePaLM } from './chunk-PX2WVDDB.js';
|
|
6
|
-
import { MagicUI } from './chunk-BZYMCJHW.js';
|
|
7
7
|
import { StaggerChildren } from './chunk-DQPK2XRL.js';
|
|
8
8
|
import { Heading } from './chunk-WI547C47.js';
|
|
9
9
|
import { ScrollFadeIn } from './chunk-I23DDSU7.js';
|