sellmate-design-system-react 9.0.0-beta.103 → 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 (52) hide show
  1. package/AGENTS.md +4 -2
  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 +3 -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/SStepper/README.md +1 -1
  31. package/dist/components/SStepper/SStepper.d.ts +2 -2
  32. package/dist/components/STable/README.md +3 -3
  33. package/dist/components/STable/STable.d.ts +3 -1
  34. package/dist/components/STableBar/README.md +1 -1
  35. package/dist/components/STableBar/STableBar.d.ts +1 -1
  36. package/dist/components/STimePicker/timepicker.config.d.ts +2 -1
  37. package/dist/components/STimeRangePicker/time-range-picker.config.d.ts +2 -1
  38. package/dist/components/STimeline/README.md +1 -1
  39. package/dist/components/STimeline/STimeline.d.ts +1 -0
  40. package/dist/index.cjs +1492 -478
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.js +1492 -478
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/chart/radial.d.ts +2 -2
  45. package/dist/lib/date.d.ts +9 -5
  46. package/dist/lib/form.d.ts +5 -2
  47. package/dist/lib/locale.d.ts +274 -0
  48. package/dist/lib/tree-row.d.ts +1 -1
  49. package/dist/llms-full.txt +23 -21
  50. package/dist/llms.txt +4 -2
  51. package/dist/styles.css +3 -0
  52. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -247,8 +247,211 @@ var fieldWidthValue = (v) => {
247
247
  // src/lib/locale.ts
248
248
  var SLOCALES = ["ko", "en", "ja", "zh"];
249
249
  var DEFAULT_LOCALE = "ko";
250
+ var koreanParticle = (word, consonant, vowel) => {
251
+ const code = word.charCodeAt(word.length - 1);
252
+ if (code < 44032 || code > 55203) return consonant;
253
+ return (code - 44032) % 28 === 0 ? vowel : consonant;
254
+ };
250
255
  var BUNDLES = {
251
256
  ko: {
257
+ accountListBox: { accountSetting: "\uACC4\uC815 \uC124\uC815", language: "\uC5B8\uC5B4 \uBCC0\uACBD", logout: "\uACC4\uC815 \uB85C\uADF8\uC544\uC6C3" },
258
+ gnbSystem: { alert: "\uC54C\uB9BC", setting: "\uC124\uC815" },
259
+ editor: {
260
+ placeholder: "\uB0B4\uC6A9\uC744 \uC785\uB825\uD574 \uC8FC\uC138\uC694.",
261
+ toolbarLabel: "\uC11C\uC2DD \uB3C4\uAD6C",
262
+ tableSize: "\uD45C \uD06C\uAE30",
263
+ linkUrl: "\uB9C1\uD06C \uC8FC\uC18C",
264
+ apply: "\uC801\uC6A9",
265
+ remove: "\uC81C\uAC70",
266
+ headingLevel: "\uC81C\uBAA9 \uB2E8\uACC4",
267
+ headingBody: "\uBCF8\uBB38",
268
+ fontSize: "\uAE00\uC790 \uD06C\uAE30",
269
+ fontSizeDefaultLabel: "\uAE30\uBCF8",
270
+ bold: "\uAD75\uAC8C",
271
+ italic: "\uAE30\uC6B8\uC784",
272
+ underline: "\uBC11\uC904",
273
+ strike: "\uCDE8\uC18C\uC120",
274
+ inlineCode: "\uC778\uB77C\uC778 \uCF54\uB4DC",
275
+ textColor: "\uAE00\uC790\uC0C9",
276
+ clearColor: "\uC0C9 \uC9C0\uC6B0\uAE30",
277
+ alignLeft: "\uC67C\uCABD \uC815\uB82C",
278
+ alignCenter: "\uAC00\uC6B4\uB370 \uC815\uB82C",
279
+ alignRight: "\uC624\uB978\uCABD \uC815\uB82C",
280
+ alignJustify: "\uC591\uCABD \uC815\uB82C",
281
+ bulletList: "\uAE00\uBA38\uB9AC \uAE30\uD638 \uBAA9\uB85D",
282
+ orderedList: "\uBC88\uD638 \uB9E4\uAE30\uAE30 \uBAA9\uB85D",
283
+ taskList: "\uCCB4\uD06C \uBAA9\uB85D",
284
+ list: "\uBAA9\uB85D",
285
+ blockquote: "\uC778\uC6A9\uAD6C",
286
+ codeBlock: "\uCF54\uB4DC \uBE14\uB85D",
287
+ divider: "\uAD6C\uBD84\uC120",
288
+ link: "\uB9C1\uD06C",
289
+ insertImage: "\uC774\uBBF8\uC9C0 \uB123\uAE30",
290
+ image: "\uC774\uBBF8\uC9C0",
291
+ table: "\uD45C",
292
+ addRowAbove: "\uC704\uC5D0 \uD589 \uCD94\uAC00",
293
+ addRowBelow: "\uC544\uB798\uC5D0 \uD589 \uCD94\uAC00",
294
+ addColLeft: "\uC67C\uCABD\uC5D0 \uC5F4 \uCD94\uAC00",
295
+ addColRight: "\uC624\uB978\uCABD\uC5D0 \uC5F4 \uCD94\uAC00",
296
+ mergeCells: "\uC140 \uBCD1\uD569",
297
+ splitCell: "\uBCD1\uD569 \uD574\uC81C",
298
+ toggleHeaderRow: "\uD5E4\uB354 \uD589 \uD1A0\uAE00",
299
+ toggleHeaderCol: "\uD5E4\uB354 \uC5F4 \uD1A0\uAE00",
300
+ deleteRow: "\uD589 \uC0AD\uC81C",
301
+ deleteCol: "\uC5F4 \uC0AD\uC81C",
302
+ deleteTable: "\uD45C \uC0AD\uC81C",
303
+ undo: "\uC2E4\uD589 \uCDE8\uC18C",
304
+ redo: "\uB2E4\uC2DC \uC2E4\uD589",
305
+ colorDefault: "\uAE30\uBCF8",
306
+ colorSecondary: "\uBCF4\uC870",
307
+ colorMuted: "\uD750\uB9BC",
308
+ colorAccent: "\uAC15\uC870",
309
+ colorBrand: "\uBE0C\uB79C\uB4DC",
310
+ colorSuccess: "\uC131\uACF5",
311
+ colorWarning: "\uC8FC\uC758",
312
+ colorDanger: "\uC704\uD5D8",
313
+ tableCell: (r3, c) => `${r3}\uD589 ${c}\uC5F4`,
314
+ tableSizeText: (rows, cols) => `${rows}\uD589 \xD7 ${cols}\uC5F4`,
315
+ heading: (level) => `\uC81C\uBAA9 ${level}`,
316
+ fontSizeDefault: (px) => `\uAE30\uBCF8 (\uBCF8\uBB38 ${px}px)`,
317
+ closeEditing: (label) => `${label} \uB2EB\uAE30`
318
+ },
319
+ form: { invalid: "\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uAC12\uC785\uB2C8\uB2E4." },
320
+ date: {
321
+ weekdays: ["\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"],
322
+ weekdaysLong: ["\uC77C\uC694\uC77C", "\uC6D4\uC694\uC77C", "\uD654\uC694\uC77C", "\uC218\uC694\uC77C", "\uBAA9\uC694\uC77C", "\uAE08\uC694\uC77C", "\uD1A0\uC694\uC77C"],
323
+ today: "\uC624\uB298",
324
+ prevYear: "\uC774\uC804 \uD574",
325
+ nextYear: "\uB2E4\uC74C \uD574",
326
+ prevMonth: "\uC774\uC804 \uB2EC",
327
+ nextMonth: "\uB2E4\uC74C \uB2EC",
328
+ monthLabel: (month) => `${month}\uC6D4`,
329
+ dayLabel: (day) => `${day}\uC77C`,
330
+ unitYear: "\uB144",
331
+ unitMonth: "\uC6D4",
332
+ unitDay: "\uC77C",
333
+ hourItem: (hour) => `${hour}\uC2DC`,
334
+ minuteItem: (minute) => `${minute}\uBD84`,
335
+ hourAria: (prefix) => prefix ? `${prefix} \uC2DC` : "\uC2DC",
336
+ minuteAria: (prefix) => prefix ? `${prefix} \uBD84` : "\uBD84",
337
+ meridiemAria: (prefix) => prefix ? `${prefix} \uC624\uC804/\uC624\uD6C4` : "\uC624\uC804/\uC624\uD6C4",
338
+ am: "\uC624\uC804",
339
+ pm: "\uC624\uD6C4",
340
+ rangeFrom: "\uBD80\uD130",
341
+ rangeTo: "\uAE4C\uC9C0",
342
+ clearDate: "\uB0A0\uC9DC \uC9C0\uC6B0\uAE30",
343
+ clearMonth: "\uC6D4 \uC9C0\uC6B0\uAE30",
344
+ clearYear: "\uC5F0\uB3C4 \uC9C0\uC6B0\uAE30",
345
+ clearPeriod: "\uAE30\uAC04 \uC9C0\uC6B0\uAE30",
346
+ clearTime: "\uC2DC\uAC04 \uC9C0\uC6B0\uAE30",
347
+ clearTimeRange: "\uC2DC\uAC04 \uBC94\uC704 \uC9C0\uC6B0\uAE30",
348
+ start: "\uC2DC\uC791",
349
+ end: "\uC885\uB8CC",
350
+ startTime: "\uC2DC\uC791 \uC2DC\uAC04",
351
+ endTime: "\uC885\uB8CC \uC2DC\uAC04"
352
+ },
353
+ chart: {
354
+ unit: (unit) => `\uB2E8\uC704 : ${unit}`,
355
+ pie: "\uD30C\uC774 \uADF8\uB798\uD504",
356
+ donut: "\uB3C4\uB11B \uADF8\uB798\uD504",
357
+ radialSummary: (count, kind) => `${count}\uAC1C \uD56D\uBAA9 ${kind}`,
358
+ barSummary: (c, s, stacked) => `${c}\uAC1C \uD56D\uBAA9, ${s}\uAC1C \uACC4\uC5F4 ${stacked ? "\uB204\uC801 " : ""}\uB9C9\uB300 \uADF8\uB798\uD504`,
359
+ lineSummary: (c, s, stacked) => `${c}\uAC1C \uD56D\uBAA9, ${s}\uAC1C \uACC4\uC5F4 ${stacked ? "\uB204\uC801 " : ""}\uAEBE\uC740\uC120 \uADF8\uB798\uD504`
360
+ },
361
+ chipFilter: {
362
+ periodDay: "\uC77C\uBCC4",
363
+ periodMonth: "\uC6D4\uBCC4",
364
+ periodQuarter: "\uBD84\uAE30\uBCC4",
365
+ periodHalf: "\uBC18\uAE30\uBCC4",
366
+ periodYear: "\uC5F0\uB3C4\uBCC4",
367
+ custom: "\uC0AC\uC6A9\uC790 \uC9C0\uC815",
368
+ today: "\uC624\uB298",
369
+ last7: "\uC9C0\uB09C 7\uC77C",
370
+ last30: "\uC9C0\uB09C 30\uC77C",
371
+ maxWord: "\uCD5C\uB300",
372
+ maxRangeHint: (days) => `\uCD5C\uB300 ${days}\uC77C\uC529`,
373
+ requireAll: "\uD56D\uBAA9\uC744 \uBAA8\uB450 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.",
374
+ requireAnyDefault: "\uCD5C\uC18C 1\uAC1C\uC758 \uD544\uD130\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694.",
375
+ requireAnyNamed: (name) => `\uCD5C\uC18C 1\uAC1C\uC758 ${name}${koreanParticle(name, "\uC744", "\uB97C")} \uC120\uD0DD\uD574\uC8FC\uC138\uC694.`,
376
+ requireField: (label) => `${label}${koreanParticle(label, "\uC744", "\uB97C")} \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.`,
377
+ fieldFallback: "\uD56D\uBAA9",
378
+ valueListMore: (first, rest) => `${first} \uC678 ${rest}\uAC1C`,
379
+ quarter: (n) => `${n}\uBD84\uAE30`,
380
+ firstHalf: "\uC0C1\uBC18\uAE30",
381
+ secondHalf: "\uD558\uBC18\uAE30",
382
+ removeFilter: (label) => `${label} \uD544\uD130 \uC81C\uAC70`,
383
+ clearFilter: (label) => `${label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
384
+ resetSearch: "\uAC80\uC0C9 \uCD08\uAE30\uD654",
385
+ addFilter: "\uD544\uD130 \uCD94\uAC00",
386
+ noAddableFilter: "\uCD94\uAC00\uD560 \uD544\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
387
+ selectNone: "\uC120\uD0DD \uD574\uC81C",
388
+ selectAll: "\uC804\uCCB4 \uC120\uD0DD",
389
+ removeItem: (label) => `${label} \uC0AD\uC81C`,
390
+ keywordContains: "\uD3EC\uD568",
391
+ keywordExact: "\uC77C\uCE58",
392
+ keywordExcludes: "\uBBF8\uD3EC\uD568",
393
+ keywordHintCsv: "\uB2E4\uC911 \uD0A4\uC6CC\uB4DC\uB294 \uCF64\uB9C8(,)\uB85C \uAD6C\uBD84",
394
+ keywordHintEnter: "\uC785\uB825 \uD6C4 Enter\uB85C \uCD94\uAC00",
395
+ keywordCondition: "\uAC80\uC0C9 \uC870\uAC74 :",
396
+ noSearchResults: "\uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
397
+ },
398
+ numberInput: {
399
+ rangeBetween: (min, max) => `${min}~${max} \uC0AC\uC774\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694.`,
400
+ atLeast: (min) => `${min} \uC774\uC0C1\uC73C\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694.`,
401
+ atMost: (max) => `${max} \uC774\uD558\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694.`,
402
+ increase: "\uC99D\uAC00",
403
+ decrease: "\uAC10\uC18C"
404
+ },
405
+ chipInput: {
406
+ placeholderWithComma: "\uD0DC\uADF8 \uC785\uB825 (Enter\xB7\uCF64\uB9C8\uB85C \uB4F1\uB85D)",
407
+ placeholder: "\uD0DC\uADF8 \uC785\uB825 (Enter\uB85C \uB4F1\uB85D)",
408
+ duplicateNamed: (label) => `\uC774\uBBF8 \uC785\uB825\uB41C ${label}\uC785\uB2C8\uB2E4.`,
409
+ duplicate: "\uC911\uBCF5\uB41C \uAC12\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4.",
410
+ maxCount: (max) => `\uCD5C\uB300 ${max}\uAC1C`
411
+ },
412
+ slider: { minValue: "\uCD5C\uC19F\uAC12", maxValue: "\uCD5C\uB313\uAC12" },
413
+ chat: {
414
+ removeAttachment: (name) => `${name} \uC81C\uAC70`,
415
+ placeholder: "\uBA54\uC2DC\uC9C0\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694...",
416
+ attachFile: "\uD30C\uC77C \uCCA8\uBD80",
417
+ stopResponse: "\uC751\uB2F5 \uC911\uC9C0",
418
+ send: "\uC804\uC1A1",
419
+ read: "\uC77D\uC74C",
420
+ unread: "\uC548 \uC77D\uC74C"
421
+ },
422
+ loadingModal: {
423
+ loadingMessage: "\uC791\uC5C5 \uC9C4\uD589\uC911...",
424
+ errorMessage: "\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD558\uC600\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",
425
+ errorButton: "\uB2E4\uC2DC \uC2DC\uB3C4",
426
+ ariaTitle: "\uB85C\uB529 \uC911"
427
+ },
428
+ stepper: { errorTooltip: "\uD655\uC778\uC774 \uD544\uC694\uD55C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.", ariaLabel: "\uC9C4\uD589 \uB2E8\uACC4" },
429
+ timeline: { empty: "\uB0B4\uC5ED\uC774 \uC5C6\uC2B5\uB2C8\uB2E4." },
430
+ callout: { dangerTitle: "\uC8FC\uC758\uC0AC\uD56D" },
431
+ guide: { tip: "\uD65C\uC6A9 TIP", notion: "\uC0AC\uC6A9\uBC95 \uC548\uB0B4" },
432
+ loginCard: { login: "\uD1B5\uD569 \uACC4\uC815\uC73C\uB85C \uB85C\uADF8\uC778" },
433
+ modal: { defaultTitle: "\uBAA8\uB2EC" },
434
+ launcher: { opensInNewTab: "\uC0C8 \uD0ED\uC5D0\uC11C \uC5F4\uB9BC" },
435
+ common: {
436
+ close: "\uB2EB\uAE30",
437
+ clear: "\uC9C0\uC6B0\uAE30",
438
+ confirm: "\uD655\uC778",
439
+ all: "\uC804\uCCB4",
440
+ back: "\uB4A4\uB85C\uAC00\uAE30",
441
+ more: "\uB354\uBCF4\uAE30",
442
+ moreActions: "\uAE30\uB2A5 \uB354 \uBCF4\uAE30",
443
+ openMenu: "\uBA54\uB274 \uC5F4\uAE30",
444
+ dragHandle: "\uB4DC\uB798\uADF8 \uD578\uB4E4",
445
+ resizeDrawer: "Drawer \uB108\uBE44 \uC870\uC808",
446
+ search: "\uAC80\uC0C9",
447
+ count: (n) => `${n}\uAC1C`
448
+ },
449
+ input: {
450
+ placeholder: "\uC785\uB825\uD574 \uC8FC\uC138\uC694.",
451
+ searchWithinResults: "\uACB0\uACFC \uB0B4 \uAC80\uC0C9",
452
+ clearInput: "\uC785\uB825 \uCD08\uAE30\uD654",
453
+ showPassword: "\uBE44\uBC00\uBC88\uD638 \uD45C\uC2DC"
454
+ },
252
455
  pagination: {
253
456
  firstPage: "\uCCAB \uD398\uC774\uC9C0",
254
457
  prevPage: "\uC774\uC804 \uD398\uC774\uC9C0",
@@ -265,9 +468,228 @@ var BUNDLES = {
265
468
  searchPlaceholder: "\uAC80\uC0C9",
266
469
  empty: "\uD45C\uC2DC\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
267
470
  loading: "\uBD88\uB7EC\uC624\uB294 \uC911..."
471
+ },
472
+ table: {
473
+ selectAll: "\uC804\uCCB4 \uC120\uD0DD",
474
+ selectRow: "\uD589 \uC120\uD0DD",
475
+ empty: "\uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
476
+ rowsPerPage: (count) => `${count}\uAC1C\uC529 \uBCF4\uAE30`,
477
+ editable: "\uC218\uC815 \uAC00\uB2A5",
478
+ opensInNewScreen: "\uC0C8 \uD654\uBA74\uC5D0\uC11C \uC5F4\uAE30",
479
+ sortBy: (label) => `${label} \uC815\uB82C`,
480
+ denseOff: "\uB113\uAC8C \uBCF4\uAE30",
481
+ denseOn: "\uC881\uAC8C \uBCF4\uAE30"
482
+ },
483
+ tableBar: {
484
+ totalBefore: "\uCD1D ",
485
+ totalAfter: " \uAC74",
486
+ selectedBefore: "",
487
+ selectedAfter: " \uAC74 \uC120\uD0DD"
268
488
  }
269
489
  },
270
490
  en: {
491
+ accountListBox: {
492
+ accountSetting: "Account settings",
493
+ language: "Change language",
494
+ logout: "Log out"
495
+ },
496
+ gnbSystem: { alert: "Notifications", setting: "Settings" },
497
+ editor: {
498
+ placeholder: "Enter your content.",
499
+ toolbarLabel: "Formatting tools",
500
+ tableSize: "Table size",
501
+ linkUrl: "Link URL",
502
+ apply: "Apply",
503
+ remove: "Remove",
504
+ headingLevel: "Heading level",
505
+ headingBody: "Body",
506
+ fontSize: "Font size",
507
+ fontSizeDefaultLabel: "Default",
508
+ bold: "Bold",
509
+ italic: "Italic",
510
+ underline: "Underline",
511
+ strike: "Strikethrough",
512
+ inlineCode: "Inline code",
513
+ textColor: "Text color",
514
+ clearColor: "Clear color",
515
+ alignLeft: "Align left",
516
+ alignCenter: "Align center",
517
+ alignRight: "Align right",
518
+ alignJustify: "Justify",
519
+ bulletList: "Bullet list",
520
+ orderedList: "Numbered list",
521
+ taskList: "Checklist",
522
+ list: "List",
523
+ blockquote: "Quote",
524
+ codeBlock: "Code block",
525
+ divider: "Divider",
526
+ link: "Link",
527
+ insertImage: "Insert image",
528
+ image: "Image",
529
+ table: "Table",
530
+ addRowAbove: "Add row above",
531
+ addRowBelow: "Add row below",
532
+ addColLeft: "Add column left",
533
+ addColRight: "Add column right",
534
+ mergeCells: "Merge cells",
535
+ splitCell: "Split cell",
536
+ toggleHeaderRow: "Toggle header row",
537
+ toggleHeaderCol: "Toggle header column",
538
+ deleteRow: "Delete row",
539
+ deleteCol: "Delete column",
540
+ deleteTable: "Delete table",
541
+ undo: "Undo",
542
+ redo: "Redo",
543
+ colorDefault: "Default",
544
+ colorSecondary: "Secondary",
545
+ colorMuted: "Muted",
546
+ colorAccent: "Accent",
547
+ colorBrand: "Brand",
548
+ colorSuccess: "Success",
549
+ colorWarning: "Warning",
550
+ colorDanger: "Danger",
551
+ tableCell: (r3, c) => `Row ${r3}, column ${c}`,
552
+ tableSizeText: (rows, cols) => `${rows} rows \xD7 ${cols} columns`,
553
+ heading: (level) => `Heading ${level}`,
554
+ fontSizeDefault: (px) => `Default (body ${px}px)`,
555
+ closeEditing: (label) => `Close ${label}`
556
+ },
557
+ form: { invalid: "Invalid value." },
558
+ date: {
559
+ weekdays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
560
+ weekdaysLong: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
561
+ today: "Today",
562
+ prevYear: "Previous year",
563
+ nextYear: "Next year",
564
+ prevMonth: "Previous month",
565
+ nextMonth: "Next month",
566
+ monthLabel: (month) => ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][month - 1] ?? String(month),
567
+ dayLabel: (day) => String(day),
568
+ unitYear: "-",
569
+ unitMonth: "-",
570
+ unitDay: "",
571
+ hourItem: (hour) => hour,
572
+ minuteItem: (minute) => minute,
573
+ hourAria: (prefix) => prefix ? `${prefix} hour` : "Hour",
574
+ minuteAria: (prefix) => prefix ? `${prefix} minute` : "Minute",
575
+ meridiemAria: (prefix) => prefix ? `${prefix} AM/PM` : "AM/PM",
576
+ am: "AM",
577
+ pm: "PM",
578
+ rangeFrom: "From",
579
+ rangeTo: "To",
580
+ clearDate: "Clear date",
581
+ clearMonth: "Clear month",
582
+ clearYear: "Clear year",
583
+ clearPeriod: "Clear period",
584
+ clearTime: "Clear time",
585
+ clearTimeRange: "Clear time range",
586
+ start: "Start",
587
+ end: "End",
588
+ startTime: "Start time",
589
+ endTime: "End time"
590
+ },
591
+ chart: {
592
+ unit: (unit) => `Unit: ${unit}`,
593
+ pie: "Pie chart",
594
+ donut: "Donut chart",
595
+ radialSummary: (count, kind) => `${kind} with ${count} ${count === 1 ? "item" : "items"}`,
596
+ barSummary: (c, s, stacked) => `${stacked ? "Stacked bar chart" : "Bar chart"} with ${c} ${c === 1 ? "item" : "items"} and ${s} series`,
597
+ lineSummary: (c, s, stacked) => `${stacked ? "Stacked line chart" : "Line chart"} with ${c} ${c === 1 ? "item" : "items"} and ${s} series`
598
+ },
599
+ chipFilter: {
600
+ periodDay: "Daily",
601
+ periodMonth: "Monthly",
602
+ periodQuarter: "Quarterly",
603
+ periodHalf: "Half-yearly",
604
+ periodYear: "Yearly",
605
+ custom: "Custom",
606
+ today: "Today",
607
+ last7: "Last 7 days",
608
+ last30: "Last 30 days",
609
+ maxWord: "max",
610
+ maxRangeHint: (days) => `max ${days} days at a time`,
611
+ requireAll: "Select all items.",
612
+ requireAnyDefault: "Select at least one filter.",
613
+ requireAnyNamed: (name) => `Select at least one ${name}.`,
614
+ requireField: (label) => `Select ${label}.`,
615
+ fieldFallback: "item",
616
+ valueListMore: (first, rest) => `${first} +${rest} more`,
617
+ quarter: (n) => `Q${n}`,
618
+ firstHalf: "H1",
619
+ secondHalf: "H2",
620
+ removeFilter: (label) => `Remove ${label} filter`,
621
+ clearFilter: (label) => `Clear ${label} filter`,
622
+ resetSearch: "Reset search",
623
+ addFilter: "Add filter",
624
+ noAddableFilter: "No filters to add.",
625
+ selectNone: "Deselect all",
626
+ selectAll: "Select all",
627
+ removeItem: (label) => `Delete ${label}`,
628
+ keywordContains: "Contains",
629
+ keywordExact: "Exact",
630
+ keywordExcludes: "Excludes",
631
+ keywordHintCsv: "Separate multiple keywords with commas (,)",
632
+ keywordHintEnter: "Press Enter to add",
633
+ keywordCondition: "Search condition:",
634
+ noSearchResults: "No search results."
635
+ },
636
+ numberInput: {
637
+ rangeBetween: (min, max) => `Enter a value between ${min} and ${max}.`,
638
+ atLeast: (min) => `Enter ${min} or more.`,
639
+ atMost: (max) => `Enter ${max} or less.`,
640
+ increase: "Increase",
641
+ decrease: "Decrease"
642
+ },
643
+ chipInput: {
644
+ placeholderWithComma: "Add a tag (press Enter or comma)",
645
+ placeholder: "Add a tag (press Enter)",
646
+ duplicateNamed: (label) => `This ${label} has already been entered.`,
647
+ duplicate: "Duplicate values exist.",
648
+ maxCount: (max) => `Up to ${max}`
649
+ },
650
+ slider: { minValue: "Minimum", maxValue: "Maximum" },
651
+ chat: {
652
+ removeAttachment: (name) => `Remove ${name}`,
653
+ placeholder: "Enter a message...",
654
+ attachFile: "Attach file",
655
+ stopResponse: "Stop response",
656
+ send: "Send",
657
+ read: "Read",
658
+ unread: "Unread"
659
+ },
660
+ loadingModal: {
661
+ loadingMessage: "Working...",
662
+ errorMessage: "The task failed. Please try again.",
663
+ errorButton: "Retry",
664
+ ariaTitle: "Loading"
665
+ },
666
+ stepper: { errorTooltip: "Some items need your attention.", ariaLabel: "Progress steps" },
667
+ timeline: { empty: "No history." },
668
+ callout: { dangerTitle: "Caution" },
669
+ guide: { tip: "Tip", notion: "How-to guide" },
670
+ loginCard: { login: "Sign in with unified account" },
671
+ modal: { defaultTitle: "Modal" },
672
+ launcher: { opensInNewTab: "Opens in a new tab" },
673
+ common: {
674
+ close: "Close",
675
+ clear: "Clear",
676
+ confirm: "OK",
677
+ all: "All",
678
+ back: "Back",
679
+ more: "More",
680
+ moreActions: "More actions",
681
+ openMenu: "Open menu",
682
+ dragHandle: "Drag handle",
683
+ resizeDrawer: "Resize drawer width",
684
+ search: "Search",
685
+ count: (n) => String(n)
686
+ },
687
+ input: {
688
+ placeholder: "Please enter a value.",
689
+ searchWithinResults: "Search within results",
690
+ clearInput: "Reset input",
691
+ showPassword: "Show password"
692
+ },
271
693
  pagination: {
272
694
  firstPage: "First page",
273
695
  prevPage: "Previous page",
@@ -284,9 +706,228 @@ var BUNDLES = {
284
706
  searchPlaceholder: "Search",
285
707
  empty: "No items to display.",
286
708
  loading: "Loading..."
709
+ },
710
+ table: {
711
+ selectAll: "Select all",
712
+ selectRow: "Select row",
713
+ empty: "No data.",
714
+ rowsPerPage: (count) => `${count} per page`,
715
+ editable: "Editable",
716
+ opensInNewScreen: "Opens in a new screen",
717
+ sortBy: (label) => `Sort by ${label}`,
718
+ denseOff: "Comfortable view",
719
+ denseOn: "Compact view"
720
+ },
721
+ tableBar: {
722
+ totalBefore: "Total ",
723
+ totalAfter: "",
724
+ selectedBefore: "",
725
+ selectedAfter: " selected"
287
726
  }
288
727
  },
289
728
  ja: {
729
+ accountListBox: {
730
+ accountSetting: "\u30A2\u30AB\u30A6\u30F3\u30C8\u8A2D\u5B9A",
731
+ language: "\u8A00\u8A9E\u306E\u5909\u66F4",
732
+ logout: "\u30ED\u30B0\u30A2\u30A6\u30C8"
733
+ },
734
+ gnbSystem: { alert: "\u901A\u77E5", setting: "\u8A2D\u5B9A" },
735
+ editor: {
736
+ placeholder: "\u5185\u5BB9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
737
+ toolbarLabel: "\u66F8\u5F0F\u30C4\u30FC\u30EB",
738
+ tableSize: "\u8868\u306E\u30B5\u30A4\u30BA",
739
+ linkUrl: "\u30EA\u30F3\u30AFURL",
740
+ apply: "\u9069\u7528",
741
+ remove: "\u524A\u9664",
742
+ headingLevel: "\u898B\u51FA\u3057\u30EC\u30D9\u30EB",
743
+ headingBody: "\u672C\u6587",
744
+ fontSize: "\u6587\u5B57\u30B5\u30A4\u30BA",
745
+ fontSizeDefaultLabel: "\u6A19\u6E96",
746
+ bold: "\u592A\u5B57",
747
+ italic: "\u659C\u4F53",
748
+ underline: "\u4E0B\u7DDA",
749
+ strike: "\u53D6\u308A\u6D88\u3057\u7DDA",
750
+ inlineCode: "\u30A4\u30F3\u30E9\u30A4\u30F3\u30B3\u30FC\u30C9",
751
+ textColor: "\u6587\u5B57\u8272",
752
+ clearColor: "\u8272\u3092\u30AF\u30EA\u30A2",
753
+ alignLeft: "\u5DE6\u63C3\u3048",
754
+ alignCenter: "\u4E2D\u592E\u63C3\u3048",
755
+ alignRight: "\u53F3\u63C3\u3048",
756
+ alignJustify: "\u4E21\u7AEF\u63C3\u3048",
757
+ bulletList: "\u7B87\u6761\u66F8\u304D",
758
+ orderedList: "\u756A\u53F7\u4ED8\u304D\u30EA\u30B9\u30C8",
759
+ taskList: "\u30C1\u30A7\u30C3\u30AF\u30EA\u30B9\u30C8",
760
+ list: "\u30EA\u30B9\u30C8",
761
+ blockquote: "\u5F15\u7528",
762
+ codeBlock: "\u30B3\u30FC\u30C9\u30D6\u30ED\u30C3\u30AF",
763
+ divider: "\u533A\u5207\u308A\u7DDA",
764
+ link: "\u30EA\u30F3\u30AF",
765
+ insertImage: "\u753B\u50CF\u3092\u633F\u5165",
766
+ image: "\u753B\u50CF",
767
+ table: "\u8868",
768
+ addRowAbove: "\u4E0A\u306B\u884C\u3092\u8FFD\u52A0",
769
+ addRowBelow: "\u4E0B\u306B\u884C\u3092\u8FFD\u52A0",
770
+ addColLeft: "\u5DE6\u306B\u5217\u3092\u8FFD\u52A0",
771
+ addColRight: "\u53F3\u306B\u5217\u3092\u8FFD\u52A0",
772
+ mergeCells: "\u30BB\u30EB\u3092\u7D50\u5408",
773
+ splitCell: "\u7D50\u5408\u3092\u89E3\u9664",
774
+ toggleHeaderRow: "\u30D8\u30C3\u30C0\u30FC\u884C\u3092\u5207\u308A\u66FF\u3048",
775
+ toggleHeaderCol: "\u30D8\u30C3\u30C0\u30FC\u5217\u3092\u5207\u308A\u66FF\u3048",
776
+ deleteRow: "\u884C\u3092\u524A\u9664",
777
+ deleteCol: "\u5217\u3092\u524A\u9664",
778
+ deleteTable: "\u8868\u3092\u524A\u9664",
779
+ undo: "\u5143\u306B\u623B\u3059",
780
+ redo: "\u3084\u308A\u76F4\u3057",
781
+ colorDefault: "\u6A19\u6E96",
782
+ colorSecondary: "\u88DC\u52A9",
783
+ colorMuted: "\u8584\u3044",
784
+ colorAccent: "\u5F37\u8ABF",
785
+ colorBrand: "\u30D6\u30E9\u30F3\u30C9",
786
+ colorSuccess: "\u6210\u529F",
787
+ colorWarning: "\u6CE8\u610F",
788
+ colorDanger: "\u5371\u967A",
789
+ tableCell: (r3, c) => `${r3}\u884C${c}\u5217`,
790
+ tableSizeText: (rows, cols) => `${rows}\u884C \xD7 ${cols}\u5217`,
791
+ heading: (level) => `\u898B\u51FA\u3057${level}`,
792
+ fontSizeDefault: (px) => `\u6A19\u6E96\uFF08\u672C\u6587 ${px}px\uFF09`,
793
+ closeEditing: (label) => `${label}\u3092\u9589\u3058\u308B`
794
+ },
795
+ form: { invalid: "\u7121\u52B9\u306A\u5024\u3067\u3059\u3002" },
796
+ date: {
797
+ weekdays: ["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"],
798
+ weekdaysLong: ["\u65E5\u66DC\u65E5", "\u6708\u66DC\u65E5", "\u706B\u66DC\u65E5", "\u6C34\u66DC\u65E5", "\u6728\u66DC\u65E5", "\u91D1\u66DC\u65E5", "\u571F\u66DC\u65E5"],
799
+ today: "\u4ECA\u65E5",
800
+ prevYear: "\u524D\u306E\u5E74",
801
+ nextYear: "\u6B21\u306E\u5E74",
802
+ prevMonth: "\u524D\u306E\u6708",
803
+ nextMonth: "\u6B21\u306E\u6708",
804
+ monthLabel: (month) => `${month}\u6708`,
805
+ dayLabel: (day) => `${day}\u65E5`,
806
+ unitYear: "\u5E74",
807
+ unitMonth: "\u6708",
808
+ unitDay: "\u65E5",
809
+ hourItem: (hour) => `${hour}\u6642`,
810
+ minuteItem: (minute) => `${minute}\u5206`,
811
+ hourAria: (prefix) => `${prefix}\u6642`,
812
+ minuteAria: (prefix) => `${prefix}\u5206`,
813
+ meridiemAria: (prefix) => `${prefix}\u5348\u524D/\u5348\u5F8C`,
814
+ am: "\u5348\u524D",
815
+ pm: "\u5348\u5F8C",
816
+ rangeFrom: "\u958B\u59CB",
817
+ rangeTo: "\u7D42\u4E86",
818
+ clearDate: "\u65E5\u4ED8\u3092\u30AF\u30EA\u30A2",
819
+ clearMonth: "\u6708\u3092\u30AF\u30EA\u30A2",
820
+ clearYear: "\u5E74\u3092\u30AF\u30EA\u30A2",
821
+ clearPeriod: "\u671F\u9593\u3092\u30AF\u30EA\u30A2",
822
+ clearTime: "\u6642\u523B\u3092\u30AF\u30EA\u30A2",
823
+ clearTimeRange: "\u6642\u9593\u7BC4\u56F2\u3092\u30AF\u30EA\u30A2",
824
+ start: "\u958B\u59CB",
825
+ end: "\u7D42\u4E86",
826
+ startTime: "\u958B\u59CB\u6642\u523B",
827
+ endTime: "\u7D42\u4E86\u6642\u523B"
828
+ },
829
+ chart: {
830
+ unit: (unit) => `\u5358\u4F4D\uFF1A${unit}`,
831
+ pie: "\u5186\u30B0\u30E9\u30D5",
832
+ donut: "\u30C9\u30FC\u30CA\u30C4\u30B0\u30E9\u30D5",
833
+ radialSummary: (count, kind) => `${count}\u9805\u76EE\u306E${kind}`,
834
+ barSummary: (c, s, stacked) => `${c}\u9805\u76EE\u3001${s}\u7CFB\u5217\u306E${stacked ? "\u7A4D\u307F\u4E0A\u3052" : ""}\u68D2\u30B0\u30E9\u30D5`,
835
+ lineSummary: (c, s, stacked) => `${c}\u9805\u76EE\u3001${s}\u7CFB\u5217\u306E${stacked ? "\u7A4D\u307F\u4E0A\u3052" : ""}\u6298\u308C\u7DDA\u30B0\u30E9\u30D5`
836
+ },
837
+ chipFilter: {
838
+ periodDay: "\u65E5\u5225",
839
+ periodMonth: "\u6708\u5225",
840
+ periodQuarter: "\u56DB\u534A\u671F\u5225",
841
+ periodHalf: "\u534A\u671F\u5225",
842
+ periodYear: "\u5E74\u5225",
843
+ custom: "\u30E6\u30FC\u30B6\u30FC\u6307\u5B9A",
844
+ today: "\u4ECA\u65E5",
845
+ last7: "\u904E\u53BB7\u65E5",
846
+ last30: "\u904E\u53BB30\u65E5",
847
+ maxWord: "\u6700\u5927",
848
+ maxRangeHint: (days) => `\u6700\u5927${days}\u65E5`,
849
+ requireAll: "\u3059\u3079\u3066\u306E\u9805\u76EE\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
850
+ requireAnyDefault: "1\u3064\u4EE5\u4E0A\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
851
+ requireAnyNamed: (name) => `${name}\u30921\u3064\u4EE5\u4E0A\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
852
+ requireField: (label) => `${label}\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
853
+ fieldFallback: "\u9805\u76EE",
854
+ valueListMore: (first, rest) => `${first} \u4ED6${rest}\u4EF6`,
855
+ quarter: (n) => `\u7B2C${n}\u56DB\u534A\u671F`,
856
+ firstHalf: "\u4E0A\u534A\u671F",
857
+ secondHalf: "\u4E0B\u534A\u671F",
858
+ removeFilter: (label) => `${label}\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u524A\u9664`,
859
+ clearFilter: (label) => `${label}\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u30AF\u30EA\u30A2`,
860
+ resetSearch: "\u691C\u7D22\u3092\u30EA\u30BB\u30C3\u30C8",
861
+ addFilter: "\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u8FFD\u52A0",
862
+ noAddableFilter: "\u8FFD\u52A0\u3067\u304D\u308B\u30D5\u30A3\u30EB\u30BF\u30FC\u304C\u3042\u308A\u307E\u305B\u3093\u3002",
863
+ selectNone: "\u9078\u629E\u3092\u89E3\u9664",
864
+ selectAll: "\u3059\u3079\u3066\u9078\u629E",
865
+ removeItem: (label) => `${label}\u3092\u524A\u9664`,
866
+ keywordContains: "\u542B\u3080",
867
+ keywordExact: "\u4E00\u81F4",
868
+ keywordExcludes: "\u542B\u307E\u306A\u3044",
869
+ keywordHintCsv: "\u8907\u6570\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u306F\u30AB\u30F3\u30DE(,)\u3067\u533A\u5207\u308A\u307E\u3059",
870
+ keywordHintEnter: "\u5165\u529B\u5F8C Enter \u3067\u8FFD\u52A0",
871
+ keywordCondition: "\u691C\u7D22\u6761\u4EF6\uFF1A",
872
+ noSearchResults: "\u691C\u7D22\u7D50\u679C\u304C\u3042\u308A\u307E\u305B\u3093\u3002"
873
+ },
874
+ numberInput: {
875
+ rangeBetween: (min, max) => `${min}\u301C${max}\u306E\u7BC4\u56F2\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
876
+ atLeast: (min) => `${min}\u4EE5\u4E0A\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
877
+ atMost: (max) => `${max}\u4EE5\u4E0B\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
878
+ increase: "\u5897\u3084\u3059",
879
+ decrease: "\u6E1B\u3089\u3059"
880
+ },
881
+ chipInput: {
882
+ placeholderWithComma: "\u30BF\u30B0\u3092\u5165\u529B\uFF08Enter\u307E\u305F\u306F\u30AB\u30F3\u30DE\u3067\u767B\u9332\uFF09",
883
+ placeholder: "\u30BF\u30B0\u3092\u5165\u529B\uFF08Enter\u3067\u767B\u9332\uFF09",
884
+ duplicateNamed: (label) => `\u3059\u3067\u306B\u5165\u529B\u3055\u308C\u305F${label}\u3067\u3059\u3002`,
885
+ duplicate: "\u91CD\u8907\u3057\u305F\u5024\u304C\u3042\u308A\u307E\u3059\u3002",
886
+ maxCount: (max) => `\u6700\u5927${max}\u4EF6`
887
+ },
888
+ slider: { minValue: "\u6700\u5C0F\u5024", maxValue: "\u6700\u5927\u5024" },
889
+ chat: {
890
+ removeAttachment: (name) => `${name}\u3092\u524A\u9664`,
891
+ placeholder: "\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044...",
892
+ attachFile: "\u30D5\u30A1\u30A4\u30EB\u3092\u6DFB\u4ED8",
893
+ stopResponse: "\u5FDC\u7B54\u3092\u505C\u6B62",
894
+ send: "\u9001\u4FE1",
895
+ read: "\u65E2\u8AAD",
896
+ unread: "\u672A\u8AAD"
897
+ },
898
+ loadingModal: {
899
+ loadingMessage: "\u51E6\u7406\u4E2D...",
900
+ errorMessage: "\u51E6\u7406\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",
901
+ errorButton: "\u518D\u8A66\u884C",
902
+ ariaTitle: "\u8AAD\u307F\u8FBC\u307F\u4E2D"
903
+ },
904
+ stepper: { errorTooltip: "\u78BA\u8A8D\u304C\u5FC5\u8981\u306A\u9805\u76EE\u304C\u3042\u308A\u307E\u3059\u3002", ariaLabel: "\u9032\u884C\u30B9\u30C6\u30C3\u30D7" },
905
+ timeline: { empty: "\u5C65\u6B74\u304C\u3042\u308A\u307E\u305B\u3093\u3002" },
906
+ callout: { dangerTitle: "\u6CE8\u610F\u4E8B\u9805" },
907
+ guide: { tip: "\u30D2\u30F3\u30C8", notion: "\u4F7F\u3044\u65B9\u30AC\u30A4\u30C9" },
908
+ loginCard: { login: "\u7D71\u5408\u30A2\u30AB\u30A6\u30F3\u30C8\u3067\u30ED\u30B0\u30A4\u30F3" },
909
+ modal: { defaultTitle: "\u30E2\u30FC\u30C0\u30EB" },
910
+ launcher: { opensInNewTab: "\u65B0\u3057\u3044\u30BF\u30D6\u3067\u958B\u304D\u307E\u3059" },
911
+ common: {
912
+ close: "\u9589\u3058\u308B",
913
+ clear: "\u30AF\u30EA\u30A2",
914
+ confirm: "\u78BA\u8A8D",
915
+ all: "\u3059\u3079\u3066",
916
+ back: "\u623B\u308B",
917
+ more: "\u3082\u3063\u3068\u898B\u308B",
918
+ moreActions: "\u305D\u306E\u4ED6\u306E\u6A5F\u80FD",
919
+ openMenu: "\u30E1\u30CB\u30E5\u30FC\u3092\u958B\u304F",
920
+ dragHandle: "\u30C9\u30E9\u30C3\u30B0\u30CF\u30F3\u30C9\u30EB",
921
+ resizeDrawer: "\u30C9\u30ED\u30EF\u30FC\u306E\u5E45\u3092\u8ABF\u6574",
922
+ search: "\u691C\u7D22",
923
+ count: (n) => `${n}\u4EF6`
924
+ },
925
+ input: {
926
+ placeholder: "\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
927
+ searchWithinResults: "\u7D50\u679C\u5185\u3092\u691C\u7D22",
928
+ clearInput: "\u5165\u529B\u3092\u30EA\u30BB\u30C3\u30C8",
929
+ showPassword: "\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u8868\u793A"
930
+ },
290
931
  pagination: {
291
932
  firstPage: "\u6700\u521D\u306E\u30DA\u30FC\u30B8",
292
933
  prevPage: "\u524D\u306E\u30DA\u30FC\u30B8",
@@ -303,9 +944,224 @@ var BUNDLES = {
303
944
  searchPlaceholder: "\u691C\u7D22",
304
945
  empty: "\u8868\u793A\u3059\u308B\u9805\u76EE\u304C\u3042\u308A\u307E\u305B\u3093\u3002",
305
946
  loading: "\u8AAD\u307F\u8FBC\u307F\u4E2D..."
947
+ },
948
+ table: {
949
+ selectAll: "\u3059\u3079\u3066\u9078\u629E",
950
+ selectRow: "\u884C\u3092\u9078\u629E",
951
+ empty: "\u30C7\u30FC\u30BF\u304C\u3042\u308A\u307E\u305B\u3093\u3002",
952
+ rowsPerPage: (count) => `${count}\u4EF6\u305A\u3064\u8868\u793A`,
953
+ editable: "\u7DE8\u96C6\u53EF\u80FD",
954
+ opensInNewScreen: "\u65B0\u3057\u3044\u753B\u9762\u3067\u958B\u304F",
955
+ sortBy: (label) => `${label} \u3067\u4E26\u3079\u66FF\u3048`,
956
+ denseOff: "\u5E83\u304F\u8868\u793A",
957
+ denseOn: "\u72ED\u304F\u8868\u793A"
958
+ },
959
+ tableBar: {
960
+ totalBefore: "\u5408\u8A08 ",
961
+ totalAfter: "\u4EF6",
962
+ selectedBefore: "",
963
+ selectedAfter: "\u4EF6\u9078\u629E"
306
964
  }
307
965
  },
308
966
  zh: {
967
+ accountListBox: { accountSetting: "\u8D26\u53F7\u8BBE\u7F6E", language: "\u66F4\u6539\u8BED\u8A00", logout: "\u9000\u51FA\u767B\u5F55" },
968
+ gnbSystem: { alert: "\u901A\u77E5", setting: "\u8BBE\u7F6E" },
969
+ editor: {
970
+ placeholder: "\u8BF7\u8F93\u5165\u5185\u5BB9\u3002",
971
+ toolbarLabel: "\u683C\u5F0F\u5DE5\u5177",
972
+ tableSize: "\u8868\u683C\u5927\u5C0F",
973
+ linkUrl: "\u94FE\u63A5\u5730\u5740",
974
+ apply: "\u5E94\u7528",
975
+ remove: "\u79FB\u9664",
976
+ headingLevel: "\u6807\u9898\u7EA7\u522B",
977
+ headingBody: "\u6B63\u6587",
978
+ fontSize: "\u5B57\u53F7",
979
+ fontSizeDefaultLabel: "\u9ED8\u8BA4",
980
+ bold: "\u52A0\u7C97",
981
+ italic: "\u659C\u4F53",
982
+ underline: "\u4E0B\u5212\u7EBF",
983
+ strike: "\u5220\u9664\u7EBF",
984
+ inlineCode: "\u884C\u5185\u4EE3\u7801",
985
+ textColor: "\u6587\u5B57\u989C\u8272",
986
+ clearColor: "\u6E05\u9664\u989C\u8272",
987
+ alignLeft: "\u5DE6\u5BF9\u9F50",
988
+ alignCenter: "\u5C45\u4E2D\u5BF9\u9F50",
989
+ alignRight: "\u53F3\u5BF9\u9F50",
990
+ alignJustify: "\u4E24\u7AEF\u5BF9\u9F50",
991
+ bulletList: "\u9879\u76EE\u7B26\u53F7\u5217\u8868",
992
+ orderedList: "\u7F16\u53F7\u5217\u8868",
993
+ taskList: "\u5F85\u529E\u5217\u8868",
994
+ list: "\u5217\u8868",
995
+ blockquote: "\u5F15\u7528",
996
+ codeBlock: "\u4EE3\u7801\u5757",
997
+ divider: "\u5206\u9694\u7EBF",
998
+ link: "\u94FE\u63A5",
999
+ insertImage: "\u63D2\u5165\u56FE\u7247",
1000
+ image: "\u56FE\u7247",
1001
+ table: "\u8868\u683C",
1002
+ addRowAbove: "\u5728\u4E0A\u65B9\u63D2\u5165\u884C",
1003
+ addRowBelow: "\u5728\u4E0B\u65B9\u63D2\u5165\u884C",
1004
+ addColLeft: "\u5728\u5DE6\u4FA7\u63D2\u5165\u5217",
1005
+ addColRight: "\u5728\u53F3\u4FA7\u63D2\u5165\u5217",
1006
+ mergeCells: "\u5408\u5E76\u5355\u5143\u683C",
1007
+ splitCell: "\u53D6\u6D88\u5408\u5E76",
1008
+ toggleHeaderRow: "\u5207\u6362\u6807\u9898\u884C",
1009
+ toggleHeaderCol: "\u5207\u6362\u6807\u9898\u5217",
1010
+ deleteRow: "\u5220\u9664\u884C",
1011
+ deleteCol: "\u5220\u9664\u5217",
1012
+ deleteTable: "\u5220\u9664\u8868\u683C",
1013
+ undo: "\u64A4\u9500",
1014
+ redo: "\u91CD\u505A",
1015
+ colorDefault: "\u9ED8\u8BA4",
1016
+ colorSecondary: "\u6B21\u8981",
1017
+ colorMuted: "\u6DE1\u5316",
1018
+ colorAccent: "\u5F3A\u8C03",
1019
+ colorBrand: "\u54C1\u724C",
1020
+ colorSuccess: "\u6210\u529F",
1021
+ colorWarning: "\u8B66\u544A",
1022
+ colorDanger: "\u5371\u9669",
1023
+ tableCell: (r3, c) => `${r3}\u884C${c}\u5217`,
1024
+ tableSizeText: (rows, cols) => `${rows}\u884C \xD7 ${cols}\u5217`,
1025
+ heading: (level) => `\u6807\u9898 ${level}`,
1026
+ fontSizeDefault: (px) => `\u9ED8\u8BA4\uFF08\u6B63\u6587 ${px}px\uFF09`,
1027
+ closeEditing: (label) => `\u5173\u95ED${label}`
1028
+ },
1029
+ form: { invalid: "\u65E0\u6548\u7684\u503C\u3002" },
1030
+ date: {
1031
+ weekdays: ["\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D"],
1032
+ weekdaysLong: ["\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D"],
1033
+ today: "\u4ECA\u5929",
1034
+ prevYear: "\u4E0A\u4E00\u5E74",
1035
+ nextYear: "\u4E0B\u4E00\u5E74",
1036
+ prevMonth: "\u4E0A\u4E2A\u6708",
1037
+ nextMonth: "\u4E0B\u4E2A\u6708",
1038
+ monthLabel: (month) => `${month}\u6708`,
1039
+ dayLabel: (day) => `${day}\u65E5`,
1040
+ unitYear: "\u5E74",
1041
+ unitMonth: "\u6708",
1042
+ unitDay: "\u65E5",
1043
+ hourItem: (hour) => `${hour}\u65F6`,
1044
+ minuteItem: (minute) => `${minute}\u5206`,
1045
+ hourAria: (prefix) => `${prefix}\u5C0F\u65F6`,
1046
+ minuteAria: (prefix) => `${prefix}\u5206\u949F`,
1047
+ meridiemAria: (prefix) => `${prefix}\u4E0A\u5348/\u4E0B\u5348`,
1048
+ am: "\u4E0A\u5348",
1049
+ pm: "\u4E0B\u5348",
1050
+ rangeFrom: "\u5F00\u59CB",
1051
+ rangeTo: "\u7ED3\u675F",
1052
+ clearDate: "\u6E05\u9664\u65E5\u671F",
1053
+ clearMonth: "\u6E05\u9664\u6708\u4EFD",
1054
+ clearYear: "\u6E05\u9664\u5E74\u4EFD",
1055
+ clearPeriod: "\u6E05\u9664\u65F6\u95F4\u6BB5",
1056
+ clearTime: "\u6E05\u9664\u65F6\u95F4",
1057
+ clearTimeRange: "\u6E05\u9664\u65F6\u95F4\u8303\u56F4",
1058
+ start: "\u5F00\u59CB",
1059
+ end: "\u7ED3\u675F",
1060
+ startTime: "\u5F00\u59CB\u65F6\u95F4",
1061
+ endTime: "\u7ED3\u675F\u65F6\u95F4"
1062
+ },
1063
+ chart: {
1064
+ unit: (unit) => `\u5355\u4F4D\uFF1A${unit}`,
1065
+ pie: "\u997C\u56FE",
1066
+ donut: "\u73AF\u5F62\u56FE",
1067
+ radialSummary: (count, kind) => `${kind}\uFF0C\u5171 ${count} \u9879`,
1068
+ barSummary: (c, s, stacked) => `${stacked ? "\u5806\u53E0" : ""}\u67F1\u72B6\u56FE\uFF0C${c} \u9879\uFF0C${s} \u4E2A\u7CFB\u5217`,
1069
+ lineSummary: (c, s, stacked) => `${stacked ? "\u5806\u53E0" : ""}\u6298\u7EBF\u56FE\uFF0C${c} \u9879\uFF0C${s} \u4E2A\u7CFB\u5217`
1070
+ },
1071
+ chipFilter: {
1072
+ periodDay: "\u6309\u65E5",
1073
+ periodMonth: "\u6309\u6708",
1074
+ periodQuarter: "\u6309\u5B63\u5EA6",
1075
+ periodHalf: "\u6309\u534A\u5E74",
1076
+ periodYear: "\u6309\u5E74",
1077
+ custom: "\u81EA\u5B9A\u4E49",
1078
+ today: "\u4ECA\u5929",
1079
+ last7: "\u6700\u8FD17\u5929",
1080
+ last30: "\u6700\u8FD130\u5929",
1081
+ maxWord: "\u6700\u591A",
1082
+ maxRangeHint: (days) => `\u6700\u591A${days}\u5929`,
1083
+ requireAll: "\u8BF7\u9009\u62E9\u6240\u6709\u9879\u76EE\u3002",
1084
+ requireAnyDefault: "\u8BF7\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u7B5B\u9009\u6761\u4EF6\u3002",
1085
+ requireAnyNamed: (name) => `\u8BF7\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A${name}\u3002`,
1086
+ requireField: (label) => `\u8BF7\u9009\u62E9${label}\u3002`,
1087
+ fieldFallback: "\u9879\u76EE",
1088
+ valueListMore: (first, rest) => `${first} \u7B49${rest + 1}\u9879`,
1089
+ quarter: (n) => `\u7B2C${n}\u5B63\u5EA6`,
1090
+ firstHalf: "\u4E0A\u534A\u5E74",
1091
+ secondHalf: "\u4E0B\u534A\u5E74",
1092
+ removeFilter: (label) => `\u79FB\u9664${label}\u7B5B\u9009`,
1093
+ clearFilter: (label) => `\u6E05\u9664${label}\u7B5B\u9009`,
1094
+ resetSearch: "\u91CD\u7F6E\u641C\u7D22",
1095
+ addFilter: "\u6DFB\u52A0\u7B5B\u9009",
1096
+ noAddableFilter: "\u6CA1\u6709\u53EF\u6DFB\u52A0\u7684\u7B5B\u9009\u6761\u4EF6\u3002",
1097
+ selectNone: "\u53D6\u6D88\u5168\u9009",
1098
+ selectAll: "\u5168\u9009",
1099
+ removeItem: (label) => `\u5220\u9664${label}`,
1100
+ keywordContains: "\u5305\u542B",
1101
+ keywordExact: "\u5B8C\u5168\u5339\u914D",
1102
+ keywordExcludes: "\u4E0D\u5305\u542B",
1103
+ keywordHintCsv: "\u591A\u4E2A\u5173\u952E\u8BCD\u7528\u9017\u53F7(,)\u5206\u9694",
1104
+ keywordHintEnter: "\u8F93\u5165\u540E\u6309 Enter \u6DFB\u52A0",
1105
+ keywordCondition: "\u641C\u7D22\u6761\u4EF6\uFF1A",
1106
+ noSearchResults: "\u6CA1\u6709\u641C\u7D22\u7ED3\u679C\u3002"
1107
+ },
1108
+ numberInput: {
1109
+ rangeBetween: (min, max) => `\u8BF7\u8F93\u5165 ${min}~${max} \u4E4B\u95F4\u7684\u503C\u3002`,
1110
+ atLeast: (min) => `\u8BF7\u8F93\u5165\u4E0D\u5C0F\u4E8E ${min} \u7684\u503C\u3002`,
1111
+ atMost: (max) => `\u8BF7\u8F93\u5165\u4E0D\u5927\u4E8E ${max} \u7684\u503C\u3002`,
1112
+ increase: "\u589E\u52A0",
1113
+ decrease: "\u51CF\u5C11"
1114
+ },
1115
+ chipInput: {
1116
+ placeholderWithComma: "\u8F93\u5165\u6807\u7B7E\uFF08\u6309 Enter \u6216\u9017\u53F7\u6DFB\u52A0\uFF09",
1117
+ placeholder: "\u8F93\u5165\u6807\u7B7E\uFF08\u6309 Enter \u6DFB\u52A0\uFF09",
1118
+ duplicateNamed: (label) => `${label}\u5DF2\u5B58\u5728\u3002`,
1119
+ duplicate: "\u5B58\u5728\u91CD\u590D\u7684\u503C\u3002",
1120
+ maxCount: (max) => `\u6700\u591A ${max} \u4E2A`
1121
+ },
1122
+ slider: { minValue: "\u6700\u5C0F\u503C", maxValue: "\u6700\u5927\u503C" },
1123
+ chat: {
1124
+ removeAttachment: (name) => `\u79FB\u9664${name}`,
1125
+ placeholder: "\u8BF7\u8F93\u5165\u6D88\u606F...",
1126
+ attachFile: "\u9644\u52A0\u6587\u4EF6",
1127
+ stopResponse: "\u505C\u6B62\u56DE\u590D",
1128
+ send: "\u53D1\u9001",
1129
+ read: "\u5DF2\u8BFB",
1130
+ unread: "\u672A\u8BFB"
1131
+ },
1132
+ loadingModal: {
1133
+ loadingMessage: "\u5904\u7406\u4E2D...",
1134
+ errorMessage: "\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u3002",
1135
+ errorButton: "\u91CD\u8BD5",
1136
+ ariaTitle: "\u52A0\u8F7D\u4E2D"
1137
+ },
1138
+ stepper: { errorTooltip: "\u6709\u9700\u8981\u786E\u8BA4\u7684\u9879\u76EE\u3002", ariaLabel: "\u8FDB\u5EA6\u6B65\u9AA4" },
1139
+ timeline: { empty: "\u6CA1\u6709\u8BB0\u5F55\u3002" },
1140
+ callout: { dangerTitle: "\u6CE8\u610F\u4E8B\u9879" },
1141
+ guide: { tip: "\u4F7F\u7528\u63D0\u793A", notion: "\u4F7F\u7528\u6307\u5357" },
1142
+ loginCard: { login: "\u4F7F\u7528\u7EDF\u4E00\u8D26\u53F7\u767B\u5F55" },
1143
+ modal: { defaultTitle: "\u6A21\u6001\u6846" },
1144
+ launcher: { opensInNewTab: "\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00" },
1145
+ common: {
1146
+ close: "\u5173\u95ED",
1147
+ clear: "\u6E05\u9664",
1148
+ confirm: "\u786E\u5B9A",
1149
+ all: "\u5168\u90E8",
1150
+ back: "\u8FD4\u56DE",
1151
+ more: "\u66F4\u591A",
1152
+ moreActions: "\u66F4\u591A\u529F\u80FD",
1153
+ openMenu: "\u6253\u5F00\u83DC\u5355",
1154
+ dragHandle: "\u62D6\u52A8\u624B\u67C4",
1155
+ resizeDrawer: "\u8C03\u6574\u62BD\u5C49\u5BBD\u5EA6",
1156
+ search: "\u641C\u7D22",
1157
+ count: (n) => `${n}\u4E2A`
1158
+ },
1159
+ input: {
1160
+ placeholder: "\u8BF7\u8F93\u5165\u3002",
1161
+ searchWithinResults: "\u5728\u7ED3\u679C\u4E2D\u641C\u7D22",
1162
+ clearInput: "\u91CD\u7F6E\u8F93\u5165",
1163
+ showPassword: "\u663E\u793A\u5BC6\u7801"
1164
+ },
309
1165
  pagination: {
310
1166
  firstPage: "\u7B2C\u4E00\u9875",
311
1167
  prevPage: "\u4E0A\u4E00\u9875",
@@ -322,6 +1178,23 @@ var BUNDLES = {
322
1178
  searchPlaceholder: "\u641C\u7D22",
323
1179
  empty: "\u6CA1\u6709\u53EF\u663E\u793A\u7684\u9879\u76EE\u3002",
324
1180
  loading: "\u52A0\u8F7D\u4E2D..."
1181
+ },
1182
+ table: {
1183
+ selectAll: "\u5168\u9009",
1184
+ selectRow: "\u9009\u62E9\u884C",
1185
+ empty: "\u6CA1\u6709\u6570\u636E\u3002",
1186
+ rowsPerPage: (count) => `\u6BCF\u9875 ${count} \u6761`,
1187
+ editable: "\u53EF\u7F16\u8F91",
1188
+ opensInNewScreen: "\u5728\u65B0\u9875\u9762\u4E2D\u6253\u5F00",
1189
+ sortBy: (label) => `\u6309${label}\u6392\u5E8F`,
1190
+ denseOff: "\u5BBD\u677E\u663E\u793A",
1191
+ denseOn: "\u7D27\u51D1\u663E\u793A"
1192
+ },
1193
+ tableBar: {
1194
+ totalBefore: "\u5171 ",
1195
+ totalAfter: " \u6761",
1196
+ selectedBefore: "\u5DF2\u9009 ",
1197
+ selectedAfter: " \u6761"
325
1198
  }
326
1199
  }
327
1200
  };
@@ -338,11 +1211,40 @@ function mergeDefined(base, override) {
338
1211
  }
339
1212
  return next;
340
1213
  }
1214
+ function mergeDateDefined(base, override) {
1215
+ const merged = mergeDefined(base, override);
1216
+ if (merged.weekdays.length !== 7) merged.weekdays = base.weekdays;
1217
+ if (merged.weekdaysLong.length !== 7) merged.weekdaysLong = base.weekdaysLong;
1218
+ return merged;
1219
+ }
341
1220
  function resolveMessages(locale, override) {
342
1221
  const base = BUNDLES[normalizeLocale(locale)];
343
1222
  return {
1223
+ common: mergeDefined(base.common, override?.common),
1224
+ input: mergeDefined(base.input, override?.input),
1225
+ chart: mergeDefined(base.chart, override?.chart),
1226
+ date: mergeDateDefined(base.date, override?.date),
1227
+ form: mergeDefined(base.form, override?.form),
1228
+ accountListBox: mergeDefined(base.accountListBox, override?.accountListBox),
1229
+ gnbSystem: mergeDefined(base.gnbSystem, override?.gnbSystem),
1230
+ editor: mergeDefined(base.editor, override?.editor),
1231
+ chipFilter: mergeDefined(base.chipFilter, override?.chipFilter),
1232
+ numberInput: mergeDefined(base.numberInput, override?.numberInput),
1233
+ chipInput: mergeDefined(base.chipInput, override?.chipInput),
1234
+ slider: mergeDefined(base.slider, override?.slider),
1235
+ chat: mergeDefined(base.chat, override?.chat),
1236
+ loadingModal: mergeDefined(base.loadingModal, override?.loadingModal),
1237
+ stepper: mergeDefined(base.stepper, override?.stepper),
1238
+ timeline: mergeDefined(base.timeline, override?.timeline),
1239
+ callout: mergeDefined(base.callout, override?.callout),
1240
+ guide: mergeDefined(base.guide, override?.guide),
1241
+ loginCard: mergeDefined(base.loginCard, override?.loginCard),
1242
+ modal: mergeDefined(base.modal, override?.modal),
1243
+ launcher: mergeDefined(base.launcher, override?.launcher),
344
1244
  pagination: mergeDefined(base.pagination, override?.pagination),
345
- select: mergeDefined(base.select, override?.select)
1245
+ select: mergeDefined(base.select, override?.select),
1246
+ table: mergeDefined(base.table, override?.table),
1247
+ tableBar: mergeDefined(base.tableBar, override?.tableBar)
346
1248
  };
347
1249
  }
348
1250
  function createValue(locale, override) {
@@ -363,6 +1265,11 @@ function SLocaleProvider({ locale, messages, children }) {
363
1265
  function useLocale() {
364
1266
  return useContext(LocaleContext);
365
1267
  }
1268
+ var strokeProps = (strokeWidth) => ({
1269
+ stroke: "currentColor",
1270
+ strokeWidth: strokeWidth ?? 1.5,
1271
+ vectorEffect: strokeWidth ? "non-scaling-stroke" : void 0
1272
+ });
366
1273
  var Icon_account = (p) => {
367
1274
  const { size = 24, ...rest } = p;
368
1275
  return /* @__PURE__ */ jsxs(
@@ -2172,7 +3079,8 @@ var Icon_helpFill = (p) => {
2172
3079
  );
2173
3080
  };
2174
3081
  var Icon_helpOutline = (p) => {
2175
- const { size = 24, ...rest } = p;
3082
+ const { size = 24, strokeWidth, ...rest } = p;
3083
+ const stroke = strokeProps(strokeWidth);
2176
3084
  return /* @__PURE__ */ jsxs(
2177
3085
  "svg",
2178
3086
  {
@@ -2186,23 +3094,24 @@ var Icon_helpOutline = (p) => {
2186
3094
  /* @__PURE__ */ jsx(
2187
3095
  "path",
2188
3096
  {
2189
- 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",
2190
- fill: "currentColor"
3097
+ 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",
3098
+ strokeLinecap: "round",
3099
+ ...stroke
2191
3100
  }
2192
3101
  ),
2193
3102
  /* @__PURE__ */ jsx(
2194
3103
  "path",
2195
3104
  {
2196
- 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",
2197
- fill: "currentColor"
3105
+ 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",
3106
+ strokeLinecap: "round",
3107
+ strokeLinejoin: "round",
3108
+ ...stroke
2198
3109
  }
2199
3110
  ),
2200
3111
  /* @__PURE__ */ jsx(
2201
3112
  "path",
2202
3113
  {
2203
- fillRule: "evenodd",
2204
- clipRule: "evenodd",
2205
- 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",
3114
+ 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",
2206
3115
  fill: "currentColor"
2207
3116
  }
2208
3117
  )
@@ -2731,7 +3640,8 @@ var Icon_notificationFill = (p) => {
2731
3640
  );
2732
3641
  };
2733
3642
  var Icon_notificationOutline = (p) => {
2734
- const { size = 24, ...rest } = p;
3643
+ const { size = 24, strokeWidth, ...rest } = p;
3644
+ const stroke = strokeProps(strokeWidth);
2735
3645
  return /* @__PURE__ */ jsxs(
2736
3646
  "svg",
2737
3647
  {
@@ -2745,23 +3655,16 @@ var Icon_notificationOutline = (p) => {
2745
3655
  /* @__PURE__ */ jsx(
2746
3656
  "path",
2747
3657
  {
2748
- 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",
2749
- fill: "currentColor"
2750
- }
2751
- ),
2752
- /* @__PURE__ */ jsx(
2753
- "path",
2754
- {
2755
- 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",
2756
- fill: "currentColor"
3658
+ 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",
3659
+ strokeLinecap: "round",
3660
+ ...stroke
2757
3661
  }
2758
3662
  ),
3663
+ /* @__PURE__ */ jsx("path", { d: "M12 13.125L12 7.125", strokeLinecap: "round", strokeLinejoin: "round", ...stroke }),
2759
3664
  /* @__PURE__ */ jsx(
2760
3665
  "path",
2761
3666
  {
2762
- fillRule: "evenodd",
2763
- clipRule: "evenodd",
2764
- 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",
3667
+ 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",
2765
3668
  fill: "currentColor"
2766
3669
  }
2767
3670
  )
@@ -3224,7 +4127,8 @@ var Icon_setting = (p) => {
3224
4127
  );
3225
4128
  };
3226
4129
  var Icon_settingOutline = (p) => {
3227
- const { size = 24, ...rest } = p;
4130
+ const { size = 24, strokeWidth, ...rest } = p;
4131
+ const stroke = strokeProps(strokeWidth);
3228
4132
  return /* @__PURE__ */ jsxs(
3229
4133
  "svg",
3230
4134
  {
@@ -3235,22 +4139,12 @@ var Icon_settingOutline = (p) => {
3235
4139
  xmlns: "http://www.w3.org/2000/svg",
3236
4140
  ...rest,
3237
4141
  children: [
4142
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "3", ...stroke }),
3238
4143
  /* @__PURE__ */ jsx(
3239
4144
  "path",
3240
4145
  {
3241
- fillRule: "evenodd",
3242
- clipRule: "evenodd",
3243
- 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",
3244
- fill: "currentColor"
3245
- }
3246
- ),
3247
- /* @__PURE__ */ jsx(
3248
- "path",
3249
- {
3250
- fillRule: "evenodd",
3251
- clipRule: "evenodd",
3252
- 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",
3253
- fill: "currentColor"
4146
+ 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",
4147
+ ...stroke
3254
4148
  }
3255
4149
  )
3256
4150
  ]
@@ -3897,6 +4791,19 @@ var ICONS = {
3897
4791
  warningOutline: Icon_warningOutline,
3898
4792
  youtube: Icon_youtube
3899
4793
  };
4794
+ var STROKE_BY_SIZE = {
4795
+ 8: 1,
4796
+ 10: 1,
4797
+ 12: 1,
4798
+ 16: 1.25,
4799
+ 20: 1.5,
4800
+ 24: 1.5,
4801
+ 32: 2
4802
+ };
4803
+ function toPx(size) {
4804
+ if (typeof size === "number") return size;
4805
+ return /^\d+(\.\d+)?(px)?$/.test(size) ? parseFloat(size) : void 0;
4806
+ }
3900
4807
  var SIcon = /* @__PURE__ */ forwardRef(function SIcon2({ name, size = 24, color, rotate, label, className, style }, ref) {
3901
4808
  const Svg = ICONS[name];
3902
4809
  if (!Svg) return null;
@@ -3915,7 +4822,7 @@ var SIcon = /* @__PURE__ */ forwardRef(function SIcon2({ name, size = 24, color,
3915
4822
  role: label ? "img" : void 0,
3916
4823
  "aria-label": label,
3917
4824
  "aria-hidden": label ? void 0 : true,
3918
- children: /* @__PURE__ */ jsx(Svg, { size: cssSize ? "100%" : size })
4825
+ children: /* @__PURE__ */ jsx(Svg, { size: cssSize ? "100%" : size, strokeWidth: STROKE_BY_SIZE[toPx(size) ?? 0] })
3919
4826
  }
3920
4827
  );
3921
4828
  });
@@ -4554,6 +5461,7 @@ function SFooter({
4554
5461
  leftClassName,
4555
5462
  style
4556
5463
  }) {
5464
+ const tc = useLocale().messages.common;
4557
5465
  const isGrey = bg === "grey";
4558
5466
  const hasSlot = left != null || children != null;
4559
5467
  const hasButton = button != null;
@@ -4585,7 +5493,7 @@ function SFooter({
4585
5493
  ...button,
4586
5494
  size,
4587
5495
  color: button.color ?? "primary",
4588
- label: button.label ?? "\uD655\uC778"
5496
+ label: button.label ?? tc.confirm
4589
5497
  }
4590
5498
  )
4591
5499
  ]
@@ -4966,6 +5874,7 @@ var STooltipImpl = /* @__PURE__ */ forwardRef(function STooltip({
4966
5874
  style,
4967
5875
  contentProps
4968
5876
  }, ref) {
5877
+ const tc = useLocale().messages.common;
4969
5878
  const portalContainer = usePortalContainer();
4970
5879
  const [internalOpen, setInternalOpen] = useState(false);
4971
5880
  const isControlled = openProp !== void 0;
@@ -5083,7 +5992,7 @@ var STooltipImpl = /* @__PURE__ */ forwardRef(function STooltip({
5083
5992
  icon: "close",
5084
5993
  size: "xs",
5085
5994
  intent: tooltipType === "default" ? "inverse" : "default",
5086
- ariaLabel: "\uB2EB\uAE30",
5995
+ ariaLabel: tc.close,
5087
5996
  className: "shrink-0",
5088
5997
  onClick: () => {
5089
5998
  cancelHide();
@@ -5099,14 +6008,21 @@ var STooltipImpl = /* @__PURE__ */ forwardRef(function STooltip({
5099
6008
  ] });
5100
6009
  });
5101
6010
  var STooltip2 = /* @__PURE__ */ withDisplayName(STooltipImpl, "STooltip");
5102
- function runRules(value, rules) {
6011
+ function runRules(value, rules, invalidMessage = "\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uAC12\uC785\uB2C8\uB2E4.") {
5103
6012
  if (!rules || rules.length === 0) return "";
5104
6013
  for (const rule of rules) {
5105
6014
  const result = rule(value ?? "");
5106
- if (result !== true) return typeof result === "string" ? result : "\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uAC12\uC785\uB2C8\uB2E4.";
6015
+ if (result !== true) return typeof result === "string" ? result : invalidMessage;
5107
6016
  }
5108
6017
  return "";
5109
6018
  }
6019
+ function useRunRules() {
6020
+ const invalid = useLocale().messages.form.invalid;
6021
+ return useCallback(
6022
+ (value, rules) => runRules(value, rules, invalid),
6023
+ [invalid]
6024
+ );
6025
+ }
5110
6026
  var FormContext = /* @__PURE__ */ createContext(null);
5111
6027
  function useFormContext() {
5112
6028
  return useContext(FormContext);
@@ -5438,12 +6354,15 @@ var STextarea = /* @__PURE__ */ forwardRef(function STextarea2({
5438
6354
  width,
5439
6355
  disabled = false,
5440
6356
  readOnly = false,
5441
- placeholder = "\uC785\uB825\uD574 \uC8FC\uC138\uC694.",
6357
+ placeholder: placeholderProp,
5442
6358
  onBlur,
5443
6359
  className,
5444
6360
  style,
5445
6361
  ...rest
5446
6362
  }, ref) {
6363
+ const runRules2 = useRunRules();
6364
+ const ti = useLocale().messages.input;
6365
+ const placeholder = placeholderProp ?? ti.placeholder;
5447
6366
  const p = TEXTAREA_SIZE[size];
5448
6367
  const heightForRows = (n) => `calc(${p.lineHeight * n}px + ${p.paddingY} * 2)`;
5449
6368
  const minHeight = heightForRows(MIN_ROWS);
@@ -5478,7 +6397,7 @@ var STextarea = /* @__PURE__ */ forwardRef(function STextarea2({
5478
6397
  useFormField({
5479
6398
  name: rest.name,
5480
6399
  validate: () => {
5481
- const msg = runRules(value, rules);
6400
+ const msg = runRules2(value, rules);
5482
6401
  setRuleError(msg);
5483
6402
  return msg === "";
5484
6403
  },
@@ -5527,11 +6446,11 @@ var STextarea = /* @__PURE__ */ forwardRef(function STextarea2({
5527
6446
  onChange: (e) => {
5528
6447
  onChange?.(e);
5529
6448
  onValueChange?.(e.target.value);
5530
- if (ruleError !== "") setRuleError(runRules(e.target.value, rules));
6449
+ if (ruleError !== "") setRuleError(runRules2(e.target.value, rules));
5531
6450
  },
5532
6451
  onBlur: (e) => {
5533
6452
  onBlur?.(e);
5534
- if (rules && rules.length > 0) setRuleError(runRules(e.target.value, rules));
6453
+ if (rules && rules.length > 0) setRuleError(runRules2(e.target.value, rules));
5535
6454
  },
5536
6455
  className: cn(
5537
6456
  "w-full border-0 bg-transparent outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed",
@@ -5558,7 +6477,6 @@ var STextarea = /* @__PURE__ */ forwardRef(function STextarea2({
5558
6477
  }
5559
6478
  );
5560
6479
  });
5561
- var DEFAULT_PLACEHOLDER = "\uBA54\uC2DC\uC9C0\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694...";
5562
6480
  var FIELD_BORDER = 1;
5563
6481
  var TEXTAREA_MIN_HEIGHT = `calc(var(--cmp-chatInput-buttonFrame-height) - ${FIELD_BORDER * 2}px)`;
5564
6482
  var BUTTON_BOTTOM_INSET = `calc((var(--cmp-chatInput-buttonFrame-height) - var(--cmp-ghostButton-md-size)) / 2)`;
@@ -5569,7 +6487,7 @@ function BarButton(props) {
5569
6487
  var SChatInputImpl = /* @__PURE__ */ forwardRef(function SChatInput({
5570
6488
  value = "",
5571
6489
  onValueChange,
5572
- placeholder = DEFAULT_PLACEHOLDER,
6490
+ placeholder: placeholderProp,
5573
6491
  disabled = false,
5574
6492
  onSend,
5575
6493
  hasAttachments = false,
@@ -5590,6 +6508,8 @@ var SChatInputImpl = /* @__PURE__ */ forwardRef(function SChatInput({
5590
6508
  textareaClassName,
5591
6509
  ...rest
5592
6510
  }, ref) {
6511
+ const t = useLocale().messages.chat;
6512
+ const placeholder = placeholderProp ?? t.placeholder;
5593
6513
  const hasText = value.trim() !== "";
5594
6514
  const canSend = !disabled && !busy && !sendDisabled && (hasText || hasAttachments);
5595
6515
  const send = () => {
@@ -5629,7 +6549,7 @@ var SChatInputImpl = /* @__PURE__ */ forwardRef(function SChatInput({
5629
6549
  BarButton,
5630
6550
  {
5631
6551
  icon: "attachFile",
5632
- ariaLabel: "\uD30C\uC77C \uCCA8\uBD80",
6552
+ ariaLabel: t.attachFile,
5633
6553
  tooltipText: attachTooltip,
5634
6554
  disabled: attachLocked,
5635
6555
  onClick: handleAttachClick
@@ -5675,7 +6595,7 @@ var SChatInputImpl = /* @__PURE__ */ forwardRef(function SChatInput({
5675
6595
  {
5676
6596
  icon: "stop",
5677
6597
  intent: "danger",
5678
- ariaLabel: "\uC751\uB2F5 \uC911\uC9C0",
6598
+ ariaLabel: t.stopResponse,
5679
6599
  disabled,
5680
6600
  onClick: onStop
5681
6601
  }
@@ -5685,7 +6605,7 @@ var SChatInputImpl = /* @__PURE__ */ forwardRef(function SChatInput({
5685
6605
  {
5686
6606
  icon: "send",
5687
6607
  intent: "subAction",
5688
- ariaLabel: "\uC804\uC1A1",
6608
+ ariaLabel: t.send,
5689
6609
  disabled: !canSend,
5690
6610
  onClick: send
5691
6611
  }
@@ -5716,6 +6636,7 @@ var CHAT_ATTACHED_FILE_CONFIG = {
5716
6636
  };
5717
6637
  var SChatAttachedFileImpl = /* @__PURE__ */ forwardRef(
5718
6638
  function SChatAttachedFile({ name, onRemove, className, ...rest }, ref) {
6639
+ const t = useLocale().messages.chat;
5719
6640
  return /* @__PURE__ */ jsxs(
5720
6641
  "div",
5721
6642
  {
@@ -5756,7 +6677,7 @@ var SChatAttachedFileImpl = /* @__PURE__ */ forwardRef(
5756
6677
  {
5757
6678
  icon: "close",
5758
6679
  size: "xs",
5759
- ariaLabel: `${name} \uC81C\uAC70`,
6680
+ ariaLabel: t.removeAttachment(name),
5760
6681
  onClick: onRemove,
5761
6682
  className: "shrink-0"
5762
6683
  }
@@ -5883,10 +6804,6 @@ var OUTGOING_SURFACE = {
5883
6804
  admin: "admin"
5884
6805
  };
5885
6806
  var CHAT_MESSAGE_READ_STATUSES = ["read", "unread"];
5886
- var READ_STATUS_LABEL = {
5887
- read: "\uC77D\uC74C",
5888
- unread: "\uC548 \uC77D\uC74C"
5889
- };
5890
6807
  var READ_STATUS_COLOR = {
5891
6808
  read: "text-(--cmp-chatTimeStamp-color)",
5892
6809
  unread: "text-(--cmp-chatReadMark-color)"
@@ -5935,6 +6852,7 @@ var SChatMessageImpl = /* @__PURE__ */ forwardRef(function SChatMessage({
5935
6852
  className,
5936
6853
  ...rest
5937
6854
  }, ref) {
6855
+ const t = useLocale().messages.chat;
5938
6856
  const outgoing = direction === "outgoing";
5939
6857
  const surface = outgoing ? OUTGOING_SURFACE[variant] : "incoming";
5940
6858
  const bubbles = messages ?? [];
@@ -6005,7 +6923,7 @@ var SChatMessageImpl = /* @__PURE__ */ forwardRef(function SChatMessage({
6005
6923
  ),
6006
6924
  (readStatus != null || time != null) && // 읽음 표시와 시각은 한 줄에 선다 — 읽음이 먼저, 시각이 뒤다.
6007
6925
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-(--cmp-chatMessage-subData-gap) px-(--cmp-chatMessage-subData-paddingX)", children: [
6008
- readStatus != null && /* @__PURE__ */ jsx("span", { className: cn("typo-body-sm-bold", READ_STATUS_COLOR[readStatus]), children: READ_STATUS_LABEL[readStatus] }),
6926
+ readStatus != null && /* @__PURE__ */ jsx("span", { className: cn("typo-body-sm-bold", READ_STATUS_COLOR[readStatus]), children: t[readStatus] }),
6009
6927
  time != null && /* @__PURE__ */ jsx("span", { className: "typo-body-sm-medium text-(--cmp-chatTimeStamp-color)", children: time })
6010
6928
  ] }),
6011
6929
  actions != null && // 버튼이 많아 한 줄에 안 들어가면 감싼다 — 넘쳐서 잘리는 것보다 낫다.
@@ -6103,6 +7021,7 @@ var SDraggableItemView = /* @__PURE__ */ forwardRef(
6103
7021
  style,
6104
7022
  ...rest
6105
7023
  }, ref) {
7024
+ const tc = useLocale().messages.common;
6106
7025
  const renderState = { hovered, dragging, disabled };
6107
7026
  const titleNode = renderSlot(title, renderState);
6108
7027
  const supportingTextNode = renderSlot(supportingText, renderState);
@@ -6166,7 +7085,7 @@ var SDraggableItemView = /* @__PURE__ */ forwardRef(
6166
7085
  ...dragHandleProps,
6167
7086
  role: dragHandleProps?.role ?? "button",
6168
7087
  tabIndex: dragHandleProps?.tabIndex ?? (disabled ? -1 : 0),
6169
- "aria-label": dragHandleProps?.["aria-label"] ?? "\uB4DC\uB798\uADF8 \uD578\uB4E4",
7088
+ "aria-label": dragHandleProps?.["aria-label"] ?? tc.dragHandle,
6170
7089
  "aria-disabled": disabled || void 0,
6171
7090
  onMouseDown: onDragHandleMouseDown,
6172
7091
  className: cn(
@@ -7771,7 +8690,6 @@ var SLogo = /* @__PURE__ */ forwardRef(function SLogo2({
7771
8690
  }
7772
8691
  );
7773
8692
  });
7774
- var BUTTON_LABEL = "\uD1B5\uD569 \uACC4\uC815\uC73C\uB85C \uB85C\uADF8\uC778";
7775
8693
  var SERVICE_LABEL = {
7776
8694
  sellmate: "Sellmate",
7777
8695
  wms: "Sellmate WMS",
@@ -7787,6 +8705,7 @@ var SERVICE_LABEL = {
7787
8705
  };
7788
8706
  var LOGO_SIZE = 70;
7789
8707
  var SLoginCardImpl = /* @__PURE__ */ forwardRef(function SLoginCard({ service, title, description, onLogin, footerNote, bottomAction, className, ...rest }, ref) {
8708
+ const t = useLocale().messages.loginCard;
7790
8709
  const hasIntro = title != null || description != null;
7791
8710
  return /* @__PURE__ */ jsxs(
7792
8711
  "div",
@@ -7834,7 +8753,7 @@ var SLoginCardImpl = /* @__PURE__ */ forwardRef(function SLoginCard({ service, t
7834
8753
  {
7835
8754
  color: "secondary",
7836
8755
  size: "lg",
7837
- label: BUTTON_LABEL,
8756
+ label: t.login,
7838
8757
  onClick: onLogin,
7839
8758
  className: "w-[320px]"
7840
8759
  }
@@ -8089,7 +9008,7 @@ function TreeConnector({
8089
9008
  ] });
8090
9009
  }
8091
9010
  function TreeAllRow({
8092
- label = "\uC804\uCCB4",
9011
+ label: labelProp,
8093
9012
  selected,
8094
9013
  indeterminate = false,
8095
9014
  size = "sm",
@@ -8101,6 +9020,8 @@ function TreeAllRow({
8101
9020
  className,
8102
9021
  ...rest
8103
9022
  }) {
9023
+ const tc = useLocale().messages.common;
9024
+ const label = labelProp ?? tc.all;
8104
9025
  return /* @__PURE__ */ jsx(
8105
9026
  "div",
8106
9027
  {
@@ -8148,7 +9069,7 @@ function collectSelectableIds(node) {
8148
9069
  function toSelectedSet(value) {
8149
9070
  return new Set(value ?? []);
8150
9071
  }
8151
- var TREE_ALL_NODE = { id: "__all__", label: "\uC804\uCCB4" };
9072
+ var TREE_ALL_ID = "__all__";
8152
9073
  function getSelectionState(node, selectedSet) {
8153
9074
  const selectableChildren = (node.children ?? []).filter(
8154
9075
  (child) => collectSelectableIds(child).length > 0
@@ -8347,6 +9268,8 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
8347
9268
  className,
8348
9269
  ...rest
8349
9270
  }, ref) {
9271
+ const tc = useLocale().messages.common;
9272
+ const allNode = useMemo(() => ({ id: TREE_ALL_ID, label: tc.all }), [tc.all]);
8350
9273
  const [internalValue, setInternalValue] = useState(defaultValue ?? []);
8351
9274
  const [internalExpandedIds, setInternalExpandedIds] = useState(
8352
9275
  defaultExpandedIds ?? items.filter((item4) => item4.children?.length).map((item4) => item4.id)
@@ -8363,7 +9286,7 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
8363
9286
  const visibleRows = useMemo(() => {
8364
9287
  const rows = [];
8365
9288
  if (showAllItem) {
8366
- rows.push({ id: TREE_ALL_NODE.id, node: TREE_ALL_NODE, parentId: null, expanded: false });
9289
+ rows.push({ id: TREE_ALL_ID, node: allNode, parentId: null, expanded: false });
8367
9290
  }
8368
9291
  const walk = (nodes, parentId) => {
8369
9292
  nodes.forEach((node) => {
@@ -8374,7 +9297,7 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
8374
9297
  };
8375
9298
  walk(items, null);
8376
9299
  return rows;
8377
- }, [items, expandedSet, showAllItem]);
9300
+ }, [items, expandedSet, showAllItem, allNode]);
8378
9301
  const [focusedId, setFocusedId] = useState(null);
8379
9302
  const activeRowId = focusedId != null && visibleRows.some((row) => row.id === focusedId) ? focusedId : visibleRows[0]?.id ?? null;
8380
9303
  const treeRef = useRef(null);
@@ -8419,7 +9342,7 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
8419
9342
  });
8420
9343
  const orderedIds = collectIds(items).filter((id) => next.has(id));
8421
9344
  if (value === void 0) setInternalValue(orderedIds);
8422
- onValueChange?.(orderedIds, TREE_ALL_NODE);
9345
+ onValueChange?.(orderedIds, allNode);
8423
9346
  };
8424
9347
  const handleTreeKeyDown = (event) => {
8425
9348
  const target = event.target;
@@ -8463,7 +9386,7 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
8463
9386
  }
8464
9387
  case "Enter":
8465
9388
  case " ": {
8466
- if (row.id === TREE_ALL_NODE.id) updateAllSelected();
9389
+ if (row.id === TREE_ALL_ID) updateAllSelected();
8467
9390
  else if (selectable) updateSelected(row.node);
8468
9391
  else if (hasChildren) updateExpanded(row.node);
8469
9392
  else return;
@@ -8524,8 +9447,8 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
8524
9447
  showAllItem && /* @__PURE__ */ jsx(
8525
9448
  STreeAllItem,
8526
9449
  {
8527
- rowId: TREE_ALL_NODE.id,
8528
- tabIndex: activeRowId === TREE_ALL_NODE.id ? 0 : -1,
9450
+ rowId: TREE_ALL_ID,
9451
+ tabIndex: activeRowId === TREE_ALL_ID ? 0 : -1,
8529
9452
  onKeyDown: handleTreeKeyDown,
8530
9453
  selected: allSelected,
8531
9454
  indeterminate: allIndeterminate,
@@ -9161,7 +10084,6 @@ var SURFACE = {
9161
10084
  content: "var(--cmp-callout-default-content)"
9162
10085
  }
9163
10086
  };
9164
- var DANGER_TITLE_LABEL = "\uC8FC\uC758\uC0AC\uD56D";
9165
10087
  function renderItems(message, depth = 1) {
9166
10088
  const out = [];
9167
10089
  message.forEach((m, i) => {
@@ -9193,6 +10115,7 @@ function renderItems(message, depth = 1) {
9193
10115
  return out;
9194
10116
  }
9195
10117
  var SCallout = /* @__PURE__ */ forwardRef(function SCallout2({ type = "default", showTitle = true, message = [], children, className, style }, ref) {
10118
+ const t = useLocale().messages.callout;
9196
10119
  const hasDangerTitle = type === "danger" && showTitle;
9197
10120
  const surface = SURFACE[type];
9198
10121
  const vars = {
@@ -9229,7 +10152,7 @@ var SCallout = /* @__PURE__ */ forwardRef(function SCallout2({ type = "default",
9229
10152
  color: "var(--cmp-callout-danger-title-color)"
9230
10153
  }
9231
10154
  ),
9232
- /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: DANGER_TITLE_LABEL })
10155
+ /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: t.dangerTitle })
9233
10156
  ]
9234
10157
  }
9235
10158
  ),
@@ -9777,6 +10700,7 @@ var SDropdownButtonImpl = /* @__PURE__ */ forwardRef(
9777
10700
  className,
9778
10701
  style
9779
10702
  }, ref) {
10703
+ const tc = useLocale().messages.common;
9780
10704
  const insideModal = useInsideModal();
9781
10705
  const [open, setOpen] = useState(false);
9782
10706
  const splitWrapRef = useRef(null);
@@ -9883,7 +10807,7 @@ var SDropdownButtonImpl = /* @__PURE__ */ forwardRef(
9883
10807
  ref: splitToggleRef,
9884
10808
  type: "button",
9885
10809
  disabled,
9886
- "aria-label": "\uBA54\uB274 \uC5F4\uAE30",
10810
+ "aria-label": tc.openMenu,
9887
10811
  className: cn(
9888
10812
  triggerBase,
9889
10813
  "justify-center border-l-[length:var(--cmp-button-border-width-default)]"
@@ -9930,14 +10854,12 @@ var SDropdownButtonImpl = /* @__PURE__ */ forwardRef(
9930
10854
  }
9931
10855
  );
9932
10856
  var SDropdownButton2 = /* @__PURE__ */ withDisplayName(SDropdownButtonImpl, "SDropdownButton");
9933
- var DEFAULT_LABEL = "\uAE30\uB2A5 \uB354 \uBCF4\uAE30";
9934
10857
  var SMeatballButtonImpl = /* @__PURE__ */ forwardRef(
9935
10858
  function SMeatballButton({
9936
10859
  size = "sm",
9937
10860
  intent = "default",
9938
10861
  items = [],
9939
- // 기본값을 리터럴로 둬야 README(docs:gen)에 실제 문구가 찍힌다
9940
- tooltipText = "\uAE30\uB2A5 \uB354 \uBCF4\uAE30",
10862
+ tooltipText: tooltipTextProp,
9941
10863
  ariaLabel,
9942
10864
  disabled = false,
9943
10865
  onItemClick,
@@ -9946,6 +10868,8 @@ var SMeatballButtonImpl = /* @__PURE__ */ forwardRef(
9946
10868
  style
9947
10869
  }, ref) {
9948
10870
  const insideModal = useInsideModal();
10871
+ const tc = useLocale().messages.common;
10872
+ const tooltipText = tooltipTextProp ?? tc.moreActions;
9949
10873
  const [open, setOpen] = useState(false);
9950
10874
  const buttonRef = useRef(null);
9951
10875
  const pointerRef = useRef(false);
@@ -9961,7 +10885,7 @@ var SMeatballButtonImpl = /* @__PURE__ */ forwardRef(
9961
10885
  }),
9962
10886
  []
9963
10887
  );
9964
- const label = ariaLabel?.trim() || tooltipText.trim() || DEFAULT_LABEL;
10888
+ const label = ariaLabel?.trim() || tooltipText.trim() || tc.moreActions;
9965
10889
  return /* @__PURE__ */ jsxs(
9966
10890
  RDropdown5.Root,
9967
10891
  {
@@ -10344,13 +11268,14 @@ function Row({
10344
11268
  }
10345
11269
  var SAccountListBox = /* @__PURE__ */ forwardRef(
10346
11270
  function SAccountListBox2({ email, name, authority, accountSetting, language, logout, className, style, ...rest }, ref) {
11271
+ const tl = useLocale().messages.accountListBox;
10347
11272
  const hasUserdata = email != null || name != null || authority != null;
10348
11273
  const languageOptions = language?.options ?? [];
10349
11274
  const hasLanguageMenu = languageOptions.length > 0;
10350
11275
  const [languageMenuOpen, setLanguageMenuOpen] = useState(false);
10351
11276
  const languageValueRef = useRef(null);
10352
11277
  const languageRowRef = useRef(null);
10353
- const languageLabel = language?.label ?? ACCOUNT_LIST_BOX_LABELS.language;
11278
+ const languageLabel = language?.label ?? tl.language;
10354
11279
  const languageDoesNothing = Boolean(language) && !hasLanguageMenu && !language?.onClick;
10355
11280
  useEffect(() => {
10356
11281
  if (isDev() && languageDoesNothing) {
@@ -10403,7 +11328,7 @@ var SAccountListBox = /* @__PURE__ */ forwardRef(
10403
11328
  Row,
10404
11329
  {
10405
11330
  icon: ACCOUNT_LIST_BOX_ICONS.accountSetting,
10406
- label: accountSetting.label ?? ACCOUNT_LIST_BOX_LABELS.accountSetting,
11331
+ label: accountSetting.label ?? tl.accountSetting,
10407
11332
  onClick: accountSetting.onClick
10408
11333
  }
10409
11334
  ),
@@ -10447,7 +11372,7 @@ var SAccountListBox = /* @__PURE__ */ forwardRef(
10447
11372
  {
10448
11373
  tone: "negative",
10449
11374
  icon: ACCOUNT_LIST_BOX_ICONS.logout,
10450
- label: logout?.label ?? ACCOUNT_LIST_BOX_LABELS.logout,
11375
+ label: logout?.label ?? tl.logout,
10451
11376
  onClick: logout?.onClick
10452
11377
  }
10453
11378
  )
@@ -10860,6 +11785,7 @@ function SPopover({
10860
11785
  menuClassName,
10861
11786
  style
10862
11787
  }) {
11788
+ const tc = useLocale().messages.common;
10863
11789
  const portalContainer = usePortalContainer();
10864
11790
  const [internalOpen, setInternalOpen] = useState(defaultOpen ?? false);
10865
11791
  const isControlled = open !== void 0;
@@ -10898,7 +11824,7 @@ function SPopover({
10898
11824
  {
10899
11825
  icon: "close",
10900
11826
  size: "xs",
10901
- ariaLabel: "\uB2EB\uAE30",
11827
+ ariaLabel: tc.close,
10902
11828
  onClick: () => setOpen(false),
10903
11829
  className: "absolute right-[12px] top-[12px]"
10904
11830
  }
@@ -11015,7 +11941,6 @@ var SPopup = /* @__PURE__ */ forwardRef(function SPopup2({
11015
11941
  }
11016
11942
  );
11017
11943
  });
11018
- var DEFAULT_LABEL2 = { tip: "\uD65C\uC6A9 TIP", notion: "\uC0AC\uC6A9\uBC95 \uC548\uB0B4" };
11019
11944
  var ICON = { tip: "helpOutline", notion: "notion" };
11020
11945
  var VIEWPORT_GUTTER = 24;
11021
11946
  var CLOSE_INSET = 12;
@@ -11033,11 +11958,12 @@ function SGuide({
11033
11958
  className,
11034
11959
  style
11035
11960
  }) {
11961
+ const tg = useLocale().messages.guide;
11036
11962
  const [open, setOpen] = useState(false);
11037
11963
  const portalContainer = usePortalContainer();
11038
11964
  const isNotion = type === "notion";
11039
11965
  const isAutoWidth = popupWidth === "auto";
11040
- const defaultLabel = DEFAULT_LABEL2[type];
11966
+ const defaultLabel = type === "notion" ? tg.notion : tg.tip;
11041
11967
  const iconName = ICON[type];
11042
11968
  const messages = flattenMessages(message);
11043
11969
  const active = open;
@@ -11182,7 +12108,7 @@ var CLOSE_ANIMATION_DURATION = 300;
11182
12108
  function SModalContainer({
11183
12109
  open,
11184
12110
  onOpenChange,
11185
- ariaTitle = "\uBAA8\uB2EC",
12111
+ ariaTitle: ariaTitleProp,
11186
12112
  showClose = false,
11187
12113
  onClose,
11188
12114
  persistent = true,
@@ -11192,6 +12118,8 @@ function SModalContainer({
11192
12118
  className,
11193
12119
  style
11194
12120
  }) {
12121
+ const { common: tc, modal: tm } = useLocale().messages;
12122
+ const ariaTitle = ariaTitleProp ?? tm.defaultTitle;
11195
12123
  const [shaking, setShaking] = useState(false);
11196
12124
  const [rendered, setRendered] = useState(() => Boolean(open));
11197
12125
  const contentRef = useRef(null);
@@ -11285,7 +12213,7 @@ function SModalContainer({
11285
12213
  SGhostButton,
11286
12214
  {
11287
12215
  icon: "close",
11288
- ariaLabel: "\uB2EB\uAE30",
12216
+ ariaLabel: tc.close,
11289
12217
  onClick: () => {
11290
12218
  if (closeRequested.current) return;
11291
12219
  closeRequested.current = true;
@@ -11351,7 +12279,7 @@ function SConfirmModal({
11351
12279
  tagSlot,
11352
12280
  optionSlot,
11353
12281
  contentSlot,
11354
- mainButtonLabel = "\uD655\uC778",
12282
+ mainButtonLabel: mainButtonLabelProp,
11355
12283
  mainButtonOutline,
11356
12284
  mainButtonDisabled = false,
11357
12285
  subButtonLabel,
@@ -11359,6 +12287,8 @@ function SConfirmModal({
11359
12287
  onCancel,
11360
12288
  onClose
11361
12289
  }) {
12290
+ const tc = useLocale().messages.common;
12291
+ const mainButtonLabel = mainButtonLabelProp ?? tc.confirm;
11362
12292
  const iconName = TYPE_ICON[type];
11363
12293
  const mainColor = MAIN_BUTTON_COLOR[type];
11364
12294
  const mainOutline = mainButtonOutline ?? MAIN_BUTTON_OUTLINE[type];
@@ -11473,6 +12403,7 @@ function SOverlayHeader({
11473
12403
  descriptionClassName,
11474
12404
  style
11475
12405
  }) {
12406
+ const tc = useLocale().messages.common;
11476
12407
  const hasDescription = description != null && description !== "";
11477
12408
  return /* @__PURE__ */ jsxs(
11478
12409
  "header",
@@ -11511,7 +12442,7 @@ function SOverlayHeader({
11511
12442
  SGhostButton,
11512
12443
  {
11513
12444
  icon: "close",
11514
- ariaLabel: "\uB2EB\uAE30",
12445
+ ariaLabel: tc.close,
11515
12446
  onClick: () => onClose?.(),
11516
12447
  className: "absolute right-[12px] top-[12px]"
11517
12448
  }
@@ -11566,14 +12497,6 @@ function SActionModal({
11566
12497
  }
11567
12498
  );
11568
12499
  }
11569
- var DEFAULT_MESSAGE = {
11570
- loading: "\uC791\uC5C5 \uC9C4\uD589\uC911...",
11571
- error: "\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD558\uC600\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694."
11572
- };
11573
- var DEFAULT_BUTTON_LABEL = {
11574
- loading: "\uD655\uC778",
11575
- error: "\uB2E4\uC2DC \uC2DC\uB3C4"
11576
- };
11577
12500
  function SLoadingModal({
11578
12501
  open,
11579
12502
  onOpenChange,
@@ -11588,7 +12511,8 @@ function SLoadingModal({
11588
12511
  width = "var(--cmp-modal-loading-width)",
11589
12512
  height = "var(--cmp-modal-loading-height)"
11590
12513
  }) {
11591
- const resolvedMessage = message ?? DEFAULT_MESSAGE[state2];
12514
+ const { loadingModal: t, common: tc } = useLocale().messages;
12515
+ const resolvedMessage = message ?? (state2 === "loading" ? t.loadingMessage : t.errorMessage);
11592
12516
  const lines = Array.isArray(resolvedMessage) ? resolvedMessage : resolvedMessage ? [resolvedMessage] : [];
11593
12517
  const buttonVisible = showButton || state2 === "error";
11594
12518
  return /* @__PURE__ */ jsx(
@@ -11599,7 +12523,7 @@ function SLoadingModal({
11599
12523
  onClose,
11600
12524
  showClose: state2 === "error",
11601
12525
  persistent,
11602
- ariaTitle: lines[0] || "\uB85C\uB529 \uC911",
12526
+ ariaTitle: lines[0] || t.ariaTitle,
11603
12527
  width,
11604
12528
  height,
11605
12529
  children: /* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-auto flex-col overflow-y-auto px-[32px]", children: /* @__PURE__ */ jsxs("div", { className: "m-auto flex flex-col items-center gap-(--cmp-modal-loading-gap)", children: [
@@ -11629,7 +12553,7 @@ function SLoadingModal({
11629
12553
  onButtonClick?.();
11630
12554
  onOpenChange?.(false);
11631
12555
  },
11632
- label: buttonLabel ?? DEFAULT_BUTTON_LABEL[state2]
12556
+ label: buttonLabel ?? (state2 === "loading" ? tc.confirm : t.errorButton)
11633
12557
  }
11634
12558
  )
11635
12559
  ] }) })
@@ -11639,7 +12563,7 @@ function SLoadingModal({
11639
12563
  var CLOSE_ANIMATION_DURATION2 = 300;
11640
12564
  var RESIZE_KEY_STEP = { normal: 10, large: 50 };
11641
12565
  var RESIZE_HIT_WIDTH = "calc(var(--cmp-splitter-border-width) + var(--cmp-splitter-border-padding) * 2)";
11642
- function toPx(value, percentBase) {
12566
+ function toPx2(value, percentBase) {
11643
12567
  if (typeof value === "number") return value;
11644
12568
  if (typeof value !== "string") return void 0;
11645
12569
  const normalized = value.trim();
@@ -11683,6 +12607,7 @@ function SDrawer({
11683
12607
  className,
11684
12608
  style
11685
12609
  }) {
12610
+ const tc = useLocale().messages.common;
11686
12611
  const [shaking, setShaking] = useState(false);
11687
12612
  const [rendered, setRendered] = useState(() => Boolean(open));
11688
12613
  const [entered, setEntered] = useState(false);
@@ -11774,8 +12699,8 @@ function SDrawer({
11774
12699
  const resizeBounds = () => {
11775
12700
  const limit = viewportWidth;
11776
12701
  if (limit === void 0) return { min: void 0, max: void 0 };
11777
- const min = toPx(minWidth, limit);
11778
- const max = toPx(maxWidth, limit);
12702
+ const min = toPx2(minWidth, limit);
12703
+ const max = toPx2(maxWidth, limit);
11779
12704
  return {
11780
12705
  min: min === void 0 ? void 0 : Math.min(min, limit),
11781
12706
  max: max === void 0 ? limit : Math.min(max, limit)
@@ -11909,7 +12834,7 @@ function SDrawer({
11909
12834
  {
11910
12835
  role: "separator",
11911
12836
  "aria-orientation": "vertical",
11912
- "aria-label": "Drawer \uB108\uBE44 \uC870\uC808",
12837
+ "aria-label": tc.resizeDrawer,
11913
12838
  "aria-valuenow": resizeValueNow,
11914
12839
  "aria-valuemin": resizeValueMin,
11915
12840
  "aria-valuemax": resizeValueMax,
@@ -12475,6 +13400,7 @@ function resolveRows(items) {
12475
13400
  }
12476
13401
  var SLauncherListBox = /* @__PURE__ */ forwardRef(
12477
13402
  function SLauncherListBox2({ items, onSelect, consoleHref, onConsoleClick, ariaLabel, className, style, ...rest }, ref) {
13403
+ const tl = useLocale().messages.launcher;
12478
13404
  const rows = items ? resolveRows(items) : [];
12479
13405
  if (rows.length === 0) return null;
12480
13406
  return /* @__PURE__ */ jsxs(
@@ -12593,7 +13519,7 @@ var SLauncherListBox = /* @__PURE__ */ forwardRef(
12593
13519
  onClick: () => onSelect?.(row.service),
12594
13520
  children: [
12595
13521
  content,
12596
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "\uC0C8 \uD0ED\uC5D0\uC11C \uC5F4\uB9BC" })
13522
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: tl.opensInNewTab })
12597
13523
  ]
12598
13524
  }
12599
13525
  )
@@ -12620,7 +13546,7 @@ var SLauncherListBox = /* @__PURE__ */ forwardRef(
12620
13546
  window.open(consoleHref, "_blank", "noopener,noreferrer");
12621
13547
  onConsoleClick?.();
12622
13548
  },
12623
- "aria-label": `${LAUNCHER_LIST_BOX_CONSOLE_LABEL} (\uC0C8 \uD0ED\uC5D0\uC11C \uC5F4\uB9BC)`
13549
+ "aria-label": `${LAUNCHER_LIST_BOX_CONSOLE_LABEL} (${tl.opensInNewTab})`
12624
13550
  }
12625
13551
  )
12626
13552
  }
@@ -13755,8 +14681,6 @@ var GNB_SYSTEM_LAYOUT = {
13755
14681
  domainRadius: domain("radius")
13756
14682
  };
13757
14683
  var GNB_SYSTEM_ALERT_DOT_SIZE = 6;
13758
- var GNB_SYSTEM_ALERT_LABEL = "\uC54C\uB9BC";
13759
- var GNB_SYSTEM_SETTING_LABEL = "\uC124\uC815";
13760
14684
  function TokenIcon3({ name, size }) {
13761
14685
  return /* @__PURE__ */ jsx(SIcon, { name, size: "100%", style: { width: size, height: size } });
13762
14686
  }
@@ -13864,6 +14788,7 @@ var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
13864
14788
  style,
13865
14789
  ...rest
13866
14790
  }, ref) {
14791
+ const tg = useLocale().messages.gnbSystem;
13867
14792
  const gnb3 = useContext(SGnbSystemContext);
13868
14793
  const color = colorProp ?? gnb3?.color ?? "light";
13869
14794
  const placement = gnb3?.placement ?? "panel";
@@ -13922,8 +14847,8 @@ var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
13922
14847
  setAlertTooltipDismissed(true);
13923
14848
  alert2?.onTooltipDismiss?.();
13924
14849
  };
13925
- const alertLabel = alert2?.label ?? GNB_SYSTEM_ALERT_LABEL;
13926
- const settingLabel = setting?.label ?? GNB_SYSTEM_SETTING_LABEL;
14850
+ const alertLabel = alert2?.label ?? tg.alert;
14851
+ const settingLabel = setting?.label ?? tg.setting;
13927
14852
  const alertButton = alert2 && /* @__PURE__ */ jsx(
13928
14853
  SystemButton,
13929
14854
  {
@@ -13959,7 +14884,7 @@ var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
13959
14884
  align: "end",
13960
14885
  offset: 8,
13961
14886
  viewportPadding: 8,
13962
- ariaLabel: alert2.label ?? GNB_SYSTEM_ALERT_LABEL,
14887
+ ariaLabel: alertLabel,
13963
14888
  onOpenAutoFocus: (event) => event.preventDefault(),
13964
14889
  className: "rounded-(--radius-8)",
13965
14890
  children: alert2.listBox
@@ -14287,6 +15212,7 @@ var PAGE_CONTENT_WIDTHS = ["full", "fixed", "fixedCenter"];
14287
15212
  var PAGE_HEADER_VARIANTS = ["plain", "bar"];
14288
15213
  var SPageHeader = /* @__PURE__ */ withDisplayName(
14289
15214
  forwardRef(function SPageHeader2({ title, subText, titleSlot, variant, onBack, slot, scrolled, className, style, ...rest }, ref) {
15215
+ const tc = useLocale().messages.common;
14290
15216
  const hasBack = onBack != null;
14291
15217
  const hasTitleSlot = titleSlot != null && titleSlot !== false;
14292
15218
  const titleEl = /* @__PURE__ */ jsx("span", { className: "typo-heading-lg min-w-0 truncate text-(--cmp-pageHeader-title-text)", children: title });
@@ -14325,7 +15251,7 @@ var SPageHeader = /* @__PURE__ */ withDisplayName(
14325
15251
  {
14326
15252
  icon: "chevronLeft",
14327
15253
  size: "xs",
14328
- ariaLabel: "\uB4A4\uB85C\uAC00\uAE30",
15254
+ ariaLabel: tc.back,
14329
15255
  onClick: onBack,
14330
15256
  className: cn("shrink-0", bar ? "" : "mt-[3px]")
14331
15257
  }
@@ -14902,7 +15828,6 @@ var STEPPER_VERTICAL_COLORS = {
14902
15828
  sequenceIconCompleted: STEPPER_COLORS.sequenceText.completed,
14903
15829
  errorBadge: "#FB4444"
14904
15830
  };
14905
- var ERROR_TOOLTIP_MESSAGE = "\uD655\uC778\uC774 \uD544\uC694\uD55C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.";
14906
15831
  function getItemValue(item4, index) {
14907
15832
  return item4.value ?? String(index + 1);
14908
15833
  }
@@ -14944,10 +15869,12 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
14944
15869
  vertical = false,
14945
15870
  clickable,
14946
15871
  onValueChange,
14947
- ariaLabel = "\uC9C4\uD589 \uB2E8\uACC4",
15872
+ ariaLabel: ariaLabelProp,
14948
15873
  className,
14949
15874
  style
14950
15875
  }, ref) {
15876
+ const t = useLocale().messages.stepper;
15877
+ const ariaLabel = ariaLabelProp ?? t.ariaLabel;
14951
15878
  const config = STEPPER_SIZE_CONFIG[size];
14952
15879
  const isClickable = clickable ?? vertical;
14953
15880
  const [hoveredIndex, setHoveredIndex] = useState(null);
@@ -15229,7 +16156,7 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
15229
16156
  {
15230
16157
  trigger: "none",
15231
16158
  open: showTooltip,
15232
- content: ERROR_TOOLTIP_MESSAGE,
16159
+ content: t.errorTooltip,
15233
16160
  tooltipType: "danger",
15234
16161
  placement: "right",
15235
16162
  children: /* @__PURE__ */ jsxs(
@@ -15407,16 +16334,20 @@ function monthCells(year, month) {
15407
16334
  }
15408
16335
  return cells;
15409
16336
  }
15410
- var WEEK_LABELS = ["\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"];
15411
- var WEEKDAY_SUFFIX_EM = 0.25 + 3 * 1;
15412
- var weekdaySuffixWidth = (fontSize) => Math.ceil(fontSize * WEEKDAY_SUFFIX_EM);
15413
- function withWeekday(value) {
16337
+ var glyphEm = (char) => /[\u1100-\u11ff\u3040-\u30ff\u3130-\u318f\u3400-\u9fff\uac00-\ud7a3]/.test(char) ? 1 : 0.58;
16338
+ var weekdaySuffixWidth = (fontSize, t) => {
16339
+ const longest = Math.max(
16340
+ ...t.weekdaysLong.map((name) => Array.from(name).reduce((sum, char) => sum + glyphEm(char), 0))
16341
+ );
16342
+ return Math.ceil(fontSize * (0.25 + longest));
16343
+ };
16344
+ function withWeekday(value, t) {
15414
16345
  const [date = "", ...rest] = value.split(" ");
15415
16346
  const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(date);
15416
16347
  if (!match) return value;
15417
16348
  const day = new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3])).getDay();
15418
16349
  if (Number.isNaN(day)) return value;
15419
- return [date, `${WEEK_LABELS[day]}\uC694\uC77C`, ...rest].join(" ");
16350
+ return [date, t.weekdaysLong[day], ...rest].join(" ");
15420
16351
  }
15421
16352
 
15422
16353
  // src/components/SCalendarBoard/calendar-board-layout.ts
@@ -15651,7 +16582,9 @@ function CalendarEventButton({
15651
16582
  }
15652
16583
  );
15653
16584
  }
15654
- var CalendarMoreButton = /* @__PURE__ */ forwardRef(function CalendarMoreButton2({ count, label = "\uB354\uBCF4\uAE30", dimmed = false, onClick, className, style }, ref) {
16585
+ var CalendarMoreButton = /* @__PURE__ */ forwardRef(function CalendarMoreButton2({ count, label: labelProp, dimmed = false, onClick, className, style }, ref) {
16586
+ const tc = useLocale().messages.common;
16587
+ const label = labelProp ?? tc.more;
15655
16588
  return /* @__PURE__ */ jsxs(
15656
16589
  "button",
15657
16590
  {
@@ -15674,10 +16607,7 @@ var CalendarMoreButton = /* @__PURE__ */ forwardRef(function CalendarMoreButton2
15674
16607
  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)"
15675
16608
  }
15676
16609
  ),
15677
- /* @__PURE__ */ jsxs("span", { className: "typo-body-sm-semibold shrink-0 text-(--cmp-calendarBoard-moreButton-count-color)", children: [
15678
- count,
15679
- "\uAC1C"
15680
- ] }),
16610
+ /* @__PURE__ */ jsx("span", { className: "typo-body-sm-semibold shrink-0 text-(--cmp-calendarBoard-moreButton-count-color)", children: tc.count(count) }),
15681
16611
  /* @__PURE__ */ jsx("span", { className: "typo-body-sm-default min-w-0 truncate text-(--cmp-calendarBoard-moreButton-label-color)", children: label })
15682
16612
  ]
15683
16613
  }
@@ -15815,10 +16745,12 @@ function CalendarDayEventListBox({
15815
16745
  minWidth,
15816
16746
  minHeight,
15817
16747
  onClose,
15818
- closeLabel = "\uB2EB\uAE30"
16748
+ closeLabel: closeLabelProp
15819
16749
  }) {
16750
+ const { common: tc, date: t } = useLocale().messages;
16751
+ const closeLabel = closeLabelProp ?? tc.close;
15820
16752
  const [y, m, d] = date.split("-").map(Number);
15821
- const weekday = WEEK_LABELS[new Date(y, m - 1, d).getDay()];
16753
+ const weekday = t.weekdays[new Date(y, m - 1, d).getDay()];
15822
16754
  return /* @__PURE__ */ jsxs(
15823
16755
  "div",
15824
16756
  {
@@ -15826,10 +16758,7 @@ function CalendarDayEventListBox({
15826
16758
  style: { minWidth, maxWidth: MAX_WIDTH, minHeight, maxHeight: MAX_HEIGHT },
15827
16759
  children: [
15828
16760
  /* @__PURE__ */ 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: [
15829
- /* @__PURE__ */ jsxs("span", { className: "typo-heading-md text-(--cmp-calendarBoard-header-content-color)", children: [
15830
- d,
15831
- "\uC77C"
15832
- ] }),
16761
+ /* @__PURE__ */ jsx("span", { className: "typo-heading-md text-(--cmp-calendarBoard-header-content-color)", children: t.dayLabel(d) }),
15833
16762
  /* @__PURE__ */ jsxs("span", { className: "typo-body-lg-default flex-1 text-(--cmp-calendarBoard-header-content-color)", children: [
15834
16763
  "(",
15835
16764
  weekday,
@@ -15890,12 +16819,14 @@ function SCalendarBoard({
15890
16819
  focusedEventId,
15891
16820
  onEventClick,
15892
16821
  onMoreClick,
15893
- todayLabel = "\uC624\uB298",
16822
+ todayLabel: todayLabelProp,
15894
16823
  moreLabel,
15895
16824
  headerRight,
15896
16825
  className,
15897
16826
  style
15898
16827
  }) {
16828
+ const t = useLocale().messages.date;
16829
+ const todayLabel = todayLabelProp ?? t.today;
15899
16830
  const today = todayStr();
15900
16831
  const [ty, tm] = [Number(today.slice(0, 4)), Number(today.slice(5, 7))];
15901
16832
  const [innerView, setInnerView] = useState(() => ({
@@ -16001,7 +16932,7 @@ function SCalendarBoard({
16001
16932
  {
16002
16933
  icon: "chevronLeft",
16003
16934
  size: "xxs",
16004
- ariaLabel: "\uC774\uC804 \uD574",
16935
+ ariaLabel: t.prevYear,
16005
16936
  onClick: () => setView({ year: view.year - 1, month: view.month })
16006
16937
  }
16007
16938
  ),
@@ -16011,7 +16942,7 @@ function SCalendarBoard({
16011
16942
  {
16012
16943
  icon: "chevronRight",
16013
16944
  size: "xxs",
16014
- ariaLabel: "\uB2E4\uC74C \uD574",
16945
+ ariaLabel: t.nextYear,
16015
16946
  onClick: () => setView({ year: view.year + 1, month: view.month })
16016
16947
  }
16017
16948
  )
@@ -16023,20 +16954,17 @@ function SCalendarBoard({
16023
16954
  {
16024
16955
  icon: "chevronLeft",
16025
16956
  size: "xxs",
16026
- ariaLabel: "\uC774\uC804 \uB2EC",
16957
+ ariaLabel: t.prevMonth,
16027
16958
  onClick: () => setView(calcYearMonth(view.year, view.month, "prev"))
16028
16959
  }
16029
16960
  ),
16030
- /* @__PURE__ */ jsxs("span", { className: "typo-heading-lg inline-flex min-w-[48px] justify-center text-(--cmp-calendarBoard-header-content-color)", children: [
16031
- view.month,
16032
- "\uC6D4"
16033
- ] }),
16961
+ /* @__PURE__ */ jsx("span", { className: "typo-heading-lg inline-flex min-w-[48px] justify-center text-(--cmp-calendarBoard-header-content-color)", children: t.monthLabel(view.month) }),
16034
16962
  /* @__PURE__ */ jsx(
16035
16963
  SGhostButton,
16036
16964
  {
16037
16965
  icon: "chevronRight",
16038
16966
  size: "xxs",
16039
- ariaLabel: "\uB2E4\uC74C \uB2EC",
16967
+ ariaLabel: t.nextMonth,
16040
16968
  onClick: () => setView(calcYearMonth(view.year, view.month, "next"))
16041
16969
  }
16042
16970
  )
@@ -16059,7 +16987,7 @@ function SCalendarBoard({
16059
16987
  {
16060
16988
  className: "grid shrink-0 bg-(--cmp-calendarBoard-grid-bg) pt-(--cmp-calendarBoard-grid-paddingTop) pb-(--cmp-calendarBoard-grid-gap)",
16061
16989
  style: { gridTemplateColumns: columns },
16062
- children: WEEK_LABELS.map((label) => /* @__PURE__ */ jsx(
16990
+ children: t.weekdays.map((label) => /* @__PURE__ */ jsx(
16063
16991
  "div",
16064
16992
  {
16065
16993
  className: "typo-body-md-default flex justify-center text-(--cmp-calendarBoard-grid-weekRow-color)",
@@ -16414,7 +17342,7 @@ var SSearchInput = /* @__PURE__ */ forwardRef(function SSearchInput2({
16414
17342
  onChange,
16415
17343
  onSearch,
16416
17344
  size = "sm",
16417
- placeholder = "\uACB0\uACFC \uB0B4 \uAC80\uC0C9",
17345
+ placeholder: placeholderProp,
16418
17346
  clearable = false,
16419
17347
  disabled = false,
16420
17348
  width,
@@ -16427,6 +17355,8 @@ var SSearchInput = /* @__PURE__ */ forwardRef(function SSearchInput2({
16427
17355
  onKeyDown,
16428
17356
  ...rest
16429
17357
  }, ref) {
17358
+ const { common: tc, input: ti } = useLocale().messages;
17359
+ const placeholder = placeholderProp ?? ti.searchWithinResults;
16430
17360
  const f = FONT[size];
16431
17361
  const hasValue = value !== void 0 && value !== null && String(value) !== "";
16432
17362
  return /* @__PURE__ */ jsx(
@@ -16494,7 +17424,7 @@ var SSearchInput = /* @__PURE__ */ forwardRef(function SSearchInput2({
16494
17424
  {
16495
17425
  icon: "close",
16496
17426
  size: "xxs",
16497
- ariaLabel: "\uC9C0\uC6B0\uAE30",
17427
+ ariaLabel: tc.clear,
16498
17428
  className: "flex-shrink-0",
16499
17429
  onClick: () => onValueChange?.("")
16500
17430
  }
@@ -16679,6 +17609,7 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
16679
17609
  className,
16680
17610
  style
16681
17611
  }, ref) {
17612
+ const runRules2 = useRunRules();
16682
17613
  const multi = type === "multi" || type === "multi_depth" || type === "multi_tree";
16683
17614
  const isDepth = type === "default_depth" || type === "multi_depth";
16684
17615
  const isTree = type === "tree" || type === "multi_tree";
@@ -16791,7 +17722,7 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
16791
17722
  setSearch("");
16792
17723
  if (rules && rules.length > 0) {
16793
17724
  const current = valueForRules ?? selectedRef.current;
16794
- setRuleError(runRules(multi ? current : current[0] ?? "", rules));
17725
+ setRuleError(runRules2(multi ? current : current[0] ?? "", rules));
16795
17726
  }
16796
17727
  }
16797
17728
  };
@@ -16830,7 +17761,7 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
16830
17761
  useFormField({
16831
17762
  name,
16832
17763
  validate: () => {
16833
- const msg = runRules(multi ? selected : selected[0] ?? "", rules);
17764
+ const msg = runRules2(multi ? selected : selected[0] ?? "", rules);
16834
17765
  setRuleError(msg);
16835
17766
  return msg === "";
16836
17767
  },
@@ -17103,14 +18034,14 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
17103
18034
  const showClear = clearable && !effectiveDisabled && !isPlaceholder;
17104
18035
  const handleClear = () => {
17105
18036
  emit3([]);
17106
- if (rules && rules.length > 0) setRuleError(runRules(multi ? [] : "", rules));
18037
+ if (rules && rules.length > 0) setRuleError(runRules2(multi ? [] : "", rules));
17107
18038
  triggerRef.current?.focus();
17108
18039
  };
17109
18040
  const handleRemoveChip = (targets) => {
17110
18041
  const remove = new Set(targets);
17111
18042
  const next = selected.filter((v) => !remove.has(v));
17112
18043
  emit3(next);
17113
- if (rules && rules.length > 0) setRuleError(runRules(next, rules));
18044
+ if (rules && rules.length > 0) setRuleError(runRules2(next, rules));
17114
18045
  triggerRef.current?.focus();
17115
18046
  };
17116
18047
  const handleSelect = (nextValue, index, extend = false) => {
@@ -17992,12 +18923,7 @@ var NO_KEYS = /* @__PURE__ */ new Set();
17992
18923
  var DEFAULT_ROW_HEIGHT = 44;
17993
18924
  var DENSE_ROW_HEIGHT = 32;
17994
18925
  var SELECTABLE_COLUMN_WIDTH = 48;
17995
- var DEFAULT_ROWS_PER_PAGE_OPTION = [
17996
- { label: "10\uAC1C\uC529 \uBCF4\uAE30", value: 10 },
17997
- { label: "25\uAC1C\uC529 \uBCF4\uAE30", value: 25 },
17998
- { label: "50\uAC1C\uC529 \uBCF4\uAE30", value: 50 },
17999
- { label: "100\uAC1C\uC529 \uBCF4\uAE30", value: 100 }
18000
- ];
18926
+ var DEFAULT_ROWS_PER_PAGE_COUNTS = [10, 25, 50, 100];
18001
18927
  var cellValue = (col, row) => {
18002
18928
  const raw = col.field == null ? void 0 : typeof col.field === "function" ? col.field(row) : row[col.field];
18003
18929
  return col.format ? col.format(raw, row) : raw;
@@ -18037,7 +18963,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
18037
18963
  rowKey = "id",
18038
18964
  selectable = false,
18039
18965
  rowSelectLabel,
18040
- selectAllLabel = "\uC804\uCCB4 \uC120\uD0DD",
18966
+ selectAllLabel: selectAllLabelProp,
18041
18967
  dragSelectable = false,
18042
18968
  contextMenuItems,
18043
18969
  onContextMenuItemClick,
@@ -18054,7 +18980,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
18054
18980
  stickyColumn,
18055
18981
  radius = "default",
18056
18982
  bordered = true,
18057
- emptyLabel = "\uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
18983
+ emptyLabel: emptyLabelProp,
18058
18984
  emptySlot,
18059
18985
  loading: loading2 = false,
18060
18986
  dense = false,
@@ -18064,7 +18990,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
18064
18990
  onPageChange,
18065
18991
  internalPagination = false,
18066
18992
  showRowsPerPageSelect = false,
18067
- rowsPerPageOption = DEFAULT_ROWS_PER_PAGE_OPTION,
18993
+ rowsPerPageOption: rowsPerPageOptionProp,
18068
18994
  onRowsPerPageChange,
18069
18995
  virtualScroll = false,
18070
18996
  rowHeight,
@@ -18086,6 +19012,13 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
18086
19012
  }, ref) {
18087
19013
  const autoId = useId();
18088
19014
  const resolvedTableId = tableId ?? autoId;
19015
+ const t = useLocale().messages.table;
19016
+ const selectAllLabel = selectAllLabelProp ?? t.selectAll;
19017
+ const emptyLabel = emptyLabelProp ?? t.empty;
19018
+ const rowsPerPageOption = useMemo(
19019
+ () => rowsPerPageOptionProp ?? DEFAULT_ROWS_PER_PAGE_COUNTS.map((count) => ({ label: t.rowsPerPage(count), value: count })),
19020
+ [rowsPerPageOptionProp, t]
19021
+ );
18089
19022
  const [innerDense, setInnerDense] = useState(dense);
18090
19023
  useEffect(() => {
18091
19024
  setInnerDense(dense);
@@ -18897,7 +19830,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
18897
19830
  name: "pageEdit",
18898
19831
  size: 12,
18899
19832
  color: "var(--sys-color-link-accent)",
18900
- label: "\uC218\uC815 \uAC00\uB2A5",
19833
+ label: t.editable,
18901
19834
  className: "shrink-0"
18902
19835
  }
18903
19836
  ),
@@ -18907,7 +19840,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
18907
19840
  name: "pageMove",
18908
19841
  size: 12,
18909
19842
  color: "var(--sys-color-link-accent)",
18910
- label: "\uC0C8 \uD654\uBA74\uC5D0\uC11C \uC5F4\uAE30",
19843
+ label: t.opensInNewScreen,
18911
19844
  className: "shrink-0"
18912
19845
  }
18913
19846
  ),
@@ -18931,7 +19864,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
18931
19864
  size: "xxs",
18932
19865
  intent: sortDir ? "action" : "default",
18933
19866
  icon: sortDir === "asc" ? "arrowUp" : sortDir === "desc" ? "arrowDown" : "updown",
18934
- ariaLabel: `${col.label} \uC815\uB82C`,
19867
+ ariaLabel: t.sortBy(col.label),
18935
19868
  onClick: () => toggleSort(col)
18936
19869
  }
18937
19870
  ) })
@@ -19081,7 +20014,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
19081
20014
  value: isSel || !isRowIndeterminate?.(row) ? isSel : null,
19082
20015
  disabled: !canSelectRow(row),
19083
20016
  onValueChange: () => toggleRow(row, rowOffset + ri),
19084
- ariaLabel: rowSelectLabel?.(row) ?? "\uD589 \uC120\uD0DD"
20017
+ ariaLabel: rowSelectLabel?.(row) ?? t.selectRow
19085
20018
  }
19086
20019
  ) })
19087
20020
  }
@@ -19234,7 +20167,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
19234
20167
  icon: innerDense ? "row" : "rowDense",
19235
20168
  iconRotate: 90,
19236
20169
  iconColor: "var(--sys-color-fg-quaternary)",
19237
- label: innerDense ? "\uB113\uAC8C \uBCF4\uAE30" : "\uC881\uAC8C \uBCF4\uAE30",
20170
+ label: innerDense ? t.denseOff : t.denseOn,
19238
20171
  onClick: () => changeDense(!innerDense)
19239
20172
  }
19240
20173
  ),
@@ -19341,6 +20274,8 @@ var STableBar = /* @__PURE__ */ forwardRef(function STableBar2({ title, total, s
19341
20274
  const hasTitle = title != null;
19342
20275
  const hasLeading = hasTitle || hasCount;
19343
20276
  const titleId = useId();
20277
+ const { messages, formatNumber } = useLocale();
20278
+ const t = messages.tableBar;
19344
20279
  const isToolbar = Boolean(actions || rightActions);
19345
20280
  return /* @__PURE__ */ jsxs(
19346
20281
  "div",
@@ -19366,9 +20301,9 @@ var STableBar = /* @__PURE__ */ forwardRef(function STableBar2({ title, total, s
19366
20301
  ),
19367
20302
  hasCount && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[var(--cmp-table-content-gap)]", children: [
19368
20303
  hasTotal && /* @__PURE__ */ jsxs("span", { className: "typo-table-accent whitespace-nowrap text-[var(--sys-color-fg-primary)]", children: [
19369
- "\uCD1D ",
19370
- /* @__PURE__ */ jsx("b", { style: { color: totalColor(total) }, children: total.toLocaleString() }),
19371
- " \uAC74"
20304
+ t.totalBefore,
20305
+ /* @__PURE__ */ jsx("b", { style: { color: totalColor(total) }, children: formatNumber(total) }),
20306
+ t.totalAfter
19372
20307
  ] }),
19373
20308
  hasTotal && hasSelected && /* @__PURE__ */ jsx(
19374
20309
  "span",
@@ -19379,8 +20314,9 @@ var STableBar = /* @__PURE__ */ forwardRef(function STableBar2({ title, total, s
19379
20314
  }
19380
20315
  ),
19381
20316
  hasSelected && /* @__PURE__ */ jsxs("span", { className: "typo-table-body whitespace-nowrap text-[var(--sys-color-fg-primary)]", children: [
19382
- /* @__PURE__ */ jsx("b", { style: { color: selectedColor(selected) }, children: selected.toLocaleString() }),
19383
- " \uAC74 \uC120\uD0DD"
20317
+ t.selectedBefore,
20318
+ /* @__PURE__ */ jsx("b", { style: { color: selectedColor(selected) }, children: formatNumber(selected) }),
20319
+ t.selectedAfter
19384
20320
  ] })
19385
20321
  ] }),
19386
20322
  actions && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[var(--cmp-table-bar-section-gap)] has-[>div:empty]:hidden", children: [
@@ -19793,12 +20729,15 @@ var SInput = /* @__PURE__ */ forwardRef(function SInput2({
19793
20729
  width,
19794
20730
  disabled = false,
19795
20731
  readOnly = false,
19796
- placeholder = "\uC785\uB825\uD574 \uC8FC\uC138\uC694.",
20732
+ placeholder: placeholderProp,
19797
20733
  onBlur,
19798
20734
  className,
19799
20735
  style,
19800
20736
  ...rest
19801
20737
  }, ref) {
20738
+ const runRules2 = useRunRules();
20739
+ const { common: tc, input: ti } = useLocale().messages;
20740
+ const placeholder = placeholderProp ?? ti.placeholder;
19802
20741
  const [visible, setVisible] = useState(false);
19803
20742
  const [ruleError, setRuleError] = useState("");
19804
20743
  const controlId = useFieldControlId(rest.id);
@@ -19809,7 +20748,7 @@ var SInput = /* @__PURE__ */ forwardRef(function SInput2({
19809
20748
  useFormField({
19810
20749
  name: rest.name,
19811
20750
  validate: () => {
19812
- const msg = runRules(value, rules);
20751
+ const msg = runRules2(value, rules);
19813
20752
  setRuleError(msg);
19814
20753
  return msg === "";
19815
20754
  },
@@ -19874,11 +20813,11 @@ var SInput = /* @__PURE__ */ forwardRef(function SInput2({
19874
20813
  onChange: (e) => {
19875
20814
  onChange?.(e);
19876
20815
  onValueChange?.(e.target.value);
19877
- if (ruleError !== "") setRuleError(runRules(e.target.value, rules));
20816
+ if (ruleError !== "") setRuleError(runRules2(e.target.value, rules));
19878
20817
  },
19879
20818
  onBlur: (e) => {
19880
20819
  onBlur?.(e);
19881
- if (rules && rules.length > 0) setRuleError(runRules(e.target.value, rules));
20820
+ if (rules && rules.length > 0) setRuleError(runRules2(e.target.value, rules));
19882
20821
  },
19883
20822
  className: cn(
19884
20823
  "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",
@@ -19908,7 +20847,7 @@ var SInput = /* @__PURE__ */ forwardRef(function SInput2({
19908
20847
  {
19909
20848
  icon: "close",
19910
20849
  size: "xxs",
19911
- ariaLabel: "\uC9C0\uC6B0\uAE30",
20850
+ ariaLabel: tc.clear,
19912
20851
  className: "flex-shrink-0",
19913
20852
  onClick: () => onValueChange?.("")
19914
20853
  }
@@ -19918,7 +20857,7 @@ var SInput = /* @__PURE__ */ forwardRef(function SInput2({
19918
20857
  {
19919
20858
  icon: visible ? "visibilityOn" : "visibilityOff",
19920
20859
  size: "xxs",
19921
- ariaLabel: "\uBE44\uBC00\uBC88\uD638 \uD45C\uC2DC",
20860
+ ariaLabel: ti.showPassword,
19922
20861
  disabled: disabled || readOnly,
19923
20862
  className: "flex-shrink-0",
19924
20863
  onClick: () => setVisible((v) => !v)
@@ -19959,15 +20898,15 @@ var formatInputWithCommas = (value) => {
19959
20898
  const formattedInt = addCommas(intPart === "" ? "0" : intPart);
19960
20899
  return `${isNeg ? "-" : ""}${formattedInt}${hasDecimal ? `.${decPart}` : ""}`;
19961
20900
  };
19962
- var getRangeError = (value, min, max) => {
20901
+ var getRangeError = (value, min, max, t) => {
19963
20902
  if (value === null) return "";
19964
20903
  const belowMin = value < min;
19965
20904
  const aboveMax = value > max;
19966
20905
  if (!belowMin && !aboveMax) return "";
19967
20906
  if (Number.isFinite(min) && Number.isFinite(max)) {
19968
- return `${formatWithCommas(min)}~${formatWithCommas(max)} \uC0AC\uC774\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694.`;
20907
+ return t.rangeBetween(formatWithCommas(min), formatWithCommas(max));
19969
20908
  }
19970
- 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.`;
20909
+ return belowMin ? t.atLeast(formatWithCommas(min)) : t.atMost(formatWithCommas(max));
19971
20910
  };
19972
20911
  var getDecimalLimit = (allowDecimal, maxDecimalLength) => {
19973
20912
  if (!allowDecimal || maxDecimalLength === void 0 || !Number.isFinite(maxDecimalLength)) {
@@ -20011,7 +20950,7 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
20011
20950
  onFocus,
20012
20951
  onBlur,
20013
20952
  name,
20014
- placeholder = "\uC785\uB825\uD574 \uC8FC\uC138\uC694.",
20953
+ placeholder: placeholderProp,
20015
20954
  disabled = false,
20016
20955
  readOnly = false,
20017
20956
  rules,
@@ -20035,6 +20974,9 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
20035
20974
  className,
20036
20975
  style
20037
20976
  }, ref) {
20977
+ const runRules2 = useRunRules();
20978
+ const { input: ti, numberInput: t } = useLocale().messages;
20979
+ const placeholder = placeholderProp ?? ti.placeholder;
20038
20980
  const p = PAD2[size];
20039
20981
  const padX = `var(--cmp-numberInput-${size}-paddingX)`;
20040
20982
  const decimalLimit = getDecimalLimit(allowDecimal, maxDecimalLength);
@@ -20058,9 +21000,9 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
20058
21000
  useFormField({
20059
21001
  name,
20060
21002
  validate: () => {
20061
- const msg = runRules(numValue, rules);
21003
+ const msg = runRules2(numValue, rules);
20062
21004
  setRuleError(msg);
20063
- const range = clampOnBlur ? "" : getRangeError(numValue, min, max);
21005
+ const range = clampOnBlur ? "" : getRangeError(numValue, min, max, t);
20064
21006
  setRangeError(range);
20065
21007
  return msg === "" && range === "";
20066
21008
  },
@@ -20163,7 +21105,7 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
20163
21105
  type: "button",
20164
21106
  tabIndex: -1,
20165
21107
  disabled: off,
20166
- "aria-label": dir === "inc" ? "\uC99D\uAC00" : "\uAC10\uC18C",
21108
+ "aria-label": dir === "inc" ? t.increase : t.decrease,
20167
21109
  onClick: dir === "inc" ? increment : decrement,
20168
21110
  className: cn(
20169
21111
  "flex flex-shrink-0 items-center justify-center border border-solid border-transparent transition-colors",
@@ -20255,8 +21197,8 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
20255
21197
  const clamped = !clampOnBlur || n === null ? n : Math.min(Math.max(n, min), max);
20256
21198
  if (clamped !== n) emit3(clamped);
20257
21199
  else setDisplay(n === null ? "" : formatInputWithCommas(cleaned));
20258
- if (rules && rules.length > 0) setRuleError(runRules(clamped, rules));
20259
- setRangeError(clampOnBlur ? "" : getRangeError(clamped, min, max));
21200
+ if (rules && rules.length > 0) setRuleError(runRules2(clamped, rules));
21201
+ setRangeError(clampOnBlur ? "" : getRangeError(clamped, min, max, t));
20260
21202
  onBlur?.(e);
20261
21203
  },
20262
21204
  className: cn(
@@ -20434,6 +21376,7 @@ function SCalendar({
20434
21376
  className,
20435
21377
  style
20436
21378
  }) {
21379
+ const t = useLocale().messages.date;
20437
21380
  const today = todayStr();
20438
21381
  const base = value || today;
20439
21382
  const [y, setY] = useState(() => Number(base.split("-")[0]));
@@ -20502,7 +21445,7 @@ function SCalendar({
20502
21445
  {
20503
21446
  icon: "chevronLeft",
20504
21447
  size: "xxs",
20505
- ariaLabel: "prevYear",
21448
+ ariaLabel: t.prevYear,
20506
21449
  onClick: () => view(y - 1, m)
20507
21450
  }
20508
21451
  ),
@@ -20512,7 +21455,7 @@ function SCalendar({
20512
21455
  {
20513
21456
  icon: "chevronRight",
20514
21457
  size: "xxs",
20515
- ariaLabel: "nextYear",
21458
+ ariaLabel: t.nextYear,
20516
21459
  onClick: () => view(y + 1, m)
20517
21460
  }
20518
21461
  )
@@ -20524,23 +21467,20 @@ function SCalendar({
20524
21467
  {
20525
21468
  icon: "chevronLeft",
20526
21469
  size: "xxs",
20527
- ariaLabel: "prevMonth",
21470
+ ariaLabel: t.prevMonth,
20528
21471
  onClick: () => {
20529
21472
  const n = calcYearMonth(y, m, "prev");
20530
21473
  view(n.year, n.month);
20531
21474
  }
20532
21475
  }
20533
21476
  ),
20534
- /* @__PURE__ */ jsxs("span", { className: "inline-flex w-full min-w-[40px] items-center justify-center text-center typo-field-md-medium", children: [
20535
- m,
20536
- "\uC6D4"
20537
- ] }),
21477
+ /* @__PURE__ */ jsx("span", { className: "inline-flex w-full min-w-[40px] items-center justify-center text-center typo-field-md-medium", children: t.monthLabel(m) }),
20538
21478
  /* @__PURE__ */ jsx(
20539
21479
  SGhostButton,
20540
21480
  {
20541
21481
  icon: "chevronRight",
20542
21482
  size: "xxs",
20543
- ariaLabel: "nextMonth",
21483
+ ariaLabel: t.nextMonth,
20544
21484
  onClick: () => {
20545
21485
  const n = calcYearMonth(y, m, "next");
20546
21486
  view(n.year, n.month);
@@ -20549,7 +21489,7 @@ function SCalendar({
20549
21489
  )
20550
21490
  ] })
20551
21491
  ] }),
20552
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-7", children: WEEK_LABELS.map((label) => /* @__PURE__ */ jsx(
21492
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-7", children: t.weekdays.map((label) => /* @__PURE__ */ jsx(
20553
21493
  "span",
20554
21494
  {
20555
21495
  className: "flex h-[20px] items-center justify-center text-[12px] font-normal text-[color:var(--cmp-datepicker-calendar-week-color)]",
@@ -20641,11 +21581,6 @@ var modeListItemClass = (selected, disabled) => cn(
20641
21581
  !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)]",
20642
21582
  !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)]"
20643
21583
  );
20644
- var MODE_NOUN = {
20645
- date: "\uB0A0\uC9DC",
20646
- month: "\uC6D4",
20647
- year: "\uC5F0\uB3C4"
20648
- };
20649
21584
  var YEAR_LIST_EDGE_BUFFER = 24;
20650
21585
  var YEAR_LIST_EXPAND_SIZE = 80;
20651
21586
  var MONTHS = Array.from({ length: 12 }, (_, i) => i + 1);
@@ -20799,6 +21734,7 @@ function SDatePickerYearListbox({
20799
21734
  );
20800
21735
  }
20801
21736
  function MonthWheel({ year, value, selectable, onCommit }) {
21737
+ const t = useLocale().messages.date;
20802
21738
  const listRef = useRef(null);
20803
21739
  const initialValueRef = useRef(value);
20804
21740
  useLayoutEffect(() => {
@@ -20819,7 +21755,7 @@ function MonthWheel({ year, value, selectable, onCommit }) {
20819
21755
  children: MONTHS.map((month) => {
20820
21756
  const selected = month === value;
20821
21757
  const disabled = isMonthDisabled(year, month, selectable);
20822
- return /* @__PURE__ */ jsxs(
21758
+ return /* @__PURE__ */ jsx(
20823
21759
  "button",
20824
21760
  {
20825
21761
  type: "button",
@@ -20828,10 +21764,7 @@ function MonthWheel({ year, value, selectable, onCommit }) {
20828
21764
  disabled,
20829
21765
  className: modeListItemClass(selected, disabled),
20830
21766
  onClick: () => !disabled && onCommit(month),
20831
- children: [
20832
- month,
20833
- "\uC6D4"
20834
- ]
21767
+ children: t.monthLabel(month)
20835
21768
  },
20836
21769
  month
20837
21770
  );
@@ -20928,6 +21861,8 @@ function SDatePicker({
20928
21861
  className,
20929
21862
  style
20930
21863
  }) {
21864
+ const runRules2 = useRunRules();
21865
+ const t = useLocale().messages.date;
20931
21866
  const portalContainer = usePortalContainer();
20932
21867
  const [open, setOpen] = useState(false);
20933
21868
  const triggerId = useFieldControlId();
@@ -20936,11 +21871,16 @@ function SDatePicker({
20936
21871
  const [ruleError, setRuleError] = useState("");
20937
21872
  const hasValue = value != null && value !== "";
20938
21873
  const weekday = showWeekday && mode === "date";
21874
+ const clearLabel = {
21875
+ date: t.clearDate,
21876
+ month: t.clearMonth,
21877
+ year: t.clearYear
21878
+ };
20939
21879
  const resolvedPlaceholder = placeholder ?? (mode === "year" ? "YYYY" : mode === "month" ? "YYYY-MM" : "YYYY-MM-DD");
20940
21880
  useFormField({
20941
21881
  name,
20942
21882
  validate: () => {
20943
- const msg = runRules(value, rules);
21883
+ const msg = runRules2(value, rules);
20944
21884
  setRuleError(msg);
20945
21885
  return msg === "";
20946
21886
  },
@@ -20974,7 +21914,7 @@ function SDatePicker({
20974
21914
  typo: "typo-field-sm-default",
20975
21915
  radius: "var(--cmp-datepicker-sm-radius)"
20976
21916
  };
20977
- const weekdayW = weekday ? weekdaySuffixWidth(baseDims.fontSize) : 0;
21917
+ const weekdayW = weekday ? weekdaySuffixWidth(baseDims.fontSize, t) : 0;
20978
21918
  const dims = {
20979
21919
  ...baseDims,
20980
21920
  minW: baseDims.minW + weekdayW,
@@ -20983,16 +21923,16 @@ function SDatePicker({
20983
21923
  };
20984
21924
  const select = (date) => {
20985
21925
  onValueChange?.(date);
20986
- if (rules && rules.length > 0) setRuleError(runRules(date, rules));
21926
+ if (rules && rules.length > 0) setRuleError(runRules2(date, rules));
20987
21927
  setOpen(false);
20988
21928
  };
20989
21929
  const clear = () => {
20990
21930
  onValueChange?.(null);
20991
- if (rules && rules.length > 0) setRuleError(runRules(null, rules));
21931
+ if (rules && rules.length > 0) setRuleError(runRules2(null, rules));
20992
21932
  };
20993
21933
  const selectListboxValue = (nextValue) => {
20994
21934
  onValueChange?.(nextValue);
20995
- if (rules && rules.length > 0) setRuleError(runRules(nextValue, rules));
21935
+ if (rules && rules.length > 0) setRuleError(runRules2(nextValue, rules));
20996
21936
  };
20997
21937
  return /* @__PURE__ */ jsx(
20998
21938
  SField,
@@ -21063,7 +22003,7 @@ function SDatePicker({
21063
22003
  minWidth: dims.minW,
21064
22004
  color: disabled ? "var(--cmp-datepicker-text-disabled)" : hasValue ? "var(--cmp-datepicker-text-default)" : "var(--cmp-field-hint-color)"
21065
22005
  },
21066
- children: hasValue ? weekday ? withWeekday(value) : value : resolvedPlaceholder
22006
+ children: hasValue ? weekday ? withWeekday(value, t) : value : resolvedPlaceholder
21067
22007
  }
21068
22008
  ),
21069
22009
  clearable && hasValue && !disabled && /* @__PURE__ */ jsx(
@@ -21071,7 +22011,7 @@ function SDatePicker({
21071
22011
  {
21072
22012
  icon: "close",
21073
22013
  size: "xxs",
21074
- ariaLabel: `${MODE_NOUN[mode]} \uC9C0\uC6B0\uAE30`,
22014
+ ariaLabel: clearLabel[mode],
21075
22015
  onClick: (event) => {
21076
22016
  event.stopPropagation();
21077
22017
  clear();
@@ -21140,6 +22080,7 @@ function RangeCalendar({
21140
22080
  onPendingStartChange,
21141
22081
  onViewChange
21142
22082
  }) {
22083
+ const t = useLocale().messages.date;
21143
22084
  const today = todayStr();
21144
22085
  const initial = splitDateTime(value?.[0]);
21145
22086
  const base = initial.date || today;
@@ -21210,8 +22151,8 @@ function RangeCalendar({
21210
22151
  const RANGE_BG = "var(--cmp-datepicker-calendar-range-bg)";
21211
22152
  const pad = (v) => String(Number(v) || 0).padStart(2, "0");
21212
22153
  const emit3 = (dateStart, dateEnd, time) => {
21213
- const t = time ?? { sH, sM, eH, eM };
21214
- const range = showTimePicker ? [`${dateStart} ${pad(t.sH)}:${pad(t.sM)}`, `${dateEnd} ${pad(t.eH)}:${pad(t.eM)}`] : [dateStart, dateEnd];
22154
+ const t2 = time ?? { sH, sM, eH, eM };
22155
+ const range = showTimePicker ? [`${dateStart} ${pad(t2.sH)}:${pad(t2.sM)}`, `${dateEnd} ${pad(t2.eH)}:${pad(t2.eM)}`] : [dateStart, dateEnd];
21215
22156
  lastEmitted.current = JSON.stringify(range);
21216
22157
  onSelect(range);
21217
22158
  };
@@ -21266,7 +22207,7 @@ function RangeCalendar({
21266
22207
  {
21267
22208
  icon: "chevronLeft",
21268
22209
  size: "xxs",
21269
- ariaLabel: "prevMonth",
22210
+ ariaLabel: t.prevMonth,
21270
22211
  onClick: goPrevMonth,
21271
22212
  className: cn(!isLeft && "invisible pointer-events-none")
21272
22213
  }
@@ -21281,13 +22222,13 @@ function RangeCalendar({
21281
22222
  {
21282
22223
  icon: "chevronRight",
21283
22224
  size: "xxs",
21284
- ariaLabel: "nextMonth",
22225
+ ariaLabel: t.nextMonth,
21285
22226
  onClick: goNextMonth,
21286
22227
  className: cn(isLeft && "invisible pointer-events-none")
21287
22228
  }
21288
22229
  )
21289
22230
  ] }),
21290
- /* @__PURE__ */ jsx("div", { className: GRID_COLS, children: WEEK_LABELS.map((l) => /* @__PURE__ */ jsx(
22231
+ /* @__PURE__ */ jsx("div", { className: GRID_COLS, children: t.weekdays.map((l) => /* @__PURE__ */ jsx(
21291
22232
  "span",
21292
22233
  {
21293
22234
  className: "flex h-[20px] items-center justify-center text-[12px] font-normal text-[color:var(--cmp-datepicker-calendar-week-color)]",
@@ -21352,11 +22293,11 @@ function RangeCalendar({
21352
22293
  children: [
21353
22294
  /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-time-date-gap)]", children: [
21354
22295
  /* @__PURE__ */ jsx("span", { className: LABEL, children: num(yy, false) }),
21355
- /* @__PURE__ */ jsx("span", { className: UNIT, children: "\uB144" }),
22296
+ /* @__PURE__ */ jsx("span", { className: UNIT, children: t.unitYear }),
21356
22297
  /* @__PURE__ */ jsx("span", { className: LABEL, children: num(mm, true) }),
21357
- /* @__PURE__ */ jsx("span", { className: UNIT, children: "\uC6D4" }),
22298
+ /* @__PURE__ */ jsx("span", { className: UNIT, children: t.unitMonth }),
21358
22299
  /* @__PURE__ */ jsx("span", { className: LABEL, children: num(dd, true) }),
21359
- /* @__PURE__ */ jsx("span", { className: UNIT, children: "\uC77C" })
22300
+ t.unitDay && /* @__PURE__ */ jsx("span", { className: UNIT, children: t.unitDay })
21360
22301
  ] }),
21361
22302
  /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-time-unit-gap)]", children: [
21362
22303
  /* @__PURE__ */ jsx(
@@ -21365,7 +22306,7 @@ function RangeCalendar({
21365
22306
  type: "text",
21366
22307
  inputMode: "numeric",
21367
22308
  maxLength: 2,
21368
- "aria-label": `${suffix} \uC2DC`,
22309
+ "aria-label": t.hourAria(suffix),
21369
22310
  disabled: !active,
21370
22311
  value: active ? hour : "",
21371
22312
  placeholder: "--",
@@ -21381,7 +22322,7 @@ function RangeCalendar({
21381
22322
  type: "text",
21382
22323
  inputMode: "numeric",
21383
22324
  maxLength: 2,
21384
- "aria-label": `${suffix} \uBD84`,
22325
+ "aria-label": t.minuteAria(suffix),
21385
22326
  disabled: !active,
21386
22327
  value: active ? minute : "",
21387
22328
  placeholder: "--",
@@ -21409,9 +22350,17 @@ function RangeCalendar({
21409
22350
  children: [
21410
22351
  /* @__PURE__ */ jsxs("div", { className: "relative flex items-center justify-center", children: [
21411
22352
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-[var(--cmp-datepicker-calendar-gap)] typo-field-md-medium", children: [
21412
- /* @__PURE__ */ jsx(SGhostButton, { icon: "chevronLeft", size: "xxs", ariaLabel: "prevYear", onClick: goPrevYear }),
22353
+ /* @__PURE__ */ jsx(SGhostButton, { icon: "chevronLeft", size: "xxs", ariaLabel: t.prevYear, onClick: goPrevYear }),
21413
22354
  /* @__PURE__ */ jsx("span", { className: "inline-flex min-w-[40px] items-center justify-center text-center", children: y }),
21414
- /* @__PURE__ */ jsx(SGhostButton, { icon: "chevronRight", size: "xxs", ariaLabel: "nextYear", onClick: goNextYear })
22355
+ /* @__PURE__ */ jsx(
22356
+ SGhostButton,
22357
+ {
22358
+ icon: "chevronRight",
22359
+ size: "xxs",
22360
+ ariaLabel: t.nextYear,
22361
+ onClick: goNextYear
22362
+ }
22363
+ )
21415
22364
  ] }),
21416
22365
  /* @__PURE__ */ jsx(
21417
22366
  "button",
@@ -21419,7 +22368,7 @@ function RangeCalendar({
21419
22368
  type: "button",
21420
22369
  onClick: goToday,
21421
22370
  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",
21422
- children: "\uC624\uB298"
22371
+ children: t.today
21423
22372
  }
21424
22373
  )
21425
22374
  ] }),
@@ -21440,8 +22389,8 @@ function RangeCalendar({
21440
22389
  showTimePicker && /* @__PURE__ */ jsxs(Fragment, { children: [
21441
22390
  /* @__PURE__ */ jsx(SDivider, {}),
21442
22391
  /* @__PURE__ */ jsxs("div", { className: "flex gap-[var(--cmp-datepicker-calendar-time-gap)]", children: [
21443
- renderTimeSection("start", start, "\uBD80\uD130"),
21444
- renderTimeSection("end", end, "\uAE4C\uC9C0")
22392
+ renderTimeSection("start", start, t.rangeFrom),
22393
+ renderTimeSection("end", end, t.rangeTo)
21445
22394
  ] })
21446
22395
  ] })
21447
22396
  ]
@@ -21481,6 +22430,8 @@ function SDateRangePicker({
21481
22430
  className,
21482
22431
  style
21483
22432
  }) {
22433
+ const runRules2 = useRunRules();
22434
+ const t = useLocale().messages.date;
21484
22435
  const portalContainer = usePortalContainer();
21485
22436
  const [open, setOpen] = useState(false);
21486
22437
  const triggerId = useFieldControlId();
@@ -21491,12 +22442,12 @@ function SDateRangePicker({
21491
22442
  const hasDisplay = pendingStart != null || hasValue;
21492
22443
  const rawStart = pendingStart ?? (hasValue ? value[0] : "");
21493
22444
  const rawEnd = pendingStart ? "" : hasValue ? value[1] : "";
21494
- const startText = showWeekday && rawStart ? withWeekday(rawStart) : rawStart;
21495
- const endText = showWeekday && rawEnd ? withWeekday(rawEnd) : rawEnd;
22445
+ const startText = showWeekday && rawStart ? withWeekday(rawStart, t) : rawStart;
22446
+ const endText = showWeekday && rawEnd ? withWeekday(rawEnd, t) : rawEnd;
21496
22447
  useFormField({
21497
22448
  name,
21498
22449
  validate: () => {
21499
- const msg = runRules(value, rules);
22450
+ const msg = runRules2(value, rules);
21500
22451
  setRuleError(msg);
21501
22452
  return msg === "";
21502
22453
  },
@@ -21529,7 +22480,7 @@ function SDateRangePicker({
21529
22480
  typo: "typo-field-sm-default",
21530
22481
  radius: "var(--cmp-datepicker-sm-radius)"
21531
22482
  };
21532
- const weekdayW = showWeekday ? weekdaySuffixWidth(baseDims.fontSize) * 2 : 0;
22483
+ const weekdayW = showWeekday ? weekdaySuffixWidth(baseDims.fontSize, t) * 2 : 0;
21533
22484
  const dims = {
21534
22485
  ...baseDims,
21535
22486
  minW: baseDims.minW + weekdayW,
@@ -21539,13 +22490,13 @@ function SDateRangePicker({
21539
22490
  const select = (r3) => {
21540
22491
  setPendingStart(null);
21541
22492
  onValueChange?.(r3);
21542
- if (rules && rules.length > 0) setRuleError(runRules(r3, rules));
22493
+ if (rules && rules.length > 0) setRuleError(runRules2(r3, rules));
21543
22494
  if (!showTimePicker) setOpen(false);
21544
22495
  };
21545
22496
  const clear = () => {
21546
22497
  setPendingStart(null);
21547
22498
  onValueChange?.(null);
21548
- if (rules && rules.length > 0) setRuleError(runRules(null, rules));
22499
+ if (rules && rules.length > 0) setRuleError(runRules2(null, rules));
21549
22500
  };
21550
22501
  const resolvedPlaceholder = showTimePicker && placeholder === "YYYY-MM-DD ~ YYYY-MM-DD" ? "YYYY-MM-DD HH:mm ~ YYYY-MM-DD HH:mm" : placeholder;
21551
22502
  return /* @__PURE__ */ jsx(
@@ -21640,7 +22591,7 @@ function SDateRangePicker({
21640
22591
  {
21641
22592
  icon: "close",
21642
22593
  size: "xxs",
21643
- ariaLabel: "\uAE30\uAC04 \uC9C0\uC6B0\uAE30",
22594
+ ariaLabel: t.clearPeriod,
21644
22595
  onClick: (event) => {
21645
22596
  event.stopPropagation();
21646
22597
  clear();
@@ -21708,6 +22659,7 @@ var SChipImpl = /* @__PURE__ */ forwardRef(function SChip({
21708
22659
  className,
21709
22660
  style
21710
22661
  }, ref) {
22662
+ const runRules2 = useRunRules();
21711
22663
  const [editing, setEditing] = useState(false);
21712
22664
  const [error, setError] = useState(errorProp);
21713
22665
  const inputRef = useRef(null);
@@ -21748,7 +22700,7 @@ var SChipImpl = /* @__PURE__ */ forwardRef(function SChip({
21748
22700
  const changed = next !== draftRef.current;
21749
22701
  setEditing(false);
21750
22702
  if (changed) onValueChange?.(next);
21751
- if (rules && rules.length > 0) setError(runRules(next, rules) !== "");
22703
+ if (rules && rules.length > 0) setError(runRules2(next, rules) !== "");
21752
22704
  onBlur?.();
21753
22705
  };
21754
22706
  const cancel = () => {
@@ -21879,6 +22831,7 @@ function SFilePicker({
21879
22831
  className,
21880
22832
  style
21881
22833
  }) {
22834
+ const runRules2 = useRunRules();
21882
22835
  const autoId = useId();
21883
22836
  const resolvedName = name ?? autoId;
21884
22837
  const triggerId = `${autoId}-trigger`;
@@ -21894,7 +22847,7 @@ function SFilePicker({
21894
22847
  useFormField({
21895
22848
  name,
21896
22849
  validate: () => {
21897
- const msg = runRules(files, rules);
22850
+ const msg = runRules2(files, rules);
21898
22851
  setRuleError(msg);
21899
22852
  return msg === "";
21900
22853
  },
@@ -21926,7 +22879,7 @@ function SFilePicker({
21926
22879
  }
21927
22880
  const merged = [...existing, ...accepted];
21928
22881
  onValueChange?.(merged);
21929
- if (rules?.length) setRuleError(runRules(merged, rules));
22882
+ if (rules?.length) setRuleError(runRules2(merged, rules));
21930
22883
  } else {
21931
22884
  const { accepted, rejected, reason } = validate(arr);
21932
22885
  if (reason) {
@@ -21934,7 +22887,7 @@ function SFilePicker({
21934
22887
  return;
21935
22888
  }
21936
22889
  onValueChange?.(accepted[0]);
21937
- if (rules?.length) setRuleError(runRules(accepted[0], rules));
22890
+ if (rules?.length) setRuleError(runRules2(accepted[0], rules));
21938
22891
  }
21939
22892
  };
21940
22893
  const clear = (e) => {
@@ -22094,6 +23047,7 @@ function SKeyValueTable({
22094
23047
  className,
22095
23048
  style
22096
23049
  }) {
23050
+ const tc = useLocale().messages.common;
22097
23051
  if (fields.length === 0) return null;
22098
23052
  const emit3 = (name, value) => onChange?.({
22099
23053
  name,
@@ -22271,7 +23225,7 @@ function SKeyValueTable({
22271
23225
  {
22272
23226
  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)]",
22273
23227
  style: { background: "var(--cmp-table-keyValue-search-bg)" },
22274
- children: /* @__PURE__ */ jsx(SButton, { color: "neutral", outline: true, size: "md", label: "\uAC80\uC0C9", onClick: () => onSearch?.() })
23228
+ children: /* @__PURE__ */ jsx(SButton, { color: "neutral", outline: true, size: "md", label: tc.search, onClick: () => onSearch?.() })
22275
23229
  }
22276
23230
  )
22277
23231
  ] });
@@ -22565,6 +23519,7 @@ function ChartRotatedCategoryLabels({
22565
23519
  );
22566
23520
  }
22567
23521
  var ChartFrame = /* @__PURE__ */ forwardRef(function ChartFrame2({ title, unit, legend, legendPosition = "top", children, className, style, ...props }, ref) {
23522
+ const t = useLocale().messages.chart;
22568
23523
  return /* @__PURE__ */ jsxs(
22569
23524
  "div",
22570
23525
  {
@@ -22580,10 +23535,7 @@ var ChartFrame = /* @__PURE__ */ forwardRef(function ChartFrame2({ title, unit,
22580
23535
  (title || unit) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-(--cmp-chart-gap)", children: [
22581
23536
  title && /* @__PURE__ */ jsx("span", { className: "typo-body-md-medium text-(--cmp-chart-title-color)", children: title }),
22582
23537
  unit && // ml-auto — title 유무와 관계없이 항상 오른쪽 끝에 붙는다.
22583
- /* @__PURE__ */ jsxs("span", { className: "ml-auto whitespace-nowrap typo-body-sm-default text-(--cmp-chart-unit-color)", children: [
22584
- "\uB2E8\uC704 : ",
22585
- unit
22586
- ] })
23538
+ /* @__PURE__ */ jsx("span", { className: "ml-auto whitespace-nowrap typo-body-sm-default text-(--cmp-chart-unit-color)", children: t.unit(unit) })
22587
23539
  ] }),
22588
23540
  legend && legendPosition === "top" && legend,
22589
23541
  children,
@@ -22927,6 +23879,7 @@ var SBarChart = /* @__PURE__ */ forwardRef(function SBarChart2({
22927
23879
  className,
22928
23880
  style
22929
23881
  }, ref) {
23882
+ const t = useLocale().messages.chart;
22930
23883
  const vertical = direction === "vertical";
22931
23884
  const rotateLabels = rotateCategoryLabels && vertical;
22932
23885
  const { ref: plotRef, size } = useElementSize();
@@ -23304,7 +24257,7 @@ var SBarChart = /* @__PURE__ */ forwardRef(function SBarChart2({
23304
24257
  width: size.width,
23305
24258
  height: size.height,
23306
24259
  role: "img",
23307
- "aria-label": `${categories.length}\uAC1C \uD56D\uBAA9, ${series.length}\uAC1C \uACC4\uC5F4 ${stacked ? "\uB204\uC801 " : ""}\uB9C9\uB300 \uADF8\uB798\uD504`,
24260
+ "aria-label": t.barSummary(categories.length, series.length, !!stacked),
23308
24261
  children: [
23309
24262
  /* @__PURE__ */ jsx(
23310
24263
  "text",
@@ -23554,6 +24507,7 @@ var SLineChart = /* @__PURE__ */ forwardRef(function SLineChart2({
23554
24507
  className,
23555
24508
  style
23556
24509
  }, ref) {
24510
+ const t = useLocale().messages.chart;
23557
24511
  const smooth = curve === "smooth";
23558
24512
  const { ref: plotRef, size } = useElementSize();
23559
24513
  const { ref: axisTextRef, size: axisText } = useElementSize(rotateCategoryLabels);
@@ -23880,7 +24834,7 @@ var SLineChart = /* @__PURE__ */ forwardRef(function SLineChart2({
23880
24834
  height: size.height,
23881
24835
  overflow: "visible",
23882
24836
  role: "img",
23883
- "aria-label": `${categories.length}\uAC1C \uD56D\uBAA9, ${series.length}\uAC1C \uACC4\uC5F4 ${stacked ? "\uB204\uC801 " : ""}\uAEBE\uC740\uC120 \uADF8\uB798\uD504`,
24837
+ "aria-label": t.lineSummary(categories.length, series.length, !!stacked),
23884
24838
  children: [
23885
24839
  /* @__PURE__ */ jsx(
23886
24840
  "text",
@@ -24064,6 +25018,7 @@ var RadialChart = /* @__PURE__ */ forwardRef(function RadialChart2({
24064
25018
  innerRatio,
24065
25019
  kind
24066
25020
  }, ref) {
25021
+ const t = useLocale().messages.chart;
24067
25022
  const { ref: plotRef, size } = useElementSize();
24068
25023
  const [hovered, setHovered] = useState(null);
24069
25024
  const arcs = useMemo(() => {
@@ -24142,7 +25097,7 @@ var RadialChart = /* @__PURE__ */ forwardRef(function RadialChart2({
24142
25097
  height: diameter,
24143
25098
  overflow: "visible",
24144
25099
  role: "img",
24145
- "aria-label": `${arcs.length}\uAC1C \uD56D\uBAA9 ${kind}`,
25100
+ "aria-label": t.radialSummary(arcs.length, t[kind]),
24146
25101
  onMouseLeave: () => setHovered(null),
24147
25102
  children: [
24148
25103
  arcs.length === 0 ? (
@@ -24256,7 +25211,7 @@ var SPieChart = /* @__PURE__ */ forwardRef(function SPieChart2({
24256
25211
  legendPosition,
24257
25212
  showTooltip,
24258
25213
  innerRatio: 0,
24259
- kind: "\uD30C\uC774 \uADF8\uB798\uD504"
25214
+ kind: "pie"
24260
25215
  }
24261
25216
  );
24262
25217
  });
@@ -24281,7 +25236,7 @@ var SDonutChart = /* @__PURE__ */ forwardRef(function SDonutChart2({
24281
25236
  legendVariant,
24282
25237
  showTooltip,
24283
25238
  innerRatio: DONUT_INNER_RATIO,
24284
- kind: "\uB3C4\uB11B \uADF8\uB798\uD504"
25239
+ kind: "donut"
24285
25240
  }
24286
25241
  );
24287
25242
  });
@@ -24741,7 +25696,9 @@ var SSkeleton = /* @__PURE__ */ forwardRef(function SSkeleton2({
24741
25696
  }
24742
25697
  );
24743
25698
  });
24744
- var STimelineImpl = /* @__PURE__ */ forwardRef(function STimeline({ groups, emptyText = "\uB0B4\uC5ED\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.", className, ...rest }, ref) {
25699
+ var STimelineImpl = /* @__PURE__ */ forwardRef(function STimeline({ groups, emptyText: emptyTextProp, className, ...rest }, ref) {
25700
+ const t = useLocale().messages.timeline;
25701
+ const emptyText = emptyTextProp === void 0 ? t.empty : emptyTextProp;
24745
25702
  const filled = groups.filter((group) => group.entries.length > 0);
24746
25703
  if (filled.length === 0) {
24747
25704
  return /* @__PURE__ */ jsx(
@@ -25626,14 +26583,14 @@ var SEDITOR_HEADING_LABELS = {
25626
26583
  var SEDITOR_FONT_SIZES = [8, 9, 10, 11, 12, 14, 16, 18, 24, 30, 36, 48, 60, 72];
25627
26584
  var SEDITOR_DEFAULT_FONT_SIZE = 12;
25628
26585
  var SEDITOR_DEFAULT_COLORS = [
25629
- { label: "\uAE30\uBCF8", color: "var(--color-fg-primary)" },
25630
- { label: "\uBCF4\uC870", color: "var(--color-fg-secondary)" },
25631
- { label: "\uD750\uB9BC", color: "var(--color-fg-tertiary)" },
25632
- { label: "\uAC15\uC870", color: "var(--color-fg-accent)" },
25633
- { label: "\uBE0C\uB79C\uB4DC", color: "var(--color-fg-brand)" },
25634
- { label: "\uC131\uACF5", color: "var(--color-fg-success)" },
25635
- { label: "\uC8FC\uC758", color: "var(--color-fg-warning)" },
25636
- { label: "\uC704\uD5D8", color: "var(--color-fg-danger)" }
26586
+ { key: "colorDefault", label: "\uAE30\uBCF8", color: "var(--color-fg-primary)" },
26587
+ { key: "colorSecondary", label: "\uBCF4\uC870", color: "var(--color-fg-secondary)" },
26588
+ { key: "colorMuted", label: "\uD750\uB9BC", color: "var(--color-fg-tertiary)" },
26589
+ { key: "colorAccent", label: "\uAC15\uC870", color: "var(--color-fg-accent)" },
26590
+ { key: "colorBrand", label: "\uBE0C\uB79C\uB4DC", color: "var(--color-fg-brand)" },
26591
+ { key: "colorSuccess", label: "\uC131\uACF5", color: "var(--color-fg-success)" },
26592
+ { key: "colorWarning", label: "\uC8FC\uC758", color: "var(--color-fg-warning)" },
26593
+ { key: "colorDanger", label: "\uC704\uD5D8", color: "var(--color-fg-danger)" }
25637
26594
  ];
25638
26595
  var TASK_LIST_CLASS = "sd-editor-task-list";
25639
26596
  var TASK_ITEM_CLASS = "sd-editor-task-item";
@@ -25774,7 +26731,6 @@ var scrollMenuClass = cn(
25774
26731
  FLOATING_SLIDE_ANIM,
25775
26732
  SCROLLBAR_CLASS
25776
26733
  );
25777
- var FONT_SIZE_DEFAULT_LABEL = "\uAE30\uBCF8";
25778
26734
  var FONT_SIZE_MENU_MAX_HEIGHT = "min(280px, var(--radix-dropdown-menu-content-available-height))";
25779
26735
  var swatchClass = cn(
25780
26736
  "flex h-[24px] w-[24px] cursor-pointer items-center justify-center rounded-[4px] outline-none",
@@ -25842,6 +26798,7 @@ var TableSizePicker = ({
25842
26798
  disabled,
25843
26799
  onPick
25844
26800
  }) => {
26801
+ const t = useLocale().messages.editor;
25845
26802
  const [size, setSize] = useState({ rows: 1, cols: 1 });
25846
26803
  const gridRef = useRef(null);
25847
26804
  useEffect(() => {
@@ -25860,7 +26817,7 @@ var TableSizePicker = ({
25860
26817
  {
25861
26818
  ref: gridRef,
25862
26819
  role: "grid",
25863
- "aria-label": "\uD45C \uD06C\uAE30",
26820
+ "aria-label": t.tableSize,
25864
26821
  "aria-disabled": disabled || void 0,
25865
26822
  tabIndex: disabled ? -1 : 0,
25866
26823
  className: cn("flex flex-col outline-none", disabled && "pointer-events-none opacity-40"),
@@ -25892,7 +26849,7 @@ var TableSizePicker = ({
25892
26849
  {
25893
26850
  type: "button",
25894
26851
  role: "gridcell",
25895
- "aria-label": `${r3 + 1}\uD589 ${c + 1}\uC5F4`,
26852
+ "aria-label": t.tableCell(r3 + 1, c + 1),
25896
26853
  "aria-selected": on,
25897
26854
  tabIndex: -1,
25898
26855
  className: "box-border cursor-pointer rounded-[3px] border border-solid p-0 outline-none",
@@ -25911,17 +26868,12 @@ var TableSizePicker = ({
25911
26868
  }) }, r3))
25912
26869
  }
25913
26870
  ),
25914
- /* @__PURE__ */ jsxs(
26871
+ /* @__PURE__ */ jsx(
25915
26872
  "div",
25916
26873
  {
25917
26874
  "aria-live": "polite",
25918
26875
  className: "mt-[6px] text-center text-[12px] leading-[20px] text-[color:var(--sys-color-fg-secondary)]",
25919
- children: [
25920
- size.rows,
25921
- "\uD589 \xD7 ",
25922
- size.cols,
25923
- "\uC5F4"
25924
- ]
26876
+ children: t.tableSizeText(size.rows, size.cols)
25925
26877
  }
25926
26878
  )
25927
26879
  ] });
@@ -25945,27 +26897,30 @@ var LinkEditor = ({
25945
26897
  onApply,
25946
26898
  onRemove,
25947
26899
  hasLink
25948
- }) => /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-[8px]", children: [
25949
- /* @__PURE__ */ jsx(
25950
- SInput,
25951
- {
25952
- value: href,
25953
- onValueChange: onHrefChange,
25954
- type: "url",
25955
- placeholder: "https://",
25956
- width: "md",
25957
- "aria-label": "\uB9C1\uD06C \uC8FC\uC18C",
25958
- onKeyDown: (e) => {
25959
- if (e.key === "Enter") {
25960
- e.preventDefault();
25961
- onApply();
26900
+ }) => {
26901
+ const t = useLocale().messages.editor;
26902
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-[8px]", children: [
26903
+ /* @__PURE__ */ jsx(
26904
+ SInput,
26905
+ {
26906
+ value: href,
26907
+ onValueChange: onHrefChange,
26908
+ type: "url",
26909
+ placeholder: "https://",
26910
+ width: "md",
26911
+ "aria-label": t.linkUrl,
26912
+ onKeyDown: (e) => {
26913
+ if (e.key === "Enter") {
26914
+ e.preventDefault();
26915
+ onApply();
26916
+ }
25962
26917
  }
25963
26918
  }
25964
- }
25965
- ),
25966
- /* @__PURE__ */ jsx(SButton, { size: "sm", label: "\uC801\uC6A9", onClick: onApply }),
25967
- hasLink && /* @__PURE__ */ jsx(SButton, { size: "sm", color: "neutral", outline: true, label: "\uC81C\uAC70", onClick: onRemove })
25968
- ] });
26919
+ ),
26920
+ /* @__PURE__ */ jsx(SButton, { size: "sm", label: t.apply, onClick: onApply }),
26921
+ hasLink && /* @__PURE__ */ jsx(SButton, { size: "sm", color: "neutral", outline: true, label: t.remove, onClick: onRemove })
26922
+ ] });
26923
+ };
25969
26924
  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]";
25970
26925
  var TOOLBAR_BAR_STYLE = { borderBottomColor: "var(--sys-color-border-default)" };
25971
26926
  var BUBBLE_BAR_CLASS = cn(
@@ -26032,6 +26987,11 @@ function EditorToolbarBar({
26032
26987
  disabled,
26033
26988
  variant = "bar"
26034
26989
  }) {
26990
+ const t = useLocale().messages.editor;
26991
+ const colorOptions = useMemo(
26992
+ () => SEDITOR_DEFAULT_COLORS.map((option) => ({ color: option.color, label: t[option.key] })),
26993
+ [t]
26994
+ );
26035
26995
  const portalContainer = usePortalContainer();
26036
26996
  const insideModal = useInsideModal();
26037
26997
  const isMobile = useIsMobile();
@@ -26102,7 +27062,7 @@ function EditorToolbarBar({
26102
27062
  /* @__PURE__ */ jsx(RDropdown5.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxs(
26103
27063
  ToolbarButton,
26104
27064
  {
26105
- label: "\uC81C\uBAA9 \uB2E8\uACC4",
27065
+ label: t.headingLevel,
26106
27066
  active: state2.heading !== 0,
26107
27067
  disabled: off,
26108
27068
  className: "px-[4px]",
@@ -26118,7 +27078,7 @@ function EditorToolbarBar({
26118
27078
  {
26119
27079
  className: menuItemClass,
26120
27080
  onSelect: () => chain()?.setParagraph().run(),
26121
- children: SEDITOR_HEADING_LABELS[0]
27081
+ children: t.headingBody
26122
27082
  }
26123
27083
  ),
26124
27084
  SEDITOR_HEADING_LEVELS.map((level) => /* @__PURE__ */ jsx(
@@ -26126,7 +27086,7 @@ function EditorToolbarBar({
26126
27086
  {
26127
27087
  className: menuItemClass,
26128
27088
  onSelect: () => chain()?.setHeading({ level }).run(),
26129
- children: /* @__PURE__ */ jsx("span", { className: HEADING_ITEM_CLASS[level], children: SEDITOR_HEADING_LABELS[level] })
27089
+ children: /* @__PURE__ */ jsx("span", { className: HEADING_ITEM_CLASS[level], children: t.heading(level) })
26130
27090
  },
26131
27091
  level
26132
27092
  ))
@@ -26134,8 +27094,8 @@ function EditorToolbarBar({
26134
27094
  ] }, item4);
26135
27095
  case "fontSize":
26136
27096
  return /* @__PURE__ */ jsxs(RDropdown5.Root, { modal: !insideModal, children: [
26137
- /* @__PURE__ */ jsx(RDropdown5.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxs(ToolbarButton, { label: "\uAE00\uC790 \uD06C\uAE30", disabled: off, className: "px-[6px]", children: [
26138
- /* @__PURE__ */ jsx("span", { className: "text-[12px] leading-[20px]", children: activeFontSize ?? FONT_SIZE_DEFAULT_LABEL }),
27097
+ /* @__PURE__ */ jsx(RDropdown5.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxs(ToolbarButton, { label: t.fontSize, disabled: off, className: "px-[6px]", children: [
27098
+ /* @__PURE__ */ jsx("span", { className: "text-[12px] leading-[20px]", children: activeFontSize ?? t.fontSizeDefaultLabel }),
26139
27099
  /* @__PURE__ */ jsx(SIcon, { name: "caretDown", size: 12 })
26140
27100
  ] }) }),
26141
27101
  /* @__PURE__ */ jsx(RDropdown5.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(
@@ -26150,9 +27110,9 @@ function EditorToolbarBar({
26150
27110
  RDropdown5.Item,
26151
27111
  {
26152
27112
  className: cn(menuItemClass, activeFontSize === null && menuItemSelectedClass),
26153
- title: `${FONT_SIZE_DEFAULT_LABEL} (\uBCF8\uBB38 ${SEDITOR_DEFAULT_FONT_SIZE}px)`,
27113
+ title: t.fontSizeDefault(SEDITOR_DEFAULT_FONT_SIZE),
26154
27114
  onSelect: () => chain()?.unsetFontSize().run(),
26155
- children: FONT_SIZE_DEFAULT_LABEL
27115
+ children: t.fontSizeDefaultLabel
26156
27116
  }
26157
27117
  ),
26158
27118
  SEDITOR_FONT_SIZES.map((size) => /* @__PURE__ */ jsx(
@@ -26175,7 +27135,7 @@ function EditorToolbarBar({
26175
27135
  return /* @__PURE__ */ jsx(
26176
27136
  ToolbarButton,
26177
27137
  {
26178
- label: "\uAD75\uAC8C",
27138
+ label: t.bold,
26179
27139
  active: state2.bold,
26180
27140
  "aria-pressed": state2.bold,
26181
27141
  disabled: off,
@@ -26188,7 +27148,7 @@ function EditorToolbarBar({
26188
27148
  return /* @__PURE__ */ jsx(
26189
27149
  ToolbarButton,
26190
27150
  {
26191
- label: "\uAE30\uC6B8\uC784",
27151
+ label: t.italic,
26192
27152
  active: state2.italic,
26193
27153
  "aria-pressed": state2.italic,
26194
27154
  disabled: off,
@@ -26201,7 +27161,7 @@ function EditorToolbarBar({
26201
27161
  return /* @__PURE__ */ jsx(
26202
27162
  ToolbarButton,
26203
27163
  {
26204
- label: "\uBC11\uC904",
27164
+ label: t.underline,
26205
27165
  active: state2.underline,
26206
27166
  "aria-pressed": state2.underline,
26207
27167
  disabled: off,
@@ -26214,7 +27174,7 @@ function EditorToolbarBar({
26214
27174
  return /* @__PURE__ */ jsx(
26215
27175
  ToolbarButton,
26216
27176
  {
26217
- label: "\uCDE8\uC18C\uC120",
27177
+ label: t.strike,
26218
27178
  active: state2.strike,
26219
27179
  "aria-pressed": state2.strike,
26220
27180
  disabled: off,
@@ -26227,7 +27187,7 @@ function EditorToolbarBar({
26227
27187
  return /* @__PURE__ */ jsx(
26228
27188
  ToolbarButton,
26229
27189
  {
26230
- label: "\uC778\uB77C\uC778 \uCF54\uB4DC",
27190
+ label: t.inlineCode,
26231
27191
  active: state2.code,
26232
27192
  "aria-pressed": state2.code,
26233
27193
  disabled: off,
@@ -26241,7 +27201,7 @@ function EditorToolbarBar({
26241
27201
  return /* @__PURE__ */ jsx(
26242
27202
  ToolbarButton,
26243
27203
  {
26244
- label: "\uAE00\uC790\uC0C9",
27204
+ label: t.textColor,
26245
27205
  disabled: off,
26246
27206
  onClick: () => setMobileView("color"),
26247
27207
  children: /* @__PURE__ */ jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsx(IconTextColor, { size: ICON_SIZE }) })
@@ -26249,14 +27209,14 @@ function EditorToolbarBar({
26249
27209
  item4
26250
27210
  );
26251
27211
  return /* @__PURE__ */ jsxs(RDropdown5.Root, { modal: !insideModal, children: [
26252
- /* @__PURE__ */ jsx(RDropdown5.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsx(ToolbarButton, { label: "\uAE00\uC790\uC0C9", disabled: off, children: /* @__PURE__ */ jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsx(IconTextColor, { size: ICON_SIZE }) }) }) }),
27212
+ /* @__PURE__ */ jsx(RDropdown5.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsx(ToolbarButton, { label: t.textColor, disabled: off, children: /* @__PURE__ */ jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsx(IconTextColor, { size: ICON_SIZE }) }) }) }),
26253
27213
  /* @__PURE__ */ jsx(RDropdown5.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(RDropdown5.Content, { sideOffset: 4, align: "start", className: menuClass, children: /* @__PURE__ */ jsx(
26254
27214
  ColorPalette,
26255
27215
  {
26256
27216
  asMenu: true,
26257
- colors: SEDITOR_DEFAULT_COLORS,
27217
+ colors: colorOptions,
26258
27218
  columns: 4,
26259
- clearLabel: "\uC0C9 \uC9C0\uC6B0\uAE30",
27219
+ clearLabel: t.clearColor,
26260
27220
  onPick: applyColor,
26261
27221
  onClear: clearColor
26262
27222
  }
@@ -26266,7 +27226,7 @@ function EditorToolbarBar({
26266
27226
  return /* @__PURE__ */ jsx(
26267
27227
  ToolbarButton,
26268
27228
  {
26269
- label: "\uC67C\uCABD \uC815\uB82C",
27229
+ label: t.alignLeft,
26270
27230
  active: state2.alignLeft,
26271
27231
  "aria-pressed": state2.alignLeft,
26272
27232
  disabled: off,
@@ -26279,7 +27239,7 @@ function EditorToolbarBar({
26279
27239
  return /* @__PURE__ */ jsx(
26280
27240
  ToolbarButton,
26281
27241
  {
26282
- label: "\uAC00\uC6B4\uB370 \uC815\uB82C",
27242
+ label: t.alignCenter,
26283
27243
  active: state2.alignCenter,
26284
27244
  "aria-pressed": state2.alignCenter,
26285
27245
  disabled: off,
@@ -26292,7 +27252,7 @@ function EditorToolbarBar({
26292
27252
  return /* @__PURE__ */ jsx(
26293
27253
  ToolbarButton,
26294
27254
  {
26295
- label: "\uC624\uB978\uCABD \uC815\uB82C",
27255
+ label: t.alignRight,
26296
27256
  active: state2.alignRight,
26297
27257
  "aria-pressed": state2.alignRight,
26298
27258
  disabled: off,
@@ -26305,7 +27265,7 @@ function EditorToolbarBar({
26305
27265
  return /* @__PURE__ */ jsx(
26306
27266
  ToolbarButton,
26307
27267
  {
26308
- label: "\uC591\uCABD \uC815\uB82C",
27268
+ label: t.alignJustify,
26309
27269
  active: state2.alignJustify,
26310
27270
  "aria-pressed": state2.alignJustify,
26311
27271
  disabled: off,
@@ -26318,7 +27278,7 @@ function EditorToolbarBar({
26318
27278
  return /* @__PURE__ */ jsx(
26319
27279
  ToolbarButton,
26320
27280
  {
26321
- label: "\uAE00\uBA38\uB9AC \uAE30\uD638 \uBAA9\uB85D",
27281
+ label: t.bulletList,
26322
27282
  active: state2.bulletList,
26323
27283
  "aria-pressed": state2.bulletList,
26324
27284
  disabled: off,
@@ -26331,7 +27291,7 @@ function EditorToolbarBar({
26331
27291
  return /* @__PURE__ */ jsx(
26332
27292
  ToolbarButton,
26333
27293
  {
26334
- label: "\uBC88\uD638 \uB9E4\uAE30\uAE30 \uBAA9\uB85D",
27294
+ label: t.orderedList,
26335
27295
  active: state2.orderedList,
26336
27296
  "aria-pressed": state2.orderedList,
26337
27297
  disabled: off,
@@ -26344,7 +27304,7 @@ function EditorToolbarBar({
26344
27304
  return /* @__PURE__ */ jsx(
26345
27305
  ToolbarButton,
26346
27306
  {
26347
- label: "\uCCB4\uD06C \uBAA9\uB85D",
27307
+ label: t.taskList,
26348
27308
  active: state2.taskList,
26349
27309
  "aria-pressed": state2.taskList,
26350
27310
  disabled: off,
@@ -26357,7 +27317,7 @@ function EditorToolbarBar({
26357
27317
  const ListIcon = state2.orderedList ? IconOrderedList : state2.taskList ? IconTaskList : IconBulletList;
26358
27318
  const listActive = state2.bulletList || state2.orderedList || state2.taskList;
26359
27319
  return /* @__PURE__ */ jsxs(RDropdown5.Root, { modal: !insideModal, children: [
26360
- /* @__PURE__ */ jsx(RDropdown5.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxs(ToolbarButton, { label: "\uBAA9\uB85D", active: listActive, disabled: off, className: "px-[4px]", children: [
27320
+ /* @__PURE__ */ jsx(RDropdown5.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxs(ToolbarButton, { label: t.list, active: listActive, disabled: off, className: "px-[4px]", children: [
26361
27321
  /* @__PURE__ */ jsx(ListIcon, { size: ICON_SIZE }),
26362
27322
  /* @__PURE__ */ jsx(SIcon, { name: "caretDown", size: CARET_SIZE })
26363
27323
  ] }) }),
@@ -26369,7 +27329,7 @@ function EditorToolbarBar({
26369
27329
  onSelect: () => chain()?.toggleBulletList().run(),
26370
27330
  children: [
26371
27331
  /* @__PURE__ */ jsx(IconBulletList, { size: 16, className: "mr-[6px]" }),
26372
- "\uAE00\uBA38\uB9AC \uAE30\uD638 \uBAA9\uB85D"
27332
+ t.bulletList
26373
27333
  ]
26374
27334
  }
26375
27335
  ),
@@ -26380,7 +27340,7 @@ function EditorToolbarBar({
26380
27340
  onSelect: () => chain()?.toggleOrderedList().run(),
26381
27341
  children: [
26382
27342
  /* @__PURE__ */ jsx(IconOrderedList, { size: 16, className: "mr-[6px]" }),
26383
- "\uBC88\uD638 \uB9E4\uAE30\uAE30 \uBAA9\uB85D"
27343
+ t.orderedList
26384
27344
  ]
26385
27345
  }
26386
27346
  ),
@@ -26391,7 +27351,7 @@ function EditorToolbarBar({
26391
27351
  onSelect: () => chain()?.toggleTaskList().run(),
26392
27352
  children: [
26393
27353
  /* @__PURE__ */ jsx(IconTaskList, { size: 16, className: "mr-[6px]" }),
26394
- "\uCCB4\uD06C \uBAA9\uB85D"
27354
+ t.taskList
26395
27355
  ]
26396
27356
  }
26397
27357
  )
@@ -26402,7 +27362,7 @@ function EditorToolbarBar({
26402
27362
  return /* @__PURE__ */ jsx(
26403
27363
  ToolbarButton,
26404
27364
  {
26405
- label: "\uC778\uC6A9\uAD6C",
27365
+ label: t.blockquote,
26406
27366
  active: state2.blockquote,
26407
27367
  "aria-pressed": state2.blockquote,
26408
27368
  disabled: off,
@@ -26415,7 +27375,7 @@ function EditorToolbarBar({
26415
27375
  return /* @__PURE__ */ jsx(
26416
27376
  ToolbarButton,
26417
27377
  {
26418
- label: "\uCF54\uB4DC \uBE14\uB85D",
27378
+ label: t.codeBlock,
26419
27379
  active: state2.codeBlock,
26420
27380
  "aria-pressed": state2.codeBlock,
26421
27381
  disabled: off,
@@ -26428,7 +27388,7 @@ function EditorToolbarBar({
26428
27388
  return /* @__PURE__ */ jsx(
26429
27389
  ToolbarButton,
26430
27390
  {
26431
- label: "\uAD6C\uBD84\uC120",
27391
+ label: t.divider,
26432
27392
  disabled: off,
26433
27393
  onClick: () => chain()?.setHorizontalRule().run(),
26434
27394
  children: /* @__PURE__ */ jsx(IconHorizontalRule, { size: ICON_SIZE })
@@ -26440,7 +27400,7 @@ function EditorToolbarBar({
26440
27400
  return /* @__PURE__ */ jsx(
26441
27401
  ToolbarButton,
26442
27402
  {
26443
- label: "\uB9C1\uD06C",
27403
+ label: t.link,
26444
27404
  active: state2.link,
26445
27405
  disabled: off,
26446
27406
  onClick: () => setMobileView("link"),
@@ -26449,7 +27409,7 @@ function EditorToolbarBar({
26449
27409
  item4
26450
27410
  );
26451
27411
  return /* @__PURE__ */ jsxs(RPopover13.Root, { open: linkOpen, onOpenChange: setLinkOpen, children: [
26452
- /* @__PURE__ */ jsx(RPopover13.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsx(ToolbarButton, { label: "\uB9C1\uD06C", active: state2.link, disabled: off, children: /* @__PURE__ */ jsx(IconLink, { size: ICON_SIZE }) }) }),
27412
+ /* @__PURE__ */ jsx(RPopover13.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsx(ToolbarButton, { label: t.link, active: state2.link, disabled: off, children: /* @__PURE__ */ jsx(IconLink, { size: ICON_SIZE }) }) }),
26453
27413
  /* @__PURE__ */ jsx(RPopover13.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
26454
27414
  RPopover13.Content,
26455
27415
  {
@@ -26476,13 +27436,13 @@ function EditorToolbarBar({
26476
27436
  return /* @__PURE__ */ jsxs(
26477
27437
  ToolbarButton,
26478
27438
  {
26479
- label: "\uC774\uBBF8\uC9C0 \uB123\uAE30",
27439
+ label: t.insertImage,
26480
27440
  disabled: off || uploading,
26481
27441
  className: "px-[6px]",
26482
27442
  onClick: () => fileInputRef.current?.click(),
26483
27443
  children: [
26484
27444
  /* @__PURE__ */ jsx(SIcon, { name: "image", size: ICON_SIZE }),
26485
- /* @__PURE__ */ jsx("span", { className: "text-[12px] leading-[20px]", children: "\uC774\uBBF8\uC9C0" })
27445
+ /* @__PURE__ */ jsx("span", { className: "text-[12px] leading-[20px]", children: t.image })
26486
27446
  ]
26487
27447
  },
26488
27448
  item4
@@ -26495,10 +27455,19 @@ function EditorToolbarBar({
26495
27455
  onOpenChange: setTableOpen,
26496
27456
  modal: !insideModal,
26497
27457
  children: [
26498
- /* @__PURE__ */ jsx(RDropdown5.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxs(ToolbarButton, { label: "\uD45C", active: state2.inTable, disabled: off, className: "px-[6px]", children: [
26499
- /* @__PURE__ */ jsx(IconTable, { size: ICON_SIZE }),
26500
- /* @__PURE__ */ jsx(SIcon, { name: "caretDown", size: CARET_SIZE })
26501
- ] }) }),
27458
+ /* @__PURE__ */ jsx(RDropdown5.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxs(
27459
+ ToolbarButton,
27460
+ {
27461
+ label: t.table,
27462
+ active: state2.inTable,
27463
+ disabled: off,
27464
+ className: "px-[6px]",
27465
+ children: [
27466
+ /* @__PURE__ */ jsx(IconTable, { size: ICON_SIZE }),
27467
+ /* @__PURE__ */ jsx(SIcon, { name: "caretDown", size: CARET_SIZE })
27468
+ ]
27469
+ }
27470
+ ) }),
26502
27471
  /* @__PURE__ */ jsx(RDropdown5.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(RDropdown5.Content, { sideOffset: 4, align: "start", className: menuClass, children: [
26503
27472
  !state2.inTable && /* @__PURE__ */ jsxs(Fragment, { children: [
26504
27473
  /* @__PURE__ */ jsx(
@@ -26516,7 +27485,7 @@ function EditorToolbarBar({
26516
27485
  /* @__PURE__ */ jsx(
26517
27486
  TableMenuItem,
26518
27487
  {
26519
- label: "\uC704\uC5D0 \uD589 \uCD94\uAC00",
27488
+ label: t.addRowAbove,
26520
27489
  disabled: !state2.inTable,
26521
27490
  onSelect: () => chain()?.addRowBefore().run()
26522
27491
  }
@@ -26524,7 +27493,7 @@ function EditorToolbarBar({
26524
27493
  /* @__PURE__ */ jsx(
26525
27494
  TableMenuItem,
26526
27495
  {
26527
- label: "\uC544\uB798\uC5D0 \uD589 \uCD94\uAC00",
27496
+ label: t.addRowBelow,
26528
27497
  disabled: !state2.inTable,
26529
27498
  onSelect: () => chain()?.addRowAfter().run()
26530
27499
  }
@@ -26532,7 +27501,7 @@ function EditorToolbarBar({
26532
27501
  /* @__PURE__ */ jsx(
26533
27502
  TableMenuItem,
26534
27503
  {
26535
- label: "\uC67C\uCABD\uC5D0 \uC5F4 \uCD94\uAC00",
27504
+ label: t.addColLeft,
26536
27505
  disabled: !state2.inTable,
26537
27506
  onSelect: () => chain()?.addColumnBefore().run()
26538
27507
  }
@@ -26540,7 +27509,7 @@ function EditorToolbarBar({
26540
27509
  /* @__PURE__ */ jsx(
26541
27510
  TableMenuItem,
26542
27511
  {
26543
- label: "\uC624\uB978\uCABD\uC5D0 \uC5F4 \uCD94\uAC00",
27512
+ label: t.addColRight,
26544
27513
  disabled: !state2.inTable,
26545
27514
  onSelect: () => chain()?.addColumnAfter().run()
26546
27515
  }
@@ -26549,7 +27518,7 @@ function EditorToolbarBar({
26549
27518
  /* @__PURE__ */ jsx(
26550
27519
  TableMenuItem,
26551
27520
  {
26552
- label: "\uC140 \uBCD1\uD569",
27521
+ label: t.mergeCells,
26553
27522
  disabled: !state2.canMergeCells,
26554
27523
  onSelect: () => chain()?.mergeCells().run()
26555
27524
  }
@@ -26557,7 +27526,7 @@ function EditorToolbarBar({
26557
27526
  /* @__PURE__ */ jsx(
26558
27527
  TableMenuItem,
26559
27528
  {
26560
- label: "\uBCD1\uD569 \uD574\uC81C",
27529
+ label: t.splitCell,
26561
27530
  disabled: !state2.canSplitCell,
26562
27531
  onSelect: () => chain()?.splitCell().run()
26563
27532
  }
@@ -26565,7 +27534,7 @@ function EditorToolbarBar({
26565
27534
  /* @__PURE__ */ jsx(
26566
27535
  TableMenuItem,
26567
27536
  {
26568
- label: "\uD5E4\uB354 \uD589 \uD1A0\uAE00",
27537
+ label: t.toggleHeaderRow,
26569
27538
  disabled: !state2.inTable,
26570
27539
  onSelect: () => chain()?.toggleHeaderRow().run()
26571
27540
  }
@@ -26573,7 +27542,7 @@ function EditorToolbarBar({
26573
27542
  /* @__PURE__ */ jsx(
26574
27543
  TableMenuItem,
26575
27544
  {
26576
- label: "\uD5E4\uB354 \uC5F4 \uD1A0\uAE00",
27545
+ label: t.toggleHeaderCol,
26577
27546
  disabled: !state2.inTable,
26578
27547
  onSelect: () => chain()?.toggleHeaderColumn().run()
26579
27548
  }
@@ -26582,7 +27551,7 @@ function EditorToolbarBar({
26582
27551
  /* @__PURE__ */ jsx(
26583
27552
  TableMenuItem,
26584
27553
  {
26585
- label: "\uD589 \uC0AD\uC81C",
27554
+ label: t.deleteRow,
26586
27555
  disabled: !state2.inTable,
26587
27556
  onSelect: () => chain()?.deleteRow().run()
26588
27557
  }
@@ -26590,7 +27559,7 @@ function EditorToolbarBar({
26590
27559
  /* @__PURE__ */ jsx(
26591
27560
  TableMenuItem,
26592
27561
  {
26593
- label: "\uC5F4 \uC0AD\uC81C",
27562
+ label: t.deleteCol,
26594
27563
  disabled: !state2.inTable,
26595
27564
  onSelect: () => chain()?.deleteColumn().run()
26596
27565
  }
@@ -26598,7 +27567,7 @@ function EditorToolbarBar({
26598
27567
  /* @__PURE__ */ jsx(
26599
27568
  TableMenuItem,
26600
27569
  {
26601
- label: "\uD45C \uC0AD\uC81C",
27570
+ label: t.deleteTable,
26602
27571
  disabled: !state2.inTable,
26603
27572
  onSelect: () => chain()?.deleteTable().run()
26604
27573
  }
@@ -26612,7 +27581,7 @@ function EditorToolbarBar({
26612
27581
  return /* @__PURE__ */ jsx(
26613
27582
  ToolbarButton,
26614
27583
  {
26615
- label: "\uC2E4\uD589 \uCDE8\uC18C",
27584
+ label: t.undo,
26616
27585
  disabled: off || !state2.canUndo,
26617
27586
  onClick: () => chain()?.undo().run(),
26618
27587
  children: /* @__PURE__ */ jsx(IconUndo, { size: ICON_SIZE })
@@ -26623,7 +27592,7 @@ function EditorToolbarBar({
26623
27592
  return /* @__PURE__ */ jsx(
26624
27593
  ToolbarButton,
26625
27594
  {
26626
- label: "\uB2E4\uC2DC \uC2E4\uD589",
27595
+ label: t.redo,
26627
27596
  disabled: off || !state2.canRedo,
26628
27597
  onClick: () => chain()?.redo().run(),
26629
27598
  children: /* @__PURE__ */ jsx(IconRedo, { size: ICON_SIZE })
@@ -26636,21 +27605,21 @@ function EditorToolbarBar({
26636
27605
  };
26637
27606
  const shell = {
26638
27607
  "role": "toolbar",
26639
- "aria-label": "\uC11C\uC2DD \uB3C4\uAD6C",
27608
+ "aria-label": t.toolbarLabel,
26640
27609
  "aria-disabled": disabled || void 0,
26641
27610
  "className": variant === "bubble" ? BUBBLE_BAR_CLASS : TOOLBAR_BAR_CLASS,
26642
27611
  "style": variant === "bubble" ? void 0 : TOOLBAR_BAR_STYLE
26643
27612
  };
26644
27613
  if (mobileView !== "main") {
26645
27614
  const editing = {
26646
- color: { icon: /* @__PURE__ */ jsx(IconTextColor, { size: ICON_SIZE }), label: "\uAE00\uC790\uC0C9" },
26647
- link: { icon: /* @__PURE__ */ jsx(IconLink, { size: ICON_SIZE }), label: "\uB9C1\uD06C" }
27615
+ color: { icon: /* @__PURE__ */ jsx(IconTextColor, { size: ICON_SIZE }), label: t.textColor },
27616
+ link: { icon: /* @__PURE__ */ jsx(IconLink, { size: ICON_SIZE }), label: t.link }
26648
27617
  }[mobileView];
26649
27618
  return /* @__PURE__ */ jsxs("div", { ...shell, children: [
26650
27619
  /* @__PURE__ */ jsx("div", { role: "group", className: "flex items-center gap-[2px]", children: /* @__PURE__ */ jsxs(
26651
27620
  ToolbarButton,
26652
27621
  {
26653
- label: `${editing.label} \uB2EB\uAE30`,
27622
+ label: t.closeEditing(editing.label),
26654
27623
  className: "px-[4px]",
26655
27624
  onClick: () => setMobileView("main"),
26656
27625
  children: [
@@ -26672,9 +27641,9 @@ function EditorToolbarBar({
26672
27641
  ) : /* @__PURE__ */ jsx(
26673
27642
  ColorPalette,
26674
27643
  {
26675
- colors: SEDITOR_DEFAULT_COLORS,
27644
+ colors: colorOptions,
26676
27645
  columns: 4,
26677
- clearLabel: "\uC0C9 \uC9C0\uC6B0\uAE30",
27646
+ clearLabel: t.clearColor,
26678
27647
  onPick: applyColor,
26679
27648
  onClear: clearColor
26680
27649
  }
@@ -26971,7 +27940,7 @@ var SEditor = /* @__PURE__ */ forwardRef(function SEditor2({
26971
27940
  value,
26972
27941
  defaultValue,
26973
27942
  onValueChange,
26974
- placeholder = "\uB0B4\uC6A9\uC744 \uC785\uB825\uD574 \uC8FC\uC138\uC694.",
27943
+ placeholder: placeholderProp,
26975
27944
  minHeight = 200,
26976
27945
  maxHeight,
26977
27946
  simple = false,
@@ -27004,6 +27973,9 @@ var SEditor = /* @__PURE__ */ forwardRef(function SEditor2({
27004
27973
  className,
27005
27974
  style
27006
27975
  }, ref) {
27976
+ const runRules2 = useRunRules();
27977
+ const t = useLocale().messages.editor;
27978
+ const placeholder = placeholderProp ?? t.placeholder;
27007
27979
  const [ruleError, setRuleError] = useState("");
27008
27980
  const [selfFocused, setSelfFocused] = useState(false);
27009
27981
  const controlId = useFieldControlId();
@@ -27014,7 +27986,7 @@ var SEditor = /* @__PURE__ */ forwardRef(function SEditor2({
27014
27986
  const editable = !disabled && !readOnly;
27015
27987
  const handleInput = (html) => {
27016
27988
  onValueChange?.(html);
27017
- if (ruleError !== "") setRuleError(runRules(html, rules));
27989
+ if (ruleError !== "") setRuleError(runRules2(html, rules));
27018
27990
  };
27019
27991
  const handleFocusChange = (next) => {
27020
27992
  setSelfFocused(next);
@@ -27023,7 +27995,7 @@ var SEditor = /* @__PURE__ */ forwardRef(function SEditor2({
27023
27995
  return;
27024
27996
  }
27025
27997
  onBlur?.();
27026
- if (rules && rules.length > 0) setRuleError(runRules(htmlRef.current, rules));
27998
+ if (rules && rules.length > 0) setRuleError(runRules2(htmlRef.current, rules));
27027
27999
  };
27028
28000
  const handleReady = () => {
27029
28001
  if (!pendingFocusRef.current) return;
@@ -27033,7 +28005,7 @@ var SEditor = /* @__PURE__ */ forwardRef(function SEditor2({
27033
28005
  useFormField({
27034
28006
  name,
27035
28007
  validate: () => {
27036
- const msg = runRules(htmlRef.current, rules);
28008
+ const msg = runRules2(htmlRef.current, rules);
27037
28009
  setRuleError(msg);
27038
28010
  return msg === "";
27039
28011
  },
@@ -27207,6 +28179,8 @@ var SSlider = /* @__PURE__ */ forwardRef(function SSlider2({
27207
28179
  className,
27208
28180
  style
27209
28181
  }, ref) {
28182
+ const runRules2 = useRunRules();
28183
+ const t = useLocale().messages.slider;
27210
28184
  const isRange = Array.isArray(value);
27211
28185
  const values = isRange ? value : [value ?? min];
27212
28186
  const toOut = (v) => isRange ? [v[0], v[1]] : v[0];
@@ -27214,7 +28188,7 @@ var SSlider = /* @__PURE__ */ forwardRef(function SSlider2({
27214
28188
  useFormField({
27215
28189
  name,
27216
28190
  validate: () => {
27217
- const msg = runRules(value, rules);
28191
+ const msg = runRules2(value, rules);
27218
28192
  setRuleError(msg);
27219
28193
  return msg === "";
27220
28194
  },
@@ -27310,13 +28284,13 @@ var SSlider = /* @__PURE__ */ forwardRef(function SSlider2({
27310
28284
  if (!interactive) return;
27311
28285
  const next = toOut(v);
27312
28286
  onValueChange?.(next);
27313
- if (ruleError !== "") setRuleError(runRules(next, rules));
28287
+ if (ruleError !== "") setRuleError(runRules2(next, rules));
27314
28288
  },
27315
28289
  onValueCommit: (v) => {
27316
28290
  if (!interactive) return;
27317
28291
  const next = toOut(v);
27318
28292
  onValueCommit?.(next);
27319
- if (rules && rules.length > 0) setRuleError(runRules(next, rules));
28293
+ if (rules && rules.length > 0) setRuleError(runRules2(next, rules));
27320
28294
  },
27321
28295
  onPointerDown: () => interactive && setDragging(true),
27322
28296
  onPointerUp: () => setDragging(false),
@@ -27365,7 +28339,7 @@ var SSlider = /* @__PURE__ */ forwardRef(function SSlider2({
27365
28339
  RSlider.Thumb,
27366
28340
  {
27367
28341
  id: i === 0 ? thumbId : void 0,
27368
- "aria-label": isRange ? `${label ?? ""} ${i === 0 ? "\uCD5C\uC19F\uAC12" : "\uCD5C\uB313\uAC12"}`.trim() : label,
28342
+ "aria-label": isRange ? `${label ?? ""} ${i === 0 ? t.minValue : t.maxValue}`.trim() : label,
27369
28343
  "aria-valuetext": formatValue(v),
27370
28344
  "aria-readonly": readOnly || void 0,
27371
28345
  onFocus: () => setFocusIndex(i),
@@ -27491,28 +28465,41 @@ var CHIPFILTER = {
27491
28465
  itemTextSelected: "var(--cmp-chipFilter-item-text-selected)"
27492
28466
  };
27493
28467
  var DEFAULT_CUSTOM_MAX_RANGE = 90;
27494
- var DEFAULT_PERIOD_PRESETS = [
27495
- { value: "day", label: "\uC77C\uBCC4" },
27496
- { value: "month", label: "\uC6D4\uBCC4" },
27497
- { value: "quarter", label: "\uBD84\uAE30\uBCC4" },
27498
- { value: "half", label: "\uBC18\uAE30\uBCC4" },
27499
- { value: "year", label: "\uC5F0\uB3C4\uBCC4" },
27500
- { value: "custom", label: "\uC0AC\uC6A9\uC790 \uC9C0\uC815", custom: true }
27501
- ];
27502
- var DEFAULT_DATE_RANGE_PRESETS = [
27503
- { value: "today", label: "\uC624\uB298", resolve: () => todayIso() },
27504
- {
27505
- value: "last7",
27506
- label: "\uC9C0\uB09C 7\uC77C",
27507
- resolve: () => [rangeStartIso(todayIso(), 7), todayIso()]
27508
- },
27509
- {
27510
- value: "last30",
27511
- label: "\uC9C0\uB09C 30\uC77C",
27512
- resolve: () => [rangeStartIso(todayIso(), 30), todayIso()]
27513
- },
27514
- { value: "custom", label: "\uC0AC\uC6A9\uC790 \uC9C0\uC815", custom: true }
27515
- ];
28468
+ var defaultPresetCache = /* @__PURE__ */ new WeakMap();
28469
+ var STRUCTURE_MESSAGES = resolveMessages(DEFAULT_LOCALE);
28470
+ var getDefaultPresets = (m) => {
28471
+ const cached = defaultPresetCache.get(m.chipFilter);
28472
+ if (cached) return cached;
28473
+ const t = m.chipFilter;
28474
+ const created = {
28475
+ period: [
28476
+ { value: "day", label: t.periodDay },
28477
+ { value: "month", label: t.periodMonth },
28478
+ { value: "quarter", label: t.periodQuarter },
28479
+ { value: "half", label: t.periodHalf },
28480
+ { value: "year", label: t.periodYear },
28481
+ { value: "custom", label: t.custom, custom: true }
28482
+ ],
28483
+ /** presets 를 지정하지 않은 datepicker-range 필드가 쓰는 기본 프리셋 목록.
28484
+ * 프리셋 라디오 자체를 없애고 캘린더 하나만 두려면 presets: [] 를 명시한다 */
28485
+ range: [
28486
+ { value: "today", label: t.today, resolve: () => todayIso() },
28487
+ {
28488
+ value: "last7",
28489
+ label: t.last7,
28490
+ resolve: () => [rangeStartIso(todayIso(), 7), todayIso()]
28491
+ },
28492
+ {
28493
+ value: "last30",
28494
+ label: t.last30,
28495
+ resolve: () => [rangeStartIso(todayIso(), 30), todayIso()]
28496
+ },
28497
+ { value: "custom", label: t.custom, custom: true }
28498
+ ]
28499
+ };
28500
+ defaultPresetCache.set(m.chipFilter, created);
28501
+ return created;
28502
+ };
27516
28503
  var isKeywordValue = (value) => typeof value === "object" && value != null && !Array.isArray(value) && "keywords" in value;
27517
28504
  var isPeriodValue = (value) => typeof value === "object" && value != null && !Array.isArray(value) && "unit" in value;
27518
28505
  var keywordEntries = (value) => {
@@ -27604,18 +28591,20 @@ var addDaysIso = (iso, n) => {
27604
28591
  };
27605
28592
  var rangeStartIso = (today, days) => addDaysIso(today, -(days - 1));
27606
28593
  var isInlineDateField = (field) => field.type === "datepicker-range" && field.radioButton === true && (field.presets?.length ?? 0) > 0;
27607
- var getFieldPresets = (field) => {
27608
- if (field.type === "datepicker-statistics") return field.presets ?? DEFAULT_PERIOD_PRESETS;
27609
- return field.presets ?? DEFAULT_DATE_RANGE_PRESETS;
28594
+ var getFieldPresets = (field, m) => {
28595
+ if (field.type === "datepicker-statistics") return field.presets ?? getDefaultPresets(m).period;
28596
+ return field.presets ?? getDefaultPresets(m).range;
27610
28597
  };
27611
- var getEffectiveMaxRange = (field) => {
28598
+ var getEffectiveMaxRange = (field, m) => {
27612
28599
  if (field.maxRange !== void 0) return field.maxRange;
27613
- const hasCustomPreset = getFieldPresets(field).some((preset) => preset.custom);
28600
+ const hasCustomPreset = getFieldPresets(field, m).some((preset) => preset.custom);
27614
28601
  return hasCustomPreset ? DEFAULT_CUSTOM_MAX_RANGE : void 0;
27615
28602
  };
27616
- var getPresetLabel = (preset, maxRange) => {
27617
- if (!preset.custom || !maxRange || preset.label.includes("\uCD5C\uB300")) return preset.label;
27618
- return `${preset.label} (\uCD5C\uB300 ${maxRange}\uC77C\uC529)`;
28603
+ var getPresetLabel = (preset, maxRange, m) => {
28604
+ const t = m.chipFilter;
28605
+ if (!preset.custom || !maxRange || preset.label.toLowerCase().includes(t.maxWord.toLowerCase()))
28606
+ return preset.label;
28607
+ return `${preset.label} (${t.maxRangeHint(maxRange)})`;
27619
28608
  };
27620
28609
  var getDefaultPeriodInputValue = (unit, maxRange) => {
27621
28610
  const today = todayIso();
@@ -27652,7 +28641,7 @@ var resolveFieldDefault = (field) => {
27652
28641
  if (field.type === "datepicker-day") return todayIso();
27653
28642
  if (field.type === "select" || field.type === "select-depth") return leafOptions(field)[0]?.value;
27654
28643
  if (field.type === "datepicker-statistics") {
27655
- const presets = getFieldPresets(field).filter((preset) => !preset.custom);
28644
+ const presets = getFieldPresets(field, STRUCTURE_MESSAGES).filter((preset) => !preset.custom);
27656
28645
  const unit = presets.some((preset) => preset.value === "day") ? "day" : presets[0]?.value;
27657
28646
  return unit ? createPeriodValue(unit) : void 0;
27658
28647
  }
@@ -27700,20 +28689,16 @@ var isGroupSatisfied = (group, values) => {
27700
28689
  if (group.rule.type === "requireAny") return keys.some((k) => !isEmptyValue(values[k]));
27701
28690
  return true;
27702
28691
  };
27703
- var koreanParticle = (word, consonant, vowel) => {
27704
- const code = word.charCodeAt(word.length - 1);
27705
- if (code < 44032 || code > 55203) return consonant;
27706
- return (code - 44032) % 28 === 0 ? vowel : consonant;
27707
- };
27708
- var defaultGroupTooltipMessage = (rule, fields) => {
27709
- if (rule.type === "requireAll") return "\uD56D\uBAA9\uC744 \uBAA8\uB450 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.";
28692
+ var defaultGroupTooltipMessage = (rule, fields, m) => {
28693
+ const t = m.chipFilter;
28694
+ if (rule.type === "requireAll") return t.requireAll;
27710
28695
  if (rule.type === "requireAny") {
27711
28696
  const name = rule.dataGroupName;
27712
- if (!name) return "\uCD5C\uC18C 1\uAC1C\uC758 \uD544\uD130\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694.";
27713
- return `\uCD5C\uC18C 1\uAC1C\uC758 ${name}${koreanParticle(name, "\uC744", "\uB97C")} \uC120\uD0DD\uD574\uC8FC\uC138\uC694.`;
28697
+ if (!name) return t.requireAnyDefault;
28698
+ return t.requireAnyNamed(name);
27714
28699
  }
27715
- const label = fields.find((f) => f.key === rule.key)?.label ?? "\uD56D\uBAA9";
27716
- return `${label}${koreanParticle(label, "\uC744", "\uB97C")} \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.`;
28700
+ const label = fields.find((f) => f.key === rule.key)?.label ?? t.fieldFallback;
28701
+ return t.requireField(label);
27717
28702
  };
27718
28703
  var toDateRange = (value) => Array.isArray(value) ? [value[0], value[1]] : [value, value];
27719
28704
  var sameDateValue = (a, b) => {
@@ -27732,20 +28717,24 @@ var matchPresetId = (presets, value) => {
27732
28717
  return presets.find((preset) => preset.custom)?.value ?? null;
27733
28718
  };
27734
28719
  var optionLabel = (field, value) => leafOptions(field).find((option) => option.value === value)?.label ?? String(value);
27735
- var formatValueList = (labels) => {
28720
+ var formatValueList = (labels, m) => {
27736
28721
  if (labels.length <= 1) return labels[0] ?? "";
27737
- return `${labels[0]} \uC678 ${labels.length - 1}\uAC1C`;
28722
+ return m.chipFilter.valueListMore(labels[0], labels.length - 1);
27738
28723
  };
27739
- var displayValue = (field, value) => {
28724
+ var displayValue = (field, value, m) => {
28725
+ const t = m.chipFilter;
27740
28726
  if (isEmptyValue(value)) return "";
27741
28727
  if (isMultiSelectType(field.type)) {
27742
28728
  const optionsField = field;
27743
28729
  const values = toArrayValue(value);
27744
28730
  const selectableValues = selectableLeafValues(optionsField);
27745
28731
  if (selectableValues.length > 1 && selectableValues.every((selectableValue) => values.includes(selectableValue))) {
27746
- return "\uC804\uCCB4";
28732
+ return m.common.all;
27747
28733
  }
27748
- return formatValueList(values.map((v) => optionLabel(optionsField, v)));
28734
+ return formatValueList(
28735
+ values.map((v) => optionLabel(optionsField, v)),
28736
+ m
28737
+ );
27749
28738
  }
27750
28739
  if (field.type === "select" || field.type === "select-depth") {
27751
28740
  return optionLabel(field, value);
@@ -27756,23 +28745,24 @@ var displayValue = (field, value) => {
27756
28745
  }
27757
28746
  if (field.type === "datepicker-statistics") {
27758
28747
  if (!isPeriodValue(value)) {
27759
- const preset2 = getFieldPresets(field).find((p) => p.value === value);
28748
+ const preset2 = getFieldPresets(field, m).find((p) => p.value === value);
27760
28749
  return preset2?.label ?? String(value);
27761
28750
  }
27762
- const preset = getFieldPresets(field).find((p) => p.value === value.unit);
28751
+ const preset = getFieldPresets(field, m).find((p) => p.value === value.unit);
27763
28752
  const label = preset?.label ?? value.unit;
27764
- if (value.unit === "quarter") return `${label}(${value.value ?? 1}\uBD84\uAE30)`;
27765
- if (value.unit === "half") return `${label}(${value.value === "second" ? "\uD558\uBC18\uAE30" : "\uC0C1\uBC18\uAE30"})`;
28753
+ if (value.unit === "quarter") return `${label}(${t.quarter(Number(value.value ?? 1))})`;
28754
+ if (value.unit === "half")
28755
+ return `${label}(${value.value === "second" ? t.secondHalf : t.firstHalf})`;
27766
28756
  if (Array.isArray(value.value)) return `${value.value[0]} ~ ${value.value[1]}`;
27767
28757
  return value.value != null && value.value !== "" ? String(value.value) : label;
27768
28758
  }
27769
- if (field.type === "keyword") return formatValueList(keywordEntries(value));
28759
+ if (field.type === "keyword") return formatValueList(keywordEntries(value), m);
27770
28760
  return String(value);
27771
28761
  };
27772
- var chipDisplayValue = (field, value) => {
27773
- const text = displayValue(field, value);
28762
+ var chipDisplayValue = (field, value, m) => {
28763
+ const text = displayValue(field, value, m);
27774
28764
  if (field.type !== "datepicker-range" || isEmptyValue(value)) return text;
27775
- const presets = getFieldPresets(field);
28765
+ const presets = getFieldPresets(field, m);
27776
28766
  if (presets.length === 0) return text;
27777
28767
  const preset = presets.find((p) => p.value === matchPresetId(presets, value));
27778
28768
  return preset && !preset.custom ? `${preset.label}(${text})` : text;
@@ -27791,6 +28781,8 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
27791
28781
  className,
27792
28782
  style
27793
28783
  }, ref) {
28784
+ const messages = useLocale().messages;
28785
+ const t = messages.chipFilter;
27794
28786
  const fields = useMemo(() => groups.flatMap((group) => group.fields), [groups]);
27795
28787
  const values = normalizeValues(value);
27796
28788
  const portalContainer = usePortalContainer();
@@ -27937,7 +28929,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
27937
28929
  if (currentOpenField?.type === "keyword") {
27938
28930
  return { width: CHIPFILTER_LISTBOX_WIDTH };
27939
28931
  }
27940
- if ((currentOpenField?.type === "datepicker-range" || currentOpenField?.type === "datepicker-statistics") && getFieldPresets(currentOpenField).length > 0) {
28932
+ if ((currentOpenField?.type === "datepicker-range" || currentOpenField?.type === "datepicker-statistics") && getFieldPresets(currentOpenField, STRUCTURE_MESSAGES).length > 0) {
27941
28933
  return { width: CHIPFILTER_DATE_PRESET_LISTBOX_WIDTH };
27942
28934
  }
27943
28935
  return { width: CHIPFILTER_LISTBOX_WIDTH };
@@ -28044,7 +29036,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
28044
29036
  const flushRun = () => {
28045
29037
  if (runBuffer.length === 0) return;
28046
29038
  const group = runGroupIndex != null ? groups[runGroupIndex] : void 0;
28047
- const message = group?.rule ? group.tooltipMessage ?? defaultGroupTooltipMessage(group.rule, group.fields) : void 0;
29039
+ const message = group?.rule ? group.tooltipMessage ?? defaultGroupTooltipMessage(group.rule, group.fields, messages) : void 0;
28048
29040
  if (message) {
28049
29041
  nodes.push(
28050
29042
  /* @__PURE__ */ jsx(
@@ -28109,7 +29101,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
28109
29101
  {
28110
29102
  icon: "close",
28111
29103
  size: "xxs",
28112
- ariaLabel: `${field.label} \uD544\uD130 \uC81C\uAC70`,
29104
+ ariaLabel: t.removeFilter(field.label),
28113
29105
  className: "shrink-0",
28114
29106
  onClick: handleClear
28115
29107
  }
@@ -28118,7 +29110,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
28118
29110
  FilterChip,
28119
29111
  {
28120
29112
  field,
28121
- valueText: chipDisplayValue(field, values[field.key]),
29113
+ valueText: chipDisplayValue(field, values[field.key], messages),
28122
29114
  active: openKey === field.key,
28123
29115
  applied: !isEmptyValue(values[field.key]),
28124
29116
  disabled: disabled || field.disabled,
@@ -28170,7 +29162,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
28170
29162
  color: disabled || inactiveFields.length === 0 ? CHIPFILTER.addTextDisabled : CHIPFILTER.addText
28171
29163
  }
28172
29164
  ),
28173
- /* @__PURE__ */ jsx("span", { children: "\uD544\uD130 \uCD94\uAC00" })
29165
+ /* @__PURE__ */ jsx("span", { children: t.addFilter })
28174
29166
  ]
28175
29167
  }
28176
29168
  ) }),
@@ -28186,7 +29178,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
28186
29178
  event.preventDefault();
28187
29179
  },
28188
29180
  className: cn("z-50 min-w-[180px]", FLOATING_SLIDE_ANIM),
28189
- children: /* @__PURE__ */ jsx(ListBox, { children: inactiveFields.length > 0 ? inactiveFields.map((field) => /* @__PURE__ */ jsx(MenuItem, { onClick: () => addField(field.key), children: field.label }, field.key)) : /* @__PURE__ */ jsx(EmptyItem, { children: "\uCD94\uAC00\uD560 \uD544\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4." }) })
29181
+ children: /* @__PURE__ */ jsx(ListBox, { children: inactiveFields.length > 0 ? inactiveFields.map((field) => /* @__PURE__ */ jsx(MenuItem, { onClick: () => addField(field.key), children: field.label }, field.key)) : /* @__PURE__ */ jsx(EmptyItem, { children: t.noAddableFilter }) })
28190
29182
  }
28191
29183
  ) })
28192
29184
  ] }),
@@ -28196,7 +29188,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
28196
29188
  size: "sm",
28197
29189
  icon: "reset",
28198
29190
  iconColor: "grey_80",
28199
- label: "\uAC80\uC0C9 \uCD08\uAE30\uD654",
29191
+ label: t.resetSearch,
28200
29192
  labelClassName: "text-grey-80",
28201
29193
  disabled: disabled || !canReset,
28202
29194
  onClick: reset,
@@ -28295,6 +29287,7 @@ function FilterChip({
28295
29287
  onOpen,
28296
29288
  onClear
28297
29289
  }) {
29290
+ const t = useLocale().messages.chipFilter;
28298
29291
  const border = disabled ? CHIPFILTER.chipDisabledBorder : warning ? CHIPFILTER.chipWarningBorder : applied ? active ? "var(--color-blue-strong)" : CHIPFILTER.chipAppliedBorder : active ? CHIPFILTER.chipActiveBorder : CHIPFILTER.chipDefaultBorder;
28299
29292
  const background = disabled ? CHIPFILTER.chipDisabledBg : applied ? CHIPFILTER.chipAppliedBg : CHIPFILTER.chipDefaultBg;
28300
29293
  const textColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipDefaultText;
@@ -28386,7 +29379,7 @@ function FilterChip({
28386
29379
  {
28387
29380
  icon: "close",
28388
29381
  size: "xxs",
28389
- ariaLabel: `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
29382
+ ariaLabel: t.clearFilter(field.label),
28390
29383
  className: "shrink-0 self-center",
28391
29384
  onClick: onClear
28392
29385
  }
@@ -28404,6 +29397,8 @@ function EditorPanel({
28404
29397
  onDraftChange,
28405
29398
  onClose
28406
29399
  }) {
29400
+ const messages = useLocale().messages;
29401
+ const t = messages.chipFilter;
28407
29402
  const wrapsInPaddedTop = field.type === "datepicker-day" || field.type === "datepicker-range" || field.type === "datepicker-statistics";
28408
29403
  const isScrollableListField = isSelectType(field.type) || field.type === "keyword";
28409
29404
  const isMulti = isMultiSelectType(field.type);
@@ -28448,7 +29443,7 @@ function EditorPanel({
28448
29443
  STextLink,
28449
29444
  {
28450
29445
  size: "sm",
28451
- label: allSelected ? "\uC120\uD0DD \uD574\uC81C" : "\uC804\uCCB4 \uC120\uD0DD",
29446
+ label: allSelected ? t.selectNone : t.selectAll,
28452
29447
  labelClassName: "font-bold",
28453
29448
  disabled,
28454
29449
  onClick: toggleSelectAll,
@@ -28471,7 +29466,7 @@ function EditorPanel({
28471
29466
  STextLink,
28472
29467
  {
28473
29468
  size: "sm",
28474
- label: "\uAC80\uC0C9",
29469
+ label: messages.common.search,
28475
29470
  labelClassName: "font-bold",
28476
29471
  onClick: onClose,
28477
29472
  style: { color: CHIPFILTER.chipAppliedValue }
@@ -28557,8 +29552,9 @@ function DatePresetEditor({
28557
29552
  disabled,
28558
29553
  onValueChange
28559
29554
  }) {
28560
- const presets = getFieldPresets(field);
28561
- const maxRange = getEffectiveMaxRange(field);
29555
+ const messages = useLocale().messages;
29556
+ const presets = getFieldPresets(field, messages);
29557
+ const maxRange = getEffectiveMaxRange(field, messages);
28562
29558
  const [selectedId, setSelectedId] = useState(() => matchPresetId(presets, value));
28563
29559
  const syncedInitialValueRef = useRef(!isEmptyValue(value));
28564
29560
  useEffect(() => {
@@ -28596,7 +29592,7 @@ function DatePresetEditor({
28596
29592
  {
28597
29593
  val: preset.value,
28598
29594
  value: selectedId,
28599
- label: getPresetLabel(preset, maxRange),
29595
+ label: getPresetLabel(preset, maxRange, messages),
28600
29596
  disabled,
28601
29597
  onValueChange: () => selectPreset(preset)
28602
29598
  },
@@ -28620,8 +29616,10 @@ function PeriodPresetEditor({
28620
29616
  disabled,
28621
29617
  onValueChange
28622
29618
  }) {
28623
- const presets = getFieldPresets(field);
28624
- const maxRange = getEffectiveMaxRange(field);
29619
+ const messages = useLocale().messages;
29620
+ const t = messages.chipFilter;
29621
+ const presets = getFieldPresets(field, messages);
29622
+ const maxRange = getEffectiveMaxRange(field, messages);
28625
29623
  const firstUnit = presets.find((preset) => !preset.custom)?.value ?? "day";
28626
29624
  const [selectedId, setSelectedId] = useState(() => matchPresetId(presets, value) ?? firstUnit);
28627
29625
  const periodValue = isPeriodValue(value) ? value : createPeriodValue(selectedId ?? firstUnit, maxRange);
@@ -28674,10 +29672,10 @@ function PeriodPresetEditor({
28674
29672
  onValueChange: updateInputValue,
28675
29673
  disabled,
28676
29674
  options: [
28677
- { value: 1, label: "1\uBD84\uAE30" },
28678
- { value: 2, label: "2\uBD84\uAE30" },
28679
- { value: 3, label: "3\uBD84\uAE30" },
28680
- { value: 4, label: "4\uBD84\uAE30" }
29675
+ { value: 1, label: t.quarter(1) },
29676
+ { value: 2, label: t.quarter(2) },
29677
+ { value: 3, label: t.quarter(3) },
29678
+ { value: 4, label: t.quarter(4) }
28681
29679
  ]
28682
29680
  }
28683
29681
  );
@@ -28690,8 +29688,8 @@ function PeriodPresetEditor({
28690
29688
  onValueChange: updateInputValue,
28691
29689
  disabled,
28692
29690
  options: [
28693
- { value: "first", label: "\uC0C1\uBC18\uAE30" },
28694
- { value: "second", label: "\uD558\uBC18\uAE30" }
29691
+ { value: "first", label: t.firstHalf },
29692
+ { value: "second", label: t.secondHalf }
28695
29693
  ]
28696
29694
  }
28697
29695
  );
@@ -28728,7 +29726,7 @@ function PeriodPresetEditor({
28728
29726
  {
28729
29727
  val: preset.value,
28730
29728
  value: selectedId,
28731
- label: getPresetLabel(preset, maxRange),
29729
+ label: getPresetLabel(preset, maxRange, messages),
28732
29730
  disabled,
28733
29731
  onValueChange: () => selectPreset(preset)
28734
29732
  },
@@ -28746,6 +29744,8 @@ function InlineDatePresetFilter({
28746
29744
  onValueChange,
28747
29745
  onClear
28748
29746
  }) {
29747
+ const messages = useLocale().messages;
29748
+ const t = messages.chipFilter;
28749
29749
  const presets = (field.presets ?? []).filter((preset) => !preset.custom);
28750
29750
  const [selectedId, setSelectedId] = useState(() => matchPresetId(presets, value));
28751
29751
  const syncedInitialValueRef = useRef(!isEmptyValue(value));
@@ -28778,7 +29778,7 @@ function InlineDatePresetFilter({
28778
29778
  field.label,
28779
29779
  ":"
28780
29780
  ] }),
28781
- /* @__PURE__ */ jsx("span", { className: "typo-body-sm-bold", style: { color: badgeValueColor }, children: displayValue(field, value) })
29781
+ /* @__PURE__ */ jsx("span", { className: "typo-body-sm-bold", style: { color: badgeValueColor }, children: displayValue(field, value, messages) })
28782
29782
  ] });
28783
29783
  return /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-[8px]", children: [
28784
29784
  /* @__PURE__ */ jsx(
@@ -28848,7 +29848,7 @@ function InlineDatePresetFilter({
28848
29848
  {
28849
29849
  icon: "close",
28850
29850
  size: "xxs",
28851
- ariaLabel: `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
29851
+ ariaLabel: t.clearFilter(field.label),
28852
29852
  className: "shrink-0 self-center",
28853
29853
  onClick: onClear
28854
29854
  }
@@ -28858,14 +29858,14 @@ function InlineDatePresetFilter({
28858
29858
  )
28859
29859
  ] });
28860
29860
  }
28861
- var MATCH_MODE_OPTIONS = [
28862
- { value: "contains", label: "\uD3EC\uD568" },
28863
- { value: "exact", label: "\uC77C\uCE58" }
29861
+ var matchModeOptions = (t) => [
29862
+ { value: "contains", label: t.keywordContains },
29863
+ { value: "exact", label: t.keywordExact }
28864
29864
  ];
28865
- var EXCLUDE_MATCH_MODE_OPTION = {
29865
+ var excludeMatchModeOption = (t) => ({
28866
29866
  value: "excludes",
28867
- label: "\uBBF8\uD3EC\uD568"
28868
- };
29867
+ label: t.keywordExcludes
29868
+ });
28869
29869
  function KeywordEditor({
28870
29870
  field,
28871
29871
  value,
@@ -28874,6 +29874,7 @@ function KeywordEditor({
28874
29874
  onValueCommit,
28875
29875
  onDraftChange
28876
29876
  }) {
29877
+ const t = useLocale().messages.chipFilter;
28877
29878
  const entries4 = keywordEntries(value);
28878
29879
  const [draftText, setDraftText] = useState("");
28879
29880
  const [mode, setMode] = useState(
@@ -28946,7 +29947,7 @@ function KeywordEditor({
28946
29947
  {
28947
29948
  className: "shrink-0 whitespace-nowrap typo-body-sm-medium",
28948
29949
  style: { color: CHIPFILTER.listboxLabel },
28949
- children: "\uAC80\uC0C9 \uC870\uAC74 :"
29950
+ children: t.keywordCondition
28950
29951
  }
28951
29952
  ),
28952
29953
  /* @__PURE__ */ jsx(
@@ -28954,7 +29955,7 @@ function KeywordEditor({
28954
29955
  {
28955
29956
  size: "xs",
28956
29957
  style: { width: 150 },
28957
- options: field.excludeMode ? [...MATCH_MODE_OPTIONS, EXCLUDE_MATCH_MODE_OPTION] : MATCH_MODE_OPTIONS,
29958
+ options: field.excludeMode ? [...matchModeOptions(t), excludeMatchModeOption(t)] : matchModeOptions(t),
28958
29959
  value: mode,
28959
29960
  disabled,
28960
29961
  onValueChange: (next) => changeMode(next)
@@ -28969,7 +29970,7 @@ function KeywordEditor({
28969
29970
  ref: inputRef,
28970
29971
  value: draftText,
28971
29972
  disabled,
28972
- placeholder: field.placeholder ?? (field.input === "csv" ? "\uB2E4\uC911 \uD0A4\uC6CC\uB4DC\uB294 \uCF64\uB9C8(,)\uB85C \uAD6C\uBD84" : "\uC785\uB825 \uD6C4 Enter\uB85C \uCD94\uAC00"),
29973
+ placeholder: field.placeholder ?? (field.input === "csv" ? t.keywordHintCsv : t.keywordHintEnter),
28973
29974
  onChange: (event) => changeDraft(event.target.value),
28974
29975
  onPaste,
28975
29976
  onKeyDown,
@@ -29001,6 +30002,7 @@ function KeywordEntryRow({
29001
30002
  disabled,
29002
30003
  onRemove
29003
30004
  }) {
30005
+ const t = useLocale().messages.chipFilter;
29004
30006
  return /* @__PURE__ */ jsxs(
29005
30007
  "div",
29006
30008
  {
@@ -29019,7 +30021,7 @@ function KeywordEntryRow({
29019
30021
  {
29020
30022
  icon: "close",
29021
30023
  size: "xxs",
29022
- ariaLabel: `${label} \uC0AD\uC81C`,
30024
+ ariaLabel: t.removeItem(label),
29023
30025
  className: "invisible shrink-0 group-hover:visible",
29024
30026
  onClick: onRemove
29025
30027
  }
@@ -29038,6 +30040,7 @@ function OptionList({
29038
30040
  disabled,
29039
30041
  onValueChange
29040
30042
  }) {
30043
+ const messages = useLocale().messages;
29041
30044
  const selected = multiple ? toArrayValue(value) : [];
29042
30045
  const singleValue = !multiple && (typeof value === "string" || typeof value === "number") ? value : null;
29043
30046
  const [search, setSearch] = useState("");
@@ -29069,7 +30072,7 @@ function OptionList({
29069
30072
  allSelected ? selected.filter((v) => !leafValues.includes(v)) : [...selected, ...leafValues.filter((v) => !selected.includes(v))]
29070
30073
  );
29071
30074
  };
29072
- if (flat.length === 0) return /* @__PURE__ */ jsx(EmptyItem, { children: "\uD45C\uC2DC\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4." });
30075
+ if (flat.length === 0) return /* @__PURE__ */ jsx(EmptyItem, { children: messages.select.empty });
29073
30076
  return /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [
29074
30077
  showSearch && /* @__PURE__ */ jsx(
29075
30078
  "div",
@@ -29084,7 +30087,7 @@ function OptionList({
29084
30087
  value: search,
29085
30088
  onValueChange: setSearch,
29086
30089
  disabled,
29087
- placeholder: "\uAC80\uC0C9",
30090
+ placeholder: messages.common.search,
29088
30091
  clearable: true,
29089
30092
  width: "100%"
29090
30093
  }
@@ -29102,7 +30105,7 @@ function OptionList({
29102
30105
  "pb-[var(--cmp-chipFilter-listbox-list-paddingY)]"
29103
30106
  ),
29104
30107
  children: [
29105
- showSearch && filteredOptions.length === 0 && /* @__PURE__ */ jsx(EmptyItem, { children: "\uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4." }),
30108
+ showSearch && filteredOptions.length === 0 && /* @__PURE__ */ jsx(EmptyItem, { children: messages.chipFilter.noSearchResults }),
29106
30109
  filteredOptions.map((option, index) => {
29107
30110
  const rowKey = `${option.value}-${index}`;
29108
30111
  if (option.isGroup) {
@@ -29388,7 +30391,9 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
29388
30391
  className,
29389
30392
  style
29390
30393
  }, ref) {
29391
- const placeholder = placeholderProp ?? (separators?.includes(",") ? "\uD0DC\uADF8 \uC785\uB825 (Enter\xB7\uCF64\uB9C8\uB85C \uB4F1\uB85D)" : "\uD0DC\uADF8 \uC785\uB825 (Enter\uB85C \uB4F1\uB85D)");
30394
+ const runRules2 = useRunRules();
30395
+ const { input: ti, chipInput: t, select: selectT } = useLocale().messages;
30396
+ const placeholder = placeholderProp ?? (separators?.includes(",") ? t.placeholderWithComma : t.placeholder);
29392
30397
  const autoId = useId();
29393
30398
  const controlId = `${autoId}-input`;
29394
30399
  const resolvedName = name ?? autoId;
@@ -29418,19 +30423,18 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
29418
30423
  const duplicateMessage = useMemo(() => {
29419
30424
  const seen = /* @__PURE__ */ new Set();
29420
30425
  for (const v of values) {
29421
- if (seen.has(v))
29422
- return duplicateLabel ? `\uC774\uBBF8 \uC785\uB825\uB41C ${duplicateLabel}\uC785\uB2C8\uB2E4.` : "\uC911\uBCF5\uB41C \uAC12\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4.";
30426
+ if (seen.has(v)) return duplicateLabel ? t.duplicateNamed(duplicateLabel) : t.duplicate;
29423
30427
  seen.add(v);
29424
30428
  }
29425
30429
  return "";
29426
- }, [values, duplicateLabel]);
29427
- const ruleMessage = useMemo(() => runRules(values, rules), [values, rules]);
30430
+ }, [values, duplicateLabel, t]);
30431
+ const ruleMessage = useMemo(() => runRules2(values, rules), [runRules2, values, rules]);
29428
30432
  const resolvedErrorMessage = duplicateMessage || ruleMessage || errorMessage;
29429
30433
  const resolvedError = error || duplicateMessage !== "" || ruleMessage !== "";
29430
30434
  const resolvedStatus = status ?? (resolvedError ? "error" : void 0);
29431
30435
  useFormField({
29432
30436
  name,
29433
- validate: () => runRules(values, rules) === "" && duplicateMessage === "",
30437
+ validate: () => runRules2(values, rules) === "" && duplicateMessage === "",
29434
30438
  resetValidation: () => {
29435
30439
  }
29436
30440
  });
@@ -29730,18 +30734,14 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
29730
30734
  style: { width: 1, height: 12, backgroundColor: "var(--color-divider-default)" }
29731
30735
  }
29732
30736
  ),
29733
- showMaxCount && /* @__PURE__ */ jsxs(
30737
+ showMaxCount && /* @__PURE__ */ jsx(
29734
30738
  "span",
29735
30739
  {
29736
30740
  className: cn(
29737
30741
  "s-chip-input__max-count text-12",
29738
30742
  isMax ? "text-(--sys-color-fg-warning)" : "text-(--cmp-chipInput-text-placeholder)"
29739
30743
  ),
29740
- children: [
29741
- "\uCD5C\uB300 ",
29742
- maxCount,
29743
- "\uAC1C"
29744
- ]
30744
+ children: t.maxCount(maxCount)
29745
30745
  }
29746
30746
  ),
29747
30747
  showResetLink && /* @__PURE__ */ jsx(
@@ -29750,7 +30750,7 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
29750
30750
  className: "s-chip-input__reset",
29751
30751
  icon: "reset",
29752
30752
  iconColor: "var(--color-grey-65)",
29753
- label: "\uC785\uB825 \uCD08\uAE30\uD654",
30753
+ label: ti.clearInput,
29754
30754
  underline: true,
29755
30755
  disabled,
29756
30756
  onClick: reset,
@@ -29781,7 +30781,7 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
29781
30781
  className: "s-chip-input__suggestions flex w-full flex-col outline-none",
29782
30782
  onMouseDown: (e) => e.preventDefault(),
29783
30783
  children: [
29784
- loading2 && /* @__PURE__ */ 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..." }),
30784
+ loading2 && /* @__PURE__ */ 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 }),
29785
30785
  !effectiveAutocomplete ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-sd-8 px-sd-12 py-sd-6", children: items.map((item4, i) => {
29786
30786
  const selected = values.includes(item4);
29787
30787
  const active = i === activeIndex && !selected;
@@ -29868,7 +30868,7 @@ var SBarcodeInput = /* @__PURE__ */ forwardRef(
29868
30868
  clearable = false,
29869
30869
  autoFocus,
29870
30870
  name,
29871
- placeholder = "\uC785\uB825\uD574 \uC8FC\uC138\uC694.",
30871
+ placeholder: placeholderProp,
29872
30872
  disabled = false,
29873
30873
  readOnly = false,
29874
30874
  rules,
@@ -29896,6 +30896,9 @@ var SBarcodeInput = /* @__PURE__ */ forwardRef(
29896
30896
  className,
29897
30897
  style
29898
30898
  }, ref) {
30899
+ const runRules2 = useRunRules();
30900
+ const { common: tc, input: ti } = useLocale().messages;
30901
+ const placeholder = placeholderProp ?? ti.placeholder;
29899
30902
  const f = FONT3[size];
29900
30903
  const [ruleError, setRuleError] = useState("");
29901
30904
  const controlId = useFieldControlId();
@@ -29903,7 +30906,7 @@ var SBarcodeInput = /* @__PURE__ */ forwardRef(
29903
30906
  useFormField({
29904
30907
  name,
29905
30908
  validate: () => {
29906
- const msg = runRules(value, rules);
30909
+ const msg = runRules2(value, rules);
29907
30910
  setRuleError(msg);
29908
30911
  return msg === "";
29909
30912
  },
@@ -29969,11 +30972,11 @@ var SBarcodeInput = /* @__PURE__ */ forwardRef(
29969
30972
  autoFocus,
29970
30973
  onChange: (e) => {
29971
30974
  onValueChange?.(e.target.value);
29972
- if (ruleError !== "") setRuleError(runRules(e.target.value, rules));
30975
+ if (ruleError !== "") setRuleError(runRules2(e.target.value, rules));
29973
30976
  },
29974
30977
  onFocus: () => onFocus?.(),
29975
30978
  onBlur: (e) => {
29976
- if (rules && rules.length > 0) setRuleError(runRules(e.target.value, rules));
30979
+ if (rules && rules.length > 0) setRuleError(runRules2(e.target.value, rules));
29977
30980
  onBlur?.();
29978
30981
  },
29979
30982
  className: cn(
@@ -29997,10 +31000,10 @@ var SBarcodeInput = /* @__PURE__ */ forwardRef(
29997
31000
  {
29998
31001
  icon: "close",
29999
31002
  size: "xxs",
30000
- ariaLabel: "\uC9C0\uC6B0\uAE30",
31003
+ ariaLabel: tc.clear,
30001
31004
  onClick: () => {
30002
31005
  onValueChange?.("");
30003
- setRuleError(runRules("", rules));
31006
+ setRuleError(runRules2("", rules));
30004
31007
  }
30005
31008
  }
30006
31009
  )
@@ -30061,11 +31064,11 @@ function parseTimeValue(value) {
30061
31064
  function formatTimeValue(hour, minute) {
30062
31065
  return `${padTimePart(clampTimePart(hour, 0, 23))}:${padTimePart(clampTimePart(minute, 0, 59))}`;
30063
31066
  }
30064
- function formatTimeDisplay(value, type) {
31067
+ function formatTimeDisplay(value, type, t) {
30065
31068
  if (value == null || value === "") return "";
30066
31069
  const { hour, minute } = parseTimeValue(value);
30067
31070
  if (type === "default") return formatTimeValue(hour, minute);
30068
- const meridiem = hour >= 12 ? "\uC624\uD6C4" : "\uC624\uC804";
31071
+ const meridiem = hour >= 12 ? t.pm : t.am;
30069
31072
  const displayHour = hour % 12 === 0 ? 12 : hour % 12;
30070
31073
  return `${meridiem} ${padTimePart(displayHour)}:${padTimePart(minute)}`;
30071
31074
  }
@@ -30148,6 +31151,7 @@ function TimeListbox({
30148
31151
  labelPrefix,
30149
31152
  elevated = true
30150
31153
  }) {
31154
+ const t = useLocale().messages.date;
30151
31155
  const toState = (v) => v ? parseTimeValue(v) : null;
30152
31156
  const [time, setTime] = useState(() => toState(value));
30153
31157
  useEffect(() => {
@@ -30171,13 +31175,13 @@ function TimeListbox({
30171
31175
  const hour = time?.hour;
30172
31176
  const minute = time?.minute ?? 0;
30173
31177
  const meridiem = hour === void 0 ? void 0 : hour >= 12 ? "PM" : "AM";
30174
- const prefix = labelPrefix ? `${labelPrefix} ` : "";
31178
+ const prefix = labelPrefix ?? "";
30175
31179
  const meridiemItems = ["AM", "PM"].map((item4) => {
30176
31180
  const base = item4 === "AM" ? 0 : 12;
30177
31181
  const range = HOURS_24.slice(base, base + 12);
30178
31182
  return {
30179
31183
  key: item4,
30180
- label: item4 === "AM" ? "\uC624\uC804" : "\uC624\uD6C4",
31184
+ label: item4 === "AM" ? t.am : t.pm,
30181
31185
  selected: meridiem === item4,
30182
31186
  disabled: range.every(hourBlocked),
30183
31187
  onSelect: () => {
@@ -30191,14 +31195,14 @@ function TimeListbox({
30191
31195
  const h = display % 12 + (meridiem === "PM" ? 12 : 0);
30192
31196
  return {
30193
31197
  key: String(display),
30194
- label: `${padTimePart(display)}\uC2DC`,
31198
+ label: t.hourItem(padTimePart(display)),
30195
31199
  selected: hour === h,
30196
31200
  disabled: hourBlocked(h),
30197
31201
  onSelect: () => commit([h], { hour: h, minute }, "hour")
30198
31202
  };
30199
31203
  }) : HOURS_24.map((h) => ({
30200
31204
  key: String(h),
30201
- label: `${padTimePart(h)}\uC2DC`,
31205
+ label: t.hourItem(padTimePart(h)),
30202
31206
  selected: hour === h,
30203
31207
  disabled: hourBlocked(h),
30204
31208
  onSelect: () => commit([h], { hour: h, minute }, "hour")
@@ -30206,7 +31210,7 @@ function TimeListbox({
30206
31210
  const minuteHour = hour ?? (meridiem === "PM" ? 12 : 0);
30207
31211
  const minuteItems = minutes.map((m) => ({
30208
31212
  key: String(m),
30209
- label: `${padTimePart(m)}\uBD84`,
31213
+ label: t.minuteItem(padTimePart(m)),
30210
31214
  selected: time != null && minute === m,
30211
31215
  disabled: blocked(minuteHour, m),
30212
31216
  onSelect: () => commit([minuteHour], { hour: minuteHour, minute: m }, "minute")
@@ -30228,12 +31232,12 @@ function TimeListbox({
30228
31232
  style: { height: MODE_LIST_HEIGHT },
30229
31233
  children: [
30230
31234
  showMeridiem && /* @__PURE__ */ jsxs(Fragment, { children: [
30231
- /* @__PURE__ */ jsx(ListColumn, { ariaLabel: `${prefix}\uC624\uC804/\uC624\uD6C4`, items: meridiemItems }),
31235
+ /* @__PURE__ */ jsx(ListColumn, { ariaLabel: t.meridiemAria(prefix), items: meridiemItems }),
30232
31236
  divider
30233
31237
  ] }),
30234
- /* @__PURE__ */ jsx(ListColumn, { ariaLabel: `${prefix}\uC2DC`, items: hourItems }),
31238
+ /* @__PURE__ */ jsx(ListColumn, { ariaLabel: t.hourAria(prefix), items: hourItems }),
30235
31239
  divider,
30236
- /* @__PURE__ */ jsx(ListColumn, { ariaLabel: `${prefix}\uBD84`, items: minuteItems })
31240
+ /* @__PURE__ */ jsx(ListColumn, { ariaLabel: t.minuteAria(prefix), items: minuteItems })
30237
31241
  ]
30238
31242
  }
30239
31243
  );
@@ -30270,6 +31274,8 @@ function STimePicker({
30270
31274
  className,
30271
31275
  style
30272
31276
  }) {
31277
+ const runRules2 = useRunRules();
31278
+ const t = useLocale().messages.date;
30273
31279
  const portalContainer = usePortalContainer();
30274
31280
  const [open, setOpen] = useState(false);
30275
31281
  const triggerId = useFieldControlId();
@@ -30279,12 +31285,16 @@ function STimePicker({
30279
31285
  const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
30280
31286
  const normalized = value ? formatTimeValue(parseTimeValue(value).hour, parseTimeValue(value).minute) : null;
30281
31287
  const effectiveShowMeridiem = showMeridiem ?? type === "midday";
30282
- const displayText = formatTimeDisplay(normalized, effectiveShowMeridiem ? "midday" : "default");
31288
+ const displayText = formatTimeDisplay(
31289
+ normalized,
31290
+ effectiveShowMeridiem ? "midday" : "default",
31291
+ t
31292
+ );
30283
31293
  const hasValue = normalized != null && normalized !== "";
30284
31294
  useFormField({
30285
31295
  name,
30286
31296
  validate: () => {
30287
- const msg = runRules(value, rules);
31297
+ const msg = runRules2(value, rules);
30288
31298
  setRuleError(msg);
30289
31299
  return msg === "";
30290
31300
  },
@@ -30296,11 +31306,11 @@ function STimePicker({
30296
31306
  if (disabled) return;
30297
31307
  setOpen(next);
30298
31308
  onOpenChange?.(next);
30299
- if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));
31309
+ if (!next && rules && rules.length > 0) setRuleError(runRules2(value, rules));
30300
31310
  };
30301
31311
  const commitValue = (next) => {
30302
31312
  onValueChange?.(next);
30303
- if (rules && rules.length > 0) setRuleError(runRules(next, rules));
31313
+ if (rules && rules.length > 0) setRuleError(runRules2(next, rules));
30304
31314
  };
30305
31315
  return /* @__PURE__ */ jsx(
30306
31316
  SField,
@@ -30379,7 +31389,7 @@ function STimePicker({
30379
31389
  {
30380
31390
  icon: "close",
30381
31391
  size: "xs",
30382
- ariaLabel: "\uC2DC\uAC04 \uC9C0\uC6B0\uAE30",
31392
+ ariaLabel: t.clearTime,
30383
31393
  onClick: (event) => {
30384
31394
  event.stopPropagation();
30385
31395
  commitValue(null);
@@ -30434,9 +31444,9 @@ function normalizeTimeRangeValue(value, rangeOrder = "strict") {
30434
31444
  }
30435
31445
  return normalized;
30436
31446
  }
30437
- function formatTimeRangeDisplay(value, type) {
31447
+ function formatTimeRangeDisplay(value, type, t) {
30438
31448
  if (value == null || value[0] === "" || value[1] === "") return "";
30439
- return `${formatTimeDisplay(value[0], type)} ~ ${formatTimeDisplay(value[1], type)}`;
31449
+ return `${formatTimeDisplay(value[0], type, t)} ~ ${formatTimeDisplay(value[1], type, t)}`;
30440
31450
  }
30441
31451
  var MIDDAY_FIELD_MIN_WIDTH = {
30442
31452
  sm: 178,
@@ -30457,6 +31467,7 @@ function RangeTimeSelector({
30457
31467
  rangeOrder,
30458
31468
  onChange
30459
31469
  }) {
31470
+ const t = useLocale().messages.date;
30460
31471
  const range = value ?? ["00:00", "23:59"];
30461
31472
  const strict = rangeOrder !== "allow-cross-day";
30462
31473
  const change = (side, time) => {
@@ -30479,7 +31490,7 @@ function RangeTimeSelector({
30479
31490
  value: side === "start" ? range[0] : range[1],
30480
31491
  showMeridiem,
30481
31492
  minuteStep,
30482
- labelPrefix: side === "start" ? "\uC2DC\uC791" : "\uC885\uB8CC",
31493
+ labelPrefix: side === "start" ? t.start : t.end,
30483
31494
  elevated: false,
30484
31495
  isDisabled: strict && side === "end" ? (minutes) => minutes < toMinutes(range[0]) : void 0,
30485
31496
  onChange: (time) => change(side, time)
@@ -30500,9 +31511,9 @@ function RangeTimeSelector({
30500
31511
  boxShadow: "var(--shadow-spread-sm), var(--shadow-spread-md)"
30501
31512
  },
30502
31513
  children: [
30503
- renderPanel("start", "\uC2DC\uC791 \uC2DC\uAC04"),
31514
+ renderPanel("start", t.startTime),
30504
31515
  /* @__PURE__ */ jsx("div", { className: "self-stretch w-px bg-[var(--sys-color-divider-default)]" }),
30505
- renderPanel("end", "\uC885\uB8CC \uC2DC\uAC04")
31516
+ renderPanel("end", t.endTime)
30506
31517
  ]
30507
31518
  }
30508
31519
  );
@@ -30540,6 +31551,8 @@ function STimeRangePicker({
30540
31551
  className,
30541
31552
  style
30542
31553
  }) {
31554
+ const runRules2 = useRunRules();
31555
+ const t = useLocale().messages.date;
30543
31556
  const portalContainer = usePortalContainer();
30544
31557
  const [open, setOpen] = useState(false);
30545
31558
  const triggerId = useFieldControlId();
@@ -30551,13 +31564,14 @@ function STimeRangePicker({
30551
31564
  const effectiveShowMeridiem = showMeridiem ?? type === "midday";
30552
31565
  const displayText = formatTimeRangeDisplay(
30553
31566
  normalized,
30554
- effectiveShowMeridiem ? "midday" : "default"
31567
+ effectiveShowMeridiem ? "midday" : "default",
31568
+ t
30555
31569
  );
30556
31570
  const hasValue = normalized != null && normalized[0] !== "" && normalized[1] !== "";
30557
31571
  useFormField({
30558
31572
  name,
30559
31573
  validate: () => {
30560
- const msg = runRules(value, rules);
31574
+ const msg = runRules2(value, rules);
30561
31575
  setRuleError(msg);
30562
31576
  return msg === "";
30563
31577
  },
@@ -30569,11 +31583,11 @@ function STimeRangePicker({
30569
31583
  if (disabled) return;
30570
31584
  setOpen(next);
30571
31585
  onOpenChange?.(next);
30572
- if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));
31586
+ if (!next && rules && rules.length > 0) setRuleError(runRules2(value, rules));
30573
31587
  };
30574
31588
  const commitValue = (next) => {
30575
31589
  onValueChange?.(next);
30576
- if (rules && rules.length > 0) setRuleError(runRules(next, rules));
31590
+ if (rules && rules.length > 0) setRuleError(runRules2(next, rules));
30577
31591
  };
30578
31592
  return /* @__PURE__ */ jsx(
30579
31593
  SField,
@@ -30652,7 +31666,7 @@ function STimeRangePicker({
30652
31666
  {
30653
31667
  icon: "close",
30654
31668
  size: "xs",
30655
- ariaLabel: "\uC2DC\uAC04 \uBC94\uC704 \uC9C0\uC6B0\uAE30",
31669
+ ariaLabel: t.clearTimeRange,
30656
31670
  onClick: (event) => {
30657
31671
  event.stopPropagation();
30658
31672
  commitValue(null);