sellmate-design-system-react 9.0.0-beta.102 → 9.0.0-beta.104

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 (58) hide show
  1. package/AGENTS.md +23 -1
  2. package/dist/components/SAccountListBox/accountListBox.config.d.ts +4 -1
  3. package/dist/components/SBarcodeInput/README.md +1 -1
  4. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +1 -0
  5. package/dist/components/SCalendarBoard/CalendarDayEventListBox.d.ts +1 -1
  6. package/dist/components/SCalendarBoard/README.md +1 -1
  7. package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +1 -1
  8. package/dist/components/SChatInput/README.md +1 -1
  9. package/dist/components/SChatInput/SChatInput.d.ts +1 -1
  10. package/dist/components/SConfirmModal/README.md +1 -1
  11. package/dist/components/SConfirmModal/SConfirmModal.d.ts +2 -2
  12. package/dist/components/SEditor/README.md +1 -1
  13. package/dist/components/SEditor/SEditor.d.ts +1 -1
  14. package/dist/components/SEditor/editor.config.d.ts +8 -1
  15. package/dist/components/SFooter/README.md +1 -1
  16. package/dist/components/SFooter/SFooter.d.ts +1 -1
  17. package/dist/components/SGnbSystem/gnbSystem.config.d.ts +0 -4
  18. package/dist/components/SGuide/README.md +1 -1
  19. package/dist/components/SGuide/SGuide.d.ts +1 -1
  20. package/dist/components/SIcon/README.md +1 -1
  21. package/dist/components/SIcon/SIcon.d.ts +5 -1
  22. package/dist/components/SIcon/icons.gen.d.ts +6 -1
  23. package/dist/components/SMeatballButton/README.md +2 -2
  24. package/dist/components/SMeatballButton/SMeatballButton.d.ts +5 -2
  25. package/dist/components/SModalContainer/README.md +1 -1
  26. package/dist/components/SModalContainer/SModalContainer.d.ts +5 -2
  27. package/dist/components/SNumberInput/README.md +1 -1
  28. package/dist/components/SSearchInput/README.md +1 -1
  29. package/dist/components/SSearchInput/SSearchInput.d.ts +1 -1
  30. package/dist/components/SSelect/README.md +2 -2
  31. package/dist/components/SSelect/SSelect.d.ts +2 -2
  32. package/dist/components/SStepper/README.md +1 -1
  33. package/dist/components/SStepper/SStepper.d.ts +2 -2
  34. package/dist/components/SSystemActionButton/README.md +7 -0
  35. package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +31 -1
  36. package/dist/components/STable/README.md +3 -3
  37. package/dist/components/STable/STable.d.ts +3 -1
  38. package/dist/components/STableBar/README.md +1 -1
  39. package/dist/components/STableBar/STableBar.d.ts +1 -1
  40. package/dist/components/STimePicker/timepicker.config.d.ts +2 -1
  41. package/dist/components/STimeRangePicker/time-range-picker.config.d.ts +2 -1
  42. package/dist/components/STimeline/README.md +1 -1
  43. package/dist/components/STimeline/STimeline.d.ts +1 -0
  44. package/dist/index.cjs +1746 -494
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.ts +2 -0
  47. package/dist/index.js +1744 -496
  48. package/dist/index.js.map +1 -1
  49. package/dist/lib/chart/radial.d.ts +2 -2
  50. package/dist/lib/date.d.ts +9 -5
  51. package/dist/lib/form.d.ts +5 -2
  52. package/dist/lib/locale-context.d.ts +26 -0
  53. package/dist/lib/locale.d.ts +320 -0
  54. package/dist/lib/tree-row.d.ts +1 -1
  55. package/dist/llms-full.txt +51 -22
  56. package/dist/llms.txt +23 -1
  57. package/dist/styles.css +3 -0
  58. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -272,6 +272,1033 @@ var fieldWidthValue = (v) => {
272
272
  if (isFieldWidthGrade(v)) return `var(--cmp-field-width-${v})`;
273
273
  return typeof v === "number" ? `${v}px` : v;
274
274
  };
275
+
276
+ // src/lib/locale.ts
277
+ var SLOCALES = ["ko", "en", "ja", "zh"];
278
+ var DEFAULT_LOCALE = "ko";
279
+ var koreanParticle = (word, consonant, vowel) => {
280
+ const code = word.charCodeAt(word.length - 1);
281
+ if (code < 44032 || code > 55203) return consonant;
282
+ return (code - 44032) % 28 === 0 ? vowel : consonant;
283
+ };
284
+ var BUNDLES = {
285
+ ko: {
286
+ accountListBox: { accountSetting: "\uACC4\uC815 \uC124\uC815", language: "\uC5B8\uC5B4 \uBCC0\uACBD", logout: "\uACC4\uC815 \uB85C\uADF8\uC544\uC6C3" },
287
+ gnbSystem: { alert: "\uC54C\uB9BC", setting: "\uC124\uC815" },
288
+ editor: {
289
+ placeholder: "\uB0B4\uC6A9\uC744 \uC785\uB825\uD574 \uC8FC\uC138\uC694.",
290
+ toolbarLabel: "\uC11C\uC2DD \uB3C4\uAD6C",
291
+ tableSize: "\uD45C \uD06C\uAE30",
292
+ linkUrl: "\uB9C1\uD06C \uC8FC\uC18C",
293
+ apply: "\uC801\uC6A9",
294
+ remove: "\uC81C\uAC70",
295
+ headingLevel: "\uC81C\uBAA9 \uB2E8\uACC4",
296
+ headingBody: "\uBCF8\uBB38",
297
+ fontSize: "\uAE00\uC790 \uD06C\uAE30",
298
+ fontSizeDefaultLabel: "\uAE30\uBCF8",
299
+ bold: "\uAD75\uAC8C",
300
+ italic: "\uAE30\uC6B8\uC784",
301
+ underline: "\uBC11\uC904",
302
+ strike: "\uCDE8\uC18C\uC120",
303
+ inlineCode: "\uC778\uB77C\uC778 \uCF54\uB4DC",
304
+ textColor: "\uAE00\uC790\uC0C9",
305
+ clearColor: "\uC0C9 \uC9C0\uC6B0\uAE30",
306
+ alignLeft: "\uC67C\uCABD \uC815\uB82C",
307
+ alignCenter: "\uAC00\uC6B4\uB370 \uC815\uB82C",
308
+ alignRight: "\uC624\uB978\uCABD \uC815\uB82C",
309
+ alignJustify: "\uC591\uCABD \uC815\uB82C",
310
+ bulletList: "\uAE00\uBA38\uB9AC \uAE30\uD638 \uBAA9\uB85D",
311
+ orderedList: "\uBC88\uD638 \uB9E4\uAE30\uAE30 \uBAA9\uB85D",
312
+ taskList: "\uCCB4\uD06C \uBAA9\uB85D",
313
+ list: "\uBAA9\uB85D",
314
+ blockquote: "\uC778\uC6A9\uAD6C",
315
+ codeBlock: "\uCF54\uB4DC \uBE14\uB85D",
316
+ divider: "\uAD6C\uBD84\uC120",
317
+ link: "\uB9C1\uD06C",
318
+ insertImage: "\uC774\uBBF8\uC9C0 \uB123\uAE30",
319
+ image: "\uC774\uBBF8\uC9C0",
320
+ table: "\uD45C",
321
+ addRowAbove: "\uC704\uC5D0 \uD589 \uCD94\uAC00",
322
+ addRowBelow: "\uC544\uB798\uC5D0 \uD589 \uCD94\uAC00",
323
+ addColLeft: "\uC67C\uCABD\uC5D0 \uC5F4 \uCD94\uAC00",
324
+ addColRight: "\uC624\uB978\uCABD\uC5D0 \uC5F4 \uCD94\uAC00",
325
+ mergeCells: "\uC140 \uBCD1\uD569",
326
+ splitCell: "\uBCD1\uD569 \uD574\uC81C",
327
+ toggleHeaderRow: "\uD5E4\uB354 \uD589 \uD1A0\uAE00",
328
+ toggleHeaderCol: "\uD5E4\uB354 \uC5F4 \uD1A0\uAE00",
329
+ deleteRow: "\uD589 \uC0AD\uC81C",
330
+ deleteCol: "\uC5F4 \uC0AD\uC81C",
331
+ deleteTable: "\uD45C \uC0AD\uC81C",
332
+ undo: "\uC2E4\uD589 \uCDE8\uC18C",
333
+ redo: "\uB2E4\uC2DC \uC2E4\uD589",
334
+ colorDefault: "\uAE30\uBCF8",
335
+ colorSecondary: "\uBCF4\uC870",
336
+ colorMuted: "\uD750\uB9BC",
337
+ colorAccent: "\uAC15\uC870",
338
+ colorBrand: "\uBE0C\uB79C\uB4DC",
339
+ colorSuccess: "\uC131\uACF5",
340
+ colorWarning: "\uC8FC\uC758",
341
+ colorDanger: "\uC704\uD5D8",
342
+ tableCell: (r3, c) => `${r3}\uD589 ${c}\uC5F4`,
343
+ tableSizeText: (rows, cols) => `${rows}\uD589 \xD7 ${cols}\uC5F4`,
344
+ heading: (level) => `\uC81C\uBAA9 ${level}`,
345
+ fontSizeDefault: (px) => `\uAE30\uBCF8 (\uBCF8\uBB38 ${px}px)`,
346
+ closeEditing: (label) => `${label} \uB2EB\uAE30`
347
+ },
348
+ form: { invalid: "\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uAC12\uC785\uB2C8\uB2E4." },
349
+ date: {
350
+ weekdays: ["\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"],
351
+ weekdaysLong: ["\uC77C\uC694\uC77C", "\uC6D4\uC694\uC77C", "\uD654\uC694\uC77C", "\uC218\uC694\uC77C", "\uBAA9\uC694\uC77C", "\uAE08\uC694\uC77C", "\uD1A0\uC694\uC77C"],
352
+ today: "\uC624\uB298",
353
+ prevYear: "\uC774\uC804 \uD574",
354
+ nextYear: "\uB2E4\uC74C \uD574",
355
+ prevMonth: "\uC774\uC804 \uB2EC",
356
+ nextMonth: "\uB2E4\uC74C \uB2EC",
357
+ monthLabel: (month) => `${month}\uC6D4`,
358
+ dayLabel: (day) => `${day}\uC77C`,
359
+ unitYear: "\uB144",
360
+ unitMonth: "\uC6D4",
361
+ unitDay: "\uC77C",
362
+ hourItem: (hour) => `${hour}\uC2DC`,
363
+ minuteItem: (minute) => `${minute}\uBD84`,
364
+ hourAria: (prefix) => prefix ? `${prefix} \uC2DC` : "\uC2DC",
365
+ minuteAria: (prefix) => prefix ? `${prefix} \uBD84` : "\uBD84",
366
+ meridiemAria: (prefix) => prefix ? `${prefix} \uC624\uC804/\uC624\uD6C4` : "\uC624\uC804/\uC624\uD6C4",
367
+ am: "\uC624\uC804",
368
+ pm: "\uC624\uD6C4",
369
+ rangeFrom: "\uBD80\uD130",
370
+ rangeTo: "\uAE4C\uC9C0",
371
+ clearDate: "\uB0A0\uC9DC \uC9C0\uC6B0\uAE30",
372
+ clearMonth: "\uC6D4 \uC9C0\uC6B0\uAE30",
373
+ clearYear: "\uC5F0\uB3C4 \uC9C0\uC6B0\uAE30",
374
+ clearPeriod: "\uAE30\uAC04 \uC9C0\uC6B0\uAE30",
375
+ clearTime: "\uC2DC\uAC04 \uC9C0\uC6B0\uAE30",
376
+ clearTimeRange: "\uC2DC\uAC04 \uBC94\uC704 \uC9C0\uC6B0\uAE30",
377
+ start: "\uC2DC\uC791",
378
+ end: "\uC885\uB8CC",
379
+ startTime: "\uC2DC\uC791 \uC2DC\uAC04",
380
+ endTime: "\uC885\uB8CC \uC2DC\uAC04"
381
+ },
382
+ chart: {
383
+ unit: (unit) => `\uB2E8\uC704 : ${unit}`,
384
+ pie: "\uD30C\uC774 \uADF8\uB798\uD504",
385
+ donut: "\uB3C4\uB11B \uADF8\uB798\uD504",
386
+ radialSummary: (count, kind) => `${count}\uAC1C \uD56D\uBAA9 ${kind}`,
387
+ barSummary: (c, s, stacked) => `${c}\uAC1C \uD56D\uBAA9, ${s}\uAC1C \uACC4\uC5F4 ${stacked ? "\uB204\uC801 " : ""}\uB9C9\uB300 \uADF8\uB798\uD504`,
388
+ lineSummary: (c, s, stacked) => `${c}\uAC1C \uD56D\uBAA9, ${s}\uAC1C \uACC4\uC5F4 ${stacked ? "\uB204\uC801 " : ""}\uAEBE\uC740\uC120 \uADF8\uB798\uD504`
389
+ },
390
+ chipFilter: {
391
+ periodDay: "\uC77C\uBCC4",
392
+ periodMonth: "\uC6D4\uBCC4",
393
+ periodQuarter: "\uBD84\uAE30\uBCC4",
394
+ periodHalf: "\uBC18\uAE30\uBCC4",
395
+ periodYear: "\uC5F0\uB3C4\uBCC4",
396
+ custom: "\uC0AC\uC6A9\uC790 \uC9C0\uC815",
397
+ today: "\uC624\uB298",
398
+ last7: "\uC9C0\uB09C 7\uC77C",
399
+ last30: "\uC9C0\uB09C 30\uC77C",
400
+ maxWord: "\uCD5C\uB300",
401
+ maxRangeHint: (days) => `\uCD5C\uB300 ${days}\uC77C\uC529`,
402
+ requireAll: "\uD56D\uBAA9\uC744 \uBAA8\uB450 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.",
403
+ requireAnyDefault: "\uCD5C\uC18C 1\uAC1C\uC758 \uD544\uD130\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694.",
404
+ requireAnyNamed: (name) => `\uCD5C\uC18C 1\uAC1C\uC758 ${name}${koreanParticle(name, "\uC744", "\uB97C")} \uC120\uD0DD\uD574\uC8FC\uC138\uC694.`,
405
+ requireField: (label) => `${label}${koreanParticle(label, "\uC744", "\uB97C")} \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.`,
406
+ fieldFallback: "\uD56D\uBAA9",
407
+ valueListMore: (first, rest) => `${first} \uC678 ${rest}\uAC1C`,
408
+ quarter: (n) => `${n}\uBD84\uAE30`,
409
+ firstHalf: "\uC0C1\uBC18\uAE30",
410
+ secondHalf: "\uD558\uBC18\uAE30",
411
+ removeFilter: (label) => `${label} \uD544\uD130 \uC81C\uAC70`,
412
+ clearFilter: (label) => `${label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
413
+ resetSearch: "\uAC80\uC0C9 \uCD08\uAE30\uD654",
414
+ addFilter: "\uD544\uD130 \uCD94\uAC00",
415
+ noAddableFilter: "\uCD94\uAC00\uD560 \uD544\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
416
+ selectNone: "\uC120\uD0DD \uD574\uC81C",
417
+ selectAll: "\uC804\uCCB4 \uC120\uD0DD",
418
+ removeItem: (label) => `${label} \uC0AD\uC81C`,
419
+ keywordContains: "\uD3EC\uD568",
420
+ keywordExact: "\uC77C\uCE58",
421
+ keywordExcludes: "\uBBF8\uD3EC\uD568",
422
+ keywordHintCsv: "\uB2E4\uC911 \uD0A4\uC6CC\uB4DC\uB294 \uCF64\uB9C8(,)\uB85C \uAD6C\uBD84",
423
+ keywordHintEnter: "\uC785\uB825 \uD6C4 Enter\uB85C \uCD94\uAC00",
424
+ keywordCondition: "\uAC80\uC0C9 \uC870\uAC74 :",
425
+ noSearchResults: "\uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
426
+ },
427
+ numberInput: {
428
+ rangeBetween: (min, max) => `${min}~${max} \uC0AC\uC774\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694.`,
429
+ atLeast: (min) => `${min} \uC774\uC0C1\uC73C\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694.`,
430
+ atMost: (max) => `${max} \uC774\uD558\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694.`,
431
+ increase: "\uC99D\uAC00",
432
+ decrease: "\uAC10\uC18C"
433
+ },
434
+ chipInput: {
435
+ placeholderWithComma: "\uD0DC\uADF8 \uC785\uB825 (Enter\xB7\uCF64\uB9C8\uB85C \uB4F1\uB85D)",
436
+ placeholder: "\uD0DC\uADF8 \uC785\uB825 (Enter\uB85C \uB4F1\uB85D)",
437
+ duplicateNamed: (label) => `\uC774\uBBF8 \uC785\uB825\uB41C ${label}\uC785\uB2C8\uB2E4.`,
438
+ duplicate: "\uC911\uBCF5\uB41C \uAC12\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4.",
439
+ maxCount: (max) => `\uCD5C\uB300 ${max}\uAC1C`
440
+ },
441
+ slider: { minValue: "\uCD5C\uC19F\uAC12", maxValue: "\uCD5C\uB313\uAC12" },
442
+ chat: {
443
+ removeAttachment: (name) => `${name} \uC81C\uAC70`,
444
+ placeholder: "\uBA54\uC2DC\uC9C0\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694...",
445
+ attachFile: "\uD30C\uC77C \uCCA8\uBD80",
446
+ stopResponse: "\uC751\uB2F5 \uC911\uC9C0",
447
+ send: "\uC804\uC1A1",
448
+ read: "\uC77D\uC74C",
449
+ unread: "\uC548 \uC77D\uC74C"
450
+ },
451
+ loadingModal: {
452
+ loadingMessage: "\uC791\uC5C5 \uC9C4\uD589\uC911...",
453
+ errorMessage: "\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD558\uC600\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",
454
+ errorButton: "\uB2E4\uC2DC \uC2DC\uB3C4",
455
+ ariaTitle: "\uB85C\uB529 \uC911"
456
+ },
457
+ stepper: { errorTooltip: "\uD655\uC778\uC774 \uD544\uC694\uD55C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.", ariaLabel: "\uC9C4\uD589 \uB2E8\uACC4" },
458
+ timeline: { empty: "\uB0B4\uC5ED\uC774 \uC5C6\uC2B5\uB2C8\uB2E4." },
459
+ callout: { dangerTitle: "\uC8FC\uC758\uC0AC\uD56D" },
460
+ guide: { tip: "\uD65C\uC6A9 TIP", notion: "\uC0AC\uC6A9\uBC95 \uC548\uB0B4" },
461
+ loginCard: { login: "\uD1B5\uD569 \uACC4\uC815\uC73C\uB85C \uB85C\uADF8\uC778" },
462
+ modal: { defaultTitle: "\uBAA8\uB2EC" },
463
+ launcher: { opensInNewTab: "\uC0C8 \uD0ED\uC5D0\uC11C \uC5F4\uB9BC" },
464
+ common: {
465
+ close: "\uB2EB\uAE30",
466
+ clear: "\uC9C0\uC6B0\uAE30",
467
+ confirm: "\uD655\uC778",
468
+ all: "\uC804\uCCB4",
469
+ back: "\uB4A4\uB85C\uAC00\uAE30",
470
+ more: "\uB354\uBCF4\uAE30",
471
+ moreActions: "\uAE30\uB2A5 \uB354 \uBCF4\uAE30",
472
+ openMenu: "\uBA54\uB274 \uC5F4\uAE30",
473
+ dragHandle: "\uB4DC\uB798\uADF8 \uD578\uB4E4",
474
+ resizeDrawer: "Drawer \uB108\uBE44 \uC870\uC808",
475
+ search: "\uAC80\uC0C9",
476
+ count: (n) => `${n}\uAC1C`
477
+ },
478
+ input: {
479
+ placeholder: "\uC785\uB825\uD574 \uC8FC\uC138\uC694.",
480
+ searchWithinResults: "\uACB0\uACFC \uB0B4 \uAC80\uC0C9",
481
+ clearInput: "\uC785\uB825 \uCD08\uAE30\uD654",
482
+ showPassword: "\uBE44\uBC00\uBC88\uD638 \uD45C\uC2DC"
483
+ },
484
+ pagination: {
485
+ firstPage: "\uCCAB \uD398\uC774\uC9C0",
486
+ prevPage: "\uC774\uC804 \uD398\uC774\uC9C0",
487
+ nextPage: "\uB2E4\uC74C \uD398\uC774\uC9C0",
488
+ lastPage: "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0",
489
+ prevGroup: "\uC774\uC804 \uADF8\uB8F9",
490
+ nextGroup: "\uB2E4\uC74C \uADF8\uB8F9"
491
+ },
492
+ select: {
493
+ placeholder: "\uC120\uD0DD",
494
+ allSelected: "\uC804\uCCB4",
495
+ clear: "\uC120\uD0DD \uC9C0\uC6B0\uAE30",
496
+ deselect: (label) => `${label} \uC120\uD0DD \uD574\uC81C`,
497
+ searchPlaceholder: "\uAC80\uC0C9",
498
+ empty: "\uD45C\uC2DC\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
499
+ loading: "\uBD88\uB7EC\uC624\uB294 \uC911..."
500
+ },
501
+ table: {
502
+ selectAll: "\uC804\uCCB4 \uC120\uD0DD",
503
+ selectRow: "\uD589 \uC120\uD0DD",
504
+ empty: "\uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
505
+ rowsPerPage: (count) => `${count}\uAC1C\uC529 \uBCF4\uAE30`,
506
+ editable: "\uC218\uC815 \uAC00\uB2A5",
507
+ opensInNewScreen: "\uC0C8 \uD654\uBA74\uC5D0\uC11C \uC5F4\uAE30",
508
+ sortBy: (label) => `${label} \uC815\uB82C`,
509
+ denseOff: "\uB113\uAC8C \uBCF4\uAE30",
510
+ denseOn: "\uC881\uAC8C \uBCF4\uAE30"
511
+ },
512
+ tableBar: {
513
+ totalBefore: "\uCD1D ",
514
+ totalAfter: " \uAC74",
515
+ selectedBefore: "",
516
+ selectedAfter: " \uAC74 \uC120\uD0DD"
517
+ }
518
+ },
519
+ en: {
520
+ accountListBox: {
521
+ accountSetting: "Account settings",
522
+ language: "Change language",
523
+ logout: "Log out"
524
+ },
525
+ gnbSystem: { alert: "Notifications", setting: "Settings" },
526
+ editor: {
527
+ placeholder: "Enter your content.",
528
+ toolbarLabel: "Formatting tools",
529
+ tableSize: "Table size",
530
+ linkUrl: "Link URL",
531
+ apply: "Apply",
532
+ remove: "Remove",
533
+ headingLevel: "Heading level",
534
+ headingBody: "Body",
535
+ fontSize: "Font size",
536
+ fontSizeDefaultLabel: "Default",
537
+ bold: "Bold",
538
+ italic: "Italic",
539
+ underline: "Underline",
540
+ strike: "Strikethrough",
541
+ inlineCode: "Inline code",
542
+ textColor: "Text color",
543
+ clearColor: "Clear color",
544
+ alignLeft: "Align left",
545
+ alignCenter: "Align center",
546
+ alignRight: "Align right",
547
+ alignJustify: "Justify",
548
+ bulletList: "Bullet list",
549
+ orderedList: "Numbered list",
550
+ taskList: "Checklist",
551
+ list: "List",
552
+ blockquote: "Quote",
553
+ codeBlock: "Code block",
554
+ divider: "Divider",
555
+ link: "Link",
556
+ insertImage: "Insert image",
557
+ image: "Image",
558
+ table: "Table",
559
+ addRowAbove: "Add row above",
560
+ addRowBelow: "Add row below",
561
+ addColLeft: "Add column left",
562
+ addColRight: "Add column right",
563
+ mergeCells: "Merge cells",
564
+ splitCell: "Split cell",
565
+ toggleHeaderRow: "Toggle header row",
566
+ toggleHeaderCol: "Toggle header column",
567
+ deleteRow: "Delete row",
568
+ deleteCol: "Delete column",
569
+ deleteTable: "Delete table",
570
+ undo: "Undo",
571
+ redo: "Redo",
572
+ colorDefault: "Default",
573
+ colorSecondary: "Secondary",
574
+ colorMuted: "Muted",
575
+ colorAccent: "Accent",
576
+ colorBrand: "Brand",
577
+ colorSuccess: "Success",
578
+ colorWarning: "Warning",
579
+ colorDanger: "Danger",
580
+ tableCell: (r3, c) => `Row ${r3}, column ${c}`,
581
+ tableSizeText: (rows, cols) => `${rows} rows \xD7 ${cols} columns`,
582
+ heading: (level) => `Heading ${level}`,
583
+ fontSizeDefault: (px) => `Default (body ${px}px)`,
584
+ closeEditing: (label) => `Close ${label}`
585
+ },
586
+ form: { invalid: "Invalid value." },
587
+ date: {
588
+ weekdays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
589
+ weekdaysLong: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
590
+ today: "Today",
591
+ prevYear: "Previous year",
592
+ nextYear: "Next year",
593
+ prevMonth: "Previous month",
594
+ nextMonth: "Next month",
595
+ monthLabel: (month) => ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][month - 1] ?? String(month),
596
+ dayLabel: (day) => String(day),
597
+ unitYear: "-",
598
+ unitMonth: "-",
599
+ unitDay: "",
600
+ hourItem: (hour) => hour,
601
+ minuteItem: (minute) => minute,
602
+ hourAria: (prefix) => prefix ? `${prefix} hour` : "Hour",
603
+ minuteAria: (prefix) => prefix ? `${prefix} minute` : "Minute",
604
+ meridiemAria: (prefix) => prefix ? `${prefix} AM/PM` : "AM/PM",
605
+ am: "AM",
606
+ pm: "PM",
607
+ rangeFrom: "From",
608
+ rangeTo: "To",
609
+ clearDate: "Clear date",
610
+ clearMonth: "Clear month",
611
+ clearYear: "Clear year",
612
+ clearPeriod: "Clear period",
613
+ clearTime: "Clear time",
614
+ clearTimeRange: "Clear time range",
615
+ start: "Start",
616
+ end: "End",
617
+ startTime: "Start time",
618
+ endTime: "End time"
619
+ },
620
+ chart: {
621
+ unit: (unit) => `Unit: ${unit}`,
622
+ pie: "Pie chart",
623
+ donut: "Donut chart",
624
+ radialSummary: (count, kind) => `${kind} with ${count} ${count === 1 ? "item" : "items"}`,
625
+ barSummary: (c, s, stacked) => `${stacked ? "Stacked bar chart" : "Bar chart"} with ${c} ${c === 1 ? "item" : "items"} and ${s} series`,
626
+ lineSummary: (c, s, stacked) => `${stacked ? "Stacked line chart" : "Line chart"} with ${c} ${c === 1 ? "item" : "items"} and ${s} series`
627
+ },
628
+ chipFilter: {
629
+ periodDay: "Daily",
630
+ periodMonth: "Monthly",
631
+ periodQuarter: "Quarterly",
632
+ periodHalf: "Half-yearly",
633
+ periodYear: "Yearly",
634
+ custom: "Custom",
635
+ today: "Today",
636
+ last7: "Last 7 days",
637
+ last30: "Last 30 days",
638
+ maxWord: "max",
639
+ maxRangeHint: (days) => `max ${days} days at a time`,
640
+ requireAll: "Select all items.",
641
+ requireAnyDefault: "Select at least one filter.",
642
+ requireAnyNamed: (name) => `Select at least one ${name}.`,
643
+ requireField: (label) => `Select ${label}.`,
644
+ fieldFallback: "item",
645
+ valueListMore: (first, rest) => `${first} +${rest} more`,
646
+ quarter: (n) => `Q${n}`,
647
+ firstHalf: "H1",
648
+ secondHalf: "H2",
649
+ removeFilter: (label) => `Remove ${label} filter`,
650
+ clearFilter: (label) => `Clear ${label} filter`,
651
+ resetSearch: "Reset search",
652
+ addFilter: "Add filter",
653
+ noAddableFilter: "No filters to add.",
654
+ selectNone: "Deselect all",
655
+ selectAll: "Select all",
656
+ removeItem: (label) => `Delete ${label}`,
657
+ keywordContains: "Contains",
658
+ keywordExact: "Exact",
659
+ keywordExcludes: "Excludes",
660
+ keywordHintCsv: "Separate multiple keywords with commas (,)",
661
+ keywordHintEnter: "Press Enter to add",
662
+ keywordCondition: "Search condition:",
663
+ noSearchResults: "No search results."
664
+ },
665
+ numberInput: {
666
+ rangeBetween: (min, max) => `Enter a value between ${min} and ${max}.`,
667
+ atLeast: (min) => `Enter ${min} or more.`,
668
+ atMost: (max) => `Enter ${max} or less.`,
669
+ increase: "Increase",
670
+ decrease: "Decrease"
671
+ },
672
+ chipInput: {
673
+ placeholderWithComma: "Add a tag (press Enter or comma)",
674
+ placeholder: "Add a tag (press Enter)",
675
+ duplicateNamed: (label) => `This ${label} has already been entered.`,
676
+ duplicate: "Duplicate values exist.",
677
+ maxCount: (max) => `Up to ${max}`
678
+ },
679
+ slider: { minValue: "Minimum", maxValue: "Maximum" },
680
+ chat: {
681
+ removeAttachment: (name) => `Remove ${name}`,
682
+ placeholder: "Enter a message...",
683
+ attachFile: "Attach file",
684
+ stopResponse: "Stop response",
685
+ send: "Send",
686
+ read: "Read",
687
+ unread: "Unread"
688
+ },
689
+ loadingModal: {
690
+ loadingMessage: "Working...",
691
+ errorMessage: "The task failed. Please try again.",
692
+ errorButton: "Retry",
693
+ ariaTitle: "Loading"
694
+ },
695
+ stepper: { errorTooltip: "Some items need your attention.", ariaLabel: "Progress steps" },
696
+ timeline: { empty: "No history." },
697
+ callout: { dangerTitle: "Caution" },
698
+ guide: { tip: "Tip", notion: "How-to guide" },
699
+ loginCard: { login: "Sign in with unified account" },
700
+ modal: { defaultTitle: "Modal" },
701
+ launcher: { opensInNewTab: "Opens in a new tab" },
702
+ common: {
703
+ close: "Close",
704
+ clear: "Clear",
705
+ confirm: "OK",
706
+ all: "All",
707
+ back: "Back",
708
+ more: "More",
709
+ moreActions: "More actions",
710
+ openMenu: "Open menu",
711
+ dragHandle: "Drag handle",
712
+ resizeDrawer: "Resize drawer width",
713
+ search: "Search",
714
+ count: (n) => String(n)
715
+ },
716
+ input: {
717
+ placeholder: "Please enter a value.",
718
+ searchWithinResults: "Search within results",
719
+ clearInput: "Reset input",
720
+ showPassword: "Show password"
721
+ },
722
+ pagination: {
723
+ firstPage: "First page",
724
+ prevPage: "Previous page",
725
+ nextPage: "Next page",
726
+ lastPage: "Last page",
727
+ prevGroup: "Previous pages",
728
+ nextGroup: "Next pages"
729
+ },
730
+ select: {
731
+ placeholder: "Select",
732
+ allSelected: "All",
733
+ clear: "Clear selection",
734
+ deselect: (label) => `Deselect ${label}`,
735
+ searchPlaceholder: "Search",
736
+ empty: "No items to display.",
737
+ loading: "Loading..."
738
+ },
739
+ table: {
740
+ selectAll: "Select all",
741
+ selectRow: "Select row",
742
+ empty: "No data.",
743
+ rowsPerPage: (count) => `${count} per page`,
744
+ editable: "Editable",
745
+ opensInNewScreen: "Opens in a new screen",
746
+ sortBy: (label) => `Sort by ${label}`,
747
+ denseOff: "Comfortable view",
748
+ denseOn: "Compact view"
749
+ },
750
+ tableBar: {
751
+ totalBefore: "Total ",
752
+ totalAfter: "",
753
+ selectedBefore: "",
754
+ selectedAfter: " selected"
755
+ }
756
+ },
757
+ ja: {
758
+ accountListBox: {
759
+ accountSetting: "\u30A2\u30AB\u30A6\u30F3\u30C8\u8A2D\u5B9A",
760
+ language: "\u8A00\u8A9E\u306E\u5909\u66F4",
761
+ logout: "\u30ED\u30B0\u30A2\u30A6\u30C8"
762
+ },
763
+ gnbSystem: { alert: "\u901A\u77E5", setting: "\u8A2D\u5B9A" },
764
+ editor: {
765
+ placeholder: "\u5185\u5BB9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
766
+ toolbarLabel: "\u66F8\u5F0F\u30C4\u30FC\u30EB",
767
+ tableSize: "\u8868\u306E\u30B5\u30A4\u30BA",
768
+ linkUrl: "\u30EA\u30F3\u30AFURL",
769
+ apply: "\u9069\u7528",
770
+ remove: "\u524A\u9664",
771
+ headingLevel: "\u898B\u51FA\u3057\u30EC\u30D9\u30EB",
772
+ headingBody: "\u672C\u6587",
773
+ fontSize: "\u6587\u5B57\u30B5\u30A4\u30BA",
774
+ fontSizeDefaultLabel: "\u6A19\u6E96",
775
+ bold: "\u592A\u5B57",
776
+ italic: "\u659C\u4F53",
777
+ underline: "\u4E0B\u7DDA",
778
+ strike: "\u53D6\u308A\u6D88\u3057\u7DDA",
779
+ inlineCode: "\u30A4\u30F3\u30E9\u30A4\u30F3\u30B3\u30FC\u30C9",
780
+ textColor: "\u6587\u5B57\u8272",
781
+ clearColor: "\u8272\u3092\u30AF\u30EA\u30A2",
782
+ alignLeft: "\u5DE6\u63C3\u3048",
783
+ alignCenter: "\u4E2D\u592E\u63C3\u3048",
784
+ alignRight: "\u53F3\u63C3\u3048",
785
+ alignJustify: "\u4E21\u7AEF\u63C3\u3048",
786
+ bulletList: "\u7B87\u6761\u66F8\u304D",
787
+ orderedList: "\u756A\u53F7\u4ED8\u304D\u30EA\u30B9\u30C8",
788
+ taskList: "\u30C1\u30A7\u30C3\u30AF\u30EA\u30B9\u30C8",
789
+ list: "\u30EA\u30B9\u30C8",
790
+ blockquote: "\u5F15\u7528",
791
+ codeBlock: "\u30B3\u30FC\u30C9\u30D6\u30ED\u30C3\u30AF",
792
+ divider: "\u533A\u5207\u308A\u7DDA",
793
+ link: "\u30EA\u30F3\u30AF",
794
+ insertImage: "\u753B\u50CF\u3092\u633F\u5165",
795
+ image: "\u753B\u50CF",
796
+ table: "\u8868",
797
+ addRowAbove: "\u4E0A\u306B\u884C\u3092\u8FFD\u52A0",
798
+ addRowBelow: "\u4E0B\u306B\u884C\u3092\u8FFD\u52A0",
799
+ addColLeft: "\u5DE6\u306B\u5217\u3092\u8FFD\u52A0",
800
+ addColRight: "\u53F3\u306B\u5217\u3092\u8FFD\u52A0",
801
+ mergeCells: "\u30BB\u30EB\u3092\u7D50\u5408",
802
+ splitCell: "\u7D50\u5408\u3092\u89E3\u9664",
803
+ toggleHeaderRow: "\u30D8\u30C3\u30C0\u30FC\u884C\u3092\u5207\u308A\u66FF\u3048",
804
+ toggleHeaderCol: "\u30D8\u30C3\u30C0\u30FC\u5217\u3092\u5207\u308A\u66FF\u3048",
805
+ deleteRow: "\u884C\u3092\u524A\u9664",
806
+ deleteCol: "\u5217\u3092\u524A\u9664",
807
+ deleteTable: "\u8868\u3092\u524A\u9664",
808
+ undo: "\u5143\u306B\u623B\u3059",
809
+ redo: "\u3084\u308A\u76F4\u3057",
810
+ colorDefault: "\u6A19\u6E96",
811
+ colorSecondary: "\u88DC\u52A9",
812
+ colorMuted: "\u8584\u3044",
813
+ colorAccent: "\u5F37\u8ABF",
814
+ colorBrand: "\u30D6\u30E9\u30F3\u30C9",
815
+ colorSuccess: "\u6210\u529F",
816
+ colorWarning: "\u6CE8\u610F",
817
+ colorDanger: "\u5371\u967A",
818
+ tableCell: (r3, c) => `${r3}\u884C${c}\u5217`,
819
+ tableSizeText: (rows, cols) => `${rows}\u884C \xD7 ${cols}\u5217`,
820
+ heading: (level) => `\u898B\u51FA\u3057${level}`,
821
+ fontSizeDefault: (px) => `\u6A19\u6E96\uFF08\u672C\u6587 ${px}px\uFF09`,
822
+ closeEditing: (label) => `${label}\u3092\u9589\u3058\u308B`
823
+ },
824
+ form: { invalid: "\u7121\u52B9\u306A\u5024\u3067\u3059\u3002" },
825
+ date: {
826
+ weekdays: ["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"],
827
+ weekdaysLong: ["\u65E5\u66DC\u65E5", "\u6708\u66DC\u65E5", "\u706B\u66DC\u65E5", "\u6C34\u66DC\u65E5", "\u6728\u66DC\u65E5", "\u91D1\u66DC\u65E5", "\u571F\u66DC\u65E5"],
828
+ today: "\u4ECA\u65E5",
829
+ prevYear: "\u524D\u306E\u5E74",
830
+ nextYear: "\u6B21\u306E\u5E74",
831
+ prevMonth: "\u524D\u306E\u6708",
832
+ nextMonth: "\u6B21\u306E\u6708",
833
+ monthLabel: (month) => `${month}\u6708`,
834
+ dayLabel: (day) => `${day}\u65E5`,
835
+ unitYear: "\u5E74",
836
+ unitMonth: "\u6708",
837
+ unitDay: "\u65E5",
838
+ hourItem: (hour) => `${hour}\u6642`,
839
+ minuteItem: (minute) => `${minute}\u5206`,
840
+ hourAria: (prefix) => `${prefix}\u6642`,
841
+ minuteAria: (prefix) => `${prefix}\u5206`,
842
+ meridiemAria: (prefix) => `${prefix}\u5348\u524D/\u5348\u5F8C`,
843
+ am: "\u5348\u524D",
844
+ pm: "\u5348\u5F8C",
845
+ rangeFrom: "\u958B\u59CB",
846
+ rangeTo: "\u7D42\u4E86",
847
+ clearDate: "\u65E5\u4ED8\u3092\u30AF\u30EA\u30A2",
848
+ clearMonth: "\u6708\u3092\u30AF\u30EA\u30A2",
849
+ clearYear: "\u5E74\u3092\u30AF\u30EA\u30A2",
850
+ clearPeriod: "\u671F\u9593\u3092\u30AF\u30EA\u30A2",
851
+ clearTime: "\u6642\u523B\u3092\u30AF\u30EA\u30A2",
852
+ clearTimeRange: "\u6642\u9593\u7BC4\u56F2\u3092\u30AF\u30EA\u30A2",
853
+ start: "\u958B\u59CB",
854
+ end: "\u7D42\u4E86",
855
+ startTime: "\u958B\u59CB\u6642\u523B",
856
+ endTime: "\u7D42\u4E86\u6642\u523B"
857
+ },
858
+ chart: {
859
+ unit: (unit) => `\u5358\u4F4D\uFF1A${unit}`,
860
+ pie: "\u5186\u30B0\u30E9\u30D5",
861
+ donut: "\u30C9\u30FC\u30CA\u30C4\u30B0\u30E9\u30D5",
862
+ radialSummary: (count, kind) => `${count}\u9805\u76EE\u306E${kind}`,
863
+ barSummary: (c, s, stacked) => `${c}\u9805\u76EE\u3001${s}\u7CFB\u5217\u306E${stacked ? "\u7A4D\u307F\u4E0A\u3052" : ""}\u68D2\u30B0\u30E9\u30D5`,
864
+ lineSummary: (c, s, stacked) => `${c}\u9805\u76EE\u3001${s}\u7CFB\u5217\u306E${stacked ? "\u7A4D\u307F\u4E0A\u3052" : ""}\u6298\u308C\u7DDA\u30B0\u30E9\u30D5`
865
+ },
866
+ chipFilter: {
867
+ periodDay: "\u65E5\u5225",
868
+ periodMonth: "\u6708\u5225",
869
+ periodQuarter: "\u56DB\u534A\u671F\u5225",
870
+ periodHalf: "\u534A\u671F\u5225",
871
+ periodYear: "\u5E74\u5225",
872
+ custom: "\u30E6\u30FC\u30B6\u30FC\u6307\u5B9A",
873
+ today: "\u4ECA\u65E5",
874
+ last7: "\u904E\u53BB7\u65E5",
875
+ last30: "\u904E\u53BB30\u65E5",
876
+ maxWord: "\u6700\u5927",
877
+ maxRangeHint: (days) => `\u6700\u5927${days}\u65E5`,
878
+ requireAll: "\u3059\u3079\u3066\u306E\u9805\u76EE\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
879
+ requireAnyDefault: "1\u3064\u4EE5\u4E0A\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
880
+ requireAnyNamed: (name) => `${name}\u30921\u3064\u4EE5\u4E0A\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
881
+ requireField: (label) => `${label}\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
882
+ fieldFallback: "\u9805\u76EE",
883
+ valueListMore: (first, rest) => `${first} \u4ED6${rest}\u4EF6`,
884
+ quarter: (n) => `\u7B2C${n}\u56DB\u534A\u671F`,
885
+ firstHalf: "\u4E0A\u534A\u671F",
886
+ secondHalf: "\u4E0B\u534A\u671F",
887
+ removeFilter: (label) => `${label}\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u524A\u9664`,
888
+ clearFilter: (label) => `${label}\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u30AF\u30EA\u30A2`,
889
+ resetSearch: "\u691C\u7D22\u3092\u30EA\u30BB\u30C3\u30C8",
890
+ addFilter: "\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u8FFD\u52A0",
891
+ noAddableFilter: "\u8FFD\u52A0\u3067\u304D\u308B\u30D5\u30A3\u30EB\u30BF\u30FC\u304C\u3042\u308A\u307E\u305B\u3093\u3002",
892
+ selectNone: "\u9078\u629E\u3092\u89E3\u9664",
893
+ selectAll: "\u3059\u3079\u3066\u9078\u629E",
894
+ removeItem: (label) => `${label}\u3092\u524A\u9664`,
895
+ keywordContains: "\u542B\u3080",
896
+ keywordExact: "\u4E00\u81F4",
897
+ keywordExcludes: "\u542B\u307E\u306A\u3044",
898
+ keywordHintCsv: "\u8907\u6570\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u306F\u30AB\u30F3\u30DE(,)\u3067\u533A\u5207\u308A\u307E\u3059",
899
+ keywordHintEnter: "\u5165\u529B\u5F8C Enter \u3067\u8FFD\u52A0",
900
+ keywordCondition: "\u691C\u7D22\u6761\u4EF6\uFF1A",
901
+ noSearchResults: "\u691C\u7D22\u7D50\u679C\u304C\u3042\u308A\u307E\u305B\u3093\u3002"
902
+ },
903
+ numberInput: {
904
+ rangeBetween: (min, max) => `${min}\u301C${max}\u306E\u7BC4\u56F2\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
905
+ atLeast: (min) => `${min}\u4EE5\u4E0A\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
906
+ atMost: (max) => `${max}\u4EE5\u4E0B\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
907
+ increase: "\u5897\u3084\u3059",
908
+ decrease: "\u6E1B\u3089\u3059"
909
+ },
910
+ chipInput: {
911
+ placeholderWithComma: "\u30BF\u30B0\u3092\u5165\u529B\uFF08Enter\u307E\u305F\u306F\u30AB\u30F3\u30DE\u3067\u767B\u9332\uFF09",
912
+ placeholder: "\u30BF\u30B0\u3092\u5165\u529B\uFF08Enter\u3067\u767B\u9332\uFF09",
913
+ duplicateNamed: (label) => `\u3059\u3067\u306B\u5165\u529B\u3055\u308C\u305F${label}\u3067\u3059\u3002`,
914
+ duplicate: "\u91CD\u8907\u3057\u305F\u5024\u304C\u3042\u308A\u307E\u3059\u3002",
915
+ maxCount: (max) => `\u6700\u5927${max}\u4EF6`
916
+ },
917
+ slider: { minValue: "\u6700\u5C0F\u5024", maxValue: "\u6700\u5927\u5024" },
918
+ chat: {
919
+ removeAttachment: (name) => `${name}\u3092\u524A\u9664`,
920
+ placeholder: "\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044...",
921
+ attachFile: "\u30D5\u30A1\u30A4\u30EB\u3092\u6DFB\u4ED8",
922
+ stopResponse: "\u5FDC\u7B54\u3092\u505C\u6B62",
923
+ send: "\u9001\u4FE1",
924
+ read: "\u65E2\u8AAD",
925
+ unread: "\u672A\u8AAD"
926
+ },
927
+ loadingModal: {
928
+ loadingMessage: "\u51E6\u7406\u4E2D...",
929
+ errorMessage: "\u51E6\u7406\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",
930
+ errorButton: "\u518D\u8A66\u884C",
931
+ ariaTitle: "\u8AAD\u307F\u8FBC\u307F\u4E2D"
932
+ },
933
+ stepper: { errorTooltip: "\u78BA\u8A8D\u304C\u5FC5\u8981\u306A\u9805\u76EE\u304C\u3042\u308A\u307E\u3059\u3002", ariaLabel: "\u9032\u884C\u30B9\u30C6\u30C3\u30D7" },
934
+ timeline: { empty: "\u5C65\u6B74\u304C\u3042\u308A\u307E\u305B\u3093\u3002" },
935
+ callout: { dangerTitle: "\u6CE8\u610F\u4E8B\u9805" },
936
+ guide: { tip: "\u30D2\u30F3\u30C8", notion: "\u4F7F\u3044\u65B9\u30AC\u30A4\u30C9" },
937
+ loginCard: { login: "\u7D71\u5408\u30A2\u30AB\u30A6\u30F3\u30C8\u3067\u30ED\u30B0\u30A4\u30F3" },
938
+ modal: { defaultTitle: "\u30E2\u30FC\u30C0\u30EB" },
939
+ launcher: { opensInNewTab: "\u65B0\u3057\u3044\u30BF\u30D6\u3067\u958B\u304D\u307E\u3059" },
940
+ common: {
941
+ close: "\u9589\u3058\u308B",
942
+ clear: "\u30AF\u30EA\u30A2",
943
+ confirm: "\u78BA\u8A8D",
944
+ all: "\u3059\u3079\u3066",
945
+ back: "\u623B\u308B",
946
+ more: "\u3082\u3063\u3068\u898B\u308B",
947
+ moreActions: "\u305D\u306E\u4ED6\u306E\u6A5F\u80FD",
948
+ openMenu: "\u30E1\u30CB\u30E5\u30FC\u3092\u958B\u304F",
949
+ dragHandle: "\u30C9\u30E9\u30C3\u30B0\u30CF\u30F3\u30C9\u30EB",
950
+ resizeDrawer: "\u30C9\u30ED\u30EF\u30FC\u306E\u5E45\u3092\u8ABF\u6574",
951
+ search: "\u691C\u7D22",
952
+ count: (n) => `${n}\u4EF6`
953
+ },
954
+ input: {
955
+ placeholder: "\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
956
+ searchWithinResults: "\u7D50\u679C\u5185\u3092\u691C\u7D22",
957
+ clearInput: "\u5165\u529B\u3092\u30EA\u30BB\u30C3\u30C8",
958
+ showPassword: "\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u8868\u793A"
959
+ },
960
+ pagination: {
961
+ firstPage: "\u6700\u521D\u306E\u30DA\u30FC\u30B8",
962
+ prevPage: "\u524D\u306E\u30DA\u30FC\u30B8",
963
+ nextPage: "\u6B21\u306E\u30DA\u30FC\u30B8",
964
+ lastPage: "\u6700\u5F8C\u306E\u30DA\u30FC\u30B8",
965
+ prevGroup: "\u524D\u306E\u30B0\u30EB\u30FC\u30D7",
966
+ nextGroup: "\u6B21\u306E\u30B0\u30EB\u30FC\u30D7"
967
+ },
968
+ select: {
969
+ placeholder: "\u9078\u629E",
970
+ allSelected: "\u3059\u3079\u3066",
971
+ clear: "\u9078\u629E\u3092\u30AF\u30EA\u30A2",
972
+ deselect: (label) => `${label} \u306E\u9078\u629E\u3092\u89E3\u9664`,
973
+ searchPlaceholder: "\u691C\u7D22",
974
+ empty: "\u8868\u793A\u3059\u308B\u9805\u76EE\u304C\u3042\u308A\u307E\u305B\u3093\u3002",
975
+ loading: "\u8AAD\u307F\u8FBC\u307F\u4E2D..."
976
+ },
977
+ table: {
978
+ selectAll: "\u3059\u3079\u3066\u9078\u629E",
979
+ selectRow: "\u884C\u3092\u9078\u629E",
980
+ empty: "\u30C7\u30FC\u30BF\u304C\u3042\u308A\u307E\u305B\u3093\u3002",
981
+ rowsPerPage: (count) => `${count}\u4EF6\u305A\u3064\u8868\u793A`,
982
+ editable: "\u7DE8\u96C6\u53EF\u80FD",
983
+ opensInNewScreen: "\u65B0\u3057\u3044\u753B\u9762\u3067\u958B\u304F",
984
+ sortBy: (label) => `${label} \u3067\u4E26\u3079\u66FF\u3048`,
985
+ denseOff: "\u5E83\u304F\u8868\u793A",
986
+ denseOn: "\u72ED\u304F\u8868\u793A"
987
+ },
988
+ tableBar: {
989
+ totalBefore: "\u5408\u8A08 ",
990
+ totalAfter: "\u4EF6",
991
+ selectedBefore: "",
992
+ selectedAfter: "\u4EF6\u9078\u629E"
993
+ }
994
+ },
995
+ zh: {
996
+ accountListBox: { accountSetting: "\u8D26\u53F7\u8BBE\u7F6E", language: "\u66F4\u6539\u8BED\u8A00", logout: "\u9000\u51FA\u767B\u5F55" },
997
+ gnbSystem: { alert: "\u901A\u77E5", setting: "\u8BBE\u7F6E" },
998
+ editor: {
999
+ placeholder: "\u8BF7\u8F93\u5165\u5185\u5BB9\u3002",
1000
+ toolbarLabel: "\u683C\u5F0F\u5DE5\u5177",
1001
+ tableSize: "\u8868\u683C\u5927\u5C0F",
1002
+ linkUrl: "\u94FE\u63A5\u5730\u5740",
1003
+ apply: "\u5E94\u7528",
1004
+ remove: "\u79FB\u9664",
1005
+ headingLevel: "\u6807\u9898\u7EA7\u522B",
1006
+ headingBody: "\u6B63\u6587",
1007
+ fontSize: "\u5B57\u53F7",
1008
+ fontSizeDefaultLabel: "\u9ED8\u8BA4",
1009
+ bold: "\u52A0\u7C97",
1010
+ italic: "\u659C\u4F53",
1011
+ underline: "\u4E0B\u5212\u7EBF",
1012
+ strike: "\u5220\u9664\u7EBF",
1013
+ inlineCode: "\u884C\u5185\u4EE3\u7801",
1014
+ textColor: "\u6587\u5B57\u989C\u8272",
1015
+ clearColor: "\u6E05\u9664\u989C\u8272",
1016
+ alignLeft: "\u5DE6\u5BF9\u9F50",
1017
+ alignCenter: "\u5C45\u4E2D\u5BF9\u9F50",
1018
+ alignRight: "\u53F3\u5BF9\u9F50",
1019
+ alignJustify: "\u4E24\u7AEF\u5BF9\u9F50",
1020
+ bulletList: "\u9879\u76EE\u7B26\u53F7\u5217\u8868",
1021
+ orderedList: "\u7F16\u53F7\u5217\u8868",
1022
+ taskList: "\u5F85\u529E\u5217\u8868",
1023
+ list: "\u5217\u8868",
1024
+ blockquote: "\u5F15\u7528",
1025
+ codeBlock: "\u4EE3\u7801\u5757",
1026
+ divider: "\u5206\u9694\u7EBF",
1027
+ link: "\u94FE\u63A5",
1028
+ insertImage: "\u63D2\u5165\u56FE\u7247",
1029
+ image: "\u56FE\u7247",
1030
+ table: "\u8868\u683C",
1031
+ addRowAbove: "\u5728\u4E0A\u65B9\u63D2\u5165\u884C",
1032
+ addRowBelow: "\u5728\u4E0B\u65B9\u63D2\u5165\u884C",
1033
+ addColLeft: "\u5728\u5DE6\u4FA7\u63D2\u5165\u5217",
1034
+ addColRight: "\u5728\u53F3\u4FA7\u63D2\u5165\u5217",
1035
+ mergeCells: "\u5408\u5E76\u5355\u5143\u683C",
1036
+ splitCell: "\u53D6\u6D88\u5408\u5E76",
1037
+ toggleHeaderRow: "\u5207\u6362\u6807\u9898\u884C",
1038
+ toggleHeaderCol: "\u5207\u6362\u6807\u9898\u5217",
1039
+ deleteRow: "\u5220\u9664\u884C",
1040
+ deleteCol: "\u5220\u9664\u5217",
1041
+ deleteTable: "\u5220\u9664\u8868\u683C",
1042
+ undo: "\u64A4\u9500",
1043
+ redo: "\u91CD\u505A",
1044
+ colorDefault: "\u9ED8\u8BA4",
1045
+ colorSecondary: "\u6B21\u8981",
1046
+ colorMuted: "\u6DE1\u5316",
1047
+ colorAccent: "\u5F3A\u8C03",
1048
+ colorBrand: "\u54C1\u724C",
1049
+ colorSuccess: "\u6210\u529F",
1050
+ colorWarning: "\u8B66\u544A",
1051
+ colorDanger: "\u5371\u9669",
1052
+ tableCell: (r3, c) => `${r3}\u884C${c}\u5217`,
1053
+ tableSizeText: (rows, cols) => `${rows}\u884C \xD7 ${cols}\u5217`,
1054
+ heading: (level) => `\u6807\u9898 ${level}`,
1055
+ fontSizeDefault: (px) => `\u9ED8\u8BA4\uFF08\u6B63\u6587 ${px}px\uFF09`,
1056
+ closeEditing: (label) => `\u5173\u95ED${label}`
1057
+ },
1058
+ form: { invalid: "\u65E0\u6548\u7684\u503C\u3002" },
1059
+ date: {
1060
+ weekdays: ["\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D"],
1061
+ weekdaysLong: ["\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D"],
1062
+ today: "\u4ECA\u5929",
1063
+ prevYear: "\u4E0A\u4E00\u5E74",
1064
+ nextYear: "\u4E0B\u4E00\u5E74",
1065
+ prevMonth: "\u4E0A\u4E2A\u6708",
1066
+ nextMonth: "\u4E0B\u4E2A\u6708",
1067
+ monthLabel: (month) => `${month}\u6708`,
1068
+ dayLabel: (day) => `${day}\u65E5`,
1069
+ unitYear: "\u5E74",
1070
+ unitMonth: "\u6708",
1071
+ unitDay: "\u65E5",
1072
+ hourItem: (hour) => `${hour}\u65F6`,
1073
+ minuteItem: (minute) => `${minute}\u5206`,
1074
+ hourAria: (prefix) => `${prefix}\u5C0F\u65F6`,
1075
+ minuteAria: (prefix) => `${prefix}\u5206\u949F`,
1076
+ meridiemAria: (prefix) => `${prefix}\u4E0A\u5348/\u4E0B\u5348`,
1077
+ am: "\u4E0A\u5348",
1078
+ pm: "\u4E0B\u5348",
1079
+ rangeFrom: "\u5F00\u59CB",
1080
+ rangeTo: "\u7ED3\u675F",
1081
+ clearDate: "\u6E05\u9664\u65E5\u671F",
1082
+ clearMonth: "\u6E05\u9664\u6708\u4EFD",
1083
+ clearYear: "\u6E05\u9664\u5E74\u4EFD",
1084
+ clearPeriod: "\u6E05\u9664\u65F6\u95F4\u6BB5",
1085
+ clearTime: "\u6E05\u9664\u65F6\u95F4",
1086
+ clearTimeRange: "\u6E05\u9664\u65F6\u95F4\u8303\u56F4",
1087
+ start: "\u5F00\u59CB",
1088
+ end: "\u7ED3\u675F",
1089
+ startTime: "\u5F00\u59CB\u65F6\u95F4",
1090
+ endTime: "\u7ED3\u675F\u65F6\u95F4"
1091
+ },
1092
+ chart: {
1093
+ unit: (unit) => `\u5355\u4F4D\uFF1A${unit}`,
1094
+ pie: "\u997C\u56FE",
1095
+ donut: "\u73AF\u5F62\u56FE",
1096
+ radialSummary: (count, kind) => `${kind}\uFF0C\u5171 ${count} \u9879`,
1097
+ barSummary: (c, s, stacked) => `${stacked ? "\u5806\u53E0" : ""}\u67F1\u72B6\u56FE\uFF0C${c} \u9879\uFF0C${s} \u4E2A\u7CFB\u5217`,
1098
+ lineSummary: (c, s, stacked) => `${stacked ? "\u5806\u53E0" : ""}\u6298\u7EBF\u56FE\uFF0C${c} \u9879\uFF0C${s} \u4E2A\u7CFB\u5217`
1099
+ },
1100
+ chipFilter: {
1101
+ periodDay: "\u6309\u65E5",
1102
+ periodMonth: "\u6309\u6708",
1103
+ periodQuarter: "\u6309\u5B63\u5EA6",
1104
+ periodHalf: "\u6309\u534A\u5E74",
1105
+ periodYear: "\u6309\u5E74",
1106
+ custom: "\u81EA\u5B9A\u4E49",
1107
+ today: "\u4ECA\u5929",
1108
+ last7: "\u6700\u8FD17\u5929",
1109
+ last30: "\u6700\u8FD130\u5929",
1110
+ maxWord: "\u6700\u591A",
1111
+ maxRangeHint: (days) => `\u6700\u591A${days}\u5929`,
1112
+ requireAll: "\u8BF7\u9009\u62E9\u6240\u6709\u9879\u76EE\u3002",
1113
+ requireAnyDefault: "\u8BF7\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u7B5B\u9009\u6761\u4EF6\u3002",
1114
+ requireAnyNamed: (name) => `\u8BF7\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A${name}\u3002`,
1115
+ requireField: (label) => `\u8BF7\u9009\u62E9${label}\u3002`,
1116
+ fieldFallback: "\u9879\u76EE",
1117
+ valueListMore: (first, rest) => `${first} \u7B49${rest + 1}\u9879`,
1118
+ quarter: (n) => `\u7B2C${n}\u5B63\u5EA6`,
1119
+ firstHalf: "\u4E0A\u534A\u5E74",
1120
+ secondHalf: "\u4E0B\u534A\u5E74",
1121
+ removeFilter: (label) => `\u79FB\u9664${label}\u7B5B\u9009`,
1122
+ clearFilter: (label) => `\u6E05\u9664${label}\u7B5B\u9009`,
1123
+ resetSearch: "\u91CD\u7F6E\u641C\u7D22",
1124
+ addFilter: "\u6DFB\u52A0\u7B5B\u9009",
1125
+ noAddableFilter: "\u6CA1\u6709\u53EF\u6DFB\u52A0\u7684\u7B5B\u9009\u6761\u4EF6\u3002",
1126
+ selectNone: "\u53D6\u6D88\u5168\u9009",
1127
+ selectAll: "\u5168\u9009",
1128
+ removeItem: (label) => `\u5220\u9664${label}`,
1129
+ keywordContains: "\u5305\u542B",
1130
+ keywordExact: "\u5B8C\u5168\u5339\u914D",
1131
+ keywordExcludes: "\u4E0D\u5305\u542B",
1132
+ keywordHintCsv: "\u591A\u4E2A\u5173\u952E\u8BCD\u7528\u9017\u53F7(,)\u5206\u9694",
1133
+ keywordHintEnter: "\u8F93\u5165\u540E\u6309 Enter \u6DFB\u52A0",
1134
+ keywordCondition: "\u641C\u7D22\u6761\u4EF6\uFF1A",
1135
+ noSearchResults: "\u6CA1\u6709\u641C\u7D22\u7ED3\u679C\u3002"
1136
+ },
1137
+ numberInput: {
1138
+ rangeBetween: (min, max) => `\u8BF7\u8F93\u5165 ${min}~${max} \u4E4B\u95F4\u7684\u503C\u3002`,
1139
+ atLeast: (min) => `\u8BF7\u8F93\u5165\u4E0D\u5C0F\u4E8E ${min} \u7684\u503C\u3002`,
1140
+ atMost: (max) => `\u8BF7\u8F93\u5165\u4E0D\u5927\u4E8E ${max} \u7684\u503C\u3002`,
1141
+ increase: "\u589E\u52A0",
1142
+ decrease: "\u51CF\u5C11"
1143
+ },
1144
+ chipInput: {
1145
+ placeholderWithComma: "\u8F93\u5165\u6807\u7B7E\uFF08\u6309 Enter \u6216\u9017\u53F7\u6DFB\u52A0\uFF09",
1146
+ placeholder: "\u8F93\u5165\u6807\u7B7E\uFF08\u6309 Enter \u6DFB\u52A0\uFF09",
1147
+ duplicateNamed: (label) => `${label}\u5DF2\u5B58\u5728\u3002`,
1148
+ duplicate: "\u5B58\u5728\u91CD\u590D\u7684\u503C\u3002",
1149
+ maxCount: (max) => `\u6700\u591A ${max} \u4E2A`
1150
+ },
1151
+ slider: { minValue: "\u6700\u5C0F\u503C", maxValue: "\u6700\u5927\u503C" },
1152
+ chat: {
1153
+ removeAttachment: (name) => `\u79FB\u9664${name}`,
1154
+ placeholder: "\u8BF7\u8F93\u5165\u6D88\u606F...",
1155
+ attachFile: "\u9644\u52A0\u6587\u4EF6",
1156
+ stopResponse: "\u505C\u6B62\u56DE\u590D",
1157
+ send: "\u53D1\u9001",
1158
+ read: "\u5DF2\u8BFB",
1159
+ unread: "\u672A\u8BFB"
1160
+ },
1161
+ loadingModal: {
1162
+ loadingMessage: "\u5904\u7406\u4E2D...",
1163
+ errorMessage: "\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u3002",
1164
+ errorButton: "\u91CD\u8BD5",
1165
+ ariaTitle: "\u52A0\u8F7D\u4E2D"
1166
+ },
1167
+ stepper: { errorTooltip: "\u6709\u9700\u8981\u786E\u8BA4\u7684\u9879\u76EE\u3002", ariaLabel: "\u8FDB\u5EA6\u6B65\u9AA4" },
1168
+ timeline: { empty: "\u6CA1\u6709\u8BB0\u5F55\u3002" },
1169
+ callout: { dangerTitle: "\u6CE8\u610F\u4E8B\u9879" },
1170
+ guide: { tip: "\u4F7F\u7528\u63D0\u793A", notion: "\u4F7F\u7528\u6307\u5357" },
1171
+ loginCard: { login: "\u4F7F\u7528\u7EDF\u4E00\u8D26\u53F7\u767B\u5F55" },
1172
+ modal: { defaultTitle: "\u6A21\u6001\u6846" },
1173
+ launcher: { opensInNewTab: "\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00" },
1174
+ common: {
1175
+ close: "\u5173\u95ED",
1176
+ clear: "\u6E05\u9664",
1177
+ confirm: "\u786E\u5B9A",
1178
+ all: "\u5168\u90E8",
1179
+ back: "\u8FD4\u56DE",
1180
+ more: "\u66F4\u591A",
1181
+ moreActions: "\u66F4\u591A\u529F\u80FD",
1182
+ openMenu: "\u6253\u5F00\u83DC\u5355",
1183
+ dragHandle: "\u62D6\u52A8\u624B\u67C4",
1184
+ resizeDrawer: "\u8C03\u6574\u62BD\u5C49\u5BBD\u5EA6",
1185
+ search: "\u641C\u7D22",
1186
+ count: (n) => `${n}\u4E2A`
1187
+ },
1188
+ input: {
1189
+ placeholder: "\u8BF7\u8F93\u5165\u3002",
1190
+ searchWithinResults: "\u5728\u7ED3\u679C\u4E2D\u641C\u7D22",
1191
+ clearInput: "\u91CD\u7F6E\u8F93\u5165",
1192
+ showPassword: "\u663E\u793A\u5BC6\u7801"
1193
+ },
1194
+ pagination: {
1195
+ firstPage: "\u7B2C\u4E00\u9875",
1196
+ prevPage: "\u4E0A\u4E00\u9875",
1197
+ nextPage: "\u4E0B\u4E00\u9875",
1198
+ lastPage: "\u6700\u540E\u4E00\u9875",
1199
+ prevGroup: "\u4E0A\u4E00\u7EC4",
1200
+ nextGroup: "\u4E0B\u4E00\u7EC4"
1201
+ },
1202
+ select: {
1203
+ placeholder: "\u8BF7\u9009\u62E9",
1204
+ allSelected: "\u5168\u90E8",
1205
+ clear: "\u6E05\u9664\u9009\u62E9",
1206
+ deselect: (label) => `\u53D6\u6D88\u9009\u62E9 ${label}`,
1207
+ searchPlaceholder: "\u641C\u7D22",
1208
+ empty: "\u6CA1\u6709\u53EF\u663E\u793A\u7684\u9879\u76EE\u3002",
1209
+ loading: "\u52A0\u8F7D\u4E2D..."
1210
+ },
1211
+ table: {
1212
+ selectAll: "\u5168\u9009",
1213
+ selectRow: "\u9009\u62E9\u884C",
1214
+ empty: "\u6CA1\u6709\u6570\u636E\u3002",
1215
+ rowsPerPage: (count) => `\u6BCF\u9875 ${count} \u6761`,
1216
+ editable: "\u53EF\u7F16\u8F91",
1217
+ opensInNewScreen: "\u5728\u65B0\u9875\u9762\u4E2D\u6253\u5F00",
1218
+ sortBy: (label) => `\u6309${label}\u6392\u5E8F`,
1219
+ denseOff: "\u5BBD\u677E\u663E\u793A",
1220
+ denseOn: "\u7D27\u51D1\u663E\u793A"
1221
+ },
1222
+ tableBar: {
1223
+ totalBefore: "\u5171 ",
1224
+ totalAfter: " \u6761",
1225
+ selectedBefore: "\u5DF2\u9009 ",
1226
+ selectedAfter: " \u6761"
1227
+ }
1228
+ }
1229
+ };
1230
+ function normalizeLocale(locale) {
1231
+ if (!locale) return DEFAULT_LOCALE;
1232
+ const lang = locale.toLowerCase().split(/[-_]/)[0];
1233
+ return SLOCALES.includes(lang) ? lang : DEFAULT_LOCALE;
1234
+ }
1235
+ function mergeDefined(base, override) {
1236
+ const next = { ...base };
1237
+ if (!override) return next;
1238
+ for (const key of Object.keys(override)) {
1239
+ if (override[key] !== void 0) next[key] = override[key];
1240
+ }
1241
+ return next;
1242
+ }
1243
+ function mergeDateDefined(base, override) {
1244
+ const merged = mergeDefined(base, override);
1245
+ if (merged.weekdays.length !== 7) merged.weekdays = base.weekdays;
1246
+ if (merged.weekdaysLong.length !== 7) merged.weekdaysLong = base.weekdaysLong;
1247
+ return merged;
1248
+ }
1249
+ function resolveMessages(locale, override) {
1250
+ const base = BUNDLES[normalizeLocale(locale)];
1251
+ return {
1252
+ common: mergeDefined(base.common, override?.common),
1253
+ input: mergeDefined(base.input, override?.input),
1254
+ chart: mergeDefined(base.chart, override?.chart),
1255
+ date: mergeDateDefined(base.date, override?.date),
1256
+ form: mergeDefined(base.form, override?.form),
1257
+ accountListBox: mergeDefined(base.accountListBox, override?.accountListBox),
1258
+ gnbSystem: mergeDefined(base.gnbSystem, override?.gnbSystem),
1259
+ editor: mergeDefined(base.editor, override?.editor),
1260
+ chipFilter: mergeDefined(base.chipFilter, override?.chipFilter),
1261
+ numberInput: mergeDefined(base.numberInput, override?.numberInput),
1262
+ chipInput: mergeDefined(base.chipInput, override?.chipInput),
1263
+ slider: mergeDefined(base.slider, override?.slider),
1264
+ chat: mergeDefined(base.chat, override?.chat),
1265
+ loadingModal: mergeDefined(base.loadingModal, override?.loadingModal),
1266
+ stepper: mergeDefined(base.stepper, override?.stepper),
1267
+ timeline: mergeDefined(base.timeline, override?.timeline),
1268
+ callout: mergeDefined(base.callout, override?.callout),
1269
+ guide: mergeDefined(base.guide, override?.guide),
1270
+ loginCard: mergeDefined(base.loginCard, override?.loginCard),
1271
+ modal: mergeDefined(base.modal, override?.modal),
1272
+ launcher: mergeDefined(base.launcher, override?.launcher),
1273
+ pagination: mergeDefined(base.pagination, override?.pagination),
1274
+ select: mergeDefined(base.select, override?.select),
1275
+ table: mergeDefined(base.table, override?.table),
1276
+ tableBar: mergeDefined(base.tableBar, override?.tableBar)
1277
+ };
1278
+ }
1279
+ function createValue(locale, override) {
1280
+ const normalized = normalizeLocale(locale);
1281
+ const numberFormat = new Intl.NumberFormat(normalized);
1282
+ return {
1283
+ locale: normalized,
1284
+ messages: resolveMessages(normalized, override),
1285
+ formatNumber: (value) => numberFormat.format(value)
1286
+ };
1287
+ }
1288
+ var DEFAULT_VALUE = createValue(void 0);
1289
+ var LocaleContext = /* @__PURE__ */ react.createContext(DEFAULT_VALUE);
1290
+ function SLocaleProvider({ locale, messages, children }) {
1291
+ const value = react.useMemo(() => createValue(locale, messages), [locale, messages]);
1292
+ return /* @__PURE__ */ jsxRuntime.jsx(LocaleContext.Provider, { value, children });
1293
+ }
1294
+ function useLocale() {
1295
+ return react.useContext(LocaleContext);
1296
+ }
1297
+ var strokeProps = (strokeWidth) => ({
1298
+ stroke: "currentColor",
1299
+ strokeWidth: strokeWidth ?? 1.5,
1300
+ vectorEffect: strokeWidth ? "non-scaling-stroke" : void 0
1301
+ });
275
1302
  var Icon_account = (p) => {
276
1303
  const { size = 24, ...rest } = p;
277
1304
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1739,6 +2766,41 @@ var Icon_date = (p) => {
1739
2766
  }
1740
2767
  );
1741
2768
  };
2769
+ var Icon_dollar = (p) => {
2770
+ const { size = 24, ...rest } = p;
2771
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2772
+ "svg",
2773
+ {
2774
+ width: size,
2775
+ height: size,
2776
+ viewBox: "0 0 24 24",
2777
+ fill: "none",
2778
+ xmlns: "http://www.w3.org/2000/svg",
2779
+ ...rest,
2780
+ children: [
2781
+ /* @__PURE__ */ jsxRuntime.jsx(
2782
+ "path",
2783
+ {
2784
+ d: "M12 5V7.1M12 7.1V12M12 7.1H15.3333M12 7.1H10.3333C9.04467 7.1 8 8.1969 8 9.55C8 10.9031 9.04467 12 10.3333 12H12M12 12V16.9M12 12H13.6667C14.9553 12 16 13.0969 16 14.45C16 15.8031 14.9553 16.9 13.6667 16.9H12M12 16.9V19M12 16.9H8.66667",
2785
+ stroke: "currentColor",
2786
+ strokeWidth: "1.5",
2787
+ strokeLinecap: "round",
2788
+ strokeLinejoin: "round"
2789
+ }
2790
+ ),
2791
+ /* @__PURE__ */ jsxRuntime.jsx(
2792
+ "path",
2793
+ {
2794
+ d: "M22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22C17.5228 22 22 17.5228 22 12Z",
2795
+ stroke: "currentColor",
2796
+ strokeWidth: "1.5",
2797
+ strokeLinecap: "round"
2798
+ }
2799
+ )
2800
+ ]
2801
+ }
2802
+ );
2803
+ };
1742
2804
  var Icon_dot = (p) => {
1743
2805
  const { size = 24, ...rest } = p;
1744
2806
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -1955,6 +3017,54 @@ var Icon_focus = (p) => {
1955
3017
  }
1956
3018
  );
1957
3019
  };
3020
+ var Icon_fullscreen = (p) => {
3021
+ const { size = 24, ...rest } = p;
3022
+ return /* @__PURE__ */ jsxRuntime.jsx(
3023
+ "svg",
3024
+ {
3025
+ width: size,
3026
+ height: size,
3027
+ viewBox: "0 0 24 24",
3028
+ fill: "none",
3029
+ xmlns: "http://www.w3.org/2000/svg",
3030
+ ...rest,
3031
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3032
+ "path",
3033
+ {
3034
+ d: "M9 3H4C3.44772 3 3 3.44772 3 4V9M15 3H20C20.5523 3 21 3.44772 21 4V9M21 15V20C21 20.5523 20.5523 21 20 21H15M9 21H4C3.44772 21 3 20.5523 3 20V15",
3035
+ stroke: "currentColor",
3036
+ strokeWidth: "1.5",
3037
+ strokeLinecap: "round",
3038
+ strokeLinejoin: "round"
3039
+ }
3040
+ )
3041
+ }
3042
+ );
3043
+ };
3044
+ var Icon_fullscreenExit = (p) => {
3045
+ const { size = 24, ...rest } = p;
3046
+ return /* @__PURE__ */ jsxRuntime.jsx(
3047
+ "svg",
3048
+ {
3049
+ width: size,
3050
+ height: size,
3051
+ viewBox: "0 0 24 24",
3052
+ fill: "none",
3053
+ xmlns: "http://www.w3.org/2000/svg",
3054
+ ...rest,
3055
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3056
+ "path",
3057
+ {
3058
+ d: "M3 9H8C8.55228 9 9 8.55228 9 8V3M15 3V8C15 8.55228 15.4477 9 16 9H21M21 15H16C15.4477 15 15 15.4477 15 16V21M9 21V16C9 15.4477 8.55228 15 8 15H3",
3059
+ stroke: "currentColor",
3060
+ strokeWidth: "1.5",
3061
+ strokeLinecap: "round",
3062
+ strokeLinejoin: "round"
3063
+ }
3064
+ )
3065
+ }
3066
+ );
3067
+ };
1958
3068
  var Icon_global = (p) => {
1959
3069
  const { size = 24, ...rest } = p;
1960
3070
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -1998,7 +3108,8 @@ var Icon_helpFill = (p) => {
1998
3108
  );
1999
3109
  };
2000
3110
  var Icon_helpOutline = (p) => {
2001
- const { size = 24, ...rest } = p;
3111
+ const { size = 24, strokeWidth, ...rest } = p;
3112
+ const stroke = strokeProps(strokeWidth);
2002
3113
  return /* @__PURE__ */ jsxRuntime.jsxs(
2003
3114
  "svg",
2004
3115
  {
@@ -2012,23 +3123,24 @@ var Icon_helpOutline = (p) => {
2012
3123
  /* @__PURE__ */ jsxRuntime.jsx(
2013
3124
  "path",
2014
3125
  {
2015
- d: "M12 15.75C12.5522 15.7501 13 16.1978 13 16.75C12.9999 17.3021 12.5521 17.7499 12 17.75C11.4478 17.75 11.0001 17.3022 11 16.75C11 16.1977 11.4477 15.75 12 15.75Z",
2016
- fill: "currentColor"
3126
+ d: "M22.1998 11.9998C22.1998 6.3665 17.6331 1.7998 11.9998 1.7998C6.3665 1.7998 1.7998 6.3665 1.7998 11.9998C1.7998 17.6331 6.3665 22.1998 11.9998 22.1998C17.6331 22.1998 22.1998 17.6331 22.1998 11.9998Z",
3127
+ strokeLinecap: "round",
3128
+ ...stroke
2017
3129
  }
2018
3130
  ),
2019
3131
  /* @__PURE__ */ jsxRuntime.jsx(
2020
3132
  "path",
2021
3133
  {
2022
- d: "M12 5.625C13.4155 5.62505 14.3879 6.17365 14.9883 6.93164C15.5622 7.65643 15.75 8.51261 15.75 9.10254C15.7498 10.0616 15.2169 11.8923 13.1826 12.4336C13.039 12.4719 12.9188 12.5466 12.8428 12.6279C12.7715 12.7043 12.7501 12.7716 12.75 12.8291V13.875C12.7499 14.2891 12.4141 14.6249 12 14.625C11.5859 14.625 11.2501 14.2891 11.25 13.875V12.8291C11.2502 11.8236 12.0595 11.1807 12.7969 10.9844C13.9244 10.6843 14.2498 9.68018 14.25 9.10254C14.25 8.78353 14.1382 8.27475 13.8125 7.86328C13.5129 7.48502 12.9842 7.12504 12 7.125C11.0157 7.125 10.4871 7.485 10.1875 7.86328C9.86168 8.27478 9.75 8.78348 9.75 9.10254C9.74975 9.51648 9.41397 9.85244 9 9.85254C8.58594 9.85254 8.25025 9.51654 8.25 9.10254C8.25 8.51256 8.43767 7.65647 9.01172 6.93164C9.61212 6.17361 10.5844 5.625 12 5.625Z",
2023
- fill: "currentColor"
3134
+ d: "M8.99982 9.10203C8.99982 8.19294 9.59982 6.37476 11.9998 6.37476C14.3998 6.37476 14.9998 8.19294 14.9998 9.10203C14.9998 9.87031 14.5713 11.2879 12.9899 11.7086C12.4562 11.8506 11.9998 12.277 11.9998 12.8293V13.8748",
3135
+ strokeLinecap: "round",
3136
+ strokeLinejoin: "round",
3137
+ ...stroke
2024
3138
  }
2025
3139
  ),
2026
3140
  /* @__PURE__ */ jsxRuntime.jsx(
2027
3141
  "path",
2028
3142
  {
2029
- fillRule: "evenodd",
2030
- clipRule: "evenodd",
2031
- d: "M12 1.0498C18.0474 1.04991 22.9502 5.95255 22.9502 12C22.9501 18.0474 18.0474 22.9501 12 22.9502C5.95255 22.9502 1.04991 18.0474 1.0498 12C1.0498 5.95248 5.95248 1.0498 12 1.0498ZM12 2.5498C6.78091 2.5498 2.5498 6.78091 2.5498 12C2.54991 17.219 6.78097 21.4502 12 21.4502C17.2189 21.4501 21.4501 17.2189 21.4502 12C21.4502 6.78097 17.219 2.54991 12 2.5498Z",
3143
+ d: "M11.9998 15.7498C12.5521 15.7498 12.9998 16.1975 12.9998 16.7498C12.9998 17.302 12.5521 17.7498 11.9998 17.7498C11.4475 17.7498 10.9998 17.302 10.9998 16.7498C10.9998 16.1975 11.4475 15.7498 11.9998 15.7498Z",
2032
3144
  fill: "currentColor"
2033
3145
  }
2034
3146
  )
@@ -2557,7 +3669,8 @@ var Icon_notificationFill = (p) => {
2557
3669
  );
2558
3670
  };
2559
3671
  var Icon_notificationOutline = (p) => {
2560
- const { size = 24, ...rest } = p;
3672
+ const { size = 24, strokeWidth, ...rest } = p;
3673
+ const stroke = strokeProps(strokeWidth);
2561
3674
  return /* @__PURE__ */ jsxRuntime.jsxs(
2562
3675
  "svg",
2563
3676
  {
@@ -2571,23 +3684,16 @@ var Icon_notificationOutline = (p) => {
2571
3684
  /* @__PURE__ */ jsxRuntime.jsx(
2572
3685
  "path",
2573
3686
  {
2574
- d: "M12 15.5C12.5523 15.5 13 15.9477 13 16.5C13 17.0523 12.5523 17.5 12 17.5C11.4477 17.5 11 17.0523 11 16.5C11 15.9477 11.4477 15.5 12 15.5Z",
2575
- fill: "currentColor"
2576
- }
2577
- ),
2578
- /* @__PURE__ */ jsxRuntime.jsx(
2579
- "path",
2580
- {
2581
- d: "M12 6.375C12.4142 6.375 12.75 6.71079 12.75 7.125V13.125C12.75 13.5392 12.4142 13.875 12 13.875C11.5858 13.875 11.25 13.5392 11.25 13.125V7.125C11.25 6.71079 11.5858 6.375 12 6.375Z",
2582
- fill: "currentColor"
3687
+ d: "M22.2 12C22.2 6.36674 17.6333 1.80005 12 1.80005C6.36668 1.80005 1.79999 6.36674 1.79999 12C1.79999 17.6334 6.36668 22.2 12 22.2C17.6333 22.2 22.2 17.6334 22.2 12Z",
3688
+ strokeLinecap: "round",
3689
+ ...stroke
2583
3690
  }
2584
3691
  ),
3692
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 13.125L12 7.125", strokeLinecap: "round", strokeLinejoin: "round", ...stroke }),
2585
3693
  /* @__PURE__ */ jsxRuntime.jsx(
2586
3694
  "path",
2587
3695
  {
2588
- fillRule: "evenodd",
2589
- clipRule: "evenodd",
2590
- d: "M12 1.0498C18.0474 1.04991 22.9501 5.95264 22.9502 12C22.9501 18.0474 18.0474 22.9501 12 22.9502C5.95263 22.9501 1.04991 18.0474 1.0498 12C1.04991 5.95263 5.95263 1.0499 12 1.0498ZM12 2.5498C6.78106 2.5499 2.54991 6.78106 2.5498 12C2.54991 17.2189 6.78106 21.4501 12 21.4502C17.2189 21.4501 21.4501 17.2189 21.4502 12C21.4501 6.78107 17.2189 2.54991 12 2.5498Z",
3696
+ d: "M12 15.5C12.5523 15.5 13 15.9477 13 16.5C13 17.0523 12.5523 17.5 12 17.5C11.4477 17.5 11 17.0523 11 16.5C11 15.9477 11.4477 15.5 12 15.5Z",
2591
3697
  fill: "currentColor"
2592
3698
  }
2593
3699
  )
@@ -3050,7 +4156,8 @@ var Icon_setting = (p) => {
3050
4156
  );
3051
4157
  };
3052
4158
  var Icon_settingOutline = (p) => {
3053
- const { size = 24, ...rest } = p;
4159
+ const { size = 24, strokeWidth, ...rest } = p;
4160
+ const stroke = strokeProps(strokeWidth);
3054
4161
  return /* @__PURE__ */ jsxRuntime.jsxs(
3055
4162
  "svg",
3056
4163
  {
@@ -3061,22 +4168,12 @@ var Icon_settingOutline = (p) => {
3061
4168
  xmlns: "http://www.w3.org/2000/svg",
3062
4169
  ...rest,
3063
4170
  children: [
4171
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "3", ...stroke }),
3064
4172
  /* @__PURE__ */ jsxRuntime.jsx(
3065
4173
  "path",
3066
4174
  {
3067
- fillRule: "evenodd",
3068
- clipRule: "evenodd",
3069
- d: "M11.9996 8C14.2087 8 15.9996 9.79086 15.9996 12C15.9996 14.2091 14.2087 16 11.9996 16C9.79065 15.9998 7.9996 14.209 7.9996 12C7.9996 9.791 9.79065 8.00022 11.9996 8ZM11.9996 9.5C10.6191 9.50022 9.4996 10.6194 9.4996 12C9.4996 13.3806 10.6191 14.4998 11.9996 14.5C13.3803 14.5 14.4996 13.3807 14.4996 12C14.4996 10.6193 13.3803 9.5 11.9996 9.5Z",
3070
- fill: "currentColor"
3071
- }
3072
- ),
3073
- /* @__PURE__ */ jsxRuntime.jsx(
3074
- "path",
3075
- {
3076
- fillRule: "evenodd",
3077
- clipRule: "evenodd",
3078
- d: "M13.1851 1C13.5085 1 13.7979 1.20161 13.9068 1.50293L14.6832 3.65527C14.9613 3.72452 15.2006 3.79367 15.4029 3.86621C15.5134 3.90579 15.64 3.95628 15.7828 4.0166L16.2613 4.22949L18.0689 3.27246C18.2163 3.19438 18.3856 3.16661 18.5504 3.19238C18.7153 3.21835 18.8676 3.29735 18.984 3.41699L20.5748 5.06152C20.7859 5.28042 20.8459 5.60054 20.7271 5.87988L19.8785 7.86719C20.0192 8.12546 20.1316 8.34655 20.2174 8.53125C20.3097 8.73243 20.4239 9.01001 20.5601 9.36719L22.5377 10.2148L22.6432 10.2695C22.8771 10.4155 23.016 10.6779 22.9986 10.9561L22.8531 13.2383L22.8375 13.3486C22.8141 13.4565 22.7672 13.5589 22.6998 13.6475L22.6266 13.7305C22.5476 13.8076 22.4523 13.8674 22.3473 13.9043L20.4752 14.5693C20.4213 14.8278 20.3647 15.0493 20.3053 15.2363L20.1519 15.666C20.0973 15.8078 20.0394 15.9488 19.9781 16.0879L20.9185 18.166L20.9586 18.2793C20.9899 18.3941 20.9942 18.5153 20.9693 18.6328L20.9351 18.7471C20.8923 18.8584 20.823 18.959 20.733 19.0391L18.9449 20.6357L18.8512 20.707C18.753 20.7705 18.6411 20.812 18.524 20.8262L18.4059 20.8311C18.2889 20.8272 18.1732 20.7964 18.0689 20.7412L16.2262 19.7647C15.9378 19.9173 15.6394 20.0519 15.3346 20.168L14.5299 20.4697L13.815 22.4502L13.7672 22.5547C13.7121 22.6552 13.6346 22.7424 13.5406 22.8096L13.442 22.8701C13.3398 22.9219 13.2264 22.9498 13.1109 22.9522L11.0211 23C10.9023 23.0031 10.7841 22.9783 10.6773 22.9287L10.5748 22.8711C10.4431 22.7831 10.3415 22.6557 10.2848 22.5078L9.44198 20.2783C9.1547 20.1801 8.86973 20.0733 8.58847 19.959C8.35848 19.8594 8.13142 19.7518 7.90878 19.6367L5.81894 20.5303L5.71347 20.5664C5.64162 20.5854 5.56705 20.594 5.49276 20.5918L5.38241 20.5801C5.27208 20.5606 5.1671 20.5175 5.07577 20.4541L4.98886 20.3838L3.44198 18.9326C3.35574 18.8519 3.28988 18.7525 3.2496 18.6426L3.21737 18.5303C3.18685 18.376 3.20586 18.2154 3.27109 18.0723L4.1705 16.1143C4.05101 15.8824 3.93933 15.6454 3.83749 15.4053C3.71871 15.1116 3.60934 14.814 3.50839 14.5137L1.53866 13.9141C1.41879 13.8777 1.31002 13.8122 1.22226 13.7246L1.14218 13.6299C1.04481 13.4941 0.994151 13.3291 0.999601 13.1621L1.07675 11.0498C1.08222 10.9121 1.1259 10.7782 1.20175 10.6631C1.25874 10.5767 1.33262 10.5026 1.41855 10.4463L1.50839 10.3965L3.57382 9.4043C3.6695 9.05348 3.75306 8.78014 3.82675 8.58106C3.9305 8.31518 4.0461 8.05376 4.17245 7.79785L3.27694 5.90625C3.20906 5.76263 3.18873 5.6004 3.21835 5.44434C3.24057 5.3276 3.2899 5.21813 3.36191 5.125L3.44198 5.03711L4.98593 3.57813C5.09409 3.47611 5.23034 3.40784 5.37655 3.38086C5.52273 3.354 5.67376 3.37002 5.81112 3.42676L7.89901 4.28906C8.12988 4.13515 8.33881 4.01023 8.52792 3.91016C8.75326 3.79034 9.05504 3.66547 9.43417 3.53027L10.1607 1.50488C10.2143 1.35699 10.3122 1.22899 10.441 1.13867C10.57 1.04839 10.7249 0.999723 10.8824 1H13.1851ZM10.8463 4.03613C10.6946 4.45908 10.3613 4.79149 9.93808 4.94238C9.5875 5.06739 9.36381 5.16528 9.23202 5.23535L9.23007 5.23633C9.09075 5.31005 8.9247 5.40801 8.73105 5.53711C8.31531 5.81413 7.78855 5.86633 7.32675 5.67578L5.67343 4.99219L4.86484 5.75586L5.52792 7.15625C5.72387 7.57031 5.71997 8.05117 5.51718 8.46192C5.41394 8.67102 5.31944 8.88459 5.23398 9.10156L5.14218 9.37598C5.10686 9.491 5.06681 9.63118 5.02109 9.79883C4.90655 10.2184 4.6153 10.5675 4.22323 10.7559L2.55917 11.5547L2.51913 12.6436L3.94491 13.0781L4.11386 13.1416C4.49659 13.3106 4.79411 13.6335 4.92929 14.0352C5.01804 14.2992 5.11534 14.5609 5.21933 14.8193L5.35507 15.126C5.40249 15.2271 5.45233 15.3275 5.50351 15.4268C5.71457 15.8364 5.72588 16.3204 5.53378 16.7393L4.85898 18.2061L5.66659 18.9639L7.31894 18.2578L7.47616 18.2012C7.84698 18.0894 8.24932 18.125 8.59726 18.3047C8.78187 18.4001 8.97024 18.4892 9.16073 18.5723C9.28594 18.6231 9.41211 18.6724 9.53866 18.7197L9.92733 18.8594L10.0816 18.9219C10.4317 19.0869 10.7069 19.382 10.8453 19.748L11.5025 21.4883L12.5748 21.4639L13.1187 19.96L13.1832 19.8096C13.3508 19.4678 13.6433 19.2005 14.0035 19.0654L14.8004 18.7666L15.1676 18.6143C15.288 18.5597 15.4071 18.5013 15.524 18.4395L15.692 18.3623C16.0928 18.2097 16.5441 18.236 16.9283 18.4395L18.3238 19.1787L19.3248 18.2842L18.6109 16.7061C18.4355 16.318 18.4336 15.8732 18.6051 15.4834C18.7075 15.2508 18.7973 15.0126 18.8775 14.7715C18.9163 14.6479 18.9608 14.4825 19.0064 14.2637L19.0582 14.0762C19.2064 13.6503 19.5409 13.3098 19.9723 13.1563L21.3873 12.6523L21.4674 11.3877L19.9703 10.7461C19.5971 10.5861 19.3035 10.2817 19.1588 9.90234C19.0283 9.56034 18.9273 9.31663 18.8541 9.15723C18.7854 9.00988 18.689 8.81973 18.5611 8.58496C18.3418 8.18212 18.3187 7.70024 18.4986 7.27832L19.1519 5.74707L18.2867 4.85352L16.9625 5.55567C16.5475 5.77509 16.0531 5.78799 15.6275 5.58984C15.2974 5.43614 15.0582 5.33606 14.8971 5.27832C14.7581 5.22851 14.5701 5.17338 14.3209 5.11133C13.8356 4.99032 13.4418 4.63455 13.2721 4.16406L12.6715 2.5H11.3971L10.8463 4.03613Z",
3079
- fill: "currentColor"
4175
+ d: "M13.078 2C13.372 2 13.635 2.183 13.734 2.457L14.4399 4.41397C14.6929 4.47697 14.9099 4.53997 15.0939 4.60597C15.2949 4.67797 15.5539 4.78697 15.8739 4.93597L17.5178 4.06598C17.652 3.99488 17.8056 3.96922 17.9556 3.99284C18.1057 4.01646 18.244 4.08809 18.3498 4.19698L19.7958 5.69196C19.9877 5.89095 20.0417 6.18195 19.9337 6.43595L19.1628 8.24293C19.2908 8.47792 19.3928 8.67892 19.4708 8.84692C19.5548 9.02992 19.6588 9.28191 19.7828 9.60691L21.5797 10.3769C21.8497 10.4919 22.0167 10.7619 21.9987 11.0509L21.8667 13.1259C21.8577 13.2607 21.8093 13.3899 21.7275 13.4974C21.6457 13.605 21.5342 13.6861 21.4067 13.7309L19.7048 14.3359C19.6558 14.5708 19.6048 14.7718 19.5508 14.9418C19.4637 15.2044 19.3642 15.4627 19.2528 15.7158L20.1077 17.6058C20.1681 17.7386 20.1843 17.8872 20.1541 18.0299C20.1239 18.1726 20.0488 18.3019 19.9397 18.3988L18.3138 19.8508C18.2067 19.946 18.0731 20.0062 17.9308 20.0234C17.7886 20.0405 17.6445 20.0138 17.5178 19.9468L15.8419 19.0588C15.5797 19.1976 15.3092 19.3202 15.0319 19.4258L14.2999 19.6998L13.65 21.4998C13.6018 21.6316 13.5149 21.7458 13.4007 21.8273C13.2865 21.9089 13.1503 21.954 13.01 21.9568L11.1101 21.9998C10.966 22.0035 10.8244 21.9626 10.7046 21.8825C10.5848 21.8025 10.4927 21.6873 10.4411 21.5528L9.6751 19.5258C9.41376 19.4365 9.155 19.3398 8.89913 19.2358C8.68985 19.1452 8.48374 19.0475 8.28115 18.9428L6.38122 19.7548C6.25603 19.8082 6.11801 19.8241 5.98397 19.8004C5.84993 19.7768 5.72564 19.7148 5.62624 19.6218L4.22029 18.3028C4.11562 18.205 4.04433 18.0768 4.01651 17.9363C3.9887 17.7958 4.00576 17.6501 4.0653 17.5198L4.88227 15.7398C4.77362 15.529 4.67288 15.3142 4.58028 15.0958C4.47218 14.8286 4.37214 14.5581 4.28029 14.2849L2.49035 13.7399C2.34486 13.6959 2.21795 13.6051 2.12935 13.4816C2.04075 13.3581 1.99541 13.2088 2.00037 13.0569L2.07037 11.1359C2.07535 11.0106 2.1145 10.889 2.18359 10.7843C2.25268 10.6796 2.34907 10.5958 2.46235 10.5419L4.34029 9.63991C4.42728 9.32091 4.50328 9.07292 4.57028 8.89192C4.66462 8.65017 4.76938 8.41261 4.88427 8.17993L4.0703 6.45995C4.00852 6.32933 3.98977 6.18249 4.01672 6.04054C4.04367 5.89859 4.11494 5.76884 4.22029 5.66996L5.62424 4.34397C5.72266 4.25115 5.8458 4.18874 5.97886 4.16426C6.11191 4.13977 6.2492 4.15426 6.37422 4.20598L8.27215 4.98997C8.48214 4.84997 8.67214 4.73697 8.84413 4.64597C9.04912 4.53697 9.32311 4.42297 9.6681 4.29997L10.3281 2.459C10.3769 2.32427 10.4661 2.20788 10.5835 2.12573C10.7009 2.04358 10.8408 1.99967 10.9841 2H13.078Z",
4176
+ ...stroke
3080
4177
  }
3081
4178
  )
3082
4179
  ]
@@ -3657,6 +4754,7 @@ var ICONS = {
3657
4754
  coupon: Icon_coupon,
3658
4755
  dashboard: Icon_dashboard,
3659
4756
  date: Icon_date,
4757
+ dollar: Icon_dollar,
3660
4758
  dot: Icon_dot,
3661
4759
  download: Icon_download,
3662
4760
  drag: Icon_drag,
@@ -3664,6 +4762,8 @@ var ICONS = {
3664
4762
  etc: Icon_etc,
3665
4763
  event: Icon_event,
3666
4764
  focus: Icon_focus,
4765
+ fullscreen: Icon_fullscreen,
4766
+ fullscreenExit: Icon_fullscreenExit,
3667
4767
  global: Icon_global,
3668
4768
  helpFill: Icon_helpFill,
3669
4769
  helpOutline: Icon_helpOutline,
@@ -3720,6 +4820,19 @@ var ICONS = {
3720
4820
  warningOutline: Icon_warningOutline,
3721
4821
  youtube: Icon_youtube
3722
4822
  };
4823
+ var STROKE_BY_SIZE = {
4824
+ 8: 1,
4825
+ 10: 1,
4826
+ 12: 1,
4827
+ 16: 1.25,
4828
+ 20: 1.5,
4829
+ 24: 1.5,
4830
+ 32: 2
4831
+ };
4832
+ function toPx(size) {
4833
+ if (typeof size === "number") return size;
4834
+ return /^\d+(\.\d+)?(px)?$/.test(size) ? parseFloat(size) : void 0;
4835
+ }
3723
4836
  var SIcon = /* @__PURE__ */ react.forwardRef(function SIcon2({ name, size = 24, color, rotate, label, className, style }, ref) {
3724
4837
  const Svg = ICONS[name];
3725
4838
  if (!Svg) return null;
@@ -3738,7 +4851,7 @@ var SIcon = /* @__PURE__ */ react.forwardRef(function SIcon2({ name, size = 24,
3738
4851
  role: label ? "img" : void 0,
3739
4852
  "aria-label": label,
3740
4853
  "aria-hidden": label ? void 0 : true,
3741
- children: /* @__PURE__ */ jsxRuntime.jsx(Svg, { size: cssSize ? "100%" : size })
4854
+ children: /* @__PURE__ */ jsxRuntime.jsx(Svg, { size: cssSize ? "100%" : size, strokeWidth: STROKE_BY_SIZE[toPx(size) ?? 0] })
3742
4855
  }
3743
4856
  );
3744
4857
  });
@@ -4377,6 +5490,7 @@ function SFooter({
4377
5490
  leftClassName,
4378
5491
  style
4379
5492
  }) {
5493
+ const tc = useLocale().messages.common;
4380
5494
  const isGrey = bg === "grey";
4381
5495
  const hasSlot = left != null || children != null;
4382
5496
  const hasButton = button != null;
@@ -4408,7 +5522,7 @@ function SFooter({
4408
5522
  ...button,
4409
5523
  size,
4410
5524
  color: button.color ?? "primary",
4411
- label: button.label ?? "\uD655\uC778"
5525
+ label: button.label ?? tc.confirm
4412
5526
  }
4413
5527
  )
4414
5528
  ]
@@ -4789,6 +5903,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
4789
5903
  style,
4790
5904
  contentProps
4791
5905
  }, ref) {
5906
+ const tc = useLocale().messages.common;
4792
5907
  const portalContainer = usePortalContainer();
4793
5908
  const [internalOpen, setInternalOpen] = react.useState(false);
4794
5909
  const isControlled = openProp !== void 0;
@@ -4906,7 +6021,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
4906
6021
  icon: "close",
4907
6022
  size: "xs",
4908
6023
  intent: tooltipType === "default" ? "inverse" : "default",
4909
- ariaLabel: "\uB2EB\uAE30",
6024
+ ariaLabel: tc.close,
4910
6025
  className: "shrink-0",
4911
6026
  onClick: () => {
4912
6027
  cancelHide();
@@ -4922,14 +6037,21 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
4922
6037
  ] });
4923
6038
  });
4924
6039
  var STooltip2 = /* @__PURE__ */ withDisplayName(STooltipImpl, "STooltip");
4925
- function runRules(value, rules) {
6040
+ function runRules(value, rules, invalidMessage = "\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uAC12\uC785\uB2C8\uB2E4.") {
4926
6041
  if (!rules || rules.length === 0) return "";
4927
6042
  for (const rule of rules) {
4928
6043
  const result = rule(value ?? "");
4929
- if (result !== true) return typeof result === "string" ? result : "\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uAC12\uC785\uB2C8\uB2E4.";
6044
+ if (result !== true) return typeof result === "string" ? result : invalidMessage;
4930
6045
  }
4931
6046
  return "";
4932
6047
  }
6048
+ function useRunRules() {
6049
+ const invalid = useLocale().messages.form.invalid;
6050
+ return react.useCallback(
6051
+ (value, rules) => runRules(value, rules, invalid),
6052
+ [invalid]
6053
+ );
6054
+ }
4933
6055
  var FormContext = /* @__PURE__ */ react.createContext(null);
4934
6056
  function useFormContext() {
4935
6057
  return react.useContext(FormContext);
@@ -5261,12 +6383,15 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
5261
6383
  width,
5262
6384
  disabled = false,
5263
6385
  readOnly = false,
5264
- placeholder = "\uC785\uB825\uD574 \uC8FC\uC138\uC694.",
6386
+ placeholder: placeholderProp,
5265
6387
  onBlur,
5266
6388
  className,
5267
6389
  style,
5268
6390
  ...rest
5269
6391
  }, ref) {
6392
+ const runRules2 = useRunRules();
6393
+ const ti = useLocale().messages.input;
6394
+ const placeholder = placeholderProp ?? ti.placeholder;
5270
6395
  const p = TEXTAREA_SIZE[size];
5271
6396
  const heightForRows = (n) => `calc(${p.lineHeight * n}px + ${p.paddingY} * 2)`;
5272
6397
  const minHeight = heightForRows(MIN_ROWS);
@@ -5301,7 +6426,7 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
5301
6426
  useFormField({
5302
6427
  name: rest.name,
5303
6428
  validate: () => {
5304
- const msg = runRules(value, rules);
6429
+ const msg = runRules2(value, rules);
5305
6430
  setRuleError(msg);
5306
6431
  return msg === "";
5307
6432
  },
@@ -5350,11 +6475,11 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
5350
6475
  onChange: (e) => {
5351
6476
  onChange?.(e);
5352
6477
  onValueChange?.(e.target.value);
5353
- if (ruleError !== "") setRuleError(runRules(e.target.value, rules));
6478
+ if (ruleError !== "") setRuleError(runRules2(e.target.value, rules));
5354
6479
  },
5355
6480
  onBlur: (e) => {
5356
6481
  onBlur?.(e);
5357
- if (rules && rules.length > 0) setRuleError(runRules(e.target.value, rules));
6482
+ if (rules && rules.length > 0) setRuleError(runRules2(e.target.value, rules));
5358
6483
  },
5359
6484
  className: cn(
5360
6485
  "w-full border-0 bg-transparent outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed",
@@ -5381,7 +6506,6 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
5381
6506
  }
5382
6507
  );
5383
6508
  });
5384
- var DEFAULT_PLACEHOLDER = "\uBA54\uC2DC\uC9C0\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694...";
5385
6509
  var FIELD_BORDER = 1;
5386
6510
  var TEXTAREA_MIN_HEIGHT = `calc(var(--cmp-chatInput-buttonFrame-height) - ${FIELD_BORDER * 2}px)`;
5387
6511
  var BUTTON_BOTTOM_INSET = `calc((var(--cmp-chatInput-buttonFrame-height) - var(--cmp-ghostButton-md-size)) / 2)`;
@@ -5392,7 +6516,7 @@ function BarButton(props) {
5392
6516
  var SChatInputImpl = /* @__PURE__ */ react.forwardRef(function SChatInput({
5393
6517
  value = "",
5394
6518
  onValueChange,
5395
- placeholder = DEFAULT_PLACEHOLDER,
6519
+ placeholder: placeholderProp,
5396
6520
  disabled = false,
5397
6521
  onSend,
5398
6522
  hasAttachments = false,
@@ -5413,6 +6537,8 @@ var SChatInputImpl = /* @__PURE__ */ react.forwardRef(function SChatInput({
5413
6537
  textareaClassName,
5414
6538
  ...rest
5415
6539
  }, ref) {
6540
+ const t = useLocale().messages.chat;
6541
+ const placeholder = placeholderProp ?? t.placeholder;
5416
6542
  const hasText = value.trim() !== "";
5417
6543
  const canSend = !disabled && !busy && !sendDisabled && (hasText || hasAttachments);
5418
6544
  const send = () => {
@@ -5452,7 +6578,7 @@ var SChatInputImpl = /* @__PURE__ */ react.forwardRef(function SChatInput({
5452
6578
  BarButton,
5453
6579
  {
5454
6580
  icon: "attachFile",
5455
- ariaLabel: "\uD30C\uC77C \uCCA8\uBD80",
6581
+ ariaLabel: t.attachFile,
5456
6582
  tooltipText: attachTooltip,
5457
6583
  disabled: attachLocked,
5458
6584
  onClick: handleAttachClick
@@ -5498,7 +6624,7 @@ var SChatInputImpl = /* @__PURE__ */ react.forwardRef(function SChatInput({
5498
6624
  {
5499
6625
  icon: "stop",
5500
6626
  intent: "danger",
5501
- ariaLabel: "\uC751\uB2F5 \uC911\uC9C0",
6627
+ ariaLabel: t.stopResponse,
5502
6628
  disabled,
5503
6629
  onClick: onStop
5504
6630
  }
@@ -5508,7 +6634,7 @@ var SChatInputImpl = /* @__PURE__ */ react.forwardRef(function SChatInput({
5508
6634
  {
5509
6635
  icon: "send",
5510
6636
  intent: "subAction",
5511
- ariaLabel: "\uC804\uC1A1",
6637
+ ariaLabel: t.send,
5512
6638
  disabled: !canSend,
5513
6639
  onClick: send
5514
6640
  }
@@ -5539,6 +6665,7 @@ var CHAT_ATTACHED_FILE_CONFIG = {
5539
6665
  };
5540
6666
  var SChatAttachedFileImpl = /* @__PURE__ */ react.forwardRef(
5541
6667
  function SChatAttachedFile({ name, onRemove, className, ...rest }, ref) {
6668
+ const t = useLocale().messages.chat;
5542
6669
  return /* @__PURE__ */ jsxRuntime.jsxs(
5543
6670
  "div",
5544
6671
  {
@@ -5579,7 +6706,7 @@ var SChatAttachedFileImpl = /* @__PURE__ */ react.forwardRef(
5579
6706
  {
5580
6707
  icon: "close",
5581
6708
  size: "xs",
5582
- ariaLabel: `${name} \uC81C\uAC70`,
6709
+ ariaLabel: t.removeAttachment(name),
5583
6710
  onClick: onRemove,
5584
6711
  className: "shrink-0"
5585
6712
  }
@@ -5706,10 +6833,6 @@ var OUTGOING_SURFACE = {
5706
6833
  admin: "admin"
5707
6834
  };
5708
6835
  var CHAT_MESSAGE_READ_STATUSES = ["read", "unread"];
5709
- var READ_STATUS_LABEL = {
5710
- read: "\uC77D\uC74C",
5711
- unread: "\uC548 \uC77D\uC74C"
5712
- };
5713
6836
  var READ_STATUS_COLOR = {
5714
6837
  read: "text-(--cmp-chatTimeStamp-color)",
5715
6838
  unread: "text-(--cmp-chatReadMark-color)"
@@ -5758,6 +6881,7 @@ var SChatMessageImpl = /* @__PURE__ */ react.forwardRef(function SChatMessage({
5758
6881
  className,
5759
6882
  ...rest
5760
6883
  }, ref) {
6884
+ const t = useLocale().messages.chat;
5761
6885
  const outgoing = direction === "outgoing";
5762
6886
  const surface = outgoing ? OUTGOING_SURFACE[variant] : "incoming";
5763
6887
  const bubbles = messages ?? [];
@@ -5828,7 +6952,7 @@ var SChatMessageImpl = /* @__PURE__ */ react.forwardRef(function SChatMessage({
5828
6952
  ),
5829
6953
  (readStatus != null || time != null) && // 읽음 표시와 시각은 한 줄에 선다 — 읽음이 먼저, 시각이 뒤다.
5830
6954
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-(--cmp-chatMessage-subData-gap) px-(--cmp-chatMessage-subData-paddingX)", children: [
5831
- readStatus != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("typo-body-sm-bold", READ_STATUS_COLOR[readStatus]), children: READ_STATUS_LABEL[readStatus] }),
6955
+ readStatus != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("typo-body-sm-bold", READ_STATUS_COLOR[readStatus]), children: t[readStatus] }),
5832
6956
  time != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-medium text-(--cmp-chatTimeStamp-color)", children: time })
5833
6957
  ] }),
5834
6958
  actions != null && // 버튼이 많아 한 줄에 안 들어가면 감싼다 — 넘쳐서 잘리는 것보다 낫다.
@@ -5926,6 +7050,7 @@ var SDraggableItemView = /* @__PURE__ */ react.forwardRef(
5926
7050
  style,
5927
7051
  ...rest
5928
7052
  }, ref) {
7053
+ const tc = useLocale().messages.common;
5929
7054
  const renderState = { hovered, dragging, disabled };
5930
7055
  const titleNode = renderSlot(title, renderState);
5931
7056
  const supportingTextNode = renderSlot(supportingText, renderState);
@@ -5989,7 +7114,7 @@ var SDraggableItemView = /* @__PURE__ */ react.forwardRef(
5989
7114
  ...dragHandleProps,
5990
7115
  role: dragHandleProps?.role ?? "button",
5991
7116
  tabIndex: dragHandleProps?.tabIndex ?? (disabled ? -1 : 0),
5992
- "aria-label": dragHandleProps?.["aria-label"] ?? "\uB4DC\uB798\uADF8 \uD578\uB4E4",
7117
+ "aria-label": dragHandleProps?.["aria-label"] ?? tc.dragHandle,
5993
7118
  "aria-disabled": disabled || void 0,
5994
7119
  onMouseDown: onDragHandleMouseDown,
5995
7120
  className: cn(
@@ -7594,7 +8719,6 @@ var SLogo = /* @__PURE__ */ react.forwardRef(function SLogo2({
7594
8719
  }
7595
8720
  );
7596
8721
  });
7597
- var BUTTON_LABEL = "\uD1B5\uD569 \uACC4\uC815\uC73C\uB85C \uB85C\uADF8\uC778";
7598
8722
  var SERVICE_LABEL = {
7599
8723
  sellmate: "Sellmate",
7600
8724
  wms: "Sellmate WMS",
@@ -7610,6 +8734,7 @@ var SERVICE_LABEL = {
7610
8734
  };
7611
8735
  var LOGO_SIZE = 70;
7612
8736
  var SLoginCardImpl = /* @__PURE__ */ react.forwardRef(function SLoginCard({ service, title, description, onLogin, footerNote, bottomAction, className, ...rest }, ref) {
8737
+ const t = useLocale().messages.loginCard;
7613
8738
  const hasIntro = title != null || description != null;
7614
8739
  return /* @__PURE__ */ jsxRuntime.jsxs(
7615
8740
  "div",
@@ -7657,7 +8782,7 @@ var SLoginCardImpl = /* @__PURE__ */ react.forwardRef(function SLoginCard({ serv
7657
8782
  {
7658
8783
  color: "secondary",
7659
8784
  size: "lg",
7660
- label: BUTTON_LABEL,
8785
+ label: t.login,
7661
8786
  onClick: onLogin,
7662
8787
  className: "w-[320px]"
7663
8788
  }
@@ -7912,7 +9037,7 @@ function TreeConnector({
7912
9037
  ] });
7913
9038
  }
7914
9039
  function TreeAllRow({
7915
- label = "\uC804\uCCB4",
9040
+ label: labelProp,
7916
9041
  selected,
7917
9042
  indeterminate = false,
7918
9043
  size = "sm",
@@ -7924,6 +9049,8 @@ function TreeAllRow({
7924
9049
  className,
7925
9050
  ...rest
7926
9051
  }) {
9052
+ const tc = useLocale().messages.common;
9053
+ const label = labelProp ?? tc.all;
7927
9054
  return /* @__PURE__ */ jsxRuntime.jsx(
7928
9055
  "div",
7929
9056
  {
@@ -7971,7 +9098,7 @@ function collectSelectableIds(node) {
7971
9098
  function toSelectedSet(value) {
7972
9099
  return new Set(value ?? []);
7973
9100
  }
7974
- var TREE_ALL_NODE = { id: "__all__", label: "\uC804\uCCB4" };
9101
+ var TREE_ALL_ID = "__all__";
7975
9102
  function getSelectionState(node, selectedSet) {
7976
9103
  const selectableChildren = (node.children ?? []).filter(
7977
9104
  (child) => collectSelectableIds(child).length > 0
@@ -8170,6 +9297,8 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
8170
9297
  className,
8171
9298
  ...rest
8172
9299
  }, ref) {
9300
+ const tc = useLocale().messages.common;
9301
+ const allNode = react.useMemo(() => ({ id: TREE_ALL_ID, label: tc.all }), [tc.all]);
8173
9302
  const [internalValue, setInternalValue] = react.useState(defaultValue ?? []);
8174
9303
  const [internalExpandedIds, setInternalExpandedIds] = react.useState(
8175
9304
  defaultExpandedIds ?? items.filter((item4) => item4.children?.length).map((item4) => item4.id)
@@ -8186,7 +9315,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
8186
9315
  const visibleRows = react.useMemo(() => {
8187
9316
  const rows = [];
8188
9317
  if (showAllItem) {
8189
- rows.push({ id: TREE_ALL_NODE.id, node: TREE_ALL_NODE, parentId: null, expanded: false });
9318
+ rows.push({ id: TREE_ALL_ID, node: allNode, parentId: null, expanded: false });
8190
9319
  }
8191
9320
  const walk = (nodes, parentId) => {
8192
9321
  nodes.forEach((node) => {
@@ -8197,7 +9326,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
8197
9326
  };
8198
9327
  walk(items, null);
8199
9328
  return rows;
8200
- }, [items, expandedSet, showAllItem]);
9329
+ }, [items, expandedSet, showAllItem, allNode]);
8201
9330
  const [focusedId, setFocusedId] = react.useState(null);
8202
9331
  const activeRowId = focusedId != null && visibleRows.some((row) => row.id === focusedId) ? focusedId : visibleRows[0]?.id ?? null;
8203
9332
  const treeRef = react.useRef(null);
@@ -8242,7 +9371,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
8242
9371
  });
8243
9372
  const orderedIds = collectIds(items).filter((id) => next.has(id));
8244
9373
  if (value === void 0) setInternalValue(orderedIds);
8245
- onValueChange?.(orderedIds, TREE_ALL_NODE);
9374
+ onValueChange?.(orderedIds, allNode);
8246
9375
  };
8247
9376
  const handleTreeKeyDown = (event) => {
8248
9377
  const target = event.target;
@@ -8286,7 +9415,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
8286
9415
  }
8287
9416
  case "Enter":
8288
9417
  case " ": {
8289
- if (row.id === TREE_ALL_NODE.id) updateAllSelected();
9418
+ if (row.id === TREE_ALL_ID) updateAllSelected();
8290
9419
  else if (selectable) updateSelected(row.node);
8291
9420
  else if (hasChildren) updateExpanded(row.node);
8292
9421
  else return;
@@ -8347,8 +9476,8 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
8347
9476
  showAllItem && /* @__PURE__ */ jsxRuntime.jsx(
8348
9477
  STreeAllItem,
8349
9478
  {
8350
- rowId: TREE_ALL_NODE.id,
8351
- tabIndex: activeRowId === TREE_ALL_NODE.id ? 0 : -1,
9479
+ rowId: TREE_ALL_ID,
9480
+ tabIndex: activeRowId === TREE_ALL_ID ? 0 : -1,
8352
9481
  onKeyDown: handleTreeKeyDown,
8353
9482
  selected: allSelected,
8354
9483
  indeterminate: allIndeterminate,
@@ -8984,7 +10113,6 @@ var SURFACE = {
8984
10113
  content: "var(--cmp-callout-default-content)"
8985
10114
  }
8986
10115
  };
8987
- var DANGER_TITLE_LABEL = "\uC8FC\uC758\uC0AC\uD56D";
8988
10116
  function renderItems(message, depth = 1) {
8989
10117
  const out = [];
8990
10118
  message.forEach((m, i) => {
@@ -9016,6 +10144,7 @@ function renderItems(message, depth = 1) {
9016
10144
  return out;
9017
10145
  }
9018
10146
  var SCallout = /* @__PURE__ */ react.forwardRef(function SCallout2({ type = "default", showTitle = true, message = [], children, className, style }, ref) {
10147
+ const t = useLocale().messages.callout;
9019
10148
  const hasDangerTitle = type === "danger" && showTitle;
9020
10149
  const surface = SURFACE[type];
9021
10150
  const vars = {
@@ -9052,7 +10181,7 @@ var SCallout = /* @__PURE__ */ react.forwardRef(function SCallout2({ type = "def
9052
10181
  color: "var(--cmp-callout-danger-title-color)"
9053
10182
  }
9054
10183
  ),
9055
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: DANGER_TITLE_LABEL })
10184
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: t.dangerTitle })
9056
10185
  ]
9057
10186
  }
9058
10187
  ),
@@ -9600,6 +10729,7 @@ var SDropdownButtonImpl = /* @__PURE__ */ react.forwardRef(
9600
10729
  className,
9601
10730
  style
9602
10731
  }, ref) {
10732
+ const tc = useLocale().messages.common;
9603
10733
  const insideModal = useInsideModal();
9604
10734
  const [open, setOpen] = react.useState(false);
9605
10735
  const splitWrapRef = react.useRef(null);
@@ -9706,7 +10836,7 @@ var SDropdownButtonImpl = /* @__PURE__ */ react.forwardRef(
9706
10836
  ref: splitToggleRef,
9707
10837
  type: "button",
9708
10838
  disabled,
9709
- "aria-label": "\uBA54\uB274 \uC5F4\uAE30",
10839
+ "aria-label": tc.openMenu,
9710
10840
  className: cn(
9711
10841
  triggerBase,
9712
10842
  "justify-center border-l-[length:var(--cmp-button-border-width-default)]"
@@ -9753,14 +10883,12 @@ var SDropdownButtonImpl = /* @__PURE__ */ react.forwardRef(
9753
10883
  }
9754
10884
  );
9755
10885
  var SDropdownButton2 = /* @__PURE__ */ withDisplayName(SDropdownButtonImpl, "SDropdownButton");
9756
- var DEFAULT_LABEL = "\uAE30\uB2A5 \uB354 \uBCF4\uAE30";
9757
10886
  var SMeatballButtonImpl = /* @__PURE__ */ react.forwardRef(
9758
10887
  function SMeatballButton({
9759
10888
  size = "sm",
9760
10889
  intent = "default",
9761
10890
  items = [],
9762
- // 기본값을 리터럴로 둬야 README(docs:gen)에 실제 문구가 찍힌다
9763
- tooltipText = "\uAE30\uB2A5 \uB354 \uBCF4\uAE30",
10891
+ tooltipText: tooltipTextProp,
9764
10892
  ariaLabel,
9765
10893
  disabled = false,
9766
10894
  onItemClick,
@@ -9769,6 +10897,8 @@ var SMeatballButtonImpl = /* @__PURE__ */ react.forwardRef(
9769
10897
  style
9770
10898
  }, ref) {
9771
10899
  const insideModal = useInsideModal();
10900
+ const tc = useLocale().messages.common;
10901
+ const tooltipText = tooltipTextProp ?? tc.moreActions;
9772
10902
  const [open, setOpen] = react.useState(false);
9773
10903
  const buttonRef = react.useRef(null);
9774
10904
  const pointerRef = react.useRef(false);
@@ -9784,7 +10914,7 @@ var SMeatballButtonImpl = /* @__PURE__ */ react.forwardRef(
9784
10914
  }),
9785
10915
  []
9786
10916
  );
9787
- const label = ariaLabel?.trim() || tooltipText.trim() || DEFAULT_LABEL;
10917
+ const label = ariaLabel?.trim() || tooltipText.trim() || tc.moreActions;
9788
10918
  return /* @__PURE__ */ jsxRuntime.jsxs(
9789
10919
  RDropdown5__namespace.Root,
9790
10920
  {
@@ -10167,13 +11297,14 @@ function Row({
10167
11297
  }
10168
11298
  var SAccountListBox = /* @__PURE__ */ react.forwardRef(
10169
11299
  function SAccountListBox2({ email, name, authority, accountSetting, language, logout, className, style, ...rest }, ref) {
11300
+ const tl = useLocale().messages.accountListBox;
10170
11301
  const hasUserdata = email != null || name != null || authority != null;
10171
11302
  const languageOptions = language?.options ?? [];
10172
11303
  const hasLanguageMenu = languageOptions.length > 0;
10173
11304
  const [languageMenuOpen, setLanguageMenuOpen] = react.useState(false);
10174
11305
  const languageValueRef = react.useRef(null);
10175
11306
  const languageRowRef = react.useRef(null);
10176
- const languageLabel = language?.label ?? ACCOUNT_LIST_BOX_LABELS.language;
11307
+ const languageLabel = language?.label ?? tl.language;
10177
11308
  const languageDoesNothing = Boolean(language) && !hasLanguageMenu && !language?.onClick;
10178
11309
  react.useEffect(() => {
10179
11310
  if (isDev() && languageDoesNothing) {
@@ -10226,7 +11357,7 @@ var SAccountListBox = /* @__PURE__ */ react.forwardRef(
10226
11357
  Row,
10227
11358
  {
10228
11359
  icon: ACCOUNT_LIST_BOX_ICONS.accountSetting,
10229
- label: accountSetting.label ?? ACCOUNT_LIST_BOX_LABELS.accountSetting,
11360
+ label: accountSetting.label ?? tl.accountSetting,
10230
11361
  onClick: accountSetting.onClick
10231
11362
  }
10232
11363
  ),
@@ -10270,7 +11401,7 @@ var SAccountListBox = /* @__PURE__ */ react.forwardRef(
10270
11401
  {
10271
11402
  tone: "negative",
10272
11403
  icon: ACCOUNT_LIST_BOX_ICONS.logout,
10273
- label: logout?.label ?? ACCOUNT_LIST_BOX_LABELS.logout,
11404
+ label: logout?.label ?? tl.logout,
10274
11405
  onClick: logout?.onClick
10275
11406
  }
10276
11407
  )
@@ -10449,7 +11580,17 @@ function TokenIcon2({ name, size }) {
10449
11580
  return /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name, size: "100%", style: { width: size, height: size } });
10450
11581
  }
10451
11582
  var SSystemActionButton = /* @__PURE__ */ react.forwardRef(
10452
- function SSystemActionButton2({ color = "light", type, label, option, disabled = false, className, style, ...rest }, ref) {
11583
+ function SSystemActionButton2({
11584
+ color = "light",
11585
+ type,
11586
+ label,
11587
+ labelSlot,
11588
+ option,
11589
+ disabled = false,
11590
+ className,
11591
+ style,
11592
+ ...rest
11593
+ }, ref) {
10453
11594
  const c = SYSTEM_ACTION_BUTTON_COLOR_CONFIG[color];
10454
11595
  const spec = SYSTEM_ACTION_BUTTON_TYPE_CONFIG[type];
10455
11596
  const listBox = type === "account" ? option ?? {} : void 0;
@@ -10537,7 +11678,19 @@ var SSystemActionButton = /* @__PURE__ */ react.forwardRef(
10537
11678
  icon: "dot",
10538
11679
  label: selected?.label ?? status.value
10539
11680
  }
10540
- ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label }) }),
11681
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11682
+ label != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label }),
11683
+ labelSlot != null && // 라벨↔슬롯 간격에 대응 토큰이 없어 아이콘↔라벨 간격을 같은 호흡으로 쓴다.
11684
+ // 라벨이 없으면 슬롯이 아이콘 바로 옆에서 시작하도록 간격은 라벨이 있을 때만 준다.
11685
+ /* @__PURE__ */ jsxRuntime.jsx(
11686
+ "span",
11687
+ {
11688
+ className: "inline-flex shrink-0 items-center",
11689
+ style: label != null ? { marginLeft: SYSTEM_ACTION_BUTTON_LAYOUT.iconLabelGap } : void 0,
11690
+ children: labelSlot
11691
+ }
11692
+ )
11693
+ ] }) }),
10541
11694
  (actionText != null || spec.actionIcon) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex shrink-0 items-center", style: { gap: SYSTEM_ACTION_BUTTON_LAYOUT.actionGap }, children: [
10542
11695
  actionText != null && spec.actionText && /* @__PURE__ */ jsxRuntime.jsx(
10543
11696
  "span",
@@ -10661,6 +11814,7 @@ function SPopover({
10661
11814
  menuClassName,
10662
11815
  style
10663
11816
  }) {
11817
+ const tc = useLocale().messages.common;
10664
11818
  const portalContainer = usePortalContainer();
10665
11819
  const [internalOpen, setInternalOpen] = react.useState(defaultOpen ?? false);
10666
11820
  const isControlled = open !== void 0;
@@ -10699,7 +11853,7 @@ function SPopover({
10699
11853
  {
10700
11854
  icon: "close",
10701
11855
  size: "xs",
10702
- ariaLabel: "\uB2EB\uAE30",
11856
+ ariaLabel: tc.close,
10703
11857
  onClick: () => setOpen(false),
10704
11858
  className: "absolute right-[12px] top-[12px]"
10705
11859
  }
@@ -10816,7 +11970,6 @@ var SPopup = /* @__PURE__ */ react.forwardRef(function SPopup2({
10816
11970
  }
10817
11971
  );
10818
11972
  });
10819
- var DEFAULT_LABEL2 = { tip: "\uD65C\uC6A9 TIP", notion: "\uC0AC\uC6A9\uBC95 \uC548\uB0B4" };
10820
11973
  var ICON = { tip: "helpOutline", notion: "notion" };
10821
11974
  var VIEWPORT_GUTTER = 24;
10822
11975
  var CLOSE_INSET = 12;
@@ -10834,11 +11987,12 @@ function SGuide({
10834
11987
  className,
10835
11988
  style
10836
11989
  }) {
11990
+ const tg = useLocale().messages.guide;
10837
11991
  const [open, setOpen] = react.useState(false);
10838
11992
  const portalContainer = usePortalContainer();
10839
11993
  const isNotion = type === "notion";
10840
11994
  const isAutoWidth = popupWidth === "auto";
10841
- const defaultLabel = DEFAULT_LABEL2[type];
11995
+ const defaultLabel = type === "notion" ? tg.notion : tg.tip;
10842
11996
  const iconName = ICON[type];
10843
11997
  const messages = flattenMessages(message);
10844
11998
  const active = open;
@@ -10983,7 +12137,7 @@ var CLOSE_ANIMATION_DURATION = 300;
10983
12137
  function SModalContainer({
10984
12138
  open,
10985
12139
  onOpenChange,
10986
- ariaTitle = "\uBAA8\uB2EC",
12140
+ ariaTitle: ariaTitleProp,
10987
12141
  showClose = false,
10988
12142
  onClose,
10989
12143
  persistent = true,
@@ -10993,6 +12147,8 @@ function SModalContainer({
10993
12147
  className,
10994
12148
  style
10995
12149
  }) {
12150
+ const { common: tc, modal: tm } = useLocale().messages;
12151
+ const ariaTitle = ariaTitleProp ?? tm.defaultTitle;
10996
12152
  const [shaking, setShaking] = react.useState(false);
10997
12153
  const [rendered, setRendered] = react.useState(() => Boolean(open));
10998
12154
  const contentRef = react.useRef(null);
@@ -11086,7 +12242,7 @@ function SModalContainer({
11086
12242
  SGhostButton,
11087
12243
  {
11088
12244
  icon: "close",
11089
- ariaLabel: "\uB2EB\uAE30",
12245
+ ariaLabel: tc.close,
11090
12246
  onClick: () => {
11091
12247
  if (closeRequested.current) return;
11092
12248
  closeRequested.current = true;
@@ -11152,7 +12308,7 @@ function SConfirmModal({
11152
12308
  tagSlot,
11153
12309
  optionSlot,
11154
12310
  contentSlot,
11155
- mainButtonLabel = "\uD655\uC778",
12311
+ mainButtonLabel: mainButtonLabelProp,
11156
12312
  mainButtonOutline,
11157
12313
  mainButtonDisabled = false,
11158
12314
  subButtonLabel,
@@ -11160,6 +12316,8 @@ function SConfirmModal({
11160
12316
  onCancel,
11161
12317
  onClose
11162
12318
  }) {
12319
+ const tc = useLocale().messages.common;
12320
+ const mainButtonLabel = mainButtonLabelProp ?? tc.confirm;
11163
12321
  const iconName = TYPE_ICON[type];
11164
12322
  const mainColor = MAIN_BUTTON_COLOR[type];
11165
12323
  const mainOutline = mainButtonOutline ?? MAIN_BUTTON_OUTLINE[type];
@@ -11274,6 +12432,7 @@ function SOverlayHeader({
11274
12432
  descriptionClassName,
11275
12433
  style
11276
12434
  }) {
12435
+ const tc = useLocale().messages.common;
11277
12436
  const hasDescription = description != null && description !== "";
11278
12437
  return /* @__PURE__ */ jsxRuntime.jsxs(
11279
12438
  "header",
@@ -11312,7 +12471,7 @@ function SOverlayHeader({
11312
12471
  SGhostButton,
11313
12472
  {
11314
12473
  icon: "close",
11315
- ariaLabel: "\uB2EB\uAE30",
12474
+ ariaLabel: tc.close,
11316
12475
  onClick: () => onClose?.(),
11317
12476
  className: "absolute right-[12px] top-[12px]"
11318
12477
  }
@@ -11367,14 +12526,6 @@ function SActionModal({
11367
12526
  }
11368
12527
  );
11369
12528
  }
11370
- var DEFAULT_MESSAGE = {
11371
- loading: "\uC791\uC5C5 \uC9C4\uD589\uC911...",
11372
- error: "\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD558\uC600\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694."
11373
- };
11374
- var DEFAULT_BUTTON_LABEL = {
11375
- loading: "\uD655\uC778",
11376
- error: "\uB2E4\uC2DC \uC2DC\uB3C4"
11377
- };
11378
12529
  function SLoadingModal({
11379
12530
  open,
11380
12531
  onOpenChange,
@@ -11389,7 +12540,8 @@ function SLoadingModal({
11389
12540
  width = "var(--cmp-modal-loading-width)",
11390
12541
  height = "var(--cmp-modal-loading-height)"
11391
12542
  }) {
11392
- const resolvedMessage = message ?? DEFAULT_MESSAGE[state2];
12543
+ const { loadingModal: t, common: tc } = useLocale().messages;
12544
+ const resolvedMessage = message ?? (state2 === "loading" ? t.loadingMessage : t.errorMessage);
11393
12545
  const lines = Array.isArray(resolvedMessage) ? resolvedMessage : resolvedMessage ? [resolvedMessage] : [];
11394
12546
  const buttonVisible = showButton || state2 === "error";
11395
12547
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -11400,7 +12552,7 @@ function SLoadingModal({
11400
12552
  onClose,
11401
12553
  showClose: state2 === "error",
11402
12554
  persistent,
11403
- ariaTitle: lines[0] || "\uB85C\uB529 \uC911",
12555
+ ariaTitle: lines[0] || t.ariaTitle,
11404
12556
  width,
11405
12557
  height,
11406
12558
  children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-0 flex-auto flex-col overflow-y-auto px-[32px]", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "m-auto flex flex-col items-center gap-(--cmp-modal-loading-gap)", children: [
@@ -11430,7 +12582,7 @@ function SLoadingModal({
11430
12582
  onButtonClick?.();
11431
12583
  onOpenChange?.(false);
11432
12584
  },
11433
- label: buttonLabel ?? DEFAULT_BUTTON_LABEL[state2]
12585
+ label: buttonLabel ?? (state2 === "loading" ? tc.confirm : t.errorButton)
11434
12586
  }
11435
12587
  )
11436
12588
  ] }) })
@@ -11440,7 +12592,7 @@ function SLoadingModal({
11440
12592
  var CLOSE_ANIMATION_DURATION2 = 300;
11441
12593
  var RESIZE_KEY_STEP = { normal: 10, large: 50 };
11442
12594
  var RESIZE_HIT_WIDTH = "calc(var(--cmp-splitter-border-width) + var(--cmp-splitter-border-padding) * 2)";
11443
- function toPx(value, percentBase) {
12595
+ function toPx2(value, percentBase) {
11444
12596
  if (typeof value === "number") return value;
11445
12597
  if (typeof value !== "string") return void 0;
11446
12598
  const normalized = value.trim();
@@ -11484,6 +12636,7 @@ function SDrawer({
11484
12636
  className,
11485
12637
  style
11486
12638
  }) {
12639
+ const tc = useLocale().messages.common;
11487
12640
  const [shaking, setShaking] = react.useState(false);
11488
12641
  const [rendered, setRendered] = react.useState(() => Boolean(open));
11489
12642
  const [entered, setEntered] = react.useState(false);
@@ -11575,8 +12728,8 @@ function SDrawer({
11575
12728
  const resizeBounds = () => {
11576
12729
  const limit = viewportWidth;
11577
12730
  if (limit === void 0) return { min: void 0, max: void 0 };
11578
- const min = toPx(minWidth, limit);
11579
- const max = toPx(maxWidth, limit);
12731
+ const min = toPx2(minWidth, limit);
12732
+ const max = toPx2(maxWidth, limit);
11580
12733
  return {
11581
12734
  min: min === void 0 ? void 0 : Math.min(min, limit),
11582
12735
  max: max === void 0 ? limit : Math.min(max, limit)
@@ -11710,7 +12863,7 @@ function SDrawer({
11710
12863
  {
11711
12864
  role: "separator",
11712
12865
  "aria-orientation": "vertical",
11713
- "aria-label": "Drawer \uB108\uBE44 \uC870\uC808",
12866
+ "aria-label": tc.resizeDrawer,
11714
12867
  "aria-valuenow": resizeValueNow,
11715
12868
  "aria-valuemin": resizeValueMin,
11716
12869
  "aria-valuemax": resizeValueMax,
@@ -12276,6 +13429,7 @@ function resolveRows(items) {
12276
13429
  }
12277
13430
  var SLauncherListBox = /* @__PURE__ */ react.forwardRef(
12278
13431
  function SLauncherListBox2({ items, onSelect, consoleHref, onConsoleClick, ariaLabel, className, style, ...rest }, ref) {
13432
+ const tl = useLocale().messages.launcher;
12279
13433
  const rows = items ? resolveRows(items) : [];
12280
13434
  if (rows.length === 0) return null;
12281
13435
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -12394,7 +13548,7 @@ var SLauncherListBox = /* @__PURE__ */ react.forwardRef(
12394
13548
  onClick: () => onSelect?.(row.service),
12395
13549
  children: [
12396
13550
  content,
12397
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "\uC0C8 \uD0ED\uC5D0\uC11C \uC5F4\uB9BC" })
13551
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: tl.opensInNewTab })
12398
13552
  ]
12399
13553
  }
12400
13554
  )
@@ -12421,7 +13575,7 @@ var SLauncherListBox = /* @__PURE__ */ react.forwardRef(
12421
13575
  window.open(consoleHref, "_blank", "noopener,noreferrer");
12422
13576
  onConsoleClick?.();
12423
13577
  },
12424
- "aria-label": `${LAUNCHER_LIST_BOX_CONSOLE_LABEL} (\uC0C8 \uD0ED\uC5D0\uC11C \uC5F4\uB9BC)`
13578
+ "aria-label": `${LAUNCHER_LIST_BOX_CONSOLE_LABEL} (${tl.opensInNewTab})`
12425
13579
  }
12426
13580
  )
12427
13581
  }
@@ -13556,8 +14710,6 @@ var GNB_SYSTEM_LAYOUT = {
13556
14710
  domainRadius: domain("radius")
13557
14711
  };
13558
14712
  var GNB_SYSTEM_ALERT_DOT_SIZE = 6;
13559
- var GNB_SYSTEM_ALERT_LABEL = "\uC54C\uB9BC";
13560
- var GNB_SYSTEM_SETTING_LABEL = "\uC124\uC815";
13561
14713
  function TokenIcon3({ name, size }) {
13562
14714
  return /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name, size: "100%", style: { width: size, height: size } });
13563
14715
  }
@@ -13665,6 +14817,7 @@ var SGnbSystem = /* @__PURE__ */ react.forwardRef(function SGnbSystem2({
13665
14817
  style,
13666
14818
  ...rest
13667
14819
  }, ref) {
14820
+ const tg = useLocale().messages.gnbSystem;
13668
14821
  const gnb3 = react.useContext(SGnbSystemContext);
13669
14822
  const color = colorProp ?? gnb3?.color ?? "light";
13670
14823
  const placement = gnb3?.placement ?? "panel";
@@ -13723,8 +14876,8 @@ var SGnbSystem = /* @__PURE__ */ react.forwardRef(function SGnbSystem2({
13723
14876
  setAlertTooltipDismissed(true);
13724
14877
  alert2?.onTooltipDismiss?.();
13725
14878
  };
13726
- const alertLabel = alert2?.label ?? GNB_SYSTEM_ALERT_LABEL;
13727
- const settingLabel = setting?.label ?? GNB_SYSTEM_SETTING_LABEL;
14879
+ const alertLabel = alert2?.label ?? tg.alert;
14880
+ const settingLabel = setting?.label ?? tg.setting;
13728
14881
  const alertButton = alert2 && /* @__PURE__ */ jsxRuntime.jsx(
13729
14882
  SystemButton,
13730
14883
  {
@@ -13760,7 +14913,7 @@ var SGnbSystem = /* @__PURE__ */ react.forwardRef(function SGnbSystem2({
13760
14913
  align: "end",
13761
14914
  offset: 8,
13762
14915
  viewportPadding: 8,
13763
- ariaLabel: alert2.label ?? GNB_SYSTEM_ALERT_LABEL,
14916
+ ariaLabel: alertLabel,
13764
14917
  onOpenAutoFocus: (event) => event.preventDefault(),
13765
14918
  className: "rounded-(--radius-8)",
13766
14919
  children: alert2.listBox
@@ -14088,6 +15241,7 @@ var PAGE_CONTENT_WIDTHS = ["full", "fixed", "fixedCenter"];
14088
15241
  var PAGE_HEADER_VARIANTS = ["plain", "bar"];
14089
15242
  var SPageHeader = /* @__PURE__ */ withDisplayName(
14090
15243
  react.forwardRef(function SPageHeader2({ title, subText, titleSlot, variant, onBack, slot, scrolled, className, style, ...rest }, ref) {
15244
+ const tc = useLocale().messages.common;
14091
15245
  const hasBack = onBack != null;
14092
15246
  const hasTitleSlot = titleSlot != null && titleSlot !== false;
14093
15247
  const titleEl = /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-heading-lg min-w-0 truncate text-(--cmp-pageHeader-title-text)", children: title });
@@ -14126,7 +15280,7 @@ var SPageHeader = /* @__PURE__ */ withDisplayName(
14126
15280
  {
14127
15281
  icon: "chevronLeft",
14128
15282
  size: "xs",
14129
- ariaLabel: "\uB4A4\uB85C\uAC00\uAE30",
15283
+ ariaLabel: tc.back,
14130
15284
  onClick: onBack,
14131
15285
  className: cn("shrink-0", bar ? "" : "mt-[3px]")
14132
15286
  }
@@ -14315,6 +15469,7 @@ function SPagination({
14315
15469
  className,
14316
15470
  style
14317
15471
  }) {
15472
+ const t = useLocale().messages.pagination;
14318
15473
  const start = Math.floor((currentPage - 1) / PER_PAGE) * PER_PAGE + 1;
14319
15474
  const end = Math.min(start + PER_PAGE - 1, lastPage);
14320
15475
  const pageNumbers = Array.from({ length: Math.max(end - start + 1, 0) }, (_, i) => start + i);
@@ -14341,18 +15496,18 @@ function SPagination({
14341
15496
  }
14342
15497
  );
14343
15498
  const prevButtons = simple ? currentPage > 1 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
14344
- navBtn("chevronLeftEnd", "\uCCAB \uD398\uC774\uC9C0", () => go(1)),
14345
- navBtn("chevronLeft", "\uC774\uC804 \uD398\uC774\uC9C0", () => go(currentPage - 1))
15499
+ navBtn("chevronLeftEnd", t.firstPage, () => go(1)),
15500
+ navBtn("chevronLeft", t.prevPage, () => go(currentPage - 1))
14346
15501
  ] }) : !isFirstGroup && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
14347
- navBtn("chevronLeftEnd", "\uCCAB \uD398\uC774\uC9C0", () => go(1)),
14348
- navBtn("chevronLeft", "\uC774\uC804 \uADF8\uB8F9", () => groupMove("backward"))
15502
+ navBtn("chevronLeftEnd", t.firstPage, () => go(1)),
15503
+ navBtn("chevronLeft", t.prevGroup, () => groupMove("backward"))
14349
15504
  ] });
14350
15505
  const nextButtons = simple ? currentPage < lastPage && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
14351
- navBtn("chevronRight", "\uB2E4\uC74C \uD398\uC774\uC9C0", () => go(currentPage + 1)),
14352
- navBtn("chevronRightEnd", "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0", () => go(lastPage))
15506
+ navBtn("chevronRight", t.nextPage, () => go(currentPage + 1)),
15507
+ navBtn("chevronRightEnd", t.lastPage, () => go(lastPage))
14353
15508
  ] }) : !isLastGroup && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
14354
- navBtn("chevronRight", "\uB2E4\uC74C \uADF8\uB8F9", () => groupMove("forward")),
14355
- navBtn("chevronRightEnd", "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0", () => go(lastPage))
15509
+ navBtn("chevronRight", t.nextGroup, () => groupMove("forward")),
15510
+ navBtn("chevronRightEnd", t.lastPage, () => go(lastPage))
14356
15511
  ] });
14357
15512
  return /* @__PURE__ */ jsxRuntime.jsxs(
14358
15513
  "div",
@@ -14702,7 +15857,6 @@ var STEPPER_VERTICAL_COLORS = {
14702
15857
  sequenceIconCompleted: STEPPER_COLORS.sequenceText.completed,
14703
15858
  errorBadge: "#FB4444"
14704
15859
  };
14705
- var ERROR_TOOLTIP_MESSAGE = "\uD655\uC778\uC774 \uD544\uC694\uD55C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.";
14706
15860
  function getItemValue(item4, index) {
14707
15861
  return item4.value ?? String(index + 1);
14708
15862
  }
@@ -14744,10 +15898,12 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
14744
15898
  vertical = false,
14745
15899
  clickable,
14746
15900
  onValueChange,
14747
- ariaLabel = "\uC9C4\uD589 \uB2E8\uACC4",
15901
+ ariaLabel: ariaLabelProp,
14748
15902
  className,
14749
15903
  style
14750
15904
  }, ref) {
15905
+ const t = useLocale().messages.stepper;
15906
+ const ariaLabel = ariaLabelProp ?? t.ariaLabel;
14751
15907
  const config = STEPPER_SIZE_CONFIG[size];
14752
15908
  const isClickable = clickable ?? vertical;
14753
15909
  const [hoveredIndex, setHoveredIndex] = react.useState(null);
@@ -15029,7 +16185,7 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
15029
16185
  {
15030
16186
  trigger: "none",
15031
16187
  open: showTooltip,
15032
- content: ERROR_TOOLTIP_MESSAGE,
16188
+ content: t.errorTooltip,
15033
16189
  tooltipType: "danger",
15034
16190
  placement: "right",
15035
16191
  children: /* @__PURE__ */ jsxRuntime.jsxs(
@@ -15207,16 +16363,20 @@ function monthCells(year, month) {
15207
16363
  }
15208
16364
  return cells;
15209
16365
  }
15210
- var WEEK_LABELS = ["\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"];
15211
- var WEEKDAY_SUFFIX_EM = 0.25 + 3 * 1;
15212
- var weekdaySuffixWidth = (fontSize) => Math.ceil(fontSize * WEEKDAY_SUFFIX_EM);
15213
- function withWeekday(value) {
16366
+ var glyphEm = (char) => /[\u1100-\u11ff\u3040-\u30ff\u3130-\u318f\u3400-\u9fff\uac00-\ud7a3]/.test(char) ? 1 : 0.58;
16367
+ var weekdaySuffixWidth = (fontSize, t) => {
16368
+ const longest = Math.max(
16369
+ ...t.weekdaysLong.map((name) => Array.from(name).reduce((sum, char) => sum + glyphEm(char), 0))
16370
+ );
16371
+ return Math.ceil(fontSize * (0.25 + longest));
16372
+ };
16373
+ function withWeekday(value, t) {
15214
16374
  const [date = "", ...rest] = value.split(" ");
15215
16375
  const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(date);
15216
16376
  if (!match) return value;
15217
16377
  const day = new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3])).getDay();
15218
16378
  if (Number.isNaN(day)) return value;
15219
- return [date, `${WEEK_LABELS[day]}\uC694\uC77C`, ...rest].join(" ");
16379
+ return [date, t.weekdaysLong[day], ...rest].join(" ");
15220
16380
  }
15221
16381
 
15222
16382
  // src/components/SCalendarBoard/calendar-board-layout.ts
@@ -15451,7 +16611,9 @@ function CalendarEventButton({
15451
16611
  }
15452
16612
  );
15453
16613
  }
15454
- var CalendarMoreButton = /* @__PURE__ */ react.forwardRef(function CalendarMoreButton2({ count, label = "\uB354\uBCF4\uAE30", dimmed = false, onClick, className, style }, ref) {
16614
+ var CalendarMoreButton = /* @__PURE__ */ react.forwardRef(function CalendarMoreButton2({ count, label: labelProp, dimmed = false, onClick, className, style }, ref) {
16615
+ const tc = useLocale().messages.common;
16616
+ const label = labelProp ?? tc.more;
15455
16617
  return /* @__PURE__ */ jsxRuntime.jsxs(
15456
16618
  "button",
15457
16619
  {
@@ -15474,10 +16636,7 @@ var CalendarMoreButton = /* @__PURE__ */ react.forwardRef(function CalendarMoreB
15474
16636
  className: "pointer-events-none absolute inset-0 rounded-(--cmp-calendarBoard-item-radius) bg-(--cmp-calendarBoard-moreButton-hover-overlay-color) opacity-0 transition-opacity group-hover:opacity-(--cmp-calendarBoard-moreButton-hover-overlay-opacity)"
15475
16637
  }
15476
16638
  ),
15477
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "typo-body-sm-semibold shrink-0 text-(--cmp-calendarBoard-moreButton-count-color)", children: [
15478
- count,
15479
- "\uAC1C"
15480
- ] }),
16639
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-semibold shrink-0 text-(--cmp-calendarBoard-moreButton-count-color)", children: tc.count(count) }),
15481
16640
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-default min-w-0 truncate text-(--cmp-calendarBoard-moreButton-label-color)", children: label })
15482
16641
  ]
15483
16642
  }
@@ -15615,10 +16774,12 @@ function CalendarDayEventListBox({
15615
16774
  minWidth,
15616
16775
  minHeight,
15617
16776
  onClose,
15618
- closeLabel = "\uB2EB\uAE30"
16777
+ closeLabel: closeLabelProp
15619
16778
  }) {
16779
+ const { common: tc, date: t } = useLocale().messages;
16780
+ const closeLabel = closeLabelProp ?? tc.close;
15620
16781
  const [y, m, d] = date.split("-").map(Number);
15621
- const weekday = WEEK_LABELS[new Date(y, m - 1, d).getDay()];
16782
+ const weekday = t.weekdays[new Date(y, m - 1, d).getDay()];
15622
16783
  return /* @__PURE__ */ jsxRuntime.jsxs(
15623
16784
  "div",
15624
16785
  {
@@ -15626,10 +16787,7 @@ function CalendarDayEventListBox({
15626
16787
  style: { minWidth, maxWidth: MAX_WIDTH, minHeight, maxHeight: MAX_HEIGHT },
15627
16788
  children: [
15628
16789
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-(--cmp-calendarBoard-dayEvent-header-gap) px-(--cmp-calendarBoard-dayEvent-header-paddingX) py-(--cmp-calendarBoard-dayEvent-header-paddingY)", children: [
15629
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "typo-heading-md text-(--cmp-calendarBoard-header-content-color)", children: [
15630
- d,
15631
- "\uC77C"
15632
- ] }),
16790
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-heading-md text-(--cmp-calendarBoard-header-content-color)", children: t.dayLabel(d) }),
15633
16791
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "typo-body-lg-default flex-1 text-(--cmp-calendarBoard-header-content-color)", children: [
15634
16792
  "(",
15635
16793
  weekday,
@@ -15690,12 +16848,14 @@ function SCalendarBoard({
15690
16848
  focusedEventId,
15691
16849
  onEventClick,
15692
16850
  onMoreClick,
15693
- todayLabel = "\uC624\uB298",
16851
+ todayLabel: todayLabelProp,
15694
16852
  moreLabel,
15695
16853
  headerRight,
15696
16854
  className,
15697
16855
  style
15698
16856
  }) {
16857
+ const t = useLocale().messages.date;
16858
+ const todayLabel = todayLabelProp ?? t.today;
15699
16859
  const today = todayStr();
15700
16860
  const [ty, tm] = [Number(today.slice(0, 4)), Number(today.slice(5, 7))];
15701
16861
  const [innerView, setInnerView] = react.useState(() => ({
@@ -15801,7 +16961,7 @@ function SCalendarBoard({
15801
16961
  {
15802
16962
  icon: "chevronLeft",
15803
16963
  size: "xxs",
15804
- ariaLabel: "\uC774\uC804 \uD574",
16964
+ ariaLabel: t.prevYear,
15805
16965
  onClick: () => setView({ year: view.year - 1, month: view.month })
15806
16966
  }
15807
16967
  ),
@@ -15811,7 +16971,7 @@ function SCalendarBoard({
15811
16971
  {
15812
16972
  icon: "chevronRight",
15813
16973
  size: "xxs",
15814
- ariaLabel: "\uB2E4\uC74C \uD574",
16974
+ ariaLabel: t.nextYear,
15815
16975
  onClick: () => setView({ year: view.year + 1, month: view.month })
15816
16976
  }
15817
16977
  )
@@ -15823,20 +16983,17 @@ function SCalendarBoard({
15823
16983
  {
15824
16984
  icon: "chevronLeft",
15825
16985
  size: "xxs",
15826
- ariaLabel: "\uC774\uC804 \uB2EC",
16986
+ ariaLabel: t.prevMonth,
15827
16987
  onClick: () => setView(calcYearMonth(view.year, view.month, "prev"))
15828
16988
  }
15829
16989
  ),
15830
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "typo-heading-lg inline-flex min-w-[48px] justify-center text-(--cmp-calendarBoard-header-content-color)", children: [
15831
- view.month,
15832
- "\uC6D4"
15833
- ] }),
16990
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-heading-lg inline-flex min-w-[48px] justify-center text-(--cmp-calendarBoard-header-content-color)", children: t.monthLabel(view.month) }),
15834
16991
  /* @__PURE__ */ jsxRuntime.jsx(
15835
16992
  SGhostButton,
15836
16993
  {
15837
16994
  icon: "chevronRight",
15838
16995
  size: "xxs",
15839
- ariaLabel: "\uB2E4\uC74C \uB2EC",
16996
+ ariaLabel: t.nextMonth,
15840
16997
  onClick: () => setView(calcYearMonth(view.year, view.month, "next"))
15841
16998
  }
15842
16999
  )
@@ -15859,7 +17016,7 @@ function SCalendarBoard({
15859
17016
  {
15860
17017
  className: "grid shrink-0 bg-(--cmp-calendarBoard-grid-bg) pt-(--cmp-calendarBoard-grid-paddingTop) pb-(--cmp-calendarBoard-grid-gap)",
15861
17018
  style: { gridTemplateColumns: columns },
15862
- children: WEEK_LABELS.map((label) => /* @__PURE__ */ jsxRuntime.jsx(
17019
+ children: t.weekdays.map((label) => /* @__PURE__ */ jsxRuntime.jsx(
15863
17020
  "div",
15864
17021
  {
15865
17022
  className: "typo-body-md-default flex justify-center text-(--cmp-calendarBoard-grid-weekRow-color)",
@@ -16214,7 +17371,7 @@ var SSearchInput = /* @__PURE__ */ react.forwardRef(function SSearchInput2({
16214
17371
  onChange,
16215
17372
  onSearch,
16216
17373
  size = "sm",
16217
- placeholder = "\uACB0\uACFC \uB0B4 \uAC80\uC0C9",
17374
+ placeholder: placeholderProp,
16218
17375
  clearable = false,
16219
17376
  disabled = false,
16220
17377
  width,
@@ -16227,6 +17384,8 @@ var SSearchInput = /* @__PURE__ */ react.forwardRef(function SSearchInput2({
16227
17384
  onKeyDown,
16228
17385
  ...rest
16229
17386
  }, ref) {
17387
+ const { common: tc, input: ti } = useLocale().messages;
17388
+ const placeholder = placeholderProp ?? ti.searchWithinResults;
16230
17389
  const f = FONT[size];
16231
17390
  const hasValue = value !== void 0 && value !== null && String(value) !== "";
16232
17391
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16294,7 +17453,7 @@ var SSearchInput = /* @__PURE__ */ react.forwardRef(function SSearchInput2({
16294
17453
  {
16295
17454
  icon: "close",
16296
17455
  size: "xxs",
16297
- ariaLabel: "\uC9C0\uC6B0\uAE30",
17456
+ ariaLabel: tc.clear,
16298
17457
  className: "flex-shrink-0",
16299
17458
  onClick: () => onValueChange?.("")
16300
17459
  }
@@ -16444,8 +17603,8 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16444
17603
  valueDisplay = "text",
16445
17604
  showSearch = false,
16446
17605
  showSelectAll = false,
16447
- allSelectedLabel = "\uC804\uCCB4",
16448
- placeholder = "\uC120\uD0DD",
17606
+ allSelectedLabel: allSelectedLabelProp,
17607
+ placeholder: placeholderProp,
16449
17608
  disabled = false,
16450
17609
  clearable = false,
16451
17610
  error = false,
@@ -16479,6 +17638,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16479
17638
  className,
16480
17639
  style
16481
17640
  }, ref) {
17641
+ const runRules2 = useRunRules();
16482
17642
  const multi = type === "multi" || type === "multi_depth" || type === "multi_tree";
16483
17643
  const isDepth = type === "default_depth" || type === "multi_depth";
16484
17644
  const isTree = type === "tree" || type === "multi_tree";
@@ -16486,6 +17646,9 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16486
17646
  const partialOptions = pagingEnabled || serverSearch;
16487
17647
  const portalContainer = usePortalContainer();
16488
17648
  const insideModal = useInsideModal();
17649
+ const t = useLocale().messages.select;
17650
+ const allSelectedLabel = allSelectedLabelProp ?? t.allSelected;
17651
+ const placeholder = placeholderProp ?? t.placeholder;
16489
17652
  const [search, setSearch] = react.useState("");
16490
17653
  const [ruleError, setRuleError] = react.useState("");
16491
17654
  const [open, setOpen] = react.useState(false);
@@ -16588,7 +17751,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16588
17751
  setSearch("");
16589
17752
  if (rules && rules.length > 0) {
16590
17753
  const current = valueForRules ?? selectedRef.current;
16591
- setRuleError(runRules(multi ? current : current[0] ?? "", rules));
17754
+ setRuleError(runRules2(multi ? current : current[0] ?? "", rules));
16592
17755
  }
16593
17756
  }
16594
17757
  };
@@ -16627,7 +17790,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16627
17790
  useFormField({
16628
17791
  name,
16629
17792
  validate: () => {
16630
- const msg = runRules(multi ? selected : selected[0] ?? "", rules);
17793
+ const msg = runRules2(multi ? selected : selected[0] ?? "", rules);
16631
17794
  setRuleError(msg);
16632
17795
  return msg === "";
16633
17796
  },
@@ -16900,14 +18063,14 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16900
18063
  const showClear = clearable && !effectiveDisabled && !isPlaceholder;
16901
18064
  const handleClear = () => {
16902
18065
  emit3([]);
16903
- if (rules && rules.length > 0) setRuleError(runRules(multi ? [] : "", rules));
18066
+ if (rules && rules.length > 0) setRuleError(runRules2(multi ? [] : "", rules));
16904
18067
  triggerRef.current?.focus();
16905
18068
  };
16906
18069
  const handleRemoveChip = (targets) => {
16907
18070
  const remove = new Set(targets);
16908
18071
  const next = selected.filter((v) => !remove.has(v));
16909
18072
  emit3(next);
16910
- if (rules && rules.length > 0) setRuleError(runRules(next, rules));
18073
+ if (rules && rules.length > 0) setRuleError(runRules2(next, rules));
16911
18074
  triggerRef.current?.focus();
16912
18075
  };
16913
18076
  const handleSelect = (nextValue, index, extend = false) => {
@@ -17227,7 +18390,9 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
17227
18390
  chip.removable && /* @__PURE__ */ jsxRuntime.jsx(
17228
18391
  TriggerRemoveButton,
17229
18392
  {
17230
- ariaLabel: `${isHtmlLabel(chip.label) ? extractText(chip.label) : chip.label} \uC120\uD0DD \uD574\uC81C`,
18393
+ ariaLabel: t.deselect(
18394
+ isHtmlLabel(chip.label) ? extractText(chip.label) : chip.label
18395
+ ),
17231
18396
  onRemove: () => handleRemoveChip(chip.values)
17232
18397
  }
17233
18398
  )
@@ -17239,7 +18404,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
17239
18404
  )
17240
18405
  ) : /* @__PURE__ */ jsxRuntime.jsx(TriggerLabel, { label: triggerText }),
17241
18406
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex shrink-0 items-center gap-[8px]", children: [
17242
- showClear && /* @__PURE__ */ jsxRuntime.jsx(TriggerRemoveButton, { ariaLabel: "\uC120\uD0DD \uC9C0\uC6B0\uAE30", onRemove: handleClear }),
18407
+ showClear && /* @__PURE__ */ jsxRuntime.jsx(TriggerRemoveButton, { ariaLabel: t.clear, onRemove: handleClear }),
17243
18408
  showTriggerSpinner ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "inline-flex shrink-0", "data-select-trigger-spinner": true, children: /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true, type: "neutral", size: 12 }) }) : /* @__PURE__ */ jsxRuntime.jsx(
17244
18409
  SIcon,
17245
18410
  {
@@ -17319,7 +18484,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
17319
18484
  value: search,
17320
18485
  onValueChange: handleSearchChange,
17321
18486
  onKeyDown: handleKeyDown,
17322
- placeholder: "\uAC80\uC0C9",
18487
+ placeholder: t.searchPlaceholder,
17323
18488
  clearable: true,
17324
18489
  "aria-controls": listboxId,
17325
18490
  "aria-activedescendant": focusedIndex >= 0 ? activeOptionId : void 0
@@ -17363,7 +18528,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
17363
18528
  }
17364
18529
  ) : loading2 ? null : (
17365
18530
  // 첫 페이지를 받는 중에는 "없다"고 단정하지 않는다 — 아래 로딩 표시가 대신 나온다.
17366
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-[12px] py-[12px] text-left text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-disabled)]", children: "\uD45C\uC2DC\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4." })
18531
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-[12px] py-[12px] text-left text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-disabled)]", children: t.empty })
17367
18532
  ),
17368
18533
  loading2 && /* @__PURE__ */ jsxRuntime.jsxs(
17369
18534
  "div",
@@ -17372,7 +18537,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
17372
18537
  className: "flex items-center justify-center gap-[8px] px-[12px] py-[12px] text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-disabled)]",
17373
18538
  children: [
17374
18539
  /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true, type: "neutral", size: 16 }),
17375
- "\uBD88\uB7EC\uC624\uB294 \uC911..."
18540
+ t.loading
17376
18541
  ]
17377
18542
  }
17378
18543
  )
@@ -17787,12 +18952,7 @@ var NO_KEYS = /* @__PURE__ */ new Set();
17787
18952
  var DEFAULT_ROW_HEIGHT = 44;
17788
18953
  var DENSE_ROW_HEIGHT = 32;
17789
18954
  var SELECTABLE_COLUMN_WIDTH = 48;
17790
- var DEFAULT_ROWS_PER_PAGE_OPTION = [
17791
- { label: "10\uAC1C\uC529 \uBCF4\uAE30", value: 10 },
17792
- { label: "25\uAC1C\uC529 \uBCF4\uAE30", value: 25 },
17793
- { label: "50\uAC1C\uC529 \uBCF4\uAE30", value: 50 },
17794
- { label: "100\uAC1C\uC529 \uBCF4\uAE30", value: 100 }
17795
- ];
18955
+ var DEFAULT_ROWS_PER_PAGE_COUNTS = [10, 25, 50, 100];
17796
18956
  var cellValue = (col, row) => {
17797
18957
  const raw = col.field == null ? void 0 : typeof col.field === "function" ? col.field(row) : row[col.field];
17798
18958
  return col.format ? col.format(raw, row) : raw;
@@ -17832,7 +18992,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
17832
18992
  rowKey = "id",
17833
18993
  selectable = false,
17834
18994
  rowSelectLabel,
17835
- selectAllLabel = "\uC804\uCCB4 \uC120\uD0DD",
18995
+ selectAllLabel: selectAllLabelProp,
17836
18996
  dragSelectable = false,
17837
18997
  contextMenuItems,
17838
18998
  onContextMenuItemClick,
@@ -17849,7 +19009,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
17849
19009
  stickyColumn,
17850
19010
  radius = "default",
17851
19011
  bordered = true,
17852
- emptyLabel = "\uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
19012
+ emptyLabel: emptyLabelProp,
17853
19013
  emptySlot,
17854
19014
  loading: loading2 = false,
17855
19015
  dense = false,
@@ -17859,7 +19019,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
17859
19019
  onPageChange,
17860
19020
  internalPagination = false,
17861
19021
  showRowsPerPageSelect = false,
17862
- rowsPerPageOption = DEFAULT_ROWS_PER_PAGE_OPTION,
19022
+ rowsPerPageOption: rowsPerPageOptionProp,
17863
19023
  onRowsPerPageChange,
17864
19024
  virtualScroll = false,
17865
19025
  rowHeight,
@@ -17881,6 +19041,13 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
17881
19041
  }, ref) {
17882
19042
  const autoId = react.useId();
17883
19043
  const resolvedTableId = tableId ?? autoId;
19044
+ const t = useLocale().messages.table;
19045
+ const selectAllLabel = selectAllLabelProp ?? t.selectAll;
19046
+ const emptyLabel = emptyLabelProp ?? t.empty;
19047
+ const rowsPerPageOption = react.useMemo(
19048
+ () => rowsPerPageOptionProp ?? DEFAULT_ROWS_PER_PAGE_COUNTS.map((count) => ({ label: t.rowsPerPage(count), value: count })),
19049
+ [rowsPerPageOptionProp, t]
19050
+ );
17884
19051
  const [innerDense, setInnerDense] = react.useState(dense);
17885
19052
  react.useEffect(() => {
17886
19053
  setInnerDense(dense);
@@ -18692,7 +19859,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
18692
19859
  name: "pageEdit",
18693
19860
  size: 12,
18694
19861
  color: "var(--sys-color-link-accent)",
18695
- label: "\uC218\uC815 \uAC00\uB2A5",
19862
+ label: t.editable,
18696
19863
  className: "shrink-0"
18697
19864
  }
18698
19865
  ),
@@ -18702,7 +19869,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
18702
19869
  name: "pageMove",
18703
19870
  size: 12,
18704
19871
  color: "var(--sys-color-link-accent)",
18705
- label: "\uC0C8 \uD654\uBA74\uC5D0\uC11C \uC5F4\uAE30",
19872
+ label: t.opensInNewScreen,
18706
19873
  className: "shrink-0"
18707
19874
  }
18708
19875
  ),
@@ -18726,7 +19893,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
18726
19893
  size: "xxs",
18727
19894
  intent: sortDir ? "action" : "default",
18728
19895
  icon: sortDir === "asc" ? "arrowUp" : sortDir === "desc" ? "arrowDown" : "updown",
18729
- ariaLabel: `${col.label} \uC815\uB82C`,
19896
+ ariaLabel: t.sortBy(col.label),
18730
19897
  onClick: () => toggleSort(col)
18731
19898
  }
18732
19899
  ) })
@@ -18876,7 +20043,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
18876
20043
  value: isSel || !isRowIndeterminate?.(row) ? isSel : null,
18877
20044
  disabled: !canSelectRow(row),
18878
20045
  onValueChange: () => toggleRow(row, rowOffset + ri),
18879
- ariaLabel: rowSelectLabel?.(row) ?? "\uD589 \uC120\uD0DD"
20046
+ ariaLabel: rowSelectLabel?.(row) ?? t.selectRow
18880
20047
  }
18881
20048
  ) })
18882
20049
  }
@@ -19029,7 +20196,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
19029
20196
  icon: innerDense ? "row" : "rowDense",
19030
20197
  iconRotate: 90,
19031
20198
  iconColor: "var(--sys-color-fg-quaternary)",
19032
- label: innerDense ? "\uB113\uAC8C \uBCF4\uAE30" : "\uC881\uAC8C \uBCF4\uAE30",
20199
+ label: innerDense ? t.denseOff : t.denseOn,
19033
20200
  onClick: () => changeDense(!innerDense)
19034
20201
  }
19035
20202
  ),
@@ -19136,6 +20303,8 @@ var STableBar = /* @__PURE__ */ react.forwardRef(function STableBar2({ title, to
19136
20303
  const hasTitle = title != null;
19137
20304
  const hasLeading = hasTitle || hasCount;
19138
20305
  const titleId = react.useId();
20306
+ const { messages, formatNumber } = useLocale();
20307
+ const t = messages.tableBar;
19139
20308
  const isToolbar = Boolean(actions || rightActions);
19140
20309
  return /* @__PURE__ */ jsxRuntime.jsxs(
19141
20310
  "div",
@@ -19161,9 +20330,9 @@ var STableBar = /* @__PURE__ */ react.forwardRef(function STableBar2({ title, to
19161
20330
  ),
19162
20331
  hasCount && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-[var(--cmp-table-content-gap)]", children: [
19163
20332
  hasTotal && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "typo-table-accent whitespace-nowrap text-[var(--sys-color-fg-primary)]", children: [
19164
- "\uCD1D ",
19165
- /* @__PURE__ */ jsxRuntime.jsx("b", { style: { color: totalColor(total) }, children: total.toLocaleString() }),
19166
- " \uAC74"
20333
+ t.totalBefore,
20334
+ /* @__PURE__ */ jsxRuntime.jsx("b", { style: { color: totalColor(total) }, children: formatNumber(total) }),
20335
+ t.totalAfter
19167
20336
  ] }),
19168
20337
  hasTotal && hasSelected && /* @__PURE__ */ jsxRuntime.jsx(
19169
20338
  "span",
@@ -19174,8 +20343,9 @@ var STableBar = /* @__PURE__ */ react.forwardRef(function STableBar2({ title, to
19174
20343
  }
19175
20344
  ),
19176
20345
  hasSelected && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "typo-table-body whitespace-nowrap text-[var(--sys-color-fg-primary)]", children: [
19177
- /* @__PURE__ */ jsxRuntime.jsx("b", { style: { color: selectedColor(selected) }, children: selected.toLocaleString() }),
19178
- " \uAC74 \uC120\uD0DD"
20346
+ t.selectedBefore,
20347
+ /* @__PURE__ */ jsxRuntime.jsx("b", { style: { color: selectedColor(selected) }, children: formatNumber(selected) }),
20348
+ t.selectedAfter
19179
20349
  ] })
19180
20350
  ] }),
19181
20351
  actions && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-[var(--cmp-table-bar-section-gap)] has-[>div:empty]:hidden", children: [
@@ -19588,12 +20758,15 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
19588
20758
  width,
19589
20759
  disabled = false,
19590
20760
  readOnly = false,
19591
- placeholder = "\uC785\uB825\uD574 \uC8FC\uC138\uC694.",
20761
+ placeholder: placeholderProp,
19592
20762
  onBlur,
19593
20763
  className,
19594
20764
  style,
19595
20765
  ...rest
19596
20766
  }, ref) {
20767
+ const runRules2 = useRunRules();
20768
+ const { common: tc, input: ti } = useLocale().messages;
20769
+ const placeholder = placeholderProp ?? ti.placeholder;
19597
20770
  const [visible, setVisible] = react.useState(false);
19598
20771
  const [ruleError, setRuleError] = react.useState("");
19599
20772
  const controlId = useFieldControlId(rest.id);
@@ -19604,7 +20777,7 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
19604
20777
  useFormField({
19605
20778
  name: rest.name,
19606
20779
  validate: () => {
19607
- const msg = runRules(value, rules);
20780
+ const msg = runRules2(value, rules);
19608
20781
  setRuleError(msg);
19609
20782
  return msg === "";
19610
20783
  },
@@ -19669,11 +20842,11 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
19669
20842
  onChange: (e) => {
19670
20843
  onChange?.(e);
19671
20844
  onValueChange?.(e.target.value);
19672
- if (ruleError !== "") setRuleError(runRules(e.target.value, rules));
20845
+ if (ruleError !== "") setRuleError(runRules2(e.target.value, rules));
19673
20846
  },
19674
20847
  onBlur: (e) => {
19675
20848
  onBlur?.(e);
19676
- if (rules && rules.length > 0) setRuleError(runRules(e.target.value, rules));
20849
+ if (rules && rules.length > 0) setRuleError(runRules2(e.target.value, rules));
19677
20850
  },
19678
20851
  className: cn(
19679
20852
  "h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed",
@@ -19703,7 +20876,7 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
19703
20876
  {
19704
20877
  icon: "close",
19705
20878
  size: "xxs",
19706
- ariaLabel: "\uC9C0\uC6B0\uAE30",
20879
+ ariaLabel: tc.clear,
19707
20880
  className: "flex-shrink-0",
19708
20881
  onClick: () => onValueChange?.("")
19709
20882
  }
@@ -19713,7 +20886,7 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
19713
20886
  {
19714
20887
  icon: visible ? "visibilityOn" : "visibilityOff",
19715
20888
  size: "xxs",
19716
- ariaLabel: "\uBE44\uBC00\uBC88\uD638 \uD45C\uC2DC",
20889
+ ariaLabel: ti.showPassword,
19717
20890
  disabled: disabled || readOnly,
19718
20891
  className: "flex-shrink-0",
19719
20892
  onClick: () => setVisible((v) => !v)
@@ -19754,15 +20927,15 @@ var formatInputWithCommas = (value) => {
19754
20927
  const formattedInt = addCommas(intPart === "" ? "0" : intPart);
19755
20928
  return `${isNeg ? "-" : ""}${formattedInt}${hasDecimal ? `.${decPart}` : ""}`;
19756
20929
  };
19757
- var getRangeError = (value, min, max) => {
20930
+ var getRangeError = (value, min, max, t) => {
19758
20931
  if (value === null) return "";
19759
20932
  const belowMin = value < min;
19760
20933
  const aboveMax = value > max;
19761
20934
  if (!belowMin && !aboveMax) return "";
19762
20935
  if (Number.isFinite(min) && Number.isFinite(max)) {
19763
- return `${formatWithCommas(min)}~${formatWithCommas(max)} \uC0AC\uC774\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694.`;
20936
+ return t.rangeBetween(formatWithCommas(min), formatWithCommas(max));
19764
20937
  }
19765
- return belowMin ? `${formatWithCommas(min)} \uC774\uC0C1\uC73C\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694.` : `${formatWithCommas(max)} \uC774\uD558\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694.`;
20938
+ return belowMin ? t.atLeast(formatWithCommas(min)) : t.atMost(formatWithCommas(max));
19766
20939
  };
19767
20940
  var getDecimalLimit = (allowDecimal, maxDecimalLength) => {
19768
20941
  if (!allowDecimal || maxDecimalLength === void 0 || !Number.isFinite(maxDecimalLength)) {
@@ -19806,7 +20979,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
19806
20979
  onFocus,
19807
20980
  onBlur,
19808
20981
  name,
19809
- placeholder = "\uC785\uB825\uD574 \uC8FC\uC138\uC694.",
20982
+ placeholder: placeholderProp,
19810
20983
  disabled = false,
19811
20984
  readOnly = false,
19812
20985
  rules,
@@ -19830,6 +21003,9 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
19830
21003
  className,
19831
21004
  style
19832
21005
  }, ref) {
21006
+ const runRules2 = useRunRules();
21007
+ const { input: ti, numberInput: t } = useLocale().messages;
21008
+ const placeholder = placeholderProp ?? ti.placeholder;
19833
21009
  const p = PAD2[size];
19834
21010
  const padX = `var(--cmp-numberInput-${size}-paddingX)`;
19835
21011
  const decimalLimit = getDecimalLimit(allowDecimal, maxDecimalLength);
@@ -19853,9 +21029,9 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
19853
21029
  useFormField({
19854
21030
  name,
19855
21031
  validate: () => {
19856
- const msg = runRules(numValue, rules);
21032
+ const msg = runRules2(numValue, rules);
19857
21033
  setRuleError(msg);
19858
- const range = clampOnBlur ? "" : getRangeError(numValue, min, max);
21034
+ const range = clampOnBlur ? "" : getRangeError(numValue, min, max, t);
19859
21035
  setRangeError(range);
19860
21036
  return msg === "" && range === "";
19861
21037
  },
@@ -19958,7 +21134,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
19958
21134
  type: "button",
19959
21135
  tabIndex: -1,
19960
21136
  disabled: off,
19961
- "aria-label": dir === "inc" ? "\uC99D\uAC00" : "\uAC10\uC18C",
21137
+ "aria-label": dir === "inc" ? t.increase : t.decrease,
19962
21138
  onClick: dir === "inc" ? increment : decrement,
19963
21139
  className: cn(
19964
21140
  "flex flex-shrink-0 items-center justify-center border border-solid border-transparent transition-colors",
@@ -20050,8 +21226,8 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
20050
21226
  const clamped = !clampOnBlur || n === null ? n : Math.min(Math.max(n, min), max);
20051
21227
  if (clamped !== n) emit3(clamped);
20052
21228
  else setDisplay(n === null ? "" : formatInputWithCommas(cleaned));
20053
- if (rules && rules.length > 0) setRuleError(runRules(clamped, rules));
20054
- setRangeError(clampOnBlur ? "" : getRangeError(clamped, min, max));
21229
+ if (rules && rules.length > 0) setRuleError(runRules2(clamped, rules));
21230
+ setRangeError(clampOnBlur ? "" : getRangeError(clamped, min, max, t));
20055
21231
  onBlur?.(e);
20056
21232
  },
20057
21233
  className: cn(
@@ -20229,6 +21405,7 @@ function SCalendar({
20229
21405
  className,
20230
21406
  style
20231
21407
  }) {
21408
+ const t = useLocale().messages.date;
20232
21409
  const today = todayStr();
20233
21410
  const base = value || today;
20234
21411
  const [y, setY] = react.useState(() => Number(base.split("-")[0]));
@@ -20297,7 +21474,7 @@ function SCalendar({
20297
21474
  {
20298
21475
  icon: "chevronLeft",
20299
21476
  size: "xxs",
20300
- ariaLabel: "prevYear",
21477
+ ariaLabel: t.prevYear,
20301
21478
  onClick: () => view(y - 1, m)
20302
21479
  }
20303
21480
  ),
@@ -20307,7 +21484,7 @@ function SCalendar({
20307
21484
  {
20308
21485
  icon: "chevronRight",
20309
21486
  size: "xxs",
20310
- ariaLabel: "nextYear",
21487
+ ariaLabel: t.nextYear,
20311
21488
  onClick: () => view(y + 1, m)
20312
21489
  }
20313
21490
  )
@@ -20319,23 +21496,20 @@ function SCalendar({
20319
21496
  {
20320
21497
  icon: "chevronLeft",
20321
21498
  size: "xxs",
20322
- ariaLabel: "prevMonth",
21499
+ ariaLabel: t.prevMonth,
20323
21500
  onClick: () => {
20324
21501
  const n = calcYearMonth(y, m, "prev");
20325
21502
  view(n.year, n.month);
20326
21503
  }
20327
21504
  }
20328
21505
  ),
20329
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex w-full min-w-[40px] items-center justify-center text-center typo-field-md-medium", children: [
20330
- m,
20331
- "\uC6D4"
20332
- ] }),
21506
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex w-full min-w-[40px] items-center justify-center text-center typo-field-md-medium", children: t.monthLabel(m) }),
20333
21507
  /* @__PURE__ */ jsxRuntime.jsx(
20334
21508
  SGhostButton,
20335
21509
  {
20336
21510
  icon: "chevronRight",
20337
21511
  size: "xxs",
20338
- ariaLabel: "nextMonth",
21512
+ ariaLabel: t.nextMonth,
20339
21513
  onClick: () => {
20340
21514
  const n = calcYearMonth(y, m, "next");
20341
21515
  view(n.year, n.month);
@@ -20344,7 +21518,7 @@ function SCalendar({
20344
21518
  )
20345
21519
  ] })
20346
21520
  ] }),
20347
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-7", children: WEEK_LABELS.map((label) => /* @__PURE__ */ jsxRuntime.jsx(
21521
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-7", children: t.weekdays.map((label) => /* @__PURE__ */ jsxRuntime.jsx(
20348
21522
  "span",
20349
21523
  {
20350
21524
  className: "flex h-[20px] items-center justify-center text-[12px] font-normal text-[color:var(--cmp-datepicker-calendar-week-color)]",
@@ -20436,11 +21610,6 @@ var modeListItemClass = (selected, disabled) => cn(
20436
21610
  !disabled && !selected && "typo-field-sm-medium cursor-pointer bg-[var(--cmp-datepicker-mode-item-bg-default)] text-[color:var(--cmp-datepicker-mode-item-content-default)] hover:bg-[var(--cmp-datepicker-mode-item-bg-hover)] hover:text-[color:var(--cmp-datepicker-mode-item-content-hover)]",
20437
21611
  !disabled && selected && "typo-field-sm-bold cursor-pointer bg-[var(--cmp-datepicker-mode-item-bg-default)] text-[color:var(--cmp-datepicker-mode-item-content-selected)]"
20438
21612
  );
20439
- var MODE_NOUN = {
20440
- date: "\uB0A0\uC9DC",
20441
- month: "\uC6D4",
20442
- year: "\uC5F0\uB3C4"
20443
- };
20444
21613
  var YEAR_LIST_EDGE_BUFFER = 24;
20445
21614
  var YEAR_LIST_EXPAND_SIZE = 80;
20446
21615
  var MONTHS = Array.from({ length: 12 }, (_, i) => i + 1);
@@ -20594,6 +21763,7 @@ function SDatePickerYearListbox({
20594
21763
  );
20595
21764
  }
20596
21765
  function MonthWheel({ year, value, selectable, onCommit }) {
21766
+ const t = useLocale().messages.date;
20597
21767
  const listRef = react.useRef(null);
20598
21768
  const initialValueRef = react.useRef(value);
20599
21769
  react.useLayoutEffect(() => {
@@ -20614,7 +21784,7 @@ function MonthWheel({ year, value, selectable, onCommit }) {
20614
21784
  children: MONTHS.map((month) => {
20615
21785
  const selected = month === value;
20616
21786
  const disabled = isMonthDisabled(year, month, selectable);
20617
- return /* @__PURE__ */ jsxRuntime.jsxs(
21787
+ return /* @__PURE__ */ jsxRuntime.jsx(
20618
21788
  "button",
20619
21789
  {
20620
21790
  type: "button",
@@ -20623,10 +21793,7 @@ function MonthWheel({ year, value, selectable, onCommit }) {
20623
21793
  disabled,
20624
21794
  className: modeListItemClass(selected, disabled),
20625
21795
  onClick: () => !disabled && onCommit(month),
20626
- children: [
20627
- month,
20628
- "\uC6D4"
20629
- ]
21796
+ children: t.monthLabel(month)
20630
21797
  },
20631
21798
  month
20632
21799
  );
@@ -20723,6 +21890,8 @@ function SDatePicker({
20723
21890
  className,
20724
21891
  style
20725
21892
  }) {
21893
+ const runRules2 = useRunRules();
21894
+ const t = useLocale().messages.date;
20726
21895
  const portalContainer = usePortalContainer();
20727
21896
  const [open, setOpen] = react.useState(false);
20728
21897
  const triggerId = useFieldControlId();
@@ -20731,11 +21900,16 @@ function SDatePicker({
20731
21900
  const [ruleError, setRuleError] = react.useState("");
20732
21901
  const hasValue = value != null && value !== "";
20733
21902
  const weekday = showWeekday && mode === "date";
21903
+ const clearLabel = {
21904
+ date: t.clearDate,
21905
+ month: t.clearMonth,
21906
+ year: t.clearYear
21907
+ };
20734
21908
  const resolvedPlaceholder = placeholder ?? (mode === "year" ? "YYYY" : mode === "month" ? "YYYY-MM" : "YYYY-MM-DD");
20735
21909
  useFormField({
20736
21910
  name,
20737
21911
  validate: () => {
20738
- const msg = runRules(value, rules);
21912
+ const msg = runRules2(value, rules);
20739
21913
  setRuleError(msg);
20740
21914
  return msg === "";
20741
21915
  },
@@ -20769,7 +21943,7 @@ function SDatePicker({
20769
21943
  typo: "typo-field-sm-default",
20770
21944
  radius: "var(--cmp-datepicker-sm-radius)"
20771
21945
  };
20772
- const weekdayW = weekday ? weekdaySuffixWidth(baseDims.fontSize) : 0;
21946
+ const weekdayW = weekday ? weekdaySuffixWidth(baseDims.fontSize, t) : 0;
20773
21947
  const dims = {
20774
21948
  ...baseDims,
20775
21949
  minW: baseDims.minW + weekdayW,
@@ -20778,16 +21952,16 @@ function SDatePicker({
20778
21952
  };
20779
21953
  const select = (date) => {
20780
21954
  onValueChange?.(date);
20781
- if (rules && rules.length > 0) setRuleError(runRules(date, rules));
21955
+ if (rules && rules.length > 0) setRuleError(runRules2(date, rules));
20782
21956
  setOpen(false);
20783
21957
  };
20784
21958
  const clear = () => {
20785
21959
  onValueChange?.(null);
20786
- if (rules && rules.length > 0) setRuleError(runRules(null, rules));
21960
+ if (rules && rules.length > 0) setRuleError(runRules2(null, rules));
20787
21961
  };
20788
21962
  const selectListboxValue = (nextValue) => {
20789
21963
  onValueChange?.(nextValue);
20790
- if (rules && rules.length > 0) setRuleError(runRules(nextValue, rules));
21964
+ if (rules && rules.length > 0) setRuleError(runRules2(nextValue, rules));
20791
21965
  };
20792
21966
  return /* @__PURE__ */ jsxRuntime.jsx(
20793
21967
  SField,
@@ -20858,7 +22032,7 @@ function SDatePicker({
20858
22032
  minWidth: dims.minW,
20859
22033
  color: disabled ? "var(--cmp-datepicker-text-disabled)" : hasValue ? "var(--cmp-datepicker-text-default)" : "var(--cmp-field-hint-color)"
20860
22034
  },
20861
- children: hasValue ? weekday ? withWeekday(value) : value : resolvedPlaceholder
22035
+ children: hasValue ? weekday ? withWeekday(value, t) : value : resolvedPlaceholder
20862
22036
  }
20863
22037
  ),
20864
22038
  clearable && hasValue && !disabled && /* @__PURE__ */ jsxRuntime.jsx(
@@ -20866,7 +22040,7 @@ function SDatePicker({
20866
22040
  {
20867
22041
  icon: "close",
20868
22042
  size: "xxs",
20869
- ariaLabel: `${MODE_NOUN[mode]} \uC9C0\uC6B0\uAE30`,
22043
+ ariaLabel: clearLabel[mode],
20870
22044
  onClick: (event) => {
20871
22045
  event.stopPropagation();
20872
22046
  clear();
@@ -20935,6 +22109,7 @@ function RangeCalendar({
20935
22109
  onPendingStartChange,
20936
22110
  onViewChange
20937
22111
  }) {
22112
+ const t = useLocale().messages.date;
20938
22113
  const today = todayStr();
20939
22114
  const initial = splitDateTime(value?.[0]);
20940
22115
  const base = initial.date || today;
@@ -21005,8 +22180,8 @@ function RangeCalendar({
21005
22180
  const RANGE_BG = "var(--cmp-datepicker-calendar-range-bg)";
21006
22181
  const pad = (v) => String(Number(v) || 0).padStart(2, "0");
21007
22182
  const emit3 = (dateStart, dateEnd, time) => {
21008
- const t = time ?? { sH, sM, eH, eM };
21009
- const range = showTimePicker ? [`${dateStart} ${pad(t.sH)}:${pad(t.sM)}`, `${dateEnd} ${pad(t.eH)}:${pad(t.eM)}`] : [dateStart, dateEnd];
22183
+ const t2 = time ?? { sH, sM, eH, eM };
22184
+ const range = showTimePicker ? [`${dateStart} ${pad(t2.sH)}:${pad(t2.sM)}`, `${dateEnd} ${pad(t2.eH)}:${pad(t2.eM)}`] : [dateStart, dateEnd];
21010
22185
  lastEmitted.current = JSON.stringify(range);
21011
22186
  onSelect(range);
21012
22187
  };
@@ -21061,7 +22236,7 @@ function RangeCalendar({
21061
22236
  {
21062
22237
  icon: "chevronLeft",
21063
22238
  size: "xxs",
21064
- ariaLabel: "prevMonth",
22239
+ ariaLabel: t.prevMonth,
21065
22240
  onClick: goPrevMonth,
21066
22241
  className: cn(!isLeft && "invisible pointer-events-none")
21067
22242
  }
@@ -21076,13 +22251,13 @@ function RangeCalendar({
21076
22251
  {
21077
22252
  icon: "chevronRight",
21078
22253
  size: "xxs",
21079
- ariaLabel: "nextMonth",
22254
+ ariaLabel: t.nextMonth,
21080
22255
  onClick: goNextMonth,
21081
22256
  className: cn(isLeft && "invisible pointer-events-none")
21082
22257
  }
21083
22258
  )
21084
22259
  ] }),
21085
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: GRID_COLS, children: WEEK_LABELS.map((l) => /* @__PURE__ */ jsxRuntime.jsx(
22260
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: GRID_COLS, children: t.weekdays.map((l) => /* @__PURE__ */ jsxRuntime.jsx(
21086
22261
  "span",
21087
22262
  {
21088
22263
  className: "flex h-[20px] items-center justify-center text-[12px] font-normal text-[color:var(--cmp-datepicker-calendar-week-color)]",
@@ -21147,11 +22322,11 @@ function RangeCalendar({
21147
22322
  children: [
21148
22323
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-time-date-gap)]", children: [
21149
22324
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: LABEL, children: num(yy, false) }),
21150
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: UNIT, children: "\uB144" }),
22325
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: UNIT, children: t.unitYear }),
21151
22326
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: LABEL, children: num(mm, true) }),
21152
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: UNIT, children: "\uC6D4" }),
22327
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: UNIT, children: t.unitMonth }),
21153
22328
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: LABEL, children: num(dd, true) }),
21154
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: UNIT, children: "\uC77C" })
22329
+ t.unitDay && /* @__PURE__ */ jsxRuntime.jsx("span", { className: UNIT, children: t.unitDay })
21155
22330
  ] }),
21156
22331
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-time-unit-gap)]", children: [
21157
22332
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -21160,7 +22335,7 @@ function RangeCalendar({
21160
22335
  type: "text",
21161
22336
  inputMode: "numeric",
21162
22337
  maxLength: 2,
21163
- "aria-label": `${suffix} \uC2DC`,
22338
+ "aria-label": t.hourAria(suffix),
21164
22339
  disabled: !active,
21165
22340
  value: active ? hour : "",
21166
22341
  placeholder: "--",
@@ -21176,7 +22351,7 @@ function RangeCalendar({
21176
22351
  type: "text",
21177
22352
  inputMode: "numeric",
21178
22353
  maxLength: 2,
21179
- "aria-label": `${suffix} \uBD84`,
22354
+ "aria-label": t.minuteAria(suffix),
21180
22355
  disabled: !active,
21181
22356
  value: active ? minute : "",
21182
22357
  placeholder: "--",
@@ -21204,9 +22379,17 @@ function RangeCalendar({
21204
22379
  children: [
21205
22380
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center", children: [
21206
22381
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-[var(--cmp-datepicker-calendar-gap)] typo-field-md-medium", children: [
21207
- /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "chevronLeft", size: "xxs", ariaLabel: "prevYear", onClick: goPrevYear }),
22382
+ /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "chevronLeft", size: "xxs", ariaLabel: t.prevYear, onClick: goPrevYear }),
21208
22383
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex min-w-[40px] items-center justify-center text-center", children: y }),
21209
- /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "chevronRight", size: "xxs", ariaLabel: "nextYear", onClick: goNextYear })
22384
+ /* @__PURE__ */ jsxRuntime.jsx(
22385
+ SGhostButton,
22386
+ {
22387
+ icon: "chevronRight",
22388
+ size: "xxs",
22389
+ ariaLabel: t.nextYear,
22390
+ onClick: goNextYear
22391
+ }
22392
+ )
21210
22393
  ] }),
21211
22394
  /* @__PURE__ */ jsxRuntime.jsx(
21212
22395
  "button",
@@ -21214,7 +22397,7 @@ function RangeCalendar({
21214
22397
  type: "button",
21215
22398
  onClick: goToday,
21216
22399
  className: "absolute right-0 h-[24px] min-w-[37px] cursor-pointer bg-transparent text-center text-[12px] font-medium leading-[24px] text-[color:var(--cmp-datepicker-calendar-day-default-text)] hover:underline",
21217
- children: "\uC624\uB298"
22400
+ children: t.today
21218
22401
  }
21219
22402
  )
21220
22403
  ] }),
@@ -21235,8 +22418,8 @@ function RangeCalendar({
21235
22418
  showTimePicker && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
21236
22419
  /* @__PURE__ */ jsxRuntime.jsx(SDivider, {}),
21237
22420
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-[var(--cmp-datepicker-calendar-time-gap)]", children: [
21238
- renderTimeSection("start", start, "\uBD80\uD130"),
21239
- renderTimeSection("end", end, "\uAE4C\uC9C0")
22421
+ renderTimeSection("start", start, t.rangeFrom),
22422
+ renderTimeSection("end", end, t.rangeTo)
21240
22423
  ] })
21241
22424
  ] })
21242
22425
  ]
@@ -21276,6 +22459,8 @@ function SDateRangePicker({
21276
22459
  className,
21277
22460
  style
21278
22461
  }) {
22462
+ const runRules2 = useRunRules();
22463
+ const t = useLocale().messages.date;
21279
22464
  const portalContainer = usePortalContainer();
21280
22465
  const [open, setOpen] = react.useState(false);
21281
22466
  const triggerId = useFieldControlId();
@@ -21286,12 +22471,12 @@ function SDateRangePicker({
21286
22471
  const hasDisplay = pendingStart != null || hasValue;
21287
22472
  const rawStart = pendingStart ?? (hasValue ? value[0] : "");
21288
22473
  const rawEnd = pendingStart ? "" : hasValue ? value[1] : "";
21289
- const startText = showWeekday && rawStart ? withWeekday(rawStart) : rawStart;
21290
- const endText = showWeekday && rawEnd ? withWeekday(rawEnd) : rawEnd;
22474
+ const startText = showWeekday && rawStart ? withWeekday(rawStart, t) : rawStart;
22475
+ const endText = showWeekday && rawEnd ? withWeekday(rawEnd, t) : rawEnd;
21291
22476
  useFormField({
21292
22477
  name,
21293
22478
  validate: () => {
21294
- const msg = runRules(value, rules);
22479
+ const msg = runRules2(value, rules);
21295
22480
  setRuleError(msg);
21296
22481
  return msg === "";
21297
22482
  },
@@ -21324,7 +22509,7 @@ function SDateRangePicker({
21324
22509
  typo: "typo-field-sm-default",
21325
22510
  radius: "var(--cmp-datepicker-sm-radius)"
21326
22511
  };
21327
- const weekdayW = showWeekday ? weekdaySuffixWidth(baseDims.fontSize) * 2 : 0;
22512
+ const weekdayW = showWeekday ? weekdaySuffixWidth(baseDims.fontSize, t) * 2 : 0;
21328
22513
  const dims = {
21329
22514
  ...baseDims,
21330
22515
  minW: baseDims.minW + weekdayW,
@@ -21334,13 +22519,13 @@ function SDateRangePicker({
21334
22519
  const select = (r3) => {
21335
22520
  setPendingStart(null);
21336
22521
  onValueChange?.(r3);
21337
- if (rules && rules.length > 0) setRuleError(runRules(r3, rules));
22522
+ if (rules && rules.length > 0) setRuleError(runRules2(r3, rules));
21338
22523
  if (!showTimePicker) setOpen(false);
21339
22524
  };
21340
22525
  const clear = () => {
21341
22526
  setPendingStart(null);
21342
22527
  onValueChange?.(null);
21343
- if (rules && rules.length > 0) setRuleError(runRules(null, rules));
22528
+ if (rules && rules.length > 0) setRuleError(runRules2(null, rules));
21344
22529
  };
21345
22530
  const resolvedPlaceholder = showTimePicker && placeholder === "YYYY-MM-DD ~ YYYY-MM-DD" ? "YYYY-MM-DD HH:mm ~ YYYY-MM-DD HH:mm" : placeholder;
21346
22531
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -21435,7 +22620,7 @@ function SDateRangePicker({
21435
22620
  {
21436
22621
  icon: "close",
21437
22622
  size: "xxs",
21438
- ariaLabel: "\uAE30\uAC04 \uC9C0\uC6B0\uAE30",
22623
+ ariaLabel: t.clearPeriod,
21439
22624
  onClick: (event) => {
21440
22625
  event.stopPropagation();
21441
22626
  clear();
@@ -21503,6 +22688,7 @@ var SChipImpl = /* @__PURE__ */ react.forwardRef(function SChip({
21503
22688
  className,
21504
22689
  style
21505
22690
  }, ref) {
22691
+ const runRules2 = useRunRules();
21506
22692
  const [editing, setEditing] = react.useState(false);
21507
22693
  const [error, setError] = react.useState(errorProp);
21508
22694
  const inputRef = react.useRef(null);
@@ -21543,7 +22729,7 @@ var SChipImpl = /* @__PURE__ */ react.forwardRef(function SChip({
21543
22729
  const changed = next !== draftRef.current;
21544
22730
  setEditing(false);
21545
22731
  if (changed) onValueChange?.(next);
21546
- if (rules && rules.length > 0) setError(runRules(next, rules) !== "");
22732
+ if (rules && rules.length > 0) setError(runRules2(next, rules) !== "");
21547
22733
  onBlur?.();
21548
22734
  };
21549
22735
  const cancel = () => {
@@ -21674,6 +22860,7 @@ function SFilePicker({
21674
22860
  className,
21675
22861
  style
21676
22862
  }) {
22863
+ const runRules2 = useRunRules();
21677
22864
  const autoId = react.useId();
21678
22865
  const resolvedName = name ?? autoId;
21679
22866
  const triggerId = `${autoId}-trigger`;
@@ -21689,7 +22876,7 @@ function SFilePicker({
21689
22876
  useFormField({
21690
22877
  name,
21691
22878
  validate: () => {
21692
- const msg = runRules(files, rules);
22879
+ const msg = runRules2(files, rules);
21693
22880
  setRuleError(msg);
21694
22881
  return msg === "";
21695
22882
  },
@@ -21721,7 +22908,7 @@ function SFilePicker({
21721
22908
  }
21722
22909
  const merged = [...existing, ...accepted];
21723
22910
  onValueChange?.(merged);
21724
- if (rules?.length) setRuleError(runRules(merged, rules));
22911
+ if (rules?.length) setRuleError(runRules2(merged, rules));
21725
22912
  } else {
21726
22913
  const { accepted, rejected, reason } = validate(arr);
21727
22914
  if (reason) {
@@ -21729,7 +22916,7 @@ function SFilePicker({
21729
22916
  return;
21730
22917
  }
21731
22918
  onValueChange?.(accepted[0]);
21732
- if (rules?.length) setRuleError(runRules(accepted[0], rules));
22919
+ if (rules?.length) setRuleError(runRules2(accepted[0], rules));
21733
22920
  }
21734
22921
  };
21735
22922
  const clear = (e) => {
@@ -21889,6 +23076,7 @@ function SKeyValueTable({
21889
23076
  className,
21890
23077
  style
21891
23078
  }) {
23079
+ const tc = useLocale().messages.common;
21892
23080
  if (fields.length === 0) return null;
21893
23081
  const emit3 = (name, value) => onChange?.({
21894
23082
  name,
@@ -22066,7 +23254,7 @@ function SKeyValueTable({
22066
23254
  {
22067
23255
  className: "flex flex-shrink-0 items-center justify-center border-l border-solid border-[color:var(--cmp-table-border-color)] px-[var(--cmp-table-keyValue-search-paddingX)]",
22068
23256
  style: { background: "var(--cmp-table-keyValue-search-bg)" },
22069
- children: /* @__PURE__ */ jsxRuntime.jsx(SButton, { color: "neutral", outline: true, size: "md", label: "\uAC80\uC0C9", onClick: () => onSearch?.() })
23257
+ children: /* @__PURE__ */ jsxRuntime.jsx(SButton, { color: "neutral", outline: true, size: "md", label: tc.search, onClick: () => onSearch?.() })
22070
23258
  }
22071
23259
  )
22072
23260
  ] });
@@ -22360,6 +23548,7 @@ function ChartRotatedCategoryLabels({
22360
23548
  );
22361
23549
  }
22362
23550
  var ChartFrame = /* @__PURE__ */ react.forwardRef(function ChartFrame2({ title, unit, legend, legendPosition = "top", children, className, style, ...props }, ref) {
23551
+ const t = useLocale().messages.chart;
22363
23552
  return /* @__PURE__ */ jsxRuntime.jsxs(
22364
23553
  "div",
22365
23554
  {
@@ -22375,10 +23564,7 @@ var ChartFrame = /* @__PURE__ */ react.forwardRef(function ChartFrame2({ title,
22375
23564
  (title || unit) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-(--cmp-chart-gap)", children: [
22376
23565
  title && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-md-medium text-(--cmp-chart-title-color)", children: title }),
22377
23566
  unit && // ml-auto — title 유무와 관계없이 항상 오른쪽 끝에 붙는다.
22378
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto whitespace-nowrap typo-body-sm-default text-(--cmp-chart-unit-color)", children: [
22379
- "\uB2E8\uC704 : ",
22380
- unit
22381
- ] })
23567
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto whitespace-nowrap typo-body-sm-default text-(--cmp-chart-unit-color)", children: t.unit(unit) })
22382
23568
  ] }),
22383
23569
  legend && legendPosition === "top" && legend,
22384
23570
  children,
@@ -22722,6 +23908,7 @@ var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
22722
23908
  className,
22723
23909
  style
22724
23910
  }, ref) {
23911
+ const t = useLocale().messages.chart;
22725
23912
  const vertical = direction === "vertical";
22726
23913
  const rotateLabels = rotateCategoryLabels && vertical;
22727
23914
  const { ref: plotRef, size } = useElementSize();
@@ -23099,7 +24286,7 @@ var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
23099
24286
  width: size.width,
23100
24287
  height: size.height,
23101
24288
  role: "img",
23102
- "aria-label": `${categories.length}\uAC1C \uD56D\uBAA9, ${series.length}\uAC1C \uACC4\uC5F4 ${stacked ? "\uB204\uC801 " : ""}\uB9C9\uB300 \uADF8\uB798\uD504`,
24289
+ "aria-label": t.barSummary(categories.length, series.length, !!stacked),
23103
24290
  children: [
23104
24291
  /* @__PURE__ */ jsxRuntime.jsx(
23105
24292
  "text",
@@ -23349,6 +24536,7 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
23349
24536
  className,
23350
24537
  style
23351
24538
  }, ref) {
24539
+ const t = useLocale().messages.chart;
23352
24540
  const smooth = curve === "smooth";
23353
24541
  const { ref: plotRef, size } = useElementSize();
23354
24542
  const { ref: axisTextRef, size: axisText } = useElementSize(rotateCategoryLabels);
@@ -23675,7 +24863,7 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
23675
24863
  height: size.height,
23676
24864
  overflow: "visible",
23677
24865
  role: "img",
23678
- "aria-label": `${categories.length}\uAC1C \uD56D\uBAA9, ${series.length}\uAC1C \uACC4\uC5F4 ${stacked ? "\uB204\uC801 " : ""}\uAEBE\uC740\uC120 \uADF8\uB798\uD504`,
24866
+ "aria-label": t.lineSummary(categories.length, series.length, !!stacked),
23679
24867
  children: [
23680
24868
  /* @__PURE__ */ jsxRuntime.jsx(
23681
24869
  "text",
@@ -23859,6 +25047,7 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
23859
25047
  innerRatio,
23860
25048
  kind
23861
25049
  }, ref) {
25050
+ const t = useLocale().messages.chart;
23862
25051
  const { ref: plotRef, size } = useElementSize();
23863
25052
  const [hovered, setHovered] = react.useState(null);
23864
25053
  const arcs = react.useMemo(() => {
@@ -23937,7 +25126,7 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
23937
25126
  height: diameter,
23938
25127
  overflow: "visible",
23939
25128
  role: "img",
23940
- "aria-label": `${arcs.length}\uAC1C \uD56D\uBAA9 ${kind}`,
25129
+ "aria-label": t.radialSummary(arcs.length, t[kind]),
23941
25130
  onMouseLeave: () => setHovered(null),
23942
25131
  children: [
23943
25132
  arcs.length === 0 ? (
@@ -24051,7 +25240,7 @@ var SPieChart = /* @__PURE__ */ react.forwardRef(function SPieChart2({
24051
25240
  legendPosition,
24052
25241
  showTooltip,
24053
25242
  innerRatio: 0,
24054
- kind: "\uD30C\uC774 \uADF8\uB798\uD504"
25243
+ kind: "pie"
24055
25244
  }
24056
25245
  );
24057
25246
  });
@@ -24076,7 +25265,7 @@ var SDonutChart = /* @__PURE__ */ react.forwardRef(function SDonutChart2({
24076
25265
  legendVariant,
24077
25266
  showTooltip,
24078
25267
  innerRatio: DONUT_INNER_RATIO,
24079
- kind: "\uB3C4\uB11B \uADF8\uB798\uD504"
25268
+ kind: "donut"
24080
25269
  }
24081
25270
  );
24082
25271
  });
@@ -24536,7 +25725,9 @@ var SSkeleton = /* @__PURE__ */ react.forwardRef(function SSkeleton2({
24536
25725
  }
24537
25726
  );
24538
25727
  });
24539
- var STimelineImpl = /* @__PURE__ */ react.forwardRef(function STimeline({ groups, emptyText = "\uB0B4\uC5ED\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.", className, ...rest }, ref) {
25728
+ var STimelineImpl = /* @__PURE__ */ react.forwardRef(function STimeline({ groups, emptyText: emptyTextProp, className, ...rest }, ref) {
25729
+ const t = useLocale().messages.timeline;
25730
+ const emptyText = emptyTextProp === void 0 ? t.empty : emptyTextProp;
24540
25731
  const filled = groups.filter((group) => group.entries.length > 0);
24541
25732
  if (filled.length === 0) {
24542
25733
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -25421,14 +26612,14 @@ var SEDITOR_HEADING_LABELS = {
25421
26612
  var SEDITOR_FONT_SIZES = [8, 9, 10, 11, 12, 14, 16, 18, 24, 30, 36, 48, 60, 72];
25422
26613
  var SEDITOR_DEFAULT_FONT_SIZE = 12;
25423
26614
  var SEDITOR_DEFAULT_COLORS = [
25424
- { label: "\uAE30\uBCF8", color: "var(--color-fg-primary)" },
25425
- { label: "\uBCF4\uC870", color: "var(--color-fg-secondary)" },
25426
- { label: "\uD750\uB9BC", color: "var(--color-fg-tertiary)" },
25427
- { label: "\uAC15\uC870", color: "var(--color-fg-accent)" },
25428
- { label: "\uBE0C\uB79C\uB4DC", color: "var(--color-fg-brand)" },
25429
- { label: "\uC131\uACF5", color: "var(--color-fg-success)" },
25430
- { label: "\uC8FC\uC758", color: "var(--color-fg-warning)" },
25431
- { label: "\uC704\uD5D8", color: "var(--color-fg-danger)" }
26615
+ { key: "colorDefault", label: "\uAE30\uBCF8", color: "var(--color-fg-primary)" },
26616
+ { key: "colorSecondary", label: "\uBCF4\uC870", color: "var(--color-fg-secondary)" },
26617
+ { key: "colorMuted", label: "\uD750\uB9BC", color: "var(--color-fg-tertiary)" },
26618
+ { key: "colorAccent", label: "\uAC15\uC870", color: "var(--color-fg-accent)" },
26619
+ { key: "colorBrand", label: "\uBE0C\uB79C\uB4DC", color: "var(--color-fg-brand)" },
26620
+ { key: "colorSuccess", label: "\uC131\uACF5", color: "var(--color-fg-success)" },
26621
+ { key: "colorWarning", label: "\uC8FC\uC758", color: "var(--color-fg-warning)" },
26622
+ { key: "colorDanger", label: "\uC704\uD5D8", color: "var(--color-fg-danger)" }
25432
26623
  ];
25433
26624
  var TASK_LIST_CLASS = "sd-editor-task-list";
25434
26625
  var TASK_ITEM_CLASS = "sd-editor-task-item";
@@ -25569,7 +26760,6 @@ var scrollMenuClass = cn(
25569
26760
  FLOATING_SLIDE_ANIM,
25570
26761
  SCROLLBAR_CLASS
25571
26762
  );
25572
- var FONT_SIZE_DEFAULT_LABEL = "\uAE30\uBCF8";
25573
26763
  var FONT_SIZE_MENU_MAX_HEIGHT = "min(280px, var(--radix-dropdown-menu-content-available-height))";
25574
26764
  var swatchClass = cn(
25575
26765
  "flex h-[24px] w-[24px] cursor-pointer items-center justify-center rounded-[4px] outline-none",
@@ -25637,6 +26827,7 @@ var TableSizePicker = ({
25637
26827
  disabled,
25638
26828
  onPick
25639
26829
  }) => {
26830
+ const t = useLocale().messages.editor;
25640
26831
  const [size, setSize] = react.useState({ rows: 1, cols: 1 });
25641
26832
  const gridRef = react.useRef(null);
25642
26833
  react.useEffect(() => {
@@ -25655,7 +26846,7 @@ var TableSizePicker = ({
25655
26846
  {
25656
26847
  ref: gridRef,
25657
26848
  role: "grid",
25658
- "aria-label": "\uD45C \uD06C\uAE30",
26849
+ "aria-label": t.tableSize,
25659
26850
  "aria-disabled": disabled || void 0,
25660
26851
  tabIndex: disabled ? -1 : 0,
25661
26852
  className: cn("flex flex-col outline-none", disabled && "pointer-events-none opacity-40"),
@@ -25687,7 +26878,7 @@ var TableSizePicker = ({
25687
26878
  {
25688
26879
  type: "button",
25689
26880
  role: "gridcell",
25690
- "aria-label": `${r3 + 1}\uD589 ${c + 1}\uC5F4`,
26881
+ "aria-label": t.tableCell(r3 + 1, c + 1),
25691
26882
  "aria-selected": on,
25692
26883
  tabIndex: -1,
25693
26884
  className: "box-border cursor-pointer rounded-[3px] border border-solid p-0 outline-none",
@@ -25706,17 +26897,12 @@ var TableSizePicker = ({
25706
26897
  }) }, r3))
25707
26898
  }
25708
26899
  ),
25709
- /* @__PURE__ */ jsxRuntime.jsxs(
26900
+ /* @__PURE__ */ jsxRuntime.jsx(
25710
26901
  "div",
25711
26902
  {
25712
26903
  "aria-live": "polite",
25713
26904
  className: "mt-[6px] text-center text-[12px] leading-[20px] text-[color:var(--sys-color-fg-secondary)]",
25714
- children: [
25715
- size.rows,
25716
- "\uD589 \xD7 ",
25717
- size.cols,
25718
- "\uC5F4"
25719
- ]
26905
+ children: t.tableSizeText(size.rows, size.cols)
25720
26906
  }
25721
26907
  )
25722
26908
  ] });
@@ -25740,27 +26926,30 @@ var LinkEditor = ({
25740
26926
  onApply,
25741
26927
  onRemove,
25742
26928
  hasLink
25743
- }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-[8px]", children: [
25744
- /* @__PURE__ */ jsxRuntime.jsx(
25745
- SInput,
25746
- {
25747
- value: href,
25748
- onValueChange: onHrefChange,
25749
- type: "url",
25750
- placeholder: "https://",
25751
- width: "md",
25752
- "aria-label": "\uB9C1\uD06C \uC8FC\uC18C",
25753
- onKeyDown: (e) => {
25754
- if (e.key === "Enter") {
25755
- e.preventDefault();
25756
- onApply();
26929
+ }) => {
26930
+ const t = useLocale().messages.editor;
26931
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-[8px]", children: [
26932
+ /* @__PURE__ */ jsxRuntime.jsx(
26933
+ SInput,
26934
+ {
26935
+ value: href,
26936
+ onValueChange: onHrefChange,
26937
+ type: "url",
26938
+ placeholder: "https://",
26939
+ width: "md",
26940
+ "aria-label": t.linkUrl,
26941
+ onKeyDown: (e) => {
26942
+ if (e.key === "Enter") {
26943
+ e.preventDefault();
26944
+ onApply();
26945
+ }
25757
26946
  }
25758
26947
  }
25759
- }
25760
- ),
25761
- /* @__PURE__ */ jsxRuntime.jsx(SButton, { size: "sm", label: "\uC801\uC6A9", onClick: onApply }),
25762
- hasLink && /* @__PURE__ */ jsxRuntime.jsx(SButton, { size: "sm", color: "neutral", outline: true, label: "\uC81C\uAC70", onClick: onRemove })
25763
- ] });
26948
+ ),
26949
+ /* @__PURE__ */ jsxRuntime.jsx(SButton, { size: "sm", label: t.apply, onClick: onApply }),
26950
+ hasLink && /* @__PURE__ */ jsxRuntime.jsx(SButton, { size: "sm", color: "neutral", outline: true, label: t.remove, onClick: onRemove })
26951
+ ] });
26952
+ };
25764
26953
  var TOOLBAR_BAR_CLASS = "sticky top-0 z-[1] flex flex-wrap items-center gap-[2px] border-b border-solid bg-inherit px-[8px] py-[4px]";
25765
26954
  var TOOLBAR_BAR_STYLE = { borderBottomColor: "var(--sys-color-border-default)" };
25766
26955
  var BUBBLE_BAR_CLASS = cn(
@@ -25827,6 +27016,11 @@ function EditorToolbarBar({
25827
27016
  disabled,
25828
27017
  variant = "bar"
25829
27018
  }) {
27019
+ const t = useLocale().messages.editor;
27020
+ const colorOptions = react.useMemo(
27021
+ () => SEDITOR_DEFAULT_COLORS.map((option) => ({ color: option.color, label: t[option.key] })),
27022
+ [t]
27023
+ );
25830
27024
  const portalContainer = usePortalContainer();
25831
27025
  const insideModal = useInsideModal();
25832
27026
  const isMobile = useIsMobile();
@@ -25897,7 +27091,7 @@ function EditorToolbarBar({
25897
27091
  /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(
25898
27092
  ToolbarButton,
25899
27093
  {
25900
- label: "\uC81C\uBAA9 \uB2E8\uACC4",
27094
+ label: t.headingLevel,
25901
27095
  active: state2.heading !== 0,
25902
27096
  disabled: off,
25903
27097
  className: "px-[4px]",
@@ -25913,7 +27107,7 @@ function EditorToolbarBar({
25913
27107
  {
25914
27108
  className: menuItemClass,
25915
27109
  onSelect: () => chain()?.setParagraph().run(),
25916
- children: SEDITOR_HEADING_LABELS[0]
27110
+ children: t.headingBody
25917
27111
  }
25918
27112
  ),
25919
27113
  SEDITOR_HEADING_LEVELS.map((level) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -25921,7 +27115,7 @@ function EditorToolbarBar({
25921
27115
  {
25922
27116
  className: menuItemClass,
25923
27117
  onSelect: () => chain()?.setHeading({ level }).run(),
25924
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: HEADING_ITEM_CLASS[level], children: SEDITOR_HEADING_LABELS[level] })
27118
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: HEADING_ITEM_CLASS[level], children: t.heading(level) })
25925
27119
  },
25926
27120
  level
25927
27121
  ))
@@ -25929,8 +27123,8 @@ function EditorToolbarBar({
25929
27123
  ] }, item4);
25930
27124
  case "fontSize":
25931
27125
  return /* @__PURE__ */ jsxRuntime.jsxs(RDropdown5__namespace.Root, { modal: !insideModal, children: [
25932
- /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarButton, { label: "\uAE00\uC790 \uD06C\uAE30", disabled: off, className: "px-[6px]", children: [
25933
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] leading-[20px]", children: activeFontSize ?? FONT_SIZE_DEFAULT_LABEL }),
27126
+ /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarButton, { label: t.fontSize, disabled: off, className: "px-[6px]", children: [
27127
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] leading-[20px]", children: activeFontSize ?? t.fontSizeDefaultLabel }),
25934
27128
  /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "caretDown", size: 12 })
25935
27129
  ] }) }),
25936
27130
  /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
@@ -25945,9 +27139,9 @@ function EditorToolbarBar({
25945
27139
  RDropdown5__namespace.Item,
25946
27140
  {
25947
27141
  className: cn(menuItemClass, activeFontSize === null && menuItemSelectedClass),
25948
- title: `${FONT_SIZE_DEFAULT_LABEL} (\uBCF8\uBB38 ${SEDITOR_DEFAULT_FONT_SIZE}px)`,
27142
+ title: t.fontSizeDefault(SEDITOR_DEFAULT_FONT_SIZE),
25949
27143
  onSelect: () => chain()?.unsetFontSize().run(),
25950
- children: FONT_SIZE_DEFAULT_LABEL
27144
+ children: t.fontSizeDefaultLabel
25951
27145
  }
25952
27146
  ),
25953
27147
  SEDITOR_FONT_SIZES.map((size) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -25970,7 +27164,7 @@ function EditorToolbarBar({
25970
27164
  return /* @__PURE__ */ jsxRuntime.jsx(
25971
27165
  ToolbarButton,
25972
27166
  {
25973
- label: "\uAD75\uAC8C",
27167
+ label: t.bold,
25974
27168
  active: state2.bold,
25975
27169
  "aria-pressed": state2.bold,
25976
27170
  disabled: off,
@@ -25983,7 +27177,7 @@ function EditorToolbarBar({
25983
27177
  return /* @__PURE__ */ jsxRuntime.jsx(
25984
27178
  ToolbarButton,
25985
27179
  {
25986
- label: "\uAE30\uC6B8\uC784",
27180
+ label: t.italic,
25987
27181
  active: state2.italic,
25988
27182
  "aria-pressed": state2.italic,
25989
27183
  disabled: off,
@@ -25996,7 +27190,7 @@ function EditorToolbarBar({
25996
27190
  return /* @__PURE__ */ jsxRuntime.jsx(
25997
27191
  ToolbarButton,
25998
27192
  {
25999
- label: "\uBC11\uC904",
27193
+ label: t.underline,
26000
27194
  active: state2.underline,
26001
27195
  "aria-pressed": state2.underline,
26002
27196
  disabled: off,
@@ -26009,7 +27203,7 @@ function EditorToolbarBar({
26009
27203
  return /* @__PURE__ */ jsxRuntime.jsx(
26010
27204
  ToolbarButton,
26011
27205
  {
26012
- label: "\uCDE8\uC18C\uC120",
27206
+ label: t.strike,
26013
27207
  active: state2.strike,
26014
27208
  "aria-pressed": state2.strike,
26015
27209
  disabled: off,
@@ -26022,7 +27216,7 @@ function EditorToolbarBar({
26022
27216
  return /* @__PURE__ */ jsxRuntime.jsx(
26023
27217
  ToolbarButton,
26024
27218
  {
26025
- label: "\uC778\uB77C\uC778 \uCF54\uB4DC",
27219
+ label: t.inlineCode,
26026
27220
  active: state2.code,
26027
27221
  "aria-pressed": state2.code,
26028
27222
  disabled: off,
@@ -26036,7 +27230,7 @@ function EditorToolbarBar({
26036
27230
  return /* @__PURE__ */ jsxRuntime.jsx(
26037
27231
  ToolbarButton,
26038
27232
  {
26039
- label: "\uAE00\uC790\uC0C9",
27233
+ label: t.textColor,
26040
27234
  disabled: off,
26041
27235
  onClick: () => setMobileView("color"),
26042
27236
  children: /* @__PURE__ */ jsxRuntime.jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsxRuntime.jsx(IconTextColor, { size: ICON_SIZE }) })
@@ -26044,14 +27238,14 @@ function EditorToolbarBar({
26044
27238
  item4
26045
27239
  );
26046
27240
  return /* @__PURE__ */ jsxRuntime.jsxs(RDropdown5__namespace.Root, { modal: !insideModal, children: [
26047
- /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { label: "\uAE00\uC790\uC0C9", disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsxRuntime.jsx(IconTextColor, { size: ICON_SIZE }) }) }) }),
27241
+ /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { label: t.textColor, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsxRuntime.jsx(IconTextColor, { size: ICON_SIZE }) }) }) }),
26048
27242
  /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Content, { sideOffset: 4, align: "start", className: menuClass, children: /* @__PURE__ */ jsxRuntime.jsx(
26049
27243
  ColorPalette,
26050
27244
  {
26051
27245
  asMenu: true,
26052
- colors: SEDITOR_DEFAULT_COLORS,
27246
+ colors: colorOptions,
26053
27247
  columns: 4,
26054
- clearLabel: "\uC0C9 \uC9C0\uC6B0\uAE30",
27248
+ clearLabel: t.clearColor,
26055
27249
  onPick: applyColor,
26056
27250
  onClear: clearColor
26057
27251
  }
@@ -26061,7 +27255,7 @@ function EditorToolbarBar({
26061
27255
  return /* @__PURE__ */ jsxRuntime.jsx(
26062
27256
  ToolbarButton,
26063
27257
  {
26064
- label: "\uC67C\uCABD \uC815\uB82C",
27258
+ label: t.alignLeft,
26065
27259
  active: state2.alignLeft,
26066
27260
  "aria-pressed": state2.alignLeft,
26067
27261
  disabled: off,
@@ -26074,7 +27268,7 @@ function EditorToolbarBar({
26074
27268
  return /* @__PURE__ */ jsxRuntime.jsx(
26075
27269
  ToolbarButton,
26076
27270
  {
26077
- label: "\uAC00\uC6B4\uB370 \uC815\uB82C",
27271
+ label: t.alignCenter,
26078
27272
  active: state2.alignCenter,
26079
27273
  "aria-pressed": state2.alignCenter,
26080
27274
  disabled: off,
@@ -26087,7 +27281,7 @@ function EditorToolbarBar({
26087
27281
  return /* @__PURE__ */ jsxRuntime.jsx(
26088
27282
  ToolbarButton,
26089
27283
  {
26090
- label: "\uC624\uB978\uCABD \uC815\uB82C",
27284
+ label: t.alignRight,
26091
27285
  active: state2.alignRight,
26092
27286
  "aria-pressed": state2.alignRight,
26093
27287
  disabled: off,
@@ -26100,7 +27294,7 @@ function EditorToolbarBar({
26100
27294
  return /* @__PURE__ */ jsxRuntime.jsx(
26101
27295
  ToolbarButton,
26102
27296
  {
26103
- label: "\uC591\uCABD \uC815\uB82C",
27297
+ label: t.alignJustify,
26104
27298
  active: state2.alignJustify,
26105
27299
  "aria-pressed": state2.alignJustify,
26106
27300
  disabled: off,
@@ -26113,7 +27307,7 @@ function EditorToolbarBar({
26113
27307
  return /* @__PURE__ */ jsxRuntime.jsx(
26114
27308
  ToolbarButton,
26115
27309
  {
26116
- label: "\uAE00\uBA38\uB9AC \uAE30\uD638 \uBAA9\uB85D",
27310
+ label: t.bulletList,
26117
27311
  active: state2.bulletList,
26118
27312
  "aria-pressed": state2.bulletList,
26119
27313
  disabled: off,
@@ -26126,7 +27320,7 @@ function EditorToolbarBar({
26126
27320
  return /* @__PURE__ */ jsxRuntime.jsx(
26127
27321
  ToolbarButton,
26128
27322
  {
26129
- label: "\uBC88\uD638 \uB9E4\uAE30\uAE30 \uBAA9\uB85D",
27323
+ label: t.orderedList,
26130
27324
  active: state2.orderedList,
26131
27325
  "aria-pressed": state2.orderedList,
26132
27326
  disabled: off,
@@ -26139,7 +27333,7 @@ function EditorToolbarBar({
26139
27333
  return /* @__PURE__ */ jsxRuntime.jsx(
26140
27334
  ToolbarButton,
26141
27335
  {
26142
- label: "\uCCB4\uD06C \uBAA9\uB85D",
27336
+ label: t.taskList,
26143
27337
  active: state2.taskList,
26144
27338
  "aria-pressed": state2.taskList,
26145
27339
  disabled: off,
@@ -26152,7 +27346,7 @@ function EditorToolbarBar({
26152
27346
  const ListIcon = state2.orderedList ? IconOrderedList : state2.taskList ? IconTaskList : IconBulletList;
26153
27347
  const listActive = state2.bulletList || state2.orderedList || state2.taskList;
26154
27348
  return /* @__PURE__ */ jsxRuntime.jsxs(RDropdown5__namespace.Root, { modal: !insideModal, children: [
26155
- /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarButton, { label: "\uBAA9\uB85D", active: listActive, disabled: off, className: "px-[4px]", children: [
27349
+ /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarButton, { label: t.list, active: listActive, disabled: off, className: "px-[4px]", children: [
26156
27350
  /* @__PURE__ */ jsxRuntime.jsx(ListIcon, { size: ICON_SIZE }),
26157
27351
  /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "caretDown", size: CARET_SIZE })
26158
27352
  ] }) }),
@@ -26164,7 +27358,7 @@ function EditorToolbarBar({
26164
27358
  onSelect: () => chain()?.toggleBulletList().run(),
26165
27359
  children: [
26166
27360
  /* @__PURE__ */ jsxRuntime.jsx(IconBulletList, { size: 16, className: "mr-[6px]" }),
26167
- "\uAE00\uBA38\uB9AC \uAE30\uD638 \uBAA9\uB85D"
27361
+ t.bulletList
26168
27362
  ]
26169
27363
  }
26170
27364
  ),
@@ -26175,7 +27369,7 @@ function EditorToolbarBar({
26175
27369
  onSelect: () => chain()?.toggleOrderedList().run(),
26176
27370
  children: [
26177
27371
  /* @__PURE__ */ jsxRuntime.jsx(IconOrderedList, { size: 16, className: "mr-[6px]" }),
26178
- "\uBC88\uD638 \uB9E4\uAE30\uAE30 \uBAA9\uB85D"
27372
+ t.orderedList
26179
27373
  ]
26180
27374
  }
26181
27375
  ),
@@ -26186,7 +27380,7 @@ function EditorToolbarBar({
26186
27380
  onSelect: () => chain()?.toggleTaskList().run(),
26187
27381
  children: [
26188
27382
  /* @__PURE__ */ jsxRuntime.jsx(IconTaskList, { size: 16, className: "mr-[6px]" }),
26189
- "\uCCB4\uD06C \uBAA9\uB85D"
27383
+ t.taskList
26190
27384
  ]
26191
27385
  }
26192
27386
  )
@@ -26197,7 +27391,7 @@ function EditorToolbarBar({
26197
27391
  return /* @__PURE__ */ jsxRuntime.jsx(
26198
27392
  ToolbarButton,
26199
27393
  {
26200
- label: "\uC778\uC6A9\uAD6C",
27394
+ label: t.blockquote,
26201
27395
  active: state2.blockquote,
26202
27396
  "aria-pressed": state2.blockquote,
26203
27397
  disabled: off,
@@ -26210,7 +27404,7 @@ function EditorToolbarBar({
26210
27404
  return /* @__PURE__ */ jsxRuntime.jsx(
26211
27405
  ToolbarButton,
26212
27406
  {
26213
- label: "\uCF54\uB4DC \uBE14\uB85D",
27407
+ label: t.codeBlock,
26214
27408
  active: state2.codeBlock,
26215
27409
  "aria-pressed": state2.codeBlock,
26216
27410
  disabled: off,
@@ -26223,7 +27417,7 @@ function EditorToolbarBar({
26223
27417
  return /* @__PURE__ */ jsxRuntime.jsx(
26224
27418
  ToolbarButton,
26225
27419
  {
26226
- label: "\uAD6C\uBD84\uC120",
27420
+ label: t.divider,
26227
27421
  disabled: off,
26228
27422
  onClick: () => chain()?.setHorizontalRule().run(),
26229
27423
  children: /* @__PURE__ */ jsxRuntime.jsx(IconHorizontalRule, { size: ICON_SIZE })
@@ -26235,7 +27429,7 @@ function EditorToolbarBar({
26235
27429
  return /* @__PURE__ */ jsxRuntime.jsx(
26236
27430
  ToolbarButton,
26237
27431
  {
26238
- label: "\uB9C1\uD06C",
27432
+ label: t.link,
26239
27433
  active: state2.link,
26240
27434
  disabled: off,
26241
27435
  onClick: () => setMobileView("link"),
@@ -26244,7 +27438,7 @@ function EditorToolbarBar({
26244
27438
  item4
26245
27439
  );
26246
27440
  return /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open: linkOpen, onOpenChange: setLinkOpen, children: [
26247
- /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { label: "\uB9C1\uD06C", active: state2.link, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(IconLink, { size: ICON_SIZE }) }) }),
27441
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { label: t.link, active: state2.link, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(IconLink, { size: ICON_SIZE }) }) }),
26248
27442
  /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
26249
27443
  RPopover13__namespace.Content,
26250
27444
  {
@@ -26271,13 +27465,13 @@ function EditorToolbarBar({
26271
27465
  return /* @__PURE__ */ jsxRuntime.jsxs(
26272
27466
  ToolbarButton,
26273
27467
  {
26274
- label: "\uC774\uBBF8\uC9C0 \uB123\uAE30",
27468
+ label: t.insertImage,
26275
27469
  disabled: off || uploading,
26276
27470
  className: "px-[6px]",
26277
27471
  onClick: () => fileInputRef.current?.click(),
26278
27472
  children: [
26279
27473
  /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "image", size: ICON_SIZE }),
26280
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] leading-[20px]", children: "\uC774\uBBF8\uC9C0" })
27474
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] leading-[20px]", children: t.image })
26281
27475
  ]
26282
27476
  },
26283
27477
  item4
@@ -26290,10 +27484,19 @@ function EditorToolbarBar({
26290
27484
  onOpenChange: setTableOpen,
26291
27485
  modal: !insideModal,
26292
27486
  children: [
26293
- /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarButton, { label: "\uD45C", active: state2.inTable, disabled: off, className: "px-[6px]", children: [
26294
- /* @__PURE__ */ jsxRuntime.jsx(IconTable, { size: ICON_SIZE }),
26295
- /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "caretDown", size: CARET_SIZE })
26296
- ] }) }),
27487
+ /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(
27488
+ ToolbarButton,
27489
+ {
27490
+ label: t.table,
27491
+ active: state2.inTable,
27492
+ disabled: off,
27493
+ className: "px-[6px]",
27494
+ children: [
27495
+ /* @__PURE__ */ jsxRuntime.jsx(IconTable, { size: ICON_SIZE }),
27496
+ /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "caretDown", size: CARET_SIZE })
27497
+ ]
27498
+ }
27499
+ ) }),
26297
27500
  /* @__PURE__ */ jsxRuntime.jsx(RDropdown5__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(RDropdown5__namespace.Content, { sideOffset: 4, align: "start", className: menuClass, children: [
26298
27501
  !state2.inTable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
26299
27502
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -26311,7 +27514,7 @@ function EditorToolbarBar({
26311
27514
  /* @__PURE__ */ jsxRuntime.jsx(
26312
27515
  TableMenuItem,
26313
27516
  {
26314
- label: "\uC704\uC5D0 \uD589 \uCD94\uAC00",
27517
+ label: t.addRowAbove,
26315
27518
  disabled: !state2.inTable,
26316
27519
  onSelect: () => chain()?.addRowBefore().run()
26317
27520
  }
@@ -26319,7 +27522,7 @@ function EditorToolbarBar({
26319
27522
  /* @__PURE__ */ jsxRuntime.jsx(
26320
27523
  TableMenuItem,
26321
27524
  {
26322
- label: "\uC544\uB798\uC5D0 \uD589 \uCD94\uAC00",
27525
+ label: t.addRowBelow,
26323
27526
  disabled: !state2.inTable,
26324
27527
  onSelect: () => chain()?.addRowAfter().run()
26325
27528
  }
@@ -26327,7 +27530,7 @@ function EditorToolbarBar({
26327
27530
  /* @__PURE__ */ jsxRuntime.jsx(
26328
27531
  TableMenuItem,
26329
27532
  {
26330
- label: "\uC67C\uCABD\uC5D0 \uC5F4 \uCD94\uAC00",
27533
+ label: t.addColLeft,
26331
27534
  disabled: !state2.inTable,
26332
27535
  onSelect: () => chain()?.addColumnBefore().run()
26333
27536
  }
@@ -26335,7 +27538,7 @@ function EditorToolbarBar({
26335
27538
  /* @__PURE__ */ jsxRuntime.jsx(
26336
27539
  TableMenuItem,
26337
27540
  {
26338
- label: "\uC624\uB978\uCABD\uC5D0 \uC5F4 \uCD94\uAC00",
27541
+ label: t.addColRight,
26339
27542
  disabled: !state2.inTable,
26340
27543
  onSelect: () => chain()?.addColumnAfter().run()
26341
27544
  }
@@ -26344,7 +27547,7 @@ function EditorToolbarBar({
26344
27547
  /* @__PURE__ */ jsxRuntime.jsx(
26345
27548
  TableMenuItem,
26346
27549
  {
26347
- label: "\uC140 \uBCD1\uD569",
27550
+ label: t.mergeCells,
26348
27551
  disabled: !state2.canMergeCells,
26349
27552
  onSelect: () => chain()?.mergeCells().run()
26350
27553
  }
@@ -26352,7 +27555,7 @@ function EditorToolbarBar({
26352
27555
  /* @__PURE__ */ jsxRuntime.jsx(
26353
27556
  TableMenuItem,
26354
27557
  {
26355
- label: "\uBCD1\uD569 \uD574\uC81C",
27558
+ label: t.splitCell,
26356
27559
  disabled: !state2.canSplitCell,
26357
27560
  onSelect: () => chain()?.splitCell().run()
26358
27561
  }
@@ -26360,7 +27563,7 @@ function EditorToolbarBar({
26360
27563
  /* @__PURE__ */ jsxRuntime.jsx(
26361
27564
  TableMenuItem,
26362
27565
  {
26363
- label: "\uD5E4\uB354 \uD589 \uD1A0\uAE00",
27566
+ label: t.toggleHeaderRow,
26364
27567
  disabled: !state2.inTable,
26365
27568
  onSelect: () => chain()?.toggleHeaderRow().run()
26366
27569
  }
@@ -26368,7 +27571,7 @@ function EditorToolbarBar({
26368
27571
  /* @__PURE__ */ jsxRuntime.jsx(
26369
27572
  TableMenuItem,
26370
27573
  {
26371
- label: "\uD5E4\uB354 \uC5F4 \uD1A0\uAE00",
27574
+ label: t.toggleHeaderCol,
26372
27575
  disabled: !state2.inTable,
26373
27576
  onSelect: () => chain()?.toggleHeaderColumn().run()
26374
27577
  }
@@ -26377,7 +27580,7 @@ function EditorToolbarBar({
26377
27580
  /* @__PURE__ */ jsxRuntime.jsx(
26378
27581
  TableMenuItem,
26379
27582
  {
26380
- label: "\uD589 \uC0AD\uC81C",
27583
+ label: t.deleteRow,
26381
27584
  disabled: !state2.inTable,
26382
27585
  onSelect: () => chain()?.deleteRow().run()
26383
27586
  }
@@ -26385,7 +27588,7 @@ function EditorToolbarBar({
26385
27588
  /* @__PURE__ */ jsxRuntime.jsx(
26386
27589
  TableMenuItem,
26387
27590
  {
26388
- label: "\uC5F4 \uC0AD\uC81C",
27591
+ label: t.deleteCol,
26389
27592
  disabled: !state2.inTable,
26390
27593
  onSelect: () => chain()?.deleteColumn().run()
26391
27594
  }
@@ -26393,7 +27596,7 @@ function EditorToolbarBar({
26393
27596
  /* @__PURE__ */ jsxRuntime.jsx(
26394
27597
  TableMenuItem,
26395
27598
  {
26396
- label: "\uD45C \uC0AD\uC81C",
27599
+ label: t.deleteTable,
26397
27600
  disabled: !state2.inTable,
26398
27601
  onSelect: () => chain()?.deleteTable().run()
26399
27602
  }
@@ -26407,7 +27610,7 @@ function EditorToolbarBar({
26407
27610
  return /* @__PURE__ */ jsxRuntime.jsx(
26408
27611
  ToolbarButton,
26409
27612
  {
26410
- label: "\uC2E4\uD589 \uCDE8\uC18C",
27613
+ label: t.undo,
26411
27614
  disabled: off || !state2.canUndo,
26412
27615
  onClick: () => chain()?.undo().run(),
26413
27616
  children: /* @__PURE__ */ jsxRuntime.jsx(IconUndo, { size: ICON_SIZE })
@@ -26418,7 +27621,7 @@ function EditorToolbarBar({
26418
27621
  return /* @__PURE__ */ jsxRuntime.jsx(
26419
27622
  ToolbarButton,
26420
27623
  {
26421
- label: "\uB2E4\uC2DC \uC2E4\uD589",
27624
+ label: t.redo,
26422
27625
  disabled: off || !state2.canRedo,
26423
27626
  onClick: () => chain()?.redo().run(),
26424
27627
  children: /* @__PURE__ */ jsxRuntime.jsx(IconRedo, { size: ICON_SIZE })
@@ -26431,21 +27634,21 @@ function EditorToolbarBar({
26431
27634
  };
26432
27635
  const shell = {
26433
27636
  "role": "toolbar",
26434
- "aria-label": "\uC11C\uC2DD \uB3C4\uAD6C",
27637
+ "aria-label": t.toolbarLabel,
26435
27638
  "aria-disabled": disabled || void 0,
26436
27639
  "className": variant === "bubble" ? BUBBLE_BAR_CLASS : TOOLBAR_BAR_CLASS,
26437
27640
  "style": variant === "bubble" ? void 0 : TOOLBAR_BAR_STYLE
26438
27641
  };
26439
27642
  if (mobileView !== "main") {
26440
27643
  const editing = {
26441
- color: { icon: /* @__PURE__ */ jsxRuntime.jsx(IconTextColor, { size: ICON_SIZE }), label: "\uAE00\uC790\uC0C9" },
26442
- link: { icon: /* @__PURE__ */ jsxRuntime.jsx(IconLink, { size: ICON_SIZE }), label: "\uB9C1\uD06C" }
27644
+ color: { icon: /* @__PURE__ */ jsxRuntime.jsx(IconTextColor, { size: ICON_SIZE }), label: t.textColor },
27645
+ link: { icon: /* @__PURE__ */ jsxRuntime.jsx(IconLink, { size: ICON_SIZE }), label: t.link }
26443
27646
  }[mobileView];
26444
27647
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...shell, children: [
26445
27648
  /* @__PURE__ */ jsxRuntime.jsx("div", { role: "group", className: "flex items-center gap-[2px]", children: /* @__PURE__ */ jsxRuntime.jsxs(
26446
27649
  ToolbarButton,
26447
27650
  {
26448
- label: `${editing.label} \uB2EB\uAE30`,
27651
+ label: t.closeEditing(editing.label),
26449
27652
  className: "px-[4px]",
26450
27653
  onClick: () => setMobileView("main"),
26451
27654
  children: [
@@ -26467,9 +27670,9 @@ function EditorToolbarBar({
26467
27670
  ) : /* @__PURE__ */ jsxRuntime.jsx(
26468
27671
  ColorPalette,
26469
27672
  {
26470
- colors: SEDITOR_DEFAULT_COLORS,
27673
+ colors: colorOptions,
26471
27674
  columns: 4,
26472
- clearLabel: "\uC0C9 \uC9C0\uC6B0\uAE30",
27675
+ clearLabel: t.clearColor,
26473
27676
  onPick: applyColor,
26474
27677
  onClear: clearColor
26475
27678
  }
@@ -26766,7 +27969,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
26766
27969
  value,
26767
27970
  defaultValue,
26768
27971
  onValueChange,
26769
- placeholder = "\uB0B4\uC6A9\uC744 \uC785\uB825\uD574 \uC8FC\uC138\uC694.",
27972
+ placeholder: placeholderProp,
26770
27973
  minHeight = 200,
26771
27974
  maxHeight,
26772
27975
  simple = false,
@@ -26799,6 +28002,9 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
26799
28002
  className,
26800
28003
  style
26801
28004
  }, ref) {
28005
+ const runRules2 = useRunRules();
28006
+ const t = useLocale().messages.editor;
28007
+ const placeholder = placeholderProp ?? t.placeholder;
26802
28008
  const [ruleError, setRuleError] = react.useState("");
26803
28009
  const [selfFocused, setSelfFocused] = react.useState(false);
26804
28010
  const controlId = useFieldControlId();
@@ -26809,7 +28015,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
26809
28015
  const editable = !disabled && !readOnly;
26810
28016
  const handleInput = (html) => {
26811
28017
  onValueChange?.(html);
26812
- if (ruleError !== "") setRuleError(runRules(html, rules));
28018
+ if (ruleError !== "") setRuleError(runRules2(html, rules));
26813
28019
  };
26814
28020
  const handleFocusChange = (next) => {
26815
28021
  setSelfFocused(next);
@@ -26818,7 +28024,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
26818
28024
  return;
26819
28025
  }
26820
28026
  onBlur?.();
26821
- if (rules && rules.length > 0) setRuleError(runRules(htmlRef.current, rules));
28027
+ if (rules && rules.length > 0) setRuleError(runRules2(htmlRef.current, rules));
26822
28028
  };
26823
28029
  const handleReady = () => {
26824
28030
  if (!pendingFocusRef.current) return;
@@ -26828,7 +28034,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
26828
28034
  useFormField({
26829
28035
  name,
26830
28036
  validate: () => {
26831
- const msg = runRules(htmlRef.current, rules);
28037
+ const msg = runRules2(htmlRef.current, rules);
26832
28038
  setRuleError(msg);
26833
28039
  return msg === "";
26834
28040
  },
@@ -27002,6 +28208,8 @@ var SSlider = /* @__PURE__ */ react.forwardRef(function SSlider2({
27002
28208
  className,
27003
28209
  style
27004
28210
  }, ref) {
28211
+ const runRules2 = useRunRules();
28212
+ const t = useLocale().messages.slider;
27005
28213
  const isRange = Array.isArray(value);
27006
28214
  const values = isRange ? value : [value ?? min];
27007
28215
  const toOut = (v) => isRange ? [v[0], v[1]] : v[0];
@@ -27009,7 +28217,7 @@ var SSlider = /* @__PURE__ */ react.forwardRef(function SSlider2({
27009
28217
  useFormField({
27010
28218
  name,
27011
28219
  validate: () => {
27012
- const msg = runRules(value, rules);
28220
+ const msg = runRules2(value, rules);
27013
28221
  setRuleError(msg);
27014
28222
  return msg === "";
27015
28223
  },
@@ -27105,13 +28313,13 @@ var SSlider = /* @__PURE__ */ react.forwardRef(function SSlider2({
27105
28313
  if (!interactive) return;
27106
28314
  const next = toOut(v);
27107
28315
  onValueChange?.(next);
27108
- if (ruleError !== "") setRuleError(runRules(next, rules));
28316
+ if (ruleError !== "") setRuleError(runRules2(next, rules));
27109
28317
  },
27110
28318
  onValueCommit: (v) => {
27111
28319
  if (!interactive) return;
27112
28320
  const next = toOut(v);
27113
28321
  onValueCommit?.(next);
27114
- if (rules && rules.length > 0) setRuleError(runRules(next, rules));
28322
+ if (rules && rules.length > 0) setRuleError(runRules2(next, rules));
27115
28323
  },
27116
28324
  onPointerDown: () => interactive && setDragging(true),
27117
28325
  onPointerUp: () => setDragging(false),
@@ -27160,7 +28368,7 @@ var SSlider = /* @__PURE__ */ react.forwardRef(function SSlider2({
27160
28368
  RSlider__namespace.Thumb,
27161
28369
  {
27162
28370
  id: i === 0 ? thumbId : void 0,
27163
- "aria-label": isRange ? `${label ?? ""} ${i === 0 ? "\uCD5C\uC19F\uAC12" : "\uCD5C\uB313\uAC12"}`.trim() : label,
28371
+ "aria-label": isRange ? `${label ?? ""} ${i === 0 ? t.minValue : t.maxValue}`.trim() : label,
27164
28372
  "aria-valuetext": formatValue(v),
27165
28373
  "aria-readonly": readOnly || void 0,
27166
28374
  onFocus: () => setFocusIndex(i),
@@ -27286,28 +28494,41 @@ var CHIPFILTER = {
27286
28494
  itemTextSelected: "var(--cmp-chipFilter-item-text-selected)"
27287
28495
  };
27288
28496
  var DEFAULT_CUSTOM_MAX_RANGE = 90;
27289
- var DEFAULT_PERIOD_PRESETS = [
27290
- { value: "day", label: "\uC77C\uBCC4" },
27291
- { value: "month", label: "\uC6D4\uBCC4" },
27292
- { value: "quarter", label: "\uBD84\uAE30\uBCC4" },
27293
- { value: "half", label: "\uBC18\uAE30\uBCC4" },
27294
- { value: "year", label: "\uC5F0\uB3C4\uBCC4" },
27295
- { value: "custom", label: "\uC0AC\uC6A9\uC790 \uC9C0\uC815", custom: true }
27296
- ];
27297
- var DEFAULT_DATE_RANGE_PRESETS = [
27298
- { value: "today", label: "\uC624\uB298", resolve: () => todayIso() },
27299
- {
27300
- value: "last7",
27301
- label: "\uC9C0\uB09C 7\uC77C",
27302
- resolve: () => [rangeStartIso(todayIso(), 7), todayIso()]
27303
- },
27304
- {
27305
- value: "last30",
27306
- label: "\uC9C0\uB09C 30\uC77C",
27307
- resolve: () => [rangeStartIso(todayIso(), 30), todayIso()]
27308
- },
27309
- { value: "custom", label: "\uC0AC\uC6A9\uC790 \uC9C0\uC815", custom: true }
27310
- ];
28497
+ var defaultPresetCache = /* @__PURE__ */ new WeakMap();
28498
+ var STRUCTURE_MESSAGES = resolveMessages(DEFAULT_LOCALE);
28499
+ var getDefaultPresets = (m) => {
28500
+ const cached = defaultPresetCache.get(m.chipFilter);
28501
+ if (cached) return cached;
28502
+ const t = m.chipFilter;
28503
+ const created = {
28504
+ period: [
28505
+ { value: "day", label: t.periodDay },
28506
+ { value: "month", label: t.periodMonth },
28507
+ { value: "quarter", label: t.periodQuarter },
28508
+ { value: "half", label: t.periodHalf },
28509
+ { value: "year", label: t.periodYear },
28510
+ { value: "custom", label: t.custom, custom: true }
28511
+ ],
28512
+ /** presets 를 지정하지 않은 datepicker-range 필드가 쓰는 기본 프리셋 목록.
28513
+ * 프리셋 라디오 자체를 없애고 캘린더 하나만 두려면 presets: [] 를 명시한다 */
28514
+ range: [
28515
+ { value: "today", label: t.today, resolve: () => todayIso() },
28516
+ {
28517
+ value: "last7",
28518
+ label: t.last7,
28519
+ resolve: () => [rangeStartIso(todayIso(), 7), todayIso()]
28520
+ },
28521
+ {
28522
+ value: "last30",
28523
+ label: t.last30,
28524
+ resolve: () => [rangeStartIso(todayIso(), 30), todayIso()]
28525
+ },
28526
+ { value: "custom", label: t.custom, custom: true }
28527
+ ]
28528
+ };
28529
+ defaultPresetCache.set(m.chipFilter, created);
28530
+ return created;
28531
+ };
27311
28532
  var isKeywordValue = (value) => typeof value === "object" && value != null && !Array.isArray(value) && "keywords" in value;
27312
28533
  var isPeriodValue = (value) => typeof value === "object" && value != null && !Array.isArray(value) && "unit" in value;
27313
28534
  var keywordEntries = (value) => {
@@ -27399,18 +28620,20 @@ var addDaysIso = (iso, n) => {
27399
28620
  };
27400
28621
  var rangeStartIso = (today, days) => addDaysIso(today, -(days - 1));
27401
28622
  var isInlineDateField = (field) => field.type === "datepicker-range" && field.radioButton === true && (field.presets?.length ?? 0) > 0;
27402
- var getFieldPresets = (field) => {
27403
- if (field.type === "datepicker-statistics") return field.presets ?? DEFAULT_PERIOD_PRESETS;
27404
- return field.presets ?? DEFAULT_DATE_RANGE_PRESETS;
28623
+ var getFieldPresets = (field, m) => {
28624
+ if (field.type === "datepicker-statistics") return field.presets ?? getDefaultPresets(m).period;
28625
+ return field.presets ?? getDefaultPresets(m).range;
27405
28626
  };
27406
- var getEffectiveMaxRange = (field) => {
28627
+ var getEffectiveMaxRange = (field, m) => {
27407
28628
  if (field.maxRange !== void 0) return field.maxRange;
27408
- const hasCustomPreset = getFieldPresets(field).some((preset) => preset.custom);
28629
+ const hasCustomPreset = getFieldPresets(field, m).some((preset) => preset.custom);
27409
28630
  return hasCustomPreset ? DEFAULT_CUSTOM_MAX_RANGE : void 0;
27410
28631
  };
27411
- var getPresetLabel = (preset, maxRange) => {
27412
- if (!preset.custom || !maxRange || preset.label.includes("\uCD5C\uB300")) return preset.label;
27413
- return `${preset.label} (\uCD5C\uB300 ${maxRange}\uC77C\uC529)`;
28632
+ var getPresetLabel = (preset, maxRange, m) => {
28633
+ const t = m.chipFilter;
28634
+ if (!preset.custom || !maxRange || preset.label.toLowerCase().includes(t.maxWord.toLowerCase()))
28635
+ return preset.label;
28636
+ return `${preset.label} (${t.maxRangeHint(maxRange)})`;
27414
28637
  };
27415
28638
  var getDefaultPeriodInputValue = (unit, maxRange) => {
27416
28639
  const today = todayIso();
@@ -27447,7 +28670,7 @@ var resolveFieldDefault = (field) => {
27447
28670
  if (field.type === "datepicker-day") return todayIso();
27448
28671
  if (field.type === "select" || field.type === "select-depth") return leafOptions(field)[0]?.value;
27449
28672
  if (field.type === "datepicker-statistics") {
27450
- const presets = getFieldPresets(field).filter((preset) => !preset.custom);
28673
+ const presets = getFieldPresets(field, STRUCTURE_MESSAGES).filter((preset) => !preset.custom);
27451
28674
  const unit = presets.some((preset) => preset.value === "day") ? "day" : presets[0]?.value;
27452
28675
  return unit ? createPeriodValue(unit) : void 0;
27453
28676
  }
@@ -27495,20 +28718,16 @@ var isGroupSatisfied = (group, values) => {
27495
28718
  if (group.rule.type === "requireAny") return keys.some((k) => !isEmptyValue(values[k]));
27496
28719
  return true;
27497
28720
  };
27498
- var koreanParticle = (word, consonant, vowel) => {
27499
- const code = word.charCodeAt(word.length - 1);
27500
- if (code < 44032 || code > 55203) return consonant;
27501
- return (code - 44032) % 28 === 0 ? vowel : consonant;
27502
- };
27503
- var defaultGroupTooltipMessage = (rule, fields) => {
27504
- if (rule.type === "requireAll") return "\uD56D\uBAA9\uC744 \uBAA8\uB450 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.";
28721
+ var defaultGroupTooltipMessage = (rule, fields, m) => {
28722
+ const t = m.chipFilter;
28723
+ if (rule.type === "requireAll") return t.requireAll;
27505
28724
  if (rule.type === "requireAny") {
27506
28725
  const name = rule.dataGroupName;
27507
- if (!name) return "\uCD5C\uC18C 1\uAC1C\uC758 \uD544\uD130\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694.";
27508
- return `\uCD5C\uC18C 1\uAC1C\uC758 ${name}${koreanParticle(name, "\uC744", "\uB97C")} \uC120\uD0DD\uD574\uC8FC\uC138\uC694.`;
28726
+ if (!name) return t.requireAnyDefault;
28727
+ return t.requireAnyNamed(name);
27509
28728
  }
27510
- const label = fields.find((f) => f.key === rule.key)?.label ?? "\uD56D\uBAA9";
27511
- return `${label}${koreanParticle(label, "\uC744", "\uB97C")} \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.`;
28729
+ const label = fields.find((f) => f.key === rule.key)?.label ?? t.fieldFallback;
28730
+ return t.requireField(label);
27512
28731
  };
27513
28732
  var toDateRange = (value) => Array.isArray(value) ? [value[0], value[1]] : [value, value];
27514
28733
  var sameDateValue = (a, b) => {
@@ -27527,20 +28746,24 @@ var matchPresetId = (presets, value) => {
27527
28746
  return presets.find((preset) => preset.custom)?.value ?? null;
27528
28747
  };
27529
28748
  var optionLabel = (field, value) => leafOptions(field).find((option) => option.value === value)?.label ?? String(value);
27530
- var formatValueList = (labels) => {
28749
+ var formatValueList = (labels, m) => {
27531
28750
  if (labels.length <= 1) return labels[0] ?? "";
27532
- return `${labels[0]} \uC678 ${labels.length - 1}\uAC1C`;
28751
+ return m.chipFilter.valueListMore(labels[0], labels.length - 1);
27533
28752
  };
27534
- var displayValue = (field, value) => {
28753
+ var displayValue = (field, value, m) => {
28754
+ const t = m.chipFilter;
27535
28755
  if (isEmptyValue(value)) return "";
27536
28756
  if (isMultiSelectType(field.type)) {
27537
28757
  const optionsField = field;
27538
28758
  const values = toArrayValue(value);
27539
28759
  const selectableValues = selectableLeafValues(optionsField);
27540
28760
  if (selectableValues.length > 1 && selectableValues.every((selectableValue) => values.includes(selectableValue))) {
27541
- return "\uC804\uCCB4";
28761
+ return m.common.all;
27542
28762
  }
27543
- return formatValueList(values.map((v) => optionLabel(optionsField, v)));
28763
+ return formatValueList(
28764
+ values.map((v) => optionLabel(optionsField, v)),
28765
+ m
28766
+ );
27544
28767
  }
27545
28768
  if (field.type === "select" || field.type === "select-depth") {
27546
28769
  return optionLabel(field, value);
@@ -27551,23 +28774,24 @@ var displayValue = (field, value) => {
27551
28774
  }
27552
28775
  if (field.type === "datepicker-statistics") {
27553
28776
  if (!isPeriodValue(value)) {
27554
- const preset2 = getFieldPresets(field).find((p) => p.value === value);
28777
+ const preset2 = getFieldPresets(field, m).find((p) => p.value === value);
27555
28778
  return preset2?.label ?? String(value);
27556
28779
  }
27557
- const preset = getFieldPresets(field).find((p) => p.value === value.unit);
28780
+ const preset = getFieldPresets(field, m).find((p) => p.value === value.unit);
27558
28781
  const label = preset?.label ?? value.unit;
27559
- if (value.unit === "quarter") return `${label}(${value.value ?? 1}\uBD84\uAE30)`;
27560
- if (value.unit === "half") return `${label}(${value.value === "second" ? "\uD558\uBC18\uAE30" : "\uC0C1\uBC18\uAE30"})`;
28782
+ if (value.unit === "quarter") return `${label}(${t.quarter(Number(value.value ?? 1))})`;
28783
+ if (value.unit === "half")
28784
+ return `${label}(${value.value === "second" ? t.secondHalf : t.firstHalf})`;
27561
28785
  if (Array.isArray(value.value)) return `${value.value[0]} ~ ${value.value[1]}`;
27562
28786
  return value.value != null && value.value !== "" ? String(value.value) : label;
27563
28787
  }
27564
- if (field.type === "keyword") return formatValueList(keywordEntries(value));
28788
+ if (field.type === "keyword") return formatValueList(keywordEntries(value), m);
27565
28789
  return String(value);
27566
28790
  };
27567
- var chipDisplayValue = (field, value) => {
27568
- const text = displayValue(field, value);
28791
+ var chipDisplayValue = (field, value, m) => {
28792
+ const text = displayValue(field, value, m);
27569
28793
  if (field.type !== "datepicker-range" || isEmptyValue(value)) return text;
27570
- const presets = getFieldPresets(field);
28794
+ const presets = getFieldPresets(field, m);
27571
28795
  if (presets.length === 0) return text;
27572
28796
  const preset = presets.find((p) => p.value === matchPresetId(presets, value));
27573
28797
  return preset && !preset.custom ? `${preset.label}(${text})` : text;
@@ -27586,6 +28810,8 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27586
28810
  className,
27587
28811
  style
27588
28812
  }, ref) {
28813
+ const messages = useLocale().messages;
28814
+ const t = messages.chipFilter;
27589
28815
  const fields = react.useMemo(() => groups.flatMap((group) => group.fields), [groups]);
27590
28816
  const values = normalizeValues(value);
27591
28817
  const portalContainer = usePortalContainer();
@@ -27732,7 +28958,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27732
28958
  if (currentOpenField?.type === "keyword") {
27733
28959
  return { width: CHIPFILTER_LISTBOX_WIDTH };
27734
28960
  }
27735
- if ((currentOpenField?.type === "datepicker-range" || currentOpenField?.type === "datepicker-statistics") && getFieldPresets(currentOpenField).length > 0) {
28961
+ if ((currentOpenField?.type === "datepicker-range" || currentOpenField?.type === "datepicker-statistics") && getFieldPresets(currentOpenField, STRUCTURE_MESSAGES).length > 0) {
27736
28962
  return { width: CHIPFILTER_DATE_PRESET_LISTBOX_WIDTH };
27737
28963
  }
27738
28964
  return { width: CHIPFILTER_LISTBOX_WIDTH };
@@ -27839,7 +29065,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27839
29065
  const flushRun = () => {
27840
29066
  if (runBuffer.length === 0) return;
27841
29067
  const group = runGroupIndex != null ? groups[runGroupIndex] : void 0;
27842
- const message = group?.rule ? group.tooltipMessage ?? defaultGroupTooltipMessage(group.rule, group.fields) : void 0;
29068
+ const message = group?.rule ? group.tooltipMessage ?? defaultGroupTooltipMessage(group.rule, group.fields, messages) : void 0;
27843
29069
  if (message) {
27844
29070
  nodes.push(
27845
29071
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -27904,7 +29130,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27904
29130
  {
27905
29131
  icon: "close",
27906
29132
  size: "xxs",
27907
- ariaLabel: `${field.label} \uD544\uD130 \uC81C\uAC70`,
29133
+ ariaLabel: t.removeFilter(field.label),
27908
29134
  className: "shrink-0",
27909
29135
  onClick: handleClear
27910
29136
  }
@@ -27913,7 +29139,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27913
29139
  FilterChip,
27914
29140
  {
27915
29141
  field,
27916
- valueText: chipDisplayValue(field, values[field.key]),
29142
+ valueText: chipDisplayValue(field, values[field.key], messages),
27917
29143
  active: openKey === field.key,
27918
29144
  applied: !isEmptyValue(values[field.key]),
27919
29145
  disabled: disabled || field.disabled,
@@ -27965,7 +29191,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27965
29191
  color: disabled || inactiveFields.length === 0 ? CHIPFILTER.addTextDisabled : CHIPFILTER.addText
27966
29192
  }
27967
29193
  ),
27968
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\uD544\uD130 \uCD94\uAC00" })
29194
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t.addFilter })
27969
29195
  ]
27970
29196
  }
27971
29197
  ) }),
@@ -27981,7 +29207,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27981
29207
  event.preventDefault();
27982
29208
  },
27983
29209
  className: cn("z-50 min-w-[180px]", FLOATING_SLIDE_ANIM),
27984
- children: /* @__PURE__ */ jsxRuntime.jsx(ListBox, { children: inactiveFields.length > 0 ? inactiveFields.map((field) => /* @__PURE__ */ jsxRuntime.jsx(MenuItem, { onClick: () => addField(field.key), children: field.label }, field.key)) : /* @__PURE__ */ jsxRuntime.jsx(EmptyItem, { children: "\uCD94\uAC00\uD560 \uD544\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4." }) })
29210
+ children: /* @__PURE__ */ jsxRuntime.jsx(ListBox, { children: inactiveFields.length > 0 ? inactiveFields.map((field) => /* @__PURE__ */ jsxRuntime.jsx(MenuItem, { onClick: () => addField(field.key), children: field.label }, field.key)) : /* @__PURE__ */ jsxRuntime.jsx(EmptyItem, { children: t.noAddableFilter }) })
27985
29211
  }
27986
29212
  ) })
27987
29213
  ] }),
@@ -27991,7 +29217,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27991
29217
  size: "sm",
27992
29218
  icon: "reset",
27993
29219
  iconColor: "grey_80",
27994
- label: "\uAC80\uC0C9 \uCD08\uAE30\uD654",
29220
+ label: t.resetSearch,
27995
29221
  labelClassName: "text-grey-80",
27996
29222
  disabled: disabled || !canReset,
27997
29223
  onClick: reset,
@@ -28090,6 +29316,7 @@ function FilterChip({
28090
29316
  onOpen,
28091
29317
  onClear
28092
29318
  }) {
29319
+ const t = useLocale().messages.chipFilter;
28093
29320
  const border = disabled ? CHIPFILTER.chipDisabledBorder : warning ? CHIPFILTER.chipWarningBorder : applied ? active ? "var(--color-blue-strong)" : CHIPFILTER.chipAppliedBorder : active ? CHIPFILTER.chipActiveBorder : CHIPFILTER.chipDefaultBorder;
28094
29321
  const background = disabled ? CHIPFILTER.chipDisabledBg : applied ? CHIPFILTER.chipAppliedBg : CHIPFILTER.chipDefaultBg;
28095
29322
  const textColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipDefaultText;
@@ -28181,7 +29408,7 @@ function FilterChip({
28181
29408
  {
28182
29409
  icon: "close",
28183
29410
  size: "xxs",
28184
- ariaLabel: `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
29411
+ ariaLabel: t.clearFilter(field.label),
28185
29412
  className: "shrink-0 self-center",
28186
29413
  onClick: onClear
28187
29414
  }
@@ -28199,6 +29426,8 @@ function EditorPanel({
28199
29426
  onDraftChange,
28200
29427
  onClose
28201
29428
  }) {
29429
+ const messages = useLocale().messages;
29430
+ const t = messages.chipFilter;
28202
29431
  const wrapsInPaddedTop = field.type === "datepicker-day" || field.type === "datepicker-range" || field.type === "datepicker-statistics";
28203
29432
  const isScrollableListField = isSelectType(field.type) || field.type === "keyword";
28204
29433
  const isMulti = isMultiSelectType(field.type);
@@ -28243,7 +29472,7 @@ function EditorPanel({
28243
29472
  STextLink,
28244
29473
  {
28245
29474
  size: "sm",
28246
- label: allSelected ? "\uC120\uD0DD \uD574\uC81C" : "\uC804\uCCB4 \uC120\uD0DD",
29475
+ label: allSelected ? t.selectNone : t.selectAll,
28247
29476
  labelClassName: "font-bold",
28248
29477
  disabled,
28249
29478
  onClick: toggleSelectAll,
@@ -28266,7 +29495,7 @@ function EditorPanel({
28266
29495
  STextLink,
28267
29496
  {
28268
29497
  size: "sm",
28269
- label: "\uAC80\uC0C9",
29498
+ label: messages.common.search,
28270
29499
  labelClassName: "font-bold",
28271
29500
  onClick: onClose,
28272
29501
  style: { color: CHIPFILTER.chipAppliedValue }
@@ -28352,8 +29581,9 @@ function DatePresetEditor({
28352
29581
  disabled,
28353
29582
  onValueChange
28354
29583
  }) {
28355
- const presets = getFieldPresets(field);
28356
- const maxRange = getEffectiveMaxRange(field);
29584
+ const messages = useLocale().messages;
29585
+ const presets = getFieldPresets(field, messages);
29586
+ const maxRange = getEffectiveMaxRange(field, messages);
28357
29587
  const [selectedId, setSelectedId] = react.useState(() => matchPresetId(presets, value));
28358
29588
  const syncedInitialValueRef = react.useRef(!isEmptyValue(value));
28359
29589
  react.useEffect(() => {
@@ -28391,7 +29621,7 @@ function DatePresetEditor({
28391
29621
  {
28392
29622
  val: preset.value,
28393
29623
  value: selectedId,
28394
- label: getPresetLabel(preset, maxRange),
29624
+ label: getPresetLabel(preset, maxRange, messages),
28395
29625
  disabled,
28396
29626
  onValueChange: () => selectPreset(preset)
28397
29627
  },
@@ -28415,8 +29645,10 @@ function PeriodPresetEditor({
28415
29645
  disabled,
28416
29646
  onValueChange
28417
29647
  }) {
28418
- const presets = getFieldPresets(field);
28419
- const maxRange = getEffectiveMaxRange(field);
29648
+ const messages = useLocale().messages;
29649
+ const t = messages.chipFilter;
29650
+ const presets = getFieldPresets(field, messages);
29651
+ const maxRange = getEffectiveMaxRange(field, messages);
28420
29652
  const firstUnit = presets.find((preset) => !preset.custom)?.value ?? "day";
28421
29653
  const [selectedId, setSelectedId] = react.useState(() => matchPresetId(presets, value) ?? firstUnit);
28422
29654
  const periodValue = isPeriodValue(value) ? value : createPeriodValue(selectedId ?? firstUnit, maxRange);
@@ -28469,10 +29701,10 @@ function PeriodPresetEditor({
28469
29701
  onValueChange: updateInputValue,
28470
29702
  disabled,
28471
29703
  options: [
28472
- { value: 1, label: "1\uBD84\uAE30" },
28473
- { value: 2, label: "2\uBD84\uAE30" },
28474
- { value: 3, label: "3\uBD84\uAE30" },
28475
- { value: 4, label: "4\uBD84\uAE30" }
29704
+ { value: 1, label: t.quarter(1) },
29705
+ { value: 2, label: t.quarter(2) },
29706
+ { value: 3, label: t.quarter(3) },
29707
+ { value: 4, label: t.quarter(4) }
28476
29708
  ]
28477
29709
  }
28478
29710
  );
@@ -28485,8 +29717,8 @@ function PeriodPresetEditor({
28485
29717
  onValueChange: updateInputValue,
28486
29718
  disabled,
28487
29719
  options: [
28488
- { value: "first", label: "\uC0C1\uBC18\uAE30" },
28489
- { value: "second", label: "\uD558\uBC18\uAE30" }
29720
+ { value: "first", label: t.firstHalf },
29721
+ { value: "second", label: t.secondHalf }
28490
29722
  ]
28491
29723
  }
28492
29724
  );
@@ -28523,7 +29755,7 @@ function PeriodPresetEditor({
28523
29755
  {
28524
29756
  val: preset.value,
28525
29757
  value: selectedId,
28526
- label: getPresetLabel(preset, maxRange),
29758
+ label: getPresetLabel(preset, maxRange, messages),
28527
29759
  disabled,
28528
29760
  onValueChange: () => selectPreset(preset)
28529
29761
  },
@@ -28541,6 +29773,8 @@ function InlineDatePresetFilter({
28541
29773
  onValueChange,
28542
29774
  onClear
28543
29775
  }) {
29776
+ const messages = useLocale().messages;
29777
+ const t = messages.chipFilter;
28544
29778
  const presets = (field.presets ?? []).filter((preset) => !preset.custom);
28545
29779
  const [selectedId, setSelectedId] = react.useState(() => matchPresetId(presets, value));
28546
29780
  const syncedInitialValueRef = react.useRef(!isEmptyValue(value));
@@ -28573,7 +29807,7 @@ function InlineDatePresetFilter({
28573
29807
  field.label,
28574
29808
  ":"
28575
29809
  ] }),
28576
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-bold", style: { color: badgeValueColor }, children: displayValue(field, value) })
29810
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-bold", style: { color: badgeValueColor }, children: displayValue(field, value, messages) })
28577
29811
  ] });
28578
29812
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-[8px]", children: [
28579
29813
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -28643,7 +29877,7 @@ function InlineDatePresetFilter({
28643
29877
  {
28644
29878
  icon: "close",
28645
29879
  size: "xxs",
28646
- ariaLabel: `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
29880
+ ariaLabel: t.clearFilter(field.label),
28647
29881
  className: "shrink-0 self-center",
28648
29882
  onClick: onClear
28649
29883
  }
@@ -28653,14 +29887,14 @@ function InlineDatePresetFilter({
28653
29887
  )
28654
29888
  ] });
28655
29889
  }
28656
- var MATCH_MODE_OPTIONS = [
28657
- { value: "contains", label: "\uD3EC\uD568" },
28658
- { value: "exact", label: "\uC77C\uCE58" }
29890
+ var matchModeOptions = (t) => [
29891
+ { value: "contains", label: t.keywordContains },
29892
+ { value: "exact", label: t.keywordExact }
28659
29893
  ];
28660
- var EXCLUDE_MATCH_MODE_OPTION = {
29894
+ var excludeMatchModeOption = (t) => ({
28661
29895
  value: "excludes",
28662
- label: "\uBBF8\uD3EC\uD568"
28663
- };
29896
+ label: t.keywordExcludes
29897
+ });
28664
29898
  function KeywordEditor({
28665
29899
  field,
28666
29900
  value,
@@ -28669,6 +29903,7 @@ function KeywordEditor({
28669
29903
  onValueCommit,
28670
29904
  onDraftChange
28671
29905
  }) {
29906
+ const t = useLocale().messages.chipFilter;
28672
29907
  const entries4 = keywordEntries(value);
28673
29908
  const [draftText, setDraftText] = react.useState("");
28674
29909
  const [mode, setMode] = react.useState(
@@ -28741,7 +29976,7 @@ function KeywordEditor({
28741
29976
  {
28742
29977
  className: "shrink-0 whitespace-nowrap typo-body-sm-medium",
28743
29978
  style: { color: CHIPFILTER.listboxLabel },
28744
- children: "\uAC80\uC0C9 \uC870\uAC74 :"
29979
+ children: t.keywordCondition
28745
29980
  }
28746
29981
  ),
28747
29982
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -28749,7 +29984,7 @@ function KeywordEditor({
28749
29984
  {
28750
29985
  size: "xs",
28751
29986
  style: { width: 150 },
28752
- options: field.excludeMode ? [...MATCH_MODE_OPTIONS, EXCLUDE_MATCH_MODE_OPTION] : MATCH_MODE_OPTIONS,
29987
+ options: field.excludeMode ? [...matchModeOptions(t), excludeMatchModeOption(t)] : matchModeOptions(t),
28753
29988
  value: mode,
28754
29989
  disabled,
28755
29990
  onValueChange: (next) => changeMode(next)
@@ -28764,7 +29999,7 @@ function KeywordEditor({
28764
29999
  ref: inputRef,
28765
30000
  value: draftText,
28766
30001
  disabled,
28767
- placeholder: field.placeholder ?? (field.input === "csv" ? "\uB2E4\uC911 \uD0A4\uC6CC\uB4DC\uB294 \uCF64\uB9C8(,)\uB85C \uAD6C\uBD84" : "\uC785\uB825 \uD6C4 Enter\uB85C \uCD94\uAC00"),
30002
+ placeholder: field.placeholder ?? (field.input === "csv" ? t.keywordHintCsv : t.keywordHintEnter),
28768
30003
  onChange: (event) => changeDraft(event.target.value),
28769
30004
  onPaste,
28770
30005
  onKeyDown,
@@ -28796,6 +30031,7 @@ function KeywordEntryRow({
28796
30031
  disabled,
28797
30032
  onRemove
28798
30033
  }) {
30034
+ const t = useLocale().messages.chipFilter;
28799
30035
  return /* @__PURE__ */ jsxRuntime.jsxs(
28800
30036
  "div",
28801
30037
  {
@@ -28814,7 +30050,7 @@ function KeywordEntryRow({
28814
30050
  {
28815
30051
  icon: "close",
28816
30052
  size: "xxs",
28817
- ariaLabel: `${label} \uC0AD\uC81C`,
30053
+ ariaLabel: t.removeItem(label),
28818
30054
  className: "invisible shrink-0 group-hover:visible",
28819
30055
  onClick: onRemove
28820
30056
  }
@@ -28833,6 +30069,7 @@ function OptionList({
28833
30069
  disabled,
28834
30070
  onValueChange
28835
30071
  }) {
30072
+ const messages = useLocale().messages;
28836
30073
  const selected = multiple ? toArrayValue(value) : [];
28837
30074
  const singleValue = !multiple && (typeof value === "string" || typeof value === "number") ? value : null;
28838
30075
  const [search, setSearch] = react.useState("");
@@ -28864,7 +30101,7 @@ function OptionList({
28864
30101
  allSelected ? selected.filter((v) => !leafValues.includes(v)) : [...selected, ...leafValues.filter((v) => !selected.includes(v))]
28865
30102
  );
28866
30103
  };
28867
- if (flat.length === 0) return /* @__PURE__ */ jsxRuntime.jsx(EmptyItem, { children: "\uD45C\uC2DC\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4." });
30104
+ if (flat.length === 0) return /* @__PURE__ */ jsxRuntime.jsx(EmptyItem, { children: messages.select.empty });
28868
30105
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [
28869
30106
  showSearch && /* @__PURE__ */ jsxRuntime.jsx(
28870
30107
  "div",
@@ -28879,7 +30116,7 @@ function OptionList({
28879
30116
  value: search,
28880
30117
  onValueChange: setSearch,
28881
30118
  disabled,
28882
- placeholder: "\uAC80\uC0C9",
30119
+ placeholder: messages.common.search,
28883
30120
  clearable: true,
28884
30121
  width: "100%"
28885
30122
  }
@@ -28897,7 +30134,7 @@ function OptionList({
28897
30134
  "pb-[var(--cmp-chipFilter-listbox-list-paddingY)]"
28898
30135
  ),
28899
30136
  children: [
28900
- showSearch && filteredOptions.length === 0 && /* @__PURE__ */ jsxRuntime.jsx(EmptyItem, { children: "\uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4." }),
30137
+ showSearch && filteredOptions.length === 0 && /* @__PURE__ */ jsxRuntime.jsx(EmptyItem, { children: messages.chipFilter.noSearchResults }),
28901
30138
  filteredOptions.map((option, index) => {
28902
30139
  const rowKey = `${option.value}-${index}`;
28903
30140
  if (option.isGroup) {
@@ -29183,7 +30420,9 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
29183
30420
  className,
29184
30421
  style
29185
30422
  }, ref) {
29186
- const placeholder = placeholderProp ?? (separators?.includes(",") ? "\uD0DC\uADF8 \uC785\uB825 (Enter\xB7\uCF64\uB9C8\uB85C \uB4F1\uB85D)" : "\uD0DC\uADF8 \uC785\uB825 (Enter\uB85C \uB4F1\uB85D)");
30423
+ const runRules2 = useRunRules();
30424
+ const { input: ti, chipInput: t, select: selectT } = useLocale().messages;
30425
+ const placeholder = placeholderProp ?? (separators?.includes(",") ? t.placeholderWithComma : t.placeholder);
29187
30426
  const autoId = react.useId();
29188
30427
  const controlId = `${autoId}-input`;
29189
30428
  const resolvedName = name ?? autoId;
@@ -29213,19 +30452,18 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
29213
30452
  const duplicateMessage = react.useMemo(() => {
29214
30453
  const seen = /* @__PURE__ */ new Set();
29215
30454
  for (const v of values) {
29216
- if (seen.has(v))
29217
- return duplicateLabel ? `\uC774\uBBF8 \uC785\uB825\uB41C ${duplicateLabel}\uC785\uB2C8\uB2E4.` : "\uC911\uBCF5\uB41C \uAC12\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4.";
30455
+ if (seen.has(v)) return duplicateLabel ? t.duplicateNamed(duplicateLabel) : t.duplicate;
29218
30456
  seen.add(v);
29219
30457
  }
29220
30458
  return "";
29221
- }, [values, duplicateLabel]);
29222
- const ruleMessage = react.useMemo(() => runRules(values, rules), [values, rules]);
30459
+ }, [values, duplicateLabel, t]);
30460
+ const ruleMessage = react.useMemo(() => runRules2(values, rules), [runRules2, values, rules]);
29223
30461
  const resolvedErrorMessage = duplicateMessage || ruleMessage || errorMessage;
29224
30462
  const resolvedError = error || duplicateMessage !== "" || ruleMessage !== "";
29225
30463
  const resolvedStatus = status ?? (resolvedError ? "error" : void 0);
29226
30464
  useFormField({
29227
30465
  name,
29228
- validate: () => runRules(values, rules) === "" && duplicateMessage === "",
30466
+ validate: () => runRules2(values, rules) === "" && duplicateMessage === "",
29229
30467
  resetValidation: () => {
29230
30468
  }
29231
30469
  });
@@ -29525,18 +30763,14 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
29525
30763
  style: { width: 1, height: 12, backgroundColor: "var(--color-divider-default)" }
29526
30764
  }
29527
30765
  ),
29528
- showMaxCount && /* @__PURE__ */ jsxRuntime.jsxs(
30766
+ showMaxCount && /* @__PURE__ */ jsxRuntime.jsx(
29529
30767
  "span",
29530
30768
  {
29531
30769
  className: cn(
29532
30770
  "s-chip-input__max-count text-12",
29533
30771
  isMax ? "text-(--sys-color-fg-warning)" : "text-(--cmp-chipInput-text-placeholder)"
29534
30772
  ),
29535
- children: [
29536
- "\uCD5C\uB300 ",
29537
- maxCount,
29538
- "\uAC1C"
29539
- ]
30773
+ children: t.maxCount(maxCount)
29540
30774
  }
29541
30775
  ),
29542
30776
  showResetLink && /* @__PURE__ */ jsxRuntime.jsx(
@@ -29545,7 +30779,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
29545
30779
  className: "s-chip-input__reset",
29546
30780
  icon: "reset",
29547
30781
  iconColor: "var(--color-grey-65)",
29548
- label: "\uC785\uB825 \uCD08\uAE30\uD654",
30782
+ label: ti.clearInput,
29549
30783
  underline: true,
29550
30784
  disabled,
29551
30785
  onClick: reset,
@@ -29576,7 +30810,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
29576
30810
  className: "s-chip-input__suggestions flex w-full flex-col outline-none",
29577
30811
  onMouseDown: (e) => e.preventDefault(),
29578
30812
  children: [
29579
- loading2 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "s-chip-input__suggestions-empty p-sd-12 text-center text-12 leading-sd-20 text-(--color-grey-65)", children: "\uBD88\uB7EC\uC624\uB294 \uC911..." }),
30813
+ loading2 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "s-chip-input__suggestions-empty p-sd-12 text-center text-12 leading-sd-20 text-(--color-grey-65)", children: selectT.loading }),
29580
30814
  !effectiveAutocomplete ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-sd-8 px-sd-12 py-sd-6", children: items.map((item4, i) => {
29581
30815
  const selected = values.includes(item4);
29582
30816
  const active = i === activeIndex && !selected;
@@ -29663,7 +30897,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
29663
30897
  clearable = false,
29664
30898
  autoFocus,
29665
30899
  name,
29666
- placeholder = "\uC785\uB825\uD574 \uC8FC\uC138\uC694.",
30900
+ placeholder: placeholderProp,
29667
30901
  disabled = false,
29668
30902
  readOnly = false,
29669
30903
  rules,
@@ -29691,6 +30925,9 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
29691
30925
  className,
29692
30926
  style
29693
30927
  }, ref) {
30928
+ const runRules2 = useRunRules();
30929
+ const { common: tc, input: ti } = useLocale().messages;
30930
+ const placeholder = placeholderProp ?? ti.placeholder;
29694
30931
  const f = FONT3[size];
29695
30932
  const [ruleError, setRuleError] = react.useState("");
29696
30933
  const controlId = useFieldControlId();
@@ -29698,7 +30935,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
29698
30935
  useFormField({
29699
30936
  name,
29700
30937
  validate: () => {
29701
- const msg = runRules(value, rules);
30938
+ const msg = runRules2(value, rules);
29702
30939
  setRuleError(msg);
29703
30940
  return msg === "";
29704
30941
  },
@@ -29764,11 +31001,11 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
29764
31001
  autoFocus,
29765
31002
  onChange: (e) => {
29766
31003
  onValueChange?.(e.target.value);
29767
- if (ruleError !== "") setRuleError(runRules(e.target.value, rules));
31004
+ if (ruleError !== "") setRuleError(runRules2(e.target.value, rules));
29768
31005
  },
29769
31006
  onFocus: () => onFocus?.(),
29770
31007
  onBlur: (e) => {
29771
- if (rules && rules.length > 0) setRuleError(runRules(e.target.value, rules));
31008
+ if (rules && rules.length > 0) setRuleError(runRules2(e.target.value, rules));
29772
31009
  onBlur?.();
29773
31010
  },
29774
31011
  className: cn(
@@ -29792,10 +31029,10 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
29792
31029
  {
29793
31030
  icon: "close",
29794
31031
  size: "xxs",
29795
- ariaLabel: "\uC9C0\uC6B0\uAE30",
31032
+ ariaLabel: tc.clear,
29796
31033
  onClick: () => {
29797
31034
  onValueChange?.("");
29798
- setRuleError(runRules("", rules));
31035
+ setRuleError(runRules2("", rules));
29799
31036
  }
29800
31037
  }
29801
31038
  )
@@ -29856,11 +31093,11 @@ function parseTimeValue(value) {
29856
31093
  function formatTimeValue(hour, minute) {
29857
31094
  return `${padTimePart(clampTimePart(hour, 0, 23))}:${padTimePart(clampTimePart(minute, 0, 59))}`;
29858
31095
  }
29859
- function formatTimeDisplay(value, type) {
31096
+ function formatTimeDisplay(value, type, t) {
29860
31097
  if (value == null || value === "") return "";
29861
31098
  const { hour, minute } = parseTimeValue(value);
29862
31099
  if (type === "default") return formatTimeValue(hour, minute);
29863
- const meridiem = hour >= 12 ? "\uC624\uD6C4" : "\uC624\uC804";
31100
+ const meridiem = hour >= 12 ? t.pm : t.am;
29864
31101
  const displayHour = hour % 12 === 0 ? 12 : hour % 12;
29865
31102
  return `${meridiem} ${padTimePart(displayHour)}:${padTimePart(minute)}`;
29866
31103
  }
@@ -29943,6 +31180,7 @@ function TimeListbox({
29943
31180
  labelPrefix,
29944
31181
  elevated = true
29945
31182
  }) {
31183
+ const t = useLocale().messages.date;
29946
31184
  const toState = (v) => v ? parseTimeValue(v) : null;
29947
31185
  const [time, setTime] = react.useState(() => toState(value));
29948
31186
  react.useEffect(() => {
@@ -29966,13 +31204,13 @@ function TimeListbox({
29966
31204
  const hour = time?.hour;
29967
31205
  const minute = time?.minute ?? 0;
29968
31206
  const meridiem = hour === void 0 ? void 0 : hour >= 12 ? "PM" : "AM";
29969
- const prefix = labelPrefix ? `${labelPrefix} ` : "";
31207
+ const prefix = labelPrefix ?? "";
29970
31208
  const meridiemItems = ["AM", "PM"].map((item4) => {
29971
31209
  const base = item4 === "AM" ? 0 : 12;
29972
31210
  const range = HOURS_24.slice(base, base + 12);
29973
31211
  return {
29974
31212
  key: item4,
29975
- label: item4 === "AM" ? "\uC624\uC804" : "\uC624\uD6C4",
31213
+ label: item4 === "AM" ? t.am : t.pm,
29976
31214
  selected: meridiem === item4,
29977
31215
  disabled: range.every(hourBlocked),
29978
31216
  onSelect: () => {
@@ -29986,14 +31224,14 @@ function TimeListbox({
29986
31224
  const h = display % 12 + (meridiem === "PM" ? 12 : 0);
29987
31225
  return {
29988
31226
  key: String(display),
29989
- label: `${padTimePart(display)}\uC2DC`,
31227
+ label: t.hourItem(padTimePart(display)),
29990
31228
  selected: hour === h,
29991
31229
  disabled: hourBlocked(h),
29992
31230
  onSelect: () => commit([h], { hour: h, minute }, "hour")
29993
31231
  };
29994
31232
  }) : HOURS_24.map((h) => ({
29995
31233
  key: String(h),
29996
- label: `${padTimePart(h)}\uC2DC`,
31234
+ label: t.hourItem(padTimePart(h)),
29997
31235
  selected: hour === h,
29998
31236
  disabled: hourBlocked(h),
29999
31237
  onSelect: () => commit([h], { hour: h, minute }, "hour")
@@ -30001,7 +31239,7 @@ function TimeListbox({
30001
31239
  const minuteHour = hour ?? (meridiem === "PM" ? 12 : 0);
30002
31240
  const minuteItems = minutes.map((m) => ({
30003
31241
  key: String(m),
30004
- label: `${padTimePart(m)}\uBD84`,
31242
+ label: t.minuteItem(padTimePart(m)),
30005
31243
  selected: time != null && minute === m,
30006
31244
  disabled: blocked(minuteHour, m),
30007
31245
  onSelect: () => commit([minuteHour], { hour: minuteHour, minute: m }, "minute")
@@ -30023,12 +31261,12 @@ function TimeListbox({
30023
31261
  style: { height: MODE_LIST_HEIGHT },
30024
31262
  children: [
30025
31263
  showMeridiem && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
30026
- /* @__PURE__ */ jsxRuntime.jsx(ListColumn, { ariaLabel: `${prefix}\uC624\uC804/\uC624\uD6C4`, items: meridiemItems }),
31264
+ /* @__PURE__ */ jsxRuntime.jsx(ListColumn, { ariaLabel: t.meridiemAria(prefix), items: meridiemItems }),
30027
31265
  divider
30028
31266
  ] }),
30029
- /* @__PURE__ */ jsxRuntime.jsx(ListColumn, { ariaLabel: `${prefix}\uC2DC`, items: hourItems }),
31267
+ /* @__PURE__ */ jsxRuntime.jsx(ListColumn, { ariaLabel: t.hourAria(prefix), items: hourItems }),
30030
31268
  divider,
30031
- /* @__PURE__ */ jsxRuntime.jsx(ListColumn, { ariaLabel: `${prefix}\uBD84`, items: minuteItems })
31269
+ /* @__PURE__ */ jsxRuntime.jsx(ListColumn, { ariaLabel: t.minuteAria(prefix), items: minuteItems })
30032
31270
  ]
30033
31271
  }
30034
31272
  );
@@ -30065,6 +31303,8 @@ function STimePicker({
30065
31303
  className,
30066
31304
  style
30067
31305
  }) {
31306
+ const runRules2 = useRunRules();
31307
+ const t = useLocale().messages.date;
30068
31308
  const portalContainer = usePortalContainer();
30069
31309
  const [open, setOpen] = react.useState(false);
30070
31310
  const triggerId = useFieldControlId();
@@ -30074,12 +31314,16 @@ function STimePicker({
30074
31314
  const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
30075
31315
  const normalized = value ? formatTimeValue(parseTimeValue(value).hour, parseTimeValue(value).minute) : null;
30076
31316
  const effectiveShowMeridiem = showMeridiem ?? type === "midday";
30077
- const displayText = formatTimeDisplay(normalized, effectiveShowMeridiem ? "midday" : "default");
31317
+ const displayText = formatTimeDisplay(
31318
+ normalized,
31319
+ effectiveShowMeridiem ? "midday" : "default",
31320
+ t
31321
+ );
30078
31322
  const hasValue = normalized != null && normalized !== "";
30079
31323
  useFormField({
30080
31324
  name,
30081
31325
  validate: () => {
30082
- const msg = runRules(value, rules);
31326
+ const msg = runRules2(value, rules);
30083
31327
  setRuleError(msg);
30084
31328
  return msg === "";
30085
31329
  },
@@ -30091,11 +31335,11 @@ function STimePicker({
30091
31335
  if (disabled) return;
30092
31336
  setOpen(next);
30093
31337
  onOpenChange?.(next);
30094
- if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));
31338
+ if (!next && rules && rules.length > 0) setRuleError(runRules2(value, rules));
30095
31339
  };
30096
31340
  const commitValue = (next) => {
30097
31341
  onValueChange?.(next);
30098
- if (rules && rules.length > 0) setRuleError(runRules(next, rules));
31342
+ if (rules && rules.length > 0) setRuleError(runRules2(next, rules));
30099
31343
  };
30100
31344
  return /* @__PURE__ */ jsxRuntime.jsx(
30101
31345
  SField,
@@ -30174,7 +31418,7 @@ function STimePicker({
30174
31418
  {
30175
31419
  icon: "close",
30176
31420
  size: "xs",
30177
- ariaLabel: "\uC2DC\uAC04 \uC9C0\uC6B0\uAE30",
31421
+ ariaLabel: t.clearTime,
30178
31422
  onClick: (event) => {
30179
31423
  event.stopPropagation();
30180
31424
  commitValue(null);
@@ -30229,9 +31473,9 @@ function normalizeTimeRangeValue(value, rangeOrder = "strict") {
30229
31473
  }
30230
31474
  return normalized;
30231
31475
  }
30232
- function formatTimeRangeDisplay(value, type) {
31476
+ function formatTimeRangeDisplay(value, type, t) {
30233
31477
  if (value == null || value[0] === "" || value[1] === "") return "";
30234
- return `${formatTimeDisplay(value[0], type)} ~ ${formatTimeDisplay(value[1], type)}`;
31478
+ return `${formatTimeDisplay(value[0], type, t)} ~ ${formatTimeDisplay(value[1], type, t)}`;
30235
31479
  }
30236
31480
  var MIDDAY_FIELD_MIN_WIDTH = {
30237
31481
  sm: 178,
@@ -30252,6 +31496,7 @@ function RangeTimeSelector({
30252
31496
  rangeOrder,
30253
31497
  onChange
30254
31498
  }) {
31499
+ const t = useLocale().messages.date;
30255
31500
  const range = value ?? ["00:00", "23:59"];
30256
31501
  const strict = rangeOrder !== "allow-cross-day";
30257
31502
  const change = (side, time) => {
@@ -30274,7 +31519,7 @@ function RangeTimeSelector({
30274
31519
  value: side === "start" ? range[0] : range[1],
30275
31520
  showMeridiem,
30276
31521
  minuteStep,
30277
- labelPrefix: side === "start" ? "\uC2DC\uC791" : "\uC885\uB8CC",
31522
+ labelPrefix: side === "start" ? t.start : t.end,
30278
31523
  elevated: false,
30279
31524
  isDisabled: strict && side === "end" ? (minutes) => minutes < toMinutes(range[0]) : void 0,
30280
31525
  onChange: (time) => change(side, time)
@@ -30295,9 +31540,9 @@ function RangeTimeSelector({
30295
31540
  boxShadow: "var(--shadow-spread-sm), var(--shadow-spread-md)"
30296
31541
  },
30297
31542
  children: [
30298
- renderPanel("start", "\uC2DC\uC791 \uC2DC\uAC04"),
31543
+ renderPanel("start", t.startTime),
30299
31544
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "self-stretch w-px bg-[var(--sys-color-divider-default)]" }),
30300
- renderPanel("end", "\uC885\uB8CC \uC2DC\uAC04")
31545
+ renderPanel("end", t.endTime)
30301
31546
  ]
30302
31547
  }
30303
31548
  );
@@ -30335,6 +31580,8 @@ function STimeRangePicker({
30335
31580
  className,
30336
31581
  style
30337
31582
  }) {
31583
+ const runRules2 = useRunRules();
31584
+ const t = useLocale().messages.date;
30338
31585
  const portalContainer = usePortalContainer();
30339
31586
  const [open, setOpen] = react.useState(false);
30340
31587
  const triggerId = useFieldControlId();
@@ -30346,13 +31593,14 @@ function STimeRangePicker({
30346
31593
  const effectiveShowMeridiem = showMeridiem ?? type === "midday";
30347
31594
  const displayText = formatTimeRangeDisplay(
30348
31595
  normalized,
30349
- effectiveShowMeridiem ? "midday" : "default"
31596
+ effectiveShowMeridiem ? "midday" : "default",
31597
+ t
30350
31598
  );
30351
31599
  const hasValue = normalized != null && normalized[0] !== "" && normalized[1] !== "";
30352
31600
  useFormField({
30353
31601
  name,
30354
31602
  validate: () => {
30355
- const msg = runRules(value, rules);
31603
+ const msg = runRules2(value, rules);
30356
31604
  setRuleError(msg);
30357
31605
  return msg === "";
30358
31606
  },
@@ -30364,11 +31612,11 @@ function STimeRangePicker({
30364
31612
  if (disabled) return;
30365
31613
  setOpen(next);
30366
31614
  onOpenChange?.(next);
30367
- if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));
31615
+ if (!next && rules && rules.length > 0) setRuleError(runRules2(value, rules));
30368
31616
  };
30369
31617
  const commitValue = (next) => {
30370
31618
  onValueChange?.(next);
30371
- if (rules && rules.length > 0) setRuleError(runRules(next, rules));
31619
+ if (rules && rules.length > 0) setRuleError(runRules2(next, rules));
30372
31620
  };
30373
31621
  return /* @__PURE__ */ jsxRuntime.jsx(
30374
31622
  SField,
@@ -30447,7 +31695,7 @@ function STimeRangePicker({
30447
31695
  {
30448
31696
  icon: "close",
30449
31697
  size: "xs",
30450
- ariaLabel: "\uC2DC\uAC04 \uBC94\uC704 \uC9C0\uC6B0\uAE30",
31698
+ ariaLabel: t.clearTimeRange,
30451
31699
  onClick: (event) => {
30452
31700
  event.stopPropagation();
30453
31701
  commitValue(null);
@@ -30606,6 +31854,7 @@ exports.SKELETON_TYPES = SKELETON_TYPES;
30606
31854
  exports.SKELETON_TYPE_CONFIG = SKELETON_TYPE_CONFIG;
30607
31855
  exports.SKeyValueTable = SKeyValueTable;
30608
31856
  exports.SLAYOUT_MIN_WIDTH = SLAYOUT_MIN_WIDTH;
31857
+ exports.SLOCALES = SLOCALES;
30609
31858
  exports.SLauncherListBox = SLauncherListBox;
30610
31859
  exports.SLayout = SLayout;
30611
31860
  exports.SLayoutContext = SLayoutContext;
@@ -30615,6 +31864,7 @@ exports.SList = SList2;
30615
31864
  exports.SListItem = SListItem2;
30616
31865
  exports.SLoadingContainer = SLoadingContainer;
30617
31866
  exports.SLoadingModal = SLoadingModal;
31867
+ exports.SLocaleProvider = SLocaleProvider;
30618
31868
  exports.SLoginCard = SLoginCard2;
30619
31869
  exports.SLogo = SLogo;
30620
31870
  exports.SMeatballButton = SMeatballButton2;
@@ -30684,7 +31934,9 @@ exports.isColorKey = isColorKey;
30684
31934
  exports.isFieldWidthGrade = isFieldWidthGrade;
30685
31935
  exports.loading = loading;
30686
31936
  exports.normalizeExtension = normalizeExtension;
31937
+ exports.normalizeLocale = normalizeLocale;
30687
31938
  exports.resolveColor = resolveColor;
31939
+ exports.useLocale = useLocale;
30688
31940
  exports.useSLayout = useSLayout;
30689
31941
  //# sourceMappingURL=index.cjs.map
30690
31942
  //# sourceMappingURL=index.cjs.map