@feelflow/ffid-sdk 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -858,4 +858,525 @@ function FFIDSubscriptionBadge({
858
858
  );
859
859
  }
860
860
 
861
- export { DEFAULT_API_BASE_URL, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDProvider, FFIDSubscriptionBadge, FFIDUserMenu, useFFID, useFFIDContext, useSubscription, withSubscription };
861
+ // src/announcements/ffid-announcements-client.ts
862
+ var API_PATH = "/api/v1/announcements";
863
+ var SDK_LOG_PREFIX2 = "[FFID Announcements SDK]";
864
+ var FFID_ANNOUNCEMENTS_ERROR_CODES = {
865
+ /** Network request failed (fetch threw) */
866
+ NETWORK_ERROR: "NETWORK_ERROR",
867
+ /** Failed to parse server response as JSON */
868
+ PARSE_ERROR: "PARSE_ERROR",
869
+ /** Server returned error without structured error body */
870
+ UNKNOWN_ERROR: "UNKNOWN_ERROR"
871
+ };
872
+ var quietLogger = {
873
+ debug: () => {
874
+ },
875
+ info: () => {
876
+ },
877
+ warn: () => {
878
+ },
879
+ error: (...args) => console.error(SDK_LOG_PREFIX2, ...args)
880
+ };
881
+ var consoleLogger2 = {
882
+ debug: (...args) => console.debug(SDK_LOG_PREFIX2, ...args),
883
+ info: (...args) => console.info(SDK_LOG_PREFIX2, ...args),
884
+ warn: (...args) => console.warn(SDK_LOG_PREFIX2, ...args),
885
+ error: (...args) => console.error(SDK_LOG_PREFIX2, ...args)
886
+ };
887
+ function createFFIDAnnouncementsClient(config = {}) {
888
+ const baseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;
889
+ const logger = config.logger ?? (config.debug ? consoleLogger2 : quietLogger);
890
+ async function fetchApi(endpoint) {
891
+ const url = `${baseUrl}${endpoint}`;
892
+ logger.debug("Fetching:", url);
893
+ let response;
894
+ try {
895
+ response = await fetch(url, {
896
+ headers: {
897
+ Accept: "application/json"
898
+ }
899
+ });
900
+ } catch (error) {
901
+ logger.error("Network error:", { url, error });
902
+ return {
903
+ error: {
904
+ code: FFID_ANNOUNCEMENTS_ERROR_CODES.NETWORK_ERROR,
905
+ message: error instanceof Error ? error.message : "\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
906
+ }
907
+ };
908
+ }
909
+ let data;
910
+ try {
911
+ data = await response.json();
912
+ } catch (parseError) {
913
+ logger.error("Parse error:", { url, status: response.status, parseError });
914
+ return {
915
+ error: {
916
+ code: FFID_ANNOUNCEMENTS_ERROR_CODES.PARSE_ERROR,
917
+ message: `\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u4E0D\u6B63\u306A\u30EC\u30B9\u30DD\u30F3\u30B9\u3092\u53D7\u4FE1\u3057\u307E\u3057\u305F (status: ${response.status})`
918
+ }
919
+ };
920
+ }
921
+ logger.debug("Response:", response.status, data);
922
+ if (!response.ok || !data.success) {
923
+ return {
924
+ error: data.error ?? {
925
+ code: FFID_ANNOUNCEMENTS_ERROR_CODES.UNKNOWN_ERROR,
926
+ message: "\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
927
+ }
928
+ };
929
+ }
930
+ if (data.data === void 0) {
931
+ return {
932
+ error: {
933
+ code: FFID_ANNOUNCEMENTS_ERROR_CODES.UNKNOWN_ERROR,
934
+ message: "\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u30C7\u30FC\u30BF\u304C\u8FD4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"
935
+ }
936
+ };
937
+ }
938
+ return { data: data.data };
939
+ }
940
+ async function listAnnouncements(options = {}) {
941
+ const params = new URLSearchParams();
942
+ if (options.limit !== void 0) {
943
+ const limit = Math.max(0, Math.floor(options.limit));
944
+ params.set("limit", String(limit));
945
+ }
946
+ if (options.offset !== void 0) {
947
+ const offset = Math.max(0, Math.floor(options.offset));
948
+ params.set("offset", String(offset));
949
+ }
950
+ const query = params.toString();
951
+ const endpoint = query ? `${API_PATH}?${query}` : API_PATH;
952
+ return fetchApi(endpoint);
953
+ }
954
+ return {
955
+ /** List published announcements */
956
+ listAnnouncements,
957
+ /** Resolved logger instance */
958
+ logger,
959
+ /** API base URL */
960
+ baseUrl
961
+ };
962
+ }
963
+
964
+ // src/hooks/useFFIDAnnouncements.ts
965
+ var LAST_READ_STORAGE_KEY = "ffid-announcements-last-read";
966
+ function getStoredLastReadAt() {
967
+ try {
968
+ return localStorage.getItem(LAST_READ_STORAGE_KEY);
969
+ } catch {
970
+ return null;
971
+ }
972
+ }
973
+ function useFFIDAnnouncements(options = {}) {
974
+ const {
975
+ limit,
976
+ offset,
977
+ apiBaseUrl,
978
+ debug,
979
+ enabled = true
980
+ } = options;
981
+ const [announcements, setAnnouncements] = useState([]);
982
+ const [total, setTotal] = useState(0);
983
+ const [isLoading, setIsLoading] = useState(false);
984
+ const [error, setError] = useState(null);
985
+ const [lastReadAt, setLastReadAt] = useState(getStoredLastReadAt);
986
+ const resolvedBaseUrl = apiBaseUrl ?? DEFAULT_API_BASE_URL;
987
+ const client = useMemo(
988
+ () => createFFIDAnnouncementsClient({ apiBaseUrl: resolvedBaseUrl, debug }),
989
+ [resolvedBaseUrl, debug]
990
+ );
991
+ const unreadCount = useMemo(() => {
992
+ if (!lastReadAt) {
993
+ return announcements.length;
994
+ }
995
+ const lastReadTime = new Date(lastReadAt).getTime();
996
+ return announcements.filter(
997
+ (a) => a.publishedAt && new Date(a.publishedAt).getTime() > lastReadTime
998
+ ).length;
999
+ }, [announcements, lastReadAt]);
1000
+ const fetchAnnouncements = useCallback(async () => {
1001
+ setIsLoading(true);
1002
+ setError(null);
1003
+ try {
1004
+ const fetchOptions = {};
1005
+ if (limit !== void 0) fetchOptions.limit = limit;
1006
+ if (offset !== void 0) fetchOptions.offset = offset;
1007
+ const result = await client.listAnnouncements(fetchOptions);
1008
+ if (result.error) {
1009
+ setError(result.error);
1010
+ } else {
1011
+ setAnnouncements(result.data.announcements);
1012
+ setTotal(result.data.total);
1013
+ }
1014
+ } catch (err) {
1015
+ setError({
1016
+ code: FFID_ANNOUNCEMENTS_ERROR_CODES.UNKNOWN_ERROR,
1017
+ message: err instanceof Error ? err.message : "\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
1018
+ });
1019
+ } finally {
1020
+ setIsLoading(false);
1021
+ }
1022
+ }, [client, limit, offset]);
1023
+ useEffect(() => {
1024
+ if (enabled) {
1025
+ void fetchAnnouncements();
1026
+ }
1027
+ }, [enabled, fetchAnnouncements]);
1028
+ const markAsRead = useCallback(() => {
1029
+ const now = (/* @__PURE__ */ new Date()).toISOString();
1030
+ setLastReadAt(now);
1031
+ try {
1032
+ localStorage.setItem(LAST_READ_STORAGE_KEY, now);
1033
+ } catch {
1034
+ }
1035
+ }, []);
1036
+ return {
1037
+ announcements,
1038
+ total,
1039
+ unreadCount,
1040
+ isLoading,
1041
+ error,
1042
+ refetch: fetchAnnouncements,
1043
+ markAsRead
1044
+ };
1045
+ }
1046
+ var DEFAULT_ICON_SIZE = 20;
1047
+ var BADGE_SIZE = 18;
1048
+ var BADGE_FONT_SIZE = 11;
1049
+ var BADGE_OFFSET = -6;
1050
+ var BADGE_MAX_COUNT = 99;
1051
+ function BellIcon({ size, className }) {
1052
+ return /* @__PURE__ */ jsxs(
1053
+ "svg",
1054
+ {
1055
+ xmlns: "http://www.w3.org/2000/svg",
1056
+ width: size,
1057
+ height: size,
1058
+ viewBox: "0 0 24 24",
1059
+ fill: "none",
1060
+ stroke: "currentColor",
1061
+ strokeWidth: 2,
1062
+ strokeLinecap: "round",
1063
+ strokeLinejoin: "round",
1064
+ className,
1065
+ "aria-hidden": "true",
1066
+ children: [
1067
+ /* @__PURE__ */ jsx("path", { d: "M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" }),
1068
+ /* @__PURE__ */ jsx("path", { d: "M10.3 21a1.94 1.94 0 0 0 3.4 0" })
1069
+ ]
1070
+ }
1071
+ );
1072
+ }
1073
+ function FFIDAnnouncementBadge({
1074
+ onClick,
1075
+ className = "",
1076
+ classNames = {},
1077
+ style,
1078
+ announcementOptions,
1079
+ iconSize = DEFAULT_ICON_SIZE,
1080
+ ariaLabel = "\u304A\u77E5\u3089\u305B"
1081
+ }) {
1082
+ const { unreadCount } = useFFIDAnnouncements(announcementOptions);
1083
+ return /* @__PURE__ */ jsxs(
1084
+ "button",
1085
+ {
1086
+ type: "button",
1087
+ onClick,
1088
+ className: [className, classNames.button].filter(Boolean).join(" ") || void 0,
1089
+ style: {
1090
+ position: "relative",
1091
+ display: "inline-flex",
1092
+ alignItems: "center",
1093
+ justifyContent: "center",
1094
+ background: "none",
1095
+ border: "none",
1096
+ cursor: "pointer",
1097
+ padding: 4,
1098
+ borderRadius: 6,
1099
+ color: "inherit",
1100
+ ...style
1101
+ },
1102
+ "aria-label": `${ariaLabel}${unreadCount > 0 ? ` (${unreadCount}\u4EF6\u672A\u8AAD)` : ""}`,
1103
+ children: [
1104
+ /* @__PURE__ */ jsx(BellIcon, { size: iconSize, className: classNames.icon }),
1105
+ unreadCount > 0 && /* @__PURE__ */ jsx(
1106
+ "span",
1107
+ {
1108
+ className: classNames.badge,
1109
+ style: {
1110
+ position: "absolute",
1111
+ top: BADGE_OFFSET,
1112
+ right: BADGE_OFFSET,
1113
+ display: "inline-flex",
1114
+ alignItems: "center",
1115
+ justifyContent: "center",
1116
+ minWidth: BADGE_SIZE,
1117
+ height: BADGE_SIZE,
1118
+ padding: "0 4px",
1119
+ borderRadius: 9999,
1120
+ fontSize: BADGE_FONT_SIZE,
1121
+ fontWeight: 600,
1122
+ lineHeight: 1,
1123
+ backgroundColor: "#ef4444",
1124
+ color: "white"
1125
+ },
1126
+ "aria-hidden": "true",
1127
+ children: unreadCount > BADGE_MAX_COUNT ? `${BADGE_MAX_COUNT}+` : unreadCount
1128
+ }
1129
+ )
1130
+ ]
1131
+ }
1132
+ );
1133
+ }
1134
+ function WrenchIcon() {
1135
+ return /* @__PURE__ */ jsx(
1136
+ "svg",
1137
+ {
1138
+ xmlns: "http://www.w3.org/2000/svg",
1139
+ width: 16,
1140
+ height: 16,
1141
+ viewBox: "0 0 24 24",
1142
+ fill: "none",
1143
+ stroke: "currentColor",
1144
+ strokeWidth: 2,
1145
+ strokeLinecap: "round",
1146
+ strokeLinejoin: "round",
1147
+ "aria-hidden": "true",
1148
+ children: /* @__PURE__ */ jsx("path", { d: "M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z" })
1149
+ }
1150
+ );
1151
+ }
1152
+ function AlertTriangleIcon() {
1153
+ return /* @__PURE__ */ jsxs(
1154
+ "svg",
1155
+ {
1156
+ xmlns: "http://www.w3.org/2000/svg",
1157
+ width: 16,
1158
+ height: 16,
1159
+ viewBox: "0 0 24 24",
1160
+ fill: "none",
1161
+ stroke: "currentColor",
1162
+ strokeWidth: 2,
1163
+ strokeLinecap: "round",
1164
+ strokeLinejoin: "round",
1165
+ "aria-hidden": "true",
1166
+ children: [
1167
+ /* @__PURE__ */ jsx("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z" }),
1168
+ /* @__PURE__ */ jsx("path", { d: "M12 9v4" }),
1169
+ /* @__PURE__ */ jsx("path", { d: "M12 17h.01" })
1170
+ ]
1171
+ }
1172
+ );
1173
+ }
1174
+ function InfoIcon() {
1175
+ return /* @__PURE__ */ jsxs(
1176
+ "svg",
1177
+ {
1178
+ xmlns: "http://www.w3.org/2000/svg",
1179
+ width: 16,
1180
+ height: 16,
1181
+ viewBox: "0 0 24 24",
1182
+ fill: "none",
1183
+ stroke: "currentColor",
1184
+ strokeWidth: 2,
1185
+ strokeLinecap: "round",
1186
+ strokeLinejoin: "round",
1187
+ "aria-hidden": "true",
1188
+ children: [
1189
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
1190
+ /* @__PURE__ */ jsx("path", { d: "M12 16v-4" }),
1191
+ /* @__PURE__ */ jsx("path", { d: "M12 8h.01" })
1192
+ ]
1193
+ }
1194
+ );
1195
+ }
1196
+ var TYPE_ICON_CONFIG = {
1197
+ maintenance: { icon: WrenchIcon, color: "#f59e0b" },
1198
+ incident: { icon: AlertTriangleIcon, color: "#ef4444" }
1199
+ };
1200
+ function getTypeIcon(type) {
1201
+ const category = type.split(".")[0];
1202
+ const config = TYPE_ICON_CONFIG[category];
1203
+ if (config) {
1204
+ return { icon: config.icon(), color: config.color };
1205
+ }
1206
+ return { icon: /* @__PURE__ */ jsx(InfoIcon, {}), color: "#6b7280" };
1207
+ }
1208
+ var DEFAULT_MAX_CONTENT_LINES = 2;
1209
+ function defaultFormatDate(dateStr) {
1210
+ try {
1211
+ const date = new Date(dateStr);
1212
+ return new Intl.DateTimeFormat("ja-JP", {
1213
+ year: "numeric",
1214
+ month: "2-digit",
1215
+ day: "2-digit",
1216
+ hour: "2-digit",
1217
+ minute: "2-digit"
1218
+ }).format(date);
1219
+ } catch {
1220
+ return dateStr;
1221
+ }
1222
+ }
1223
+ function FFIDAnnouncementList({
1224
+ announcements,
1225
+ isLoading = false,
1226
+ className = "",
1227
+ classNames = {},
1228
+ style,
1229
+ formatDate = defaultFormatDate,
1230
+ emptyMessage,
1231
+ loadingRender,
1232
+ renderItem,
1233
+ maxContentLines = DEFAULT_MAX_CONTENT_LINES
1234
+ }) {
1235
+ if (isLoading) {
1236
+ if (loadingRender) {
1237
+ return /* @__PURE__ */ jsx(Fragment, { children: loadingRender });
1238
+ }
1239
+ return /* @__PURE__ */ jsx(
1240
+ "div",
1241
+ {
1242
+ className: [className, classNames.container].filter(Boolean).join(" ") || void 0,
1243
+ style: { padding: SPACING_MD, textAlign: "center", color: COLOR_TEXT_MUTED, ...style },
1244
+ children: "\u8AAD\u307F\u8FBC\u307F\u4E2D..."
1245
+ }
1246
+ );
1247
+ }
1248
+ if (announcements.length === 0) {
1249
+ return /* @__PURE__ */ jsx(
1250
+ "div",
1251
+ {
1252
+ className: [className, classNames.container, classNames.empty].filter(Boolean).join(" ") || void 0,
1253
+ style: { padding: SPACING_MD, textAlign: "center", color: COLOR_TEXT_MUTED, ...style },
1254
+ children: emptyMessage ?? "\u304A\u77E5\u3089\u305B\u306F\u3042\u308A\u307E\u305B\u3093"
1255
+ }
1256
+ );
1257
+ }
1258
+ return /* @__PURE__ */ jsx(
1259
+ "div",
1260
+ {
1261
+ className: [className, classNames.container].filter(Boolean).join(" ") || void 0,
1262
+ style: {
1263
+ display: "flex",
1264
+ flexDirection: "column",
1265
+ gap: 0,
1266
+ ...style
1267
+ },
1268
+ role: "list",
1269
+ "aria-label": "\u304A\u77E5\u3089\u305B\u4E00\u89A7",
1270
+ children: announcements.map((announcement) => {
1271
+ if (renderItem) {
1272
+ return /* @__PURE__ */ jsx("div", { role: "listitem", children: renderItem(announcement) }, announcement.id);
1273
+ }
1274
+ const { icon, color } = getTypeIcon(announcement.type);
1275
+ const displayDate = announcement.publishedAt ?? announcement.createdAt;
1276
+ return /* @__PURE__ */ jsxs(
1277
+ "div",
1278
+ {
1279
+ className: classNames.item,
1280
+ style: {
1281
+ display: "flex",
1282
+ gap: SPACING_SM,
1283
+ padding: SPACING_MD,
1284
+ borderBottom: `1px solid ${COLOR_BORDER}`
1285
+ },
1286
+ role: "listitem",
1287
+ children: [
1288
+ /* @__PURE__ */ jsx(
1289
+ "div",
1290
+ {
1291
+ className: classNames.icon,
1292
+ style: {
1293
+ flexShrink: 0,
1294
+ color,
1295
+ marginTop: 2
1296
+ },
1297
+ children: icon
1298
+ }
1299
+ ),
1300
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
1301
+ /* @__PURE__ */ jsx(
1302
+ "div",
1303
+ {
1304
+ className: classNames.title,
1305
+ style: {
1306
+ fontSize: FONT_SIZE_SM,
1307
+ fontWeight: 600,
1308
+ lineHeight: 1.4,
1309
+ marginBottom: SPACING_XS
1310
+ },
1311
+ children: announcement.title
1312
+ }
1313
+ ),
1314
+ maxContentLines > 0 && announcement.content && /* @__PURE__ */ jsx(
1315
+ "div",
1316
+ {
1317
+ className: classNames.content,
1318
+ style: {
1319
+ fontSize: FONT_SIZE_XS,
1320
+ color: COLOR_TEXT_MUTED,
1321
+ lineHeight: 1.5,
1322
+ overflow: "hidden",
1323
+ display: "-webkit-box",
1324
+ WebkitLineClamp: maxContentLines,
1325
+ WebkitBoxOrient: "vertical",
1326
+ marginBottom: SPACING_XS
1327
+ },
1328
+ children: announcement.content
1329
+ }
1330
+ ),
1331
+ /* @__PURE__ */ jsxs(
1332
+ "div",
1333
+ {
1334
+ style: {
1335
+ display: "flex",
1336
+ flexWrap: "wrap",
1337
+ alignItems: "center",
1338
+ gap: SPACING_XS,
1339
+ marginTop: SPACING_XS
1340
+ },
1341
+ children: [
1342
+ /* @__PURE__ */ jsx(
1343
+ "span",
1344
+ {
1345
+ className: classNames.timestamp,
1346
+ style: {
1347
+ fontSize: FONT_SIZE_XS,
1348
+ color: COLOR_TEXT_MUTED
1349
+ },
1350
+ children: formatDate(displayDate)
1351
+ }
1352
+ ),
1353
+ announcement.affectedServices.length > 0 && announcement.affectedServices.map((service) => /* @__PURE__ */ jsx(
1354
+ "span",
1355
+ {
1356
+ className: classNames.serviceTag,
1357
+ style: {
1358
+ display: "inline-block",
1359
+ fontSize: FONT_SIZE_XS,
1360
+ padding: `1px ${SPACING_XS}px`,
1361
+ borderRadius: BORDER_RADIUS_SM,
1362
+ backgroundColor: "#f3f4f6",
1363
+ color: "#4b5563"
1364
+ },
1365
+ children: service
1366
+ },
1367
+ service
1368
+ ))
1369
+ ]
1370
+ }
1371
+ )
1372
+ ] })
1373
+ ]
1374
+ },
1375
+ announcement.id
1376
+ );
1377
+ })
1378
+ }
1379
+ );
1380
+ }
1381
+
1382
+ export { DEFAULT_API_BASE_URL, FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDProvider, FFIDSubscriptionBadge, FFIDUserMenu, FFID_ANNOUNCEMENTS_ERROR_CODES, createFFIDAnnouncementsClient, useFFID, useFFIDAnnouncements, useFFIDContext, useSubscription, withSubscription };
@@ -1,22 +1,30 @@
1
1
  'use strict';
2
2
 
3
- var chunkYCMQXJOS_cjs = require('../chunk-YCMQXJOS.cjs');
3
+ var chunkA6YJDYIX_cjs = require('../chunk-A6YJDYIX.cjs');
4
4
 
5
5
 
6
6
 
7
+ Object.defineProperty(exports, "FFIDAnnouncementBadge", {
8
+ enumerable: true,
9
+ get: function () { return chunkA6YJDYIX_cjs.FFIDAnnouncementBadge; }
10
+ });
11
+ Object.defineProperty(exports, "FFIDAnnouncementList", {
12
+ enumerable: true,
13
+ get: function () { return chunkA6YJDYIX_cjs.FFIDAnnouncementList; }
14
+ });
7
15
  Object.defineProperty(exports, "FFIDLoginButton", {
8
16
  enumerable: true,
9
- get: function () { return chunkYCMQXJOS_cjs.FFIDLoginButton; }
17
+ get: function () { return chunkA6YJDYIX_cjs.FFIDLoginButton; }
10
18
  });
11
19
  Object.defineProperty(exports, "FFIDOrganizationSwitcher", {
12
20
  enumerable: true,
13
- get: function () { return chunkYCMQXJOS_cjs.FFIDOrganizationSwitcher; }
21
+ get: function () { return chunkA6YJDYIX_cjs.FFIDOrganizationSwitcher; }
14
22
  });
15
23
  Object.defineProperty(exports, "FFIDSubscriptionBadge", {
16
24
  enumerable: true,
17
- get: function () { return chunkYCMQXJOS_cjs.FFIDSubscriptionBadge; }
25
+ get: function () { return chunkA6YJDYIX_cjs.FFIDSubscriptionBadge; }
18
26
  });
19
27
  Object.defineProperty(exports, "FFIDUserMenu", {
20
28
  enumerable: true,
21
- get: function () { return chunkYCMQXJOS_cjs.FFIDUserMenu; }
29
+ get: function () { return chunkA6YJDYIX_cjs.FFIDUserMenu; }
22
30
  });
@@ -1,3 +1,3 @@
1
- export { h as FFIDLoginButton, n as FFIDLoginButtonProps, i as FFIDOrganizationSwitcher, o as FFIDOrganizationSwitcherClassNames, p as FFIDOrganizationSwitcherProps, l as FFIDSubscriptionBadge, q as FFIDSubscriptionBadgeClassNames, r as FFIDSubscriptionBadgeProps, m as FFIDUserMenu, s as FFIDUserMenuClassNames, t as FFIDUserMenuProps } from '../index-CtBBLbTn.cjs';
1
+ export { k as FFIDAnnouncementBadge, B as FFIDAnnouncementBadgeClassNames, C as FFIDAnnouncementBadgeProps, l as FFIDAnnouncementList, D as FFIDAnnouncementListClassNames, E as FFIDAnnouncementListProps, s as FFIDLoginButton, G as FFIDLoginButtonProps, t as FFIDOrganizationSwitcher, H as FFIDOrganizationSwitcherClassNames, I as FFIDOrganizationSwitcherProps, w as FFIDSubscriptionBadge, J as FFIDSubscriptionBadgeClassNames, K as FFIDSubscriptionBadgeProps, x as FFIDUserMenu, M as FFIDUserMenuClassNames, N as FFIDUserMenuProps } from '../index-DBp3Ulyl.cjs';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
@@ -1,3 +1,3 @@
1
- export { h as FFIDLoginButton, n as FFIDLoginButtonProps, i as FFIDOrganizationSwitcher, o as FFIDOrganizationSwitcherClassNames, p as FFIDOrganizationSwitcherProps, l as FFIDSubscriptionBadge, q as FFIDSubscriptionBadgeClassNames, r as FFIDSubscriptionBadgeProps, m as FFIDUserMenu, s as FFIDUserMenuClassNames, t as FFIDUserMenuProps } from '../index-CtBBLbTn.js';
1
+ export { k as FFIDAnnouncementBadge, B as FFIDAnnouncementBadgeClassNames, C as FFIDAnnouncementBadgeProps, l as FFIDAnnouncementList, D as FFIDAnnouncementListClassNames, E as FFIDAnnouncementListProps, s as FFIDLoginButton, G as FFIDLoginButtonProps, t as FFIDOrganizationSwitcher, H as FFIDOrganizationSwitcherClassNames, I as FFIDOrganizationSwitcherProps, w as FFIDSubscriptionBadge, J as FFIDSubscriptionBadgeClassNames, K as FFIDSubscriptionBadgeProps, x as FFIDUserMenu, M as FFIDUserMenuClassNames, N as FFIDUserMenuProps } from '../index-DBp3Ulyl.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
@@ -1 +1 @@
1
- export { FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-A63MX52D.js';
1
+ export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-VXBUXOLF.js';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * FFID SDK Shared Constants
3
+ *
4
+ * Constants shared across all SDK entry points.
5
+ * Centralizing these prevents drift during domain/URL changes.
6
+ */
7
+ /** Default FFID API base URL (production) */
8
+ declare const DEFAULT_API_BASE_URL = "https://id.feelflow.co.jp";
9
+
10
+ export { DEFAULT_API_BASE_URL as D };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * FFID SDK Shared Constants
3
+ *
4
+ * Constants shared across all SDK entry points.
5
+ * Centralizing these prevents drift during domain/URL changes.
6
+ */
7
+ /** Default FFID API base URL (production) */
8
+ declare const DEFAULT_API_BASE_URL = "https://id.feelflow.co.jp";
9
+
10
+ export { DEFAULT_API_BASE_URL as D };